Skip to main content
IBM Quantum Platform

Ansatzgenerierung

qiskit_addon_aqc_tensor.ansatz_generation

Werkzeuge zur Erzeugung von Ansatzschaltungen.

Kolumne „ 1 “
Kolumne „ 2 “
AnsatzBlockAnsatzblock.
OneQubitAnsatzBlockEin-Qubit-Ansatzblock.
TwoQubitAnsatzBlockZwei-Qubit-Ansatzblock.
ZXZEin-Qubit-Ansatzblock auf der Grundlage der ZXZ-Zerlegung.
KAKZwei-Qubit-Ansatzblock auf der Grundlage der KAK-Zerlegung.

generate_ansatz_from_circuit

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

GitHub

Generierung eines Ansatzes aus der Zwei-Qubit-Konnektivitätsstruktur eines Schaltkreises.

Zur Begründung siehe das erläuternde Material.

Parameter

  • qc (QuantumCircuit) – Ein Stromkreis, der als einheitlich angenommen wird. Barrieren werden ignoriert.
  • qubits_initially_zero (bool) – Wenn True, wird die erste Z-Drehung auf jedem Qubit auf Null gesetzt, da eine solche Drehung keinen Einfluss auf den Zustand ∣0⟩|0\rangle hat.
  • parameter_name (str) – Name für die ParameterVector die die freien Parameter in der zurückgegebenen Ansatzschaltung darstellen.

Rückgabetyp

tuple[QuantumCircuit, list[float]]

Rückgabe

(ansatz, parameter_values) so dass ansatz.assign_parameters(parameter_values) bis zu einer globalen Phase gleichwertig mit qc ist.

Beispiel:

Betrachten Sie die folgende Schaltung als Beispiel:

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")
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Übergibt man die obige Schaltung an generate_ansatz_from_circuit()übergeben wird, gibt sie einen Satz mit parametrisierten Zwei-Qubit-KAK-Drehungen an denselben Stellen wie die Eingabe zurück:

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")
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Man beachte, dass im generierten Ansatz alle aufeinanderfolgenden Ein-Qubit-Tore in denselben ZXZ-Block und alle aufeinanderfolgenden Zwei-Qubit-Tore in einen einzigen KAK-Block kollabieren, bis hin zu Ein-Qubit-Drehungen.

Außerdem liefert die generate_ansatz_from_circuit() funktion Parameter zur Verfügung, die, wenn sie an den Ansatz gebunden sind, zu einer Schaltung führen, die bis zu einer globalen Phase äquivalent zur ursprünglichen Schaltung ist:

ansatz.assign_parameters(initial_params).draw("mpl")
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Eine 1D Trotter-Schaltung führt zu einem ähnlichen Ergebnis, mit seiner charakteristischen Mauerwerksstruktur:

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)
Schaltplan, der durch den vorherigen Code ausgegeben wurde.
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)
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

parametrize_circuit

parametrize_circuit(qc, /, *, parameter_name='theta')

GitHub

Erstellen Sie eine parametrisierte Version eines Schaltkreises.

Konstruiert aus einer Quantenschaltung eine andere Quantenschaltung, die identisch ist, mit der Ausnahme, dass alle Gatter mit numerischen Parametern durch Gatter (desselben Typs) mit freien Parametern ersetzt werden. Der neue Schaltkreis wird zusammen mit einer Liste zurückgegeben, die die ursprünglichen Werte der Parameter enthält.

Parameter

  • qc (QuantumCircuit) – Der zu parametrisierende Quantenschaltkreis.
  • parameter_name (str) – Name für die ParameterVector die die freien Parameter in der zurückgegebenen Ansatzschaltung darstellen.

Rückgabetyp

tuple[QuantumCircuit, list[float | None]]

Rückgabe

(ansatz, parameter_values) so dass ansatz.assign_parameters(parameter_values) mit qc identisch ist, sofern qc nicht bereits Parameter enthält. Wenn qc bereits Parameter enthielt, dann enthält parameter_values None die Einträge, die diesen Parametern entsprechen.

Beispiel:

Betrachten Sie die folgende Schaltung als Beispiel:

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")
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Übergibt man die obige Schaltung an parametrize_circuit()übergeben wird, wird ein Satz zurückgegeben, der aus dieser Schaltung gewonnen wird, indem numerische Parameter durch freie Parameter ersetzt werden:

from qiskit_addon_aqc_tensor import parametrize_circuit

ansatz, initial_params = parametrize_circuit(qc)
ansatz.draw("mpl")
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Außerdem bietet die parametrize_circuit() funktion Parameter zur Verfügung, die, wenn sie an den Ansatz gebunden sind, zu einer Schaltung führen, die mit der ursprünglichen identisch ist:

ansatz.assign_parameters(initial_params).draw("mpl")
Schaltplan, der durch den vorherigen Code ausgegeben wurde.

Wenn die ursprüngliche Schaltung bereits Parameter enthielt, dann enthalten die zurückgegebenen Parameterwerte None an den Einträgen, die diesen Parametern entsprechen, und der vorangehende Code funktioniert nicht. Das folgende Beispiel zeigt, wie in diesem Fall der ursprüngliche Schaltkreis wiederhergestellt werden kann.

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")
Schaltplan, der durch den vorherigen Code ausgegeben wird
War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.