# ソルバーの並列実行 {py:func}`~amplify.parallel_solve` を使用すると、複数のソルバーやモデルに対して同時にリクエストを送ることができます。これにより、複数回の実行が必要な場合に、モデル変換やリクエストデータの処理時間、ソルバーへのネットワークアクセスによる転送時間などの隠蔽が期待出来ます。また、複数の問題を同時に実行できるソルバーに対しても、並列実行による実行効率の向上が期待出来ます。 ## 並列実行の例 まず、{py:func}`~amplify.solve` 関数を使用するときと同様に、モデルを構築します。 ```{testcode} from amplify import VariableGenerator, one_hot, FixstarsClient, solve gen = VariableGenerator() q = gen.array("Binary", 3) objective = q[0] * q[1] - q[2] constraint = one_hot(q) model = objective + constraint ``` 次に、複数のソルバークライアントを構築します。 ```{testcode} from amplify import FixstarsClient, DWaveSamplerClient from datetime import timedelta fixstars_client = FixstarsClient() # fixstars_client.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" fixstars_client.parameters.timeout = timedelta(milliseconds=1000) dwave_client = DWaveSamplerClient() # dwave_client.token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" dwave_client.parameters.num_reads = 100 ``` {py:func}`~amplify.parallel_solve` 関数を用いて、複数のソルバーにリクエストを送ります。{py:func}`~amplify.parallel_solve` は {py:func}`~amplify.solve` と同様のインターフェースを持ちますが、引数にリストを与えることができます。 ```python from amplify import parallel_solve fixstars_result, dwave_result = parallel_solve(model, [fixstars_client, dwave_client]) ``` 上記のコードは、以下を並列で実行したのと同じ効果を持ちます。したがって、`fixstars_result` と `dwave_result` はそれぞれ {py:func}`~amplify.Result` クラスのインスタンスです。 ```python from amplify import solve fixstars_result = solve(model, fixstars_client) dwave_result = solve(model, dwave_client) ``` ````{tip} {py:func}`~amplify.parallel_solve` にモデルのリストを渡すことで、異なるモデルを同一のソルバーで、あるいは異なるモデルを異なるソルバーで並列実行することが可能です。 ```{testcode} model1 = objective + constraint model2 = objective + 2 * constraint ``` 単一のモデルを複数のソルバーで並列実行する: : ```python result1, result2 = parallel_solve(model1, [fixstars_client, dwave_client]) ``` 複数のモデルを単一のソルバーで並列実行する: : ```python result1, result2 = parallel_solve([model1, model2], fixstars_client) ``` 複数のモデルを複数のソルバーで並列実行する: : ```python result1, result2 = parallel_solve([model1, model2], [fixstars_client, dwave_client]) ``` ```` ## 並列実行のパラメータ {py:func}`~amplify.parallel_solve` は {py:func}`~amplify.solve` と同様のキーワード引数を受け取ることができます。通常はキーワード引数は全ての並列実行で共通で使用されますが、リストを与えることで、複数のモデル、複数のソルバーと同様に、複数のキーワード引数を同時に指定することができます。この場合、それぞれのリストの要素数は同じでなければなりません。 例として、リストを用いた次のパラメータの指定は、 ```python fixstars_result, dwave_result = parallel_solve( model, [fixstars_client, dwave_client], dry_run=[False, True], num_solves=2, ) ``` 以下を並列で実行したのと同じ効果を持ちます。 ```python fixstars_result = solve(model, fixstars_client, dry_run=False, num_solves=2) dwave_result = solve(model, dwave_client, dry_run=True, num_solves=2) ``` ソルバーの種類や契約内容によっては、同一のソルバーに複数のリクエストを同時に送ることができない場合があります。{py:func}`~amplify.parallel_solve` の `concurrency` を指定することで、並列実行数の最大値を設定することができます。デフォルトは 0 で、この場合は動作させているマシンの CPU 数に応じて並列実行数が自動で決定されます。 ```python fixstars_result, dwave_result = parallel_solve( model, [fixstars_client, dwave_client, fixstars_client, dwave_client], concurrency=2, ) ```