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