Releases: harmoniqs/Piccolo.jl
Releases · harmoniqs/Piccolo.jl
v1.19.0
Piccolo v1.19.0
Changes
- Reimplemented the
PiccoloOptions.bound_stateoption (default box bounds on each
state component), which had been inactive since November 2025. - Hardened
BoundStateL2Constraintwith input guards and view-based access.
Added
DualRailEncodingfor dual-rail encoded systems, withsubspace_transform,
reduce_to_subspace,logical_basis_states, andtarget_stateshelpers.coupling_drive— pairwise coupling drivesa · u[i] · u[j]with a baked-in
(fixed) coupling strength.PiccoloOptions.bound_state_l2and the now-exportedBoundStateL2Constraint:
nonlinear constraints bounding each complex component's magnitude
(Re² + Im² ≤ 1) at every knot point; tighter than the boxbound_statebounds.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. EmbeddedOperatorquality-of-life constructors.- Pulse evolution animations (
animate_pulse) viaplot_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:
- Reimplementing PiccoloOptions.bound_state (dead since 11/2025) + new PiccoloOptions.bound_state_l2 feature (#207) (@gennadiryan)
- docs(viz): bosonic Wigner-function guide (cherry-picks #71) (#211) (@jack-champagne)
- Add pulse animation helper (#215) (@dominyyin-sudo)
- Two qubit gate synthesis tutorial (#233) (@leespen1)
- Add DualRailEncoding + EmbeddedOperator quality-of-life utilities (closes #197) (#238) (@Oishi1029)
- feat: coupling_drive — pairwise coupling drives with baked (fixed) strength (#239) (@Rchari1)
- Add pulse evolution animations (supersedes #195) (#240) (@jack-champagne)
- Add input guards and use views in BoundStateL2Constraint (#241) (@jack-champagne)
Closed issues:
v1.18.0
Piccolo v1.18.0
Changes
- Fix
PiccoloMakieExtprecompilation failure by requiring DirectTrajOpt 0.9.5, which providesAbstractIntermediateCallback(the supertype used by the live pulse-plot callback). The previous0.8, 0.9bound could resolve to a version lacking that binding. CubicSplinePulsenow defaults bothR_uandR_duto0.0(previously1e-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).LinearSplinePulsekeeps the1e-2default.
Added
extra_objectiveskeyword onSplinePulseProblemfor composing user-supplied objective terms (e.g.Piccolissimo.HermiteBendingEnergyRegularizer) into the total objective.
Merged pull requests:
- feat(spline): zero R_u/R_du defaults for CubicSplinePulse (#214) (@aarontrowbridge)
- fix: require DirectTrajOpt 0.9.5, bump to 1.18.0 (#234) (@jack-champagne)
v1.17.0
Piccolo v1.17.0
Changes
- First-gate tutorial now uses the
plot_pulsevisualization API and constrains the solve to a uniform time grid - Documented local-RNG behavior in the drive validator docstrings
Added
LivePulsePlotCallbackfor live pulse plotting during solves
Merged pull requests:
- fix(trajectories): auto-select ODE problem form by algorithm class (#216) (@aarontrowbridge)
- feat(viz): LivePulsePlotCallback for live pulse plotting during solves (#219) (@jack-champagne)
- docs(drives): note local-RNG behavior in validator docstrings (#222) (@jack-champagne)
- docs(first-gate): use plot_pulse API for control visualization (#227) (@jack-champagne)
- chore: bump version to 1.17.0 (#228) (@jack-champagne)
- docs(first-gate): constrain timesteps equal + cache solve (#229) (@jack-champagne)
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
Piccolo v1.16.1
Changes
- Fix:
QuantumSystemconstruction no longer advances the global RNG. TheNonlinearDriveJacobian/Hessian validators now use a localMersenneTwister, so scripts that seed once and rely onrand/randnfor control initialization remain deterministic. - Perf: parametric eltype on
H_drivesfor type-stable per-substep RHS dispatch; representative multi-ket workloads see ~1.85–1.90× CPU speedup.
v1.16.0
Piccolo v1.16.0
Changes
- Internal: trajectory interface file split into
trajectory_interface.jl(common accessors, name helpers,Base.summary/Base.show) androllouts_extensions.jl(rollout,rollout!,fidelity,_update_system!). Public API unchanged. - Problem-template construction logs (
SmoothPulseProblem,BangBangPulseProblem,SplinePulseProblem,MinimumTimeProblem,SamplingProblem) now route through the tieredPiccoloOptions.displaysystem introduced in 1.15.0 instead of a bareverboseflag. - Trajectory summary pluralizes correctly for single-drive trajectories (
"1 drive"instead of"1 drives"). - Widen
QuantumToolboxcompat to include0.47.
Added
Base.summary(::IO, ::AbstractQuantumTrajectory)for a compact one-line REPL summary, andBase.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, andanimate_wigner.
v1.15.0
Piccolo v1.15.0
Added
- New
ProblemDisplaysubmodule providing a rich tree-view ofQuantumControlProblems, with terminal pulse plots and sparsity inspection at the:detailedlevel. OverridesBase.show. - Tiered
display::Symboloption onPiccoloOptions(:silent,:compact,:standard,:detailed) replacing the previousverbose::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 theDISPLAY_SILENT/DISPLAY_COMPACT/DISPLAY_STANDARD/DISPLAY_DETAILEDconstants for programmatic access to the display layer. solve!gains averbose::Bool=falsekwarg controlling solver-setup trace, decoupled from Ipopt'sprint_level.default_algorithm(::OpenQuantumSystem)returnsTsit5()—rollout(::DensityTrajectory)no longer requires an explicitalgorithmkwarg.- New direct dependencies:
UnicodePlotsv3 (terminal plots for:detaileddisplay) andPrintf. - Test suite now includes
Aqua.jlandJET.jlchecks (Aqua-clean, 1 remaining JET finding upstream). - Contributing guide and formatter workflow.
Changes
ZeroOrderPulsenow defaultssnap_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-continuousConstantInterpolationto return shifted-by-one values at knot boundaries. Opt out withsnap_to_knots=false.PiccoloOptions(verbose=...)is now deprecated viaBase.depwarnbut still works, mappingverbose=false → display=:silentandverbose=true → display=:standard. Passing bothverbose=anddisplay=is an error.TransmonSystemnow throws a clear error on unknownlab_frame_typeinstead of silently using an uninitializedH_drift.- QuantumToolbox compat widened through 0.46.
- Fix
NonlinearDrivevalidation overu_dim. - Fix
:cubicrollout interpolation to useCubicHermiteSplinerather thanCubicSplineInterpolation. - Fix pulse boundary-value handling when the boundary is given as a
Symbol. - Fix
spzeros(m,n)argument binding to avoid aSparseVectorunion split. - Several Aqua method-ambiguity and JET undefined-name cleanups across
systemsandtrajectories.
Removed
- Exports
open_rolloutandopen_rollout_fidelityfromPiccolo.Quantum.Dynamics— these names were exported but never defined; no working caller existed. - Export of
plot_name!fromPiccolo.Visualizations.QuantumObjectPlots— the canonicalplot_name!is owned byNamedTrajectoriesand re-exported transparently; the local stub remains available via the qualified path forPiccoloMakieExt.
Closed issues:
v1.14.0
Piccolo v1.14.0
Changes
- Widen
NamedTrajectoriescompat to0.8, 0.9 UnitaryTrajectoryno longer carries aGtype parameter for the goal field; goal matrices are auto-converted toMatrix{ComplexF64}(EmbeddedOperatorgoals are passed through unchanged)- Fix
default_algorithmmethod forCompositeQuantumSystem
Added
save_pulse/load_pulsefor JLD2-based persistence of anyAbstractPulse, 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:
- docs: add saving and loading pulses guide (#81) (@aarontrowbridge)
- fix(trajectories): default_algorithm method for CompositeQuantumSystem (#176) (@aarontrowbridge)
- Fixes to replace PR101 (potentially breaking) (#179) (@gennadiryan)
- Support for antihermitian algebra generators, tests (#188) (@gennadiryan)
- Release v1.14.0 (#191) (@jack-champagne)
v1.13.0
Piccolo v1.13.0
Changes
- Compatibility with SciMLBase v3 and OrdinaryDiffEq v7, with a shim interface so existing code continues to work
snap_to_knotsfeature that ensures knot point interpolations align with optimization knot points for ConstantInterpolation pulses (ZeroOrderHold). Defaults tofalseto 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 forFunctionPulseandErfPulse - High-level
plot_pulseoverloads forAbstractQuantumTrajectoryandQuantumControlProblem calibration_targetskeyword threaded throughSamplingProblemand the pulse problem templatesstate_leakage_indicesexposed viaPiccoloOptionsfor ket / density / multiket problems
Closed issues:
v1.12.0
Piccolo v1.12.0
Changes
- Open-system generator assembly now evaluates
drive_coeffandrate_coeffat call time, allowing dissipation rates and drive coefficients to read the extended control vector (including propagated global parameters) BilinearIntegrator{DensityTrajectory}uses the newcompact_generator_closurehelper soNonlinearDriveandNonlinearDissipatorinstances correctly receive global-parameter updates during optimization_reconstruct_systempreserves typed dissipator instances across global-parameter updates instead of dropping them to plain matrices- Default
extrapolation = ExtrapolationType.ConstantonZeroOrderPulse,LinearSplinePulse, andCubicSplinePulseprevents crashes when ODE integrators query slightly past trajectory endpoints - Template-test initializations switched from unseeded
randnto deterministic smooth controls for reproducibility
Added
AbstractDissipatorhierarchy withLinearDissipatorandNonlinearDissipatorvariants, mirroring the typed-drive pattern- Coefficient API for dissipators:
rate_coeff,rate_coeff_jac,rate_coeff_hess,active_controls.NonlinearDissipatorsupports ForwardDiff auto-differentiation or user-supplied Jacobian/Hessian closures - New
dissipators::Vector{AbstractDissipator}field onOpenQuantumSystem, plus adissipators=keyword on all constructors. The existingdissipation_operators=keyword is preserved and auto-wraps matrices asLinearDissipatorwith 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 respectingdrive_coeffandrate_coeff - Read-only
sys.dissipation_operatorsproperty shim returnsVector{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 atu=0; exact forLinearDissipators, approximate forNonlinearDissipators (those callers should migrate to the 3-tuple API)
v1.11.0
Piccolo v1.11.0
Changes
sample(pulse::AbstractPulse; n_samples=100)now takesn_samplesas a required positional argument:sample(pulse, n_samples).- Raise compat:
DirectTrajOptto0.8, 0.9;QuantumToolboxto0.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/summaryshow drive count and duration). - New
derivative(pulse, t)API with specialized methods forZeroOrderPulseandLinearSplinePulseviaDataInterpolations.derivative, fixing incorrect derivatives at pulse endpoints (cross-ref #113).CubicSplinePulsestill falls back toForwardDiff. sample(bounds::AbstractVector{Tuple{Float64,Float64}}, n_samples)for generating random controls from per-drive bounds.