1 #include "MUQ/Modeling/LinearAlgebra/AffineOperator.h"
2 
3 
4 using namespace muq::Modeling;
5 
AffineOperator(std::shared_ptr<LinearOperator> const & Ain,Eigen::VectorXd const & bIn)6 AffineOperator::AffineOperator(std::shared_ptr<LinearOperator> const& Ain,
7                                Eigen::VectorXd                 const& bIn) : ModPiece(Ain->inputSizes,
8                                                                                       Ain->outputSizes),
9                                                                              A(Ain),
10                                                                              b(bIn)
11 {
12   assert(A->rows()==b.rows());
13 };
14 
EvaluateImpl(muq::Modeling::ref_vector<Eigen::VectorXd> const & input)15 void AffineOperator::EvaluateImpl(muq::Modeling::ref_vector<Eigen::VectorXd> const& input)
16 {
17   outputs.resize(1);
18   outputs.at(0) = b + A->Apply(input.at(0).get()).col(0);
19 }
20 
GradientImpl(unsigned int const outputDimWrt,unsigned int const inputDimWrt,muq::Modeling::ref_vector<Eigen::VectorXd> const & input,Eigen::VectorXd const & sensitivity)21 void AffineOperator::GradientImpl(unsigned int                const  outputDimWrt,
22                                   unsigned int                const  inputDimWrt,
23                                   muq::Modeling::ref_vector<Eigen::VectorXd> const& input,
24                                   Eigen::VectorXd             const& sensitivity)
25 {
26   gradient = A->ApplyTranspose(sensitivity);
27 }
28 
JacobianImpl(unsigned int const outputDimWrt,unsigned int const inputDimWrt,muq::Modeling::ref_vector<Eigen::VectorXd> const & input)29 void AffineOperator::JacobianImpl(unsigned int                const  outputDimWrt,
30                                   unsigned int                const  inputDimWrt,
31                                   muq::Modeling::ref_vector<Eigen::VectorXd> const& input)
32 {
33   jacobian = A->GetMatrix();
34 }
35 
ApplyJacobianImpl(unsigned int const outputDimWrt,unsigned int const inputDimWrt,muq::Modeling::ref_vector<Eigen::VectorXd> const & input,Eigen::VectorXd const & vec)36 void AffineOperator::ApplyJacobianImpl(unsigned int                const  outputDimWrt,
37                                        unsigned int                const  inputDimWrt,
38                                        muq::Modeling::ref_vector<Eigen::VectorXd> const& input,
39                                        Eigen::VectorXd             const& vec)
40 {
41   jacobianAction = A->Apply(vec);
42 }
43