| 47 fn set_zero(&mut self); |
47 fn set_zero(&mut self); |
| 48 } |
48 } |
| 49 |
49 |
| 50 /// Efficient in-place application for [`Linear`] operators. |
50 /// Efficient in-place application for [`Linear`] operators. |
| 51 #[replace_float_literals(F::cast_from(literal))] |
51 #[replace_float_literals(F::cast_from(literal))] |
| 52 pub trait GEMV<F : Num, X : Space, Y = <Self as Mapping<X>>::Codomain> : Linear<X> { |
52 pub trait GEMV<F : Num, X : Space, Y : AXPY<F> = <Self as Mapping<X>>::Codomain> : Linear<X> { |
| 53 |
53 |
| |
54 /// Computes `αAx + βy`, where `A` is `Self`. |
| |
55 fn apply_add_mul<I : Instance<X>>(&self, y : Y, α : F, x : I, β : F) -> Y::Owned { |
| |
56 y.add_mul(α, self.apply(x), β) |
| |
57 } |
| |
58 |
| 54 /// Computes `y = αAx + βy`, where `A` is `Self`. |
59 /// Computes `y = αAx + βy`, where `A` is `Self`. |
| 55 fn gemv<I : Instance<X>>(&self, y : &mut Y, α : F, x : I, β : F); |
60 fn gemv<I : Instance<X>>(&self, y : &mut Y, α : F, x : I, β : F); |
| 56 |
61 |
| 57 #[inline] |
62 #[inline] |
| 58 /// Computes `y = Ax`, where `A` is `Self` |
63 /// Computes `y = Ax`, where `A` is `Self` |
| 151 { } |
156 { } |
| 152 |
157 |
| 153 #[replace_float_literals(F::cast_from(literal))] |
158 #[replace_float_literals(F::cast_from(literal))] |
| 154 impl<F : Num, X, Y> GEMV<F, X, Y> for IdOp<X> |
159 impl<F : Num, X, Y> GEMV<F, X, Y> for IdOp<X> |
| 155 where |
160 where |
| 156 Y : AXPY<F, X>, |
161 Y : AXPY<F>, |
| 157 X : Clone + Space |
162 X : Clone + Space |
| 158 { |
163 { |
| 159 // Computes `y = αAx + βy`, where `A` is `Self`. |
164 // Computes `y = αAx + βy`, where `A` is `Self`. |
| 160 fn gemv<I : Instance<X>>(&self, y : &mut Y, α : F, x : I, β : F) { |
165 fn gemv<I : Instance<X>>(&self, y : &mut Y, α : F, x : I, β : F) { |
| 161 y.axpy(α, x, β) |
166 y.axpy(α, x, β) |
| 285 { } |
290 { } |
| 286 |
291 |
| 287 impl<F, S, T, E, X, Y> GEMV<F, X, Y> for Composition<S, T, E> |
292 impl<F, S, T, E, X, Y> GEMV<F, X, Y> for Composition<S, T, E> |
| 288 where |
293 where |
| 289 F : Num, |
294 F : Num, |
| |
295 Y : AXPY<F>, |
| 290 X : Space, |
296 X : Space, |
| 291 T : Linear<X>, |
297 T : Linear<X>, |
| 292 S : GEMV<F, T::Codomain, Y>, |
298 S : GEMV<F, T::Codomain, Y>, |
| 293 { |
299 { |
| 294 fn gemv<I : Instance<X>>(&self, y : &mut Y, α : F, x : I, β : F) { |
300 fn gemv<I : Instance<X>>(&self, y : &mut Y, α : F, x : I, β : F) { |
| 359 |
365 |
| 360 impl<'b, F, S, T, Y, U, V> GEMV<F, Pair<U, V>, Y> for RowOp<S, T> |
366 impl<'b, F, S, T, Y, U, V> GEMV<F, Pair<U, V>, Y> for RowOp<S, T> |
| 361 where |
367 where |
| 362 U : Space, |
368 U : Space, |
| 363 V : Space, |
369 V : Space, |
| |
370 Y : AXPY<F>, |
| 364 S : GEMV<F, U, Y>, |
371 S : GEMV<F, U, Y>, |
| 365 T : GEMV<F, V, Y>, |
372 T : GEMV<F, V, Y>, |
| 366 F : Num, |
373 F : Num, |
| 367 Self : Linear<Pair<U, V>, Codomain=Y> |
374 Self : Linear<Pair<U, V>, Codomain=Y> |
| 368 { |
375 { |
| 403 } |
410 } |
| 404 |
411 |
| 405 impl<A, S, T> Linear<A> for ColOp<S, T> |
412 impl<A, S, T> Linear<A> for ColOp<S, T> |
| 406 where |
413 where |
| 407 A : Space, |
414 A : Space, |
| 408 S : Mapping<A>, |
415 S : Linear<A>, |
| 409 T : Mapping<A>, |
416 T : Linear<A>, |
| 410 { } |
417 { } |
| 411 |
418 |
| 412 impl<F, S, T, A, B, X> GEMV<F, X, Pair<A, B>> for ColOp<S, T> |
419 impl<F, S, T, A, B, X> GEMV<F, X, Pair<A, B>> for ColOp<S, T> |
| 413 where |
420 where |
| 414 X : Space, |
421 X : Space, |
| |
422 A : AXPY<F>, |
| |
423 B : AXPY<F>, |
| |
424 Pair<A, B> : AXPY<F>, |
| 415 S : GEMV<F, X, A>, |
425 S : GEMV<F, X, A>, |
| 416 T : GEMV<F, X, B>, |
426 T : GEMV<F, X, B>, |
| 417 F : Num, |
427 F : Num, |
| 418 Self : Linear<X, Codomain=Pair<A, B>> |
428 Self : Linear<X, Codomain=Pair<A, B>> |
| 419 { |
429 { |
| 546 T : Linear<B>, |
556 T : Linear<B>, |
| 547 { } |
557 { } |
| 548 |
558 |
| 549 impl<F, S, T, A, B, U, V> GEMV<F, Pair<U, V>, Pair<A, B>> for DiagOp<S, T> |
559 impl<F, S, T, A, B, U, V> GEMV<F, Pair<U, V>, Pair<A, B>> for DiagOp<S, T> |
| 550 where |
560 where |
| 551 A : Space, |
561 A : AXPY<F>, |
| 552 B : Space, |
562 B : AXPY<F>, |
| |
563 Pair<A, B> : AXPY<F>, |
| 553 U : Space, |
564 U : Space, |
| 554 V : Space, |
565 V : Space, |
| 555 S : GEMV<F, U, A>, |
566 S : GEMV<F, U, A>, |
| 556 T : GEMV<F, V, B>, |
567 T : GEMV<F, V, B>, |
| 557 F : Num, |
568 F : Num, |