Génération d'Ansatz
qiskit_addon_aqc_tensor.ansatz_generation
Outils de génération de circuits d'ansatz.
AnsatzBlock | Bloc d'Ansatz. |
OneQubitAnsatzBlock | Bloc d'ansatz à un qubit. |
TwoQubitAnsatzBlock | Bloc d'ansatz à deux qubits. |
ZXZ | Bloc d'ansatz à un qubit basé sur la décomposition ZXZ. |
KAK | Bloc d'ansatz à deux qubits basé sur la décomposition KAK. |
generate_ansatz_from_circuit
generate_ansatz_from_circuit(qc, /, *, qubits_initially_zero=False, parameter_name='theta')
Générer un ansatz à partir de la structure de connectivité à deux qubits d'un circuit.
Voir le matériel explicatif pour la motivation.
Paramètres
- qc (
QuantumCircuit) – Un circuit, qui est supposé être unitaire. Les obstacles sont ignorés. - qubits_initially_zero (
bool) – SiTrue, la première rotation Z sur chaque qubit est fixée à zéro parce qu'une telle rotation n'a pas d'effet sur l'état . - parameter_name (
str) – Nom pour lesParameterVectorreprésentant les paramètres libres dans le circuit d'ansatz renvoyé.
Type de retour
tuple[QuantumCircuit, list[float]]
Retours
(ansatz, parameter_values) de telle sorte que ansatz.assign_parameters(parameter_values) soit équivalent à qc jusqu'à une phase globale.
Exemple :
Prenons l'exemple du circuit suivant :
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")Si le circuit ci-dessus est transmis à generate_ansatz_from_circuit()il renverra un ansatz avec des rotations KAK paramétrées à deux qubits aux mêmes endroits que l'entrée :
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")Notez que dans l'ansatz généré, toutes les portes consécutives à un qubit sont regroupées dans le même bloc ZXZ, et toutes les portes consécutives à deux qubits sont regroupées dans un seul bloc KAK, jusqu'aux rotations à un qubit.
En outre, la fonction generate_ansatz_from_circuit() fournit des paramètres qui, lorsqu'ils sont liés à l'ansatz, permettent d'obtenir un circuit équivalent au circuit original, jusqu'à une phase globale :
ansatz.assign_parameters(initial_params).draw("mpl")Un circuit 1D Trotter aboutit à un résultat similaire, avec sa structure caractéristique en briques :
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')
Créer une version paramétrée d'un circuit.
À partir d'un circuit quantique, construire un autre circuit quantique identique, à l'exception des portes à paramètres numériques qui sont remplacées par des portes (du même type) à paramètres libres. Le nouveau circuit est renvoyé avec une liste contenant les valeurs originales des paramètres.
Paramètres
- qc (
QuantumCircuit) – Le circuit quantique à paramétrer. - parameter_name (
str) – Nom pour lesParameterVectorreprésentant les paramètres libres dans le circuit d'ansatz renvoyé.
Type de retour
tuple[QuantumCircuit, list[float | None]]
Retours
(ansatz, parameter_values) de telle sorte que ansatz.assign_parameters(parameter_values) soit identique à qc tant que qc ne contient pas déjà des paramètres. Si qc avait déjà des paramètres, alors parameter_values contiendra None aux entrées correspondant à ces paramètres.
Exemple :
Prenons l'exemple du circuit suivant :
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")Si le circuit ci-dessus est transmis à parametrize_circuit()il renverra un ansatz obtenu à partir de ce circuit en remplaçant les paramètres numériques par des paramètres libres :
from qiskit_addon_aqc_tensor import parametrize_circuit
ansatz, initial_params = parametrize_circuit(qc)
ansatz.draw("mpl")En outre, la fonction parametrize_circuit() fournit des paramètres qui, lorsqu'ils sont liés à l'ansatz, permettent d'obtenir un circuit identique au circuit original :
ansatz.assign_parameters(initial_params).draw("mpl")Si le circuit d'origine contenait déjà des paramètres, les valeurs de paramètres renvoyées contiendront None aux entrées correspondant à ces paramètres, et le code précédent ne fonctionnera pas. L'exemple suivant montre comment récupérer le circuit d'origine dans ce cas.
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")