Variables i paràmetres
Variables
Aquest mòdul ofereix eines per definir diferents tipus de variables:
Variables contínuesamb els paràmetres personalitzables següents:Domini: especifica el tipus de variable, un de:
REAL,INTEGER,POSITIVE_INTEGER,BINARY, oSPIN.Límits: defineix el rang de valors permesos de la variable.
Codificació: especifica com es representa la variable mitjançant codificacions binàries, una de:
Bitwise,DomainWall, oOneHot.Precisió: aplicable al domini
Domain.REAL; defineix la resolució (per exemple, la precisió en punt flotant).
Un exemple de creació de diferents tipus de variables:
from qilisdk.core.variables import BinaryVariable, Bitwise, Domain, SpinVariable, Variable
x = Variable("x", domain=Domain.REAL, bounds=(1, 2), encoding=Bitwise, precision=1e-1)
s = SpinVariable("s")
b = BinaryVariable("b")
Les variables contínues admeten indexació, on cada índex fa referència a un component de la forma codificada en binari de la variable. Per exemple:
print(x.to_binary())
Sortida:
(0.1) * x(0) + (0.2) * x(1) + (0.4) * x(2) + (0.30000000000000004) * x(3) + (1.0)
Per indexar la primera variable binària de la representació binària de x podeu escriure: x[0]. Cada configuració de variable binària genera un nombre de coma flotant dins dels límits, basat en la precisió definida. Per exemple:
x.evaluate([0, 1, 0, 0])
Sortida:
1.2
Paràmetres
Molts components de QiliSDK exposen paràmetres simbòlics que es poden optimitzar o reassignar en temps d’execució. La classe Parameter representa un símbol escalar amb límits opcionals, i Parameterizable proporciona una API uniforme (get_parameter_names(), set_parameter_values()…) implementada per circuits, planificacions, models i molt més.
from qilisdk.core import Parameter
theta = Parameter("theta", value=0.5, bounds=(0.0, 1.0))
print(theta.value) # 0.5
theta.set_value(0.75)
print(theta.bounds) # (0.0, 1.0)
Els paràmetres es comporten com a variables simbòliques en expressions algebraiques, de manera que podeu combinar-los amb altres variables i avaluar termes sense haver de passar el paràmetre explícitament: el seu value emmagatzemat s’utilitza automàticament.
Els objectes que hereten de Parameterizable recullen totes les instàncies de Parameter que troben. Per exemple:
from qilisdk.digital import Circuit, RX
circuit = Circuit(nqubits=1)
circuit.add(RX(0, theta=theta))
print(circuit.get_parameter_names()) # ['RX(0)_theta_0']
print(circuit.get_parameter_values()) # [0.75]
circuit.set_parameters({"RX(0)_theta_0": 0.9})
Tots els mètodes auxiliars de paràmetres accepten un predicat where opcional per filtrar els paràmetres exposats. Això és útil quan voleu actualitzar només un subconjunt, com ara els paràmetres entrenables.
trainable_values = circuit.get_parameter_values(where=lambda p: p.is_trainable)
circuit.set_parameter_values([0.3], where=lambda p: p.is_trainable)
Nota
Els objectes Parameterizable exposen l’estat dels paràmetres mitjançant get_parameters(), get_parameter_names(), get_parameter_values(), i els mètodes set_* corresponents. Accedir a .parameters directament no forma part de l’API pública.