量子コンピュータのアプリケーション開発の新時代のために
とりあえずqaoaと呼ばれる組合せ最適化問題を解くためのフレームワークを新しいテンソルネットワーク向けに書き直しました。以前とは違うところについても解説します。
まず、テンソルネットワークシミュレータは状態ベクトル全体を保存しません。そのため、従来のように状態ベクトルと呼ばれる仕組みを使わず、それらからの計算の派生がありません。
その代わりに利用するのが期待値の直接的な計算です。期待値は、行列を状態ベクトルで挟んだ形をしています。これらは状態ベクトル全体がわからなくても求めることができます。
期待値が効率的に計算できれば機械学習や固有値問題で変分計算をする際には困ることはありません。
そのため、テンソルネットワークを使ったQAOAのフレームワークは状態ベクトルを経由しないようにフレームワークを書き直す必要があります。実際にコードを見てみます。
こちらを利用するには、別途ライブラリのインストールが必要です。
pip install --no-deps -U git+https://github.com/jcmgray/quimb.git@develop autoray
from blueqat import Circuit
from blueqat.utils import qaoa
from blueqat.pauli import qubo_bit as q
from blueqat.pauli import X,Y,Z,I
hamiltonian = (15-(1+2*q(0)+4*q(1))*(1+2*q(2)))**2
step = 4
result = qaoa(hamiltonian, step)
result.circuit.run(backend="draw")
result.circuit.run(backend="quimb", shots=1000)
<Figure size 1800x720 with 1 Axes>
Counter({'100': 16,
'111': 125,
'011': 648,
'101': 85,
'110': 113,
'000': 2,
'010': 3,
'001': 8})
上記は15を因数分解するコードです。テンソルネットワークシミュレータを使ったQAOAで、p=4で計算できています。状態ベクトルが取得できないため、期待値を最小化した後は、自分でサンプルを取る必要があります。
result.paramasでパラメータが、result.circuitでサーキット自体が取得できます。パラメータ付きのサーキットが取得できれば十分かと思います。実機では期待値は直接計算できませんが、学習以外では振幅を直接取る機会はかなり減りましたので、これまで状態ベクトルで全部していた計算を、期待値+サンプリングに置き換えるという点で、少し実機に近づいた感があります。
QAOAを50量子ビット以上で計算するのは結構骨が折れます。実機でもdepthが深いと全然計算できないので、TNシミュレータを活用することで、今まで以上に実機に近いシミュレーションができます。