relmath-rs 0.7.0

Relation-first mathematics and scientific computing in Rust.
Documentation
//! Explicit finite carriers distinct from relation-induced support.

use relmath::{BinaryRelation, FiniteCarrier};

fn main() {
    let step = BinaryRelation::from_pairs([("Draft", "Review")]);
    let states = FiniteCarrier::from_values(["Draft", "Review", "Archived"]);

    let inferred = step.carrier();
    let inferred_identity = BinaryRelation::identity(&inferred);
    let explicit_identity = BinaryRelation::identity_on(&states);
    let reachable = step.reflexive_transitive_closure_on(&states);

    assert_eq!(inferred.to_vec(), vec!["Draft", "Review"]);
    assert_eq!(
        inferred_identity.to_vec(),
        vec![("Draft", "Draft"), ("Review", "Review")]
    );
    assert_eq!(
        explicit_identity.to_vec(),
        vec![
            ("Archived", "Archived"),
            ("Draft", "Draft"),
            ("Review", "Review"),
        ]
    );
    assert_eq!(states.to_vec(), vec!["Archived", "Draft", "Review"]);
    assert_eq!(
        reachable.to_vec(),
        step.reflexive_transitive_closure(&states.to_unary_relation())
            .to_vec()
    );
    assert!(reachable.is_reflexive_on(&states));
    assert!(step.is_irreflexive_on(&states));
    assert!(reachable.contains(&"Archived", &"Archived"));
    assert!(reachable.contains(&"Draft", &"Review"));

    println!(
        "explicit carrier: {:?}; inferred support: {:?}; inferred identity: {:?}; explicit identity: {:?}; reachable: {:?}",
        states.to_vec(),
        inferred.to_vec(),
        inferred_identity.to_vec(),
        explicit_identity.to_vec(),
        reachable.to_vec()
    );
}