fastgraph 0.1.21

Graph abstraction providing a generic interface and powerful parallelized traversals.
Documentation
use fastgraph::core::*;
use fastgraph::collections::*;
use fastgraph::core::Empty;
type SimpleDigraph = Digraph<usize, Empty, Empty>;
type SimpleUngraph = Ungraph<usize, Empty, Empty>;

fn test_ungraph_1() -> SimpleDigraph {
	let mut g = SimpleDigraph::new();

	g.add_node(1, Empty);
	g.add_node(2, Empty);
	g.add_node(3, Empty);
	g.add_node(4, Empty);
	g.add_node(5, Empty);
	g.add_node(6, Empty);

	g.add_edge(1, 2, Empty);
	g.add_edge(1, 3, Empty);
	g.add_edge(2, 1, Empty);
	g.add_edge(2, 3, Empty);
	g.add_edge(3, 1, Empty);
	g.add_edge(3, 5, Empty);
	g.add_edge(5, 2, Empty);
	g.add_edge(5, 4, Empty);
	g.add_edge(5, 1, Empty);
	g.add_edge(4, 5, Empty);
	g.add_edge(4, 3, Empty);
	g.add_edge(4, 2, Empty);
	g.add_edge(4, 6, Empty);
	g
}

fn test_digraph_1() -> SimpleUngraph {
	let mut g = SimpleUngraph::new();

	g.add_node(1, Empty);
	g.add_node(2, Empty);
	g.add_node(3, Empty);
	g.add_node(4, Empty);
	g.add_node(5, Empty);
	g.add_node(6, Empty);

	g.add_edge(1, 2, Empty);
	g.add_edge(1, 3, Empty);
	g.add_edge(2, 1, Empty);
	g.add_edge(2, 3, Empty);
	g.add_edge(3, 1, Empty);
	g.add_edge(3, 5, Empty);
	g.add_edge(5, 2, Empty);
	g.add_edge(5, 4, Empty);
	g.add_edge(5, 1, Empty);
	g.add_edge(4, 5, Empty);
	g.add_edge(4, 3, Empty);
	g.add_edge(4, 2, Empty);
	g.add_edge(4, 6, Empty);
	g
}

#[test]
fn ungraph_test_breadth_traversal() {
	let g = test_ungraph_1();

	let res1 = g.breadth_first(1,
	|edge|{
		if edge.target().key() == &6 {
			Traverse::Finish
		} else {
			Traverse::Include
		}
	}).unwrap();
	let res2 = g.breadth_first(1,
		|edge|{
			if edge.target().key() == &6 {
				Traverse::Finish
			} else {
				Traverse::Include
			}
		}).unwrap();
	let path1 = backtrack_edges(&res1);
	assert!(path1.len() == 4);
	assert!(path1[0].upgrade().unwrap().target().key() == &3);
	assert!(path1[1].upgrade().unwrap().target().key() == &5);
	assert!(path1[2].upgrade().unwrap().target().key() == &4);
	assert!(path1[3].upgrade().unwrap().target().key() == &6);
	let path2 = backtrack_edges(&res2);
	assert!(path2.len() == 4);
	assert!(path2[0].upgrade().unwrap().target().key() == &3);
	assert!(path2[1].upgrade().unwrap().target().key() == &5);
	assert!(path2[2].upgrade().unwrap().target().key() == &4);
	assert!(path2[3].upgrade().unwrap().target().key() == &6);
}

#[test]
fn ungraph_test_par_breadth_traversal() {
	let g = test_ungraph_1();

	let res1 = g.par_breadth_first(1,
	|edge|{
		if edge.target().key() == &6 {
			Traverse::Finish
		} else {
			Traverse::Include
		}
	}).unwrap();
	let res2 = g.par_breadth_first(1,
		|edge|{
			if edge.target().key() == &6 {
				Traverse::Finish
			} else {
				Traverse::Include
			}
		}).unwrap();
	let path1 = backtrack_edges(&res1);
	assert!(path1.len() == 4);
	assert!(path1[0].upgrade().unwrap().target().key() == &3);
	assert!(path1[1].upgrade().unwrap().target().key() == &5);
	assert!(path1[2].upgrade().unwrap().target().key() == &4);
	assert!(path1[3].upgrade().unwrap().target().key() == &6);
	let path2 = backtrack_edges(&res2);
	assert!(path2.len() == 4);
	assert!(path2[0].upgrade().unwrap().target().key() == &3);
	assert!(path2[1].upgrade().unwrap().target().key() == &5);
	assert!(path2[2].upgrade().unwrap().target().key() == &4);
	assert!(path2[3].upgrade().unwrap().target().key() == &6);
}

#[test]
fn digraph_test_breadth_traversal() {
	let g = test_digraph_1();

	let res1 = g.breadth_first(1,
	|edge|{
		if edge.target().key() == &6 {
			Traverse::Finish
		} else {
			Traverse::Include
		}
	}).unwrap();
	let res2 = g.breadth_first(1,
		|edge|{
			if edge.target().key() == &6 {
				Traverse::Finish
			} else {
				Traverse::Include
			}
		}).unwrap();
	let path1 = backtrack_edges(&res1);
	assert!(path1.len() == 4);
	assert!(path1[0].upgrade().unwrap().target().key() == &3);
	assert!(path1[1].upgrade().unwrap().target().key() == &5);
	assert!(path1[2].upgrade().unwrap().target().key() == &4);
	assert!(path1[3].upgrade().unwrap().target().key() == &6);
	let path2 = backtrack_edges(&res2);
	assert!(path2.len() == 4);
	assert!(path2[0].upgrade().unwrap().target().key() == &3);
	assert!(path2[1].upgrade().unwrap().target().key() == &5);
	assert!(path2[2].upgrade().unwrap().target().key() == &4);
	assert!(path2[3].upgrade().unwrap().target().key() == &6);
}

#[test]
fn digraph_test_par_breadth_traversal() {
	let g = test_digraph_1();

	let res1 = g.par_breadth_first(1,
	|edge|{
		if edge.target().key() == &6 {
			Traverse::Finish
		} else {
			Traverse::Include
		}
	}).unwrap();
	let res2 = g.par_breadth_first(1,
		|edge|{
			if edge.target().key() == &6 {
				Traverse::Finish
			} else {
				Traverse::Include
			}
		}).unwrap();
	let path1 = backtrack_edges(&res1);
	assert!(path1.len() == 4);
	assert!(path1[0].upgrade().unwrap().target().key() == &3);
	assert!(path1[1].upgrade().unwrap().target().key() == &5);
	assert!(path1[2].upgrade().unwrap().target().key() == &4);
	assert!(path1[3].upgrade().unwrap().target().key() == &6);
	let path2 = backtrack_edges(&res2);
	assert!(path2.len() == 4);
	assert!(path2[0].upgrade().unwrap().target().key() == &3);
	assert!(path2[1].upgrade().unwrap().target().key() == &5);
	assert!(path2[2].upgrade().unwrap().target().key() == &4);
	assert!(path2[3].upgrade().unwrap().target().key() == &6);
}