src/direct_product.rs

branch
dev
changeset 62
d8305c9b6fdf
parent 60
848ecc05becf
child 63
f7b87d84864d
equal deleted inserted replaced
61:05089fbc0310 62:d8305c9b6fdf
268 + SubAssign<Self> + for<'b> SubAssign<&'b Self> 268 + SubAssign<Self> + for<'b> SubAssign<&'b Self>
269 + Neg<Output=PairOutput<F, A, B>> 269 + Neg<Output=PairOutput<F, A, B>>
270 { 270 {
271 type Output = PairOutput<F, A, B>; 271 type Output = PairOutput<F, A, B>;
272 272
273 fn similar_origin(&self) -> PairOutput<F, A, B> {
274 Pair(self.0.similar_origin(), self.1.similar_origin())
275 }
276
277 fn dist2_squared(&self, Pair(ref u, ref v) : &Self) -> F { 273 fn dist2_squared(&self, Pair(ref u, ref v) : &Self) -> F {
278 self.0.dist2_squared(u) + self.1.dist2_squared(v) 274 self.0.dist2_squared(u) + self.1.dist2_squared(v)
279 } 275 }
280 } 276 }
281 277
283 where 279 where
284 U : Space, 280 U : Space,
285 V : Space, 281 V : Space,
286 A : AXPY<F, U>, 282 A : AXPY<F, U>,
287 B : AXPY<F, V>, 283 B : AXPY<F, V>,
288 F : Num 284 F : Num,
289 { 285 Self : MulAssign<F>,
286 Pair<A, B> : MulAssign<F>,
287 Pair<A::Owned, B::Owned> : AXPY<F, Pair<U, V>>,
288 {
289
290 type Owned = Pair<A::Owned, B::Owned>;
290 291
291 fn axpy<I : Instance<Pair<U,V>>>(&mut self, α : F, x : I, β : F) { 292 fn axpy<I : Instance<Pair<U,V>>>(&mut self, α : F, x : I, β : F) {
292 let Pair(u, v) = x.decompose(); 293 let Pair(u, v) = x.decompose();
293 self.0.axpy(α, u, β); 294 self.0.axpy(α, u, β);
294 self.1.axpy(α, v, β); 295 self.1.axpy(α, v, β);
302 303
303 fn scale_from<I : Instance<Pair<U,V>>>(&mut self, α : F, x : I) { 304 fn scale_from<I : Instance<Pair<U,V>>>(&mut self, α : F, x : I) {
304 let Pair(u, v) = x.decompose(); 305 let Pair(u, v) = x.decompose();
305 self.0.scale_from(α, u); 306 self.0.scale_from(α, u);
306 self.1.scale_from(α, v); 307 self.1.scale_from(α, v);
308 }
309
310 /// Return a similar zero as `self`.
311 fn similar_origin(&self) -> Self::Owned {
312 Pair(self.0.similar_origin(), self.1.similar_origin())
313 }
314
315 /// Set self to zero.
316 fn set_zero(&mut self) {
317 self.0.set_zero();
318 self.1.set_zero();
307 } 319 }
308 } 320 }
309 321
310 /// [`Decomposition`] for working with [`Pair`]s. 322 /// [`Decomposition`] for working with [`Pair`]s.
311 #[derive(Copy, Clone, Debug)] 323 #[derive(Copy, Clone, Debug)]

mercurial