quchip.devices.transmon.flux_tunable¶
Symmetric/asymmetric-SQUID flux-tunable transmon.
freq is the calibrated local 0 -> 1 transition at flux_bias.
Together they anchor a SQUID dispersion. Moving flux_bias keeps that
calibration and updates freq, so the local Duffing Hamiltonian follows the
new operating point. Supplying both freq and flux_bias defines a new
anchor instead. FluxTunableTransmon.frequency_at() and
FluxTunableTransmon.flux_for_frequency() inspect the same dispersion
without changing the device.
Declared approximations
Transmon regime: E_J ≫ E_C (exponential charge-dispersion suppression).
Duffing truncation: the cosine Josephson potential is expanded to quartic order. The anharmonicity is α ≈ −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.Harmonic charge scale: the charge and phase operators scale with the zero-point amplitudes
E_J^(1/4)andE_J^(-1/4)at fixed E_C. Capacitivegand charge-drive amplitudes refer to Φ = 0 (seeFluxTunableTransmon.charge_coupling_operator()).
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, and the Josephson parameters are derived internally:
α = −E_C → E_C = |α| (ω + E_C)² = 8 E_C E_J(flux_bias) → E_J_max through SQUID inversion
frequency_at() and flux_for_frequency() always show a mutated or
swept parameter (no stale SQUID metadata).
References
Koch et al., PRA 76, 042319 (2007), §II and §III.
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=unbound, anharmonicity=unbound, flux_bias=0.0, asymmetry=0.0, *, levels=3, label=None, T1=None, T2=None, thermal_occupation=None)[source]¶
Bases:
FockDeviceSQUID-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. Can be a JAX tracer.anharmonicity (float) – Calibrated local anharmonicity α in GHz, at the stored
flux_bias. Must be negative (α ≈ −E_C). Can be a JAX tracer.flux_bias (float, default 0.0) – Current operating point Φ/Φ₀ and calibration-anchor coordinate. Any real value. The SQUID inversion is undefined only at the symmetric-SQUID degenerate point (
asymmetry == 0andflux_biasa half-integer, seevalidate()). Rebinding only this value keeps the inferred SQUID calibration and updatesfreq, and rebinding it withfreqdefines a new anchor. It also sets the charge scale ofcharge_coupling_operator(). It is a JAX pytree leaf and can be differentiated or swept through the public chip API.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.T1 (float or None, default None) – Energy-relaxation time in ns.
Nonedisables T1 relaxation.T2 (float or None, default None) – Total 0-1 coherence time in ns. If both are set,
T2 <= 2*T1.thermal_occupation (float or None, default None) – Dimensionless mean bath occupation.
Nonedisables absorption.
- tunable_param_names = ('freq', 'anharmonicity', 'flux_bias')¶
Parameters eligible for inverse design. DeviceModel derives these from declared fields unless the class or an ancestor supplies a tuple. Explicit tuples remain authoritative when inherited; an empty tuple excludes the device from inverse design. Plain BaseDevice subclasses default to an empty tuple without derivation.
- dressed_fit_target_fields = (('freq', 'freq'), ('anharmonicity', 'anharmonicity'))¶
(dressed_observable, declared_field)pairs used when this device appears in the desired-chip form offit_a_dress. Empty means that the model makes no automatic dressed-target claim; circuit-level models can remain fixed until the user supplies explicit constraints.
- dressed_fit_param_names = ('freq', 'anharmonicity')¶
Bare parameters normally varied to reproduce
dressed_fit_target_fields. This remains separate fromtunable_param_names: a model may expose parameters for sweeps without claiming that inverse design can identify all of them from its default dressed observables.
- 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); harmonic charge scale (E_J/E_J,max)^(1/4) at the static flux_bias.'¶
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=unbound, positive=True, nonnegative=False, serialize=True, unit='GHz', symbol='\\omega', noise=False, kw_only=False, required=False)¶
- anharmonicity: Scalar = Parameter(default=unbound, positive=False, nonnegative=False, serialize=True, unit='GHz', symbol='\\alpha', noise=False, kw_only=False, required=False)¶
- flux_bias: Scalar = Parameter(default=0.0, positive=False, nonnegative=False, serialize=True, unit='Phi_0', symbol='\\Phi', noise=False, kw_only=False, required=False)¶
- asymmetry: Scalar = Parameter(default=0.0, positive=False, nonnegative=False, serialize=True, unit=None, symbol='d', noise=False, kw_only=False, required=False)¶
- set_parameter_values(values)[source]¶
Apply flux and calibration overrides without mapping-order effects.
- tunable_param_bounds(name, value)[source]¶
Use one SQUID period as the default bound for explicit flux fitting.
- local_hamiltonian(op, p)[source]¶
Return the Duffing Hamiltonian built from the calibrated freq and anharmonicity.
- Parameters:
op (LocalOps) – Fock operator namespace.
p (ParameterNamespace) – Symbolic calibrated and flux parameters.
updates (H = ω n + (α/2) n(n − I). Rebinding flux_bias first)
dispersion. (the stored freq through the anchored SQUID)
- charge_coupling_operator()[source]¶
Return the charge operator
s(Φ) i(a − a†).Notes
At fixed E_C, the transmon charge zero-point amplitude scales as
E_J^(1/4)(Koch et al. 2007, §III). The factors(Φ) = (E_J(Φ)/E_J,max)^(1/4) = (cos²(πΦ) + d² sin²(πΦ))^(1/8)takes it relative to Φ = 0, sogof a capacitive coupling and a charge-drive amplitude refer to the sweet spot.sdepends on the staticflux_bias. AFluxDrivepulse does not change it.
- phase_coupling_operator()[source]¶
Return the phase operator
(a + a†)/s(Φ).The phase zero-point amplitude scales as
E_J^(-1/4), the inverse of the charge scale incharge_coupling_operator().
- frequency_at(flux)[source]¶
SQUID dispersion ω(Φ/Φ₀) in GHz, using derived E_C and E_J_max.
- Parameters:
flux (float) – Reduced flux Φ/Φ₀. JAX-traceable.
- flux_for_frequency(target_freq)[source]¶
Inverse SQUID dispersion on the monotonic lobe Φ/Φ₀ ∈ [0, 0.5).
- Parameters:
target_freq (float or array-like) – Desired transition frequency in GHz.
Notes
- 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 and the returned flux clips to the lobe endpoint, so out-of-domain behavior is undefined for traced inputs.