Recuita Quàntica
En aquest tutorial, cobrirem els fonaments de la recuita quàntica i després mostrarem com fer servir QiliSDK per implementar un algorisme simple de recuita quàntica.
Què és la Recuita Quàntica?
La recuita quàntica és una tècnica d’optimització quàntica inspirada en el procés de recuita en metal·lúrgia, on un material s’escalfa i després es refreda lentament per eliminar defectes i millorar les seves propietats.
En la recuita quàntica, comencem amb un sistema quàntic simple que és fàcil de preparar i manipular, i després l’evolucionem lentament cap a un sistema més complex que codifica la solució al problema que volem resoldre.
Hi ha un teorema (el teorema adiabàtic) que estableix que si evolucionem el nostre sistema prou lentament, podem garantir que romandrà en el seu estat fonamental (l’estat d’energia més baixa) al llarg de l’evolució. La velocitat que necessitem ve determinada per la bretxa d’energia entre l’estat fonamental i el primer estat excitat, ja que si tenim una bretxa petita entre els nivells hem de moure’ns lentament per assegurar-nos de no saltar accidentalment a l’estat excitat.
Què és un Hamiltonià?
Quan parlem de recuita quàntica, sovint parlem d’Hamiltonians. Un Hamiltonià és un objecte matemàtic que descriu l’energia d’un sistema quàntic.
En la recuita quàntica, típicament tenim dos Hamiltonians: l’Hamiltonià inicial, que és fàcil de preparar i manipular, i l’Hamiltonià final, que codifica la solució al nostre problema. Aquests es combinen en un únic Hamiltonià depenent del temps que evoluciona de l’Hamiltonià inicial al final al llarg del temps:
on \(c_i(t)\) i \(c_f(t)\) són coeficients dependents del temps que controlen com es barregen els dos Hamiltonians al llarg del temps.
Aquests Hamiltonians s’escriuen típicament en termes dels operadors de Pauli: I, X, Y i Z, que són un conjunt de matrius que operen sobre qubits i formen una base per a totes les operacions quàntiques possibles. Per exemple, un Hamiltonià simple de dos qubits podria tenir aquest aspecte:
on el primer terme representa una interacció entre els dos qubits, i el segon terme representa un camp local en el primer qubit.
Per simplificar, el símbol del producte tensorial (⊗) s’omet sovint, i podem escriure l’Hamiltonià anterior com:
Què Fem Un Cop Tenim un Hamiltonià?
Un cop tenim un Hamiltonià que combina els nostres Hamiltonians inicial i final, podem fer-lo servir per evolucionar el nostre sistema quàntic al llarg del temps. En iniciar el nostre sistema en l’estat fonamental de l’Hamiltonià inicial i evolucionant-lo lentament d’acord amb l’Hamiltonià depenent del temps, esperem acabar en l’estat fonamental de l’Hamiltonià final, que codifica la solució al nostre problema.
Si el nostre estat fonamental és \(|ψ_0⟩\), podem representar l’estat del nostre sistema en l’instant següent \(dt\) com:
Aquest procés es repeteix fins que arribem al final del nostre esquema de recuita. Assumint que \(dt\) és prou petit, l’estat final del nostre sistema al final del procés hauria d’estar a prop de l’estat fonamental de l’Hamiltonià final, que codifica la solució al nostre problema.
Com Triem els Nostres Hamiltonians?
Determinar quins haurien de ser els nostres Hamiltonians inicial i final per a un problema d’optimització donat és una tasca no trivial, i hi ha moltes tècniques diferents per fer-ho. Un enfocament comú és representar primer el nostre problema d’optimització com un problema d’optimització binària quadràtica sense restriccions (QUBO), i després convertir aquest problema QUBO en el nostre Hamiltonià final.
Un Hamiltonià inicial comú és l’Hamiltonià de camp transversal, que ve donat per:
Aquest Hamiltonià té un estat fonamental simple que és fàcil de preparar, la qual cosa el converteix en una bona elecció per a l’Hamiltonià inicial en la recuita quàntica.
També hi ha l’elecció de com es vol programar el procés de recuita, que ve determinat per les funcions \(c_i(t)\) i \(c_f(t)\). Triar un bon esquema de programació pot ser important per a l’èxit del procés de recuita, ja que pot ajudar a garantir que romanguem en l’estat fonamental al llarg de l’evolució. L’elecció més simple és un esquema lineal, els coeficients del qual tenen el següent aspecte:
Com Podem Simular la Recuita amb QiliSDK?
Nota
Si no teniu QiliSDK instal·lat i voleu executar els exemples següents vosaltres mateixos, podeu seguir les instruccions de la guia d’instal·lació.
Per provar el nostre algorisme de recuita quàntica, podem fer servir QiliSDK per simular el procés de recuita en un ordinador clàssic. Per fer-ho, primer creem els nostres Hamiltonians inicial i final fent servir la classe Hamiltonian, o més específicament les classes d’operadors de Pauli:
from qilisdk.analog import X, Z
initial_hamiltonian = - X(0) - X(1)
final_hamiltonian = Z(0) + Z(1) + 0.5 * Z(0) * Z(1)
We then need to construct our schedule to determine how the mixing will happen over time, which we can do using the Schedule class. The class allows for complete flexibility in how you want to define your schedule, but it also provides some helper functions for common schedules:
from qilisdk.analog import Schedule
schedule = Schedule.linear(initial_hamiltonian, final_hamiltonian, total_time=100, dt=0.1)
Volem començar en l’estat fonamental de l’Hamiltonià inicial, que és una superposició uniforme de tots els estats possibles del sistema:
from qilisdk.core import QTensor
initial_state = QTensor.uniform(2)
Finalment, podem fer servir QiliSim per simular el procés de recuita:
from qilisdk.backends import QiliSim
from qilisdk.functionals import AnalogEvolution
from qilisdk.readout import Readout
backend = QiliSim()
result = backend.execute(
AnalogEvolution(schedule=schedule, initial_state=initial_state),
Readout().with_expectation(observables=[Z(0), Z(1), Z(0) * Z(1)])
)
print(result.get_expectation_values())
Això ens dóna els valors esperats dels observables que vam especificar al final del procés de recuita, que en aquest cas són els termes del nostre Hamiltonià final:
[-0.9997, -0.9997, +0.9994]
Aquests valors esperats estan propers als que esperaríem per a l’estat fonamental del nostre Hamiltonià final, ja que per minimitzar l’energia de l’Hamiltonià final volem minimitzar els valors de \(Z(0)\) i \(Z(1)\), mentre maximitzem el valor de \(Z(0)Z(1)\). Si augmentem el temps total i reduïm el pas de temps, podem apropar encara més aquests valors a 1.0 i -1.0, a costa d’augmentar el temps d’execució de la nostra simulació.