現在、Ctypesを使用してSciPyをラップして最適化するFortran関数があります。これは可能ですか?おそらく私は私の実装で何か間違ったことをしました。例えば、私が持っていると仮定します。scipy.optimize.minimizeの結果がctypesを使用するFortran関数で使用されました
cost.f90私はコンパイル
module cost_fn
use iso_c_binding, only: c_float
implicit none
contains
function sin_2_cos(x,y) bind(c)
real(c_float) :: x, y, sin_2_cos
sin_2_cos = sin(x)**2 * cos(y)
end function sin_2_cos
end module cost_fn
:
gfortran -fPIC -shared -g -o cost.so cost.f90
し、その後で(ローカル)最小値を検索してみてください。
コストを.py
#!/usr/bin/env python
from ctypes import *
import numpy as np
import scipy.optimize as sopt
cost = cdll.LoadLibrary('./cost.so')
cost.sin_2_cos.argtypes = [POINTER(c_float), POINTER(c_float)]
cost.sin_2_cos.restype = c_float
def f2(x):
return cost.sin_2_cos(c_float(x[0]), c_float(x[1]))
# return np.sin(x[0])**2 * np.cos(x[1])
# print(f2([1, 1]))
# print(f2([0.5 * np.pi, np.pi]))
print(sopt.minimize(f2, (1.0, 1.0), options={'disp': True}, tol=1e-8))
I ex極小f2(π/ 2、π)= -1とする。 cost.sin_2_cosの戻り値でf2を呼び出すと、(1、1)の最初の推測で「最小」が与えられます。 f2を "Python"の戻り値で呼び出すと、optimizeは正しい最小値を見つけます。
sin_2_cosをdimension(2)配列入力に再定義しようとしましたが、同様の動作が見られました。おそらく、私はsin_2_cosを最小化で直接呼び出す必要があります(しかし、引数にc_floatをどのように指定すればよいでしょうか)。どんな考えもありがとう!
編集:以下のコメントには、2つのコメント付きprint(f2(...))
行が期待値を生成することに注意してください。したがって、私はFortran関数がPythonのf2関数を通して適切に呼び出されていると考えています。
引数に 'value'属性を少なくとも追加する必要があります(他の問題もあります)。詳しくはhttp://www.fortran90.org/src/best-practicesを参照してください。html#using-ctypes –
どうすればいいですか? f2への呼び出しのコメントを外すと正しく動作します。あなたがリストアップしたWebページは、なぜ 'value'がそこにあるのか、それ以前の 'iso_c_binding'の例でそれを使用していないことを明確にしていません。値を追加しても問題は解決しないことに注意してください。 –
タイトルをより具体的なものに変更しました。私は「はい、できます」と仮定します。あなたに受け入れられる答えではありません。 –