Skip to content

SilensAngelusNex/pgraph

Repository files navigation

Build Status codecov

PGraph

PGraph provides a persistent graph data structure with the following features:

  • Supports optional data for vertices and edges (For example, PGraph<(), E> has data on edges only.)
  • Directed edges, for that sweet, sweet versitility
  • Structural sharing built on im data structures
  • TODO: Common graph algorithms (Dijkstra's, Bellman-Ford, and Floyd-Warshall are the first ones I'm planning, but make an issue if there's another that you want.)

Setup

To use pgraph add the following to your Cargo.toml:

[dependencies]
pgraph = { git = "https://github.com/SilensAngelusNex/pgraph.git" }

Usage

let mut g = PGraph::new();
let v1 = g.add_mut(1);
let v2 = g.add_mut(2);
let v3 = g.add_mut(3);
let v4 = g.add_mut(4);
let v5 = g.add_mut(5);

g.connect_mut(v1, v2, 12);
g.connect_mut(v2, v3, 23);
g.connect_mut(v3, v2, 32);
g.connect_mut(v4, v1, 41);
g.connect_mut(v5, v3, 53);
g.connect_mut(v3, v4, 34);

let mut h = g.remove(v1);
let v6 = h.add_mut(6);
h.connect_mut(v6, v5, 65);
*h.edge_mut(v5, v3).unwrap() = 130;

let i = h.clone();

let mut j = i.remove(v4);
let v7 = j.add_mut(7);
j.connect_mut(v6, v7, 67);

println!("g = {:?}", g);
println!("----------------\n\n");
println!("h = {:?}", h);
println!("----------------\n\n");
println!("i = {:?}", i);
println!("----------------\n\n");
println!("j = {:?}", j);
println!("----------------\n\n");
println!("_ = {:?}", PGraph::<i8, i8>::new());

Output:

g = PGraph (gen 0) {
	1 (0 gen0) => (1 gen0: 12)
	2 (1 gen0) => (2 gen0: 23)
	3 (2 gen0) => (1 gen0: 32, 3 gen0: 34)
	4 (3 gen0) => (0 gen0: 41)
	5 (4 gen0) => (2 gen0: 53)
}

----------------


h = PGraph (gen 2) {
	6 (0 gen2) => (4 gen0: 65)
	2 (1 gen0) => (2 gen0: 23)
	3 (2 gen0) => (1 gen0: 32, 3 gen0: 34)
	4 (3 gen0) => (None)
	5 (4 gen0) => (2 gen0: 130)
}

----------------


i = PGraph (gen 3) {
	6 (0 gen2) => (4 gen0: 65)
	2 (1 gen0) => (2 gen0: 23)
	3 (2 gen0) => (1 gen0: 32, 3 gen0: 34)
	4 (3 gen0) => (None)
	5 (4 gen0) => (2 gen0: 130)
}

----------------


j = PGraph (gen 5) {
	6 (0 gen2) => (3 gen5: 67, 4 gen0: 65)
	2 (1 gen0) => (2 gen0: 23)
	3 (2 gen0) => (1 gen0: 32)
	7 (3 gen5) => (None)
	5 (4 gen0) => (2 gen0: 130)
}

----------------


_ = PGraph (gen 6) {}

About

A persistent, directed graph generic over edge weights and vertex data, written in Rust.

Topics

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published