メインコンテンツへスキップ

最適制御向け最適化ライブラリOpEnのRust build of TCP interface failedエラーについて

·1185 文字·3 分
目次

はじめに
#

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はコマンドラインの引数解析を行うクレートです。

まとめ
#

PythonからOpEnを呼び出して使用するときにRust build of TCP interface failedエラーが発生した場合は、opengenのバージョンがv0.6.9以降か確認してください。

参考
#

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

最適制御向け最適化ライブラリOpEnに入門する
··1759 文字·4 分
Rust製の最適制御向け最適化ライブラリOpEnに入門するためチュートリアルの非線形計画問題を解いたので、備忘録を兼ねてまとめた。
PythonとCasADiを使ったDirect Single Shooting法による最適制御
·2545 文字·6 分
Pythonと最適化ライブラリCasADiを使って、Direct Single Shooting法と呼ばれる手法によって最適制御問題を解きました。対象とした例題は斜方投射(物体を斜め方向に上げる)で、指定の時刻・距離に物体を到達させる最小の初速度を求めます。
Rust製最適化ライブラリOpEnのインストール
··868 文字·2 分
Rust製の最適化ライブラリOpEnをWindows 10にインストールし、Pythonから使えるようにする。
CasADiとBONMINで混合整数非線形計画問題を解く
·913 文字·2 分
Pythonで自動微分・非線形最適化ライブラリCasADiと最適化ソルバBONMINを使って、混合整数非線形計画問題を解く方法をまとめた。
CasADiとIPOPTで非線形計画問題を解く
··2122 文字·5 分
Pythonで自動微分・非線形最適化ライブラリCasADiと最適化ソルバIPOPTを使って、制約付き非線形計画問題を解く方法をまとめた。
非線形モデル予測制御とPANOC
·1729 文字·4 分
非線形システムを対象としたモデル予測制御の最適化問題を解くPANOCというアルゴリスムについてまとめた。