src/linops.rs

Mon, 12 May 2025 15:42:48 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Mon, 12 May 2025 15:42:48 -0500
branch
dev
changeset 129
d2994e34a5f5
parent 124
6aa955ad8122
child 130
0a689881b0f1
permissions
-rw-r--r--

Simplify ZeroOp to SimpleZeroOp, only from X to X. Add Prox for ZeroIndicator. Move F parameter to AXPY::Field.

0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /*!
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 Abstract linear operators.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3 */
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
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;
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
7 use crate::instance::Instance;
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
8 pub use crate::mapping::{Composition, DifferentiableImpl, Mapping, Space};
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
9 use crate::norms::{HasDual, Linfinity, Norm, NormExponent, PairNorm, L1, L2};
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
10 use crate::types::*;
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
11 use numeric_literals::replace_float_literals;
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
12 use serde::Serialize;
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
13 use std::marker::PhantomData;
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
14 use std::ops::Mul;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
15
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
16 /// 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
17 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
18
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
19 // 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
20 // 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
21
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
22 // /// 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
23 // 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
24 // self.apply(x)
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
25 // }
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
26 // }
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
28 /// Efficient in-place summation.
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
29 #[replace_float_literals(Self::Field::cast_from(literal))]
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 pub trait AXPY<X = Self>: Space + std::ops::MulAssign<Self::Field>
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
31 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
32 X: Space,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
33 {
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
34 type Field: Num;
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
35 type Owned: AXPY<X, Field = Self::Field>;
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
36 // type OriginGen<'a>: OriginGenerator<Self::Owned, F>
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
37 // where
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
38 // Self: 'a;
62
d8305c9b6fdf Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
39
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 /// 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
41 fn axpy<I: Instance<X>>(&mut self, α: Self::Field, x: I, β: Self::Field);
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
42
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
43 /// Copies `x` to `self`.
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
44 fn copy_from<I: Instance<X>>(&mut self, x: I) {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
45 self.axpy(1.0, x, 0.0)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
46 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
47
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
48 /// 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
49 fn scale_from<I: Instance<X>>(&mut self, α: Self::Field, x: I) {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 self.axpy(α, x, 0.0)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
51 }
62
d8305c9b6fdf Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
52
d8305c9b6fdf Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
53 /// Return a similar zero as `self`.
d8305c9b6fdf Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
54 fn similar_origin(&self) -> Self::Owned;
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
55 // {
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
56 // self.make_origin_generator().make_origin()
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
57 // }
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
58
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
59 /// Return a similar zero as `x`.
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
60 fn similar_origin_inst<I: Instance<Self>>(x: I) -> Self::Owned {
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
61 x.eval(|xr| xr.similar_origin())
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
62 }
62
d8305c9b6fdf Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
63
d8305c9b6fdf Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
64 /// Set self to zero.
d8305c9b6fdf Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents: 61
diff changeset
65 fn set_zero(&mut 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
66
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
67 //fn make_origin_generator(&self) -> Self::OriginGen<'_>;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
68 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70 /// Efficient in-place application for [`Linear`] operators.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
71 #[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
72 pub trait GEMV<F: Num, X: Space, Y = <Self as Mapping<X>>::Codomain>: Linear<X> {
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
73 /// 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
74 fn gemv<I: Instance<X>>(&self, y: &mut Y, α: F, x: I, β: F);
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
75
67
d7c0f431cbd6 Discrete gradients
Tuomo Valkonen <tuomov@iki.fi>
parents: 66
diff changeset
76 #[inline]
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
77 /// 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
78 fn apply_mut<I: Instance<X>>(&self, y: &mut Y, x: I) {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
79 self.gemv(y, 1.0, x, 0.0)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
80 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
81
67
d7c0f431cbd6 Discrete gradients
Tuomo Valkonen <tuomov@iki.fi>
parents: 66
diff changeset
82 #[inline]
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
83 /// 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
84 fn apply_add<I: Instance<X>>(&self, y: &mut Y, x: I) {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
85 self.gemv(y, 1.0, x, 1.0)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
86 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
87 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
88
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
89 /// Bounded linear operators
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
90 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
91 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
92 F: Num,
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
93 X: Space + Norm<XExp, F>,
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
94 XExp: NormExponent,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
95 CodExp: NormExponent,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
96 {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
97 /// A bound on the operator norm $\|A\|$ for the linear operator $A$=`self`.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
98 /// 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
99 /// reasonably implemented. The [`NormExponent`] `xexp` indicates the norm
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
100 /// 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
101 ///
a1278320be26 Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 104
diff changeset
102 /// 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
103 fn opnorm_bound(&self, xexp: XExp, codexp: CodExp) -> DynResult<F>;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
104 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
105
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
106 // Linear operator application into mutable target. The [`AsRef`] bound
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
107 // is used to guarantee compatibility with `Yʹ` and `Self::Codomain`;
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
108 // the former is assumed to be e.g. a view into the latter.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
109
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
110 /*impl<X,Y,T> Fn(&X) -> Y for T where T : Linear<X,Codomain=Y> {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
111 fn call(&self, x : &X) -> Y {
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
112 self.apply(x)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
113 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
114 }*/
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
115
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
116 /// 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
117 pub trait Adjointable<X, Yʹ>: Linear<X>
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
118 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
119 X: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
120 Yʹ: Space,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
121 {
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
122 type AdjointCodomain: Space;
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
123 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
124 where
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
125 Self: 'a;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
126
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
127 /// Form the adjoint operator of `self`.
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
128 fn adjoint(&self) -> Self::Adjoint<'_>;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
129 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
130
5
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
131 /// Trait for forming a preadjoint of an operator.
59dc4c5883f4 Improve documentation
Tuomo Valkonen <tuomov@iki.fi>
parents: 0
diff changeset
132 ///
8
4e09b7829b51 Multithreaded bisection tree operations
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
133 /// For an operator $A$ this is an operator $A\_\*$
4e09b7829b51 Multithreaded bisection tree operations
Tuomo Valkonen <tuomov@iki.fi>
parents: 5
diff changeset
134 /// such that its adjoint $(A\_\*)^\*=A$. The space `X` is the domain of the `Self`
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
135 /// operator. The space `Ypre` is the predual of its codomain, and should be the
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
136 /// domain of the adjointed operator. `Self::Preadjoint` should be
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
137 /// [`Adjointable`]`<'a,Ypre,X>`.
65
9327d544ca0b Reduce preadjointing constraints
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
138 /// 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
139 /// 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
140 /// 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
141 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
142 Linear<X>
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
143 {
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
144 type PreadjointCodomain: Space;
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
145 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
146 where
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
147 Self: 'a;
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
148
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
149 /// Form the adjoint operator of `self`.
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
150 fn preadjoint(&self) -> Self::Preadjoint<'_>;
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
151 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
152
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
153 /// Adjointable operators $A: X → Y$ between reflexive spaces $X$ and $Y$.
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
154 pub trait SimplyAdjointable<X: Space>: Adjointable<X, <Self as Mapping<X>>::Codomain> {}
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
155 impl<'a, X: Space, T> SimplyAdjointable<X> for T where
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
156 T: Adjointable<X, <Self as Mapping<X>>::Codomain>
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
157 {
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
158 }
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
159
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
160 /// The identity operator
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
161 #[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
162 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
163
465fa2121ccb Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
164 impl<X> IdOp<X> {
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
165 pub fn new() -> IdOp<X> {
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
166 IdOp(PhantomData)
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
167 }
13
465fa2121ccb Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
168 }
465fa2121ccb Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
169
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
170 impl<X: Clone + Space> Mapping<X> for IdOp<X> {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
171 type Codomain = X;
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
172
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
173 fn apply<I: Instance<X>>(&self, x: I) -> X {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
174 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
175 }
465fa2121ccb Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
176 }
465fa2121ccb Better Linear and Mapping structure that can provide consuming and reference `apply`.
Tuomo Valkonen <tuomov@iki.fi>
parents: 8
diff changeset
177
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
178 impl<X: Clone + 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
179
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
180 #[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
181 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
182 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
183 Y: AXPY<X, Field = F>,
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
184 X: Clone + Space,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
185 {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
186 // 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
187 fn gemv<I: Instance<X>>(&self, y: &mut Y, α: F, x: I, β: F) {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
188 y.axpy(α, x, β)
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
189 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
190
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
191 fn apply_mut<I: Instance<X>>(&self, y: &mut Y, x: I) {
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
192 y.copy_from(x);
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
193 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
194 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
195
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
196 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
197 where
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
198 X: Space + Clone + Norm<E, F>,
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
199 F: Num,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
200 E: NormExponent,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
201 {
110
a1278320be26 Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 104
diff changeset
202 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
203 Ok(F::ONE)
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
204 }
0
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
205 }
9f27689eb130 Initialise new clean repository
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
206
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
207 impl<X: Clone + Space> Adjointable<X, X> for IdOp<X> {
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
208 type AdjointCodomain = X;
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
209 type Adjoint<'a>
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
210 = IdOp<X>
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
211 where
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
212 X: 'a;
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
213
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
214 fn adjoint(&self) -> Self::Adjoint<'_> {
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
215 IdOp::new()
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
216 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
217 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
218
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
219 impl<X: Clone + Space> Preadjointable<X, X> for IdOp<X> {
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
220 type PreadjointCodomain = X;
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
221 type Preadjoint<'a>
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
222 = IdOp<X>
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
223 where
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
224 X: 'a;
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
225
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
226 fn preadjoint(&self) -> Self::Preadjoint<'_> {
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
227 IdOp::new()
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
228 }
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
229 }
61
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
230
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
231 /// 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
232 #[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
233 pub struct SimpleZeroOp;
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
234
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
235 impl<X> Mapping<X> for 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
236 where
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
237 X: AXPY + Instance<X>,
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
238 {
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 type Codomain = X::Owned;
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
240
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
241 fn apply<I: Instance<X>>(&self, x: I) -> X::Owned {
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
242 X::similar_origin_inst(x)
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
243 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
244 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
245
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
246 impl<X> Linear<X> for SimpleZeroOp where X: AXPY + Instance<X> {}
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
247
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
248 #[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
249 impl<X, Y, F> GEMV<F, X, Y> for SimpleZeroOp
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
250 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
251 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
252 Y: AXPY<Field = F>,
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
253 X: AXPY<Field = F> + Instance<X>,
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
254 {
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
255 // 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
256 fn gemv<I: Instance<X>>(&self, y: &mut Y, _α: F, _x: I, β: F) {
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
257 *y *= β;
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
258 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
259
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
260 fn apply_mut<I: Instance<X>>(&self, y: &mut Y, _x: I) {
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
261 y.set_zero();
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
262 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
263 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
264
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
265 impl<X, F, E1, E2> BoundedLinear<X, E1, E2, F> for SimpleZeroOp
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
266 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
267 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
268 X: AXPY<Field = F> + Instance<X> + Norm<E1, F>,
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
269 E1: NormExponent,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
270 E2: NormExponent,
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
271 {
110
a1278320be26 Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 104
diff changeset
272 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
273 Ok(F::ZERO)
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
274 }
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
275 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
276
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
277 impl<X, F> Adjointable<X, X::DualSpace> for SimpleZeroOp
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
278 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
279 F: Num,
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
280 X: AXPY<Field = F> + Instance<X> + HasDual<F>,
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
281 X::DualSpace: AXPY<Owned = X::DualSpace>,
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
282 {
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
283 type AdjointCodomain = X::DualSpace;
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
284 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
285 = SimpleZeroOp
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
286 where
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
287 Self: 'b;
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
288 // () means not (pre)adjointable.
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
289
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
290 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
291 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
292 }
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
293 }
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
294
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
295 /*
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 /// Trait for forming origins (zeroes) in vector spaces
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
297 pub trait OriginGenerator<X, F: Num = f64> {
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 fn make_origin(&self) -> X;
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
299 }
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
300
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
301 /// Origin generator for statically sized Euclidean spaces.
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
302 pub struct StaticEuclideanOriginGenerator;
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
303
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 impl<X, F: Float> OriginGenerator<X, F> for StaticEuclideanOriginGenerator
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
305 where
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
306 X: StaticEuclidean<F> + Euclidean<F, Output = X>,
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
307 {
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
308 #[inline]
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
309 fn make_origin(&self) -> X {
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
310 X::origin()
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 }
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
312 }
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
313
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 /// Origin generator arbitrary spaces that implement [`AXPY`], based on a sample vector.
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
315 pub struct SimilarOriginGenerator<'a, X>(&'a X);
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
316
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
317 impl<'a, X, F: Float> OriginGenerator<X, F> for SimilarOriginGenerator<'a, X>
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
318 where
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
319 X: AXPY<F, Owned = X>,
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
320 {
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
321 #[inline]
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
322 fn make_origin(&self) -> X {
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
323 self.0.similar_origin()
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
324 }
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
325 }
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
326
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 pub struct NotAnOriginGenerator;
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
328
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
329 /// The zero operator
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
330 #[derive(Clone, Copy, Debug, Serialize, Eq, PartialEq)]
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
331 pub struct ZeroOp<X, Y, YOrigin, XDOrigin = NotAnOriginGenerator, F: Num = f64> {
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
332 y_origin: YOrigin,
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
333 xd_origin: XDOrigin,
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
334 _phantoms: PhantomData<(X, Y, F)>,
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
335 }
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
336
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
337 // TODO: Need to make Zero in Instance.
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
338
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, Y, F, YOrigin, XDOrigin> ZeroOp<X, Y, YOrigin, XDOrigin, F>
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
340 where
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,
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
342 YOrigin: OriginGenerator<Y, F>,
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
343 {
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
344 pub fn new(y_origin: YOrigin, xd_origin: XDOrigin) -> Self {
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 ZeroOp {
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
346 y_origin,
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 xd_origin,
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
348 _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
349 }
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
350 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
351 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
352
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 impl<X, Y, F, YOrigin, XDOrigin> Mapping<X> for ZeroOp<X, Y, YOrigin, XDOrigin, F>
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 where
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 F: Num,
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 YOrigin: OriginGenerator<Y, F>,
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
357 Y: Space,
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
358 X: Space + Instance<X>,
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
359 {
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
360 type Codomain = Y;
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
361
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
362 fn apply<I: Instance<X>>(&self, _: I) -> Y {
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
363 self.y_origin.make_origin()
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
364 }
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
365 }
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
366
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
367 impl<X, Y, F, YOrigin, XDOrigin> Linear<X> for ZeroOp<X, Y, YOrigin, XDOrigin, F>
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
368 where
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
369 F: Num,
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
370 YOrigin: OriginGenerator<Y, F>,
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
371 Y: Space,
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
372 X: Space + Instance<X>,
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
373 {
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
374 }
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
375
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
376 #[replace_float_literals(F::cast_from(literal))]
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
377 impl<X, Y, F, YOrigin, XDOrigin> GEMV<F, X, Y> for ZeroOp<X, Y, YOrigin, XDOrigin, F>
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
378 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
379 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
380 YOrigin: OriginGenerator<Y, F>,
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
381 Y: Space + AXPY<F>,
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
382 X: Space + Instance<X>,
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
383 {
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
384 // Computes `y = αAx + βy`, where `A` is `Self`.
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
385 fn gemv<I: Instance<X>>(&self, y: &mut Y, _α: F, _x: I, β: F) {
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
386 *y *= β;
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
387 }
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
388
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
389 fn apply_mut<I: Instance<X>>(&self, y: &mut Y, _x: I) {
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
390 y.set_zero();
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
391 }
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
392 }
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
393
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
394 impl<X, Y, F, YOrigin, XDOrigin, E1, E2> BoundedLinear<X, E1, E2, F>
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
395 for ZeroOp<X, Y, YOrigin, XDOrigin, F>
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
396 where
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
397 F: Num,
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
398 YOrigin: OriginGenerator<Y, F>,
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
399 Y: Space + AXPY<F> + Norm<E2, F>,
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
400 X: Space + Instance<X> + Norm<E1, F>,
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
401 E1: NormExponent,
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
402 E2: NormExponent,
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
403 {
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
404 fn opnorm_bound(&self, _xexp: E1, _codexp: E2) -> DynResult<F> {
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
405 Ok(F::ZERO)
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
406 }
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
407 }
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
408
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
409 impl<X, Y, Yprime, F, YOrigin, XDOrigin> Adjointable<X, Yprime>
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
410 for ZeroOp<X, Y, YOrigin, XDOrigin, F>
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
411 where
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
412 F: Num,
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
413 YOrigin: OriginGenerator<Y, F>,
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
414 Y: Space + AXPY<F>,
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
415 X: Space + Instance<X> + HasDual<F>,
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
416 XDOrigin: OriginGenerator<X::DualSpace, F> + Clone,
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
417 Yprime: Space + Instance<Yprime>,
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
418 {
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
419 type AdjointCodomain = X::DualSpace;
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
420 type Adjoint<'b>
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
421 = ZeroOp<Yprime, X::DualSpace, XDOrigin, NotAnOriginGenerator, F>
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
422 where
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
423 Self: 'b;
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
424 // () means not (pre)adjointable.
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
425
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
426 fn adjoint(&self) -> Self::Adjoint<'_> {
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
427 ZeroOp::new(self.xd_origin.clone(), NotAnOriginGenerator)
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
428 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
429 }
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
430 */
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
431
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
432 /*
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
433 impl<X, Y, Ypre, Xpre, F, YOrigin, XDOrigin> Preadjointable<X, Ypre>
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
434 for ZeroOp<X, Y, YOrigin, XDOrigin, F>
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
435 where
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
436 F: Num,
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
437 YOrigin: OriginGenerator<Y, F>,
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
438 Y: Space + AXPY<F>,
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
439 X: Space + Instance<X> + HasDual<F>,
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
440 XDOrigin: OriginGenerator<Xpre, F> + Clone,
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
441 Ypre: Space + Instance<Ypre> + HasDual<DualSpace = X>,
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
442 {
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
443 type PreadjointCodomain = Xpre;
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
444 type Preadjoint<'b>
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
445 = ZeroOp<Ypre, Xpre, XDOrigin, NotAnOriginGenerator, F>
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
446 where
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
447 Self: 'b;
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
448 // () means not (pre)adjointable.
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
449
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
450 fn adjoint(&self) -> Self::Adjoint<'_> {
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
451 ZeroOp::new(self.xpre_origin.clone(), NotAnOriginGenerator)
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
452 }
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
453 }
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
454 */
66
Tuomo Valkonen <tuomov@iki.fi>
parents: 65
diff changeset
455
61
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
456 impl<S, T, E, X> Linear<X> for Composition<S, T, E>
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
457 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
458 X: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
459 T: Linear<X>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
460 S: Linear<T::Codomain>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
461 {
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
462 }
61
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
463
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
464 impl<F, S, T, E, X, Y> GEMV<F, X, Y> for Composition<S, T, E>
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
465 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
466 F: Num,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
467 X: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
468 T: Linear<X>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
469 S: GEMV<F, T::Codomain, Y>,
61
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
470 {
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
471 fn gemv<I: Instance<X>>(&self, y: &mut Y, α: F, x: I, β: F) {
61
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
472 self.outer.gemv(y, α, self.inner.apply(x), β)
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
473 }
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
474
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
475 /// 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
476 fn apply_mut<I: Instance<X>>(&self, y: &mut Y, x: I) {
61
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
477 self.outer.apply_mut(y, self.inner.apply(x))
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
478 }
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
479
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
480 /// 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
481 fn apply_add<I: Instance<X>>(&self, y: &mut Y, x: I) {
61
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
482 self.outer.apply_add(y, self.inner.apply(x))
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
483 }
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
484 }
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
485
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
486 impl<F, S, T, X, Z, Xexp, Yexp, Zexp> BoundedLinear<X, Xexp, Yexp, F> for Composition<S, T, Zexp>
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
487 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
488 F: Num,
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
489 X: Space + Norm<Xexp, F>,
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
490 Z: Space + Norm<Zexp, F>,
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
491 Xexp: NormExponent,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
492 Yexp: NormExponent,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
493 Zexp: NormExponent,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
494 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
495 S: BoundedLinear<Z, Zexp, Yexp, F>,
61
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
496 {
110
a1278320be26 Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 104
diff changeset
497 fn opnorm_bound(&self, xexp: Xexp, yexp: Yexp) -> DynResult<F> {
61
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
498 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
499 Ok(self.outer.opnorm_bound(zexp, yexp)? * self.inner.opnorm_bound(xexp, zexp)?)
61
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
500 }
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
501 }
05089fbc0310 Compositions
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
502
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
503 /// “Row operator” $(S, T)$; $(S, T)(x, y)=Sx + Ty$.
101
997961aa6eee Add some missing #derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 99
diff changeset
504 #[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
505 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
506
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
507 use std::ops::Add;
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
508
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
509 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
510 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
511 A: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
512 B: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
513 S: Mapping<A>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
514 T: Mapping<B>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
515 S::Codomain: Add<T::Codomain>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
516 <S::Codomain as Add<T::Codomain>>::Output: Space,
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
517 {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
518 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
519
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
520 fn apply<I: Instance<Pair<A, B>>>(&self, x: I) -> Self::Codomain {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
521 let Pair(a, b) = x.decompose();
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
522 self.0.apply(a) + self.1.apply(b)
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
523 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
524 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
525
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
526 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
527 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
528 A: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
529 B: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
530 S: Linear<A>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
531 T: Linear<B>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
532 S::Codomain: Add<T::Codomain>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
533 <S::Codomain as Add<T::Codomain>>::Output: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
534 {
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
535 }
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
536
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
537 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
538 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
539 U: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
540 V: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
541 S: GEMV<F, U, Y>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
542 T: GEMV<F, V, Y>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
543 F: Num,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
544 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
545 {
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
546 fn gemv<I: Instance<Pair<U, V>>>(&self, y: &mut Y, α: F, x: I, β: F) {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
547 let Pair(u, v) = x.decompose();
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
548 self.0.gemv(y, α, u, β);
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
549 self.1.gemv(y, α, v, F::ONE);
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
550 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
551
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
552 fn apply_mut<I: Instance<Pair<U, V>>>(&self, y: &mut Y, x: I) {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
553 let Pair(u, v) = x.decompose();
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
554 self.0.apply_mut(y, u);
74
2c76df38d02b Fix RowOp apply_mut.
Tuomo Valkonen <tuomov@iki.fi>
parents: 67
diff changeset
555 self.1.apply_add(y, v);
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
556 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
557
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
558 /// 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
559 fn apply_add<I: Instance<Pair<U, V>>>(&self, y: &mut Y, x: I) {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
560 let Pair(u, v) = x.decompose();
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
561 self.0.apply_add(y, u);
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
562 self.1.apply_add(y, v);
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
563 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
564 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
565
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
566 /// “Column operator” $(S; T)$; $(S; T)x=(Sx, Tx)$.
101
997961aa6eee Add some missing #derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 99
diff changeset
567 #[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
568 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
569
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
570 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
571 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
572 A: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
573 S: Mapping<A>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
574 T: Mapping<A>,
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
575 {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
576 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
577
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
578 fn apply<I: Instance<A>>(&self, a: I) -> Self::Codomain {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
579 Pair(self.0.apply(a.ref_instance()), self.1.apply(a))
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
580 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
581 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
582
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
583 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
584 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
585 A: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
586 S: Mapping<A>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
587 T: Mapping<A>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
588 {
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
589 }
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
590
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
591 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
592 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
593 X: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
594 S: GEMV<F, X, A>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
595 T: GEMV<F, X, B>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
596 F: Num,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
597 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
598 {
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
599 fn gemv<I: Instance<X>>(&self, y: &mut Pair<A, B>, α: F, x: I, β: F) {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
600 self.0.gemv(&mut y.0, α, x.ref_instance(), β);
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
601 self.1.gemv(&mut y.1, α, x, β);
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
602 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
603
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
604 fn apply_mut<I: Instance<X>>(&self, y: &mut Pair<A, B>, x: I) {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
605 self.0.apply_mut(&mut y.0, x.ref_instance());
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
606 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
607 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
608
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
609 /// 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
610 fn apply_add<I: Instance<X>>(&self, y: &mut Pair<A, B>, x: I) {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
611 self.0.apply_add(&mut y.0, x.ref_instance());
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
612 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
613 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
614 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
615
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
616 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
617 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
618 A: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
619 B: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
620 Yʹ: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
621 S: Adjointable<A, Yʹ>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
622 T: Adjointable<B, Yʹ>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
623 Self: Linear<Pair<A, B>>,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
624 // 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
625 // Yʹ,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
626 // Codomain=Pair<S::AdjointCodomain, T::AdjointCodomain>
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
627 // >,
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
628 {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
629 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
630 type Adjoint<'a>
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
631 = 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
632 where
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
633 Self: 'a;
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
634
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
635 fn adjoint(&self) -> Self::Adjoint<'_> {
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
636 ColOp(self.0.adjoint(), self.1.adjoint())
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
637 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
638 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
639
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
640 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
641 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
642 A: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
643 B: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
644 Yʹ: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
645 S: Preadjointable<A, Yʹ>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
646 T: Preadjointable<B, Yʹ>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
647 Self: Linear<Pair<A, B>>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
648 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
649 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
650 {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
651 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
652 type Preadjoint<'a>
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
653 = 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
654 where
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
655 Self: 'a;
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
656
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
657 fn preadjoint(&self) -> Self::Preadjoint<'_> {
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
658 ColOp(self.0.preadjoint(), self.1.preadjoint())
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
659 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
660 }
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 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
663 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
664 A: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
665 Xʹ: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
666 Yʹ: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
667 R: Space + ClosedAdd,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
668 S: Adjointable<A, Xʹ, AdjointCodomain = R>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
669 T: Adjointable<A, Yʹ, AdjointCodomain = R>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
670 Self: Linear<A>,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
671 // 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
672 // Pair<Xʹ,Yʹ>,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
673 // Codomain=R,
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
674 // >,
57
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 type AdjointCodomain = R;
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
677 type Adjoint<'a>
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
678 = 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
679 where
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
680 Self: 'a;
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
681
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
682 fn adjoint(&self) -> Self::Adjoint<'_> {
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
683 RowOp(self.0.adjoint(), self.1.adjoint())
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 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
686
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
687 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
688 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
689 A: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
690 Xʹ: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
691 Yʹ: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
692 R: Space + ClosedAdd,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
693 S: Preadjointable<A, Xʹ, PreadjointCodomain = R>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
694 T: Preadjointable<A, Yʹ, PreadjointCodomain = R>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
695 Self: Linear<A>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
696 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
697 {
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
698 type PreadjointCodomain = R;
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
699 type Preadjoint<'a>
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
700 = 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
701 where
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
702 Self: 'a;
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
703
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
704 fn preadjoint(&self) -> Self::Preadjoint<'_> {
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
705 RowOp(self.0.preadjoint(), self.1.preadjoint())
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
706 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
707 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
708
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
709 /// Diagonal operator
101
997961aa6eee Add some missing #derives
Tuomo Valkonen <tuomov@iki.fi>
parents: 99
diff changeset
710 #[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
711 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
712
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
713 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
714 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
715 A: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
716 B: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
717 S: Mapping<A>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
718 T: Mapping<B>,
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
719 {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
720 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
721
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
722 fn apply<I: Instance<Pair<A, B>>>(&self, x: I) -> Self::Codomain {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
723 let Pair(a, b) = x.decompose();
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
724 Pair(self.0.apply(a), self.1.apply(b))
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
725 }
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
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
728 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
729 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
730 A: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
731 B: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
732 S: Linear<A>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
733 T: Linear<B>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
734 {
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
735 }
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
736
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
737 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
738 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
739 A: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
740 B: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
741 U: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
742 V: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
743 S: GEMV<F, U, A>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
744 T: GEMV<F, V, B>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
745 F: Num,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
746 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
747 {
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
748 fn gemv<I: Instance<Pair<U, V>>>(&self, y: &mut Pair<A, B>, α: F, x: I, β: F) {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
749 let Pair(u, v) = x.decompose();
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
750 self.0.gemv(&mut y.0, α, u, β);
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
751 self.1.gemv(&mut y.1, α, v, β);
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
752 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
753
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
754 fn apply_mut<I: Instance<Pair<U, V>>>(&self, y: &mut Pair<A, B>, x: I) {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
755 let Pair(u, v) = x.decompose();
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
756 self.0.apply_mut(&mut y.0, u);
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
757 self.1.apply_mut(&mut y.1, v);
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
758 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
759
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
760 /// 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
761 fn apply_add<I: Instance<Pair<U, V>>>(&self, y: &mut Pair<A, B>, x: I) {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
762 let Pair(u, v) = x.decompose();
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
763 self.0.apply_add(&mut y.0, u);
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
764 self.1.apply_add(&mut y.1, v);
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
765 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
766 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
767
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
768 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
769 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
770 A: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
771 B: Space,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
772 Xʹ: Space,
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
773 Yʹ: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
774 R: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
775 S: Adjointable<A, Xʹ>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
776 T: Adjointable<B, Yʹ>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
777 Self: Linear<Pair<A, B>>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
778 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
779 {
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
780 type AdjointCodomain = R;
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
781 type Adjoint<'a>
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
782 = 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
783 where
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
784 Self: 'a;
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
785
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
786 fn adjoint(&self) -> Self::Adjoint<'_> {
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
787 DiagOp(self.0.adjoint(), self.1.adjoint())
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
788 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
789 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
790
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
791 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
792 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
793 A: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
794 B: Space,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
795 Xʹ: Space,
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
796 Yʹ: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
797 R: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
798 S: Preadjointable<A, Xʹ>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
799 T: Preadjointable<B, Yʹ>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
800 Self: Linear<Pair<A, B>>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
801 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
802 {
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
803 type PreadjointCodomain = R;
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
804 type Preadjoint<'a>
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
805 = 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
806 where
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
807 Self: 'a;
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
808
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
809 fn preadjoint(&self) -> Self::Preadjoint<'_> {
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
810 DiagOp(self.0.preadjoint(), self.1.preadjoint())
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
811 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
812 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
813
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
814 /// Block operator
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents: 13
diff changeset
815 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
816
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
817 macro_rules! pairnorm {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
818 ($expj:ty) => {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
819 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
820 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
821 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
822 F: Float,
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
823 A: Space + Norm<ExpA, F>,
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
824 B: Space + Norm<ExpB, F>,
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
825 S: BoundedLinear<A, ExpA, ExpR, F>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
826 T: BoundedLinear<B, ExpB, ExpR, F>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
827 S::Codomain: Add<T::Codomain>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
828 <S::Codomain as Add<T::Codomain>>::Output: Space,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
829 ExpA: NormExponent,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
830 ExpB: NormExponent,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
831 ExpR: NormExponent,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
832 {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
833 fn opnorm_bound(
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
834 &self,
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
835 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
836 expr: ExpR,
110
a1278320be26 Use DynResult for Lipschitz factors and operator norm bounds
Tuomo Valkonen <tuomov@iki.fi>
parents: 104
diff changeset
837 ) -> DynResult<F> {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
838 // 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
839 // 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
840 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
841 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
842 Ok(na.max(nb))
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
843 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
844 }
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
845
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
846 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
847 for ColOp<S, T>
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
848 where
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
849 F: Float,
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 110
diff changeset
850 A: Space + Norm<ExpA, F>,
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
851 S: BoundedLinear<A, ExpA, ExpS, F>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
852 T: BoundedLinear<A, ExpA, ExpT, F>,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
853 ExpA: NormExponent,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
854 ExpS: NormExponent,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
855 ExpT: NormExponent,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
856 {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
857 fn opnorm_bound(
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
858 &self,
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
859 expa: ExpA,
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
860 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
861 ) -> DynResult<F> {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
862 // 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
863 // 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
864 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
865 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
866 Ok(ns.max(nt))
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
867 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
868 }
99
9e5b9fc81c52 Quadratic Mappings; Lipschitz trait (moved from pointsource_algs).
Tuomo Valkonen <tuomov@iki.fi>
parents: 74
diff changeset
869 };
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
870 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
871
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
872 pairnorm!(L1);
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
873 pairnorm!(L2);
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
874 pairnorm!(Linfinity);
104
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
875
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
876 /// The simplest linear mapping, scaling by a scalar.
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
877 ///
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
878 /// TODO: redefined/replace [`Weighted`] by composition with [`Scaled`].
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
879 pub struct Scaled<F: Float>(pub F);
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
880
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
881 impl<Domain, F> Mapping<Domain> for Scaled<F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
882 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
883 F: Float,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
884 Domain: Space + ClosedMul<F>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
885 {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
886 type Codomain = <Domain as Mul<F>>::Output;
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
887
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
888 /// Compute the value of `self` at `x`.
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
889 fn apply<I: Instance<Domain>>(&self, x: I) -> Self::Codomain {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
890 x.own() * self.0
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
891 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
892 }
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
893
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
894 impl<Domain, F> Linear<Domain> for Scaled<F>
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
895 where
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
896 F: Float,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
897 Domain: Space + ClosedMul<F>,
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
898 {
e7f1cb4bec78 Norm222
Tuomo Valkonen <tuomov@iki.fi>
parents: 101
diff changeset
899 }

mercurial