Skip to content

Commit

Permalink
wip Norm & IdealNorm
Browse files Browse the repository at this point in the history
  • Loading branch information
ickk committed Sep 12, 2023
1 parent 60154f4 commit 8706b92
Show file tree
Hide file tree
Showing 4 changed files with 153 additions and 116 deletions.
72 changes: 72 additions & 0 deletions ega/src/operators/ideal_norm.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
use crate::*;

/// The Ideal norm, ||A||_inf
///
/// aka "Infinity Norm" or "Vanishing Norm"
pub trait IdealNorm {
/// The Ideal norm, ||A||_inf
fn ideal_norm(self) -> Pseudoscalar;
}

// needs sqrt function, so relies on std or libm
#[cfg(any(feature = "std", feature = "libm"))]
impl<T: IdealNormSquared> IdealNorm for T {
#[inline]
fn ideal_norm(self) -> Pseudoscalar {
Pseudoscalar {
e0123: self.ideal_norm_squared().e0123.sqrt(),
}
}
}

pub trait IdealNormSquared {
fn ideal_norm_squared(self) -> Pseudoscalar;
}

#[cfg(any(test, doctest))]
mod tests {
// use super::*;
// use crate::test_values::*;

// #[test]
// fn ideal_norm_multivector() {
// let result = MULTIVECTOR_A.ideal_norm();
//
// assert_eq!(dbg!(result), dbg!(expected));
// }

// #[test]
// fn ideal_norm_scalar() {
// let result = SCALAR_A.ideal_norm();
// let expected = Scalar { s: 137. };
// assert_eq!(dbg!(result), dbg!(expected));
// }

// #[test]
// fn ideal_norm_vector() {
// let result = VECTOR_A.ideal_norm();
//
// assert_eq!(dbg!(result), dbg!(expected));
// }

// #[test]
// fn ideal_norm_bivector() {
// let result = BIVECTOR_A.ideal_norm();
//
// assert_eq!(dbg!(result), dbg!(expected));
// }

// #[test]
// fn ideal_norm_trivector() {
// let result = TRIVECTOR_A.ideal_norm();
//
// assert_eq!(dbg!(result), dbg!(expected));
// }

// #[test]
// fn ideal_norm_pseudoscalar() {
// let result = PSEUDOSCALAR_A.ideal_norm();
//
// assert_eq!(dbg!(result), dbg!(expected));
// }
}
4 changes: 3 additions & 1 deletion ega/src/operators/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ mod dot;
mod geometric_product;
mod grade_select;
mod hodge_dual;
mod ideal_norm;
mod join;
mod meet;
mod mul;
Expand All @@ -19,11 +20,12 @@ pub use dot::Dot;
pub use geometric_product::GeometricProduct;
pub use grade_select::GradeSelect;
pub use hodge_dual::HodgeDual;
pub use ideal_norm::{IdealNorm, IdealNormSquared};
pub use join::Join;
pub use meet::Meet;
pub use mul::Mul;
pub use neg::Neg;
pub use norm::Norm;
pub use norm::{Norm, NormSquared};
pub use normalise::Normalise;
pub use reverse::Reverse;
pub use sub::Sub;
Expand Down
187 changes: 77 additions & 110 deletions ega/src/operators/norm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,29 +17,6 @@ impl<T: NormSquared> Norm for T {
}
}

// /// The Ideal norm, ||A||_inf
// ///
// /// aka "Infinity Norm" or "Vanishing Norm"
// pub trait IdealNorm {
// /// The Ideal norm, ||A||_inf
// fn ideal_norm(self) -> Scalar;
// }

// // needs sqrt function, so relies on std or libm
// #[cfg(any(feature = "std", feature = "libm"))]
// impl<T, O> IdealNorm for T
// where
// T: HodgeDual<Output = O>,
// O: NormSquared,
// {
// #[inline]
// fn ideal_norm(self) -> Scalar {
// Scalar {
// s: self.hodge_dual().norm_squared().s.abs().sqrt(),
// }
// }
// }

/// The squared norm, ||A||^2
pub trait NormSquared {
/// The squared norm, ||A||^2
Expand All @@ -48,119 +25,109 @@ pub trait NormSquared {
fn norm_squared(self) -> Scalar;
}

// impl<T, O> NormSquared for T
// where
// // T: Copy + Reverse + Conjugate + GeometricProduct<T, Output = O>,
// T: Copy + Reverse + Dot<T, Output = O>,
// O: GradeSelect + Reverse + std::fmt::Debug,
// {
// #[inline]
// fn norm_squared(self) -> Scalar {
// // let norm_r2 = self.geometric_product(self.reverse());
// let norm_r2_inner = self.dot(self.reverse());

// // dbg!(&norm_r2);
// dbg!(&norm_r2_inner);

// // norm_r2.grade_0()
// norm_r2_inner.grade_0()
// }
// }
impl NormSquared for Multivector {
#[inline]
fn norm_squared(self) -> Scalar {
let s = self.s * self.s
+ self.e1 * self.e1
+ self.e2 * self.e2
+ self.e3 * self.e3
+ self.e12 * self.e12
+ self.e31 * self.e31
+ self.e23 * self.e23
+ self.e123 * self.e123;

Scalar { s }
}
}

impl NormSquared for Scalar {
fn norm_squared(mut self) -> Scalar {
self.s *= self.s;
self
#[inline]
fn norm_squared(self) -> Scalar {
let s = self.s * self.s;

Scalar { s }
}
}

impl NormSquared for Vector {
#[inline]
fn norm_squared(self) -> Scalar {
let mut out = Scalar { s: 0. };
let s = self.e1 * self.e1 + self.e2 * self.e2 + self.e3 * self.e3;

out.s += self.e1*self.e1;
out.s += self.e2*self.e2;
out.s += self.e3*self.e3;

out
Scalar { s }
}
}

impl NormSquared for Bivector {
#[inline]
fn norm_squared(self) -> Scalar {
let mut out = Scalar { s: 0. };
let s = self.e12 * self.e12 + self.e31 * self.e31 + self.e23 * self.e23;

out.s += self.e12*self.e12;
out.s += self.e31*self.e31;
out.s += self.e23*self.e23;

out
Scalar { s }
}
}

impl NormSquared for Trivector {
#[inline]
fn norm_squared(self) -> Scalar {
Scalar { s: self.e123*self.e123 }
let s = self.e123 * self.e123;

Scalar { s }
}
}

impl NormSquared for Pseudoscalar {
#[inline]
fn norm_squared(self) -> Scalar {
zero()
}
}

#[rustfmt::skip]
#[cfg(any(test, doctest))]
mod tests {
use super::*;
use crate::test_values::*;

mod norm {
use super::*;

// #[test]
// fn norm_multivector() {
// let result = MULTIVECTOR_A.norm();
// let expected = Multivector {
// e0: -2., e1: -3., e2: -5., e3: -7.,
// s: -11., e23: -13., e31: -17., e12: -19.,
// e01: -23., e02: -29., e03: -31., e0123: -37.,
// e123: -41., e032: -43., e013: -47., e021: -53.,
// };
// assert_eq!(dbg!(result), dbg!(expected));
// }

#[test]
fn norm_scalar() {
let result = SCALAR_A.norm();
let expected = Scalar { s: 137. };
assert_eq!(dbg!(result), dbg!(expected));
}

// #[test]
// fn norm_vector() {
// let result = VECTOR_A.norm();
// let expected = Vector { e0: -151., e1: -157., e2: -163., e3: -167. };
// assert_eq!(dbg!(result), dbg!(expected));
// }

// #[test]
// fn norm_bivector() {
// let result = BIVECTOR_A.norm();
// let expected = Bivector {
// e23: -223., e31: -227., e12: -229.,
// e01: -233., e02: -239., e03: -241.,
// };
// assert_eq!(dbg!(result), dbg!(expected));
// }

// #[test]
// fn norm_trivector() {
// let result = TRIVECTOR_A.norm();
// let expected = Trivector { e021: -347., e013: -337., e032: -331., e123: -317.};
// assert_eq!(dbg!(result), dbg!(expected));
// }

// #[test]
// fn norm_pseudoscalar() {
// let result = PSEUDOSCALAR_A.norm();
// let expected = Pseudoscalar { e0123: -397. };
// assert_eq!(dbg!(result), dbg!(expected));
// }
// #[test]
// fn norm_multivector() {
// let result = MULTIVECTOR_A.norm();
//
// assert_eq!(dbg!(result), dbg!(expected));
// }

#[test]
fn norm_scalar() {
let result = SCALAR_A.norm();
let expected = Scalar { s: 137. };
assert_eq!(dbg!(result), dbg!(expected));
}

// #[test]
// fn norm_vector() {
// let result = VECTOR_A.norm();
//
// assert_eq!(dbg!(result), dbg!(expected));
// }

// #[test]
// fn norm_bivector() {
// let result = BIVECTOR_A.norm();
//
// assert_eq!(dbg!(result), dbg!(expected));
// }

// #[test]
// fn norm_trivector() {
// let result = TRIVECTOR_A.norm();
//
// assert_eq!(dbg!(result), dbg!(expected));
// }

// #[test]
// fn norm_pseudoscalar() {
// let result = PSEUDOSCALAR_A.norm();
//
// assert_eq!(dbg!(result), dbg!(expected));
// }
}
6 changes: 1 addition & 5 deletions ega/src/operators/normalise.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,7 @@ where
{
#[inline]
fn normalise(self) -> Self {
// let ideal_norm = self.ideal_norm();
let norm = self.norm();
// dbg!(&ideal_norm, &norm);
dbg!(&norm);
self * (1. / norm.s)
self * (1. / self.norm().s)
}
}

Expand Down

0 comments on commit 8706b92

Please sign in to comment.