ユーザーサブルーチンの使用

最適化では、通常の解析で使用する場合と同様にユーザーサブルーチンを使用できます。

ただし、最適化で並列有限差分法を使用する場合(有限差分を選択した場合のデフォルト)には、いくつかの特別な制限に注意する必要があります。

MotionSolveの並列有限差分アプローチでは、複数プロセス間でデータを通信して受信するためにPickleモジュールが使用されます。

Pickleは、Pythonオブジェクトをシリアル化および非シリアル化するためのアルゴリズムを実装しています。“Pickle化”とは、Pythonオブジェクト階層をバイトストリームに変換するプロセスで、“非Pickle化”はその逆の操作、つまりバイトストリームをオブジェクト階層に戻すプロセスです。

MotionSolveの並列有限差分アプローチでは、複数プロセス間でデータを送受信するために、“Pickle化”と“非Pickle化”を使用します。

有限差分法では、ユーザーサブルーチンが“Pickle化可能”であることが必要です。ここでは、これは必ずスクリプトの最上位レベルでユーザーサブルーチンを定義する必要があるということです。例えば、calciというルーチンでマーカーを定義する場合、独立した関数としてcalciを次のように最上位レベルで定義する必要があります:

from msolve.optimize import *
def calci(id,par,npar): 
    ……
次のように、別の関数定義のスコープの中で定義することはできません:

from msolve.optimize import *
def function1(……): 
…… 
   def calci(id,par,npar):
    ……

同様に、ユーザーサブルーチンをクラスメソッドとして定義することもできません。クラスそのものを最上位レベルに記述しても、そのクラスメソッドはPythonで最上位レベルのオブジェクトとして認識されません。次の場合、calciはPickle化可能ではありません:


from msolve.optimize import *
class Fourbar(……): 
…… 
   def calci(self,id,par,npar):
    …… 

Pickleの詳細については、pickleに関するPythonのドキュメントをご参照ください。