Skip to content

v1.5.0 release notes

Qubex v1.5.0 is the largest update since the v1.4 line. It keeps the core QuEL-1 Experiment and Measurement workflows available for existing users, but it substantially reorganizes the lower layers around explicit system, measurement, and backend responsibilities, adds initial QuEL-3 support, removes fixed 2 ns timing assumptions from key execution paths, and introduces canonical serializable measurement models.

If you are upgrading from v1.4.8, read the v1.5.0 migration guide before updating configuration files, backend imports, or contrib-heavy notebooks.

Highlights

  • System-aware configuration is now the default model. system_id is the canonical selector for one runnable hardware setup, system.yaml defines the backend family for that setup, and wiring.yaml is keyed by the same system_id. This makes multi-system and multi-backend deployments explicit.
  • The low-level stack is now split into qubex.system, qubex.measurement, and qubex.backend. Configuration loading, schedule execution, and controller implementations are now separated more clearly for users building tooling below Experiment.
  • Initial QuEL-3 support is included. Qubex now contains QuEL-3-specific configuration loading, target deployment planning, backend execution, and sequencer tooling, together with dedicated examples and user-guide pages.
  • Measurement APIs now support async-first and sweep-first workflows. Measurement and Experiment expose run_measurement(), run_sweep_measurement(), and run_ndsweep_measurement(), and the measurement layer now includes dedicated sweep builders and executors.
  • Timing is derived from the backend instead of being assumed to be 2 ns. Key measurement and experiment paths now resolve sampling period from the active backend, which enables QuEL-3 timing and reduces hidden QuEL-1-only assumptions in analysis and scheduling code.
  • Canonical result models now support structured serialization. MeasurementResult, CaptureData, and sweep-result models are serializable DataModel objects with JSON and NetCDF4 persistence, while synchronous legacy MeasureResult compatibility remains available where needed.
  • Documentation was overhauled. The repository now ships a full English and Japanese documentation set with installation, configuration, low-level API guides, notebooks, and release-note pages.

Breaking changes

  • Python and installation baseline changed. Qubex now requires Python 3.10+. The repository and documentation for the v1.5.0 line assume a uv-managed environment, and backend dependencies are installed through the backend extra.
  • qubex.backend is no longer the catch-all namespace for system models. ConfigLoader, SystemManager, ControlSystem, ExperimentSystem, TargetRegistry, and related system-side types now live under qubex.system. The top-level backend namespace is now focused on controller contracts and concrete backend implementations.
  • system_id is now the canonical hardware selector. chip_id is kept as a compatibility input, but the new public configuration model is system_id + system.yaml + per-system parameter directories.
  • configuration_mode now resolves as a priority-ordered control layout. ge-ef-cr now means "assign GE, then EF, then CR as channels are available", and ge-cr-cr now means "assign GE, then two CR channels." Ports with fewer than three control channels keep the leftmost roles, so a two-channel port now resolves ge-ef-cr to ge-ef instead of implicitly falling back to ge-cr.
  • Several Experiment helper APIs moved out of the class and into qubex.contrib. This includes RZX helpers, multipartite entanglement helpers, CR crosstalk helpers, Stark helpers, simultaneous coherence helper workflows, and purity benchmarking helpers. The old Experiment entry points now warn and raise instead of silently delegating.
  • Deep imports into old internal pulse and simulator modules are no longer stable. Import from qubex.pulse, qubex.simulator, qubex.core, or the companion packages directly instead of importing removed internal modules such as qubex.pulse.library.* or qubex.simulator.quantum_system.

Deprecated but still supported in v1.5.0

The following paths still work in v1.5.0, but they emit warnings or are now compatibility shims. Migrate away from them when you update notebooks and scripts.

Old usage New usage
chip_id as the primary runtime selector system_id as the canonical selector
shots= n_shots=
interval= shot_interval=
Experiment.linkup() Experiment.connect()
Experiment.device_controller Experiment.backend_controller
Measurement.qubits Measurement.qubit_labels
qubex.analysis.visualization qubex.visualization
result["fig"], result["figure"] result.figure or result.get_figure()
result["figs"], result["figures"] result.figures or result.get_figure(name)
qubex.measurement.measurement_result and other legacy model modules qubex.measurement.models
qubex.experiment.result and other legacy model modules qubex.experiment.models

Known limitations

  • The async run_* measurement APIs are public, but they should still be treated as Experimental. Prefer synchronous measure(), execute(), and sweep_parameter() when long-term API stability matters more than async integration.
  • QuEL-3 support is available, but it is newer than the QuEL-1 path. Validate timing-sensitive sweeps, deployment assumptions, and backend-specific helper flows on your own hardware before broad rollout.
  • QuEL-1-specific maintenance hooks such as reset_awg_and_capunits() and SystemManager.modified_backend_settings(...) do not have a QuEL-3 equivalent. When unsupported on QuEL-3, they are accepted as compatibility no-ops instead of raising.

Upgrade guidance

When upgrading from v1.4.8, prioritize these steps:

  1. Move system/configuration imports from qubex.backend to qubex.system.
  2. Switch runtime selection from chip_id to system_id, and add system.yaml if your deployment does not already have one.
  3. Replace deprecated kwargs and properties such as shots, interval, linkup(), and device_controller.
  4. Update any contrib-heavy Experiment notebooks to call qubex.contrib functions explicitly.
  5. Remove hardcoded 2 ns timing assumptions and use backend-derived sampling period values instead.

The migration guide includes concrete before/after examples for each of these changes.