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.
[0.70.0] - 2026-03-26
Various performance improvements and examples.
[0.60.0] - 2026-03-23
Added
- Pure Elixir Implementation: Complete migration from Gleam wrapper to 100% pure Elixir implementation
- All 58 modules now implemented in pure Elixir with zero Gleam dependencies
- Removed all Gleam dependencies (
:yog,:gleam_stdlib,:gleam_json,:gleamy_structures,:gleamy_bench) - Installation is now as simple as
{:yog_ex, "~> 0.60"}with no additional configuration required
Changed
- Graph Structure: Changed from tuple format
{:graph, kind, nodes, out_edges, in_edges}to proper Elixir struct%Yog.Graph{kind, nodes, out_edges, in_edges} - Improved priority queue usage: Now uses
Yog.PQ(pairing heap) instead of sorted listslexicographical_topological_sort: O(V log V + E) vs O(V² + E) previouslyimplicit_dijkstra: O(E log V) vs O(E × V) previously- More efficient for large graphs
- Module Reorganization:
Yog.Pathfinding(facade) → Removed, use individual modules directlyYog.MaxFlow→Yog.Flow.MaxFlowYog.MinCut→Yog.Flow.MinCutYog.Rendermodules →Yog.Render.DOT,Yog.Render.Mermaid,Yog.Render.ASCIIYog.Generators→Yog.Generator.Classic,Yog.Generator.RandomYog.PQ→Yog.PriorityQueue(filename also changed frompq.extopriority_queue.ex)
- API Updates:
- Pathfinding functions now return
%Yog.Pathfinding.Path{}struct withweightfield (wastotal_weight) edmonds_karp/8compare function now expects boolean return (<=instead of:lt/:eq/:gt)floyd_warshall/4uses positional arguments instead of keyword argumentsglobal_min_cut/1moved fromYog.MinCuttoYog.Flow.MinCut
- Pathfinding functions now return
Migration Guide
- Installation: Remove all Gleam-related dependencies from your
mix.exs, keep only{:yog_ex, "~> 0.60"} - Graph access: Replace
elem(graph, 2)withgraph.nodes,elem(graph, 1)withgraph.kind - Module names: Update any
Yog.MaxFlowcalls toYog.Flow.MaxFlow, etc. - Compare functions: Update compare functions to return booleans instead of
:lt/:eq/:gt
[0.52.3] - 2026-03-22
Fixed
- Fixed dependency configuration causing compilation failures in downstream projects:
- Removed
app: falsefromyogdependency (it has a valid OTP application file) - Added explicit Gleam dependencies (
gleam_stdlib,gleam_json,gleamy_structures,gleamy_bench) thatyogrequires
- Removed
- Users can now use YogEx with just
{:yog_ex, "~> 0.52.3"}without any additional dependency configuration
[0.52.2] - 2026-03-22
Fixed
- Documentation now builds correctly on HexDocs (fixed ex_doc configuration in publish environment)
[0.52.1] - 2026-03-22
Changed
- I/O Modules: All graph I/O modules (
Yog.IO.GraphML,Yog.IO.GDF,Yog.IO.Pajek,Yog.IO.LEDA,Yog.IO.TGF,Yog.IO.JSON) are now implemented in pure Elixir and work out of the box without any additional dependencies. - Dependencies: Completely removed
yog_iodependency. Users no longer need to manually addyog_ioto their dependencies. - Installation: Simplified installation - YogEx now works with all features using just
{:yog_ex, "~> 0.52.1"}.
Implementation Details
- GraphML: Implemented using Erlang's
:xmerllibrary for XML parsing and serialization - GDF: Pure Elixir CSV parser with support for duplicate column names and proper escaping
- Pajek: Case-insensitive parser with support for quoted/unquoted labels and comments
- LEDA: Native implementation supporting 1-indexed nodes and sequential ordering
- TGF: Simple text-based format parser
- JSON: Pure Elixir serialization for adjacency lists and matrices
Fixed
- Resolved dependency conflicts that previously required users to manually configure
yog_iowithmanager: :rebar3, app: false, override: true - Eliminated Gleam package dependencies for I/O functionality
[0.51.0] - 2026-03-22
Added
Yog.Pathfinding: New facade module providing a unified keyword-based API forDijkstra,AStar,BellmanFord, andFloydWarshall.Yog.Connectivity: Support forconnected_components/1andweakly_connected_components/1viadefdelegate.- I/O Integration: Support for multiple graph formats via
yog_io:GDF,GraphML,JSON,LEDA,Pajek, andTGF. - Documentation: Comprehensive
@moduledoc,@doc, and doctests forYog.ConnectivityandYog.Pathfinding.
Changed
- DAG Modules: Renamed for Elixir consistency:
Yog.DAG.Models->Yog.DAG.ModelandYog.DAG.Algorithms->Yog.DAG.Algorithm. - Examples: Updated all example files to use
add_edge!(and variants) when chaining to handle theResulttype correctly. - Module Names: Corrected outdated module references in examples (
Yog.Components->Yog.Connectivity,Yog.TopologicalSort->Yog.Traversal). - Dependencies: Updated
yogto~> 5.1. Breaking:yog_iois now an optional dependency that users must add manually if they need I/O functionality (GraphML, GDF, JSON, LEDA, Pajek, TGF formats). This resolves dependency conflicts during hex publishing. See README installation guide for details. - Installation: Added comprehensive installation guide explaining how to add
yog_iofor I/O support.