MUQ  0.4.3
GaussNewtonOperator.cpp
Go to the documentation of this file.
2 
4 
5 using namespace muq::Modeling;
6 
7 
8 GaussNewtonOperator::GaussNewtonOperator(std::shared_ptr<ModPiece> const& forwardModelIn,
9  std::shared_ptr<ModPiece> const& noiseModelIn,
10  std::vector<Eigen::VectorXd> const& inputsIn,
11  unsigned int inWrtIn,
12  double scaleIn,
13  double nuggetIn) : LinearOperator(forwardModelIn->inputSizes(inWrtIn), forwardModelIn->inputSizes(inWrtIn)),
14  forwardModel(forwardModelIn),
15  noiseModel(noiseModelIn),
16  inputs(inputsIn),
17  noiseInputs(forwardModelIn->Evaluate(inputsIn)),
18  inWrt(inWrtIn),
19  scale(scaleIn),
20  nugget(nuggetIn)
21 {
22  assert(noiseModelIn->inputSizes.size()==1);
23  assert(noiseModelIn->outputSizes.size()==1);
24  assert(noiseModelIn->outputSizes(0)==1);
25 
26  assert(forwardModel->outputSizes.size()==1);
27  assert(forwardModel->outputSizes(0)==noiseModelIn->inputSizes(0));
28  assert(forwardModel->inputSizes.size()>inWrtIn);
29 }
30 
31 
32 Eigen::MatrixXd GaussNewtonOperator::Apply(Eigen::Ref<const Eigen::MatrixXd> const& x)
33 {
34  Eigen::MatrixXd output(rows(),x.cols());
35  Eigen::VectorXd sens = Eigen::VectorXd::Ones(1);
36 
37  for(unsigned int i=0; i<x.cols(); ++i){
38  Eigen::VectorXd temp = forwardModel->ApplyJacobian(0,inWrt,inputs,x.col(i).eval());
39  temp = noiseModel->ApplyHessian(0, 0, 0, noiseInputs, sens, temp);
40  output.col(i) = forwardModel->Gradient(0,inWrt,inputs,temp);
41  output.col(i) *= scale;
42  output.col(i) += nugget*x.col(i);
43  }
44  return output;
45 }
46 
47 Eigen::MatrixXd GaussNewtonOperator::ApplyTranspose(Eigen::Ref<const Eigen::MatrixXd> const& x)
48 {
49  return Apply(x);
50 }
const std::vector< Eigen::VectorXd > noiseInputs
virtual Eigen::MatrixXd Apply(Eigen::Ref< const Eigen::MatrixXd > const &x) override
const std::vector< Eigen::VectorXd > inputs
virtual Eigen::MatrixXd ApplyTranspose(Eigen::Ref< const Eigen::MatrixXd > const &x) override
GaussNewtonOperator(std::shared_ptr< ModPiece > const &forwardModelIn, std::shared_ptr< ModPiece > const &noiseModelIn, std::vector< Eigen::VectorXd > const &inputsIn, unsigned int inWrt, double scaleIn=1.0, double nuggetIn=0.0)
std::shared_ptr< ModPiece > forwardModel
std::shared_ptr< ModPiece > noiseModel
Generic linear operator base class.