open-hypergraphs 0.3.1

Data-Parallel Algorithms for Open Hypergraphs
Documentation
use open_hypergraphs::array::vec::{VecArray, VecKind};
use open_hypergraphs::category::{Arrow, SymmetricMonoidal};
use open_hypergraphs::finite_function::FiniteFunction;
use open_hypergraphs::semifinite::SemifiniteFunction;
use open_hypergraphs::strict::hypergraph::Hypergraph;
use open_hypergraphs::strict::open_hypergraph::OpenHypergraph;

use crate::theory::meaningless::{Arr, Obj};

#[test]
fn test_is_monogamous_true() {
    let f: OpenHypergraph<VecKind, Obj, Arr> = OpenHypergraph::singleton(
        0u8,
        SemifiniteFunction(VecArray(vec![0i8])),
        SemifiniteFunction(VecArray(vec![1i8])),
    );

    assert!(f.is_monogamous());
}

#[test]
fn test_is_monogamous_false_non_mono_interface() {
    let h = Hypergraph::discrete(SemifiniteFunction(VecArray(vec![0i8, 1i8])));
    let s = FiniteFunction::new(VecArray(vec![0, 0]), 2).unwrap();
    let t = FiniteFunction::new(VecArray(vec![1]), 2).unwrap();

    let g: OpenHypergraph<VecKind, Obj, Arr> = OpenHypergraph::new(s, t, h).unwrap();

    assert!(!g.is_monogamous());
}

#[test]
fn test_is_monogamous_false_boundary_has_degree() {
    let base: OpenHypergraph<VecKind, Obj, Arr> = OpenHypergraph::singleton(
        0u8,
        SemifiniteFunction(VecArray(vec![0i8])),
        SemifiniteFunction(VecArray(vec![1i8])),
    );
    let s = FiniteFunction::new(VecArray(vec![0, 1]), 2).unwrap();
    let t = FiniteFunction::new(VecArray(vec![1]), 2).unwrap();

    let g: OpenHypergraph<VecKind, Obj, Arr> = OpenHypergraph::new(s, t, base.h).unwrap();

    assert!(!g.is_monogamous());
}

#[test]
fn test_identity_is_monogamous() {
    let h: OpenHypergraph<VecKind, Obj, Arr> =
        OpenHypergraph::identity(SemifiniteFunction(VecArray(vec![0i8, 1i8])));

    assert!(h.is_monogamous());
}

#[test]
fn test_symmetry_is_monogamous() {
    let h: OpenHypergraph<VecKind, Obj, Arr> = OpenHypergraph::twist(
        SemifiniteFunction(VecArray(vec![0i8])),
        SemifiniteFunction(VecArray(vec![1i8])),
    );

    assert!(h.is_monogamous());
}

#[test]
fn test_composition_preserves_monogamous() {
    let f: OpenHypergraph<VecKind, Obj, Arr> =
        OpenHypergraph::identity(SemifiniteFunction(VecArray(vec![0i8, 1i8])));
    let g: OpenHypergraph<VecKind, Obj, Arr> = OpenHypergraph::twist(
        SemifiniteFunction(VecArray(vec![0i8])),
        SemifiniteFunction(VecArray(vec![1i8])),
    );

    let composed = Arrow::compose(&f, &g).expect("matching boundaries");

    assert!(composed.is_monogamous());
}