quchip.declarative.models¶
Declarative base classes for device and coupling physics models.
DeviceModel and CouplingModel let a subclass declare its
physics parameters as annotated class attributes with
parameter(). The subclass implements only
the Hamiltonian expression. Both classes synthesize their own __init__, JAX
pytree registration (for DeviceModel), and post-construction sign
validation from the declared fields.
Classes
|
Declarative two-body coupling base. |
|
Declarative base for physics device models. |
- class quchip.declarative.models.DeviceModel(*, levels=2, label=None, **params)[source]¶
Bases:
BaseDeviceDeclarative base for physics device models.
Subclasses declare their parameters as annotated class attributes with
parameter()(for examplefreq: Scalar = parameter(positive=True)) and implementlocal_hamiltonian(). The declared parameters become positional-or-keyword__init__arguments and JAX pytree leaves, so the full instance is traceable, differentiable, and sweepable end-to-end.The
hamiltonian()adapter compiles the declarative expression returned bylocal_hamiltonian()into an operator for the active default backend.Examples
>>> from quchip.declarative import DeviceModel, parameter, Scalar >>> class DuffingOscillator(DeviceModel): ... freq: Scalar = parameter(positive=True, unit="GHz") ... anharmonicity: Scalar = parameter(unit="GHz") ... def local_hamiltonian(self, op, p): ... return p.freq * op.n + 0.5 * p.anharmonicity * op.n @ (op.n - op.I) >>> device = DuffingOscillator(freq=5.0, anharmonicity=-0.3, levels=4) >>> device.freq 5.0
- Parameters:
- label: Any¶
- T1: Any = Parameter(default=None, positive=True, nonnegative=False, serialize=True, unit='ns', symbol=None, noise=True, kw_only=True, required=False)¶
- T2: Any = Parameter(default=None, positive=True, nonnegative=False, serialize=True, unit='ns', symbol=None, noise=True, kw_only=True, required=False)¶
- thermal_occupation: Any = Parameter(default=None, positive=False, nonnegative=True, serialize=True, unit=None, symbol=None, noise=True, kw_only=True, required=False)¶
- approximation: ClassVar[str | None] = None¶
Declared approximation-regime statement surfaced by
physics_notes()— the mechanism that keeps a model’s stated validity range attached to the class rather than buried in a docstring a caller may not read.
- computational: ClassVar[bool] = False¶
Whether this device represents a computational qubit, as opposed to e.g. a bus resonator or a coupler element.
- local_hamiltonian(op, p)[source]¶
Return this device’s local Hamiltonian as a declarative expression.
- Parameters:
op (LocalOps) – Operator namespace for this device’s endpoint. It exposes
a,adag,n,Iand the Pauli handles as composablePhysicsExprnodes.p (ParameterNamespace) – Symbolic leaves for this model’s declared parameters.
- Returns:
The local Hamiltonian expression, in ordinary-frequency units (GHz).
- Return type:
- time_terms(op, p)[source]¶
Return local time-dependent Hamiltonian terms beyond the static model.
- Parameters:
op (LocalOps) – Local operator namespace.
p (ParameterNamespace) – Symbolic declared parameters.
- dissipation(op, p)[source]¶
Return device-local Lindblad channels.
- Parameters:
op (LocalOps) – Local operator namespace.
p (ParameterNamespace) – Symbolic declared parameters.
T1 (The base channels implement)
T2
Subclasses (and thermal occupation.)
``super().dissipation(op (may append channels with) –
p)``.
- class quchip.declarative.models.CouplingModel(device_a, device_b, *, label=None, **params)[source]¶
Bases:
BaseCouplingDeclarative two-body coupling base.
Subclasses declare physics parameters with
parameter()and implementinteraction(), which returns aPhysicsExprover the two endpoint operators. After the authored interaction is assembled, the engine applies the chip’s approximation strategy structurally. Optional overrides:time_terms(): time-dependent Hamiltonian terms. Each term pairs a local operator with a public time coefficient.
coupling_strengthdefaults to the first declared parameter field (the common case of oneg-like scalar). Subclasses with a different convention override the property.Note
Coupling instances are not registered as JAX pytrees and cannot be passed as dynamic
jax.jit/jax.vmap/jax.gradarguments. Coupling parameters remain differentiable when the coupling (and the devices or chip it couples) is constructed from traced arguments inside the transformed function.Examples
>>> from quchip.declarative import CouplingModel, parameter, Scalar >>> class ExchangeCoupling(CouplingModel): ... g: Scalar = parameter(unit="GHz") ... def interaction(self, a, b, p): ... return p.g * (a.a * b.adag + a.adag * b.a) >>> c = ExchangeCoupling("q0", "q1", g=0.01) >>> c.coupling_strength 0.01
- Parameters:
- device_a: BaseDevice | str¶
- device_b: BaseDevice | str¶
- property coupling_strength: Any¶
Primary scalar coupling strength. The default is the first parameter.
- property coupling_strength_name: str¶
Display name of
coupling_strength. The default is the first parameter field.
- interaction(a, b, p)[source]¶
Return the full two-body interaction expression.
- Parameters:
a (EndpointOps) – Operator namespaces for the two coupled endpoints. Same-endpoint operators compose with
@. Cross-endpoint operators combine with*(tensor product).b (EndpointOps) – Operator namespaces for the two coupled endpoints. Same-endpoint operators compose with
@. Cross-endpoint operators combine with*(tensor product).p (ParameterNamespace) – Symbolic declared coupling parameters.
- Returns:
The interaction Hamiltonian expression, in ordinary-frequency units (GHz).
- Return type:
- time_terms(a, b, p)[source]¶
Return time-dependent interaction terms.
- Parameters:
a (EndpointOps) – Operator namespaces for the two coupled endpoints.
b (EndpointOps) – Operator namespaces for the two coupled endpoints.
p (ParameterNamespace) – Symbolic declared coupling parameters.
- Returns:
Local operators and their scalar time coefficients. An empty tuple means a purely static coupling.
- Return type:
- parametric_interaction(a, b, p)[source]¶
Return the parametric interaction structure, or
Nonewhen this coupling is not modulable.- Parameters:
a (EndpointOps) – Ordered endpoint operator namespaces.
b (EndpointOps) – Ordered endpoint operator namespaces.
p (ParameterNamespace) – Symbolic declared coupling parameters.
Notes
This hook is the coupling-side mirror of the device drive-dispatch protocols. A
ParametricDriveaccepts all couplings whose hook returns aPhysicsExpr.
- dissipation(a, b, p)[source]¶
Return authored two-endpoint Lindblad channels.
- Parameters:
a (EndpointOps) – Ordered endpoint operator namespaces.
b (EndpointOps) – Ordered endpoint operator namespaces.
p (ParameterNamespace) – Symbolic declared coupling parameters.
- classmethod from_dict(d, device_a, device_b)[source]¶
Reconstruct a coupling from
to_dict()output.- Parameters:
d (mapping) – Serialized coupling record.
device_a (device or str) – Endpoints that the containing chip supplies.
device_b (device or str) – Endpoints that the containing chip supplies.
implementation (Default)
envelope (__init__. Subclasses with bespoke serialization (e.g.)
this. (modulations) override)