open-hypergraphs 0.3.1

Data-Parallel Algorithms for Open Hypergraphs
Documentation
use open_hypergraphs::array::vec::*;
use open_hypergraphs::finite_function::FiniteFunction;
use open_hypergraphs::lax::{Hyperedge, Hypergraph as LaxHypergraph, NodeId};
use open_hypergraphs::strict::hypergraph::arrow::HypergraphArrow;
use open_hypergraphs::strict::hypergraph::Hypergraph;

type Obj = usize;
type Arr = usize;

fn build_hypergraph(
    node_count: usize,
    edges: &[(Vec<usize>, Vec<usize>)],
) -> Hypergraph<VecKind, Obj, Arr> {
    let mut h = LaxHypergraph::empty();
    h.nodes = vec![0; node_count];
    for (sources, targets) in edges {
        let edge = Hyperedge {
            sources: sources.iter().map(|&i| NodeId(i)).collect(),
            targets: targets.iter().map(|&i| NodeId(i)).collect(),
        };
        h.new_edge(0, edge);
    }
    h.to_hypergraph()
}

fn ff(table: Vec<usize>, target: usize) -> FiniteFunction<VecKind> {
    FiniteFunction::new(VecArray(table), target).unwrap()
}

#[test]
fn test_is_monomorphism_false_for_non_injective_w() {
    let h = build_hypergraph(2, &[]);
    let g = build_hypergraph(1, &[]);
    let w = ff(vec![0, 0], 1);
    let x = ff(vec![], 0);
    let arrow = HypergraphArrow::new(h, g, w, x).unwrap();
    assert!(!arrow.is_monomorphism());
}

#[test]
fn test_convex_subgraph_false_with_shortcut() {
    let g = build_hypergraph(
        3,
        &[(vec![0], vec![1]), (vec![1], vec![2]), (vec![0], vec![2])],
    );
    let h = build_hypergraph(3, &[(vec![0], vec![1]), (vec![1], vec![2])]);

    let w = ff(vec![0, 1, 2], 3);
    let x = ff(vec![0, 1], 3);
    let arrow = HypergraphArrow::new(h, g, w, x).unwrap();
    assert!(!arrow.is_convex_subgraph());
}

#[test]
fn test_convex_subgraph_true_identity() {
    let g = build_hypergraph(
        3,
        &[(vec![0], vec![1]), (vec![1], vec![2]), (vec![0], vec![2])],
    );
    let w = ff(vec![0, 1, 2], 3);
    let x = ff(vec![0, 1, 2], 3);
    let arrow = HypergraphArrow::new(g.clone(), g, w, x).unwrap();
    assert!(arrow.is_convex_subgraph());
}

#[test]
fn test_convex_subgraph_true_small() {
    let g = build_hypergraph(
        3,
        &[(vec![0], vec![1]), (vec![1], vec![2]), (vec![0], vec![2])],
    );
    let h = build_hypergraph(2, &[(vec![0], vec![1])]);

    let w = ff(vec![0, 1], 3);
    let x = ff(vec![0], 3);
    let arrow = HypergraphArrow::new(h, g, w, x).unwrap();
    assert!(arrow.is_convex_subgraph());
}