quchip.devices.transmon.flux_tunable¶
Symmetric/asymmetric-SQUID flux-tunable transmon.
freq and anharmonicity are the simulated physics: the calibrated
local 0 -> 1 transition frequency and anharmonicity of the device at
the stored flux_bias. FluxTunableTransmon.local_hamiltonian()
builds the Duffing Hamiltonian from freq and anharmonicity alone —
it does not reference flux_bias. FluxTunableTransmon.frequency_at()
and FluxTunableTransmon.flux_for_frequency() answer counterfactual
questions — what frequency the SQUID would reach at a different bias — via
the SQUID dispersion relative to this calibrated anchor. Mutating
flux_bias therefore records a new nominal operating point without
retuning the device: it does not change freq, anharmonicity, or the
Hamiltonian.
Declared approximations
Transmon regime: E_J ≫ E_C (exponential charge-dispersion suppression).
Duffing truncation: the cosine Josephson potential is expanded to quartic order; anharmonicity α ≈ −E_C.
Adiabatic flux: the SQUID dispersion underlying
frequency_at()/flux_for_frequency()is a static calibration-anchor relation with no Landau–Zener physics. Time-dependent flux tuning during gates is applied through an externalFluxDrivewhose real-baseband envelope carries δω(t) in GHz.
SQUID dispersion
where d = (E_{J1} − E_{J2}) / (E_{J1} + E_{J2}) is the junction asymmetry
and Φ/Φ₀ is the reduced flux. The user supplies the calibrated local
freq and anharmonicity; the Josephson parameters are derived
internally:
α = −E_C → E_C = |α| (ω + E_C)² = 8 E_C E_J(flux_bias) → E_J_max via SQUID inversion
The SQUID parameters _E_C / _E_J_max are derived on read from
the current freq / anharmonicity / flux_bias / asymmetry — they
carry no cached state, so frequency_at() and flux_for_frequency()
always reflect a mutated or swept parameter (no stale SQUID metadata).
References
Koch et al., PRA 76, 042319 (2007), §II.
Krantz et al., APR 6, 021318 (2019), §II.B and §V.A.
Renger et al., A superconducting qubit-resonator quantum processor with effective all-to-all connectivity — flux-tunable qubits and MOVE/CZ gates.
Examples
>>> from quchip.devices.transmon import FluxTunableTransmon
>>> q = FluxTunableTransmon(freq=4.47, anharmonicity=-0.2006, levels=3)
>>> round(q.freq, 3)
4.47
>>> round(q.anharmonicity, 4)
-0.2006
>>> round(float(q.frequency_at(0.0)), 3)
4.47
Classes
|
SQUID-dispersion flux-tunable transmon. |
- class quchip.devices.transmon.flux_tunable.FluxTunableTransmon(freq, anharmonicity, flux_bias=0.0, asymmetry=0.0, *, levels=3, label=None, T1=None, T2=None, thermal_population=None)[source]¶
Bases:
DeviceModelSQUID-dispersion flux-tunable transmon.
The constructor takes the calibrated local physical parameters; SQUID metadata is derived on read and is not part of the public interface.
- Parameters:
freq (float) – Calibrated local
0 -> 1transition frequency ω in GHz, at the storedflux_bias. Must be positive. May be a JAX tracer.anharmonicity (float) – Calibrated local anharmonicity α in GHz, at the stored
flux_bias. Must be negative (α ≈ −E_C). May be a JAX tracer.flux_bias (float, default 0.0) – Calibration-anchor operating point Φ/Φ₀. Any real value; the SQUID inversion is undefined only at the symmetric-SQUID degenerate point (
asymmetry == 0andflux_biasa half-integer — seevalidate()). The local Hamiltonian does not reference this value directly —freqandanharmonicityalready carry it. A pytree leaf, so it is differentiable / sweepable like every other device parameter.asymmetry (float, default 0.0) – SQUID junction asymmetry d = (E_{J1}−E_{J2})/(E_{J1}+E_{J2}). Must be in [0, 1).
levels (int, default 3) – Fock-space truncation.
label (str | None, default None) – Auto-generated as
fluxtunable_{idx}when omitted.**noise_kwargs – Forwarded to
BaseDevice—T1,T2,thermal_population.
- tunable_param_names = ('freq', 'anharmonicity')¶
Bare parameters this device exposes as differentiable / tunable scalars.
fit_a_dresswalks this tuple to discover what it is allowed to optimize on each device, decoupling the inverse-design surface from any specific device model. Three states, keyed on whether the value is explicitly declared:No explicit declaration anywhere in the
DeviceModellineage — the default is derived: every declaredparameter()field, in declaration order (seeDeviceModel.__init_subclass__).Explicit tuple on the class or an ancestor — exact curation, validated at class-definition time; authoritative and inherited until a subclass explicitly replaces it.
Explicit empty tuple — deliberately freezes the device (and its subclasses, until one replaces it) out of inverse design.
On a plain (non-
DeviceModel)BaseDevicesubclass there is no derivation; the default stays empty unless the subclass declares its own tuple — e.g.Fluxoniumuses("E_C", "E_J", "E_L", "phi_ext").
- computational = True¶
Whether this device represents a computational qubit, as opposed to e.g. a bus resonator or a coupler element.
- approximation = 'Duffing-approximated SQUID transmon; adiabatic flux (calibration-anchor, no Landau-Zener).'¶
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.
- freq: Scalar = Parameter(default=<object object>, positive=True, nonnegative=False, serialize=True, unit='GHz')¶
- anharmonicity: Scalar = Parameter(default=<object object>, positive=False, nonnegative=False, serialize=True, unit='GHz')¶
- flux_bias: Scalar = Parameter(default=0.0, positive=False, nonnegative=False, serialize=True, unit='Phi_0')¶
- asymmetry: Scalar = Parameter(default=0.0, positive=False, nonnegative=False, serialize=True, unit=None)¶
- validate()[source]¶
Range checks on concrete scalars only; traced values pass unchecked.
- Return type:
None
- local_hamiltonian(op)[source]¶
Return the Duffing Hamiltonian built from the calibrated freq and anharmonicity.
H = ω n + (α/2) n(n − I). Does not referenceflux_bias.- Parameters:
op (LocalOps)
- Return type:
- flux_for_frequency(target_freq)[source]¶
Inverse SQUID dispersion on the monotonic lobe Φ/Φ₀ ∈ [0, 0.5).
- Derivation:
ω(Φ) = sqrt(8 E_C E_J_max sqrt(cos²(πΦ) + d²sin²(πΦ))) − E_C → let S = (ω + E_C)² / (8 E_C E_J_max) → cos²(πΦ)(1 − d²) + d² = S² → cos²(πΦ) = (S² − d²) / (1 − d²)
- Raises:
ValueError – If target_freq is concrete and lands outside the frequency range
frequency_at()reaches over Φ/Φ₀ ∈ [0, 0.5) at the current calibration anchor. A traced target_freq (or a traced anchor) skips this check; the returned flux clips to the lobe endpoint, so out-of-domain behavior is undefined for traced inputs.- Parameters:
target_freq (Any)
- Return type: