Qrisp 0.9#
A redesigned backend interface anchors Qrisp 0.9, alongside the Quantum Singular Value Transform (QSVT) at the heart of a new suite of BlockEncoding transformations, including the new FOQCS-LCU (Fast One-Qubit-Controlled Select Linear Combination of Unitaries) block encoding method and Dalzell’s optimal Quantum Linear System Solver. Complementing these core advancements are a full circuit optimization pass manager, and new state preparation primitives. Richer QuantumArray arithmetic and meaningful upgrades to arithmetic subroutines, including a new Gidney adder based on venting carries via mid-circuit measurements, round things out.
QSVT and Singular Value Transformations#
With Qrisp 0.9, the Quantum Singular Value Transform (QSVT) framework (PR #607) is now available as the primary tool for matrix inversion and singular value processing to operators that aren’t necessarily Hermitian. The BlockEncoding class gains the following new methods:
svt(PR #607): Applies a polynomial to the singular values of a block-encoded operator, supporting both even and odd parity polynomials in either the Chebyshev or Polynomial basis.pseudo_inv(PR #607): Using Quantum Singular Value Transform, this function returns a block encoding that approximates the threshold pseudoinverse by ignoring singular values below a specific limit to regularize ill-conditioned linear systems.invnow uses QSVT by default (PR #607), succeeding the previous QET approach which was limited to Hermitian operators. Amethodkeyword lets you switch between QSVT, GQSVT, or QET (Quantum Eigenvalue Transform) as needed.dagger(PR #607): Returns the adjoint of a block-encoded operator.
The BlockEncoding class gains the following new constructors:
from_eye(PR #479): Constructs a BlockEncoding of a 2-D array with ones on a specified diagonal and zeros elsewhere. A positivediagonal_indexselects an upper subdiagonal, a negative value a lower subdiagonal, and 0 (the default) the main diagonal.from_projector(PR #479): Constructs a BlockEncoding of the projector \(|\phi\rangle\langle\psi|\), or, whenkernel=True, of the kernel projector \(\mathbb{I} - |\phi\rangle\langle\phi|\). Both left and right states may be specified as integers (computational basis states) or as arbitrary state-preparation callables.from_foqcs_lcu_operator(PR #597): Constructs a BlockEncoding from aQubitOperatorusing the Fast One-Qubit-Controlled Select LCU (FOQCS-LCU) algorithm. The operator is analyzed automatically and the appropriate PREP subroutine — Heisenberg or spin-glass — is selected. Supported operators include arbitrary one-body fields and same-axis two-body couplings of the form \(P_i P_j\) with \(P \in \{X, Y, Z\}\).from_foqcs_lcu_prep: (PR #597): Experimental FOQCS-LCU constructor for users who supply their own right and left PREP subroutines (\(P_R\) and \(P_L\)), enabling custom FOQCS-LCU block encodings beyond the built-in Heisenberg and spin-glass models.from_lcu(PR #647): now supports general complex coefficients (previously, only real non-negative coefficients were supported).QSVTandGQSVT(introduced in PR #607 and PR #479) perform (Generalized) Quantum Singular Value Transform for fixed parity real or complex polynomials, respectively.
Two further standalone functions round out the qrisp.gqsp module
(PR #479):
dalzell_inversion, Qrisp’s implementation of
the Dalzell Quantum Linear System Solver via QSVT-based kernel reflection, and
pseudo_inversion
(PR #479):
for QSVT-based threshold pseudoinversion
(also reachable as BlockEncoding.pseudo_inv).
Backend Interface Redesign#
The backend interface has been redesigned from the ground up for a cleaner, more modular abstraction (PR #331 and its follow-ups). The new Backend class provides a consistent interface for both simulators and hardware backends, abstracting away the differences and allowing users to switch between them seamlessly.
Improved error handling: The backend interface now includes more robust error handling and clearer error messages, making it easier to diagnose and fix issues when running circuits.
New abstract
Backendclass: The new base abstraction for all backends, offeringrun_async(circuits, shots)for an immediateJob(Future-style) alongside a synchronousrun(circuits, shots)wrapper for convenience, plusbatched()to obtain aBatchedBackendandretrieve_job(job_id)to look up a previously submitted job.BackendLikeprotocol: A structural typing protocol that bothBackendandBatchedBackendsatisfy, so type hints stay flexible.Jobclass: Tracks the lifecycle of a single execution withsubmit(),result(),cancel(), andstatus().BatchedBackendreworked: Does not inherit fromBackend. Circuits queued viarun()are executed oncedispatch()is called.batched_measurementis deprecated in favor ofget_measurement()with aBatchedBackenddirectly.Backend migrations:
DefaultBackendis nowQrispSimulatorBackend.QiskitBackend,QiskitRuntimeBackend,AQTBackend, andIQMBackendhave all been brought up to the new API.VirtualBackendis kept as a deprecated drop-in subclass.A leaner core: The old
BackendClient/BackendServer(qunicorn) network infrastructure and the Docker-based backends have been removed entirely.
Circuit Optimization Pass Manager#
Qrisp 0.9 ships a complete circuit optimization pass management system
(PR #564).
PassManager keeps an ordered list of
CircuitPass instances, runs them via
.run(qc), and verifies correctness with .verify(qc). Built-in passes handle
canceling adjacent gate-inverse pairs, fusing consecutive single-qubit gates,
commuting and resolving SWAP networks, removing barriers, reverse-parallelization,
manual qubit layout, gate basis conversion (to CX/CZ/PRY), decomposition,
Gray-synth Toffoli synthesis, canceling zero-controlled gates, arranging SWAPs for
smarter routing, and visualizing optimization culprits.
Additional Updates#
BlockEncoding refactored (PR #628):
Rebuilt around a Base Class + Facade pattern.
The old monolith is now split across block_encoding_base.py (abstract base),
block_encoding.py (facade), constructors/, and transformations/, making
extensions easier.
COLD improvements (PR #614):
The DCQOProblem class gets a smoother
scheduling function, automatic g/g_deriv computation, a precision parameter
for expectation-value accuracy, and exp_value_backend for hardware-based optimization.
Dicke state and unbalanced W state (PR #572):
New dicke_state and
unbalanced_w_state deterministic state preparation routines,
based on the algorithm in arXiv:1904.07358.
QuantumArray upgrades (PR #519):
In-place arithmetic (iadd, isub, imul),
element-wise logical operations (and, or, xor), and reductions via
all() / any().
Gidney carry-venting adder (PR #537):
New gidney_cq_venting_adder implements
the classical-quantum in-place adder from arXiv:2507.23079.
Instead of propagating carries through the full register, each carry is measured in the
X-basis (“vented”) as soon as it is no longer needed, reducing space-overhead from
\(\mathcal{O}(n)\) to \(\mathcal{O}(1)\). A split-half design uses the
target register itself as dirty workspace, keeping the total qubit overhead to
just 3 clean ancillae. The adder requires dynamic (JASP) mode and supports
c_in, c_out, and zero-overhead control
via the custom_control decorator.
Arithmetic enhancements: Gidney adder refactored
(PR #473) with c_in/c_out
support; Cuccaro adder gains matching c_in/c_out interface
(PR #615);
BigInteger Montgomery arithmetic fixes and rebuilt QuantumModulus constructor
(PR #495).
Typing module (PR #543):
New qrisp.typing module with
QubitLike, ClbitLike, FloatLike,
ScalarLike, NDArrayLike, and ArrayLike.
Other improvements: QuantumCircuit class refactored
(PR #461,
#486,
#489,
#526);
Polished reflection (PR #627),
amplitude_amplification (PR #588),
QAE (PR #589),
and grovers_alg (PR #587) functions;
MLIR / xDSL dialect
(PR #465);
StableHLO lowering (PR #577);
composite gate interpreter (PR #593);
BoundQubitTerm/BoundQubitOperator removed
(PR #559);
QubitOperator._to_pauli_dict() and zero-multiplication fix
(PR #612);
MaxCut module refactored (PR #542);
benchmarking callback threshold (PR #505);
depth metric negative slicing (PR #451);
controlled-U3 compilation fixes (PR #551);
Catalyst 0.15 compatibility (PR #568).
Compatibility#
Backend API breaking change:
Backendis now the base abstraction for all backends.VirtualBackendstill works, but only as a deprecated drop-in subclass.DefaultBackendis nowQrispSimulatorBackend.batched_measurementis deprecated in favor ofBatchedBackend.dispatch().BoundQubitTermandBoundQubitOperatorremoved; useQubitTerm/QubitOperatorinstead.The old
qunicorn-basedBackendClient/BackendServernetwork infrastructure and the Docker-based backends have been removed.New
convert_to_cirqandconvert_from_cirqfunctions for bidirectional Qrisp-Cirq conversion (PR #610).jrangestepargument removed (PR #652): Passing three arguments tojrangenow raises aTypeError. Use a step-1 loop and multiply the loop variable by the desired step.