Esquema

La manera més senzilla de construir un esquema comú és fer servir les funcions d’ajuda:

  • linear: Interpolació lineal entre dos Hamiltonians.

  • quadratic: Interpolació quadràtica entre dos Hamiltonians.

  • polynomial: Interpolació polinomial de grau arbitrari entre dos Hamiltonians.

  • sinusoidal: Interpolació sinusoïdal entre dos Hamiltonians.

Per exemple, per crear un esquema lineal que interpola entre un Hamiltonià conductor i un Hamiltonià de problema en un temps de 10 unitats:

from qilisdk.analog import Schedule, X, Z

H1 = X(0) + X(1)
H2 = Z(0) * Z(1)

schedule = Schedule.linear(H1, H2, 10.0)
schedule.draw()

Per a esquemes més complexos, podeu fer servir directament la classe Schedule, que proporciona una interfície flexible per definir completament els coeficients del Hamiltonià dependents del temps. La classe Schedule associa punts temporals amb coeficients de Hamiltonian. Els coeficients poden ser nombres, paràmetres/termes o callables del temps, i es poden definir en punts discrets o en intervals que es mostren automàticament.

Arguments principals

  • dt (float): resolució de les mostres temporals. El valor per defecte és 0.1.

  • hamiltonians (dict[str, Hamiltonian]): Mapa d’etiquetes a instàncies de Hamiltonian.

  • coefficients (dict[str, dict]): Mapatge de l’etiqueta del Hamiltonià a un diccionari de definició temporal. Cada clau és un punt temporal (float/paràmetre/terme) o una 2-tupla que defineix un interval; cada valor pot ser:
    • el coeficient del Hamiltonià en aquell moment

    • o un callable que retorna un coeficient. Aquest callable pot acceptar un paràmetre t que serà substituït pel temps. A més, qualsevol altre paràmetre passat a aquest callable ha de tenir un valor per defecte o tenir el seu valor especificat en **kwargs.

  • interpolation (Interpolation): comportament LINEAR (per defecte) o STEP entre els punts proporcionats.

  • total_time (float | Parameter | Term | None): Temps màxim opcional que reescala tots els punts temporals preservant les posicions relatives.

Nota

Quan es col·loquen paràmetres a l’eix temporal (p. ex., com a punts temporals o extrems d’interval), l’esquema restringeix automàticament aquells paràmetres perquè es mantinguin entre els seus punts temporals veïns, de manera que l’ordre de la línia de temps continua sent vàlid.

Exemple 1: Coeficients callables amb mostreig per intervals

from qilisdk.analog import Schedule, X, Z
from qilisdk.analog.schedule import Interpolation

h_driver = X(0) + X(1)
h_problem = Z(0) * Z(1)

schedule = Schedule(
    hamiltonians={"driver": h_driver, "problem": h_problem},
    coefficients={
        "driver": {(0.0, 10.0): lambda t: 1 - t / 10.0},
        "problem": {(0.0, 10.0): lambda t: t / 10.0},
    },
    dt=0.5,
    interpolation=Interpolation.LINEAR,
)
schedule.draw()

Exemple 2: Interpolació per passos i reescalat del temps màxim

from qilisdk.analog import Schedule, Z
from qilisdk.analog.schedule import Interpolation
from qilisdk.utils.visualization.style import ScheduleStyle

h = Z(0)
schedule = Schedule(
    hamiltonians={"h": h},
    coefficients={"h": {0.0: 1.0, 5.0: 0.2}},
    dt=0.01,
    interpolation=Interpolation.STEP,
)

# Later, shorten the experiment to 3s without redefining points
schedule.draw(ScheduleStyle(title="Before Time Scaling"))
schedule.scale_max_time(3.0)
schedule.draw(ScheduleStyle(title="After Time Scaling"))
print("Time grid:", schedule.tlist)
print("Coeff at t=1.5:", schedule.coefficients["h"][1.5])

Nota

La funció draw mostra 1/dt punts de l’esquema; per tant, per augmentar la resolució del gràfic podeu reduir dt.

Esquemes Parametritzats

Els coeficients de Schedule poden ser simbòlics, la qual cosa permet bucles d’optimització clàssica o experiments que exploren una família de perfils temporals. Els coeficients poden ser instàncies de Parameter o expressions algebraiques (Term) construïdes a partir de paràmetres. L’esquema fa un seguiment de tots els paràmetres que troba, de manera que podeu consultar-los o establir-los més endavant.

from qilisdk.analog import Schedule, Z
from qilisdk.core import Parameter, GreaterThanOrEqual

gamma = Parameter("gamma", value=0.5, bounds=(0.0, 1.0))
T = Parameter("T", value=10.0, bounds=(1.0, 20.0))

schedule = Schedule(
    hamiltonians={"problem": Z(0)},
    coefficients={"problem": {(0.0, T): lambda t: gamma * t}},
    dt=0.1,
    total_time=T,
)

schedule.get_parameters()

schedule.set_parameters({"gamma": 0.7})
print(schedule.get_parameter_names())   # ['gamma', 'T']
print(schedule.get_constraints())       # [0 <= T]

Nota

Per a esquemes, Hamiltonians i interpoladors, feu servir get_parameters i els mètodes d’accés relacionats per inspeccionar l’estat dels paràmetres.