Skip to main content
IBM Quantum Platform

Backend basato sul circuito Quimb

qiskit_addon_mpf.backends.quimb_circuit

Un backend ad evoluzione temporale basato su circuiti che utilizza quimb.

Avvertenza

Questo backend è disponibile solo se le dipendenze opzionali sono state installate:

pip install "qiskit-addon-mpf[quimb]"
CircuitEvolverUn motore di evoluzione temporale basato su circuiti quantistici.
CircuitStateUna rappresentazione simile a MPO di uno stato di evoluzione temporale basata su circuiti quantistici.

Metodo sottostante

Quimb vanta un supporto diretto per la simulazione di circuiti quantistici sotto forma di rappresentazione a rete tensoriale quimb.tensor.Circuit rappresentazione. Possiamo sfruttare questo aspetto per evitare un algoritmo di evoluzione temporale esplicito e codificare invece direttamente l'evoluzione temporale in un QuantumCircuit e utilizzare quimb per calcolare la sovrapposizione tra due circuiti di questo tipo. Per ulteriori informazioni, consultate la guida sui circuiti quantistici.


Esempio di codice

Questa sezione mostra un semplice esempio per iniziare a usare questo backend. L'esempio mostra come creare le tre funzioni di fabbrica necessarie per il file setup_dynamic_lse().

Il IdentityStateFactory è già soddisfatto dal costruttore CircuitState rendendo l'argomento identity_factory banale:

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

L'impostazione del sistema CircuitEvolver è leggermente più complessa. Richiede un oggetto parametrizzato QuantumCircuit come input, dove il parametro Parameter dovrebbe prendere il posto del passo temporale dei metodi Trotter (dt).

Per mostrare come si costruisce un modello di circuito Trotter parametrato, riutilizziamo la stessa formula hamiltoniana e di Suzuki-Trotter del secondo ordine come in 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,
... )

Questa volta, però, specifichiamo un Parameter come argomento di time quando si costruiscono i circuiti veri e propri.

>>> 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)
Attenzione

È necessario che il nome del file Parameter sia dt!

Possiamo scegliere una formula di Trotter di ordine superiore per exact_evolver_factory. Si noti, però, che dobbiamo ancora una volta utilizzare un circuito parametrizzato, anche se il suo parametro viene immediatamente vincolato durante la costruzione della funzione 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)

Queste funzioni di fabbrica possono ora essere utilizzate per eseguire il programma setup_dynamic_lse(). Per maggiori dettagli, consultare la documentazione.

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.