| 614 T: Mapping<A>, |
614 T: Mapping<A>, |
| 615 { |
615 { |
| 616 type Codomain = Pair<S::Codomain, T::Codomain>; |
616 type Codomain = Pair<S::Codomain, T::Codomain>; |
| 617 |
617 |
| 618 fn apply<I: Instance<A>>(&self, a: I) -> Self::Codomain { |
618 fn apply<I: Instance<A>>(&self, a: I) -> Self::Codomain { |
| 619 Pair(a.eval_ref_decompose(|r| self.0.apply(r)), self.1.apply(a)) |
619 Pair(a.eval_ref(|r| self.0.apply(r)), self.1.apply(a)) |
| 620 } |
620 } |
| 621 } |
621 } |
| 622 |
622 |
| 623 impl<A, S, T> Linear<A> for ColOp<S, T> |
623 impl<A, S, T> Linear<A> for ColOp<S, T> |
| 624 where |
624 where |
| 635 T: GEMV<F, X, B>, |
635 T: GEMV<F, X, B>, |
| 636 F: Num, |
636 F: Num, |
| 637 Self: Linear<X, Codomain = Pair<A, B>>, |
637 Self: Linear<X, Codomain = Pair<A, B>>, |
| 638 { |
638 { |
| 639 fn gemv<I: Instance<X>>(&self, y: &mut Pair<A, B>, α: F, x: I, β: F) { |
639 fn gemv<I: Instance<X>>(&self, y: &mut Pair<A, B>, α: F, x: I, β: F) { |
| 640 x.eval_ref_decompose(|r| self.0.gemv(&mut y.0, α, r, β)); |
640 x.eval_ref(|r| self.0.gemv(&mut y.0, α, r, β)); |
| 641 self.1.gemv(&mut y.1, α, x, β); |
641 self.1.gemv(&mut y.1, α, x, β); |
| 642 } |
642 } |
| 643 |
643 |
| 644 fn apply_mut<I: Instance<X>>(&self, y: &mut Pair<A, B>, x: I) { |
644 fn apply_mut<I: Instance<X>>(&self, y: &mut Pair<A, B>, x: I) { |
| 645 x.eval_ref_decompose(|r| self.0.apply_mut(&mut y.0, r)); |
645 x.eval_ref(|r| self.0.apply_mut(&mut y.0, r)); |
| 646 self.1.apply_mut(&mut y.1, x); |
646 self.1.apply_mut(&mut y.1, x); |
| 647 } |
647 } |
| 648 |
648 |
| 649 /// Computes `y += Ax`, where `A` is `Self` |
649 /// Computes `y += Ax`, where `A` is `Self` |
| 650 fn apply_add<I: Instance<X>>(&self, y: &mut Pair<A, B>, x: I) { |
650 fn apply_add<I: Instance<X>>(&self, y: &mut Pair<A, B>, x: I) { |
| 651 x.eval_ref_decompose(|r| self.0.apply_add(&mut y.0, r)); |
651 x.eval_ref(|r| self.0.apply_add(&mut y.0, r)); |
| 652 self.1.apply_add(&mut y.1, x); |
652 self.1.apply_add(&mut y.1, x); |
| 653 } |
653 } |
| 654 } |
654 } |
| 655 |
655 |
| 656 impl<A, B, Yʹ, S, T> Adjointable<Pair<A, B>, Yʹ> for RowOp<S, T> |
656 impl<A, B, Yʹ, S, T> Adjointable<Pair<A, B>, Yʹ> for RowOp<S, T> |