QAOA

QAOA és un ansatz que aplica l’evolució temporal alternada d’un Hamiltonià de problema i un Hamiltonià mesclador [1]. Inicialitzant el circuit com l’estat fonamental del Hamiltonià mesclador (sovint simplement la superposició uniforme) i aplicant l’evolució alternada escalada pels paràmetres \(\gamma_i\) i \(\alpha_i\), la idea és que amb un cert conjunt de paràmetres l’ansatz hauria d’aproximar l’evolució de l’estat fonamental del Hamiltonià mesclador a l’estat fonamental del Hamiltonià de problema, d’acord amb el teorema adiabàtic quàntic. Tractant aquest circuit parametritzat com un ansatz per a un algorisme quàntic variacional, podem optimitzar per intentar minimitzar el valor esperat del Hamiltonià de problema i així resoldre el problema d’optimització codificat.

Opcions de configuració:

  • problem_hamiltonian: El Hamiltonià de problema que codifica la funció de cost.

  • layers: Nombre de capes repetides de portes. Cada capa aplica dues evolucions: una per al Hamiltonià de problema i una per al Hamiltonià mesclador.

  • mixer_hamiltonian: El Hamiltonià mesclador. Per defecte és el mesclador X.

  • trotter_steps: Nombre de passos de Trotter per usar en l’aproximació del Hamiltonià. Només s’utilitza si els Hamiltonians contenen termes que no commuten.

  • problem_params: Valors inicials dels paràmetres per als angles d’evolució del Hamiltonià de problema. Per defecte és 0.0 per a totes les capes.

  • mixer_params: Valors inicials dels paràmetres per als angles d’evolució del Hamiltonià mesclador. Per defecte és 0.0 per a totes les capes.

Exemple

from qilisdk.digital import QAOA
from qilisdk.analog.hamiltonian import Z as pauli_z

problem_hamiltonian = pauli_z(0) * pauli_z(1) + pauli_z(2)
ansatz = QAOA(
    problem_hamiltonian=problem_hamiltonian,
    layers=2,
    mixer_hamiltonian=None,
    trotter_steps=1,
    problem_params=[0.5, 1.0],
    mixer_params=[0.25, 0.75],
)
ansatz.draw()

Com amb el HardwareEfficientAnsatz, aquest ansatz es pot utilitzar com qualsevol circuit de QiliSDK. O bé, per realitzar en canvi una optimització variacional sobre els paràmetres per minimitzar el valor esperat del Hamiltonià de problema, es pot configurar un VariationalProgram (vegeu Functionals per a més detalls):

from qilisdk.functionals.variational_program import VariationalProgram
from qilisdk.functionals import DigitalPropagation
from qilisdk.optimizers.scipy_optimizer import SciPyOptimizer
from qilisdk.cost_functions.observable_cost_function import ObservableCostFunction
from qilisdk.readout import Readout
from qilisdk.backends import QiliSim

vqa = VariationalProgram(functional=DigitalPropagation(ansatz),
                         optimizer=SciPyOptimizer(method="powell", tol=1e-7),
                         cost_function=ObservableCostFunction(problem_hamiltonian))

print(f"Running QAOA with {len(ansatz.get_parameters())} parameters...")
backend = QiliSim()
result = backend.execute(vqa, readout=Readout().with_sampling(nshots=1000))
print("VQA Result:", result)