quchip Physics Reference¶
This document states the physics contracts implemented by quchip. It distinguishes authored and resolved Hamiltonians, records where local bases, frames, and RWA are applied, and states the engine’s assumptions.
1. Units and the 2π Convention¶
quchip uses hbar = 1 with these user-facing units:
Quantity |
Unit |
|---|---|
Frequency |
GHz, ordinary frequency |
Time |
ns |
Temperature |
mK |
Energy |
GHz |
The domain layer stays in ordinary GHz. The only Hamiltonian-assembly 2π conversion is in quchip/engine/assembly.py, right before the solver-facing Hamiltonian is built.
2. What .hamiltonian() Means¶
2.1 Device Hamiltonians¶
BaseDevice.unresolved_hamiltonian() returns that device’s authored static Hamiltonian in its declared local space, in the lab frame, in ordinary GHz.
Examples:
DuffingTransmon.unresolved_hamiltonian()returnsomega * n + (alpha / 2) * n * (n - I).Resonator.unresolved_hamiltonian()returnsomega * n.
The authored view does not:
include
2πinclude any rotating-frame subtraction
include any drive term
include any explicit time dependence
BaseDevice.hamiltonian() resolves the same device through the engine path. For an owned device it inherits the chip’s local-basis and frame policy; an explicit frame= passed to resolve() affects only that snapshot. The result is a one-device expression, so couplings to the rest of the chip remain outside its boundary.
2.2 Coupling .interaction_hamiltonian()¶
BaseCoupling.interaction_hamiltonian() returns the coupling’s full two-body operator in the pair subspace, still in the lab frame, still in ordinary GHz. It takes no RWA argument — a coupling defines exactly one interaction; RWA is resolved and applied structurally by the chip and engine, not chosen here (§6.1).
For Capacitive:
full: g * (a + a†)(b + b†)
interaction_hamiltonian() always returns this full form. The RWA form g * (a†b + ab†) is never authored directly — it is what remains once the bands that change total excitation are masked out by the chip or filtered by the engine.
2.3 Chip and sequence Hamiltonians¶
Chip.unresolved_hamiltonian() embeds every authored device Hamiltonian and full coupling interaction into the total declared Hilbert space. It is the exact static lab-frame expression before local-basis resolution, retained-level truncation, frame transformation, or RWA.
Chip.hamiltonian() is reconstructed from Chip.resolve(), the frozen EngineResult used by backends. Resolution:
resolves each authored local space into the selected solver basis and retained dimension
multiplies solver-facing operators by
2πsubtracts the chosen frame generator
decomposes non-static pieces into excitation-change bands and applies the chip’s approximation strategy
attaches explicit time-dependent phases where needed
The returned expression is an inspectable, ordinary-GHz view of those same canonical terms; the solver-facing EngineResult retains the internal 2π scaling. QuantumSequence.hamiltonian() follows the same path and adds the sequence’s scheduled drive and crosstalk terms.
These inspection methods return PhysicsExpr, the backend-neutral scalar and operator algebra used for authored and resolved physics. It retains declared parameters, matrices, time-dependent scalars, labels, and opaque JAX callables without forcing numerical values. Numerical materialization is explicit through .matrix() or backend lowering.
The resulting contracts are:
device
.unresolved_hamiltonian()means authored local static lab-frame physicsdevice
.hamiltonian()means the resolved one-device engine viewcoupling
.interaction_hamiltonian()means local static lab-frame interaction physicsChip.unresolved_hamiltonian()means the embedded authored static lab-frame chip HamiltonianChip.hamiltonian()means the resolved canonical chip Hamiltonian without scheduled drivesQuantumSequence.hamiltonian()means the resolved canonical Hamiltonian with scheduled drives
3. Device Models¶
3.1 Duffing transmon¶
Source: quchip/devices/transmon/duffing.py
H = omega * n + (alpha / 2) * n * (n - I)
omega is the 0 -> 1 transition frequency and alpha is the anharmonicity.
3.2 Resonator¶
Source: quchip/devices/resonator.py
H = omega * n
If internal_quality_factor is set, the resonator contributes unobserved
photon loss with authored operator a and rate 2π * omega / Q_internal in
1/ns. Backend lowering forms the Lindblad operator
sqrt(2π * omega / Q_internal) * a.
3.3 Collapse operators¶
Source: quchip/devices/base.py
The standard dissipators are:
T1: relaxation throughaT2: pure dephasing throughsqrt(2*gamma_phi) * nwithgamma_phi = 1/T2 - 1/(2*T1). The factor2makes the 0–1 coherence decay at1/(2*T1) + gamma_phi = 1/T2, so the inputT2is the resulting coherence time (whenthermal_population == 0). The number operatorngives the standard(m-n)^2dephasing scaling across higher levels.thermal up/down channels when
thermal_populationis set
Devices, drives, couplings, and baths author CollapseChannel records that
keep the local operator separate from its non-negative rate in 1/ns. The
engine projects and embeds the operator while preserving the rate; backend
lowering applies sqrt(rate) exactly once.
3.3.1 Accessible ports¶
Source: quchip/chip/ports.py,
quchip/engine/input_output.py,
quchip/analysis/vna.py
A Port is an accessible Markovian channel. It owns a dimensionless operator
A_p, an external rate kappa_p, and a reference-plane phase phi_p:
L_p = exp(i phi_p) sqrt(kappa_p) A_p
b_out,p = b_in,p - L_p
The dissipator uses L_p. A coherent input beta_p in
sqrt(photons/ns) contributes the angular Hamiltonian
H_input = i (beta_p L_p^dagger - beta_p^* L_p).
Mean output, spectra, and correlations use the same L_p. For a single
resonator, external_quality_factor gives
kappa_p = 2π * freq / Q_external. Internal resonator loss and every port are
separate collapse channels, so kappa_total is their sum.
Noise parameters are ordinary tracked attributes: set (or clear with None) at construction or any time after — collapse operators are rebuilt from current values on every solve, and post-construction writes get the same validation as the constructor. Chip-level shared/collective dissipation lives in Bath (quchip/chip/baths.py), attached at construction or later via chip.add_bath(...); bath rates are Lindblad-ready 1/ns with no assembly 2π (that boundary is Hamiltonian-only — a component’s intrinsic 2π, e.g. a resonator’s κ = 2π·f/Q, is its own physics).
3.5 Transitions¶
device.transition(lower, upper) returns the Hermitian transition operator
|lower><upper| + |upper><lower| in the device’s authored coordinates.
device.transition_frequency(lower, upper) returns the isolated energy gap in
GHz. The level indices refer to the energy ordering of the device’s static
local Hamiltonian.
chip.transition_frequency(target, lower, upper, when=...) uses the complete
undriven static chip Hamiltonian. It assigns dressed eigenstates to the two bare
product labels and returns their energy difference before frame subtraction or
drive approximation. Unspecified spectators are in level zero; when sets
spectator occupations and cannot include target.
chip.freq(target, when=...) is the concise 0-to-1 form. For a higher target
transition, use explicit levels:
f01 = chip.freq(qubit)
f12 = chip.transition_frequency(qubit, 1, 2)
fr_when_excited = chip.freq(readout, when={qubit: 1})
Local basis projection and dressed transition assignment are separate. Basis projection selects the tensor factors used by the solver; dressed assignment labels eigenstates of the coupled static chip.
4. Frames¶
4.1 What frame selection means¶
Source: quchip/engine/frames.py
The public frame spec is one of:
"lab""rotating"a shared float
a per-device dict
The engine resolves that into per-device reference frequencies omega_ref,i.
4.2 What transform the engine is using¶
The engine assumes the rotating-frame unitary
U(t) = exp(-i 2π t Σ_i omega_ref,i * n_i)
So the solver Hamiltonian is
H_rot = U† H_lab U - 2π Σ_i omega_ref,i * n_i
That second term is why the assembler subtracts omega_ref,i * n_i from H0.
4.3 What "rotating" means in practice¶
"rotating" means:
each device gets its own reference frequency
that frequency is
device.reference_freqdevice.reference_freqdefaults todevice.drive_freq(the dressed0 -> 1frequency when available, otherwise the bare frequency), and is a settable per-device knob
So "rotating" is not a special solver mode. It is just a specific choice of omega_ref,i.
4.4 reference_freq — the readout / LO reference¶
Source: quchip/devices/base.py
device.reference_freq is the frequency the rotating frame co-rotates at and the reference observables are reported in (§8). It defaults to drive_freq, so an unset device co-rotates at its own transition and behavior is unchanged. Setting it off the transition leaves a residual detuning Δ = omega - omega_ref in H0 — idle Ramsey precession — which is how a control/LO calibration error is modelled.
It is a frame / readout reference only: it does not detune drives (the drive carrier is a separate choice, so a real LO error must also set the drive frequency). It is ordinary GHz, tracked (mutating it invalidates engine caches), and JAX-traceable / differentiable / sweepable.
5. Frame Tracking in the Engine¶
Source: quchip/engine/assembly.py
The engine does not rotate whole expressions symbolically. It tracks phases band-by-band.
5.1 Single-device operators¶
A local operator is decomposed into bands with weight
w = col - row
In the chosen frame, that band gets phase
exp(-i 2π w * omega_ref * t)
That is how the engine knows which part of a + a†, i(a - a†), or an observable is still rotating.
5.2 Two-device couplings¶
A two-body operator is decomposed into bands labeled by (delta_a, delta_b), where each value is the excitation change on one subsystem.
That band gets phase
exp(-i 2π (delta_a * omega_ref,a + delta_b * omega_ref,b) * t)
If that effective frequency is zero, the band stays static in H0. If not, it becomes an explicit time-dependent term.
This band decomposition is the frame-tracking mechanism.
5.3 Model time dependence and scheduled control¶
DeviceModel.time_terms() and CouplingModel.time_terms() return
TimeDependentTerm values for physics that exists without a scheduled pulse. Each
term pairs a local operator with a TimeCoefficient; the engine projects,
band-decomposes, and frames it through the same path as other Hamiltonian
terms. Scheduled control remains drive-owned: its finite-duration envelope and
carrier produce a drive modulation only after QuantumSequence.schedule().
Envelope.value(local_time) defines local complex I/Q shape. Scheduling owns
the pulse start, carrier, and global phase, so the same shape can be placed and
phase-rotated without changing its physics definition.
Local eigenbasis projection uses the static authored Hamiltonian at the solve’s operating point. Component-owned time-dependent terms are projected into that fixed basis; quchip does not construct an instantaneous moving basis.
6. Approximation strategies¶
Source: quchip/approximations.py, quchip/engine/approximations.py
The chip owns one explicit approximation strategy. Exact() retains every term in the authored finite-dimensional Hamiltonian. RWA() applies the engine’s first-order structural rotating-wave reduction to static interactions and scheduled drives. Devices, couplings, and drives do not carry their own RWA policy.
Chip.unresolved_hamiltonian() preserves the authored static interaction. Engine assembly band-decomposes each interaction and applies the selected strategy. Chip.hamiltonian() is reconstructed from those same canonical terms, so inspection and simulation use one decision path. Under RWA(), rejected bands become advisory DroppedTerm records with their excitation weights, largest matrix-element magnitude, and frame frequency. A retained band with zero frame frequency stays in H0; every other retained band is carried as an explicit time-dependent term.
6.1 Static operator bands¶
For Capacitive:
full: g * (a + a†)(b + b†)
= g * (a†b + ab†) + g * (ab + a†b†)
a†b + ab†has total excitation weight zero and survivesRWA()ab + a†b†has total excitation weight two and is removed byRWA()
interaction_hamiltonian() always returns the complete authored form. RWA() reconstructs its retained bands in the engine; a coupling does not supply an alternative RWA operator or retention hook. The mask depends only on integer band offsets, so it remains concrete when operator parameters are JAX tracers.
The static/dynamic decision is made per band, not per coupling: in a shared frame (multiple devices detuned to a common reference), the coupling’s counter-rotating band can carry a nonzero carrier even when its co-rotating band is frame-static. The per-band fold evaluates each band’s own carrier independently, so a shared frame never suppresses the counter-rotating band’s true rotation.
With Exact(), no band is dropped; every non-static band is carried at its own frame frequency.
6.2 Driven operator bands¶
For a single-tone drive channel, the engine forms the real lab-frame field
Re[s(t) * exp(-i 2π f_drive t)]
and combines it with the operator bands.
Exact() retains both co-rotating and counter-rotating pieces.
RWA() keeps the conventional partner for each excitation band and drops its counter-rotating partner.
Flux drives are different: they couple through n, which is diagonal, so there is no raising/lowering split to RWA away. They are treated as direct real-valued modulation channels.
7. Counter-Rotating Terms¶
Counter-rotating terms appear when the operator changes total excitation in the same direction as the classical or frame rotation instead of cancelling it.
Concrete examples:
In full capacitive coupling,
abanda†b†are counter-rotating.In a single-tone drive, the fast partner of the real field is counter-rotating relative to the chosen transition band.
In the rotating frame of two detuned modes with frequencies omega_a and omega_b:
exchange terms rotate at about
|omega_a - omega_b|counter-rotating terms rotate at about
omega_a + omega_b
That is why they are usually dropped by RWA: they are much faster and usually average out.
Choose RWA() to remove structural first-order counter-rotating bands, or Exact() to carry every term explicitly.
8. Observables and Demodulation¶
Source: quchip/engine/observables.py
Dict-form e_ops are decomposed into the same excitation bands used by the frame logic. After the solver returns, the engine recombines them with the demodulation frequencies in ResolvedFrame.demod_freqs = omega_ref - omega_frame (per device).
This makes result.expect a co-rotating readout: observables are always reported in each device’s reference_freq frame, independent of the integration frame the solver used. So transverse observables (<a>, <sigma_x>) come back as the non-oscillatory demodulated envelope a lab readout produces — slow, and turning at Δ = omega - omega_ref when the reference is detuned; diagonal observables (populations) are frame-invariant. In the default "rotating" mode the integration frame is the reference frame, so the demodulation is a no-op and result.expect equals Tr(O·rho) on the same states result.states returns. The raw, un-demodulated band sum (the observable in the integration frame) remains available on each ObservableTrace as .raw.
8.1 Stationary solves and scattering¶
Chip.steadystate() solves L(rho_ss) = 0 together with
Tr(rho_ss) = 1. It requires a static resolved Hamiltonian and a unique
normalized stationary state. VNA.sweep() adds continuous-wave port terms in
their stationary tone frames. Small-signal scattering differentiates the
output mean around the fixed-tone state; finite-amplitude scattering subtracts
that operating-point output and divides by the swept input amplitude.
If frame and approximation resolution leave dynamic terms, the stationary APIs raise. Periodic/Floquet stationary states are not implemented.
9. Dressing¶
Source: quchip/chip/chip.py
Chip.dress() diagonalizes the full static lab-frame Hamiltonian, assigns bare product states to dressed eigenstates by overlap, and stores a DressedResult containing:
eigenvalues and lazily materialized eigenstates
bare-to-dressed state assignments and the assigned eigenvalue for each bare label
assignment overlaps and labels below the requested overlap threshold
the dressed eigenvector matrix used by dressed-basis analysis
Chip.freq() evaluates dressed 0 -> 1 frequencies through the traceable array-labeling cache; those frequencies are not stored in DressedResult.
Dressing is lab-frame analysis. It is not part of the runtime frame transform.
9.1 Dressed drive matrix elements¶
Sources: quchip/chip/analysis.py, quchip/control/equipment.py
For a drive line j with local Hamiltonian operator D_j, quchip defines the dressed matrix element
m_j^(fi) = <f~|D_j|i~>
with the final dressed state as the matrix row and the initial dressed state as the matrix column. Thus
Chip.drive_matrix_elements((initial, final))[j] reads [final, initial] from U† D_j U. The device shorthand
chip.drive_matrix_elements(q) selects the dressed transition from the all-ground state to the state labeled by
one excitation in q. Explicit (initial_mapping, final_mapping) arguments select arbitrary transitions. Before
the matrix element is evaluated, every dressed eigenvector is phase-fixed so that its overlap with its assigned bare
state is real and nonnegative. This removes backend-dependent eigenvector signs from comparisons between conditioned
transitions, such as the sum and difference used for the weak-drive IX and ZX coefficients.
drive_matrix_elements evaluates the physical drive operators without applying the signal chain. Declared
control-line mixing is represented separately by ControlEquipment.crosstalk_matrix(): column j is the source
line, row l is the victim line, and each entry carries an amplitude, phase, and delay. The returned matrix
elements can then be combined with those declared line phasors in a chosen weak-drive effective-Hamiltonian model.
Keeping the two pieces separate distinguishes dressed quantum response from microwave-path mixing.
This projection follows the effective driven-Hamiltonian treatment of E. Magesan and J. M. Gambetta,
Phys. Rev. A 101, 052308 (2020), DOI 10.1103/PhysRevA.101.052308.
9.2 Weak-drive cross-resonance susceptibility¶
For a charge drive on control c, projected onto the target transition t with the control fixed in |z>, define
m_z = <z_c, 1_t~|D_c|z_c, 0_t~>, z in {0, 1}.
In the cross-resonance convention
H_eff = (IX I X + ZX Z X) / 2,
the control-conditioned off-diagonal entries are (IX + ZX)/2 and (IX - ZX)/2. Therefore a signal amplitude
Omega multiplying D_c gives
IX / Omega = m_0 + m_1,
ZX / Omega = m_0 - m_1.
analyze_cr_susceptibility reports these complex coefficients per unit amplitude without choosing a pulse or
performing time evolution. A drive phase may rotate the common complex quadrature; abs(ZX) is the maximum useful
linear-response rate after that phase choice. The projection remains a weak-drive statement and does not include
strong-drive Stark shifts, pulse-bandwidth leakage, or echo/cancellation calibration.
This convention follows the effective-Hamiltonian decompositions of Magesan and Gambetta, Phys. Rev. A 101, 052308 (2020), and Malekakhlagh, Magesan, and McKay, Phys. Rev. A 102, 042605 (2020).
9.3 Dressed Kerr matrix¶
Chip.kerr_matrix() evaluates one labeled eigensystem and returns a symmetric
matrix in chip.devices order. For distinct devices,
K[i,j] = E(1_i,1_j) - E(1_i) - E(1_j) + E(0),
which is the same full-pull convention as Chip.dispersive_shift(i, j) and
the static-ZZ coefficient for two qubits. On the diagonal,
K[i,i] = E(2_i) - 2 E(1_i) + E(0),
which is Chip.dressed_anharmonicity(i). A device with fewer than three
resolved levels has NaN on the diagonal; its defined off-diagonal entries
remain available. Every entry comes from the complete dressed chip rather
than from a matching authored edge. In particular, an isolated
KerrCavity with H = omega*n - K*n*(n-1) has K[i,i] = -2*K.
10. Adiabatic Elimination and Dispersive Readout¶
Sources: quchip/chip/transformations/, quchip/analysis/dispersive_readout.py
eliminate(chip, target, method="sw"|"exact") performs model reduction, dispatched on the target. A device target removes a far-detuned mode and folds its 2nd-order effect into the survivors: the Lamb shift g^2/Delta into freq, the Purcell rate (g/Delta)^2 * kappa into T1, and, for a mode touching two or more survivors, the mediated exchange J = (g_a*g_b/2)(1/Delta_a + 1/Delta_b) into each survivor pair (F. Yan et al., PRApplied 10, 054062 (2018)). A fixed-frequency eliminated mode produces a Capacitive edge; a frequency-controlled mode produces a TunableCapacitive edge. If a compatible direct edge already joins the pair, the exchange is folded into that edge while preserving any existing tunability. A coupling target keeps both endpoints and replaces the edge with a CrossKerr at the dressed pull. Readout quantities chi and kappa remain available in effective_params after a resonator is eliminated. Sources for the reduction math: quchip/chip/sw.py.
10.2 Pointer states and readout figures of merit¶
analyze_dispersive_readout(chi, kappa, tau, ...) is closed-form steady-state algebra (driven, damped linear resonator, d<a>/dt = −(i*delta + kappa/2)<a> − i*eps):
delta_r = f_r|0 − f_drive drive placement [GHz] (Δ_r = ω_r − ω_d)
delta_j = 2π*(delta_r + chi_eff*j) resonator−drive detuning, qubit in |j> [rad/ns]
alpha_j = −i*eps / (kappa/2 + i*delta_j) coherent pointer state
nbar_j = |alpha_j|^2 steady-state photons (emergent)
sigma = 1/sqrt(2*kappa*tau) integrated vacuum-noise blob width
SNR = |alpha_1 − alpha_0| * sqrt(2*kappa*tau)
p_err = (1/2)*erfc(SNR/(2*sqrt(2))) two equal Gaussians, optimal discriminant
Gamma_m = kappa*|alpha_1 − alpha_0|^2 / 2 measurement-induced dephasing [1/ns]
with eps = sqrt(nbar_0*((kappa/2)^2 + delta_0^2)) when the drive is given as a target photon number, and the optional strong-drive collapse chi_eff = chi/(1 + nbar_0/n_crit). In the small-χ limit Gamma_m → 8*chi_sigma_z,ang^2*nbar/kappa with chi_sigma_z,ang = π*chi_pull in rad/ns (Gambetta et al., PRA 74, 042318; Krantz et al., APR 6, 021318, §V).
The internal 2πs here are local physics conversions at the module’s public boundary — the engine’s single Hamiltonian-assembly 2π (§1) is untouched. Declared approximations (carried in the result’s notes): steady state only (no ring-up transient), linear resonator, 2nd-order dispersive, no measurement-induced qubit T1.
10.3 The Schrieffer-Wolff route (method="sw")¶
The chip’s bare Hamiltonian H = H0 + V (GHz, before 2π, under the selected approximation) is partitioned by the eliminated mode’s occupation: P = the mode in |0>, Q = everything else. The generator solves the Sylvester condition on the cross blocks,
S_ij = V_ij / (E_i − E_j) (i, j straddling P/Q; E = diag H)
H_eff = P (H + (1/2)[S, V]) P
(Bravyi, DiVincenzo & Loss, Ann. Phys. 326, 2793 (2011), 2nd order). Nested where guards handle the division: an exactly degenerate cross pair with no matrix element contributes zero with a finite gradient, whereas a single where would propagate a NaN backward through the unselected branch. Survivor parameters are obtained by indexing H_eff: freq_after(s) = E(1_s) − E(0); the pair exchange is the <1_a|H_eff|1_b> element. An authored direct edge is included in H_eff, so the emitted edge carries the total coupling and the reported j_eff subtracts the direct contribution. Alongside J, the bridge fold records its linearization
dJ/domega_c = (g_a*g_b/2)(1/Delta_a^2 + 1/Delta_b^2)
— the weight the flux-drive retarget rule uses (§11). Per-element virtual-state attribution (pathways) is (1/2) V_ik V_kj (1/(E_i−E_k) + 1/(E_j−E_k)) summed over intermediate |k>, with the same guarded denominator.
10.4 The exact route (method="exact")¶
One full diagonalization; parameters are read off the labeled dressed spectrum (label_eigensystem, §9), so kept-block energies are exact to all orders, as required for residual ZZ:
zz(a, b) = E(1,1) − E(1,0) − E(0,1) + E(0,0) (≡ Chip.dispersive_shift)
The pair exchange is read through the symmetrically (Löwdin-)orthonormalized subspace projection S^(−1/2) (W E W†) S^(−1/2) with W the overlap block and S = W W† — the des-Cloizeaux effective Hamiltonian, whose spectrum equals the labeled energies exactly. The energies are exact, but this basis is not the canonical SW rotation, so off-diagonal reads agree with method="sw" only through 2nd order. method="exact" raises when a kept bare label has no majority dressed eigenstate, or when two kept labels claim the same one. In that regime, near-degenerate dressed states straddle the bare labels and quantities assigned to a single label are not well defined. Use method="sw" or shift the operating point.
10.5 Collapse transforms and validity metrics¶
The eliminated mode’s own jump operator is carried into the reduced frame by the same rotation as the Hamiltonian:
c_eff = P (c + [S, c]) P (sw — 1st order in S, matching H_eff's 2nd order)
c_eff = P U† c U P (exact — U the labeled eigenvector matrix)
and the survivor-lowering amplitude gives the inherited (Purcell) rate |amplitude|^2 * kappa. The result’s notes record that the projection is exact for the spectrum but approximate for dissipation: the discarded Q-block dynamics also dephase and decay. validity reports, per eliminated coupling, g_over_delta (2nd-order smallness; is_valid gates at < 0.1) and min_block_gap — the smallest bare-energy gap the Sylvester generator crossed. A small gap with a nonzero matrix element is the perturbative expansion’s failure mode even when every g/Delta is small.
11. Parametric Edge Control¶
Sources: quchip/control/drive.py (ParametricDrive), quchip/engine/assembly.py (EDGE_PUMP), quchip/chip/retarget.py
11.1 The pump contract¶
A ParametricDrive pumps a modulable coupling (a TunableCapacitive edge): the scheduled envelope is the real modulation A(t) of the coupling strength, in GHz. Two forms:
freq omitted (baseband): delta_g(t) = Re s(t)
freq = nu_d (tone): delta_g(t) = Re[s(t) · e^(−i·2π·nu_d·t)]
The tone is never RWA-split by the engine: the coupling’s parametric_interaction hook picks the retained operator structure, and each excitation-change band (Δa, Δb) carries its rotating-frame carrier exp(−i(Δa·ω_a + Δb·ω_b)t) exactly as static couplings do (§5.2). Pumping at the survivors’ difference frequency parametrically activates the exchange with effective rate A/2 (the rotating-wave halving of a real modulation; Didier et al., PRA 97, 022330 (2018)).
11.2 Retargeting stranded control (chip/retarget.py)¶
eliminate() converts control lines whose target was removed through a registry keyed by (drive type, target type, result kind). The registry follows each type’s MRO, so a rule registered for a base type also covers its subclasses. The built-in rule converts a FluxDrive on an eliminated exchange-mediating mode into one baseband ParametricDrive per emitted edge. The first pair’s pump keeps the flux line’s label; further edges receive unit-amplitude Crosstalk copies of the scheduled signal; and every pump carries its own Gain(dJ_ab/domega_c). This small-signal conversion is exact to first order in delta_omega_c and assumes delta_omega_c ≪ Delta; second-order Lamb-shift modulation of the survivors is omitted and recorded.
11.3 Schedule portability¶
The retargeted line keeps its label, and schedule() resolves drive-line labels in device → coupling → line order. The same schedule call can therefore run on the full and reduced chips. tests/physics_sentinel/test_eliminate_portability.py applies identical schedules to both models and compares them using tolerances derived from the validity metrics (g/Delta, delta_omega/Delta).
12. Engine Assumptions¶
The engine relies on four physics assumptions:
Frame generators are built from per-device number operators
n_i.Single-device and two-device operators can be decomposed by excitation-change bands.
The default
"rotating"frame uses each device’s best available drive frequency.Each drive builds a complete analytic signal with an optional carrier, then implements
hamiltonian(target, signal). Control equipment transforms that signal before the destination drive maps its physical I/Q quadratures to target-local operators. The engine owns frame and band selection.
What the engine does not hardcode:
transmon-specific formulas
resonator-specific formulas
backend-native operator types
device-specific noise models beyond asking each device for its collapse operators
Devices, couplings, and drives supply the domain-specific physics. The engine handles the frame and RWA bookkeeping shared by them.
13. JAX Traceability Boundaries¶
Band decomposition, coefficient construction, observable recombination, and the backend-free Hamiltonian IR preserve JAX arrays.
The following operations require concrete Python values:
Chip.dress()returns a concrete dict-based view and is not traceable. The bare→dressed assignment itself is discrete and piecewise. Traced callers should useChip.energy(),Chip.freq(target, when=...),Chip.dispersive_shift(), orChip.kerr_matrix(), which route throughlabel_eigensystemin the pure-JAX kernel inquchip/chip/dressing.py; labeled energy lookup stays differentiable away from label discontinuities.track_pathis a separate continuation utility for following labels through a stacked eigensystem along a parameter sweep.Human-facing serialization and diagnostics coerce to Python scalars.
Other engine paths avoid implicit conversion to host arrays.
14. Audit Pointers¶
When you need to audit a physics path, start here:
units and assembly boundary:
quchip/engine/assembly.pyframe resolution:
quchip/engine/frames.pyobservable preparation and demodulation:
quchip/engine/observables.pydressing and public Hamiltonian APIs:
quchip/chip/chip.pyadiabatic elimination and χ/κ reporting:
quchip/chip/transformations/Schrieffer-Wolff kernels and the exact reduction route:
quchip/chip/sw.pycontrol-line retargeting across reductions:
quchip/chip/retarget.pyreadout pointer states and figures of merit:
quchip/analysis/dispersive_readout.py