- (breaking) Simulation, network, protocol, and visualization traces now use
Julia's standard logging macros with stable
eventsymbols and structured metadata. Rendered messages have changed, and routine low-level simulation and protocol control-flow records now useDebugseverity in theLOG_GROUPS.protocolgroup. The@simlogmacro and both non-publictimestrmethods were removed immediately; usesimulation_log_contextorProtocolZoo.protocol_log_contextwith@debug,@warn, or@error. - Additional visualization methods for states of registers.
- (fix)
observablenow locally composes separately factorized states, and pure Clifford states accept dense QuantumOptics observables. - Package logs expose stable, filterable domain groups through
LOG_GROUPS. - Dense observables on pure Clifford states now warn before converting the entire stabilizer state to an exponentially sized ket, with the default logger showing the warning once per session. Mixed stabilizer states fail early with guidance to use representation-native Pauli observables.
- (fix)
QuantumMCReprslots now store pure trajectories in an internalMCKetwrapper, so background evolution selects Kraus sampling through structural dispatch.ConstantHamiltonianEvolutionpreserves the wrapper through Schrödinger or Monte Carlo wave-function evolution. Lindblad-only background updates now also preserve it through Monte Carlo wave-function evolution with a zero Hamiltonian. Partial trace now samples the discarded subsystem's canonical basis and preserves the conditional trajectory as anMCKet; its ensemble equals the exact partial trace. Groupedtraceout!calls that delete every slot of a shared state skip backend reduction and RNG sampling entirely.stateref.state[]exposes the wrapper, andStateRefdisplays identify its implementation module asQuantumSavory. permits_virtual_edgenow accepts protocol types as well as instances, so introspection code can query the capability without constructing protocols.- (fix) Make the
graph_builderexamples independent of the arbitrary order of equal-cardinality matchings. - (breaking) Named tag heads now subtype the exported
AbstractTagmarker. Custom types passed toEntanglerProt(...; tag=MyTag)orEntanglementConsumer(...; tag=MyTag)must be concrete and migrate tostruct MyTag <: AbstractTag end. The entangler acceptsnothing, while the consumer requires a named tag type. GenericTag(DataType, ...)construction and querying remain unrestricted. RegisterNetnow accepts(src, dst) -> delaycallables forclassical_delayandquantum_delay, enabling per-link and asymmetric transport delays while retaining scalar delay support.
- (breaking) (fix) The
ProtocolZooentanglement-tracking tags and messages now carry entanglement pair IDs, fixing a class of bookkeeping bugs (#303) where stale update messages could be applied to the wrong Bell pair after a physical slot was reused. See the porting guide below. - (fix)
EntanglementTrackerno longer waits on the physical slot lock when an incoming update only needsEntanglementHistorymetadata of an empty slot, fixing a race (#448) where valid in-flight updates were dropped as stale because history forwarding was serialized behind slot reuse by anEntanglerProt. SwapperProtgained amax_history_per_slotoption andCutoffProtgained amax_delete_per_slotoption, enforcing FIFO caps on accumulatedEntanglementHistoryandEntanglementDeletemetadata.CutoffProtno longer deletes oldEntanglementHistorytags itself; history cleanup is now owned by the swapper that creates those tags.- Stale update/delete messages dropped by
EntanglementTrackerare now logged at@warnlevel instead of@error, as with pair IDs such drops are expected only under benign circumstances (e.g. history garbage collection).
User code that creates, queries, or destructures the ProtocolZoo entanglement tags needs the following updates. The new ID fields are of type EntanglementID (an alias for Int), with NO_ENTANGLEMENT_ID == 0 reserved as the neutral/legacy value; fresh IDs are created with fresh_entanglement_id() and swap composition uses combine_entanglement_ids(a, b).
The tag schemas changed as follows (new fields in bold):
| Tag | Old schema | New schema |
|---|---|---|
EntanglementCounterpart |
(remote_node, remote_slot) |
(remote_node, remote_slot, pair_id) |
EntanglementHistory |
(remote_node, remote_slot, swap_remote_node, swap_remote_slot, swapped_local) |
(remote_node, remote_slot, swap_remote_node, swap_remote_slot, swapped_local, local_chunk_id, swapped_chunk_id) |
EntanglementUpdateX / EntanglementUpdateZ |
(past_local_node, past_local_slot, past_remote_slot, new_remote_node, new_remote_slot, correction) |
(target_pair_id, other_pair_id, past_local_node, past_local_slot, past_remote_slot, new_remote_node, new_remote_slot, correction) |
EntanglementDelete |
(send_node, send_slot, rec_node, rec_slot) |
(target_pair_id, send_node, send_slot, rec_node, rec_slot) |
Required changes, in decreasing order of likelihood that they affect you:
- Queries must use the new arity. A query with the old number of fields silently matches nothing — it does not error. Add a wildcard for the new field(s), e.g.
query(reg, EntanglementCounterpart, node, ❓)→query(reg, EntanglementCounterpart, node, ❓, ❓)queryall(reg, EntanglementHistory, ❓, ❓, ❓, ❓, ❓)→queryall(reg, EntanglementHistory, ❓, ❓, ❓, ❓, ❓, ❓, ❓)querydelete!(mb, EntanglementUpdateX, ❓, ❓, ❓, ❓, ❓, ❓)→querydelete!(mb, EntanglementUpdateX, ❓, ❓, ❓, ❓, ❓, ❓, ❓, ❓)
- Raw
tag!andTagcalls must include the new fields.tag!(slot, EntanglementCounterpart, node, slot_idx)still runs, but creates an old-arity tag that is invisible to all queries and protocols in this release. Writetag!(slot, EntanglementCounterpart, node, slot_idx, pair_id)instead, wherepair_idcomes fromfresh_entanglement_id()for a new pair (use the same ID on both ends of the pair), orNO_ENTANGLEMENT_IDfor metadata that does not participate in ID-based tracking. - Positional destructuring of update/delete messages must shift indices. The two ID fields are prepended to
EntanglementUpdateX/EntanglementUpdateZand one ID field is prepended toEntanglementDelete, so e.g.tag[2](formerlypast_local_node/send_node) is nowtag[4]/tag[3].EntanglementCounterpartandEntanglementHistoryare extended at the end, so existing indices keep working there. - The struct constructors are backward compatible.
EntanglementCounterpart(node, slot),EntanglementHistory(a, b, c, d, e),EntanglementUpdateX(a, b, c, d, e, f), andEntanglementDelete(a, b, c, d)still work and fill the new fields withNO_ENTANGLEMENT_ID. Note however that protocols match counterpart tags by exact pair ID, so hand-constructedNO_ENTANGLEMENT_IDmetadata only interoperates with other legacy-ID metadata. - Reciprocal tags must agree on the pair ID.
EntanglementConsumer(and the switch protocols) now require the two ends of a pair to carry the samepair_idin their reciprocalEntanglementCounterparttags, not just matching(node, slot)routing info. If you create entangled pairs manually in tests or examples, tag both ends with the same ID. - Custom tag types are unaffected.
EntanglerProt(...; tag=MyTag)keeps writing the legacy two-fieldMyTag(remote_node, remote_slot)schema, andEntanglementConsumer(...; tag=MyTag)keeps querying it with the legacy arity. OnlyEntanglementCounterpartcarries a pair ID.
- (fix) Solving edge cases of deadlocks when simultaneously tagging and waiting on tags.
- Significant performance improvements to queries on registers or buffers that already contain many tags.
- New QTCP tutorial examples under
examples/qtcp_tutorial/demonstrating basic usage on a chain, GLMakie visualization, multi-flow on a grid topology, and custom endpoint controllers.
- (breaking) Some fields of EntanglerProt were renamed for consistency with other protocols. More such renaming is to be expected, for consistency's sake.
- (breaking) The
StatesZoonow integrates with theGenqo.jlpackage, to provide high accuracy models of the ZALM entanglement source. The previous implementation of the ZALM source was removed. - (breaking) Renaming
wait(::MessageBuffer)andonchange_tag(::Register)toonchange. - (fix)
observableused to incorrectly handle subsystem permutations on some backends in some edge cases, giving wrong results. - (fix) Stale
EntanglementDeletemessages inEntanglementTrackerare now dropped as a workaround for protocol bookkeeping issue #303. - (fix) Tensor products of operators are now better supported in
apply!forCliffordRepr - Querying functions now also return the time at which a tag was tagged.
query_waitnow exists as a much simpler alternative toonchangefollowed byquery.GraphStateConstructorprotocol and related tooling for modeling of the iterative construction of a graph state out of Bell pairs.- Protocol constructors moving to having constructors that do not require
simto be explicitly specified. - Noise types now have default parameters, for ease of construction in examples. The default values generally correspond to near-zero noise (e.g. decoherence time of
1e9). - Protocols (subtypes of
AbstractProtocolin theProtocolZoo) now have richshowmethods for theimage/pngandtext/htmlMIME types - Unexported function
permits_virtual_edgeto describe whether a protocol can run between two nodes that are not directly connected. - Non-public functions
parent,parentindex,name,namestr,timestr,compactstr,available_protocol_types,available_slot_types,available_background_types,constructor_metadatafor better introspection capabilities and cleaner printing. T1T2noise has been added.- Support for Gaussian states, unitaries, and channels through
GabsRepras the default for QModes. HomodyneMeasurementhas been added for Gaussian-state measurements.- New assisted continuous-variable teleportation example.
- New piecemaker GHZ-switch example.
DepolarizedBellPairadded toStatesZoo, representing a depolarized Bell statep|Φ⁺⟩⟨Φ⁺| + (1-p)I/4, constructible from either the depolarization parameterpor fidelityF.
- Add
classical_delayandquantum_delayas keyword arguments to theRegisterNetconstructor to set a default global network edge latency. onchange_tagnow permits a protocol to wait for any change to the tag metadata.- Plots of networks can now overlay real-world maps (see
generate_map). - A "state explorer" tool was added to the plotting submodule and as an interactive example, to heal visualize many of the states in StatesZoo.
- Additional filtering and decision capabilities in
EntanglerProt. - Fixes and additions to available background noise processes.
- Rebuilding the ZALM source from StatesZoo in a more reproducible fashion.
- Fixes and performance improvements to
observable. - New examples related to preparing GHZ states and MBQC-based purification.
- The switch protocol is now back to fully functional, thanks to an upstream fix in GraphsMatching.jl.
- Develop
CutoffProtto deal with deadlocks in a simulation - Expand
SwapperProtwithagelimitto permit cutoff policies (withCutoffProt) - Tutorial and interactive examples for entanglement distribution on a grid with local-only knowledge
- (breaking)
observablenow takes a default value as a kwarg, i.e., you need to make the substitutionobservable(regs, obs, 0.0; time)↦observable(regs, obs; something=0.0, time) - Bump QuantumSymbolics and QuantumOpticsBase compat bound and bump julia compat to 1.10.
- Implement a simple switch protocol.
- Simplify one of the switch protocols to avoid dependence on GraphsMatching.jl. which does not install well on non-linux systems. Do not rely on the default
SimpleSwitchDiscreteProtfor the time being.
- Simplify one of the switch protocols to avoid dependence on GraphsMatching.jl. which does not install well on non-linux systems. Do not rely on the default
- Incorrect breaking release. It should have been 0.5 (see above).
- Significant improvements to the performance of
query.
- Establishing
ProtocolZoo,CircuitZoo, andStateZoo - Establishing
Register,RegRef, andRegisterNet - Establishing the symbolic expression capabilities
- Establishing plotting and visualization capabilities