QAOA
QAOA es un ansatz que aplica la evolución temporal alternada de un Hamiltoniano problema y un Hamiltoniano mezclador [1]. Al inicializar el circuito como el estado fundamental del Hamiltoniano mezclador (a menudo simplemente la superposición uniforme) y luego aplicar la evolución alternada escalada por los parámetros \(\gamma_i\) y \(\alpha_i\), la idea es que para cierto conjunto de parámetros el ansatz debe aproximar la evolución desde el estado fundamental del Hamiltoniano mezclador hasta el estado fundamental del Hamiltoniano problema, de acuerdo con el teorema adiabático cuántico. Al tratar este circuito parametrizado como ansatz para un algoritmo cuántico variacional, podemos optimizarlo para intentar minimizar el valor esperado del Hamiltoniano problema y así resolver el problema de optimización codificado.
Opciones de configuración:
problem_hamiltonian: El Hamiltoniano problema que codifica la función de coste.
layers: Número de capas repetidas de puertas. Cada capa aplica dos evoluciones: una para el Hamiltoniano problema y otra para el Hamiltoniano mezclador.
mixer_hamiltonian: El Hamiltoniano mezclador. Por defecto es el mezclador X.
trotter_steps: Número de pasos Trotter a usar para la aproximación del Hamiltoniano. Solo se usa si los Hamiltonianos contienen términos no conmutativos.
problem_params: Valores iniciales de los parámetros para los ángulos de evolución del Hamiltoniano problema. Por defecto 0.0 para todas las capas.
mixer_params: Valores iniciales de los parámetros para los ángulos de evolución del Hamiltoniano mezclador. Por defecto 0.0 para todas las capas.
Ejemplo
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()
Al igual que con el HardwareEfficientAnsatz, este ansatz puede usarse como cualquier circuito de QiliSDK. O bien, para realizar una optimización variacional sobre los parámetros y minimizar el valor esperado del Hamiltoniano problema, se puede configurar un VariationalProgram (ver Functionals para más detalles):
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)