Ansatzgenerierung
qiskit_addon_aqc_tensor.ansatz_generation
Werkzeuge zur Erzeugung von Ansatzschaltungen.
Kolumne „ 1 “ | Kolumne „ 2 “ |
|---|---|
AnsatzBlock | Ansatzblock. |
OneQubitAnsatzBlock | Ein-Qubit-Ansatzblock. |
TwoQubitAnsatzBlock | Zwei-Qubit-Ansatzblock. |
ZXZ | Ein-Qubit-Ansatzblock auf der Grundlage der ZXZ-Zerlegung. |
KAK | Zwei-Qubit-Ansatzblock auf der Grundlage der KAK-Zerlegung. |
generate_ansatz_from_circuit
generate_ansatz_from_circuit(qc, /, *, qubits_initially_zero=False, parameter_name='theta')
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) – WennTrue, wird die erste Z-Drehung auf jedem Qubit auf Null gesetzt, da eine solche Drehung keinen Einfluss auf den Zustand hat. - parameter_name (
str) – Name für dieParameterVectordie 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")Ü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")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")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)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')
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 dieParameterVectordie 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")Ü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")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")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")