Skip to content

Releases: harmoniqs/Piccolo.jl

v1.19.0

16 Jun 04:30
e602173

Choose a tag to compare

Piccolo v1.19.0

Diff since v1.18.0

Changes

  • Reimplemented the PiccoloOptions.bound_state option (default box bounds on each
    state component), which had been inactive since November 2025.
  • Hardened BoundStateL2Constraint with input guards and view-based access.

Added

  • DualRailEncoding for dual-rail encoded systems, with subspace_transform,
    reduce_to_subspace, logical_basis_states, and target_states helpers.
  • coupling_drive — pairwise coupling drives a · u[i] · u[j] with a baked-in
    (fixed) coupling strength.
  • PiccoloOptions.bound_state_l2 and the now-exported BoundStateL2Constraint:
    nonlinear constraints bounding each complex component's magnitude
    (Re² + Im² ≤ 1) at every knot point; tighter than the box bound_state bounds.
  • rollout_with_qutip — roll a pulse out through QuTiP's solver (via the
    QuantumToolbox extension).
  • Toffoli (GATES[:CCX]) and doubly-controlled-Z (GATES[:CCZ]) gates.
  • EmbeddedOperator quality-of-life constructors.
  • Pulse evolution animations (animate_pulse) via plot_pulse! delegation,
    including a parameter-sweep animation helper.
  • Documentation: two-qubit gate synthesis tutorial and validation, a bosonic
    Wigner-function guide, and a visualization guide.

Merged pull requests:

Closed issues:

  • [unitaryDESIGN] Animation of a Pulse Evolving with Parameters (#59)
  • Add DualRailEncoding + EmbeddedOperator quality-of-life utilities (#197)
  • Add literate tutorial: 2-qubit gate synthesis with three pulse parameterizations + QuantumToolbox validation (#198)

v1.18.0

05 Jun 19:26
f11c764

Choose a tag to compare

Piccolo v1.18.0

Diff since v1.17.0

Changes

  • Fix PiccoloMakieExt precompilation failure by requiring DirectTrajOpt 0.9.5, which provides AbstractIntermediateCallback (the supertype used by the live pulse-plot callback). The previous 0.8, 0.9 bound could resolve to a version lacking that binding.
  • CubicSplinePulse now defaults both R_u and R_du to 0.0 (previously 1e-2). The old penalty biased the optimiser toward flat, small-amplitude pulses and stalled fidelity (e.g. ≈0.91 vs ≈0.98+ on a 2-qubit iSWAP). LinearSplinePulse keeps the 1e-2 default.

Added

  • extra_objectives keyword on SplinePulseProblem for composing user-supplied objective terms (e.g. Piccolissimo.HermiteBendingEnergyRegularizer) into the total objective.

Merged pull requests:

v1.17.0

28 May 00:14
96b00aa

Choose a tag to compare

Piccolo v1.17.0

Diff since v1.16.1

Changes

  • First-gate tutorial now uses the plot_pulse visualization API and constrains the solve to a uniform time grid
  • Documented local-RNG behavior in the drive validator docstrings

Added

  • LivePulsePlotCallback for live pulse plotting during solves

Merged pull requests:

Closed issues:

  • feat: BSplinePulse — convex-hull-bounded smooth pulse parameterization (#221)
  • feat(bspline): foundation — BsplineBasis module + BSplinePulse type (v2 PRD) (#224)
  • feat(bspline): SplinePulseProblem template wiring (3 overloads) + MinimumTimeProblem widening fix (v2 PRD) (#225)
  • demo(bspline): Layer 4a baseline — transmon X + fluxonium Y/T (v2 PRD) (#226)

v1.16.1

26 May 05:01
747fad3

Choose a tag to compare

Piccolo v1.16.1

Diff since v1.16.0

Changes

  • Fix: QuantumSystem construction no longer advances the global RNG. The NonlinearDrive Jacobian/Hessian validators now use a local MersenneTwister, so scripts that seed once and rely on rand/randn for control initialization remain deterministic.
  • Perf: parametric eltype on H_drives for type-stable per-substep RHS dispatch; representative multi-ket workloads see ~1.85–1.90× CPU speedup.

v1.16.0

22 May 16:19
32b91fd

Choose a tag to compare

Piccolo v1.16.0

Diff since v1.15.0

Changes

  • Internal: trajectory interface file split into trajectory_interface.jl (common accessors, name helpers, Base.summary/Base.show) and rollouts_extensions.jl (rollout, rollout!, fidelity, _update_system!). Public API unchanged.
  • Problem-template construction logs (SmoothPulseProblem, BangBangPulseProblem, SplinePulseProblem, MinimumTimeProblem, SamplingProblem) now route through the tiered PiccoloOptions.display system introduced in 1.15.0 instead of a bare verbose flag.
  • Trajectory summary pluralizes correctly for single-drive trajectories ("1 drive" instead of "1 drives").
  • Widen QuantumToolbox compat to include 0.47.

Added

  • Base.summary(::IO, ::AbstractQuantumTrajectory) for a compact one-line REPL summary, and Base.show(::IO, ::MIME"text/plain", ::AbstractQuantumTrajectory) for a multi-line plain-text view.
  • Bloch sphere and Wigner function tutorial sections and full docstrings for plot_bloch, plot_wigner, animate_bloch, and animate_wigner.

v1.15.0

15 May 21:57
bbbb4e5

Choose a tag to compare

Piccolo v1.15.0

Diff since v1.14.0

Added

  • New ProblemDisplay submodule providing a rich tree-view of QuantumControlProblems, with terminal pulse plots and sparsity inspection at the :detailed level. Overrides Base.show.
  • Tiered display::Symbol option on PiccoloOptions (:silent, :compact, :standard, :detailed) replacing the previous verbose::Bool. Default is :standard, which auto-renders the tree view after each problem constructor.
  • Exported inspect(qcp) / ProblemInspection, show_problem, pulse_lineplot, display_level, and the DISPLAY_SILENT / DISPLAY_COMPACT / DISPLAY_STANDARD / DISPLAY_DETAILED constants for programmatic access to the display layer.
  • solve! gains a verbose::Bool=false kwarg controlling solver-setup trace, decoupled from Ipopt's print_level.
  • default_algorithm(::OpenQuantumSystem) returns Tsit5()rollout(::DensityTrajectory) no longer requires an explicit algorithm kwarg.
  • New direct dependencies: UnicodePlots v3 (terminal plots for :detailed display) and Printf.
  • Test suite now includes Aqua.jl and JET.jl checks (Aqua-clean, 1 remaining JET finding upstream).
  • Contributing guide and formatter workflow.

Changes

  • ZeroOrderPulse now defaults snap_to_knots=true (pre-announced in v1.14.x). Fixes a NamedTrajectory ↔ ZeroOrderPulse round-trip bug where stored knot times (cumsum-based) differed from resample times (range-based) by O(1e-17), causing left-continuous ConstantInterpolation to return shifted-by-one values at knot boundaries. Opt out with snap_to_knots=false.
  • PiccoloOptions(verbose=...) is now deprecated via Base.depwarn but still works, mapping verbose=false → display=:silent and verbose=true → display=:standard. Passing both verbose= and display= is an error.
  • TransmonSystem now throws a clear error on unknown lab_frame_type instead of silently using an uninitialized H_drift.
  • QuantumToolbox compat widened through 0.46.
  • Fix NonlinearDrive validation over u_dim.
  • Fix :cubic rollout interpolation to use CubicHermiteSpline rather than CubicSplineInterpolation.
  • Fix pulse boundary-value handling when the boundary is given as a Symbol.
  • Fix spzeros (m,n) argument binding to avoid a SparseVector union split.
  • Several Aqua method-ambiguity and JET undefined-name cleanups across systems and trajectories.

Removed

  • Exports open_rollout and open_rollout_fidelity from Piccolo.Quantum.Dynamics — these names were exported but never defined; no working caller existed.
  • Export of plot_name! from Piccolo.Visualizations.QuantumObjectPlots — the canonical plot_name! is owned by NamedTrajectories and re-exported transparently; the local stub remains available via the qualified path for PiccoloMakieExt.

Closed issues:

  • Add literate tutorial: 2-qubit gate synthesis with three pulse parameterizations (#193)
  • Add literate tutorial: 1-qubit gate synthesis with three pulse parameterizations + QuantumToolbox validation (#199)
  • unitaryHACK 2026 — Bounty Tracking (#200)

v1.14.0

06 May 05:13
3ced97f

Choose a tag to compare

Piccolo v1.14.0

Diff since v1.13.0

Changes

  • Widen NamedTrajectories compat to 0.8, 0.9
  • UnitaryTrajectory no longer carries a G type parameter for the goal field; goal matrices are auto-converted to Matrix{ComplexF64} (EmbeddedOperator goals are passed through unchanged)
  • Fix default_algorithm method for CompositeQuantumSystem

Added

  • save_pulse / load_pulse for JLD2-based persistence of any AbstractPulse, plus a saving/loading guide in the docs
  • Optional mathematician-convention Lie algebra generators in system_utils (physicist convention remains the default)

Merged pull requests:

v1.13.0

02 May 17:13
385e5eb

Choose a tag to compare

Piccolo v1.13.0

Diff since v1.12.0

Changes

  • Compatibility with SciMLBase v3 and OrdinaryDiffEq v7, with a shim interface so existing code continues to work
  • snap_to_knots feature that ensures knot point interpolations align with optimization knot points for ConstantInterpolation pulses (ZeroOrderHold). Defaults to false to retain current behavior but will be changing to true to fix the bug.
  • Fixed initial time handling in rollouts
  • Fixed ZOH stairs direction in pulse plotting (:pre:post)
  • Visualization polish: cleaner phase-noise/IQ layout, publication-grade LaTeX labels, tighter leakage example

Added

  • Type-aware pulse plotting: plot_pulse, plot_pulse!, plot_pulse_IQ, plot_pulse_phases, with theme-awareness and demos for FunctionPulse and ErfPulse
  • High-level plot_pulse overloads for AbstractQuantumTrajectory and QuantumControlProblem
  • calibration_targets keyword threaded through SamplingProblem and the pulse problem templates
  • state_leakage_indices exposed via PiccoloOptions for ket / density / multiket problems

Closed issues:

  • Add plot recipes for pulse types (#89)
  • Bug: incorrect tspan in dynamics.jl operator integrators (#158)
  • Formatter action broken (#171)

v1.12.0

27 Apr 18:36

Choose a tag to compare

Piccolo v1.12.0

Diff since v1.11.0

Changes

  • Open-system generator assembly now evaluates drive_coeff and rate_coeff at call time, allowing dissipation rates and drive coefficients to read the extended control vector (including propagated global parameters)
  • BilinearIntegrator{DensityTrajectory} uses the new compact_generator_closure helper so NonlinearDrive and NonlinearDissipator instances correctly receive global-parameter updates during optimization
  • _reconstruct_system preserves typed dissipator instances across global-parameter updates instead of dropping them to plain matrices
  • Default extrapolation = ExtrapolationType.Constant on ZeroOrderPulse, LinearSplinePulse, and CubicSplinePulse prevents crashes when ODE integrators query slightly past trajectory endpoints
  • Template-test initializations switched from unseeded randn to deterministic smooth controls for reproducibility

Added

  • AbstractDissipator hierarchy with LinearDissipator and NonlinearDissipator variants, mirroring the typed-drive pattern
  • Coefficient API for dissipators: rate_coeff, rate_coeff_jac, rate_coeff_hess, active_controls. NonlinearDissipator supports ForwardDiff auto-differentiation or user-supplied Jacobian/Hessian closures
  • New dissipators::Vector{AbstractDissipator} field on OpenQuantumSystem, plus a dissipators= keyword on all constructors. The existing dissipation_operators= keyword is preserved and auto-wraps matrices as LinearDissipator with unit rate
  • New canonical compact_lindbladian_parts(sys) returning a 3-tuple (drift_ham, drives, dissipators) for runtime-weighted generator assembly
  • New compact_generator_closure(sys, drift_ham, drives, dissipators) helper that builds a generator closure respecting drive_coeff and rate_coeff
  • Read-only sys.dissipation_operators property shim returns Vector{SparseMatrixCSC{ComplexF64,Int}} from the typed dissipators for back-compat with pre-1.12 callers
  • Legacy compact_lindbladian_generators(sys) retained as a 2-tuple wrapper that fuses the dissipator contribution at u=0; exact for LinearDissipators, approximate for NonlinearDissipators (those callers should migrate to the 3-tuple API)

v1.11.0

23 Apr 13:44
6ec68d7

Choose a tag to compare

Piccolo v1.11.0

Diff since v1.10.0

Changes

  • sample(pulse::AbstractPulse; n_samples=100) now takes n_samples as a required positional argument: sample(pulse, n_samples).
  • Raise compat: DirectTrajOpt to 0.8, 0.9; QuantumToolbox to 0.42, 0.43, 0.44, 0.45.

Added

  • System-level pulse constructors that infer drive bounds from the system: ZeroOrderPulse(sys, T; n_samples, kwargs...), LinearSplinePulse(sys, T; ...), CubicSplinePulse(sys, T; ...).
  • Pretty-printing for AbstractPulse (Base.show / summary show drive count and duration).
  • New derivative(pulse, t) API with specialized methods for ZeroOrderPulse and LinearSplinePulse via DataInterpolations.derivative, fixing incorrect derivatives at pulse endpoints (cross-ref #113). CubicSplinePulse still falls back to ForwardDiff.
  • sample(bounds::AbstractVector{Tuple{Float64,Float64}}, n_samples) for generating random controls from per-drive bounds.