SUMO SUMO Wiki

Wiki カテゴリ&ファイル

目次

Pythonスケジューラーのドキュメント

プロジェクトのセットアップ方法

プロジェクトでスケジューラーを使用するには、始める前にいくつかの手順を行う必要があります。

  1. DynamitaのSumo DTTライセンスを取得済みであることを確認してください。不明な場合は、スクリプト内にds.sumo.setLogDetails(6)を残しておくとフィードバックが得られます。
  2. Sumo GUIでプロジェクトを開き、Simulateをクリックして、左下に「Ready for simulation」メッセージが表示されるまで待ってコンパイルします。
  3. プロジェクトが、コードを実行したい状態になっていることを確認してください。定常状態(steady-state)から複数のシミュレーションを行いたい場合は、ここで定常状態を実行しておく価値があるかもしれません。

ここでは2つの方法があります。以下はより簡単な方法です。

  1. dynamita.toolモジュールをインポートします。 ドキュメント
  2. Pythonでextract_dll_from_project(project : str, path_to : str)を呼び出します。
  3. Pythonでdef extract_parameters_from_project(project : str, tsvdir : str, script_to : str, scenario : str = "") -> bool:を呼び出します。
  4. scheduleの呼び出しで、load "state.xml"をexecute "script.scs"(script_toに設定したスクリプト)に置き換えます。

環境をできるだけ軽量に保ちたい場合は、次のようにします。

  1. Advancedメニューからコアウィンドウ(Core window)を開きます。
  2. ウィンドウ右下のテキストボックスからmaptoic; save "state.xml"コマンドをsumocoreに送信します。これらのコマンドについては、SumoCoreコマンドのドキュメントを参照してください。
  3. メニューからプロジェクトディレクトリを開きます。View -> Directories -> Project directory。
  4. sumoproject.dllとstate.xmlを、スクリプトを実行する場所にコピーします。後で中身が分かるように、独自の名前に変更しておくとよいでしょう。A2Oの例では、これらをa2oplant.dllとa2ostate.xmlに名前変更することを前提としています。これらのファイルはschedule関数を呼び出す際に重要になります。
  5. この時点でSumo GUIを閉じても、そのまま開いたままにしておいても構いません。

セットアップ

関数
def setParallelJobs(self, jobs)
説明 一度に実行するシミュレーションの数を設定します。その他のスケジュール済みシミュレーションは、これらのシミュレーションが終了するまで実行を開始できず待機します。この関数が呼び出されない場合、デフォルトは1です。
引数
jobs一度に実行するジョブの数
返り値-
---


関数 ``` def setMaxJobReuse(self, reuse)


  説明 プロセスを再起動するまでに1つのプロセスで実行するシミュレーションの数を設定します。プロセスが再利用されるのは、同じモデルで複数のシミュレーションがスケジュールされた場合のみです。デフォルト値は10です。内容を十分理解している場合を除き、この値は変更しないでください。 引数 
reuse1つのプロセスで実行するジョブの最大数
返り値-
--- --- 関数 ``` def setLogDetails(self, level)

説明 スケジューラーがコンソールに何を出力するかを決定します。 引数

level1 - ジョブからの未知のメッセージがすべてログに記録される
2 - ジョブからのメッセージがログに記録される
4 - ジョブへのメッセージがすべてログに記録される
6 - ジョブとの間のすべてのメッセージ(送受信)がログに記録される
返り値-
---


変数 ``` message_callback


  説明 メッセージハンドラーへのハンドルを保持します。メッセージコールバックは、ジョブIDを整数(integer)で、メッセージを文字列(string)で受け取ります。 例```
ds.sumo.message_callback = msg_callback
def msg_callback(job, msg):
    print("MSG #" + str(job) + ": '" + msg + "'")    
    if (ds.sumo.isSimFinishedMsg(msg)):
        ds.sumo.finish(job)


変数 ``` datacomm_callback


  説明 データハンドラーへのハンドルを保持します。データコールバックは、ジョブIDを整数(integer)で、データを辞書(dictionary)で受け取ります。 例```
ds.sumo.datacomm_callback = data_callback
def data_callback(job, data):
    print(f"DC #{job} - {data['Sumo__Time']}")


シミュレーション

関数
def schedule (self, model, commands, variables, blockDatacomm=False, jobData=None)
説明 新しいシミュレーションをスケジュールします。シミュレーションはすぐには実行されず、定義済みのコールバックを介して通信します。
引数
modelSumoから抽出したモデルの.dllファイルへのパス(.sumoファイル内のsumoproject.dll)
commandsシミュレーションエンジンへのコマンドのリスト。利用可能なコマンドについては、SumoCoreコマンドのドキュメントを参照してください。
variables監視(リッスン)する変数のリスト。変数名はSumoのAdvanced -> Core Windowからコピーできます。
blockDatacommPythonが処理内容を決定する間、シミュレーションを待機させますか?シミュレーションを制御したい場合はtrueに設定し、それ以外の場合はより高速な結果を得るためfalseのままにします。
jobDataジョブとともに保存され、後でアクセスできる追加情報(辞書)。シミュレーション終了後もデータを保持するには、sumo.persistentフラグを設定できます。
返り値この関数は、シミュレーションを識別するために参照できるJobIDを返します。
例``` job1 = ds.sumo.schedule( "sumoproject.dll" commands = [ f"load state.xml",
f"set SumoStopTime {10*ds.sumo.dur.day};", f"set SumoDataComm {1*ds.sumo.dur.hour};",
f"set SumoPlantInfluentparamfrSNHx_TKN 2;",
"mode dynamic;",
"start;"],

    variables     = ["Sumo__Time", 
                    "Sumo__Plant__Effluent__SNOx",
                    "Sumo__Plant__Effluent__SPO4"],

    jobData       = {
                        ds.sumo.persistent: True, 
                        "results" : { }
                    },
    );



  ---

---

 関数 ```
def sendCommand(self, job, command)

説明 ジョブにコマンドを送信します。まだ開始していないシミュレーションにコマンドを送信した場合、そのコマンドは開始時に実行されます。 引数

job対象ジョブのID
commandシミュレーションエンジンへのコマンド。利用可能なコマンドについては、SumoCoreコマンドのドキュメントを参照してください。
返り値-
例``` ds.sumo.sendCommand(job1, "pause")




  ---

---

 関数 ```
def sendCommands(self, job, commands)

説明 ジョブにコマンドのリストを送信します。まだ開始していないシミュレーションにコマンドを送信した場合、それらのコマンドは開始時に実行されます。 引数

job対象ジョブのID
commandsシミュレーションエンジンへのコマンドのリスト。利用可能なコマンドについては、SumoCoreコマンドのドキュメントを参照してください。
返り値-
例``` ds.sumo.sendCommands(job1, ["set SumoStopTime 86400000", "set SumoDataComm 3600000", "start"])




  注 末尾のセミコロン(;)文字は不要です。  ---

---

 関数 ```
def getJobData(self, jobId):

説明 スケジュール時にジョブへ割り当てたデータを取得します。このデータは変更でき、変更内容は保持されます。 引数

jobId対象ジョブのID
返り値schedule関数を呼び出したときに定義した辞書。ジョブデータを定義していなかった場合、この関数はnullを返します。
例``` jobData = ds.sumo.getJobData(job)




  ---

---

 関数 ```
def finish(self, job)

説明 指定したジョブIDのジョブを終了させ、他のジョブが実行できるようにします。終了できるのは実行を開始したジョブのみです。スケジュールされたがまだ実行されていないジョブは終了できません。多くの場合、シミュレーションが完了したときにそのジョブを終了させることになります。ジョブが終了すると、そのジョブデータはクリアされます。ただし、sumo.persistentフラグが設定されている場合は保持されます。 注 通常は、1つのジョブにつき1回のシミュレーションのみ行う方がよいでしょう。スケジューラーはオーバーヘッドを減らすため、可能であれば同一プロセス内でジョブを実行するよう最適化しますが、1つのジョブを使いすぎると、そのジョブの動作が遅くなる可能性があります。他のジョブがまったく実行されなくなり、それらに影響を与える場合もあります。 引数

job終了させたいジョブのID
返り値-
例``` def msg_callback(job, msg): if (ds.sumo.isSimFinishedMsg(msg)): ds.sumo.finish(job)




  ---

---



[¶](#cleanup) クリーンアップ
---------------------

 
関数
def cleanup(self)
説明 SumoSchedulerが確保したすべてのリソースを解放し、アンロードします。Pythonスクリプトの最後でのみ実行してください。クリーンアップ後にシミュレーションをスケジュールすると、問題が発生する可能性があります。また、persistentとしてマークされたジョブデータも含めてすべてクリーンアップします。
引数
返り値-
--- --- [¶](#utility) ユーティリティ ---------------------
関数
def isSimFinishedMsg(self, msg)
説明 メッセージがシミュレーションの終了を示すものかどうかを判定します。
引数
返り値シミュレーション終了メッセージであればtrue、そうでなければfalse
例``` def msg_callback(job, msg): if (ds.sumo.isSimFinishedMsg(msg)): ds.sumo.finish(job)