Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replacing auto! with trait aliases #3

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 29 additions & 41 deletions src/algebra/group_like.rs
Original file line number Diff line number Diff line change
Expand Up @@ -239,25 +239,21 @@ pub mod additive {

impl<G:AddMonoid + Negatable> MulZ for G {}

auto!{

///A set with an fully described additive inverse
pub trait Negatable = Sized + Clone + Neg<Output=Self> + Sub<Self, Output=Self> + SubAssign<Self>;

///A set with an addition operation
pub trait AddMagma = Sized + Clone + Add<Self,Output=Self> + AddAssign<Self>;
///An associative additive magma
pub trait AddSemigroup = AddMagma + AddAssociative;
///An additive semigroup with an identity element
pub trait AddMonoid = AddSemigroup + Zero + MulN;
///An additive magma with an inverse operation and identity
pub trait AddLoop = AddMagma + Negatable + Zero;
///An additive monoid with an inverse operation
pub trait AddGroup = AddMagma + AddAssociative + Negatable + Zero + MulZ;
///A commutative additive group
pub trait AddAbelianGroup = AddGroup + AddCommutative;

}
///A set with an fully described additive inverse
pub trait Negatable = Sized + Clone + Neg<Output=Self> + Sub<Self, Output=Self> + SubAssign<Self>;

///A set with an addition operation
pub trait AddMagma = Sized + Clone + Add<Self,Output=Self> + AddAssign<Self>;
///An associative additive magma
pub trait AddSemigroup = AddMagma + AddAssociative;
///An additive semigroup with an identity element
pub trait AddMonoid = AddSemigroup + Zero + MulN;
///An additive magma with an inverse operation and identity
pub trait AddLoop = AddMagma + Negatable + Zero;
///An additive monoid with an inverse operation
pub trait AddGroup = AddMagma + AddAssociative + Negatable + Zero + MulZ;
///A commutative additive group
pub trait AddAbelianGroup = AddGroup + AddCommutative;

}

Expand Down Expand Up @@ -386,28 +382,20 @@ pub mod multiplicative {
impl<G:MulMonoid+Invertable> PowZ for G {}


auto!{

///A set with an fully described multiplicative inverse
pub trait Invertable = Sized + Clone + Inv<Output=Self> + Div<Self, Output=Self> + DivAssign<Self>;

///A set with a multiplication operation
pub trait MulMagma = Sized + Clone + Mul<Self, Output=Self> + MulAssign<Self>;
///An associative multiplicative magma
pub trait MulSemigroup = MulMagma + MulAssociative;
///A multiplicative semigroup with an identity element
pub trait MulMonoid = MulSemigroup + One + PowN;
///A multiplicative magma with an inverse operation and identity
pub trait MulLoop = MulMagma + Invertable + One;
///A multiplicative monoid with an inverse operation
pub trait MulGroup = MulMagma + MulAssociative + Invertable + One + PowZ;
///A commutative multiplicative group
pub trait MulAbelianGroup = MulGroup + MulCommutative;

}



///A set with an fully described multiplicative inverse
pub trait Invertable = Sized + Clone + Inv<Output=Self> + Div<Self, Output=Self> + DivAssign<Self>;
///A set with a multiplication operation
pub trait MulMagma = Sized + Clone + Mul<Self, Output=Self> + MulAssign<Self>;
///An associative multiplicative magma
pub trait MulSemigroup = MulMagma + MulAssociative;
///A multiplicative semigroup with an identity element
pub trait MulMonoid = MulSemigroup + One + PowN;
///A multiplicative magma with an inverse operation and identity
pub trait MulLoop = MulMagma + Invertable + One;
///A multiplicative monoid with an inverse operation
pub trait MulGroup = MulMagma + MulAssociative + Invertable + One + PowZ;
///A commutative multiplicative group
pub trait MulAbelianGroup = MulGroup + MulCommutative;
}

use algebra::{Natural, IntegerSubset};
Expand Down
14 changes: 6 additions & 8 deletions src/algebra/integer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,12 @@ use core::ops::{Rem, RemAssign};
use analysis::ordered::*;
use algebra::*;

auto!{
pub trait CastPrimInt =
TryFrom<i8> + TryFrom<u8> + TryInto<i8> + TryInto<u8> +
TryFrom<i16> + TryFrom<u16> + TryInto<i16> + TryInto<u16> +
TryFrom<i32> + TryFrom<u32> + TryInto<i32> + TryInto<u32> +
TryFrom<i64> + TryFrom<u64> + TryInto<i64> + TryInto<u64> +
TryFrom<i128> + TryFrom<u128> + TryInto<i128> + TryInto<u128>;
}
pub trait CastPrimInt =
TryFrom<i8> + TryFrom<u8> + TryInto<i8> + TryInto<u8> +
TryFrom<i16> + TryFrom<u16> + TryInto<i16> + TryInto<u16> +
TryFrom<i32> + TryFrom<u32> + TryInto<i32> + TryInto<u32> +
TryFrom<i64> + TryFrom<u64> + TryInto<i64> + TryInto<u64> +
TryFrom<i128> + TryFrom<u128> + TryInto<i128> + TryInto<u128>;

pub trait IntegerSubset: Ord + Eq + Clone + CastPrimInt
+ EuclideanSemidomain
Expand Down
33 changes: 13 additions & 20 deletions src/algebra/module_like.rs
Original file line number Diff line number Diff line change
Expand Up @@ -130,23 +130,16 @@ pub trait SkewSesquilinearForm<R:UnitalRing, M:RingModule<R>>: ReflexiveForm<R,M
pub trait BilinearForm<R:UnitalRing, M:RingModule<R>>: SesquilinearForm<R,M> {}
pub trait ComplexSesquilinearForm<R:ComplexRing, M:RingModule<R>>: SesquilinearForm<R,M> {}

auto! {
pub trait SymmetricForm<R,M> = BilinearForm<R,M> + SymSesquilinearForm<R,M> where R:UnitalRing, M:RingModule<R>;
pub trait SkewSymmetricForm<R,M> = BilinearForm<R,M> + SkewSesquilinearForm<R,M> where R:UnitalRing, M:RingModule<R>;
pub trait HermitianForm<R,M> = ComplexSesquilinearForm<R,M> + SymSesquilinearForm<R,M> where R:ComplexRing, M:RingModule<R>;
pub trait SkewHermitianForm<R,M> = ComplexSesquilinearForm<R,M> + SkewSesquilinearForm<R,M> where R:ComplexRing, M:RingModule<R>;
}

auto!{
///An abelian additive group with a distributive scalar multiplication with a unital ring
pub trait RingModule<K> = AddAbelianGroup + Mul<K, Output=Self> + MulAssign<K> where K: UnitalRing;
///An abelian additive group with a distributive scalar multiplication with a field
pub trait VectorSpace<K> = RingModule<K> + Div<K, Output=Self> + DivAssign<K> where K: Field;
///A vector space with a distributive multiplication operation
pub trait Algebra<K> = VectorSpace<K> + MulMagma + Distributive where K: Field;

pub trait AffineSpace<K, V> =
Sized + Clone + Sub<Self, Output=V> + Add<V, Output=Self> + AddAssign<V> + Sub<V, Output=Self> + SubAssign<V>
where K: Field, V: VectorSpace<K>;

}
pub trait SymmetricForm<R,M> = BilinearForm<R,M> + SymSesquilinearForm<R,M> where R:UnitalRing, M:RingModule<R>;
pub trait SkewSymmetricForm<R,M> = BilinearForm<R,M> + SkewSesquilinearForm<R,M> where R:UnitalRing, M:RingModule<R>;
pub trait HermitianForm<R,M> = ComplexSesquilinearForm<R,M> + SymSesquilinearForm<R,M> where R:ComplexRing, M:RingModule<R>;
pub trait SkewHermitianForm<R,M> = ComplexSesquilinearForm<R,M> + SkewSesquilinearForm<R,M> where R:ComplexRing, M:RingModule<R>;

///An abelian additive group with a distributive scalar multiplication with a unital ring
pub trait RingModule<K: UnitalRing> = AddAbelianGroup + Mul<K, Output=Self> + MulAssign<K>;
///An abelian additive group with a distributive scalar multiplication with a field
pub trait VectorSpace<K: Field> = RingModule<K> + Div<K, Output=Self> + DivAssign<K>;
///A vector space with a distributive multiplication operation
pub trait Algebra<K: Field> = VectorSpace<K> + MulMagma + Distributive;

pub trait AffineSpace<K: Field, V: VectorSpace<K>> = Sized + Clone + Sub<Self, Output=V> + Add<V, Output=Self> + AddAssign<V> + Sub<V, Output=Self> + SubAssign<V>;
100 changes: 49 additions & 51 deletions src/algebra/ring_like.rs
Original file line number Diff line number Diff line change
Expand Up @@ -165,58 +165,56 @@ pub trait EuclideanDiv: Sized {
fn div_alg(self, rhs: Self) -> (Self, Self);
}

auto! {
///A commutative and additive monoid with a distributive and associative multiplication operation
pub trait Semiring = Distributive + AddMonoid + AddCommutative + MulSemigroup;
///A semiring with an identity element
pub trait UnitalSemiring = Semiring + MulMonoid;
///A unital semiring where multiplication is commutative
pub trait CommutativeSemiring = UnitalSemiring + MulCommutative;
///A semiring with a multiplicative inverse
pub trait DivisionSemiring = UnitalSemiring + MulGroup;

///An additive abelian group with a distributive and associative multiplication operation
pub trait Ring = Distributive + AddAbelianGroup + MulSemigroup;
///A ring with an identity element
pub trait UnitalRing = Ring + MulMonoid;
///A unital ring where multiplication is commutative
pub trait CommutativeRing = UnitalRing + MulCommutative;
///A ring with a multiplicative inverse
pub trait DivisionRing = UnitalRing + MulGroup;

///A unital semiring with no pairs of nonzero elements that multiply to zero
pub trait Semidomain = UnitalSemiring + Divisibility + NoZeroDivisors;
///A semidomain that is commutative
pub trait IntegralSemidomain = Semidomain + MulCommutative;
///An integral semidomain where every pair of elements has a greatest common divisor
pub trait GCDSemidomain = IntegralSemidomain + GCD;
///A GCD semidomain where every pair of elements is uniquely factorizable into irreducible elements (up to units)
pub trait UFSemidomain = GCDSemidomain + UniquelyFactorizable;
///A UF semidomain with a division algorithm for dividing with a remainder
pub trait EuclideanSemidomain = UFSemidomain + EuclideanDiv;

///A unital ring with no pairs of nonzero elements that multiply to zero
pub trait Domain = UnitalRing + Divisibility + NoZeroDivisors;
///A domain that is commutative
pub trait IntegralDomain = Domain + MulCommutative;
///A commutative ring where every pair of elements has a greatest common divisor
pub trait GCDDomain = IntegralDomain + GCD;
///A commutative ring where every pair of elements has a weighted sum to their GCD
pub trait BezoutDomain = GCDDomain + Bezout;
///A commutative ring that is uniquely factorizable into irreducible (up to units)
pub trait UFD = GCDDomain + UniquelyFactorizable;
///
///An integral domain where every ideal is generated by one element
///
///ie. a UFD that is Bezout
///
pub trait PID = UFD + BezoutDomain;
///A commutative ring with a division algorithm for dividing with a remainder
pub trait EuclideanDomain = PID + EuclideanDiv;
///A commutative and additive monoid with a distributive and associative multiplication operation
pub trait Semiring = Distributive + AddMonoid + AddCommutative + MulSemigroup;
///A semiring with an identity element
pub trait UnitalSemiring = Semiring + MulMonoid;
///A unital semiring where multiplication is commutative
pub trait CommutativeSemiring = UnitalSemiring + MulCommutative;
///A semiring with a multiplicative inverse
pub trait DivisionSemiring = UnitalSemiring + MulGroup;

///An additive abelian group with a distributive and associative multiplication operation
pub trait Ring = Distributive + AddAbelianGroup + MulSemigroup;
///A ring with an identity element
pub trait UnitalRing = Ring + MulMonoid;
///A unital ring where multiplication is commutative
pub trait CommutativeRing = UnitalRing + MulCommutative;
///A ring with a multiplicative inverse
pub trait DivisionRing = UnitalRing + MulGroup;

///A unital semiring with no pairs of nonzero elements that multiply to zero
pub trait Semidomain = UnitalSemiring + Divisibility + NoZeroDivisors;
///A semidomain that is commutative
pub trait IntegralSemidomain = Semidomain + MulCommutative;
///An integral semidomain where every pair of elements has a greatest common divisor
pub trait GCDSemidomain = IntegralSemidomain + GCD;
///A GCD semidomain where every pair of elements is uniquely factorizable into irreducible elements (up to units)
pub trait UFSemidomain = GCDSemidomain + UniquelyFactorizable;
///A UF semidomain with a division algorithm for dividing with a remainder
pub trait EuclideanSemidomain = UFSemidomain + EuclideanDiv;

///A unital ring with no pairs of nonzero elements that multiply to zero
pub trait Domain = UnitalRing + Divisibility + NoZeroDivisors;
///A domain that is commutative
pub trait IntegralDomain = Domain + MulCommutative;
///A commutative ring where every pair of elements has a greatest common divisor
pub trait GCDDomain = IntegralDomain + GCD;
///A commutative ring where every pair of elements has a weighted sum to their GCD
pub trait BezoutDomain = GCDDomain + Bezout;
///A commutative ring that is uniquely factorizable into irreducible (up to units)
pub trait UFD = GCDDomain + UniquelyFactorizable;
///
///An integral domain where every ideal is generated by one element
///
///ie. a UFD that is Bezout
///
pub trait PID = UFD + BezoutDomain;
///A commutative ring with a division algorithm for dividing with a remainder
pub trait EuclideanDomain = PID + EuclideanDiv;

///A set that is both an additive and multiplicative abelian group where multiplication distributes
pub trait Field = CommutativeRing + MulGroup;
}
///A set that is both an additive and multiplicative abelian group where multiplication distributes
pub trait Field = CommutativeRing + MulGroup;

//
//Implementation for primitives
Expand Down
13 changes: 8 additions & 5 deletions src/analysis/metric.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,7 @@ pub trait Norm<K:UnitalRing, X:RingModule<K>, R:Real>: Seminorm<K,X,R> {}

pub trait InnerProduct<K:ComplexRing, M:RingModule<K>>: HermitianForm<K,M> + Norm<K,M,K::Real>{}

auto! {
pub trait NormedMetric<K,X,R> = Norm<K,X,R> + Metric<X,R> where K:UnitalRing, X:RingModule<K>, R:Real;
}
pub trait NormedMetric<K,X,R> = Norm<K,X,R> + Metric<X,R> where K:UnitalRing, X:RingModule<K>, R:Real;

///
///A metric on vector-spaces using the [inner product](InnerProductSpace) of two vectors
Expand Down Expand Up @@ -147,5 +145,10 @@ macro_rules! impl_metric {
}
)*}
}
impl_metric!(@float f32 f64);
impl_metric!(@int i32 i64);

// Necessary do to issue #60021
mod impls {
use super::{ ComplexSubset, InnerProductSpace };
impl_metric!(@float f32 f64);
impl_metric!(@int i32 i64);
}
Loading