6

私はC++でいくつかの物理シミュレーションコードを作成しましたが、入力テキストファイルの解析がボトルネックになっています。入力パラメータの1つとして、ユーザーは実行時に何度も評価される数学関数を指定する必要があります。C ++コードには、このためのいくつかの事前定義された関数クラス(実際には数学側では非常に複雑です)といくつかの制限された解析機能がありますが、この構造にはまったく満足していません。

私が必要としているのは、アルゴリズムと関数の評価の両方が高速なままであるため、両方をコンパイル済みコードとして(できれば、数学関数をC ++関数オブジェクトとして)保持することが有利です。ただし、シミュレーション全体をPythonと一緒に接着することを考えました。ユーザーは、Pythonスクリプトで入力パラメーターを指定できると同時に、Pythonでストレージ、結果の視覚化(matplotlib)、およびGUIも実装できます。

ほとんどの場合、C ++クラスの公開は、たとえばSWIGを使用して実行できることを知っていますが、Pythonでのユーザー定義の数学関数の解析に関してはまだ質問があります。

どういうわけかPythonでC++関数オブジェクトを作成し、それをC ++アルゴリズムに渡すことは可能ですか? たとえば、私が電話するとき

f = WrappedCPPGaussianFunctionClass(sigma=0.5)
WrappedCPPAlgorithm(f)

Pythonでは、C ++オブジェクトへのポインタを返し、そのポインタを必要とするC ++ルーチン、または同様のものに渡されます...(この場合、メモリ管理については聞かないでください:S)

重要なのは、アルゴリズム内のPythonコードに対してコールバックを行わないことです。後で、この例を拡張して、関数の合計や積など、Python側でいくつかの単純な式の解析を行い、C ++オブジェクトのような複合解析ツリーを返しますが、ここでは基本にとどまります。

長い投稿と事前の提案のためのthxをお詫び申し上げます。

4

1 に答える 1

3

私はいつもこれと同じようなことをしています。最も単純な解決策であり、私が通常選択する解決策は、APIをCのようなAPIにフラット化してから、Python(または選択した他の言語)との間でポインターを渡すことです。

まずクラスを作成します

class MyFunctionClass
{
  public:
    MyFunctionClass(int Param)
    ...
};

class MyAlgorithmClass
{
  public:
    MyAlgorithmClass(myfunctionclass& Func)
    ...
};

次に、これらのクラスを作成および破棄する関数のCスタイルのAPIを作成します。私が使用する言語はとにかく型の安全性を維持しないため、私は通常、void*を渡すためにフラットアウトします。そうすれば簡単です。実際にvoid*を使用する前に、必ず正しいタイプにキャストバックしてください。

    void* CreateFunction(int Param)
    {
      return new MyFunctionClass(Param);
    }

    void DeleteFunction(void* pFunc)
    {
        if (pFunc)
            delete (MyFunctionClass*)pFunc;
    }

    void* CreateAlgorithm(void* pFunc)
    {
      return new MyAlgorithmClass(*(MyFunctionClass*)pFunc)
    }

    void DelteAlgorithm(void* pAlg)
    {
       if (pAlg)
           delete (MyAlgorithmClass*)pAlg;
    }

あなたがする必要があるのは、PythonにそれらのCスタイルの関数を呼び出させることだけです。実際、それらはリンクをはるかに簡単にするための外部「c」関数である可能性があります(そしておそらくそうすべきです)。

于 2010-05-07T21:52:06.287 に答える