JavaScriptを有効にしてください

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

 ·   3 min read

※記事内に商品プロモーションを含むことがあります。

はじめに

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以降か確認してください。

参考

シェアする

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

サイト内検索