はじめに #
OpEnはRust製の最適制御向け最適化ライブラリです。Pythonのopengenパッケージを使用することで、PythonからOpEnを呼び出して実行できます。
しかし、opengen v0.6.8以前には不具合があり、PythonからOpEnを実行すると以下のエラーが発生します。
Exception: Rust build of TCP interface failed
結論から記すと、エラーを解消するためには以下のコマンドでopengenをv 0.6.9以降にアップデートする必要があります。
$ pip install -U opengen
以降ではエラーの詳細について述べます。
環境 #
- Rust 1.55.0
- Python 3.9.7
- opengen 0.6.5 -> 0.6.9
- OpEn 0.7.4
- CasADi 3.5.5
発生したエラー #
適当なOpEnの最適化問題をPythonで実行します。ここでは、OpEnのリファレンスから以下のサンプルスクリプトを実行しました。 Rosenbrock Function · OpEn
実行すると以下のエラーが出力されます。
[INFO] Initialising builder
[INFO] Checking user parameters
[INFO] Creating necessary folders
[INFO] Copying icasadi interface to target directory
[INFO] Generating icasadi's Cargo.toml
[INFO] Generating Cargo.toml for target optimizer
[INFO] Generating icasadi Rust library file
[INFO] Defining CasADi functions and generating C code
[INFO] Defining function psi(u, xi, p) and its gradient
[INFO] Function psi and its gradient (C code)
[INFO] Defining function F1(u, p)
[INFO] Mapping F1 (C code)
[INFO] Defining function F2(u, p)
[INFO] Mapping F2 (C code)
[INFO] Generating casadi_memory.h
[INFO] Generating intercafe.c (C interface)
[INFO] Generating main code for target optimizer (lib.rs)
[INFO] Generating build.rs for target optimizer
[INFO] Generating YAML configuration file
[INFO] Building optimizer
[INFO] Generating TCP/IP server
[INFO] Generating code for TCP/IP interface (tcp_iface/src/main.rs)
[INFO] TCP server will bind at 127.0.0.1:8333
[INFO] Building the TCP interface
Traceback (most recent call last):
File "D:\document\Python Scripts\open2\rosenbrock.py", line 29, in <module>
builder.build()
File "C:\Users\xxx\Anaconda3\lib\site-packages\opengen\builder\optimizer_builder.py", line 652, in build
self.__build_tcp_iface()
File "C:\Users\xxx\Anaconda3\lib\site-packages\opengen\builder\optimizer_builder.py", line 467, in __build_tcp_iface
raise Exception('Rust build of TCP interface failed')
Exception: Rust build of TCP interface failed
エラーの最後の行を見ると、「TCPインターフェイスの確立に失敗した」とあります。 OpEnでは、最適化問題をRustのソースコードとして生成し、ビルドして実行しています。その実行ファイルとPython間の通信にTCPインターフェイスを使用しています。
エラーの原因 #
エラーの原因はGitHubの以下のイシューに上がっていました。
Generated tcp_iface_...
crate fails to compile · Issue #259 · alphaville_optimization-engine
これによると、OpEnが呼び出しているclap
というRustのライブラリ(クレートといいます)のバージョンに不整合があったようです。
opengen v0.6.8以前では、OpEnから呼び出すclap
のバージョンを指定していませんでした。また、opengen v0.6.8リリース時のclap
のバージョンは2であり、問題なく動作していました。
しかし、リリース後にclap
のバージョンが3に上がり、挙動が変化したことで、OpEnが正しく動作しなくなったようです。
そのため、opengen v0.6.9ではcalp
のバージョンを2
に指定するように修正しています。
なお、clap
はコマンドラインの引数解析を行うクレートです。
- clap-rs_clap A full featured, fast Command Line Argument Parser for Rust (GitHub)
- Rustのコマンドライン解析ライブラリ『Clap』 〜導入編〜 - Qiita
まとめ #
PythonからOpEnを呼び出して使用するときにRust build of TCP interface failed
エラーが発生した場合は、opengenのバージョンがv0.6.9以降か確認してください。