All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Added missing
<stdexcept>include for MSVC compatibility
- Windows AMD64 wheel builds in release workflow
- Windows test coverage in CI
- Relicensed from BSD-3-Clause to MIT
- Parallelized sensitivity analysis across candidate edges using
std::async; thread count controlled byNGRAPH_CORE_SENSITIVITY_THREADSenv or hardware concurrency - Thread-local profiling stats to remove global mutex from the hot
record()path; public API unchanged
- License: Relicensed from GPL-3.0-or-later to BSD-3-Clause.
- License: Relicensed from AGPL-3.0 to GPL-3.0.
- Build: Add Linux ARM64 (aarch64) wheel builds using native GitHub ARM runners in the release workflow.
- Python 3.14: Add support for Python 3.14 in CI tests, wheel builds, and packaging.
- Free Threading: Declare free-threading compatibility (
py::mod_gil_not_used) for Python 3.13t/3.14t builds. Build and publish free-threaded (cp314t) wheels.
- CI: Upgrade cibuildwheel from v2 to v3.3.1 for Python 3.14 wheel builds.
- Python Bindings: Fix object leak on Python 3.14 caused by pybind11 not clearing managed dicts during deallocation. Replace
dynamic_attr+_graph_refpattern withpy::keep_alivefor FlowState, FlowGraph, and FlowPolicy.
- Python Bindings: Fix build failure with pybind11 3.x typed tuples by adding explicit
-> py::tuplereturn type on thespflambda.
- CI: Add CentOS Stream 9 build and test jobs.
- K-Shortest Paths: Fix off-by-one in Yen's prefix comparison and PredDAG CSR fill order. Paths visiting nodes out of numerical order (e.g.,
[0,3,2]) previously produced malformed predecessor DAGs.
- Build: Simplified version handling.
- License: Replaced incomplete AGPLv3 LICENSE file with complete official text from GNU.
- Profiling: Fix ODR violation that caused empty stats when profiling was enabled. Moved
profiling_enabled()andProfilingStats::instance()definitions from inline header toprofiling.cppto ensure a single instance when static library is linked into the Python module.
- Profiling: Runtime profiling infrastructure for C++ hot paths (
shortest_paths_core,place_demand,place_on_dag).- Enable via
NGRAPH_CORE_PROFILE=1environment variable. - Python API:
profiling_enabled(),profiling_dump(),profiling_reset(). - Minimal overhead when disabled (single static bool check per instrumented scope).
- ~2% overhead when enabled.
- Enable via
- Build: Default optimizations: LTO, loop unrolling,
-fno-math-errno. Addmake install-nativefor CPU-specific builds.
- BREAKING: Minimum Python version raised to 3.11 (was 3.9)
- Python bindings:
StrictMultiDiGraph.from_arraysnow requiresext_edge_idsso callers always supply stable external edge identifiers. - FlowPolicy: construction is now config-only (via
FlowPolicyConfig), dropping the parameter-heavy constructor.
- FlowGraph:
get_flow_pathnow filters only below-kEpsilonnoise so paths are reconstructed even when per-edge allocations are smaller thankMinFlow.
- Flow Placement: EqualBalanced placement now correctly returns 0 when the shortest path has no capacity with
require_capacity=False. Previously, flow could be incorrectly reported on partial paths that didn't reach the destination.
- Shortest Paths: In single-path mode, ties between equal-cost paths are now broken by preferring higher bottleneck capacity. Improves flow placement when multiple equal-cost paths exist with different capacities.
- Flow Placement: Use epsilon threshold in
place_on_dag()to fix placement of very small flow fractions in large fanout networks.
- Build: Use
uvbuild frontend for wheel builds. - Build: Drop 32-bit Linux (i686) wheels.
- Sensitivity Analysis: Added
shortest_pathparameter tosensitivity_analysis().shortest_path=False(default): Uses full max-flow; reports all saturated edges across all cost tiers.shortest_path=True: Uses single-tier shortest-path flow; reports only edges used under ECMP routing.
- Python type stub documentation for
Algorithms.sensitivity_analysis().
- Core Library: Initial release of C++ implementation for graph algorithms and flow tracking.
- Graph Structures:
StrictMultiDiGraph: Immutable directed multigraph using CSR (Compressed Sparse Row) adjacency.FlowGraph: Manages flow state, per-flow edge allocations, and residual capacities.
- Algorithms:
- Shortest paths (Dijkstra variant returning a DAG for ECMP; supports node/edge masking and residual-aware tie-breaking).
- K-Shortest paths (Yen's algorithm).
- Max-flow (Successive Shortest Path with ECMP/WCMP placement; supports capacity-aware (TE) and cost-only (IP) routing modes).
- Sensitivity analysis (identifies bottlenecks).
- Flow Policy:
- Modeling: Unified configuration for IP routing (cost-based ECMP) and Traffic Engineering (capacity-aware TE).
- Placement:
Proportional(WCMP) andEqualBalanced(ECMP) strategies. - Lifecycle: Manages demand placement, static/dynamic path selection, and re-optimization.
- Constraints: Enforces limits on path cost, stretch factor, and flow counts.
- Python Bindings:
- Python 3.9+ support via pybind11.
- NumPy integration using zero-copy views where applicable.
- Releases GIL during long-running graph algorithms.
- Testing:
- Python and C++ test suites.