SQA 2026 examples

Five independent calculations from the talk, each linked to its full guide.

quchip uses GHz for frequencies and couplings, ns for time, and mK for temperature.

Your first chip

from quchip import Capacitive, Chip, DuffingTransmon, Resonator

q = DuffingTransmon(freq=5.0, anharmonicity=-0.25, levels=4, label="q")
r = Resonator(freq=7.0, levels=5, label="r")
chip = Chip([q, r], [Capacitive(q, r, g=0.05, label="qr")])

print("devices:", [device.label for device in chip.devices])
print("declared H:", chip.unresolved_hamiltonian().latex())

Output:

devices: ['q', 'r']
declared H: \omega_{q}\,\hat n_{q} + 0.5\,\alpha_{q}\,\hat n_{q}\,(\hat n_{q} - \hat I_{q}) + \omega_{r}\,\hat n_{r} + g_{qr}\,i\,(\hat a_{q} - \hat a^\dagger_{q})\,i\,(\hat a_{r} - \hat a^\dagger_{r})

Continue with chip definition and inspection.

Calculate and sweep the spectrum

import numpy as np

from quchip import Capacitive, Chip, DuffingTransmon, Resonator

q = DuffingTransmon(freq=5.0, anharmonicity=-0.25, levels=4, label="q")
r = Resonator(freq=7.0, levels=5, label="r")
chip = Chip([q, r], [Capacitive(q, r, g=0.05, label="qr")])

frequencies = np.linspace(4.9, 5.1, 21)
dressed_f01 = np.array(
    [chip.with_params({"q.freq": value}).freq("q") for value in frequencies]
)

print("first and last dressed f01 (GHz):", dressed_f01[[0, -1]])

Output:

first and last dressed f01 (GHz): [4.8988102  5.09868512]

Continue with spectra and parameter sweeps.

Simulate one pulse

import numpy as np

from quchip import ChargeDrive, Chip, DuffingTransmon, Gaussian, QuantumSequence

q = DuffingTransmon(freq=5.0, anharmonicity=-0.25, levels=3, label="q")
chip = Chip([q], frame="rotating")

line = ChargeDrive(q, label="xy")
chip.wire(line)

sequence = QuantumSequence(chip)
sequence.schedule(
    line,
    envelope=Gaussian(duration=20.0, sigmas=3.0, amplitude=0.04),
    freq=chip.freq(q),
)
result = sequence.simulate(tlist=np.linspace(0.0, 30.0, 121))

print("final excited-state population:", result.population("q", 1)[-1])

Output:

final excited-state population: 0.7450817911512911

Continue with dynamics, pulses, observables, and readout.

Transform a chip

from quchip import Capacitive, Chip, DuffingTransmon, Resonator, eliminate

q = DuffingTransmon(freq=5.0, anharmonicity=-0.25, levels=3, label="q")
r = Resonator(freq=7.0, levels=5, label="r")
chip = Chip([q, r], [Capacitive(q, r, g=0.05, label="qr")])

fold = eliminate(chip, "r")
validity = fold.validity["qr"]

print("before:", [device.label for device in chip.devices])
print("after:", [device.label for device in fold.chip.devices])
print("g / detuning:", validity["g_over_delta"])
print("valid:", validity["is_valid"])

Output:

before: ['q', 'r']
after: ['q']
g / detuning: 0.025
valid: True

Continue with model reduction.

Differentiate a spectral fitting objective

The second residual uses quchip’s ground-positive convention, \(Z=|0\rangle\langle0|-|1\rangle\langle1|\), with \(\chi_Z=-\left(E_{11}-E_{10}-E_{01}+E_{00}\right)/2\). dispersive_shift() itself returns the full pull in the numerator.

import jax
import jax.numpy as jnp

from quchip import Capacitive, Chip, DuffingTransmon, Resonator
from quchip.backend.dynamiqs import DynamiqsBackend

q = DuffingTransmon(freq=5.0, anharmonicity=-0.25, levels=4, label="q")
r = Resonator(freq=7.0, levels=4, label="r")
chip = Chip(
    [q, r],
    [Capacitive(q, r, g=0.05, label="qr")],
    backend=DynamiqsBackend(),
)

names = ("q.freq", "q.anharmonicity", "qr.g")
theta = jnp.array([5.0, -0.25, 0.05])
target = jnp.array([5.05, 0.0010])  # [f01, chi_z] in GHz


def residual(values):
    rebound = chip.with_params(dict(zip(names, values)))
    chi_z = -rebound.dispersive_shift("q", "r") / 2
    observables = jnp.stack([rebound.freq("q"), chi_z])
    return observables - target


loss = lambda values: jnp.sum(residual(values) ** 2)

print("gradient:", jax.grad(loss)(theta))
print("Jacobian:\n", jax.jacrev(residual)(theta))

Output:

gradient: [-1.02434723e-01  8.49096110e-07  5.10899915e-03]
Jacobian:
 [[ 9.99376169e-01  0.00000000e+00 -4.99376169e-02]
 [ 1.30585777e-04 -4.92846075e-04  5.53077679e-03]]

Continue with gradients and parameter fitting.