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