Variables i paràmetres

Variables

Aquest mòdul ofereix eines per definir diferents tipus de variables:

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.