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を閉じても、そのまま開いたままにしておいても構いません。

セットアップ

setParallelJobs

関数
def setParallelJobs(self, jobs)
説明

一度に実行するシミュレーションの数を設定します。その他のスケジュール済みシミュレーションは、これらのシミュレーションが終了するまで実行を開始できず待機します。この関数が呼び出されない場合、デフォルトは1です。

引数
jobs 一度に実行するジョブの数
返り値

なし


setMaxJobReuse

関数
def setMaxJobReuse(self, reuse)
説明

プロセスを再起動するまでに1つのプロセスで実行するシミュレーションの数を設定します。プロセスが再利用されるのは、同じモデルで複数のシミュレーションがスケジュールされた場合のみです。デフォルト値は10です。内容を十分理解している場合を除き、この値は変更しないでください。

引数
reuse 1つのプロセスで実行するジョブの最大数
返り値

なし


setLogDetails

関数
def setLogDetails(self, level)
説明

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

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

なし


message_callback

変数
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

変数
datacomm_callback
説明

データハンドラーへのハンドルを保持します。データコールバックは、ジョブIDを整数(integer)で、データを辞書(dictionary)で受け取ります。

例
ds.sumo.datacomm_callback = data_callback
def data_callback(job, data):
    print(f"DC #{job} - {data['Sumo__Time']}")

シミュレーション

schedule

関数
def schedule (self, model, commands, variables, blockDatacomm=False, jobData=None)
説明

新しいシミュレーションをスケジュールします。シミュレーションはすぐには実行されず、定義済みのコールバックを介して通信します。

引数
model SUMOから抽出したモデルの.dllファイルへのパス(.sumoファイル内のsumoproject.dll)
commands シミュレーションエンジンへのコマンドのリスト。利用可能なコマンドについては、SumoCoreコマンドのドキュメントを参照してください。
variables 監視(リッスン)する変数のリスト。変数名はSumoのAdvanced -> Core Windowからコピーできます。
blockDatacomm Pythonが処理内容を決定する間、シミュレーションを待機させますか?シミュレーションを制御したい場合はtrueに設定し、それ以外の場合はより高速な結果を得るためfalseのままにします。
jobData ジョブとともに保存され、後でアクセスできる追加情報(辞書)。シミュレーション終了後もデータを保持するには、sumo.persistentフラグを設定できます。
返り値

この関数は、シミュレーションを識別するために参照できるJobIDを返します。

例
job1 = ds.sumo.schedule(
                        "sumoproject.dll"
        commands      = [
                         f"load state.xml",                        
                         f"set Sumo__StopTime {10*ds.sumo.dur.day};",
                         f"set Sumo__DataComm {1*ds.sumo.dur.hour};",                         
                         f"set Sumo__Plant__Influent__param__frSNHx_TKN 2;",                         
                         "mode dynamic;",                        
                         "start;"],

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

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

sendCommand

関数
def sendCommand(self, job, command)
説明

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

引数
job 対象ジョブのID
command シミュレーションエンジンへのコマンド。利用可能なコマンドについては、SumoCoreコマンドのドキュメントを参照してください。
返り値

なし

例
ds.sumo.sendCommand(job1, "pause")

sendCommands

関数
def sendCommands(self, job, commands)
説明

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

引数
job 対象ジョブのID
commands シミュレーションエンジンへのコマンドのリスト。利用可能なコマンドについては、SumoCoreコマンドのドキュメントを参照してください。
返り値

なし

例
ds.sumo.sendCommands(job1, ["set Sumo__StopTime 86400000", "set Sumo__DataComm 3600000", "start"])
注

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


getJobData

関数
def getJobData(self, jobId):
説明

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

引数
jobId 対象ジョブのID
返り値

schedule関数を呼び出したときに定義した辞書。ジョブデータを定義していなかった場合、この関数はnullを返します。

例
jobData = ds.sumo.getJobData(job)

finish

関数
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としてマークされたジョブデータも含めてすべてクリーンアップします。

引数

なし

返り値

なし

ユーティリティ

isSimFinishedMsg

関数
def isSimFinishedMsg(self, msg)
説明

メッセージがシミュレーションの終了を示すものかどうかを判定します。

引数
msg 判定するメッセージ(message_callback が受け取った文字列)
返り値

シミュレーション終了メッセージであればtrue、そうでなければfalse

例
def msg_callback(job, msg):
    if (ds.sumo.isSimFinishedMsg(msg)):
        ds.sumo.finish(job)