Skip to main content
IBM Quantum Platform

Génération d'Ansatz

qiskit_addon_aqc_tensor.ansatz_generation

Outils de génération de circuits d'ansatz.

AnsatzBlockBloc d'Ansatz.
OneQubitAnsatzBlockBloc d'ansatz à un qubit.
TwoQubitAnsatzBlockBloc d'ansatz à deux qubits.
ZXZBloc d'ansatz à un qubit basé sur la décomposition ZXZ.
KAKBloc 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')

GitHub

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) – Si True, 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 0|0\rangle.
  • parameter_name (str) – Nom pour les ParameterVector repré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")
Schéma de circuit produit par le code précédent.

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")
Schéma de circuit produit par le code précédent.

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")
Schéma de circuit produit par le code précédent.

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)
Schéma de circuit produit par le code précédent.
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)
Schéma de circuit produit par le code précédent.

parametrize_circuit

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

GitHub

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 les ParameterVector repré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")
Schéma de circuit produit par le code précédent.

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")
Schéma de circuit produit par le code précédent.

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")
Schéma de circuit produit par le code précédent.

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")
Schéma de circuit produit par le code précédent
Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.