use std::cast; use std::num::{Zero, One, Algebraic, Bounded}; use std::vec::{VecIterator, VecMutIterator}; use std::iterator::{Iterator, IteratorUtil, FromIterator}; use std::cmp::ApproxEq; use std::uint::iterate; use traits::iterable::{Iterable, IterableMut}; use traits::basis::Basis; use traits::dim::Dim; use traits::dot::Dot; use traits::sub_dot::SubDot; use traits::norm::Norm; use traits::translation::{Translation, Translatable}; use traits::scalar_op::{ScalarMul, ScalarDiv, ScalarAdd, ScalarSub}; use traits::ring::Ring; use traits::division_ring::DivisionRing; use traits::indexable::Indexable; use vec; impl vec::Vec0 { #[inline] pub fn new() -> vec::Vec0 { vec::Vec0 } } impl Indexable for vec::Vec0 { #[inline] pub fn at(&self, i: uint) -> N { unsafe { cast::transmute::<&vec::Vec0, &[N, ..0]>(self)[i].clone() } } #[inline] pub fn set(&mut self, i: uint, val: N) { unsafe { cast::transmute::<&mut vec::Vec0, &mut [N, ..0]>(self)[i] = val } } #[inline] pub fn swap(&mut self, i1: uint, i2: uint) { unsafe { cast::transmute::<&mut vec::Vec0, &mut [N, ..0]>(self).swap(i1, i2) } } } impl vec::Vec0 { #[inline] pub fn new_repeat(_: N) -> vec::Vec0 { vec::Vec0 } } impl Iterable for vec::Vec0 { fn iter<'l>(&'l self) -> VecIterator<'l, N> { unsafe { cast::transmute::<&'l vec::Vec0, &'l [N, ..0]>(self).iter() } } } impl IterableMut for vec::Vec0 { fn mut_iter<'l>(&'l mut self) -> VecMutIterator<'l, N> { unsafe { cast::transmute::<&'l mut vec::Vec0, &'l mut [N, ..0]>(self).mut_iter() } } } impl Dim for vec::Vec0 { #[inline] fn dim() -> uint { 0 } } impl> Basis for vec::Vec0 { pub fn canonical_basis(f: &fn(vec::Vec0)) { for iterate(0u, 0) |i| { let mut basis_element : vec::Vec0 = Zero::zero(); basis_element.set(i, One::one()); f(basis_element); } } pub fn orthonormal_subspace_basis(&self, f: &fn(vec::Vec0)) { // compute the basis of the orthogonal subspace using Gram-Schmidt // orthogonalization algorithm let mut basis: ~[vec::Vec0] = ~[]; for iterate(0u, 0) |i| { let mut basis_element : vec::Vec0 = Zero::zero(); basis_element.set(i, One::one()); if basis.len() == 0 - 1 { break; } let mut elt = basis_element.clone(); elt = elt - self.scalar_mul(&basis_element.dot(self)); for basis.iter().advance |v| { elt = elt - v.scalar_mul(&elt.dot(v)) }; if !elt.sqnorm().approx_eq(&Zero::zero()) { let new_element = elt.normalized(); f(new_element.clone()); basis.push(new_element); } } } } impl> Add, vec::Vec0> for vec::Vec0 { #[inline] fn add(&self, _: &vec::Vec0) -> vec::Vec0 { vec::Vec0 } } impl> Sub, vec::Vec0> for vec::Vec0 { #[inline] fn sub(&self, _: &vec::Vec0) -> vec::Vec0 { vec::Vec0 } } impl> Neg> for vec::Vec0 { #[inline] fn neg(&self) -> vec::Vec0 { vec::Vec0 } } impl Dot for vec::Vec0 { #[inline] fn dot(&self, _: &vec::Vec0) -> N { Zero::zero() } } impl SubDot for vec::Vec0 { #[inline] fn sub_dot(&self, _: &vec::Vec0, _: &vec::Vec0) -> N { Zero::zero() } } impl> ScalarMul for vec::Vec0 { #[inline] fn scalar_mul(&self, _: &N) -> vec::Vec0 { vec::Vec0 } #[inline] fn scalar_mul_inplace(&mut self, _: &N) { } } impl> ScalarDiv for vec::Vec0 { #[inline] fn scalar_div(&self, _: &N) -> vec::Vec0 { vec::Vec0 } #[inline] fn scalar_div_inplace(&mut self, _: &N) { } } impl> ScalarAdd for vec::Vec0 { #[inline] fn scalar_add(&self, _: &N) -> vec::Vec0 { vec::Vec0 } #[inline] fn scalar_add_inplace(&mut self, _: &N) { } } impl> ScalarSub for vec::Vec0 { #[inline] fn scalar_sub(&self, _: &N) -> vec::Vec0 { vec::Vec0 } #[inline] fn scalar_sub_inplace(&mut self, _: &N) { } } impl + Neg> Translation> for vec::Vec0 { #[inline] fn translation(&self) -> vec::Vec0 { self.clone() } #[inline] fn inv_translation(&self) -> vec::Vec0 { -self } #[inline] fn translate_by(&mut self, t: &vec::Vec0) { *self = *self + *t; } } impl + Neg + Clone> Translatable, vec::Vec0> for vec::Vec0 { #[inline] fn translated(&self, t: &vec::Vec0) -> vec::Vec0 { self + *t } } impl Norm for vec::Vec0 { #[inline] fn sqnorm(&self) -> N { self.dot(self) } #[inline] fn norm(&self) -> N { self.sqnorm().sqrt() } #[inline] fn normalized(&self) -> vec::Vec0 { let mut res : vec::Vec0 = self.clone(); res.normalize(); res } #[inline] fn normalize(&mut self) -> N { let l = self.norm(); self.scalar_div_inplace(&l); l } } impl> ApproxEq for vec::Vec0 { #[inline] fn approx_epsilon() -> N { ApproxEq::approx_epsilon::() } #[inline] fn approx_eq(&self, _: &vec::Vec0) -> bool { true } #[inline] fn approx_eq_eps(&self, _: &vec::Vec0, _: &N) -> bool { true } } impl One for vec::Vec0 { #[inline] fn one() -> vec::Vec0 { vec::Vec0 } } impl> FromIterator for vec::Vec0 { fn from_iterator(_: &mut Iter) -> vec::Vec0 { vec::Vec0 } } impl Bounded for vec::Vec0 { #[inline] fn max_value() -> vec::Vec0 { vec::Vec0 } #[inline] fn min_value() -> vec::Vec0 { vec::Vec0 } }