All notable changes to this project are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Hashtbl to a persistent map, so deriving a graph no longer mutates any earlier version. Graph.Weights is now Map.S instead of Hashtbl.S, and Vertex.update / Vertex.ensure now return the updated weights instead of unit.TreeSet re-implemented on top of Stdlib.Set. The hand-rolled (unbalanced) BST was replaced by an adapter over Set.Make, giving balanced-tree performance. The TSet interface is unchanged so all call sites keep working; compare-equal inserts still replace the existing element (as the old TreeSet did), which several algorithms rely on.Serialize.to_dot_string and Serialize.to_dot_channel for rendering a graph to a single dot string or straight to an out_channel, alongside the existing lazy-sequence to_dot.TreeSet, Heap, UnionFind, core Graph, the graph algorithms (SCC, clustering, flow, path, matching, spanning trees) and dot serialization.add_weight no longer accumulates duplicate bindings — re-adding an edge now replaces its weight instead of stacking entries.MakeDisjointSet.create raises a clear Invalid_argument when the element sequence is longer than the declared size, instead of a later out-of-bounds crash. The unused ResolvTbl module was removed.TreeSet no longer shadows Stdlib.Not_found, so partial operations raise the standard exception callers can catch.Heap consolidation table is now per-call, removing a functor-global mutable table that could be clobbered by concurrent consolidations.toposort now returns a valid topological (happens-before) order; it previously emitted discovery order, which could place a successor before its predecessor.astar no longer raises "value not in heap"; path entries are keyed consistently and the heap is pre-seeded, matching dijkstra's behaviour.galeshapely now produces a stable matching; the acceptor preference comparison was inverted, yielding blocking pairs. A leftover debug print was also removed.A -> B and B -> A).to_dot sequence is now re-forceable (no leaked mutable state), and empty attribute brackets / redundant node declarations are avoided.