MUQ  0.4.3
LinearOperator.h
Go to the documentation of this file.
1 #ifndef LINEAROPERATOR_H
2 #define LINEAROPERATOR_H
3 
5 
6 #include <Eigen/Core>
7 
8 #include <memory>
9 #include <iostream>
10 #include <exception>
11 
12 namespace muq
13 {
14 namespace Utilities
15 {
16 
17 
18 class LinearOperatorTypeException: public std::exception
19 {
20  virtual const char* what() const throw()
21  {
22  return "Tried creating a linear operator from an unsupported type. Make sure all necessary headers are included and a child of LinearOperator exists for this type.";
23  }
24 };
25 
26 class LinearOperator;
27 
28 template<typename MatrixType>
30 {
31  static std::shared_ptr<LinearOperator> Create(MatrixType const& A)
32  {
34 
35  return std::shared_ptr<LinearOperator>();
36 
37  };
38 };
39 
63 public:
64 
65  LinearOperator(int rowsIn, int colsIn, int numInputCols=1);
66 
67  virtual ~LinearOperator(){};
68 
70  virtual Eigen::MatrixXd Apply(Eigen::Ref<const Eigen::MatrixXd> const& x) = 0;
71 
73  virtual Eigen::MatrixXd ApplyTranspose(Eigen::Ref<const Eigen::MatrixXd> const& x) = 0;
74 
76  virtual void Apply(Eigen::Ref<const Eigen::MatrixXd> const& x, Eigen::Ref<Eigen::MatrixXd> y);
77 
79  virtual void ApplyTranspose(Eigen::Ref<const Eigen::MatrixXd> const& x, Eigen::Ref<Eigen::MatrixXd> y);
80 
82  int rows() const { return nrows; }
83 
85  int cols() const { return ncols; }
86 
88  virtual Eigen::MatrixXd GetMatrix();
89 
90  template<typename OtherType>
91  static std::shared_ptr<LinearOperator> Create(OtherType const& A)
92  {
94  }
95 
96 protected:
97 
98  const int ncols;
99  const int nrows;
100 
101  // ModPiece overrides
102  virtual void EvaluateImpl(muq::Modeling::ref_vector<Eigen::VectorXd> const& input) override;
103 
104  virtual void GradientImpl(unsigned int const outputDimWrt,
105  unsigned int const inputDimWrt,
107  Eigen::VectorXd const& sensitivity) override;
108 
109  virtual void JacobianImpl(unsigned int const outputDimWrt,
110  unsigned int const inputDimWrt,
111  muq::Modeling::ref_vector<Eigen::VectorXd> const& input) override;
112 
113  virtual void ApplyJacobianImpl(unsigned int const outputDimWrt,
114  unsigned int const inputDimWrt,
116  Eigen::VectorXd const& vec) override;
117 };
118 
119 
120 
121 
122 } // namespace Utilities
123 } // namespace MUQ
124 
125 #endif
Provides an abstract interface for defining vector-valued model components.
Definition: ModPiece.h:148
virtual void GradientImpl(unsigned int const outputDimWrt, unsigned int const inputDimWrt, ref_vector< Eigen::VectorXd > const &input, Eigen::VectorXd const &sensitivity)
Definition: ModPiece.cpp:237
virtual void ApplyJacobianImpl(unsigned int const outputDimWrt, unsigned int const inputDimWrt, ref_vector< Eigen::VectorXd > const &input, Eigen::VectorXd const &vec)
Definition: ModPiece.cpp:262
virtual void EvaluateImpl(ref_vector< boost::any > const &inputs) override
User-implemented function that determines the behavior of this muq::Modeling::WorkPiece.
Definition: ModPiece.cpp:179
virtual void JacobianImpl(unsigned int const outputDimWrt, unsigned int const inputDimWrt, ref_vector< Eigen::VectorXd > const &input)
Definition: ModPiece.cpp:245
Generic linear operator base class.
virtual Eigen::MatrixXd Apply(Eigen::Ref< const Eigen::MatrixXd > const &x)=0
virtual void Apply(Eigen::Ref< const Eigen::MatrixXd > const &x, Eigen::Ref< Eigen::MatrixXd > y)
virtual Eigen::MatrixXd ApplyTranspose(Eigen::Ref< const Eigen::MatrixXd > const &x)=0
LinearOperator(int rowsIn, int colsIn, int numInputCols=1)
std::vector< std::reference_wrapper< const T > > ref_vector
A vector of references to something ...
Definition: WorkPiece.h:37
static std::shared_ptr< LinearOperator > Create(MatrixType const &A)