※記事内に商品プロモーションを含むことがあります。
はじめに
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
実行すると以下のエラーが出力されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
[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
はコマンドラインの引数解析を行うクレートです。
まとめ
PythonからOpEnを呼び出して使用するときにRust build of TCP interface failed
エラーが発生した場合は、opengenのバージョンがv0.6.9以降か確認してください。
参考