Skip to content

Release Notes - Latest Stable Version

Stable Release 26.10.0

Release date 29.10.2026

Requires: LabOne 26.10

Supports: Applications Library 26.10.0

DSL

  • Functionality DeviceSetup.add_connections() now lets a SignalConnection's entire ports spec be a single, already-defined logical signal (given as its uid/path string or a LogicalSignal object), resolving to the raw port(s) that signal is already connected to. This makes it easy to multiplex an additional signal onto an existing port without repeating its raw port ID by hand.
  • Functionality Added a cache for dispatching of quantum operations, which results in noticeably faster build times for experiments that call many quantum operations. For example, a randomized benchmarking sequence constructed from quantum operations builds up to 1.8 times faster, and a batch of OpenQASM programs about 1.2 times faster.
  • Bug Fix Fixed a bug where DeviceSetup silently swapped I and Q for HDAWG and UHFQA IQ signal connections whose ports list the Q channel before the I channel. Such connections are now rejected.
  • Bug Fix Fixed a bug where building DSL sections on worker threads failed with AttributeError: '_thread._local' object has no attribute 'active_contexts'. This affected experiment construction parallelized across threads, where each worker opens a section with an explicit uid and the main thread assembles the finished sections into the experiment.
  • Bug Fix Fixed a bug where type checkers rejected imports such as from laboneq.dsl.enums import AveragingMode. The public names of laboneq.dsl.enums are now declared in __all__.
  • Bug Fix Fixed a bug where super-Gaussian pulses from pulse_library.gaussian (order greater than 2) with zero_boundaries=True did not taper to zero at the boundary. They now reach zero one sample before the pulse starts, as order-2 Gaussians do. As a result of this fix, samples change by a fraction of a percent of the amplitude, so amplitudes for such pulses may need recalibration.
  • Removal Removed the deprecated instrument_list section of the device setup descriptor and the corresponding instrument_list argument of DeviceSetup.from_dicts(). Use instruments instead; the contents are unchanged. A descriptor that only has instrument_list now fails with 'instruments' section is mandatory in the setup descriptor.
  • Removal The QPU.measure_section_length method has been removed. The functionality has been moved to the implementations of QuantumOperations for qubit types where this property is meaningful.
  • Removal The QuantumElement.load and QuantumElement.save methods have been removed after deprecation in version 2.43.0. Instead use save(q, filename) and load(filename) from laboneq.serializers.
  • Removal The user_defined attribute in TransmonParameters has been removed after deprecation in version 2.58.0. Use the custom attribute from the QuantumParameters parent class instead. Quantum elements and quantum parameters serialized earlier still load; their user_defined entries are moved into custom.
  • Removal Removed the Results.device_calibration, Results.experiment_calibration and Results.signal_map properties, which were deprecated in version 2.52.0. Use Results.device_setup.get_calibration(), Results.experiment.get_calibration() and Results.experiment.get_signal_map() instead.
  • Removal Removed the pulse_library.sampled_pulse_real and pulse_library.sampled_pulse_complex functions, which were deprecated in version 2.51.0. Use pulse_library.sampled_pulse instead; it accepts both real and complex samples.

OpenQASM

  • Functionality LabOne Q now parses OpenQASM 3 programs with a built-in faster parser. It accepts language versions 3.0 to 3.2 and rejects a construct newer than the version a program declares. The environment variable LABONEQ_OPENQASM_PARSER can be set to explicitly choose a parser - possible values are builtin and openpulse. Note: LabOne Q installed from the public source code in GitHub does not have the built-in parser - only the wheel installed from PyPI has it.
  • Bug Fix Fixed a bug where OpenQASMTranspiler.section() added the program's quantum operations to an enclosing DSL context, such as exp.section(), leading to duplicated sections or dropped operations (e.g., delays).

Compiler

  • Functionality The QCCS resource usage report logged at compile time now lists, for each near-time step, only the AWGs whose program changes in that step, so its rows add up to the reported total. It no longer repeats every AWG in every step.
  • Bug Fix Fixed a bug where an HDAWG program with too many distinct waveforms would silently produce misaligned output. LabOne Q now detects this and raises a resource-limitation error. This limitation is also taken into account when automatic chunking is enabled.
  • Bug Fix Fixed a bug where sections that span signals with different sample rates were padded to the sequencer grid: mixing HDAWG and UHFQA signals in one section inserted gaps of up to 13.3 ns between pulses and stretched the section to match. Timings in existing experiments may shift accordingly. Sections containing acquisitions, triggers or sweeps, or with on_system_grid=True, are unaffected.
  • Bug Fix Fixed a bug where a swept amplitude or swept increment_oscillator_phase was applied twice per sweep step on a compressible pulse. The sweep then drifted away from the requested values, and the tail of each pulse played at the wrong amplitude or phase. This affects amplitude and increment_oscillator_phase sweeps on the HDAWG, and increment_oscillator_phase sweeps on the SHFSG.
  • Bug Fix Fixed a bug where specifying a local oscillator on an unsupported channel type was silently ignored. This now raises a compiler error.
  • Bug Fix Fixed a bug where an experiment with a match on a near-time sweep parameter failed to compile when the cases used different near-time sweep parameters.
  • Bug Fix Fixed a bug where a near-time step that returns to an earlier real-time program ran the previous step's program instead, e.g., in an outer near-time sweep around an inner one.
  • Bug Fix Fixed CompiledExperiment.estimated_runtime for near-time sweeps.
  • Bug Fix Fixed a bug where a delay between readout pulse and acquisition was silently dropped on SHFQA and SHFQC when several qubits share a readout channel but only some of them are measured.
  • Removal Removed deprecated methods CompiledExperiment.replace_pulse and CompiledExperiment.replace_phase_increment. Instead, modify the experiment by putting the new pulse and/or phase increment in there and recompile the experiment. NOTE: the methods RuntimeContext.replace_pulse and RuntimeContext.replace_phase_increment are preserved and can still be used to apply replacements in NT callbacks (these methods leave the compiled experiment unchanged).
  • Removal Removed deprecated properties: CompiledExperiment.src, CompiledExperiment.waves, CompiledExperiment.recipe, CompiledExperiment.wave_indices, CompiledExperiment.command_tables, and CompiledExperiment.schedule. They exposed internal compiler output that user code should not rely on. For debugging or learning purposes, the same information is still available through CompiledExperiment.scheduled_experiment and its artifacts, which are internal and may change in any release.
  • Removal Removed support for arbitrary Python objects as pulse parameter values and near-time callback arguments.

    Such values have always been incompatible with serialization (such as saving the experiment to a file), however they were allowed otherwise - the compiler pickled them internally to carry them to the pulse sampler or near-time callback that consumes them, and the pickled bytes never left the Python process.

    They are now rejected always with a LabOneQException, when the experiment is compiled. The set of supported value types therefore no longer depends on whether the experiment gets serialized, and the compiler no longer pickles anything.

    The supported value types for pulse_parameters and for the arguments of Experiment.call are:

    • int, float, complex, str, bytes, bool, None, SweepParameter or LinearSweepParameter
    • lists of the above
    • dictionaries of the above with str keys

    The lists and dictionaries may be nested and need not have homogeneous value types. A sweep parameter, however, must be the pulse parameter or callback argument value itself: nested inside a list or dictionary it is not resolved, and reaches the pulse sampler or near-time callback as the sweep parameter object rather than the value of the current sweep step.

    Note that JSON-like data is already covered: nested lists and str-keyed dictionaries of the types above can be passed as is. To pass a value of any other type, convert it to a supported one:

    • NumPy arrays: pass array.tolist(), or array.tobytes() and rebuild the array with numpy.frombuffer, which preserves the dtype exactly and stays compact for long arrays.
    • Anything else (a set, a datetime, an instance of your own class, ...): serialize the value to bytes yourself and deserialize it inside the pulse sampler or near-time callback that consumes it.
  • Removal Removed the deprecated HDAWG_FORCE_COMMAND_TABLE, SHFSG_FORCE_COMMAND_TABLE, SHFQA_MIN_PLAYWAVE_HINT and SHFQA_MIN_PLAYZERO_HINT compiler settings. The options had no effect and therefore have no replacement functionality.

  • Removal Removed the deprecated CompiledExperiment.experiment_dict attribute. It has been deprecated since version 2.14.0 and was always None for a freshly compiled experiment. Use CompiledExperiment.experiment instead.

Controller

  • Functionality When a Session is connected to a LabOne Q controller service (i.e., the DeviceSetup carries the reserved controller-service server entry), run() now serves the session's registered near-time callbacks from the client process instead of rejecting them.
  • Bug Fix Fixed a bug where acquiring outside a chunked sweep on QCCS raised an error; such results now come from the last chunk.
  • Bug Fix Fixed a bug where the PQSC failed to connect to an instrument that has no signals defined. Such an instrument is now ignored, and no connection to it is attempted.
  • Documentation Fixed stale documentation links to zhinst-toolkit that pointed to removed docs.zhinst.com resources.
  • Deprecation RuntimeContext.get_results() is deprecated and will be removed in a future release. Use copy.deepcopy(runtime_context.results) in near-time callbacks instead.
  • Removal The use_async_api argument of Session.connect has been removed after deprecation in version 2.52.0. It has had no effect since then.
  • Removal Near-time callbacks can no longer read experiment, experiment_calibration, signal_map, device_setup, device_calibration or connection_state from the RuntimeContext they receive as their first argument. These properties were deprecated in version 26.4.0. Pass the values a callback needs as arguments to exp.call(), or access the experiment and device setup directly where you define the callback. Use RuntimeContext.emulated in place of connection_state.emulated.

Serializer

  • Bug Fix Fixed a bug where JSON serialization of CompiledExperiment failed when using OutputRoute with an undefined phase_shift.
  • Bug Fix Fixed a bug where CompiledExperiment serialization failed with ModuleNotFoundError: No module named 'xarray' when the optional xarray dependency is not installed.
  • Removal CompiledExperiment now holds the compiler's output bytes and builds its .scheduled_experiment view from them on first access. As a result, the scheduled_experiment constructor argument of CompiledExperiment was removed; obtain a CompiledExperiment by compiling an experiment. Compiled experiments serialized with LabOne Q 26.7 or earlier can no longer be loaded, not even with the force deserialization option.

    The deprecated laboneq.dsl.serialization.Serializer now delegates to laboneq.serializers for compiled experiments, so it reads and writes the same format.

  • Removal Removed serialization support for xarray.DataArray and xarray.Dataset objects, which existed only in the deprecated legacy serializer. AcquiredResult.to_xarray() and AcquiredResults.to_xarray() are unaffected.

  • Removal Custom serializers that call laboneq.serializers.core.import_cls() must now pass both base_cls and prefix_restrictions. Omitting either was deprecated in version 26.4.0 and now raises a TypeError. The serialization tutorial shows how to pass them.

Analysis

  • Removal Removed laboneq.analysis.calculate_integration_kernels, which was deprecated in version 2.26.0. Use calculate_integration_kernels_thresholds instead. It returns the same kernels together with the state discrimination thresholds, as a tuple (kernels, thresholds).

Contrib

  • Removal Removed empty package laboneq.contrib.example_helpers.descriptors.
  • Removal Removed the laboneq.contrib.example_helpers.data_analysis package, which was deprecated in version 2.15. Use laboneq.analysis.fitting instead.

Tutorials

  • Bug Fix Fixed a bug where one of the single-qubit Clifford gates would never be part of the randomly generated Clifford gate sequence returned by generate_play_rb_pulses in the randomized benchmarking tutorial notebook.

Installation and Imports

  • Functionality LabOne Q now declares a zqcs extra that installs the correct version of the ZQCS backend package.
  • Functionality Improved laboneq.simple import time by changing some eager package imports to lazy ones.
  • Bug Fix Fixed a bug where two installed distributions providing the same backend would either register the backend twice or report a confusing missing-module warning. LabOne Q now fails to import, naming both distributions so you can uninstall the obsolete one.

Applications Library

  • Functionality Added the ac_stark_vs_power experiment workflow and its analysis workflow (laboneq_applications.contrib.experiments.ac_stark_shift_vs_power and laboneq_applications.contrib.analysis.ac_stark_shift_vs_power). In this experiment, qubit spectroscopy is performed while the amplitude of an off-resonant qubit drive is varied, which causes a shift in the qubit frequency. By fitting the relationship between the frequency shift and the amplitude, we can determine the qubit frequency with greater precision.
  • Functionality The single-qubit randomized benchmarking experiment no longer routes its Clifford sequences through OpenQASM. Parsing the OpenQASM text back was the largest cost of building the experiment, and dropping it makes create_experiment about ten times faster. The experiment_workflow interface and the pulses it produces are unchanged; inside it, create_sq_rb_qasm is now generate_clifford_sequences and returns the gates themselves, create_experiment takes them as clifford_sequences, and add_qasm_operations and get_gate_map are gone, the latter because generate_clifford_sequences now applies the default gate map itself.
  • Functionality Experiments now accept a single quantum element in a list, such as [q0], together with a 1D array of sweep points, as they do for a bare q0. Previously, a list of quantum elements required one row of sweep points per element, such as [[...]], even for a list of one.
  • Functionality Breaking change: The power and voltage range quantum element parameters now default to None instead of a fixed value. These ranges are instrument specific, so the library no longer imposes a default: when a parameter is None, the range configured on the instrument is used.
  • Functionality Added a coupled-transmon demo platform, laboneq_applications.contrib.qpu_types.demo_platform_coupled_transmons, which builds tunable transmon qubits connected in a chain by tunable couplers, including the QPU topology edges required by the coupler-mediated two-qubit gates and experiments.
  • Functionality Added a two-qubit interleaved randomized benchmarking workflow (two_qubit_coupler_irb), in laboneq_applications.contrib.experiments.two_qubit.two_qubit_irb with its analysis workflow in laboneq_applications.contrib.analysis.two_qubit.two_qubit_irb.
  • Functionality Added the coupler_flux_range parameter to TunableCouplerParameters, which controls the output range for the flux control line.
  • Functionality TunableTransmonOperations now has the operation flux_pulse, which plays a pulse on the qubit flux line. The pulse parameters come from the new qubit parameter flux_pulse, a constant pulse by default.
  • Functionality Added the qubit_spectroscopy_qflux experiment workflow and its analysis workflow (laboneq_applications.contrib.experiments.qubit_spectroscopy_qflux and laboneq_applications.contrib.analysis.qubit_spectroscopy_qflux), which sweep the qubit drive frequency against the amplitude of a flux pulse applied to the qubit flux line, in order to map out the flux dependence of the qubit transition frequency.
  • Functionality Added the resonator_spectroscopy_amplitude_qflux experiment workflow (laboneq_applications.contrib.experiments.resonator_spectroscopy_amplitude_qflux), which sweeps the readout frequency against the amplitude of a flux pulse applied to the qubit flux line. The workflow accepts multiple qubits, which are swept in parallel. Since the experiment sweeps the frequency of the hardware oscillator of the readout line, parallel execution is only possible for qubits whose measure lines use distinct QA channels.
  • Functionality Added the update_qpu_edges task, which updates the parameters of QPU topology edges. It behaves like update_qpu, but accepts the edge keys as strings of the form "tag:source_node_uid:target_node_uid" instead of tuples, so that analysis tasks can return edge parameters in a form the logbook stores can serialize.
  • Functionality Added a qubit-driven flavor to the tunable-coupler CZ gate: CzParameters gained an optional control_pulse describing a parametric flux drive on the qubit, and TunableCouplerOperations gained the iswap and discharge_coupler quantum operations, with the accompanying IswapParameters.
  • Functionality Added the chevron, JAZZ and phase-correction calibration workflows for the qubit-driven CZ gate, in laboneq_applications.contrib.experiments.two_qubit and laboneq_applications.contrib.analysis.two_qubit.
  • Functionality The resonator spectroscopy experiment workflows (resonator_spectroscopy and resonator_spectroscopy_amplitude) now accept multiple qubits, whose readout frequencies are swept in parallel. Since these experiments sweep the frequency of the hardware oscillator of the readout line, parallel execution is only possible for qubits whose measure lines use distinct QA channels. The workflows raise a clear error when two of the requested qubits share a QA channel. The former qubit argument of these workflows (and of the resonator spectroscopy analysis workflow) is deprecated: it still works and raises a FutureWarning; use qubits instead.
  • Bug Fix Fixed a bug where TunableCoupler and BosonicQubit always applied a 0 Hz local oscillator and PortMode.LF to their flux / swap_drive lines, which the compiler now rejects on baseband channels. Breaking change: For a line driven by an SG channel, set the new flux_on_sg_channel / swap_drive_on_sg_channel parameter to True; leave it False for a line on a baseband channel.
  • Bug Fix Fixed a bug where the measurement QNDness experiment workflow led to an error when do_analysis was set to False.
  • Bug Fix Fixed a bug where the name for the signal propagation delay experiment workflow was unspecified.
  • Bug Fix Fixed a bug where the resonator photons time-resolved contrib experiment incorrectly used qubits instead of validated qubits in the create_experiment task.
  • Bug Fix Fixed a bug where the TWPA calibrate_cancellation experiment selected the wrong readout local oscillator frequency. The readout local oscillator frequency is now set based on the pump frequency.
  • Bug Fix Fixed a bug where the set_readout_amplitude quantum operation of the tunable transmons marked the whole experiment calibration, instead of the calibration of the measure line, when guarding against being called twice on the same signal. As a result, setting the readout amplitude of a second qubit in the same experiment raised a RuntimeError. The guard is now per measure line, so the readout amplitude of several qubits can be set in one experiment.
  • Documentation Added a new page Deployment to the user manual explaining our recommended way to work with the Applications Library repository.
  • Documentation Fixed mistakes and inconsistencies in experiment docstring code examples.
  • Documentation Updated the Qiskit VQE example notebook to remove the usage of the deprecated method CompiledExperiment.replace_pulse, and to demonstrate a more explicit parameter update process.
  • Documentation Added a how-to guide on CZ Gate Calibration with Tunable Couplers.
  • Documentation Improved the Memory Spectroscopy how-to guide and added five how-to guides for bosonic qubit experiments: Displacement Calibration, Selective Transmon Rx Calibration, SWAP Calibration, Wigner Tomography, and SNAP Calibration.
  • Deprecation The validation and conversion functions in laboneq_applications.core.validation have been deprecated. Use laboneq_applications.conversion instead.
  • Deprecation The Applications Library is now developed and released together with LabOne Q, and its version always matches the LabOne Q version. Its release notes are part of the LabOne Q release notes. The laboneq-applications repository on GitHub receives its source code and its release notes with each release, and installing the package with pip install laboneq-applications is unchanged. The branches of that repository now follow those of the LabOne Q repository: releases go to main, and patch releases to release-X.Y branches such as release-26.10. It no longer gets release-X.Y.X branches or a branch for each beta release.

General

  • Functionality Added support for Python 3.15.
  • Deprecation Getting the laboneq package version via laboneq._version.get_version has been deprecated and will be removed in the future. Use laboneq.__version__ instead.
  • Deprecation Support for Python 3.10 is deprecated and will be removed in the stable release v27.01. Please upgrade to Python 3.11 or later.

Known Issues

  • Running Gen1 experiments can produce controller warnings indicating RT start conditions on follower devices are not fulfilled (e.g., UHFQA:dev2801: AWG 0 didn't start after 5s); experiments may still execute correctly, but affected Gen1 experiments may take ~20%+ longer due to the additional wait/retry behavior. We are working on a fix and will release it as a patch to 26.1.0 as soon as it is available.
  • Using the reset_signal_oscillator_phase() on signals of type rf_signal is currently not supported.
  • Using OpenQASMTranspiler.batch_experiment with QASM programs that contain native measurement operations will lead to an unexpected shape of the returned data. To ensure the correct shape, measurement operations should be removed from the OpenQASM program, and .batch_experiment should be called with the option field add_measurement=True, which will add the measurement operations to the LabOne Q Experiment during the import step (see our tutorial for more details).
  • Using the internal scope to acquire raw traces on multiple channels of an SHFQA in a single experiment is only possible if the timing of all acquisitions is equal between instrument channels.
  • Using runtime checks of the sequencer playback through the disable_runtime_checks=False argument of session.connect(), is currently not possible when the experiment contains real-time feedback or is using the on-device PRNG. In the latter case, unintended error messages may be produced if the option is used.
  • When using the pipeliner in an experiment by specifying a chunk_count parameter in a sweep, the number of acquire commands in each chunk currently needs to be equal. Typically, this means that the number of sweep steps within each chunk has to be the same.
  • When using OutputSimulator or pulse sheet viewer with an experiment using the pipeliner or near-time sweeping, currently only the first sequence step will be displayed.
  • When delaying logical signal lines of type rf_signal via the delay_signal calibration property, all rf_signals on the same sequencer core must be set to the same delay.
  • When delaying logical signal lines on the SHFQA via the delay_signal calibration property, the delays for the measure and acquire line must be the same; the measure pulse delay is not added to the acquire pulse delay as on the UHFQA. We recommend to use port_delay for now.
  • When creating a section with very short content (below the device's minimum waveform length), the compiler may fail to map the experiment to valid SeqC, and will generate an error. As a workaround in these cases, manually add delays to the sequence.

Pre-Release versions

Previous versions