geoit 0.0.2

Exact geometric algebra with governed multivectors
Documentation
use geoit::algebra::mv::Mv;
use geoit::algebra::signature::Signature;
use geoit::governance::{govern, Construction, Expr, GeomClass, Governance, Phase};
use geoit::scalar::{Rat, Scalar};

fn vga3_governance() -> Governance {
    Governance {
        sig: Signature::new(0, 0, 3).unwrap(),
        derived_gens: vec![],
        geom_classes: vec![GeomClass::grades_only(&[1])],
        constructions: vec![Construction {
            class_index: 0,
            arity: 3,
            body: Expr::Add(
                Expr::add(
                    Expr::mul(Expr::param(0), Expr::gen(0)),
                    Expr::mul(Expr::param(1), Expr::gen(1)),
                ),
                Expr::mul(Expr::param(2), Expr::gen(2)),
            ),
        }],
        probe: None,
        transform_rules: vec![],
    }
}

#[test]
fn vga_circuit_closes() {
    let gov = vga3_governance();
    let params = vec![Scalar::from(3i64), Scalar::from(4i64), Scalar::from(5i64)];
    let mv = gov.construct(0, &params).unwrap();
    let geoit = govern(&mv, &gov, 0).unwrap();
    assert_eq!(geoit.read_all().unwrap(), params);
}

#[test]
fn vga_rational_coefficients() {
    let gov = vga3_governance();
    let params = vec![
        Scalar::Rat(Rat::new(1, 2)),
        Scalar::Rat(Rat::new(1, 3)),
        Scalar::Rat(Rat::new(1, 7)),
    ];
    let mv = gov.construct(0, &params).unwrap();
    let geoit = govern(&mv, &gov, 0).unwrap();
    assert_eq!(geoit.read_all().unwrap(), params);
}

#[test]
fn vga_phase_values() {
    let gov = vga3_governance();
    let mv = gov
        .construct(
            0,
            &[Scalar::from(3i64), Scalar::from(4i64), Scalar::from(5i64)],
        )
        .unwrap();
    assert_eq!(govern(&mv, &gov, 0).unwrap().phase(), Phase::Commitment);
    let zero = gov
        .construct(
            0,
            &[Scalar::from(0i64), Scalar::from(0i64), Scalar::from(0i64)],
        )
        .unwrap();
    assert_eq!(govern(&zero, &gov, 0).unwrap().phase(), Phase::Evaluation);
}

#[test]
fn vga_bivector_rejected() {
    let gov = vga3_governance();
    let bv = Mv::from_rat_terms(&[(0b011, Rat::from(1))]);
    assert!(govern(&bv, &gov, 0).is_err());
}

#[test]
fn vga_scalar_rejected() {
    let gov = vga3_governance();
    let s = Mv::from_rat_terms(&[(0b000, Rat::from(5))]);
    assert!(govern(&s, &gov, 0).is_err());
}

#[test]
fn vga_mixed_grade_rejected() {
    let gov = vga3_governance();
    let mixed = Mv::from_rat_terms(&[(0b001, Rat::from(1)), (0b011, Rat::from(2))]);
    assert!(govern(&mixed, &gov, 0).is_err());
}

#[test]
fn vga_circuit_multiple_vectors() {
    let gov = vga3_governance();
    let cases: Vec<Vec<i64>> = vec![
        vec![1, 0, 0],
        vec![0, 1, 0],
        vec![0, 0, 1],
        vec![-1, -2, -3],
    ];
    for case in &cases {
        let params: Vec<Scalar> = case.iter().map(|&n| Scalar::from(n)).collect();
        let mv = gov.construct(0, &params).unwrap();
        let geoit = govern(&mv, &gov, 0).unwrap();
        assert_eq!(geoit.read_all().unwrap(), params);
    }
}