src/linops.rs

branch
dev
changeset 80
f802ddbabcfc
parent 67
d7c0f431cbd6
equal deleted inserted replaced
68:c5f70e767511 80:f802ddbabcfc
4 4
5 use numeric_literals::replace_float_literals; 5 use numeric_literals::replace_float_literals;
6 use std::marker::PhantomData; 6 use std::marker::PhantomData;
7 use serde::Serialize; 7 use serde::Serialize;
8 use crate::types::*; 8 use crate::types::*;
9 pub use crate::mapping::{Mapping, Space, Composition}; 9 pub use crate::mapping::{Mapping, Space, Composition, ArithmeticTrue};
10 use crate::direct_product::Pair; 10 use crate::direct_product::Pair;
11 use crate::instance::Instance; 11 use crate::instance::Instance;
12 use crate::norms::{NormExponent, PairNorm, L1, L2, Linfinity, Norm}; 12 use crate::norms::{NormExponent, PairNorm, L1, L2, Linfinity, Norm};
13 13
14 /// Trait for linear operators on `X`. 14 /// Trait for linear operators on `X`.
135 pub fn new() -> IdOp<X> { IdOp(PhantomData) } 135 pub fn new() -> IdOp<X> { IdOp(PhantomData) }
136 } 136 }
137 137
138 impl<X : Clone + Space> Mapping<X> for IdOp<X> { 138 impl<X : Clone + Space> Mapping<X> for IdOp<X> {
139 type Codomain = X; 139 type Codomain = X;
140 type ArithmeticOptIn = ArithmeticTrue;
140 141
141 fn apply<I : Instance<X>>(&self, x : I) -> X { 142 fn apply<I : Instance<X>>(&self, x : I) -> X {
142 x.own() 143 x.own()
143 } 144 }
144 } 145 }
202 } 203 }
203 } 204 }
204 205
205 impl<'a, F : Num, X : Space, XD, Y : AXPY<F> + Clone> Mapping<X> for ZeroOp<'a, X, XD, Y, F> { 206 impl<'a, F : Num, X : Space, XD, Y : AXPY<F> + Clone> Mapping<X> for ZeroOp<'a, X, XD, Y, F> {
206 type Codomain = Y; 207 type Codomain = Y;
208 type ArithmeticOptIn = ArithmeticTrue;
207 209
208 fn apply<I : Instance<X>>(&self, _x : I) -> Y { 210 fn apply<I : Instance<X>>(&self, _x : I) -> Y {
209 self.zero.clone() 211 self.zero.clone()
210 } 212 }
211 } 213 }
333 S::Codomain : Add<T::Codomain>, 335 S::Codomain : Add<T::Codomain>,
334 <S::Codomain as Add<T::Codomain>>::Output : Space, 336 <S::Codomain as Add<T::Codomain>>::Output : Space,
335 337
336 { 338 {
337 type Codomain = <S::Codomain as Add<T::Codomain>>::Output; 339 type Codomain = <S::Codomain as Add<T::Codomain>>::Output;
340 type ArithmeticOptIn = ArithmeticTrue;
338 341
339 fn apply<I : Instance<Pair<A, B>>>(&self, x : I) -> Self::Codomain { 342 fn apply<I : Instance<Pair<A, B>>>(&self, x : I) -> Self::Codomain {
340 let Pair(a, b) = x.decompose(); 343 let Pair(a, b) = x.decompose();
341 self.0.apply(a) + self.1.apply(b) 344 self.0.apply(a) + self.1.apply(b)
342 } 345 }
390 A : Space, 393 A : Space,
391 S : Mapping<A>, 394 S : Mapping<A>,
392 T : Mapping<A>, 395 T : Mapping<A>,
393 { 396 {
394 type Codomain = Pair<S::Codomain, T::Codomain>; 397 type Codomain = Pair<S::Codomain, T::Codomain>;
398 type ArithmeticOptIn = ArithmeticTrue;
395 399
396 fn apply<I : Instance<A>>(&self, a : I) -> Self::Codomain { 400 fn apply<I : Instance<A>>(&self, a : I) -> Self::Codomain {
397 Pair(self.0.apply(a.ref_instance()), self.1.apply(a)) 401 Pair(self.0.apply(a.ref_instance()), self.1.apply(a))
398 } 402 }
399 } 403 }
525 B : Space, 529 B : Space,
526 S : Mapping<A>, 530 S : Mapping<A>,
527 T : Mapping<B>, 531 T : Mapping<B>,
528 { 532 {
529 type Codomain = Pair<S::Codomain, T::Codomain>; 533 type Codomain = Pair<S::Codomain, T::Codomain>;
534 type ArithmeticOptIn = ArithmeticTrue;
530 535
531 fn apply<I : Instance<Pair<A, B>>>(&self, x : I) -> Self::Codomain { 536 fn apply<I : Instance<Pair<A, B>>>(&self, x : I) -> Self::Codomain {
532 let Pair(a, b) = x.decompose(); 537 let Pair(a, b) = x.decompose();
533 Pair(self.0.apply(a), self.1.apply(b)) 538 Pair(self.0.apply(a), self.1.apply(b))
534 } 539 }

mercurial