src/direct_product.rs

Wed, 22 Apr 2026 23:41:59 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Wed, 22 Apr 2026 23:41:59 -0500
branch
dev
changeset 197
1f301affeae3
parent 189
14193146d8f2
permissions
-rw-r--r--

Fix internal links in documentation

57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
1 /*!
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
2 Direct products of the form $A \times B$.
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
3
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
4 TODO: This could be easily much more generic if `derive_more` could derive arithmetic
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
5 operations on references.
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
6 */
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
7
63
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
8 use crate::euclidean::Euclidean;
151
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
9 use crate::instance::{Decomposition, DecompositionMut, Instance, InstanceMut, MyCow, Ownable};
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
10 use crate::linops::{VectorSpace, AXPY};
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
11 use crate::loc::Loc;
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
12 use crate::mapping::Space;
187
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
13 use crate::norms::{Dist, HasDual, Norm, NormExponent, Normed, PairNorm, L2};
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
14 use crate::types::{Float, Num};
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
15 use core::ops::{Add, AddAssign, Div, DivAssign, Mul, MulAssign, Neg, Sub, SubAssign};
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
16 use serde::{Deserialize, Serialize};
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
17 use std::clone::Clone;
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
18
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
19 #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
20 pub struct Pair<A, B>(pub A, pub B);
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
21
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
22 impl<A, B> Pair<A, B> {
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
23 pub fn new(a: A, b: B) -> Pair<A, B> {
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
24 Pair(a, b)
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
25 }
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
26 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
27
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
28 impl<A, B> From<(A, B)> for Pair<A, B> {
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
29 #[inline]
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
30 fn from((a, b): (A, B)) -> Pair<A, B> {
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
31 Pair(a, b)
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
32 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
33 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
34
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
35 impl<A, B> From<Pair<A, B>> for (A, B) {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
36 #[inline]
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
37 fn from(Pair(a, b): Pair<A, B>) -> (A, B) {
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
38 (a, b)
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
39 }
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
40 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
41
115
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
42 macro_rules! impl_unary {
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
43 ($trait:ident, $fn:ident) => {
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
44 impl<A, B> $trait for Pair<A, B>
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
45 where
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
46 A: $trait,
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
47 B: $trait,
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
48 {
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
49 type Output = Pair<A::Output, B::Output>;
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
50 fn $fn(self) -> Self::Output {
115
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
51 let Pair(a, b) = self;
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
52 Pair(a.$fn(), b.$fn())
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
53 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
54 }
115
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
55
121
fc7d923ff6e7 another overflow
Tuomo Valkonen <tuomov@iki.fi>
parents: 120
diff changeset
56 // Compiler overflow
fc7d923ff6e7 another overflow
Tuomo Valkonen <tuomov@iki.fi>
parents: 120
diff changeset
57 // impl<'a, A, B> $trait for &'a Pair<A, B>
fc7d923ff6e7 another overflow
Tuomo Valkonen <tuomov@iki.fi>
parents: 120
diff changeset
58 // where
fc7d923ff6e7 another overflow
Tuomo Valkonen <tuomov@iki.fi>
parents: 120
diff changeset
59 // &'a A: $trait,
fc7d923ff6e7 another overflow
Tuomo Valkonen <tuomov@iki.fi>
parents: 120
diff changeset
60 // &'a B: $trait,
fc7d923ff6e7 another overflow
Tuomo Valkonen <tuomov@iki.fi>
parents: 120
diff changeset
61 // {
fc7d923ff6e7 another overflow
Tuomo Valkonen <tuomov@iki.fi>
parents: 120
diff changeset
62 // type Output = Pair<<&'a A as $trait>::Output, <&'a B as $trait>::Output>;
fc7d923ff6e7 another overflow
Tuomo Valkonen <tuomov@iki.fi>
parents: 120
diff changeset
63 // fn $fn(self) -> Self::Output {
fc7d923ff6e7 another overflow
Tuomo Valkonen <tuomov@iki.fi>
parents: 120
diff changeset
64 // let Pair(ref a, ref b) = self;
fc7d923ff6e7 another overflow
Tuomo Valkonen <tuomov@iki.fi>
parents: 120
diff changeset
65 // Pair(a.$fn(), b.$fn())
fc7d923ff6e7 another overflow
Tuomo Valkonen <tuomov@iki.fi>
parents: 120
diff changeset
66 // }
fc7d923ff6e7 another overflow
Tuomo Valkonen <tuomov@iki.fi>
parents: 120
diff changeset
67 // }
115
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
68 };
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
69 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
70
115
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
71 impl_unary!(Neg, neg);
Tuomo Valkonen <tuomov@iki.fi>
parents: 114
diff changeset
72
116
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
73 macro_rules! impl_binary {
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
74 ($trait:ident, $fn:ident) => {
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
75 impl<A, B, C, D> $trait<Pair<C, D>> for Pair<A, B>
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
76 where
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
77 A: $trait<C>,
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
78 B: $trait<D>,
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
79 {
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
80 type Output = Pair<A::Output, B::Output>;
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
81 fn $fn(self, Pair(c, d): Pair<C, D>) -> Self::Output {
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
82 let Pair(a, b) = self;
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
83 Pair(a.$fn(c), b.$fn(d))
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
84 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
85 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
86
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
87 impl<'a, A, B, C, D> $trait<Pair<C, D>> for &'a Pair<A, B>
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
88 where
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
89 &'a A: $trait<C>,
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
90 &'a B: $trait<D>,
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
91 {
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
92 type Output = Pair<<&'a A as $trait<C>>::Output, <&'a B as $trait<D>>::Output>;
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
93 fn $fn(self, Pair(c, d): Pair<C, D>) -> Self::Output {
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
94 let Pair(ref a, ref b) = self;
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
95 Pair(a.$fn(c), b.$fn(d))
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
96 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
97 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
98
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
99 impl<'a, 'b, A, B, C, D> $trait<&'b Pair<C, D>> for &'a Pair<A, B>
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
100 where
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
101 &'a A: $trait<&'b C>,
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
102 &'a B: $trait<&'b D>,
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
103 {
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
104 type Output = Pair<<&'a A as $trait<&'b C>>::Output, <&'a B as $trait<&'b D>>::Output>;
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
105 fn $fn(self, Pair(ref c, ref d): &'b Pair<C, D>) -> Self::Output {
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
106 let Pair(ref a, ref b) = self;
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
107 Pair(a.$fn(c), b.$fn(d))
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
108 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
109 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
110
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
111 impl<'b, A, B, C, D> $trait<&'b Pair<C, D>> for Pair<A, B>
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
112 where
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
113 A: $trait<&'b C>,
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
114 B: $trait<&'b D>,
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
115 {
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
116 type Output = Pair<<A as $trait<&'b C>>::Output, <B as $trait<&'b D>>::Output>;
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
117 fn $fn(self, Pair(ref c, ref d): &'b Pair<C, D>) -> Self::Output {
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
118 let Pair(a, b) = self;
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
119 Pair(a.$fn(c), b.$fn(d))
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
120 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
121 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
122 };
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
123 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
124
118
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
125 impl_binary!(Add, add);
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
126 impl_binary!(Sub, sub);
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
127
119
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
128 macro_rules! impl_scalar {
120
07e487685b29 reduce restriction
Tuomo Valkonen <tuomov@iki.fi>
parents: 119
diff changeset
129 ($trait:ident, $fn:ident) => {
07e487685b29 reduce restriction
Tuomo Valkonen <tuomov@iki.fi>
parents: 119
diff changeset
130 impl<A, B, F: Num> $trait<F> for Pair<A, B>
119
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
131 where
120
07e487685b29 reduce restriction
Tuomo Valkonen <tuomov@iki.fi>
parents: 119
diff changeset
132 A: $trait<F>,
07e487685b29 reduce restriction
Tuomo Valkonen <tuomov@iki.fi>
parents: 119
diff changeset
133 B: $trait<F>,
119
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
134 {
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
135 type Output = Pair<A::Output, B::Output>;
120
07e487685b29 reduce restriction
Tuomo Valkonen <tuomov@iki.fi>
parents: 119
diff changeset
136 fn $fn(self, t: F) -> Self::Output {
119
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
137 let Pair(a, b) = self;
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
138 Pair(a.$fn(t), b.$fn(t))
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
139 }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
140 }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
141
120
07e487685b29 reduce restriction
Tuomo Valkonen <tuomov@iki.fi>
parents: 119
diff changeset
142 impl<'a, A, B, F: Num> $trait<F> for &'a Pair<A, B>
119
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
143 where
120
07e487685b29 reduce restriction
Tuomo Valkonen <tuomov@iki.fi>
parents: 119
diff changeset
144 &'a A: $trait<F>,
07e487685b29 reduce restriction
Tuomo Valkonen <tuomov@iki.fi>
parents: 119
diff changeset
145 &'a B: $trait<F>,
119
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
146 {
120
07e487685b29 reduce restriction
Tuomo Valkonen <tuomov@iki.fi>
parents: 119
diff changeset
147 type Output = Pair<<&'a A as $trait<F>>::Output, <&'a B as $trait<F>>::Output>;
07e487685b29 reduce restriction
Tuomo Valkonen <tuomov@iki.fi>
parents: 119
diff changeset
148 fn $fn(self, t: F) -> Self::Output {
119
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
149 let Pair(ref a, ref b) = self;
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
150 Pair(a.$fn(t), b.$fn(t))
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
151 }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
152 }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
153
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
154 // impl<'a, 'b, A, B> $trait<&'b $F> for &'a Pair<A, B>
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
155 // where
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
156 // &'a A: $trait<&'b $F>,
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
157 // &'a B: $trait<&'b $F>,
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
158 // {
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
159 // type Output =
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
160 // Pair<<&'a A as $trait<&'b $F>>::Output, <&'a B as $trait<&'b $F>>::Output>;
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
161 // fn $fn(self, t: &'b $F) -> Self::Output {
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
162 // let Pair(ref a, ref b) = self;
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
163 // Pair(a.$fn(t), b.$fn(t))
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
164 // }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
165 // }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
166
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
167 // impl<'b, A, B> $trait<&'b $F> for Pair<A, B>
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
168 // where
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
169 // A: $trait<&'b $F>,
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
170 // B: $trait<&'b $F>,
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
171 // {
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
172 // type Output = Pair<<A as $trait<&'b $F>>::Output, <B as $trait<&'b $F>>::Output>;
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
173 // fn $fn(self, t: &'b $F) -> Self::Output {
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
174 // let Pair(a, b) = self;
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
175 // Pair(a.$fn(t), b.$fn(t))
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
176 // }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
177 // }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
178 };
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
179 }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
180
120
07e487685b29 reduce restriction
Tuomo Valkonen <tuomov@iki.fi>
parents: 119
diff changeset
181 impl_scalar!(Mul, mul);
130
0a689881b0f1 Add more AXPY super traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 129
diff changeset
182 impl_scalar!(Div, div);
119
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
183
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
184 macro_rules! impl_scalar_lhs {
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
185 ($trait:ident, $fn:ident, $F:ty) => {
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
186 impl<A, B> $trait<Pair<A, B>> for $F
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
187 where
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
188 $F: $trait<A> + $trait<B>,
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
189 {
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
190 type Output = Pair<<$F as $trait<A>>::Output, <$F as $trait<B>>::Output>;
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
191 fn $fn(self, Pair(a, b): Pair<A, B>) -> Self::Output {
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
192 Pair(self.$fn(a), self.$fn(b))
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
193 }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
194 }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
195
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
196 // Compiler overflow:
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
197 //
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
198 // impl<'a, A, B> $trait<&'a Pair<A, B>> for $F
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
199 // where
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
200 // $F: $trait<&'a A> + $trait<&'a B>,
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
201 // {
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
202 // type Output = Pair<<$F as $trait<&'a A>>::Output, <$F as $trait<&'a B>>::Output>;
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
203 // fn $fn(self, Pair(a, b): &'a Pair<A, B>) -> Self::Output {
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
204 // Pair(self.$fn(a), self.$fn(b))
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
205 // }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
206 // }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
207 };
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
208 }
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
209
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
210 impl_scalar_lhs!(Mul, mul, f32);
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
211 impl_scalar_lhs!(Mul, mul, f64);
130
0a689881b0f1 Add more AXPY super traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 129
diff changeset
212 impl_scalar_lhs!(Div, div, f32);
0a689881b0f1 Add more AXPY super traits
Tuomo Valkonen <tuomov@iki.fi>
parents: 129
diff changeset
213 impl_scalar_lhs!(Div, div, f64);
119
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
214
117
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
215 macro_rules! impl_binary_mut {
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
216 ($trait:ident, $fn:ident) => {
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
217 impl<'a, A, B, C, D> $trait<Pair<C, D>> for Pair<A, B>
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
218 where
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
219 A: $trait<C>,
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
220 B: $trait<D>,
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
221 {
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
222 fn $fn(&mut self, Pair(c, d): Pair<C, D>) {
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
223 let Pair(ref mut a, ref mut b) = self;
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
224 a.$fn(c);
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
225 b.$fn(d);
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
226 }
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
227 }
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
228
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
229 impl<'a, 'b, A, B, C, D> $trait<&'b Pair<C, D>> for Pair<A, B>
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
230 where
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
231 A: $trait<&'b C>,
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
232 B: $trait<&'b D>,
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
233 {
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
234 fn $fn(&mut self, Pair(ref c, ref d): &'b Pair<C, D>) {
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
235 let Pair(ref mut a, ref mut b) = self;
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
236 a.$fn(c);
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
237 b.$fn(d);
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
238 }
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
239 }
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
240 };
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
241 }
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
242
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
243 impl_binary_mut!(AddAssign, add_assign);
9b782aa6b452 binops_mut
Tuomo Valkonen <tuomov@iki.fi>
parents: 116
diff changeset
244 impl_binary_mut!(SubAssign, sub_assign);
116
Tuomo Valkonen <tuomov@iki.fi>
parents: 115
diff changeset
245
118
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
246 macro_rules! impl_scalar_mut {
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
247 ($trait:ident, $fn:ident) => {
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
248 impl<'a, A, B, F: Num> $trait<F> for Pair<A, B>
118
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
249 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
250 A: $trait<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
251 B: $trait<F>,
118
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
252 {
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
253 fn $fn(&mut self, t: F) {
118
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
254 let Pair(ref mut a, ref mut b) = self;
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
255 a.$fn(t);
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
256 b.$fn(t);
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
257 }
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
258 }
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
259 };
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
260 }
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
261
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
262 impl_scalar_mut!(MulAssign, mul_assign);
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
263 impl_scalar_mut!(DivAssign, div_assign);
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
264
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
265 /// Trait for ownable-by-consumption objects
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
266 impl<A, B> Ownable for Pair<A, B>
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
267 where
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
268 A: Ownable,
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
269 B: Ownable,
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
270 {
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
271 type OwnedVariant = Pair<A::OwnedVariant, B::OwnedVariant>;
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
272
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
273 #[inline]
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
274 fn into_owned(self) -> Self::OwnedVariant {
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
275 Pair(self.0.into_owned(), self.1.into_owned())
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
276 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
277
162
bea0c3841ced cow_owned etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 155
diff changeset
278 #[inline]
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
279 fn clone_owned(&self) -> Self::OwnedVariant {
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
280 Pair(self.0.clone_owned(), self.1.clone_owned())
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
281 }
162
bea0c3841ced cow_owned etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 155
diff changeset
282
bea0c3841ced cow_owned etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 155
diff changeset
283 #[inline]
bea0c3841ced cow_owned etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 155
diff changeset
284 fn cow_owned<'b>(self) -> MyCow<'b, Self::OwnedVariant>
bea0c3841ced cow_owned etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 155
diff changeset
285 where
bea0c3841ced cow_owned etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 155
diff changeset
286 Self: 'b,
bea0c3841ced cow_owned etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 155
diff changeset
287 {
bea0c3841ced cow_owned etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 155
diff changeset
288 MyCow::Owned(self.into_owned())
bea0c3841ced cow_owned etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 155
diff changeset
289 }
166
Tuomo Valkonen <tuomov@iki.fi>
parents: 164
diff changeset
290
Tuomo Valkonen <tuomov@iki.fi>
parents: 164
diff changeset
291 #[inline]
Tuomo Valkonen <tuomov@iki.fi>
parents: 164
diff changeset
292 fn ref_cow_owned<'b>(&'b self) -> MyCow<'b, Self::OwnedVariant>
Tuomo Valkonen <tuomov@iki.fi>
parents: 164
diff changeset
293 where
Tuomo Valkonen <tuomov@iki.fi>
parents: 164
diff changeset
294 Self: 'b,
Tuomo Valkonen <tuomov@iki.fi>
parents: 164
diff changeset
295 {
Tuomo Valkonen <tuomov@iki.fi>
parents: 164
diff changeset
296 MyCow::Owned(self.clone_owned())
Tuomo Valkonen <tuomov@iki.fi>
parents: 164
diff changeset
297 }
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
298 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
299
119
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
300 /// We only support 'closed' `Euclidean` `Pair`s, as more general ones cause
cc0c6a8d0933 simplify
Tuomo Valkonen <tuomov@iki.fi>
parents: 118
diff changeset
301 /// compiler overflows.
118
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
302 impl<A, B, F: Float> Euclidean<F> for Pair<A, B>
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
303 where
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
304 A: Euclidean<F>,
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
305 B: Euclidean<F>,
151
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
306 // //Pair<A, B>: Euclidean<F>,
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
307 // Self: Sized
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
308 // + Mul<F, Output = Self::OwnedEuclidean>
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
309 // + MulAssign<F>
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
310 // + Div<F, Output = Self::OwnedEuclidean>
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
311 // + DivAssign<F>
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
312 // + Add<Self, Output = Self::OwnedEuclidean>
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
313 // + Sub<Self, Output = Self::OwnedEuclidean>
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
314 // + for<'b> Add<&'b Self, Output = Self::OwnedEuclidean>
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
315 // + for<'b> Sub<&'b Self, Output = Self::OwnedEuclidean>
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
316 // + AddAssign<Self>
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
317 // + for<'b> AddAssign<&'b Self>
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
318 // + SubAssign<Self>
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
319 // + for<'b> SubAssign<&'b Self>
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
320 // + Neg<Output = Self::OwnedEuclidean>,
118
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
321 {
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 162
diff changeset
322 type PrincipalE = Pair<A::PrincipalE, B::PrincipalE>;
151
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
323
118
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
324 fn dot<I: Instance<Self>>(&self, other: I) -> F {
133
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
325 other.eval_decompose(|Pair(u, v)| self.0.dot(u) + self.1.dot(v))
118
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
326 }
63
f7b87d84864d Extra reflexivity and hilbert-like requirements for Euclidean. Fuse Dot into Euclidean.
Tuomo Valkonen <tuomov@iki.fi>
parents: 62
diff changeset
327
118
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
328 fn norm2_squared(&self) -> F {
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
329 self.0.norm2_squared() + self.1.norm2_squared()
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
330 }
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
331
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
332 fn dist2_squared<I: Instance<Self>>(&self, other: I) -> F {
133
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
333 other.eval_decompose(|Pair(u, v)| self.0.dist2_squared(u) + self.1.dist2_squared(v))
118
0fabd0b5914c restrict
Tuomo Valkonen <tuomov@iki.fi>
parents: 117
diff changeset
334 }
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
335 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
336
151
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
337 impl<F, A, B> VectorSpace for Pair<A, B>
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
338 where
151
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
339 A: VectorSpace<Field = F>,
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
340 B: VectorSpace<Field = F>,
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
341 F: Num,
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
342 {
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
343 type Field = F;
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 162
diff changeset
344 type PrincipalV = Pair<A::PrincipalV, B::PrincipalV>;
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
345
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
346 /// Return a similar zero as `self`.
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 162
diff changeset
347 fn similar_origin(&self) -> Self::PrincipalV {
150
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
348 Pair(self.0.similar_origin(), self.1.similar_origin())
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
349 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
350
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
351 // #[inline]
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
352 // fn into_owned(self) -> Self::Owned {
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
353 // Pair(self.0.into_owned(), self.1.into_owned())
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
354 // }
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
355 }
Tuomo Valkonen <tuomov@iki.fi>
parents: 144
diff changeset
356
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
357 impl<F, A, B, U, V> AXPY<Pair<U, V>> for Pair<A, B>
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
358 where
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
359 U: Space,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
360 V: 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
361 A: AXPY<U, 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
362 B: AXPY<V, Field = F>,
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
363 F: Num,
151
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
364 // Self: MulAssign<F> + DivAssign<F>,
402d717bb5c0 lots of space changes
Tuomo Valkonen <tuomov@iki.fi>
parents: 150
diff changeset
365 // Pair<A, B>: MulAssign<F> + DivAssign<F>,
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
366 {
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
367 fn axpy<I: Instance<Pair<U, V>>>(&mut self, α: F, x: I, β: F) {
133
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
368 x.eval_decompose(|Pair(u, v)| {
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
369 self.0.axpy(α, u, β);
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
370 self.1.axpy(α, v, β);
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
371 })
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
372 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
373
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
374 fn copy_from<I: Instance<Pair<U, V>>>(&mut self, x: I) {
133
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
375 x.eval_decompose(|Pair(u, v)| {
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
376 self.0.copy_from(u);
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
377 self.1.copy_from(v);
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
378 })
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
379 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
380
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
381 fn scale_from<I: Instance<Pair<U, V>>>(&mut self, α: F, x: I) {
133
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
382 x.eval_decompose(|Pair(u, v)| {
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
383 self.0.scale_from(α, u);
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
384 self.1.scale_from(α, v);
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
385 })
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
386 }
62
d8305c9b6fdf Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
387
d8305c9b6fdf Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
388 /// Set self to zero.
d8305c9b6fdf Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
389 fn set_zero(&mut self) {
d8305c9b6fdf Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
390 self.0.set_zero();
d8305c9b6fdf Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
391 self.1.set_zero();
d8305c9b6fdf Move origin stuff to AXPY form Euclidean
Tuomo Valkonen <tuomov@iki.fi>
parents: 60
diff changeset
392 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
393 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
394
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
395 /// [`Decomposition`] for working with [`Pair`]s.
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
396 #[derive(Copy, Clone, Debug)]
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
397 pub struct PairDecomposition<D, Q>(D, Q);
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
398
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
399 impl<A: Space, B: Space> Space for Pair<A, B> {
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 162
diff changeset
400 type Principal = Pair<A::Principal, B::Principal>;
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
401 type Decomp = PairDecomposition<A::Decomp, B::Decomp>;
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
402 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
403
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
404 impl<A, B, D, Q> Decomposition<Pair<A, B>> for PairDecomposition<D, Q>
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
405 where
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
406 A: Space,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
407 B: Space,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
408 D: Decomposition<A>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
409 Q: Decomposition<B>,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
410 {
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
411 type Decomposition<'b>
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
412 = Pair<D::Decomposition<'b>, Q::Decomposition<'b>>
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
413 where
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
414 Pair<A, B>: 'b;
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
415 type Reference<'b>
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
416 = Pair<D::Reference<'b>, Q::Reference<'b>>
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
417 where
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
418 Pair<A, B>: 'b;
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
419
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
420 #[inline]
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
421 fn lift<'b>(Pair(u, v): Self::Reference<'b>) -> Self::Decomposition<'b> {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
422 Pair(D::lift(u), Q::lift(v))
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
423 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
424 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
425
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
426 impl<A, B, U, V, D, Q> Instance<Pair<A, B>, PairDecomposition<D, Q>> for Pair<U, V>
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
427 where
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
428 A: Space,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
429 B: Space,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
430 D: Decomposition<A>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
431 Q: Decomposition<B>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
432 U: Instance<A, D>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
433 V: Instance<B, Q>,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
434 {
168
93daa824c04a No supertraits for Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 166
diff changeset
435 #[inline]
171
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
436 fn eval_ref<'b, R>(&'b self, f: impl FnOnce(Pair<D::Reference<'b>, Q::Reference<'b>>) -> R) -> R
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
437 where
133
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
438 Pair<A, B>: 'b,
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
439 Self: 'b,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
440 {
171
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
441 self.0.eval_ref(|a| self.1.eval_ref(|b| f(Pair(a, b))))
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
442 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
443
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
444 #[inline]
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 162
diff changeset
445 fn cow<'b>(self) -> MyCow<'b, Pair<A::Principal, B::Principal>>
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
446 where
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
447 Self: 'b,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
448 {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
449 MyCow::Owned(Pair(self.0.own(), self.1.own()))
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
450 }
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
451
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
452 #[inline]
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 162
diff changeset
453 fn own(self) -> Pair<A::Principal, B::Principal> {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
454 Pair(self.0.own(), self.1.own())
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
455 }
171
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
456
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
457 #[inline]
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
458 fn decompose<'b>(self) -> Pair<D::Decomposition<'b>, Q::Decomposition<'b>>
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
459 where
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
460 Self: 'b,
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
461 {
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
462 Pair(self.0.decompose(), self.1.decompose())
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
463 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
464 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
465
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
466 impl<'a, A, B, U, V, D, Q> Instance<Pair<A, B>, PairDecomposition<D, Q>> for &'a Pair<U, V>
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
467 where
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
468 A: Space,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
469 B: Space,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
470 D: Decomposition<A>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
471 Q: Decomposition<B>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
472 U: Instance<A, D>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
473 V: Instance<B, Q>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
474 &'a U: Instance<A, D>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
475 &'a V: Instance<B, Q>,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
476 {
171
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
477 fn eval_ref<'b, R>(&'b self, f: impl FnOnce(Pair<D::Reference<'b>, Q::Reference<'b>>) -> R) -> R
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
478 where
133
2b13f8a0c8ba Replace Instance ref_instance and decompose by eval_* for flexibility
Tuomo Valkonen <tuomov@iki.fi>
parents: 132
diff changeset
479 Pair<A, B>: 'b,
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
480 Self: 'b,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
481 {
171
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
482 self.0.eval_ref(|a| self.1.eval_ref(|b| f(Pair(a, b))))
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
483 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
484
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
485 #[inline]
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 162
diff changeset
486 fn cow<'b>(self) -> MyCow<'b, Pair<A::Principal, B::Principal>>
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
487 where
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
488 Self: 'b,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
489 {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
490 MyCow::Owned(self.own())
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
491 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
492
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
493 #[inline]
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 162
diff changeset
494 fn own(self) -> Pair<A::Principal, B::Principal> {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
495 let Pair(ref u, ref v) = self;
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
496 Pair(u.own(), v.own())
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
497 }
171
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
498
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
499 #[inline]
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
500 fn decompose<'b>(self) -> Pair<D::Decomposition<'b>, Q::Decomposition<'b>>
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
501 where
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
502 Self: 'b,
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
503 {
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
504 let Pair(u, v) = self;
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
505 Pair(u.decompose(), v.decompose())
fa8df5a14486 decompose
Tuomo Valkonen <tuomov@iki.fi>
parents: 168
diff changeset
506 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
507 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
508
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
509 impl<A, B, D, Q> DecompositionMut<Pair<A, B>> for PairDecomposition<D, Q>
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
510 where
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
511 A: Space,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
512 B: Space,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
513 D: DecompositionMut<A>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
514 Q: DecompositionMut<B>,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
515 {
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
516 type ReferenceMut<'b>
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
517 = Pair<D::ReferenceMut<'b>, Q::ReferenceMut<'b>>
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
518 where
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
519 Pair<A, B>: 'b;
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
520 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
521
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
522 impl<A, B, U, V, D, Q> InstanceMut<Pair<A, B>, PairDecomposition<D, Q>> for Pair<U, V>
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
523 where
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
524 A: Space,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
525 B: Space,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
526 D: DecompositionMut<A>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
527 Q: DecompositionMut<B>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
528 U: InstanceMut<A, D>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
529 V: InstanceMut<B, Q>,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
530 {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
531 #[inline]
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
532 fn ref_instance_mut(
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
533 &mut self,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
534 ) -> <PairDecomposition<D, Q> as DecompositionMut<Pair<A, B>>>::ReferenceMut<'_> {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
535 Pair(self.0.ref_instance_mut(), self.1.ref_instance_mut())
57
1b3b1687b9ed Add direct products (Pair, RowOp, ColOp, DiagOp)
Tuomo Valkonen <tuomov@iki.fi>
parents:
diff changeset
536 }
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
537 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
538
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
539 impl<'a, A, B, U, V, D, Q> InstanceMut<Pair<A, B>, PairDecomposition<D, Q>> for &'a mut Pair<U, V>
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
540 where
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
541 A: Space,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
542 B: Space,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
543 D: DecompositionMut<A>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
544 Q: DecompositionMut<B>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
545 U: InstanceMut<A, D>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
546 V: InstanceMut<B, Q>,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
547 {
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
548 #[inline]
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
549 fn ref_instance_mut(
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
550 &mut self,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
551 ) -> <PairDecomposition<D, Q> as DecompositionMut<Pair<A, B>>>::ReferenceMut<'_> {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
552 Pair(self.0.ref_instance_mut(), self.1.ref_instance_mut())
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
553 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
554 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
555
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 121
diff changeset
556 impl<F, A, B, ExpA, ExpB, ExpJ> Norm<PairNorm<ExpA, ExpB, ExpJ>, F> for Pair<A, B>
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
557 where
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
558 F: Num,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
559 ExpA: NormExponent,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
560 ExpB: NormExponent,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
561 ExpJ: NormExponent,
124
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 121
diff changeset
562 A: Norm<ExpA, F>,
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 121
diff changeset
563 B: Norm<ExpB, F>,
6aa955ad8122 Transpose loc parameters to allow f64 defaults
Tuomo Valkonen <tuomov@iki.fi>
parents: 121
diff changeset
564 Loc<2, F>: Norm<ExpJ, F>,
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
565 {
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
566 fn norm(&self, PairNorm(expa, expb, expj): PairNorm<ExpA, ExpB, ExpJ>) -> F {
59
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
567 Loc([self.0.norm(expa), self.1.norm(expb)]).norm(expj)
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
568 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
569 }
9226980e45a7 Significantly simplify Mapping / Apply through Instance
Tuomo Valkonen <tuomov@iki.fi>
parents: 57
diff changeset
570
187
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
571 impl<F, A, B, ExpA, ExpB, ExpJ> Dist<PairNorm<ExpA, ExpB, ExpJ>, F> for Pair<A, B>
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
572 where
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
573 F: Num,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
574 ExpA: NormExponent,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
575 ExpB: NormExponent,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
576 ExpJ: NormExponent,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
577 A: Dist<ExpA, F>,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
578 B: Dist<ExpB, F>,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
579 Loc<2, F>: Norm<ExpJ, F>,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
580 {
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
581 fn dist<I: Instance<Self>>(
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
582 &self,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
583 x: I,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
584 PairNorm(expa, expb, expj): PairNorm<ExpA, ExpB, ExpJ>,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
585 ) -> F {
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
586 x.eval_decompose(|Pair(x1, x2)| {
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
587 Loc([self.0.dist(x1, expa), self.1.dist(x2, expb)]).norm(expj)
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
588 })
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
589 }
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
590 }
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
591
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
592 impl<F, A, B> Norm<L2, F> for Pair<A, B>
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
593 where
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
594 F: Num,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
595 A: Norm<L2, F>,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
596 B: Norm<L2, F>,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
597 Loc<2, F>: Norm<L2, F>,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
598 {
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
599 fn norm(&self, _: L2) -> F {
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
600 Loc([self.0.norm(L2), self.1.norm(L2)]).norm(L2)
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
601 }
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
602 }
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
603
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
604 impl<F, A, B> Dist<L2, F> for Pair<A, B>
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
605 where
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
606 F: Num,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
607 A: Dist<L2, F>,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
608 B: Dist<L2, F>,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
609 Loc<2, F>: Norm<L2, F>,
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
610 {
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
611 fn dist<I: Instance<Self>>(&self, x: I, _: L2) -> F {
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
612 x.eval_decompose(|Pair(x1, x2)| Loc([self.0.dist(x1, L2), self.1.dist(x2, L2)]).norm(L2))
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
613 }
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
614 }
76c77e49581a Pair L2 norms and distances
Tuomo Valkonen <tuomov@iki.fi>
parents: 182
diff changeset
615
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
616 impl<F: Float, A, B> Normed<F> for Pair<A, B>
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
617 where
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
618 A: Normed<F>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
619 B: Normed<F>,
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
620 {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
621 type NormExp = PairNorm<A::NormExp, B::NormExp, L2>;
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
622
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
623 #[inline]
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
624 fn norm_exponent(&self) -> Self::NormExp {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
625 PairNorm(self.0.norm_exponent(), self.1.norm_exponent(), L2)
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
626 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
627
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
628 #[inline]
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
629 fn is_zero(&self) -> bool {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
630 self.0.is_zero() && self.1.is_zero()
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
631 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
632 }
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
633
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
634 impl<F: Float, A, B> HasDual<F> for Pair<A, B>
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
635 where
94
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
636 A: HasDual<F>,
1f19c6bbf07b Fix build with stable rust.
Tuomo Valkonen <tuomov@iki.fi>
parents: 64
diff changeset
637 B: HasDual<F>,
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
638 {
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
639 type DualSpace = Pair<A::DualSpace, B::DualSpace>;
138
593912dc3293 dual_origin
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
640
164
fd9dba51afd3 OwnedSpace -> Principal
Tuomo Valkonen <tuomov@iki.fi>
parents: 162
diff changeset
641 fn dual_origin(&self) -> <Self::DualSpace as VectorSpace>::PrincipalV {
138
593912dc3293 dual_origin
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
642 Pair(self.0.dual_origin(), self.1.dual_origin())
593912dc3293 dual_origin
Tuomo Valkonen <tuomov@iki.fi>
parents: 133
diff changeset
643 }
60
848ecc05becf More convexity, normed spaces, etc.
Tuomo Valkonen <tuomov@iki.fi>
parents: 59
diff changeset
644 }
144
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
645
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
646 #[cfg(feature = "pyo3")]
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
647 mod python {
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
648 use super::Pair;
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
649 use pyo3::conversion::FromPyObject;
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
650 use pyo3::types::{PyAny, PyTuple};
189
14193146d8f2 pyo3 update to 0.27
Tuomo Valkonen <tuomov@iki.fi>
parents: 187
diff changeset
651 use pyo3::{Borrowed, Bound, IntoPyObject, PyErr, Python};
144
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
652
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
653 impl<'py, A, B> IntoPyObject<'py> for Pair<A, B>
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
654 where
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
655 A: IntoPyObject<'py>,
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
656 B: IntoPyObject<'py>,
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
657 {
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
658 type Target = PyTuple;
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
659 type Error = PyErr;
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
660 type Output = Bound<'py, Self::Target>;
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
661
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
662 fn into_pyobject(self, py: Python<'py>) -> Result<Self::Output, Self::Error> {
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
663 (self.0, self.1).into_pyobject(py)
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
664 }
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
665 }
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
666
182
71fa6d3df947 Disable Pair reference pyo3 conversions to avoid compiler bugs
Tuomo Valkonen <tuomov@iki.fi>
parents: 171
diff changeset
667 /*
144
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
668 impl<'a, 'py, A, B> IntoPyObject<'py> for &'a mut Pair<A, B>
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
669 where
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
670 &'a mut A: IntoPyObject<'py>,
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
671 &'a mut B: IntoPyObject<'py>,
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
672 {
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
673 type Target = PyTuple;
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
674 type Error = PyErr;
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
675 type Output = Bound<'py, Self::Target>;
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
676
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
677 fn into_pyobject(self, py: Python<'py>) -> Result<Self::Output, Self::Error> {
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
678 (&mut self.0, &mut self.1).into_pyobject(py)
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
679 }
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
680 }
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
681
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
682 impl<'a, 'py, A, B> IntoPyObject<'py> for &'a Pair<A, B>
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
683 where
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
684 &'a A: IntoPyObject<'py>,
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
685 &'a B: IntoPyObject<'py>,
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
686 {
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
687 type Target = PyTuple;
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
688 type Error = PyErr;
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
689 type Output = Bound<'py, Self::Target>;
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
690
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
691 fn into_pyobject(self, py: Python<'py>) -> Result<Self::Output, Self::Error> {
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
692 (&self.0, &self.1).into_pyobject(py)
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
693 }
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
694 }
182
71fa6d3df947 Disable Pair reference pyo3 conversions to avoid compiler bugs
Tuomo Valkonen <tuomov@iki.fi>
parents: 171
diff changeset
695 */
144
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
696
189
14193146d8f2 pyo3 update to 0.27
Tuomo Valkonen <tuomov@iki.fi>
parents: 187
diff changeset
697 impl<'a, 'py, A, B> FromPyObject<'a, 'py> for Pair<A, B>
144
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
698 where
189
14193146d8f2 pyo3 update to 0.27
Tuomo Valkonen <tuomov@iki.fi>
parents: 187
diff changeset
699 A: Clone + FromPyObject<'a, 'py>,
14193146d8f2 pyo3 update to 0.27
Tuomo Valkonen <tuomov@iki.fi>
parents: 187
diff changeset
700 B: Clone + FromPyObject<'a, 'py>,
144
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
701 {
189
14193146d8f2 pyo3 update to 0.27
Tuomo Valkonen <tuomov@iki.fi>
parents: 187
diff changeset
702 type Error = PyErr;
14193146d8f2 pyo3 update to 0.27
Tuomo Valkonen <tuomov@iki.fi>
parents: 187
diff changeset
703
14193146d8f2 pyo3 update to 0.27
Tuomo Valkonen <tuomov@iki.fi>
parents: 187
diff changeset
704 fn extract(ob: Borrowed<'a, 'py, PyAny>) -> Result<Self, PyErr> {
14193146d8f2 pyo3 update to 0.27
Tuomo Valkonen <tuomov@iki.fi>
parents: 187
diff changeset
705 FromPyObject::extract(ob).map(|(a, b)| Pair(a, b))
144
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
706 }
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
707 }
44d859269132 Basic Pair pyo3 conversions
Tuomo Valkonen <tuomov@iki.fi>
parents: 138
diff changeset
708 }

mercurial