Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

log_* methods

mintoではlog_*というメソッドでデータを記録することができます。

このセクションでは基本的なメソッドといくつかの便利なメソッドを紹介します。

基本的なlogメソッド

mintoでは2つのspaceがあり、それぞれのspaceにDataStoreというクラスの形でデータが保存されています。詳しくは (MINTO Spaces)[minto_datastore.ipynb] セクションを参照してください。

Experiment spaceに保存する場合は

expriment.log_global_*

メソッドを使い、Run spaceに保存する場合は

run.log_*

メソッドを用います。* となっているところには DataStoreのattributeに対応した名前を入れることができます。

基本的なlogメソッドの一覧は以下です。

data typeExperiment spaceRun space
scalars (int | float | str)log_global_parameterlog_parameter
jm.Problemlog_global_problemlog_problem
ommx.v1.Instancelog_global_instancelog_instance
ommx.v1.Solutionlog_global_solutionlog_solution
ommx.v1.SampleSetlog_global_samplesetlog_sampleset
JSON Serializable object (dict)log_global_objectlog_object

params

複数のスカラーを保存したい場合はlog_paramsメソッドを用いてdictで複数を同時に保存することができます。

import minto

experiment = minto.Experiment("test", auto_saving=False, verbose_logging=False)

param_a = [1, 2, 3, 4]
param_b = [2, 3, 4, 5]

for a, b in zip(param_a, param_b):
    with experiment.run() as run:
        run.log_params({"a": a, "b": b})
experiment.get_run_table()

Experimentspaceでも同様に複数のパラメータを同時に保存できます。

experiment.log_global_params({"a": a, "b": b})

experiment.get_experiment_tables()["parameter"]

solver

最適化を行う関数をラップして入力と出力をそのまま保存することが可能です。

log_solverは渡した関数と同じ振る舞いをするCallableなオブジェクトを返します。そのオブジェクトを呼び出すと、元の関数が実行され、その入力と出力がRun spaceに保存されます。log_solverexclude_paramsにrunに保存したくない引数名のリストを渡すことも可能です。例えばrunの中でinstanceのような大きいデータは保存したくない場合などに便利です。

Quick start セクションで紹介した例をlog_solverを用いて書き直すと以下のようになります。

import ommx_pyscipopt_adapter as scip_ad
from ommx.dataset import miplib2017

instance = miplib2017("reblock115")


def scip_solver(instance, time_limit):
    adapter = scip_ad.OMMXPySCIPOptAdapter(instance)
    scip_model = adapter.solver_input

    scip_model.setParam("limits/time", time_limit)
    scip_model.optimize()

    return adapter.decode(scip_model)


time_limit_list = [0.5, 1.0]

experiment = minto.Experiment("test", auto_saving=False, verbose_logging=False)

for time_limit in time_limit_list:
    with experiment.run() as run:
        _solver = run.log_solver(scip_solver, exclude_params=["instance"])
        solution = _solver(instance, time_limit=time_limit)
experiment.get_run_table()

まとめ

log_*メソッドを用いることで、Experiment spaceとRun spaceに様々なデータを簡単に保存することができます。 paramssolverは便利なパッラーとして使えるのでぜひ活用してみてください。