Closed-loop pulse tuning of quantum hardware, built on the Piccolo ecosystem.
Intonato provides a composable framework for refining control pulses against
an experiment in the loop. The core is a small chassis — PulseTuningProblem
— with two pluggable slots:
- an
AbstractTuningStrategy— the inner optimization step (the policy that proposes the next pulse from the latest measurements), and - an
AbstractDeviceModel— the predictive model of the device the loop tunes against (a fixedNominalModel, or an adaptive model).
Around those it ships the substrate they need: measurement functions,
measurement models, an AbstractExperiment interface (simulated or hardware),
an AbstractHardwareBackend contract, pulse operations, a line search, and an
ExperimentRecord / AbstractExperimentLogger seam for capturing
provenance-rich hardware data.
Early-stage. The chassis, slot interfaces, device model, and data-collection seam are in place; concrete tuning strategies are under active development.
Intonato owns its hardware substrate and talks to the board through the Python
strumento framework directly:
Intonato (Julia) ──PythonCall──▶ strumento (Python) ──▶ qick / QICK board
-
Soc contract —
AbstractSocand its verbs (execute!,dac_rate,adc_rate, …), theQickChannelMap, the pulse → envelope translation (pulse_to_envelopes/QickProgram), readout conversion (iq_to_measurements→Measurement), the slow-DC control class (set_gate!/get_gate/gate_snapshotover aDCAxisMap), and the board-freeMockSoc.StrumentoBackend/StrumentoExperimentturn any soc into aHardwareExperimentfor the tuning chassis. -
Digital twins —
using Intonato.Twins: drift processes, twin records, the truth/beliefDigitalTwin, its soc faceTwinSoc, and the physics families. Drift moves truth only; calibration moves belief only. -
Real board — the
IntonatoPythonCallExtpackage extension, loaded whenPythonCallis loaded. It providesStrumentoSoc(hands the solved pulse to Pythonstrumento:from_solution→StrumentoProgram→ acquire → averaged IQ) andStrumentoDCSource(the DC verbs overstrumento.core.dc). Extension types do not surface onIntonatoitself; reach them through the extension module:using Intonato, PythonCall ext = Base.get_extension(Intonato, :IntonatoPythonCallExt) soc = ext.StrumentoSoc("device.yaml"; drive_map = [(1, "qubit", "drive", 4000.0)], dac_rate = 599.04, adc_rate = 599.04, board = qick_soc) # a qick soc (or strumento's MockQickSocV2)
Python
strumento(andqick) must be installed in the interpreter PythonCall uses — Intonato declares no Python dependencies. To use an existing environment, setJULIA_CONDAPKG_BACKEND=NullandJULIA_PYTHONCALL_EXE=/path/to/python. Without PythonCall, Intonato loads with no Python at all.
Strumento.jl, the former intermediate Julia package, is retired as of Intonato
0.5.0; its binding and twin core moved here, and its Python-duplicating layers
were dropped in favour of Python strumento. Drop the Strumento dependency
and map names as follows:
| Strumento.jl | Intonato 0.5 |
|---|---|
AbstractSoc, execute!, load_envelope!, play_program!, acquire, dac_rate, adc_rate |
Intonato (same names) |
QickChannelMap, QickGenChannel, pulse_to_envelopes, QickProgram, iq_to_measurements, Measurement |
Intonato (one Measurement type) |
set_gate!, get_gate, gate_snapshot, DCAxis, DCAxisMap, gate_names, axis_for |
Intonato |
MockSoc (Piccolo extension) |
Intonato.MockSoc |
twin core (DigitalTwin, drift processes, TwinRecord / load_record), TwinSoc, TwinWiringMap, TwinGenWiring, wiring_for, physics families |
Intonato.Twins |
StrumentoSoc, StrumentoDCSource (PythonCall extension) |
Base.get_extension(Intonato, :IntonatoPythonCallExt) |
BringupBridge, TwinJobServer, wire client, bring-up procedures |
removed — use Python strumento directly |
using Pkg
Pkg.add(url="https://github.com/harmoniqs/Intonato.jl")MIT — see LICENSE.