geoit 0.0.2

Exact geometric algebra with governed multivectors
Documentation
//! Governance composition with transform rules.
//!
//! Run: `cargo run --example transform_rule`

use geoit::governance::expr::Expr;
use geoit::governance::rule::TransformOp;
use geoit::*;

fn main() {
    // Build a VGA(3) governance with a "Reverse" rule
    let alg = Algebra::new(Signature::new(0, 0, 3).unwrap());
    let class = GeomClassBuilder::new(&alg).grades(&[1]).build();
    let 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)),
    );

    let gov = GovernanceBuilder::new(alg)
        .class("Vector", class)
        .construction("Vector", "Vector", 3, body)
        .rule("Reverse", &["Vector"], "Vector", TransformOp::Reverse)
        .build();

    println!("Rules: {:?}", gov.rule_names());

    // Construct and govern a vector
    let params = vec![Scalar::from(3), Scalar::from(4), Scalar::from(5)];
    let mv = gov.construct("Vector", &params).unwrap();
    let geoit = gov.govern(&mv, "Vector").unwrap();
    println!("Original: {:?}", geoit.mv());
    println!("Proof: {:?}", geoit.proof());

    // Apply the rule: reverse of a grade-1 vector is unchanged
    let reversed = gov.transform("Reverse", &[&geoit]).unwrap();
    println!("Reversed: {:?}", reversed.mv());
    println!("Proof: {:?}", reversed.proof());
    println!("Same Mv: {}", reversed.mv() == geoit.mv());
}