Mon, 01 Dec 2025 19:50:58 -0500
Implement Euclidean for f32 and f64
| 0 | 1 | /*! |
| 2 | Abstract linear operators. | |
| 3 | */ | |
| 4 | ||
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
5 | use crate::direct_product::Pair; |
|
110
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
6 | use crate::error::DynResult; |
|
185
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
7 | use crate::euclidean::StaticEuclidean; |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
8 | use crate::instance::Instance; |
| 150 | 9 | pub use crate::mapping::{ClosedSpace, Composition, DifferentiableImpl, Mapping, Space}; |
|
188
7f13c9924b30
Remove Norm trait bound from BoundedLinear
Tuomo Valkonen <tuomov@iki.fi>
parents:
186
diff
changeset
|
10 | use crate::norms::{HasDual, Linfinity, NormExponent, PairNorm, L1, L2}; |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
11 | use crate::types::*; |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
12 | use numeric_literals::replace_float_literals; |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
13 | use serde::Serialize; |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
14 | use std::marker::PhantomData; |
| 130 | 15 | use std::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign}; |
| 0 | 16 | |
| 17 | /// Trait for linear operators on `X`. | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
18 | pub trait Linear<X: Space>: Mapping<X> {} |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
19 | |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
20 | // impl<X: Space, A: Linear<X>> DifferentiableImpl<X> for A { |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
21 | // type Derivative = <Self as Mapping<X>>::Codomain; |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
22 | |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
23 | // /// Compute the differential of `self` at `x`, consuming the input. |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
24 | // fn differential_impl<I: Instance<X>>(&self, x: I) -> Self::Derivative { |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
25 | // self.apply(x) |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
26 | // } |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
27 | // } |
| 0 | 28 | |
| 150 | 29 | /// Vector spaces |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
30 | #[replace_float_literals(Self::Field::cast_from(literal))] |
| 150 | 31 | pub trait VectorSpace: |
| 164 | 32 | Space<Principal = Self::PrincipalV> |
| 33 | + Mul<Self::Field, Output = Self::PrincipalV> | |
| 34 | + Div<Self::Field, Output = Self::PrincipalV> | |
| 35 | + Add<Self, Output = Self::PrincipalV> | |
| 36 | + Add<Self::PrincipalV, Output = Self::PrincipalV> | |
| 37 | + Sub<Self, Output = Self::PrincipalV> | |
| 38 | + Sub<Self::PrincipalV, Output = Self::PrincipalV> | |
| 130 | 39 | + Neg |
| 164 | 40 | + for<'b> Add<&'b Self, Output = <Self as VectorSpace>::PrincipalV> |
| 41 | + for<'b> Sub<&'b Self, Output = <Self as VectorSpace>::PrincipalV> | |
| 150 | 42 | { |
| 164 | 43 | /// Underlying scalar field |
| 150 | 44 | type Field: Num; |
| 164 | 45 | |
| 46 | /// Principal form of the space; always equal to [`Space::Principal`], but with | |
| 47 | /// more traits guaranteed. | |
|
177
b071a1b484f8
AXPY implementation reductions
Tuomo Valkonen <tuomov@iki.fi>
parents:
171
diff
changeset
|
48 | /// |
|
b071a1b484f8
AXPY implementation reductions
Tuomo Valkonen <tuomov@iki.fi>
parents:
171
diff
changeset
|
49 | /// `PrincipalV` is only assumed to be `AXPY` for itself, as [`AXPY`] |
|
b071a1b484f8
AXPY implementation reductions
Tuomo Valkonen <tuomov@iki.fi>
parents:
171
diff
changeset
|
50 | /// uses [`Instance`] to apply all other variants and avoid problems |
|
b071a1b484f8
AXPY implementation reductions
Tuomo Valkonen <tuomov@iki.fi>
parents:
171
diff
changeset
|
51 | /// of choosing multiple implementations of the trait. |
| 164 | 52 | type PrincipalV: ClosedSpace |
| 150 | 53 | + AXPY< |
|
177
b071a1b484f8
AXPY implementation reductions
Tuomo Valkonen <tuomov@iki.fi>
parents:
171
diff
changeset
|
54 | Self::PrincipalV, |
| 150 | 55 | Field = Self::Field, |
| 164 | 56 | PrincipalV = Self::PrincipalV, |
| 57 | OwnedVariant = Self::PrincipalV, | |
| 58 | Principal = Self::PrincipalV, | |
| 150 | 59 | >; |
| 60 | ||
| 61 | /// Return a similar zero as `self`. | |
| 164 | 62 | fn similar_origin(&self) -> Self::PrincipalV; |
| 150 | 63 | // { |
| 64 | // self.make_origin_generator().make_origin() | |
| 65 | // } | |
| 66 | ||
| 67 | /// Return a similar zero as `x`. | |
| 164 | 68 | fn similar_origin_inst<I: Instance<Self>>(x: I) -> Self::PrincipalV { |
| 150 | 69 | x.eval(|xr| xr.similar_origin()) |
| 70 | } | |
| 71 | } | |
| 72 | ||
| 73 | /// Efficient in-place summation. | |
| 74 | #[replace_float_literals(Self::Field::cast_from(literal))] | |
| 75 | pub trait AXPY<X = Self>: | |
| 76 | VectorSpace | |
| 77 | + MulAssign<Self::Field> | |
| 78 | + DivAssign<Self::Field> | |
| 79 | + AddAssign<Self> | |
| 164 | 80 | + AddAssign<Self::PrincipalV> |
| 150 | 81 | + SubAssign<Self> |
| 164 | 82 | + SubAssign<Self::PrincipalV> |
| 151 | 83 | + for<'b> AddAssign<&'b Self> |
| 84 | + for<'b> SubAssign<&'b Self> | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
85 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
86 | X: Space, |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
87 | { |
| 0 | 88 | /// Computes `y = βy + αx`, where `y` is `Self`. |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
89 | fn axpy<I: Instance<X>>(&mut self, α: Self::Field, x: I, β: Self::Field); |
| 0 | 90 | |
| 91 | /// Copies `x` to `self`. | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
92 | fn copy_from<I: Instance<X>>(&mut self, x: I) { |
| 0 | 93 | self.axpy(1.0, x, 0.0) |
| 94 | } | |
| 95 | ||
| 5 | 96 | /// Computes `y = αx`, where `y` is `Self`. |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
97 | fn scale_from<I: Instance<X>>(&mut self, α: Self::Field, x: I) { |
| 0 | 98 | self.axpy(α, x, 0.0) |
| 99 | } | |
|
62
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
100 | |
|
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
101 | /// Set self to zero. |
|
d8305c9b6fdf
Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents:
61
diff
changeset
|
102 | fn set_zero(&mut self); |
| 0 | 103 | } |
| 104 | ||
| 164 | 105 | pub trait ClosedVectorSpace: Instance<Self> + VectorSpace<PrincipalV = Self> {} |
| 106 | impl<X: Instance<X> + VectorSpace<PrincipalV = Self>> ClosedVectorSpace for X {} | |
| 151 | 107 | |
| 0 | 108 | /// Efficient in-place application for [`Linear`] operators. |
| 109 | #[replace_float_literals(F::cast_from(literal))] | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
110 | pub trait GEMV<F: Num, X: Space, Y = <Self as Mapping<X>>::Codomain>: Linear<X> { |
| 5 | 111 | /// Computes `y = αAx + βy`, where `A` is `Self`. |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
112 | fn gemv<I: Instance<X>>(&self, y: &mut Y, α: F, x: I, β: F); |
| 0 | 113 | |
| 67 | 114 | #[inline] |
| 5 | 115 | /// Computes `y = Ax`, where `A` is `Self` |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
116 | fn apply_mut<I: Instance<X>>(&self, y: &mut Y, x: I) { |
| 0 | 117 | self.gemv(y, 1.0, x, 0.0) |
| 118 | } | |
| 119 | ||
| 67 | 120 | #[inline] |
| 5 | 121 | /// Computes `y += Ax`, where `A` is `Self` |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
122 | fn apply_add<I: Instance<X>>(&self, y: &mut Y, x: I) { |
| 0 | 123 | self.gemv(y, 1.0, x, 1.0) |
| 124 | } | |
| 125 | } | |
| 126 | ||
| 127 | /// Bounded linear operators | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
128 | pub trait BoundedLinear<X, XExp, CodExp, F = f64>: Linear<X> |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
129 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
130 | F: Num, |
|
188
7f13c9924b30
Remove Norm trait bound from BoundedLinear
Tuomo Valkonen <tuomov@iki.fi>
parents:
186
diff
changeset
|
131 | X: Space, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
132 | XExp: NormExponent, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
133 | CodExp: NormExponent, |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
134 | { |
| 0 | 135 | /// A bound on the operator norm $\|A\|$ for the linear operator $A$=`self`. |
| 136 | /// This is not expected to be the norm, just any bound on it that can be | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
137 | /// reasonably implemented. The [`NormExponent`] `xexp` indicates the norm |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
138 | /// in `X`, and `codexp` in the codomain. |
|
110
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
139 | /// |
|
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
140 | /// This may fail with an error if the bound is for some reason incalculable. |
|
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
141 | fn opnorm_bound(&self, xexp: XExp, codexp: CodExp) -> DynResult<F>; |
| 0 | 142 | } |
| 143 | ||
| 5 | 144 | // Linear operator application into mutable target. The [`AsRef`] bound |
| 145 | // is used to guarantee compatibility with `Yʹ` and `Self::Codomain`; | |
| 146 | // the former is assumed to be e.g. a view into the latter. | |
| 0 | 147 | |
| 148 | /*impl<X,Y,T> Fn(&X) -> Y for T where T : Linear<X,Codomain=Y> { | |
| 149 | fn call(&self, x : &X) -> Y { | |
| 150 | self.apply(x) | |
| 151 | } | |
| 152 | }*/ | |
| 153 | ||
| 5 | 154 | /// Trait for forming the adjoint operator of `Self`. |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
155 | pub trait Adjointable<X, Yʹ>: Linear<X> |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
156 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
157 | X: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
158 | Yʹ: Space, |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
159 | { |
|
184
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
160 | /// Codomain of the adjoint operator. |
| 151 | 161 | type AdjointCodomain: ClosedSpace; |
|
184
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
162 | /// Type of the adjoint operator. |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
163 | type Adjoint<'a>: Linear<Yʹ, Codomain = Self::AdjointCodomain> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
164 | where |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
165 | Self: 'a; |
| 0 | 166 | |
| 167 | /// Form the adjoint operator of `self`. | |
| 168 | fn adjoint(&self) -> Self::Adjoint<'_>; | |
| 169 | } | |
| 170 | ||
|
184
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
171 | /// Variant of [`Adjointable`] where the adjoint does not depend on a lifetime parameter. |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
172 | /// This exists due to restrictions of Rust's type system: if `A :: Adjointable`, and we make |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
173 | /// further restrictions on the adjoint operator, through, e.g. |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
174 | /// ``` |
|
185
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
175 | /// for<'a> A::Adjoint<'a> : GEMV<F, Z, Y>, |
|
184
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
176 | /// ``` |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
177 | /// Then `'static` lifetime is forced on `X`. Having `A::SimpleAdjoint` not depend on `'a` |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
178 | /// avoids this, but makes it impossible for the adjoint to be just a light wrapper around the |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
179 | /// original operator. |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
180 | pub trait SimplyAdjointable<X, Yʹ>: Linear<X> |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
181 | where |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
182 | X: Space, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
183 | Yʹ: Space, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
184 | { |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
185 | /// Codomain of the adjoint operator. |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
186 | type AdjointCodomain: ClosedSpace; |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
187 | /// Type of the adjoint operator. |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
188 | type SimpleAdjoint: Linear<Yʹ, Codomain = Self::AdjointCodomain>; |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
189 | |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
190 | /// Form the adjoint operator of `self`. |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
191 | fn adjoint(&self) -> Self::SimpleAdjoint; |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
192 | } |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
193 | |
| 5 | 194 | /// Trait for forming a preadjoint of an operator. |
| 195 | /// | |
|
8
4e09b7829b51
Multithreaded bisection tree operations
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
196 | /// For an operator $A$ this is an operator $A\_\*$ |
|
4e09b7829b51
Multithreaded bisection tree operations
Tuomo Valkonen <tuomov@iki.fi>
parents:
5
diff
changeset
|
197 | /// such that its adjoint $(A\_\*)^\*=A$. The space `X` is the domain of the `Self` |
| 0 | 198 | /// operator. The space `Ypre` is the predual of its codomain, and should be the |
| 199 | /// domain of the adjointed operator. `Self::Preadjoint` should be | |
| 200 | /// [`Adjointable`]`<'a,Ypre,X>`. | |
|
65
9327d544ca0b
Reduce preadjointing constraints
Tuomo Valkonen <tuomov@iki.fi>
parents:
62
diff
changeset
|
201 | /// We do not make additional restrictions on `Self::Preadjoint` (in particular, it |
|
9327d544ca0b
Reduce preadjointing constraints
Tuomo Valkonen <tuomov@iki.fi>
parents:
62
diff
changeset
|
202 | /// does not have to be adjointable) to allow `X` to be a subspace yet the preadjoint |
|
9327d544ca0b
Reduce preadjointing constraints
Tuomo Valkonen <tuomov@iki.fi>
parents:
62
diff
changeset
|
203 | /// have the full space as the codomain, etc. |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
204 | pub trait Preadjointable<X: Space, Ypre: Space = <Self as Mapping<X>>::Codomain>: |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
205 | Linear<X> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
206 | { |
| 151 | 207 | type PreadjointCodomain: ClosedSpace; |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
208 | type Preadjoint<'a>: Linear<Ypre, Codomain = Self::PreadjointCodomain> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
209 | where |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
210 | Self: 'a; |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
211 | |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
212 | /// Form the adjoint operator of `self`. |
| 0 | 213 | fn preadjoint(&self) -> Self::Preadjoint<'_>; |
| 214 | } | |
| 215 | ||
| 216 | /// The identity operator | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
217 | #[derive(Clone, Copy, Debug, Serialize, Eq, PartialEq)] |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
218 | pub struct IdOp<X>(PhantomData<X>); |
|
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
8
diff
changeset
|
219 | |
|
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
8
diff
changeset
|
220 | impl<X> IdOp<X> { |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
221 | pub fn new() -> IdOp<X> { |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
222 | IdOp(PhantomData) |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
223 | } |
|
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
8
diff
changeset
|
224 | } |
|
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
8
diff
changeset
|
225 | |
| 150 | 226 | impl<X: Space> Mapping<X> for IdOp<X> { |
| 164 | 227 | type Codomain = X::Principal; |
| 0 | 228 | |
| 151 | 229 | fn apply<I: Instance<X>>(&self, x: I) -> Self::Codomain { |
| 168 | 230 | x.own() |
|
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
8
diff
changeset
|
231 | } |
|
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
8
diff
changeset
|
232 | } |
|
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
8
diff
changeset
|
233 | |
| 150 | 234 | impl<X: Space> Linear<X> for IdOp<X> {} |
|
13
465fa2121ccb
Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents:
8
diff
changeset
|
235 | |
| 0 | 236 | #[replace_float_literals(F::cast_from(literal))] |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
237 | impl<F: Num, X, Y> GEMV<F, X, Y> for IdOp<X> |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
238 | where |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
239 | Y: AXPY<X, Field = F>, |
| 150 | 240 | X: Space, |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
241 | { |
| 0 | 242 | // Computes `y = αAx + βy`, where `A` is `Self`. |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
243 | fn gemv<I: Instance<X>>(&self, y: &mut Y, α: F, x: I, β: F) { |
| 0 | 244 | y.axpy(α, x, β) |
| 245 | } | |
| 246 | ||
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
247 | fn apply_mut<I: Instance<X>>(&self, y: &mut Y, x: I) { |
| 0 | 248 | y.copy_from(x); |
| 249 | } | |
| 250 | } | |
| 251 | ||
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
252 | impl<F, X, E> BoundedLinear<X, E, E, F> for IdOp<X> |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
253 | where |
|
188
7f13c9924b30
Remove Norm trait bound from BoundedLinear
Tuomo Valkonen <tuomov@iki.fi>
parents:
186
diff
changeset
|
254 | X: Space + Clone, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
255 | F: Num, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
256 | E: NormExponent, |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
257 | { |
|
110
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
258 | fn opnorm_bound(&self, _xexp: E, _codexp: E) -> DynResult<F> { |
|
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
259 | Ok(F::ONE) |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
260 | } |
| 0 | 261 | } |
| 262 | ||
| 164 | 263 | impl<X: Clone + Space> Adjointable<X, X::Principal> for IdOp<X> { |
| 264 | type AdjointCodomain = X::Principal; | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
265 | type Adjoint<'a> |
| 164 | 266 | = IdOp<X::Principal> |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
267 | where |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
268 | X: 'a; |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
269 | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
270 | fn adjoint(&self) -> Self::Adjoint<'_> { |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
271 | IdOp::new() |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
272 | } |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
273 | } |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
274 | |
|
184
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
275 | impl<X: Clone + Space> SimplyAdjointable<X, X::Principal> for IdOp<X> { |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
276 | type AdjointCodomain = X::Principal; |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
277 | type SimpleAdjoint = IdOp<X::Principal>; |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
278 | |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
279 | fn adjoint(&self) -> Self::SimpleAdjoint { |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
280 | IdOp::new() |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
281 | } |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
282 | } |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
283 | |
| 164 | 284 | impl<X: Clone + Space> Preadjointable<X, X::Principal> for IdOp<X> { |
| 285 | type PreadjointCodomain = X::Principal; | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
286 | type Preadjoint<'a> |
| 164 | 287 | = IdOp<X::Principal> |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
288 | where |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
289 | X: 'a; |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
290 | |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
291 | fn preadjoint(&self) -> Self::Preadjoint<'_> { |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
292 | IdOp::new() |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
293 | } |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
294 | } |
| 61 | 295 | |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
296 | /// The zero operator from a space to itself |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
297 | #[derive(Clone, Copy, Debug, Serialize, Eq, PartialEq)] |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
298 | pub struct SimpleZeroOp; |
| 66 | 299 | |
| 150 | 300 | impl<X: VectorSpace> Mapping<X> for SimpleZeroOp { |
| 164 | 301 | type Codomain = X::PrincipalV; |
| 66 | 302 | |
| 164 | 303 | fn apply<I: Instance<X>>(&self, x: I) -> X::PrincipalV { |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
304 | X::similar_origin_inst(x) |
| 66 | 305 | } |
| 306 | } | |
| 307 | ||
| 150 | 308 | impl<X: VectorSpace> Linear<X> for SimpleZeroOp {} |
| 66 | 309 | |
| 310 | #[replace_float_literals(F::cast_from(literal))] | |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
311 | impl<X, Y, F> GEMV<F, X, Y> for SimpleZeroOp |
| 66 | 312 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
313 | F: Num, |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
314 | Y: AXPY<Field = F>, |
| 150 | 315 | X: VectorSpace<Field = F> + Instance<X>, |
| 66 | 316 | { |
| 317 | // Computes `y = αAx + βy`, where `A` is `Self`. | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
318 | fn gemv<I: Instance<X>>(&self, y: &mut Y, _α: F, _x: I, β: F) { |
| 66 | 319 | *y *= β; |
| 320 | } | |
| 321 | ||
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
322 | fn apply_mut<I: Instance<X>>(&self, y: &mut Y, _x: I) { |
| 66 | 323 | y.set_zero(); |
| 324 | } | |
| 325 | } | |
| 326 | ||
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
327 | impl<X, F, E1, E2> BoundedLinear<X, E1, E2, F> for SimpleZeroOp |
| 66 | 328 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
329 | F: Num, |
|
188
7f13c9924b30
Remove Norm trait bound from BoundedLinear
Tuomo Valkonen <tuomov@iki.fi>
parents:
186
diff
changeset
|
330 | X: VectorSpace<Field = F>, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
331 | E1: NormExponent, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
332 | E2: NormExponent, |
| 66 | 333 | { |
|
110
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
334 | fn opnorm_bound(&self, _xexp: E1, _codexp: E2) -> DynResult<F> { |
|
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
335 | Ok(F::ZERO) |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
336 | } |
| 66 | 337 | } |
| 338 | ||
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
339 | impl<X, F> Adjointable<X, X::DualSpace> for SimpleZeroOp |
| 66 | 340 | where |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
341 | F: Num, |
| 150 | 342 | X: VectorSpace<Field = F> + HasDual<F>, |
| 151 | 343 | X::DualSpace: ClosedVectorSpace, |
| 66 | 344 | { |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
345 | type AdjointCodomain = X::DualSpace; |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
346 | type Adjoint<'b> |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
347 | = SimpleZeroOp |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
348 | where |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
349 | Self: 'b; |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
350 | // () means not (pre)adjointable. |
| 66 | 351 | |
| 352 | fn adjoint(&self) -> Self::Adjoint<'_> { | |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
353 | SimpleZeroOp |
|
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
354 | } |
|
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
355 | } |
|
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
356 | |
| 150 | 357 | pub trait OriginGenerator<Y: VectorSpace> { |
| 140 | 358 | type Ref<'b>: OriginGenerator<Y> |
| 359 | where | |
| 360 | Self: 'b; | |
| 361 | ||
| 164 | 362 | fn origin(&self) -> Y::PrincipalV; |
| 140 | 363 | fn as_ref(&self) -> Self::Ref<'_>; |
| 364 | } | |
| 365 | ||
|
185
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
366 | #[derive(Copy, Clone, Debug)] |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
367 | pub struct StaticEuclideanOriginGenerator; |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
368 | |
|
186
afe04e6b4a5b
StaticEuclidean Principal reference fix
Tuomo Valkonen <tuomov@iki.fi>
parents:
185
diff
changeset
|
369 | impl<Y: StaticEuclidean<F, Field = F>, F: Float> OriginGenerator<Y> |
|
afe04e6b4a5b
StaticEuclidean Principal reference fix
Tuomo Valkonen <tuomov@iki.fi>
parents:
185
diff
changeset
|
370 | for StaticEuclideanOriginGenerator |
|
afe04e6b4a5b
StaticEuclidean Principal reference fix
Tuomo Valkonen <tuomov@iki.fi>
parents:
185
diff
changeset
|
371 | { |
|
185
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
372 | type Ref<'b> |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
373 | = Self |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
374 | where |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
375 | Self: 'b; |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
376 | |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
377 | #[inline] |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
378 | fn origin(&self) -> Y::PrincipalV { |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
379 | return Y::origin(); |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
380 | } |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
381 | |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
382 | #[inline] |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
383 | fn as_ref(&self) -> Self::Ref<'_> { |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
384 | *self |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
385 | } |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
386 | } |
|
e6829fbe2737
StaticEuclideanOriginGenerator
Tuomo Valkonen <tuomov@iki.fi>
parents:
184
diff
changeset
|
387 | |
| 150 | 388 | impl<Y: VectorSpace> OriginGenerator<Y> for Y { |
| 140 | 389 | type Ref<'b> |
| 390 | = &'b Y | |
| 391 | where | |
| 392 | Self: 'b; | |
| 393 | ||
| 394 | #[inline] | |
| 164 | 395 | fn origin(&self) -> Y::PrincipalV { |
| 140 | 396 | return self.similar_origin(); |
| 397 | } | |
| 398 | ||
| 399 | #[inline] | |
| 400 | fn as_ref(&self) -> Self::Ref<'_> { | |
| 401 | self | |
| 402 | } | |
| 403 | } | |
| 404 | ||
| 150 | 405 | impl<'b, Y: VectorSpace> OriginGenerator<Y> for &'b Y { |
| 140 | 406 | type Ref<'c> |
| 407 | = Self | |
| 408 | where | |
| 409 | Self: 'c; | |
| 410 | ||
| 411 | #[inline] | |
| 164 | 412 | fn origin(&self) -> Y::PrincipalV { |
| 140 | 413 | return self.similar_origin(); |
| 414 | } | |
| 415 | ||
| 416 | #[inline] | |
| 417 | fn as_ref(&self) -> Self::Ref<'_> { | |
| 418 | self | |
| 419 | } | |
| 420 | } | |
| 421 | ||
| 139 | 422 | /// A zero operator that can be eitherh dualised or predualised (once). |
| 423 | /// This is achieved by storing an oppropriate zero. | |
| 150 | 424 | pub struct ZeroOp<X, Y: VectorSpace<Field = F>, OY: OriginGenerator<Y>, O, F: Float = f64> { |
| 140 | 425 | codomain_origin_generator: OY, |
| 426 | other_origin_generator: O, | |
| 139 | 427 | _phantoms: PhantomData<(X, Y, F)>, |
| 428 | } | |
| 429 | ||
| 140 | 430 | impl<X, Y, OY, F> ZeroOp<X, Y, OY, (), F> |
| 139 | 431 | where |
| 140 | 432 | OY: OriginGenerator<Y>, |
| 150 | 433 | X: VectorSpace<Field = F>, |
| 434 | Y: VectorSpace<Field = F>, | |
| 139 | 435 | F: Float, |
| 436 | { | |
| 140 | 437 | pub fn new(y_og: OY) -> Self { |
| 139 | 438 | ZeroOp { |
| 140 | 439 | codomain_origin_generator: y_og, |
| 440 | other_origin_generator: (), | |
| 139 | 441 | _phantoms: PhantomData, |
| 442 | } | |
| 443 | } | |
| 444 | } | |
| 445 | ||
| 140 | 446 | impl<X, Y, OY, OXprime, Xprime, Yprime, F> ZeroOp<X, Y, OY, OXprime, F> |
| 447 | where | |
| 448 | OY: OriginGenerator<Y>, | |
| 449 | OXprime: OriginGenerator<Xprime>, | |
| 450 | X: HasDual<F, DualSpace = Xprime>, | |
| 451 | Y: HasDual<F, DualSpace = Yprime>, | |
| 452 | F: Float, | |
| 164 | 453 | Xprime: VectorSpace<Field = F, PrincipalV = Xprime>, |
| 454 | Xprime::PrincipalV: AXPY<Field = F>, | |
| 140 | 455 | Yprime: Space + Instance<Yprime>, |
| 456 | { | |
| 457 | pub fn new_dualisable(y_og: OY, xprime_og: OXprime) -> Self { | |
| 458 | ZeroOp { | |
| 459 | codomain_origin_generator: y_og, | |
| 460 | other_origin_generator: xprime_og, | |
| 461 | _phantoms: PhantomData, | |
| 462 | } | |
| 463 | } | |
| 464 | } | |
| 465 | ||
| 466 | impl<X, Y, O, OY, F> Mapping<X> for ZeroOp<X, Y, OY, O, F> | |
| 139 | 467 | where |
| 150 | 468 | X: Space, |
| 469 | Y: VectorSpace<Field = F>, | |
| 139 | 470 | F: Float, |
| 140 | 471 | OY: OriginGenerator<Y>, |
| 139 | 472 | { |
| 164 | 473 | type Codomain = Y::PrincipalV; |
| 139 | 474 | |
| 164 | 475 | fn apply<I: Instance<X>>(&self, _x: I) -> Y::PrincipalV { |
| 140 | 476 | self.codomain_origin_generator.origin() |
| 139 | 477 | } |
| 478 | } | |
| 479 | ||
| 140 | 480 | impl<X, Y, OY, O, F> Linear<X> for ZeroOp<X, Y, OY, O, F> |
| 139 | 481 | where |
| 150 | 482 | X: Space, |
| 483 | Y: VectorSpace<Field = F>, | |
| 139 | 484 | F: Float, |
| 140 | 485 | OY: OriginGenerator<Y>, |
| 139 | 486 | { |
| 487 | } | |
| 488 | ||
| 489 | #[replace_float_literals(F::cast_from(literal))] | |
| 140 | 490 | impl<X, Y, OY, O, F> GEMV<F, X, Y> for ZeroOp<X, Y, OY, O, F> |
| 139 | 491 | where |
| 150 | 492 | X: Space, |
| 164 | 493 | Y: AXPY<Field = F, PrincipalV = Y>, |
| 139 | 494 | F: Float, |
| 140 | 495 | OY: OriginGenerator<Y>, |
| 139 | 496 | { |
| 497 | // Computes `y = αAx + βy`, where `A` is `Self`. | |
| 498 | fn gemv<I: Instance<X>>(&self, y: &mut Y, _α: F, _x: I, β: F) { | |
| 499 | *y *= β; | |
| 500 | } | |
| 501 | ||
| 502 | fn apply_mut<I: Instance<X>>(&self, y: &mut Y, _x: I) { | |
| 503 | y.set_zero(); | |
| 504 | } | |
| 505 | } | |
| 506 | ||
| 140 | 507 | impl<X, Y, OY, O, F, E1, E2> BoundedLinear<X, E1, E2, F> for ZeroOp<X, Y, OY, O, F> |
| 139 | 508 | where |
|
188
7f13c9924b30
Remove Norm trait bound from BoundedLinear
Tuomo Valkonen <tuomov@iki.fi>
parents:
186
diff
changeset
|
509 | X: Space + Instance<X>, |
| 150 | 510 | Y: VectorSpace<Field = F>, |
| 164 | 511 | Y::PrincipalV: Clone, |
| 139 | 512 | F: Float, |
| 513 | E1: NormExponent, | |
| 514 | E2: NormExponent, | |
| 140 | 515 | OY: OriginGenerator<Y>, |
| 139 | 516 | { |
| 517 | fn opnorm_bound(&self, _xexp: E1, _codexp: E2) -> DynResult<F> { | |
| 518 | Ok(F::ZERO) | |
| 519 | } | |
| 520 | } | |
| 521 | ||
| 140 | 522 | impl<'b, X, Y, OY, OXprime, Xprime, Yprime, F> Adjointable<X, Yprime> |
| 523 | for ZeroOp<X, Y, OY, OXprime, F> | |
| 139 | 524 | where |
| 525 | X: HasDual<F, DualSpace = Xprime>, | |
| 526 | Y: HasDual<F, DualSpace = Yprime>, | |
| 527 | F: Float, | |
| 151 | 528 | Xprime: ClosedVectorSpace<Field = F>, |
| 529 | //Xprime::Owned: AXPY<Field = F>, | |
| 530 | Yprime: ClosedSpace, | |
| 140 | 531 | OY: OriginGenerator<Y>, |
| 532 | OXprime: OriginGenerator<X::DualSpace>, | |
| 139 | 533 | { |
| 534 | type AdjointCodomain = Xprime; | |
| 535 | type Adjoint<'c> | |
| 140 | 536 | = ZeroOp<Yprime, Xprime, OXprime::Ref<'c>, (), F> |
| 139 | 537 | where |
| 538 | Self: 'c; | |
| 539 | // () means not (pre)adjointable. | |
| 540 | ||
| 541 | fn adjoint(&self) -> Self::Adjoint<'_> { | |
| 542 | ZeroOp { | |
| 140 | 543 | codomain_origin_generator: self.other_origin_generator.as_ref(), |
| 544 | other_origin_generator: (), | |
|
129
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
545 | _phantoms: PhantomData, |
|
d2994e34a5f5
Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.
Tuomo Valkonen <tuomov@iki.fi>
parents:
124
diff
changeset
|
546 | } |
| 66 | 547 | } |
| 548 | } | |
| 549 | ||
|
184
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
550 | impl<'b, X, Y, OY, OXprime, Xprime, Yprime, F> SimplyAdjointable<X, Yprime> |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
551 | for ZeroOp<X, Y, OY, OXprime, F> |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
552 | where |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
553 | X: HasDual<F, DualSpace = Xprime>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
554 | Y: HasDual<F, DualSpace = Yprime>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
555 | F: Float, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
556 | Xprime: ClosedVectorSpace<Field = F>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
557 | //Xprime::Owned: AXPY<Field = F>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
558 | Yprime: ClosedSpace, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
559 | OY: OriginGenerator<Y>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
560 | OXprime: OriginGenerator<X::DualSpace> + Clone, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
561 | { |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
562 | type AdjointCodomain = Xprime; |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
563 | type SimpleAdjoint = ZeroOp<Yprime, Xprime, OXprime, (), F>; |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
564 | // () means not (pre)adjointable. |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
565 | |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
566 | fn adjoint(&self) -> Self::SimpleAdjoint { |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
567 | ZeroOp { |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
568 | codomain_origin_generator: self.other_origin_generator.clone(), |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
569 | other_origin_generator: (), |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
570 | _phantoms: PhantomData, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
571 | } |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
572 | } |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
573 | } |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
574 | |
| 61 | 575 | impl<S, T, E, X> Linear<X> for Composition<S, T, E> |
| 576 | where | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
577 | X: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
578 | T: Linear<X>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
579 | S: Linear<T::Codomain>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
580 | { |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
581 | } |
| 61 | 582 | |
| 583 | impl<F, S, T, E, X, Y> GEMV<F, X, Y> for Composition<S, T, E> | |
| 584 | where | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
585 | F: Num, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
586 | X: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
587 | T: Linear<X>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
588 | S: GEMV<F, T::Codomain, Y>, |
| 61 | 589 | { |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
590 | fn gemv<I: Instance<X>>(&self, y: &mut Y, α: F, x: I, β: F) { |
| 61 | 591 | self.outer.gemv(y, α, self.inner.apply(x), β) |
| 592 | } | |
| 593 | ||
| 594 | /// Computes `y = Ax`, where `A` is `Self` | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
595 | fn apply_mut<I: Instance<X>>(&self, y: &mut Y, x: I) { |
| 61 | 596 | self.outer.apply_mut(y, self.inner.apply(x)) |
| 597 | } | |
| 598 | ||
| 599 | /// Computes `y += Ax`, where `A` is `Self` | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
600 | fn apply_add<I: Instance<X>>(&self, y: &mut Y, x: I) { |
| 61 | 601 | self.outer.apply_add(y, self.inner.apply(x)) |
| 602 | } | |
| 603 | } | |
| 604 | ||
| 605 | impl<F, S, T, X, Z, Xexp, Yexp, Zexp> BoundedLinear<X, Xexp, Yexp, F> for Composition<S, T, Zexp> | |
| 606 | where | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
607 | F: Num, |
|
188
7f13c9924b30
Remove Norm trait bound from BoundedLinear
Tuomo Valkonen <tuomov@iki.fi>
parents:
186
diff
changeset
|
608 | X: Space, |
|
7f13c9924b30
Remove Norm trait bound from BoundedLinear
Tuomo Valkonen <tuomov@iki.fi>
parents:
186
diff
changeset
|
609 | Z: Space, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
610 | Xexp: NormExponent, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
611 | Yexp: NormExponent, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
612 | Zexp: NormExponent, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
613 | T: BoundedLinear<X, Xexp, Zexp, F, Codomain = Z>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
614 | S: BoundedLinear<Z, Zexp, Yexp, F>, |
| 61 | 615 | { |
|
110
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
616 | fn opnorm_bound(&self, xexp: Xexp, yexp: Yexp) -> DynResult<F> { |
| 61 | 617 | let zexp = self.intermediate_norm_exponent; |
|
110
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
618 | Ok(self.outer.opnorm_bound(zexp, yexp)? * self.inner.opnorm_bound(xexp, zexp)?) |
| 61 | 619 | } |
| 620 | } | |
| 621 | ||
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
622 | /// “Row operator” $(S, T)$; $(S, T)(x, y)=Sx + Ty$. |
| 101 | 623 | #[derive(Clone, Copy, Debug, Serialize, Eq, PartialEq)] |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
624 | pub struct RowOp<S, T>(pub S, pub T); |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
625 | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
626 | impl<A, B, S, T> Mapping<Pair<A, B>> for RowOp<S, T> |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
627 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
628 | A: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
629 | B: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
630 | S: Mapping<A>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
631 | T: Mapping<B>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
632 | S::Codomain: Add<T::Codomain>, |
| 151 | 633 | <S::Codomain as Add<T::Codomain>>::Output: ClosedSpace, |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
634 | { |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
635 | type Codomain = <S::Codomain as Add<T::Codomain>>::Output; |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
636 | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
637 | fn apply<I: Instance<Pair<A, B>>>(&self, x: I) -> Self::Codomain { |
|
133
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
638 | x.eval_decompose(|Pair(a, b)| self.0.apply(a) + self.1.apply(b)) |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
639 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
640 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
641 | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
642 | impl<A, B, S, T> Linear<Pair<A, B>> for RowOp<S, T> |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
643 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
644 | A: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
645 | B: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
646 | S: Linear<A>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
647 | T: Linear<B>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
648 | S::Codomain: Add<T::Codomain>, |
| 151 | 649 | <S::Codomain as Add<T::Codomain>>::Output: ClosedSpace, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
650 | { |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
651 | } |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
652 | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
653 | impl<'b, F, S, T, Y, U, V> GEMV<F, Pair<U, V>, Y> for RowOp<S, T> |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
654 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
655 | U: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
656 | V: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
657 | S: GEMV<F, U, Y>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
658 | T: GEMV<F, V, Y>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
659 | F: Num, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
660 | Self: Linear<Pair<U, V>, Codomain = Y>, |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
661 | { |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
662 | fn gemv<I: Instance<Pair<U, V>>>(&self, y: &mut Y, α: F, x: I, β: F) { |
|
133
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
663 | x.eval_decompose(|Pair(u, v)| { |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
664 | self.0.gemv(y, α, u, β); |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
665 | self.1.gemv(y, α, v, F::ONE); |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
666 | }) |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
667 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
668 | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
669 | fn apply_mut<I: Instance<Pair<U, V>>>(&self, y: &mut Y, x: I) { |
|
133
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
670 | x.eval_decompose(|Pair(u, v)| { |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
671 | self.0.apply_mut(y, u); |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
672 | self.1.apply_add(y, v); |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
673 | }) |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
674 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
675 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
676 | /// Computes `y += Ax`, where `A` is `Self` |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
677 | fn apply_add<I: Instance<Pair<U, V>>>(&self, y: &mut Y, x: I) { |
|
133
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
678 | x.eval_decompose(|Pair(u, v)| { |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
679 | self.0.apply_add(y, u); |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
680 | self.1.apply_add(y, v); |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
681 | }) |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
682 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
683 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
684 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
685 | /// “Column operator” $(S; T)$; $(S; T)x=(Sx, Tx)$. |
| 101 | 686 | #[derive(Clone, Copy, Debug, Serialize, Eq, PartialEq)] |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
687 | pub struct ColOp<S, T>(pub S, pub T); |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
688 | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
689 | impl<A, S, T> Mapping<A> for ColOp<S, T> |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
690 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
691 | A: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
692 | S: Mapping<A>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
693 | T: Mapping<A>, |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
694 | { |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
695 | type Codomain = Pair<S::Codomain, T::Codomain>; |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
696 | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
697 | fn apply<I: Instance<A>>(&self, a: I) -> Self::Codomain { |
| 171 | 698 | Pair(a.eval_ref(|r| self.0.apply(r)), self.1.apply(a)) |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
699 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
700 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
701 | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
702 | impl<A, S, T> Linear<A> for ColOp<S, T> |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
703 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
704 | A: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
705 | S: Mapping<A>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
706 | T: Mapping<A>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
707 | { |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
708 | } |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
709 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
710 | impl<F, S, T, A, B, X> GEMV<F, X, Pair<A, B>> for ColOp<S, T> |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
711 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
712 | X: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
713 | S: GEMV<F, X, A>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
714 | T: GEMV<F, X, B>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
715 | F: Num, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
716 | Self: Linear<X, Codomain = Pair<A, B>>, |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
717 | { |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
718 | fn gemv<I: Instance<X>>(&self, y: &mut Pair<A, B>, α: F, x: I, β: F) { |
| 171 | 719 | x.eval_ref(|r| self.0.gemv(&mut y.0, α, r, β)); |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
720 | self.1.gemv(&mut y.1, α, x, β); |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
721 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
722 | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
723 | fn apply_mut<I: Instance<X>>(&self, y: &mut Pair<A, B>, x: I) { |
| 171 | 724 | x.eval_ref(|r| self.0.apply_mut(&mut y.0, r)); |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
725 | self.1.apply_mut(&mut y.1, x); |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
726 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
727 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
728 | /// Computes `y += Ax`, where `A` is `Self` |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
729 | fn apply_add<I: Instance<X>>(&self, y: &mut Pair<A, B>, x: I) { |
| 171 | 730 | x.eval_ref(|r| self.0.apply_add(&mut y.0, r)); |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
731 | self.1.apply_add(&mut y.1, x); |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
732 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
733 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
734 | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
735 | impl<A, B, Yʹ, S, T> Adjointable<Pair<A, B>, Yʹ> for RowOp<S, T> |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
736 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
737 | A: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
738 | B: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
739 | Yʹ: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
740 | S: Adjointable<A, Yʹ>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
741 | T: Adjointable<B, Yʹ>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
742 | Self: Linear<Pair<A, B>>, |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
743 | // for<'a> ColOp<S::Adjoint<'a>, T::Adjoint<'a>> : Linear< |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
744 | // Yʹ, |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
745 | // Codomain=Pair<S::AdjointCodomain, T::AdjointCodomain> |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
746 | // >, |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
747 | { |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
748 | type AdjointCodomain = Pair<S::AdjointCodomain, T::AdjointCodomain>; |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
749 | type Adjoint<'a> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
750 | = ColOp<S::Adjoint<'a>, T::Adjoint<'a>> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
751 | where |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
752 | Self: 'a; |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
753 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
754 | fn adjoint(&self) -> Self::Adjoint<'_> { |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
755 | ColOp(self.0.adjoint(), self.1.adjoint()) |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
756 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
757 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
758 | |
|
184
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
759 | impl<A, B, Yʹ, S, T> SimplyAdjointable<Pair<A, B>, Yʹ> for RowOp<S, T> |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
760 | where |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
761 | A: Space, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
762 | B: Space, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
763 | Yʹ: Space, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
764 | S: SimplyAdjointable<A, Yʹ>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
765 | T: SimplyAdjointable<B, Yʹ>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
766 | Self: Linear<Pair<A, B>>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
767 | // for<'a> ColOp<S::Adjoint<'a>, T::Adjoint<'a>> : Linear< |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
768 | // Yʹ, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
769 | // Codomain=Pair<S::AdjointCodomain, T::AdjointCodomain> |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
770 | // >, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
771 | { |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
772 | type AdjointCodomain = Pair<S::AdjointCodomain, T::AdjointCodomain>; |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
773 | type SimpleAdjoint = ColOp<S::SimpleAdjoint, T::SimpleAdjoint>; |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
774 | |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
775 | fn adjoint(&self) -> Self::SimpleAdjoint { |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
776 | ColOp(self.0.adjoint(), self.1.adjoint()) |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
777 | } |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
778 | } |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
779 | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
780 | impl<A, B, Yʹ, S, T> Preadjointable<Pair<A, B>, Yʹ> for RowOp<S, T> |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
781 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
782 | A: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
783 | B: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
784 | Yʹ: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
785 | S: Preadjointable<A, Yʹ>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
786 | T: Preadjointable<B, Yʹ>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
787 | Self: Linear<Pair<A, B>>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
788 | for<'a> ColOp<S::Preadjoint<'a>, T::Preadjoint<'a>>: |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
789 | Linear<Yʹ, Codomain = Pair<S::PreadjointCodomain, T::PreadjointCodomain>>, |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
790 | { |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
791 | type PreadjointCodomain = Pair<S::PreadjointCodomain, T::PreadjointCodomain>; |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
792 | type Preadjoint<'a> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
793 | = ColOp<S::Preadjoint<'a>, T::Preadjoint<'a>> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
794 | where |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
795 | Self: 'a; |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
796 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
797 | fn preadjoint(&self) -> Self::Preadjoint<'_> { |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
798 | ColOp(self.0.preadjoint(), self.1.preadjoint()) |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
799 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
800 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
801 | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
802 | impl<A, Xʹ, Yʹ, R, S, T> Adjointable<A, Pair<Xʹ, Yʹ>> for ColOp<S, T> |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
803 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
804 | A: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
805 | Xʹ: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
806 | Yʹ: Space, |
| 151 | 807 | R: ClosedSpace + ClosedAdd, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
808 | S: Adjointable<A, Xʹ, AdjointCodomain = R>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
809 | T: Adjointable<A, Yʹ, AdjointCodomain = R>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
810 | Self: Linear<A>, |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
811 | // for<'a> RowOp<S::Adjoint<'a>, T::Adjoint<'a>> : Linear< |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
812 | // Pair<Xʹ,Yʹ>, |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
813 | // Codomain=R, |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
814 | // >, |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
815 | { |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
816 | type AdjointCodomain = R; |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
817 | type Adjoint<'a> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
818 | = RowOp<S::Adjoint<'a>, T::Adjoint<'a>> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
819 | where |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
820 | Self: 'a; |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
821 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
822 | fn adjoint(&self) -> Self::Adjoint<'_> { |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
823 | RowOp(self.0.adjoint(), self.1.adjoint()) |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
824 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
825 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
826 | |
|
184
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
827 | impl<A, Xʹ, Yʹ, R, S, T> SimplyAdjointable<A, Pair<Xʹ, Yʹ>> for ColOp<S, T> |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
828 | where |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
829 | A: Space, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
830 | Xʹ: Space, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
831 | Yʹ: Space, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
832 | R: ClosedSpace + ClosedAdd, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
833 | S: SimplyAdjointable<A, Xʹ, AdjointCodomain = R>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
834 | T: SimplyAdjointable<A, Yʹ, AdjointCodomain = R>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
835 | Self: Linear<A>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
836 | // for<'a> RowOp<S::Adjoint<'a>, T::Adjoint<'a>> : Linear< |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
837 | // Pair<Xʹ,Yʹ>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
838 | // Codomain=R, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
839 | // >, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
840 | { |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
841 | type AdjointCodomain = R; |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
842 | type SimpleAdjoint = RowOp<S::SimpleAdjoint, T::SimpleAdjoint>; |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
843 | |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
844 | fn adjoint(&self) -> Self::SimpleAdjoint { |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
845 | RowOp(self.0.adjoint(), self.1.adjoint()) |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
846 | } |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
847 | } |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
848 | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
849 | impl<A, Xʹ, Yʹ, R, S, T> Preadjointable<A, Pair<Xʹ, Yʹ>> for ColOp<S, T> |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
850 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
851 | A: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
852 | Xʹ: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
853 | Yʹ: Space, |
| 151 | 854 | R: ClosedSpace + ClosedAdd, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
855 | S: Preadjointable<A, Xʹ, PreadjointCodomain = R>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
856 | T: Preadjointable<A, Yʹ, PreadjointCodomain = R>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
857 | Self: Linear<A>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
858 | for<'a> RowOp<S::Preadjoint<'a>, T::Preadjoint<'a>>: Linear<Pair<Xʹ, Yʹ>, Codomain = R>, |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
859 | { |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
860 | type PreadjointCodomain = R; |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
861 | type Preadjoint<'a> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
862 | = RowOp<S::Preadjoint<'a>, T::Preadjoint<'a>> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
863 | where |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
864 | Self: 'a; |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
865 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
866 | fn preadjoint(&self) -> Self::Preadjoint<'_> { |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
867 | RowOp(self.0.preadjoint(), self.1.preadjoint()) |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
868 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
869 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
870 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
871 | /// Diagonal operator |
| 101 | 872 | #[derive(Clone, Copy, Debug, Serialize, Eq, PartialEq)] |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
873 | pub struct DiagOp<S, T>(pub S, pub T); |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
874 | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
875 | impl<A, B, S, T> Mapping<Pair<A, B>> for DiagOp<S, T> |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
876 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
877 | A: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
878 | B: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
879 | S: Mapping<A>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
880 | T: Mapping<B>, |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
881 | { |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
882 | type Codomain = Pair<S::Codomain, T::Codomain>; |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
883 | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
884 | fn apply<I: Instance<Pair<A, B>>>(&self, x: I) -> Self::Codomain { |
|
133
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
885 | x.eval_decompose(|Pair(a, b)| Pair(self.0.apply(a), self.1.apply(b))) |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
886 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
887 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
888 | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
889 | impl<A, B, S, T> Linear<Pair<A, B>> for DiagOp<S, T> |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
890 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
891 | A: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
892 | B: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
893 | S: Linear<A>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
894 | T: Linear<B>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
895 | { |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
896 | } |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
897 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
898 | impl<F, S, T, A, B, U, V> GEMV<F, Pair<U, V>, Pair<A, B>> for DiagOp<S, T> |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
899 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
900 | A: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
901 | B: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
902 | U: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
903 | V: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
904 | S: GEMV<F, U, A>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
905 | T: GEMV<F, V, B>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
906 | F: Num, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
907 | Self: Linear<Pair<U, V>, Codomain = Pair<A, B>>, |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
908 | { |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
909 | fn gemv<I: Instance<Pair<U, V>>>(&self, y: &mut Pair<A, B>, α: F, x: I, β: F) { |
|
133
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
910 | x.eval_decompose(|Pair(u, v)| { |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
911 | self.0.gemv(&mut y.0, α, u, β); |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
912 | self.1.gemv(&mut y.1, α, v, β); |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
913 | }) |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
914 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
915 | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
916 | fn apply_mut<I: Instance<Pair<U, V>>>(&self, y: &mut Pair<A, B>, x: I) { |
|
133
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
917 | x.eval_decompose(|Pair(u, v)| { |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
918 | self.0.apply_mut(&mut y.0, u); |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
919 | self.1.apply_mut(&mut y.1, v); |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
920 | }) |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
921 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
922 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
923 | /// Computes `y += Ax`, where `A` is `Self` |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
924 | fn apply_add<I: Instance<Pair<U, V>>>(&self, y: &mut Pair<A, B>, x: I) { |
|
133
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
925 | x.eval_decompose(|Pair(u, v)| { |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
926 | self.0.apply_add(&mut y.0, u); |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
927 | self.1.apply_add(&mut y.1, v); |
|
2b13f8a0c8ba
Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents:
130
diff
changeset
|
928 | }) |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
929 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
930 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
931 | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
932 | impl<A, B, Xʹ, Yʹ, R, S, T> Adjointable<Pair<A, B>, Pair<Xʹ, Yʹ>> for DiagOp<S, T> |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
933 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
934 | A: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
935 | B: Space, |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
936 | Xʹ: Space, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
937 | Yʹ: Space, |
| 151 | 938 | R: ClosedSpace, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
939 | S: Adjointable<A, Xʹ>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
940 | T: Adjointable<B, Yʹ>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
941 | Self: Linear<Pair<A, B>>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
942 | for<'a> DiagOp<S::Adjoint<'a>, T::Adjoint<'a>>: Linear<Pair<Xʹ, Yʹ>, Codomain = R>, |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
943 | { |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
944 | type AdjointCodomain = R; |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
945 | type Adjoint<'a> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
946 | = DiagOp<S::Adjoint<'a>, T::Adjoint<'a>> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
947 | where |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
948 | Self: 'a; |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
949 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
950 | fn adjoint(&self) -> Self::Adjoint<'_> { |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
951 | DiagOp(self.0.adjoint(), self.1.adjoint()) |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
952 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
953 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
954 | |
|
184
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
955 | impl<A, B, Xʹ, Yʹ, R, S, T> SimplyAdjointable<Pair<A, B>, Pair<Xʹ, Yʹ>> for DiagOp<S, T> |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
956 | where |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
957 | A: Space, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
958 | B: Space, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
959 | Xʹ: Space, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
960 | Yʹ: Space, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
961 | R: ClosedSpace, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
962 | S: SimplyAdjointable<A, Xʹ>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
963 | T: SimplyAdjointable<B, Yʹ>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
964 | Self: Linear<Pair<A, B>>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
965 | for<'a> DiagOp<S::SimpleAdjoint, T::SimpleAdjoint>: Linear<Pair<Xʹ, Yʹ>, Codomain = R>, |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
966 | { |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
967 | type AdjointCodomain = R; |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
968 | type SimpleAdjoint = DiagOp<S::SimpleAdjoint, T::SimpleAdjoint>; |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
969 | |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
970 | fn adjoint(&self) -> Self::SimpleAdjoint { |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
971 | DiagOp(self.0.adjoint(), self.1.adjoint()) |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
972 | } |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
973 | } |
|
b7b60b3b3eff
SimplyAdjointable to avoid type system limitations
Tuomo Valkonen <tuomov@iki.fi>
parents:
177
diff
changeset
|
974 | |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
975 | impl<A, B, Xʹ, Yʹ, R, S, T> Preadjointable<Pair<A, B>, Pair<Xʹ, Yʹ>> for DiagOp<S, T> |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
976 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
977 | A: Space, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
978 | B: Space, |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
979 | Xʹ: Space, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
980 | Yʹ: Space, |
| 151 | 981 | R: ClosedSpace, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
982 | S: Preadjointable<A, Xʹ>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
983 | T: Preadjointable<B, Yʹ>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
984 | Self: Linear<Pair<A, B>>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
985 | for<'a> DiagOp<S::Preadjoint<'a>, T::Preadjoint<'a>>: Linear<Pair<Xʹ, Yʹ>, Codomain = R>, |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
986 | { |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
987 | type PreadjointCodomain = R; |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
988 | type Preadjoint<'a> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
989 | = DiagOp<S::Preadjoint<'a>, T::Preadjoint<'a>> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
990 | where |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
991 | Self: 'a; |
|
57
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
992 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
993 | fn preadjoint(&self) -> Self::Preadjoint<'_> { |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
994 | DiagOp(self.0.preadjoint(), self.1.preadjoint()) |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
995 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
996 | } |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
997 | |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
998 | /// Block operator |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
999 | pub type BlockOp<S11, S12, S21, S22> = ColOp<RowOp<S11, S12>, RowOp<S21, S22>>; |
|
1b3b1687b9ed
Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
13
diff
changeset
|
1000 | |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1001 | macro_rules! pairnorm { |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1002 | ($expj:ty) => { |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1003 | impl<F, A, B, S, T, ExpA, ExpB, ExpR> |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1004 | BoundedLinear<Pair<A, B>, PairNorm<ExpA, ExpB, $expj>, ExpR, F> for RowOp<S, T> |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1005 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1006 | F: Float, |
|
188
7f13c9924b30
Remove Norm trait bound from BoundedLinear
Tuomo Valkonen <tuomov@iki.fi>
parents:
186
diff
changeset
|
1007 | A: Space, |
|
7f13c9924b30
Remove Norm trait bound from BoundedLinear
Tuomo Valkonen <tuomov@iki.fi>
parents:
186
diff
changeset
|
1008 | B: Space, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1009 | S: BoundedLinear<A, ExpA, ExpR, F>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1010 | T: BoundedLinear<B, ExpB, ExpR, F>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1011 | S::Codomain: Add<T::Codomain>, |
| 151 | 1012 | <S::Codomain as Add<T::Codomain>>::Output: ClosedSpace, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1013 | ExpA: NormExponent, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1014 | ExpB: NormExponent, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1015 | ExpR: NormExponent, |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1016 | { |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1017 | fn opnorm_bound( |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1018 | &self, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1019 | PairNorm(expa, expb, _): PairNorm<ExpA, ExpB, $expj>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1020 | expr: ExpR, |
|
110
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
1021 | ) -> DynResult<F> { |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1022 | // An application of the triangle inequality bounds the norm by the maximum |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1023 | // of the individual norms. A simple observation shows this to be exact. |
|
110
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
1024 | let na = self.0.opnorm_bound(expa, expr)?; |
|
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
1025 | let nb = self.1.opnorm_bound(expb, expr)?; |
|
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
1026 | Ok(na.max(nb)) |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1027 | } |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1028 | } |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1029 | |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1030 | impl<F, A, S, T, ExpA, ExpS, ExpT> BoundedLinear<A, ExpA, PairNorm<ExpS, ExpT, $expj>, F> |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1031 | for ColOp<S, T> |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1032 | where |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1033 | F: Float, |
|
188
7f13c9924b30
Remove Norm trait bound from BoundedLinear
Tuomo Valkonen <tuomov@iki.fi>
parents:
186
diff
changeset
|
1034 | A: Space, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1035 | S: BoundedLinear<A, ExpA, ExpS, F>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1036 | T: BoundedLinear<A, ExpA, ExpT, F>, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1037 | ExpA: NormExponent, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1038 | ExpS: NormExponent, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1039 | ExpT: NormExponent, |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1040 | { |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1041 | fn opnorm_bound( |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1042 | &self, |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1043 | expa: ExpA, |
|
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1044 | PairNorm(exps, expt, _): PairNorm<ExpS, ExpT, $expj>, |
|
110
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
1045 | ) -> DynResult<F> { |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1046 | // This is based on the rule for RowOp and ‖A^*‖ = ‖A‖, hence, |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1047 | // for A=[S; T], ‖A‖=‖[S^*, T^*]‖ ≤ max{‖S^*‖, ‖T^*‖} = max{‖S‖, ‖T‖} |
|
110
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
1048 | let ns = self.0.opnorm_bound(expa, exps)?; |
|
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
1049 | let nt = self.1.opnorm_bound(expa, expt)?; |
|
a1278320be26
Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents:
104
diff
changeset
|
1050 | Ok(ns.max(nt)) |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1051 | } |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1052 | } |
|
99
9e5b9fc81c52
Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents:
74
diff
changeset
|
1053 | }; |
|
59
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1054 | } |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1055 | |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1056 | pairnorm!(L1); |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1057 | pairnorm!(L2); |
|
9226980e45a7
Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents:
57
diff
changeset
|
1058 | pairnorm!(Linfinity); |
| 104 | 1059 | |
| 1060 | /// The simplest linear mapping, scaling by a scalar. | |
| 1061 | /// | |
| 1062 | /// TODO: redefined/replace [`Weighted`] by composition with [`Scaled`]. | |
| 1063 | pub struct Scaled<F: Float>(pub F); | |
| 1064 | ||
| 1065 | impl<Domain, F> Mapping<Domain> for Scaled<F> | |
| 1066 | where | |
| 1067 | F: Float, | |
| 163 | 1068 | Domain: Space, |
| 164 | 1069 | Domain::Principal: Mul<F>, |
| 1070 | <Domain::Principal as Mul<F>>::Output: ClosedSpace, | |
| 104 | 1071 | { |
| 164 | 1072 | type Codomain = <Domain::Principal as Mul<F>>::Output; |
| 104 | 1073 | |
| 1074 | /// Compute the value of `self` at `x`. | |
| 1075 | fn apply<I: Instance<Domain>>(&self, x: I) -> Self::Codomain { | |
| 1076 | x.own() * self.0 | |
| 1077 | } | |
| 1078 | } | |
| 1079 | ||
| 1080 | impl<Domain, F> Linear<Domain> for Scaled<F> | |
| 1081 | where | |
| 1082 | F: Float, | |
| 163 | 1083 | Domain: Space, |
| 164 | 1084 | Domain::Principal: Mul<F>, |
| 1085 | <Domain::Principal as Mul<F>>::Output: ClosedSpace, | |
| 104 | 1086 | { |
| 1087 | } |