Skip to main content
IBM Quantum Platform

アッツァッツ生成

qiskit_addon_aqc_tensor.ansatz_generation

アンサッツ回路を生成するためのツール。

AnsatzBlockアンサッツ・ブロック
OneQubitAnsatzBlock1量子ビットのアサッツ・ブロック。
TwoQubitAnsatzBlock2量子ビット・アンサッツ・ブロック。
ZXZZXZ分解に基づく1量子ビットアサッツブロック。
KAKKAK分解に基づく2量子ビットアサッツブロック。

generate_ansatz_from_circuit

generate_ansatz_from_circuit(qc, /, *, qubits_initially_zero=False, parameter_name='theta')

GitHub

回路の2量子ビット接続構造からansatzを生成する。

動機については説明資料を参照のこと。

パラメーター

  • qc (QuantumCircuit) – ユニタリーと仮定された回路。 障壁は無視される。
  • qubits_initially_zero (bool) – True の場合、各量子ビットの最初のZ回転はゼロに固定される。なぜなら、そのような回転は状態 に影響を与えないからである。 0|0\rangle
  • 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')

GitHub

パラメトリック化された回路を作成する。

ある量子回路が与えられたとき、数値パラメータを持つゲートを自由パラメータを持つゲート(同じタイプ)に置き換える以外は同じ量子回路を構築する。 新しい回路は、パラメータの元の値を含むリストとともに返される。

パラメーター

戻りの型

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")
前のコードで出力された回路図
このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。