バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回はDummy_FMUModelCS2を題材として掘り下げ。
FMUModelCS2を継承したクラスであり、
そこからメソッドをオーバーライドしているようである。
特に重要なのがdo_step。
このdo_stepをオーバーライドしている理由と
その重要性を解説する。
登場人物
博識フクロウのフクさん
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
do_stepをオーバーライドしている理由
前回出てきた、do_stepだけど、
まずなんでオーバーライドしているかってところを知りたいかな。
そうだね。
前回もちょっと触れたけど
継承元のFMUModelCS2に於いてのdo_stepはcpdefとして定義されている。
cpdefはCythonによってPythonからC言語に変換するメソッドを指定するものになる。
イキナリでてきたCythonがわからん。
Wikipediaから引用。
Cython(サイソン)は、C言語によるPythonの拡張モジュールの作成の労力を軽減することを目的として開発されたプログラミング言語である。その言語仕様はほとんどPythonのものと同じ (上位互換) だが、Cの関数を直接呼び出したり、C言語の変数の型やクラスを宣言できるなどの拡張が行われている。Cythonの処理系ではソースファイルをCのコードに変換し、コンパイルすればPythonの拡張モジュールになるようにして出力する。
Wikipediaより(https://ja.wikipedia.org/wiki/Cython)
つまりPythonだけど、実態はC言語になるってことか。
そうだね。
処理の高速化目的で使用されることが多い。
FMU制御なんかは速度が重要なことが多いから、PyFMIでも使用されているのだろう。
でも、このままだとdo_stepを外部から上書きできないから
一旦、Dummy_FMUModelCS2へ継承して、継承先のDummy_FMUModelCS2でオーバーライドする。
そしたらdo_step自体はDummy_FMUModelCS2のPythonとしてのメソッドになるから、
Python上からメソッドの上書きが可能になる。
ってことか。
正解だ。
do_stepの重要性
次はなぜdo_stepを内部処理を上書きする必要があるのかってところか。
これはmasterモジュールの中のdo_stepを呼び出しているところを見た方が早いだろう。
cdef perform_do_step_serial(list models, dict time_spent, double cur_time, double step_size, bool new_step):
"""
Perform a do step on all the models.
"""
cdef double time_start = 0.0
cdef int status = 0
for model in models:
time_start = timer()
status = model.do_step(cur_time, step_size, new_step)
time_spent[model] += timer() - time_start
これは、登録した全モデルのメソッドであるdo_stepをシミュレーションステップ毎に呼び出しているってことかな?
その通り。
つまり、モデル側のdo_stepを書き換えるとシミュレーションステップ毎に呼び出されるメソッドを上位側でコントロールできるってことになる。
なんとなくわかってきたぞ!
do_stepがmasterモジュールからシミュレーションステップ毎に呼び出される
↓
do_stepの中でシミュレーション時間が実時間に追いつくまで強制的に待たせる。
これをやりたいってことか!
大正解だ。
まぁホントにうまく行くかはまだ分からないから実験する必要はあるだろう。
まとめ
まとめだよ。
- do_stepをオーバーライドしている理由の説明。
- Cythonによる静的関数でそのままではPython側からの上書きができない。
- do_stepの重要性の説明。
- masterモジュールからシミュレーションステップ毎に呼ばれるメソッドだから。
- これを自由に書き換えられれば時間制御ができる。
- 実時間に追いつくまで待たせる。
バックナンバーはこちら。
コメント