2

Pythonで書いた関数をRで最適化したい。scipy に最適化関数があることは既に知っていますが、scipy ではなく R にある関数がいくつか必要です。問題は、Python スクリプトに関数があることです。この関数には、パラメーター以外の情報が必要です。そのため、初期化時に、python スクリプトはいくつかのファイルをインポートしていくつかの操作を実行します。そのため、パフォーマンスが低下するため、毎回スクリプトを呼び出したくないのです。

そのために、Pythonスクリプトを一度呼び出してから、ソケットで接続しようとしました。これは私の R スクリプトです (最適化はまだ含まれていません)。

#Variables to initialize:

p_pos = '"[[0.,0.,True],[1.2378958026, 0,True],[0, 0.7152889725,True]]"'
names = '"[\'bridge\',\'hollow\',\'top\']"'
potential = "a-a"
symmetry = "non"



#Initialize python script

command = "python"
path2script='"Least_squares_potentials.py"'

#data pased to python

string = paste(p_pos, names, potential, symmetry, sep="---")
pattern = "---"

args = c(string, pattern)


# Add path to script as first arg


allArgs = c(path2script, args)

#Initialize

output = system2(command, args=allArgs, stdout=FALSE, wait=FALSE)

Sys.sleep(5)


client <- function(param){
   while(TRUE){
    con <- socketConnection(host="localhost", port = 6011, blocking=TRUE,
                        server=FALSE, open="r+")
    response <- param  
    writeLines(response, con)
    data <- readLines(con, 1)
    print(data)
    close(con)
  }
}


#guess = "[3.589,3.995,1.418,1.809]"
guess = "[3.733,2.413,8]"

client(guess)
client("q")

そして私のpython側では:

# Get the arguments passed in

string = sys.argv[1]
pattern = sys.argv[2]

# Perform the splitting

ans = string.split(pattern)
p_pos = ast.literal_eval(ans[0])
names = ast.literal_eval(ans[1])
potential = ans[2]
symm = ans[3]

#Initialize the potential (this is my function, which is actually a class)

Least = Least_squares(names, p_pos, potential, symm)

#----------------------------------------------------------#
#INITIALIZE SOCKET
#----------------------------------------------------------#

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 6011))
s.listen(1)
while 1:
    (conn, addr) = s.accept()
    data = conn.recv(1024)
    if ( data == 'q' or data == 'Q'):
        conn.close()
        break;
    else:        
        conn.send(Least.xi_square(np.array(ast.literal_eval(data))))

これを行っても何も得られません...「\xadȊ\xf3=\xd0Y@」が表示され、数分待った後、これが何であるかわかりません。誰でもこれで私を助けることができますか?たぶん、私が知らないこれを行う別の方法があります。どんな助けでも本当に感謝します。

4

0 に答える 0