D-Waveデバイスのジョブがコードで記述され、デバイスに送信される方法を知りたいです。
答えでは、単純な問題についてこの特定の例を見るのが最善でしょう。D-Waveデバイスの「Hello World」は、単純な2D Isingモデルの基底状態を見つけるようなものだと思います。これは、ハードウェアによって直接実現される一種の問題だからです。おそらくこれは良い例です。しかし、専門知識のある人が別の例にふさわしければ、私は喜んで代替案を見つけます。
D-Waveデバイスのジョブがコードで記述され、デバイスに送信される方法を知りたいです。
答えでは、単純な問題についてこの特定の例を見るのが最善でしょう。D-Waveデバイスの「Hello World」は、単純な2D Isingモデルの基底状態を見つけるようなものだと思います。これは、ハードウェアによって直接実現される一種の問題だからです。おそらくこれは良い例です。しかし、専門知識のある人が別の例にふさわしければ、私は喜んで代替案を見つけます。
回答:
D-Waveワールドの「Hello World」に相当するのが2Dチェッカーボードの例です。この例では、4つのノードを持つ次の正方形グラフが表示されます。
我々は頂点色ことを定義してみましょうあれば黒σ I = - 1の場合、白σ I = + 1。目標は、グラフ内の4つの頂点を持つチェッカーボードパターンを作成することです。この結果を達成するためにhとJを定義するさまざまな方法があります 。まず、この問題には2つの解決策があります。
D-Wave量子アニーラーは、定義したイジングハミルトニアンを最小化するため、さまざまなカプラー設定の効果を理解することが重要です。例えば考えるカプラー:
我々はそれを設定した場合はの両方の量子ビットが同じ値を取る場合、ハミルトニアンが最小化されます。負のカプラーは相関すると言います。我々はそれを設定した場合、一方J 0 、1 = + 1 2つの量子ビットが反対の値をとる場合、ハミルトニアンが最小化されます。したがって、正のカプラーは反相関しますます。
チェッカーボードの例では、次のハミルトニアンを生じさせる隣接キュービットの各ペアを反相関させたいと思います。
デモのために、番目のキュービットにバイアス項を追加して、ソリューション1のみを取得します。この溶液は、必要σ 0 =を- 1、我々は、従って、そのバイアス設定H 0 = 1。最終的なハミルトニアンは次のとおりです。
コーディングしましょう!
注:何かを機能させるには、D-Waveのクラウドサービスにアクセスする必要があります。
まず、dwave_sapi2
(https://cloud.dwavesys.com/qubist/downloads/)Pythonパッケージがインストールされていることを確認してください。D-Waveは現在、それ以上のPythonバージョンをサポートしていないため、すべてがPython 2.7になります。そうは言っても、必需品をインポートしましょう。
from dwave_sapi2.core import solve_ising
from dwave_sapi2.embedding import find_embedding, embed_problem, unembed_answer
from dwave_sapi2.util import get_hardware_adjacency
from dwave_sapi2.remote import RemoteConnection
D-WaveソルバーAPIに接続するには、SAPIソルバーの有効なAPIトークン、SAPI URLが必要であり、使用する量子プロセッサーを決定する必要があります。
DWAVE_SAPI_URL = 'https://cloud.dwavesys.com/sapi'
DWAVE_TOKEN = [your D-Wave API token]
DWAVE_SOLVER = 'DW_2000Q_VFYC_1'
D-Wave 2000Q Virtual Full Yield Chimera(VFYC)を使用することをお勧めします。VFYCは、デッドキュービットのない完全に機能するチップです。Chimeraチップレイアウトは次のとおりです。
この時点で、チュートリアルを2つの異なる部分に分割しています。最初のセクションでは、問題を手動でChimeraハードウェアグラフに埋め込み、2番目のセクションでは、D-Waveの埋め込みヒューリスティックを使用してハードウェア埋め込みを見つけています。
上記のD-Wave 2000Qチップレイアウトの左上隅のユニットセルは次のようになります。
J = {(0,4): 1, (4,3): 1, (3,7): 1, (7,0): 1}
h = [-1,0,0,0,0,0,0,0,0]
connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)
これで、読み出しの数を定義し、answer_mode
「ヒストグラム」を選択することができます。これにより、結果がすでに発生数でソートされます。これで、D-Wave量子アニーラーでIsingインスタンスを解く準備ができました。
params = {"answer_mode": 'histogram', "num_reads": 10000}
results = solve_ising(solver, h, J, **params)
print results
次の結果が得られます。
{
'timing': {
'total_real_time': 1655206,
'anneal_time_per_run': 20,
'post_processing_overhead_time': 13588,
'qpu_sampling_time': 1640000,
'readout_time_per_run': 123,
'qpu_delay_time_per_sample': 21,
'qpu_anneal_time_per_sample': 20,
'total_post_processing_time': 97081,
'qpu_programming_time': 8748,
'run_time_chip': 1640000,
'qpu_access_time': 1655206,
'qpu_readout_time_per_sample': 123
},
'energies': [-5.0],
'num_occurrences': [10000],
'solutions': [
[1, 3, 3, 1, -1, 3, 3, -1, {
lots of 3 's that I am omitting}]]}
energies
そして -正しいソリューション文字列を取得します 。できた!
ますます大きなIsingインスタンスの作成を開始すると、手動埋め込みを実行できなくなります。それでは、2Dチェッカーボードの例を手動で埋め込むことはできないとしましょう。 そして その後、最初の定義から変更せずに残ります。
J = {(0,1): 1, (0,2): 1, (1,3): 1, (2,3): 1}
h = [-1,0,0,0]
再びリモート接続を確立し、D-Wave 2000Q VFYCソルバーインスタンスを取得します。
connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)
問題の埋め込みを見つけるには、まず現在のハードウェアグラフの隣接行列を取得する必要があります。
adjacency = get_hardware_adjacency(solver)
それでは、問題の埋め込みを見つけてみましょう。
embedding = find_embedding(J.keys(), adjacency)
大きなIsingインスタンスを処理している場合、複数のスレッド(複数のCPUで並列化)での埋め込みを検索してから、チェーンの長さが最小の埋め込みを選択できます。チェーン複数の量子ビットは、接続の度を高めるために、単一の量子ビットとして動作するように強制されているときです。ただし、チェーンが長いほど、壊れやすくなります。壊れたチェーンは悪い結果をもたらします!
これで、グラフに問題を埋め込む準備ができました。
[h, j0, jc, embeddings] = embed_problem(h, J, embedding, adjacency)
j0
定義した元のカップリングとjc
、チェーンの整合性を強化するカップリングが含まれています(チェーン内のキュービットを相関させます)。したがって、それらを再び1つの大きなものに結合する必要があります 辞書:
J = j0.copy()
J.update(jc)
これで、組み込みの問題を解決する準備ができました。
params = {"answer_mode": 'histogram', "num_reads": 10000}
raw_results = solve_ising(solver, h, J, **params)
print 'Lowest energy found: {}'.format(raw_results['energies'])
print 'Number of occurences: {}'.format(raw_results['num_occurrences'])
raw_results
問題を解決しない限り、意志は意味をなしません。場合によっては、一部のチェーンが破損し、オプションの引数で定義されている多数決により修正されますbroken_chains
。
unembedded_results = unembed_answer(raw_results['solutions'],
embedding, broken_chains='vote')
print 'Solution string: {}'.format(unembedded_results)
これを実行すると、すべての読み出しで正しい結果が得られます。
Lowest energy found: [-5.0]
Number of occurences: [10000]
Solution string: [[1, -1, -1, 1]]
これがあなたの質問に答えてくれることを願っています。またはsolve_ising
などのソリューションの品質を向上させるために関数に渡すことができるすべての追加パラメータをチェックすることを強くお勧めします。num_spin_reversal_transforms
postprocess
タイトルと質問の本文は、2つの異なる質問をするようです。タイトルでは「D-Waveデバイス用の簡単なプログラムをどのように作成しますか?」と質問し、質問本文では、D-Waveの基盤となるハードウェアを使用して単純な2D Isingモデルの基底状態を見つける方法を尋ねますデバイス、および対応するコードは何ですか(より具体的な質問です)。
前者はより一般的な質問なので、前者に答えます。
D-Wave 2000Qシステムは、C / C ++、Python、およびMATLABで利用可能なクライアントライブラリを備えた標準のインターネットAPI(RESTfulサービスに基づく)を提供します。このインターフェイスにより、ユーザーはネットワークを介してクラウドリソースとしてシステムにアクセスしたり、高性能コンピューティング(HPC)環境やデータセンターに統合したりできます。D-Waveのホスト型クラウドサービスからもアクセスできます。開発者は、D-Waveの開発ツールとクライアントライブラリを使用して、業界標準のツールを使用して既存の環境内でアルゴリズムとアプリケーションを作成できます。
ユーザーはさまざまな方法でシステムに問題を送信できますが、最終的に問題は、キュービットの重みとカプラーの強度に対応する一連の値を表します。システムは、これらの値を他のユーザー指定パラメーターと一緒に取得し、単一の量子機械命令(QMI)をQPUに送信します。問題の解決策は、見つかったキュービットの最適な構成に対応しています。つまり、エネルギー環境の中で最も低いポイントです。これらの値は、ネットワークを介してユーザープログラムに返されます。
量子コンピューターは決定論的ではなく確率論的であるため、複数の値を返すことができ、見つかった最適なソリューションだけでなく、他の非常に優れた選択肢も提供します。ユーザーは、システムに返すソリューションの数を指定できます。
ユーザーは、いくつかの方法でD-Wave量子コンピューターに問題を送信できます。
- C、C ++、Python、またはMATLABのプログラムを使用してQMIを作成および実行する
次のようなD-Waveツールを使用します。
QMIを介してシステムを直接プログラミングすることにより
D-Waveシステムのプログラミングモデルの詳細については、このホワイトペーパーをダウンロードしてください。