Releases: TeamGraphix/graphqomb
Release list
v0.4.1
Added
- Stim Clifford Parser: Added
graphqomb.stim_parserfor normalizing Stim Clifford circuits to the CliffordJ/CZbasis:H = J(0),HS = J(pi/2)(StimC_XNYZ),HZ = J(pi)(StimSQRT_Y), andHS_DAG = J(-pi/2)(StimC_XYZ), corresponding to X+/Y+/X-/Y- measurements. The parser covers fixed one- and two-qubit Clifford gates,SPP/SPP_DAG, nested repeats,R/RX/RYandM/MX/MYboundaries, preserved record/annotation instructions, and detailed rejection of unsupported instructions. Optimization canonicalizes every single-qubit gate run to its shortest word over the fourJgates (at most three per single-qubit Clifford), cancels redundantCZpairs, and folds gates at those Pauli reset and measurement boundaries.
Changed
- Stim Circuit Import: Normalize reset/unitary TICK blocks through the new Stim parser before circuit analysis, folding leading Clifford gates into Pauli input initialization, expanding accepted Clifford gates, and removing identity blocks such as repeated CZ pairs without advancing their temporal coordinate.
v0.4.0
Added
- QEC Stim MPP Import: Added utilities for building
StabilizerCodeinputs from unsigned StimMPPlayers, including sparse Stim qubit id mapping, coordinate import, multi-layer selection, detector/logical-observable import, and the optionalgraphqomb[stim]extra. Signed products using inverted Pauli targets are rejected because stabilizer signs are not retained. - Stim Circuit Import: Added
stim_file_to_pattern(),stim_text_to_pattern(), andstim_circuit_to_pattern()for converting supported Stim circuits into GraphQOMB patterns. The importer handles initial Pauli resets (R/RZ,RX, andRY), Clifford unitary blocks, andTICK-separated Pauli measurements (M/MZ,MX,MY,MXX,MYY,MZZ, andMPP), assigns single-qubit measurement bases directly to their graph nodes, terminates each qubit lifetime at its direct measurement while allowing disjoint qubits to continue, validates that same-block MPP products commute, supports Type I and Type II Y foliation, keeps MPP ancilla nodes out of the X-correction flow, derives the complete Z-correction flow from the composed data flow without Pauli simplification, places gate and MPP blocks on explicit temporal Z layers while preserving the first two Stim coordinate components, aligns parallel gate outputs across different transpiled depths, relocates idle I/O nodes without adding graph nodes or edges, and resolves detector/logical-observable records once across the full flattened circuit. Circuit-level noise and measurement-error probabilities are intentionally omitted because GraphQOMB uses an MBQC-specific noise model; mid-circuit reset, measurement-reset, and feedback instructions remain unsupported. - Input Initialization Bases: Added per-input positive Pauli eigenstate initialization via
GraphState.register_input(..., init_axis=...), withX+,Y+, andZ+propagated throughqompile(),Pattern,PatternSimulator, and Stim export.
Changed
- Development Tooling: Use uv as the default dependency manager for local development, CI, documentation builds, and publishing workflows.
- Graph State API: Replaced legacy
physical_*graph methods/properties with standard graph-stylenodes,edges,add_node(),add_edge(),remove_node(),remove_edge(), and count/query helpers. - Pattern Simulator: Materialize pending output Pauli-frame corrections when returning output statevectors or explicit output measurement results.
- Pattern Simulator: Sample all measurements from exact Born probabilities by default, with
calc_prob=Falseretaining the legacy 50/50 assumption for non-output measurements. - PTN Format: Bumped exported
.ptnfiles to format version 2 to record non-default input initialization bases with.input_basis; version 1 files remain readable and default inputs toX+. - Stim Compiler: Input reset instructions now follow the stored initialization basis (
RX,RY, orR) while non-input preparations remainRX. - Stim Coordinate Import: Reject
QUBIT_COORDSwhose first two components collide across qubits, because graph nodes are placed by the XY projection and colliding projections produce coincident nodes.
Fixed
- Pattern Simulator: Raise
TypeErrorfor unsupported commands instead of recursively redispatching them. - QEC Graph-State Builder: Add the required ancilla CZ edge when shared data qubits contain an odd number of oppositely ordered stabilizer-interaction pairs, using the same
Z-before-Y-before-Xrule for Type I and Type II foliation. - Stim Circuit Import: Preserve the existing data-lane endpoint and its coordinate when importing a terminal single-qubit measurement.
- Stim Circuit Import Coordinates: Generate consistent 3D spacetime coordinates across gate, idle, and MPP fragments instead of mixing raw 2D gate coordinates with MPP Z layers.
- Stim Compiler: Preserve minus-signed axis measurement bases using inverted Stim measurement targets.
- State Vector Array Conversion: Convert to a real NumPy dtype without warnings when every amplitude is real-valued, and reject the conversion when it would discard nonzero imaginary amplitudes.
Removed
- Pattern Commands: Removed explicit
graphqomb.command.Xandgraphqomb.command.Zcorrection commands. Output corrections are now represented byPauliFrameonly, and.ptnfiles containingX/Zcommand lines are rejected.
v0.3.1
Added
- PTN Format: Human-readable text format (
.ptn) for pattern serializationptn_format.dumps()/ptn_format.dump(): Serialize patterns to textptn_format.loads()/ptn_format.load(): Deserialize patterns from text- Format separates quantum instructions and classical feedforward processing
- Timeslice markers
[n]indicate parallel execution groups - Pauli measurements use compact notation (
X +,Y -,Z +) - Non-Pauli measurements use plane+angle format (
XY pi/4) - Support for node coordinates, logical observables, and inline comments
- Non-Unitary Parity Projection Example: Added
examples/nonunitary_parity_projection.pydemonstrating measurement-induced entanglement via a 3-node star graph parity projector
Fixed
- Qompiler:
qompile()now validates a provided scheduler before pattern generation, so invalid manual schedules fail early withValueError.
v0.3.0
Added
-
Noise Model Module: Added
graphqomb.noise_modelfor event-driven noise injection during Stim compilation- Added
NoiseModelhooks foron_prepare,on_entangle,on_measure, andon_idle - Added frozen, validated
NoiseOpdataclasses:PauliChannel1,PauliChannel2,HeraldedPauliChannel1,HeraldedErase,RawStimOp,MeasurementFlip - Added event dataclasses
PrepareEvent,EntangleEvent,MeasureEvent,IdleEvent, plusNodeInfoandCoordinate - Added
NoisePlacement,noise_op_to_stim(),depolarize1_probs(), anddepolarize2_probs()
- Added
-
Built-in Noise Models: Ready-to-use noise model implementations
- Added
DepolarizingNoiseModelfor single and two-qubit depolarizing noise - Added
MeasurementFlipNoiseModelfor measurement bit-flip errors using Stim's built-inMX(p)syntax
- Added
-
Stim Compiler Noise Integration: Added noise-model-driven Stim compilation
- Support for multiple noise models via
Sequence[NoiseModel] - Added
tick_durationparameter for idle noise calculations - Automatic measurement record tracking for heralded noise operations when emitting detectors and observables
- Support for multiple noise models via
-
Greedy Scheduler: Fast greedy scheduling algorithms as an alternative to CP-SAT optimization
- Added
greedy_minimize_time()for minimal execution time scheduling with ALAP preparation optimization - Added
greedy_minimize_space()for minimal qubit usage scheduling
- Added
-
Schedule Solver: Added constraint that every non-input, non-output node must be prepared strictly before it is measured (
node2prep[node] < node2meas[node]) -
Circuit Conversion: Added circuit-derived pre-scheduling support in
circuit2graph().- Added
CircuitScheduleStrategywithPARALLELandMINIMIZE_SPACE. - Added
schedule_strategyargument tocircuit2graph(). circuit2graph()now returns(graph, gflow, scheduler)and pre-populatesSchedulervia manual scheduling.
- Added
-
PyZX Integration: Added optional
graphqomb.zx_utilutilities for importing strict graph-like PyZX diagrams intoGraphState.- Added
from_pyzx()to convert PyZX diagrams into aGraphState. - Added boundary rewriting and metadata import helpers to preserve graph structure, measurement bases, and coordinates during conversion.
- Added optional phase-gadget recognition for supported lone-
Zgadget patterns viarecognize_pg=True, importing the adjacent node as aYZ-plane measurement.
- Added
-
Documentation: Added comprehensive Sphinx documentation for the noise model module
Changed
- Stim Compiler API:
stim_compile()now has signaturestim_compile(pattern, *, emit_qubit_coords=True, noise_models=None, tick_duration=1.0) - Stim Compiler: Refactored internal structure to support event-driven noise model integration
- Measurement Flip Semantics:
MeasurementFlipNoiseModeland customMeasurementFlipops now compile to Stim's nativeMX(p)/MY(p)/MZ(p)instructions instead of emitting separate Pauli error instructions - Noise Extension API:
NoiseOpvalues are now represented as plain frozen dataclasses collected under theNoiseOpunion, improving type safety for customNoiseModelimplementations - Noise Validation: Centralized noise parameter validation in
noise_modelNoiseOpdataclasses now validate and normalize their inputs at construction timeDepolarizingNoiseModelandMeasurementFlipNoiseModelnow reject invalid probabilities when instantiatedMeasurementFlipis now enforced as a measurement-only noise operation during Stim compilation
- Graph State: Made
meas_basesread-only by returningMappingProxyTypeto avoid external mutation. - Graph State: Added caching for
physical_nodessnapshots and proper cache invalidation on node add/remove. - Docs/Examples: Updated circuit conversion usage in README and
examples/pattern_from_circuit.pyfor the newcircuit2graph()return signature. - Packaging/Docs: Added the optional
graphqomb[pyzx]extra, documented PyZX installation in the README, and published Sphinx API reference pages forgraphqomb.zx_util. - CI: Split PyZX-marked tests into a dedicated GitHub Actions job and installed the optional dependency in coverage runs.
Fixed
- Stim Compiler: Detector and observable record indices now stay aligned when noise models emit heralded instructions that add measurement records
- Feedforward: Fixed operator precedence bug in
dag_from_flowwhere self-loops were only removed fromzflowbut not fromxflow. The expressionxflow | zflow - {node}was evaluated asxflow | (zflow - {node})due to-binding tighter than|. Corrected to(xflow | zflow) - {node}.
Tests
- Noise Model / Stim Compiler: Added comprehensive tests for
graphqomb.noise_modeland noise-awarestim_compile(), including heralded record tracking,MeasurementFlipvalidation, and removed legacy kwargs - Greedy Scheduler: Added tests for greedy scheduling algorithms
- Schedule Solver: Added integration test verifying that CP-SAT MINIMIZE_SPACE strategy enforces node preparation before measurement
- Circuit Conversion: Expanded scheduling tests in
tests/test_circuit.py, including scheduler return contract, J/CZ/phase-gadget timing behavior, schedule validation, andMINIMIZE_SPACEbehavior. - Integration: Added circuit-level integration tests for
signal_shifting()andpauli_simplification()with circuit-vs-pattern statevector equivalence checks. - Stim Compiler / Pauli Frame: Updated tests to explicitly pass parity-check groups where logical-observable and cache initialization paths are exercised.
- PyZX Integration: Added unit tests for vertex/edge collection, boundary rewrites, lone-spider phase-gadget recognition, and end-to-end
from_pyzx()conversion behavior.
Removed
- Stim Compiler Legacy Noise Args: Removed
p_depol_after_cliffordandp_before_meas_flipfromstim_compile()- Use
noise_models=[DepolarizingNoiseModel(...), MeasurementFlipNoiseModel(...)]instead
- Use
v0.2.1
Added
- Type Hints: Added
py.typedmarker for PEP 561 compliance, enabling type checkers (mypy, pyright) to recognize the package as typed when installed from PyPI.
Changed
- Python Support: Dropped Python 3.9 support, added Python 3.14 support. Now requires Python >=3.10, <3.15.
v0.2.0
Added
-
TICK Command: Time slice boundary marker for temporal scheduling in MBQC patterns
- Added TICK command type to mark boundaries between time slices
- Integrated TICK command handling in PatternSimulator
- Integrated TICK command processing in Stim compiler
-
Edge Scheduler: Automatic entanglement operation scheduling based on node preparation times (#99)
- Added
entangle_timeattribute to Scheduler for tracking entanglement operation timing - Added
auto_schedule_entanglement()method to automatically schedule CZ gates when both nodes are prepared - Extended the
timelineproperty to include entanglement operations - Added entanglement time validation in schedule validation
- Added
compress_schedule()function to support entanglement time compression
- Added
-
Pattern: Added the
depthattribute intoPattern, which represents the depth of parallel execution. -
Pattern: Added pattern resource/throughput metrics (
active_volume,volume,idle_times,throughput). -
Scheduler Integration: Enhanced qompile() to support temporal scheduling with TICK commands
- Added
schedulerparameter to qompile() for custom scheduling - Automatically inserts TICK commands between time slices
- Added
-
Examples: Added entanglement_scheduling_demo.py demonstrating edge scheduler features
-
Feedforward Optimization: Added a
signal_shiftingmethod as a feedforward optimization.- This optimization is equivalent to the operation of the same name in the measurement calculus, and makes the measurement pattern as parallel as possible.
- The optimization is now self-contained within the feedforward module.
-
Feedforward Optimization: Added
pauli_simplification()to remove redundant Pauli corrections in correction maps when measuring in Pauli bases.
Changed
- Pattern: Updated command sequence generation to support TICK commands
- Command: Extended Command type alias to include TICK
- The default strategy of
Scheduler.solve_scheduleis nowMINIMIZE_TIMEinstead ofMINIMIZE_SPACEfor the compilation performance.
Fixed
- Scheduler: Accept
entangle_timeedges in either order inScheduler.manual_schedule().
Tests
- Stim Compiler: Add coverage that manual
entangle_timedetermines CZ time slices in both Pattern and Stim output.
v0.1.2
Added
- Graph State: Bulk initialization methods for GraphState (#120)
- Added
from_graph()class method for direct graph-based initialization - Added
from_base_graph_state()class method for initialization from base GraphState objects - Improved initialization flexibility for diverse use cases
- Added
Performance
- Pauli Frame: Optimized
_collect_dependent_chainmethod with memoization and caching- Added Pauli axis cache to avoid redundant basis computations
- Implemented chain memoization cache to prevent recalculating dependent chains
- Optimized set operations for better performance in large graph states
Tests
- Pauli Frame: Added comprehensive test suite for PauliFrame module
- Added tests for basic methods (x_flip, z_flip, meas_flip, children, parents)
- Added tests for Pauli axis cache initialization and chain cache memoization
- Added tests for dependent chain collection across X, Y, Z measurement axes
- Added tests for detector groups and logical observables
- Improved test coverage from 77.78% to 97% for pauli_frame.py
- Graph State: Added comprehensive test suite for bulk initialization methods
- Added tests for
from_graph()initialization - Added tests for
from_base_graph_state()initialization - Added tests for graph consistency and state equivalence
- Added tests for
v0.1.1
Added
- Stim Compiler: Pattern to Stim circuit compiler with detector and observable support for fault-tolerant quantum computing (#67)
- Compile MBQC patterns into Stim format for error correction analysis
- Support for detectors, observables, and error models
- Configurable depolarization noise after Clifford gates and measurements
Changed
- Pauli Frame: Extended with detector and syndrome analysis capabilities
- Added
detector_groupsfor detector grouping - Added
syndrome_parity_groupfor syndrome extraction - Added parity check grouping for X and Z corrections
- Added
Fixed
- Fixed inverse flow construction to avoid self-loops
- Fixed type hints in
graphstate.composefor better type safety
v0.1.0
Added
- Core Infrastructure: Initial repository setup with project structure, build system, and CI/CD workflows (#12)
- Mathematical Foundations: Euler angle computations for quantum operations (#24)
- Graph State: Graph state representation and manipulation (#34)
- Pattern Module: MBQC pattern data structures and operations (#47)
- Feedforward System: Feedforward strategy design and implementation for adaptive measurements (#40)
- Command Module: Measurement command definitions (#43)
- Qompiler: Pattern compiler with Pauli frame implementation (#55)
- Scheduler: Prepare time and measurement time scheduling for efficient execution (#74)
- Circuit Framework: Quantum gate definitions and circuit representation (#73)
- Simulation Backend: Statevector simulator backend for quantum state evolution (#62)
- Pattern and Circuit Simulation: Complete simulation support for both patterns and circuits (#78)
- Visualization: Basic visualizer for graph states and patterns (#83)
- Documentation: Comprehensive documentation on Read the Docs (https://graphqomb.readthedocs.io/)