アッツァッツ生成
qiskit_addon_aqc_tensor.ansatz_generation
アンサッツ回路を生成するためのツール。
AnsatzBlock | アンサッツ・ブロック |
OneQubitAnsatzBlock | 1量子ビットのアサッツ・ブロック。 |
TwoQubitAnsatzBlock | 2量子ビット・アンサッツ・ブロック。 |
ZXZ | ZXZ分解に基づく1量子ビットアサッツブロック。 |
KAK | KAK分解に基づく2量子ビットアサッツブロック。 |
generate_ansatz_from_circuit
generate_ansatz_from_circuit(qc, /, *, qubits_initially_zero=False, parameter_name='theta')
回路の2量子ビット接続構造からansatzを生成する。
動機については説明資料を参照のこと。
パラメーター
- qc (
QuantumCircuit) – ユニタリーと仮定された回路。 障壁は無視される。 - qubits_initially_zero (
bool) –Trueの場合、各量子ビットの最初のZ回転はゼロに固定される。なぜなら、そのような回転は状態 に影響を与えないからである。 - parameter_name (
str) – の名前。ParameterVectorを表す名前。
戻りの型
tuple[QuantumCircuit, list[float]]
戻り値
(ansatz, parameter_values) ansatz.assign_parameters(parameter_values) は、グローバルな位相まで と等価である。 qc
例:
例として次の回路を考えてみよう:
from qiskit import QuantumCircuit
qc = QuantumCircuit(6)
qc.rx(0.4, 0)
qc.ryy(0.2, 2, 3)
qc.h(2)
qc.rz(0.1, 2)
qc.rxx(0.3, 0, 1)
qc.rzz(0.3, 0, 1)
qc.cx(2, 1)
qc.s(1)
qc.h(4)
qc.draw("mpl")上記の回路を generate_ansatz_from_circuit()に渡すと、入力と同じ位置にパラメタ化された2量子ビットKAK回転を持つansatzを返す:
from qiskit_addon_aqc_tensor import generate_ansatz_from_circuit
ansatz, initial_params = generate_ansatz_from_circuit(
qc, qubits_initially_zero=True, parameter_name="x"
)
ansatz.draw("mpl")生成されたansatzでは、連続する1量子ビットのゲートはすべて同じZXZブロックに畳み込まれ、連続する2量子ビットのゲートはすべて、1量子ビットの回転までは1つのKAKブロックに畳み込まれることに注意。
さらに generate_ansatz_from_circuit() 関数は、ansatzに束縛されたとき、大域的な位相まで、元の回路と等価な回路になるパラメータを提供する:
ansatz.assign_parameters(initial_params).draw("mpl")1D トロッター・サーキットも、特徴的なレンガ造りの構造で、同様の結果をもたらす:
from rustworkx.generators import path_graph
from qiskit.synthesis import SuzukiTrotter
from qiskit_addon_utils.problem_generators import generate_time_evolution_circuit, generate_xyz_hamiltonian
hamiltonian = generate_xyz_hamiltonian(
path_graph(6),
coupling_constants=(0.0, 0.0, 1.0),
ext_magnetic_field=(0.4, 0.0, 0.0),
)
good_circuit = generate_time_evolution_circuit(
hamiltonian,
synthesis=SuzukiTrotter(reps=2),
time=1.0,
)
good_circuit.draw("mpl", initial_state=True)from qiskit_addon_aqc_tensor import generate_ansatz_from_circuit
ansatz, initial_params = generate_ansatz_from_circuit(
good_circuit, qubits_initially_zero=True, parameter_name="x"
)
ansatz.assign_parameters(initial_params).draw("mpl", initial_state=True)parametrize_circuit
parametrize_circuit(qc, /, *, parameter_name='theta')
パラメトリック化された回路を作成する。
ある量子回路が与えられたとき、数値パラメータを持つゲートを自由パラメータを持つゲート(同じタイプ)に置き換える以外は同じ量子回路を構築する。 新しい回路は、パラメータの元の値を含むリストとともに返される。
パラメーター
- qc (
QuantumCircuit) – パラメータ化対象の量子回路。 - parameter_name (
str) – の名前。ParameterVectorを表す名前。
戻りの型
tuple[QuantumCircuit, list[float | None]]
戻り値
(ansatz, parameter_values) qc がすでにパラメータを含んでいない限り、 は と同一である。 ansatz.assign_parameters(parameter_values) qc もし qc がすでにパラメーターを持っていた場合、 parameter_values はそれらのパラメーターに対応する項目で None を含むことになる。
例:
例として次の回路を考えてみよう:
from qiskit import QuantumCircuit
qc = QuantumCircuit(6)
qc.rx(0.4, 0)
qc.ryy(0.2, 2, 3)
qc.h(2)
qc.rz(0.1, 2)
qc.rxx(0.3, 0, 1)
qc.rzz(0.3, 0, 1)
qc.cx(2, 1)
qc.s(1)
qc.h(4)
qc.draw("mpl")上記の回路を parametrize_circuit()に渡すと、数値パラメータを自由パラメータに置き換えてこの回路から得られるansatzを返す:
from qiskit_addon_aqc_tensor import parametrize_circuit
ansatz, initial_params = parametrize_circuit(qc)
ansatz.draw("mpl")さらに parametrize_circuit() 関数は、ansatzに束縛されたとき、元の回路と同じ回路になるパラメータを提供する:
ansatz.assign_parameters(initial_params).draw("mpl")元の回路にすでにパラメータが含まれていた場合、返されるパラメータ値は、それらのパラメータに対応するエントリに None 、前述のコードは動作しない。 次の例は、この場合に元の回路を復元する方法を示している。
from qiskit.circuit import Parameter
qc = QuantumCircuit(3)
alpha1 = Parameter("alpha1")
alpha2 = Parameter("alpha2")
qc.ry(alpha1, [0])
qc.rz(0.1, [0])
qc.ry(alpha2, [1])
qc.rz(alpha1, [1])
qc.ry(0.2, [2])
qc.rz(0.3, [2])
ansatz, initial_params = parametrize_circuit(qc)
ansatz.assign_parameters(
{
param: val
for param, val in zip(ansatz.parameters, initial_params)
if val is not None
},
inplace=True,
)
ansatz.draw("mpl")