探索パラメータ
PyQBPP の3つのソルバー — EasySolver、ExhaustiveSolver、ABS3Solver — は、search() を通じて探索パラメータを受け取ります。 パラメータは キーワード引数 で渡します。 値は文字列・整数・浮動小数点数のいずれでも指定可能で、バックエンドに渡す前に自動的に文字列に変換されます。
パラメータの指定
search() にキーワード引数を直接渡します:
sol = solver.search(time_limit=10, target_energy=0)
値は文字列・整数・浮動小数点数を混在させることができます:
sol = solver.search(time_limit=2.5, target_energy="0")
プログラムで動的にパラメータを構築する場合は、辞書を作成して ** で展開します:
params = {}
params["time_limit"] = 10
params["target_energy"] = 0
sol = solver.search(**params)
特別な Params オブジェクトは不要です — キーワード引数だけで十分です。 内部的には、PyQBPP が各値を文字列に変換し、キーと値のペアをソルバーに渡します。
共通パラメータ
以下のパラメータは3つのソルバーすべてで共通です:
| パラメータ | 型 | 説明 |
|---|---|---|
target_energy | int | エネルギーがこの値以下の解が見つかったら探索を停止する。cons() で制約を宣言したモデルでは、全制約の充足も停止の条件(ソルバーごとの対応と意味論)。 |
enable_default_callback | int (0/1) | 新たに見つかった最良解を標準出力に表示する。デフォルト: 0。 |
topk_sols | int | 探索中にエネルギー上位N個の解を保持する。 |
best_energy_sols | int | 保持する最良エネルギー解の最大数。0 = 上限なし。 |
EasySolver のパラメータ
| パラメータ | 型 | 説明 | デフォルト |
|---|---|---|---|
time_limit | float | 制限時間(秒)。0 で無制限。 | 10.0 |
target_energy | int | 目標エネルギー。 | (なし) |
enable_default_callback | int (0/1) | 進捗を表示。 | 0 |
topk_sols | int | 保持するトップk解の数。 | (無効) |
best_energy_sols | int | 保持する最良エネルギー解の数。 | (無効) |
thread_count | int | 探索に使う CPU スレッド数。 | (自動) |
seed | int | 乱数シード(再現用)。 | (ランダム) |
hint | Sol | ヒント解。探索の出発点になります(ヒント解を渡す)。None はヒントなし。 | (なし) |
例:
solver = qbpp.EasySolver(f)
sol = solver.search(time_limit=5, target_energy=0)
ExhaustiveSolver のパラメータ
ExhaustiveSolver は完全探索を行うため、time_limit パラメータはありません。
| パラメータ | 型 | 説明 | デフォルト |
|---|---|---|---|
target_energy | int | 目標エネルギー(早期終了用)。 | (なし) |
verbose | int (0/1) | 探索進捗率を表示する。 | 0 |
enable_default_callback | int (0/1) | 進捗を表示。 | 0 |
topk_sols | int | 保持するトップk解の数。 | (無効) |
best_energy_sols | int | 最適解を保持(値=最大数、0=無制限)。 | (無効) |
all_sols | int (0/1) | すべての解を保持(cons() の制約に違反する割り当ても含む。バイナリ変数 $n$ 個なら $2^n$ 個)。 | (無効) |
例:
solver = qbpp.ExhaustiveSolver(f)
sol = solver.search(target_energy=0)
パラメータを組み合わせて複数の解を収集できます:
sol = solver.search(best_energy_sols=0, target_energy=0)
for s in sol.sols:
print(s.energy)
ABS3Solver のパラメータ
| パラメータ | 型 | 説明 | デフォルト |
|---|---|---|---|
time_limit | float | 制限時間(秒)。 | 10.0 |
target_energy | int | 目標エネルギー。 | (なし) |
enable_default_callback | int (0/1) | 進捗を表示。 | 0 |
topk_sols | int | 保持するトップk解の数。 | (無効) |
best_energy_sols | int | 最適解を保持(値=最大数、0=無制限)。 | (無効) |
cpu_enable | int (0/1) | CPUソルバーの有効/無効。 | 1 |
seed | int | 乱数シード(再現用)。 | (ランダム) |
hint | Sol | ヒント解。探索の出発点になります(ヒント解を渡す)。None はヒントなし。 | (なし) |
cpu_thread_count | int | CPUスレッド数。 | (自動) |
block_count | int | GPUブロック数。 | (自動) |
thread_count | int | GPUブロックあたりのスレッド数。 | (自動) |
例:
solver = qbpp.ABS3Solver(f)
sol = solver.search(time_limit=10, target_energy=0)
CPU スレッド数の自動設定
thread_count(Easy Solver)と cpu_thread_count(ABS3 Solver)を指定しないと、このプロセスが使える CPU の数に合わせてスレッド数を決めます(Easy Solver と ABS3 Solver は 4 以上)。 使える CPU の数は、マシンの CPU 数・CPU の割り当て(taskset など)・コンテナの CPU 制限・ジョブスケジューラーが割り当てたコア数(PBS の NCPUS、Slurm の SLURM_CPUS_PER_TASK)のうちいちばん小さい値です。 スーパーコンピュータの共用ノードでジョブを実行すると、割り当てられたコア数だけを使います。 ABS3 Solver の CPU 側は、大きなモデルでは自動で決めるスレッド数を 16 までにします(指定した cpu_thread_count はそのまま使います)。 Exhaustive Solver も同じ数の CPU を使います。
エラー処理
- 不明なパラメータキーを指定すると、
RuntimeErrorが発生します。 - 値が正しくないと
ValueErrorが発生します。数をとるパラメータに数でない文字列(time_limit="abc"など)、0/1をとるパラメータにそれ以外の値(bool のTrue/Falseは可)、整数のパラメータに小数や範囲外の値、time_limitとthread_count・cpu_thread_count・block_count・topk_solsに負の値(Easy Solver のthread_countは0も)を指定した場合です。 None(hint=Noneを除く)や、数・文字列以外の値(リストなど)を渡すとTypeErrorが発生します。