All notable changes to this project are documented in this file.

v1.3.0 (2026-05-17)

Enhancements

  • HypergraphSVG.to_svg/2 — improved force-directed layout with better handling of large hyperedges and more compact spacing; added title option for SVGs
  • MultiwayGraphSVG.to_svg/2 — fit-to-width layout — when the :width option is provided, the graph's horizontal positions are now scaled so the layout fills exactly the requested width. Previously the :width option only set the canvas size without adjusting node positions.

v1.2.0 (2026-05-17)

New features

  • Analytics.estimate_ricci_scalar/1 — estimates the Ricci scalar curvature $R$ of a hypergraph from the geodesic ball growth correction: $V(r) \approx C_d\, r^d (1 - R\, r^2 / (6(d+2)))$. A linear regression of $\Delta(r) = \log V(r) - d \log r$ against $r^2$ gives the slope $-R/(6(d+2))$, from which $R$ is recovered. Positive values indicate sphere-like (positive) curvature; negative values indicate hyperbolic-like (negative) curvature; values near zero indicate flat Euclidean geometry. Returns nil for graphs with fewer than 6 vertices.
  • wolfram_model.livemd — interactive Livebook notebook covering Wolfram Physics theory, all major module features, and geometry examples (dimension estimation, Ricci curvature across flat/sphere/evolved hypergraphs).

v1.1.0 (2026-05-15)

New features

  • WolframModel.HypergraphSVG — SVG rendering of a hypergraph state using a force-directed spring layout. Unary edges render as dashed rings, binary edges as directed arrows, and N-ary edges as translucent coloured polygons. evolution_to_svg/2 produces a horizontal strip of panels, one per generation snapshot.
  • WolframModel.MultiwayGraphSVG — hierarchical (BFS-level) layout of the multiway DAG returned by multiway_explore_dag/2. Nodes are labelled with vertex count, edge count, and generation; the root is highlighted; edges are drawn as cubic Bézier curves.
  • WolframModel.BranchialGraphSVG — circular layout of the branchial graph returned by branchial_graph/1. Nodes are coloured by rule name with a rule-name legend; conflict edges are drawn dashed.
  • WolframModel.GeodesicPlotSVG — dual-panel SVG line chart showing geodesic ball growth: a linear V(r) vs r panel and a log-log panel with a best-fit slope labelled d≈… giving the estimated spatial dimension. Uses the same hypergraph-native BFS as Analytics.estimate_dimension/1.

v1.0.0 (2026-05-15)

Breaking changes

  • causally_invariant?/1 now accepts an optional depth argument (causally_invariant?/2); callers that relied on the 1-arity form are unaffected (default depth is 2).
  • Fresh-vertex substitution is now memoised per rule application: a single unbound atom tag produces one stable vertex ID across all replacement hyperedges in the same application. Code that relied on each hyperedge receiving a distinct fresh ID for the same tag will observe different IDs.

New features

  • N-pattern rule matchingWolframModel.Matcher.match/2 now supports rules with any number of input hyperedges via recursive backtracking. Previously only 1- and 2-pattern rules were supported.
  • Update orderingsevolve_step/2 accepts ordering: :first | :leftmost | :random to select which rule match is applied.

  • Parallel evolutionevolve_parallel/1 greedily applies all non-conflicting matches in a single model step.
  • Fixpoint detectionfixpoint?/1 and evolve_until_fixpoint/3.
  • Multiway DAGmultiway_explore_dag/2 returns a proper DAG (%{root:, nodes:, edges:}) where converging branches share nodes.
  • Improved causal invariancecausally_invariant?/2 now tests both non-overlapping pairs (commutativity) and overlapping pairs (local Church–Rosser property up to configurable depth).
  • Hypergraph-native dimension estimationAnalytics.estimate_dimension/1 now uses hypergraph BFS (traversal through whole hyperedges) and up to 10 seed vertices.
  • Conservation law detectionAnalytics.detect_conserved_quantities/1 scans the evolution history for conserved vertex count, edge count, total degree, and their parities.
  • Rule notation parser/printer — new WolframModel.Rule module with parse/2 and to_string/1 for the standard Wolfram notation {{1,2},{1,3}} -> {{2,3},{1,4}}.
  • Rule equivalenceRuleAnalysis.canonical_form/1 and RuleAnalysis.equivalent?/2 check structural isomorphism up to variable renaming.
  • Wolfram benchmark rulesRuleSet.rule_set(:wolfram, key) and RuleSet.wolfram_rules/0 expose five canonical rules from the Wolfram Physics Project (including the 3-pattern triangle rule).

v0.3.0 (2026-05-15)

  • Generalised fresh vertex substitution: any unbound atom in a rule replacement is now treated as a new-vertex tag, removing the hardcoded :new/:center/ :parallel/:new1/:new2/:new3 special-cases
  • Fixed causal_network_data/1 to derive edges from pre-computed parent_ids (O(n) instead of O(n²)) and removed dead causally_related?/2
  • Fixed calculate_clustering_coefficient/1 guard to use map_size/1 instead of length/1 on a map (guard now fires correctly for small adjacency maps)
  • Added WolframModel.foliations/1 — spacelike event layers (foliations of the causal partial order)
  • Added WolframModel.branchial_graph/1 — branchial connections between conflicting/overlapping rule matches at the current state
  • Added WolframModel.causally_invariant?/1 — confluence check: verifies that all pairs of non-overlapping rule applications commute
  • Added WolframModel.export_event_graph/1 — exports causal events as a %{nodes, edges} graph using stored parent_ids
  • Added WolframModel.Analytics.estimate_dimension/1 — estimates effective spatial dimension via geodesic ball growth and log-log regression
  • Added WolframModel.RuleAnalysis module with reversible?/1, self_complementary?/1, introduces_new_vertices?/1, hyperedge_delta/1, and arity/1

v0.2.0 (2025-12-29)

  • Added property tests for two-hyperedge patterns
  • Improved deterministic matching
  • Enhanced event/cause indexing and analytics
  • Fixed various invariants and Dialyzer warnings