Skip to main content
IBM Quantum Platform

Backend basé sur le circuit Quimb

qiskit_addon_mpf.backends.quimb_circuit

Un backend à évolution temporelle basé sur un circuit utilisant quimb.

Avertissement

Ce backend n'est disponible que si les dépendances optionnelles ont été installées :

pip install "qiskit-addon-mpf[quimb]"
CircuitEvolverUn moteur d'évolution temporelle basé sur des circuits quantiques.
CircuitStateUne représentation de type MPO d'un état d'évolution temporelle basée sur des circuits quantiques.

Méthode sous-jacente

Quimb s'enorgueillit d'un soutien direct à la simulation de circuits quantiques sous la forme d'une représentation basée sur les réseaux tensoriels quimb.tensor.Circuit réseau tensoriel. Nous pouvons en tirer parti pour éviter tout algorithme explicite d'évolution temporelle et encoder directement l'évolution temporelle dans a QuantumCircuit et utiliser quimb pour calculer le chevauchement entre deux circuits de ce type. Pour plus d'informations, consultez leur guide sur les circuits quantiques.


Exemple de code

Cette section présente un exemple simple qui vous permettra de commencer à utiliser ce backend. L'exemple montre comment créer les trois fonctions d'usine nécessaires à la fonction setup_dynamic_lse().

Le protocole IdentityStateFactory est déjà rempli par le constructeur CircuitState ce qui rend l'argument identity_factory trivial :

>>> from qiskit_addon_mpf.backends.quimb_circuit import CircuitState
>>> identity_factory = CircuitState

L'installation du CircuitEvolver est un peu plus complexe. Il requiert un objet paramétré QuantumCircuit paramétré, où l'objet Parameter doit prendre la place du pas de temps de la méthode Trotter (dt).

Pour montrer comment un tel modèle de circuit de Trotter paramétré est construit, nous réutilisons le même hamiltonien et la même formule de Suzuki-Trotter du second ordre que dans le cas suivant quimb_layers.

>>> from qiskit.quantum_info import SparsePauliOp
>>> hamil = SparsePauliOp.from_sparse_list(
...     [("ZZ", (i, i+1), 1.0) for i in range(0, 9, 2)] +
...     [("Z", (i,), 0.5) for i in range(10)] +
...     [("ZZ", (i, i+1), 1.0) for i in range(1, 9, 2)] +
...     [("X", (i,), 0.25) for i in range(10)],
...     num_qubits=10,
... )

Mais cette fois, nous spécifions un Parameter comme argument time lors de la construction des circuits réels.

>>> from functools import partial
>>> from qiskit.circuit import Parameter
>>> from qiskit.synthesis import SuzukiTrotter
>>> from qiskit_addon_mpf.backends.quimb_circuit import CircuitEvolver
>>> from qiskit_addon_utils.problem_generators import generate_time_evolution_circuit
>>> dt = Parameter("dt")
>>> suzuki_2 = generate_time_evolution_circuit(hamil, time=dt, synthesis=SuzukiTrotter(order=2))
>>> approx_evolver_factory = partial(CircuitEvolver, circuit=suzuki_2)
Attention

Il est nécessaire que le nom du Parameter soit dt!

Nous pouvons choisir une formule de Trotter d'ordre supérieur pour exact_evolver_factory. Mais notez que nous devons à nouveau utiliser un circuit paramétré, même si nous lions immédiatement son paramètre lors de la construction de la fonction partial .

>>> suzuki_4 = generate_time_evolution_circuit(hamil, time=dt, synthesis=SuzukiTrotter(order=4))
>>> exact_evolver_factory = partial(CircuitEvolver, circuit=suzuki_4, dt=0.05)

Ces fonctions d'usine peuvent maintenant être utilisées pour exécuter le programme setup_dynamic_lse(). Reportez-vous à sa documentation pour plus de détails à ce sujet.

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.