MUQ  0.4.3
CostFunction.cpp
Go to the documentation of this file.
2 
3 using namespace muq::Modeling;
4 using namespace muq::Optimization;
5 
6 
7 void CostFunction::EvaluateImpl(ref_vector<Eigen::VectorXd> const& input) {
8  outputs.resize(1);
9  outputs.at(0) = Eigen::VectorXd::Constant(1, Cost(input.at(0)));
10 }
11 
12 void CostFunction::GradientImpl(unsigned int const outputDimWrt,
13  unsigned int const inputDimWrt,
14  ref_vector<Eigen::VectorXd> const& input,
15  Eigen::VectorXd const& sensitivity) {
16  gradient = sensitivity(0)*Gradient(input.at(0));
17 }
18 
19 void CostFunction::SetPoint(Eigen::VectorXd const& evalPt) {
20  assert(evalPt.size()==inputSizes(0));
21  x = evalPt;
22 };
23 
24 Eigen::VectorXd CostFunction::Gradient() {
25  Eigen::VectorXd sens = Eigen::VectorXd::Ones(1);
27 }
28 
29 
30 Eigen::MatrixXd CostFunction::Hessian() {
31  return HessianByFD();
32 }
33 
34 
35 Eigen::MatrixXd CostFunction::HessianByFD() {
36 
37  Eigen::VectorXd f0 = Gradient();
38  Eigen::VectorXd x0 = x;
39  Eigen::VectorXd f;
40 
41  double eps;
42 
43  Eigen::VectorXd newInput(x0);
44 
45  Eigen::MatrixXd hes(inputSizes(0), inputSizes(0));
46 
47  for (int i=0; i<inputSizes(0); ++i) {
48 
49  eps = std::max(1.0e-8, 1.0e-10*std::abs(x(i)));
50 
51  newInput(i) = x(i) + eps;
52  f = Gradient(newInput);
53 
54  hes.col(i) = (f-f0)/eps;
55 
56  newInput(i) = x0(i);
57 
58  }
59 
60  // Reset the point to the original
61  SetPoint(x0);
62 
63  return hes;
64 }
65 
66 
67 Eigen::VectorXd CostFunction::ApplyHessian(Eigen::VectorXd const& vec) {
68  Eigen::VectorXd sens = Eigen::VectorXd::Ones(1);
69  return ModPiece::ApplyHessianByFD(0,0,0,muq::Modeling::ref_vector<Eigen::VectorXd>({std::cref(x)}), sens, vec);
70 }
71 
72 void CostFunction::JacobianImpl(unsigned int outputDimWrt,
73  unsigned int inputDimWrt,
75 {
76  jacobian = Gradient(input.at(0)).transpose();
77 }
78 
79 void CostFunction::ApplyHessianImpl(unsigned int outWrt,
80  unsigned int inWrt1,
81  unsigned int inWrt2,
83  Eigen::VectorXd const& sensitivity,
84  Eigen::VectorXd const& vec)
85 {
86  hessAction = ApplyHessian(input.at(0),vec);
87 }
88 
virtual Eigen::VectorXd GradientByFD(unsigned int const outputDimWrt, unsigned int const inputDimWrt, std::vector< Eigen::VectorXd > const &input, Eigen::VectorXd const &sensitivity)
Definition: ModPiece.cpp:111
virtual Eigen::VectorXd ApplyHessianByFD(unsigned int const outWrt, unsigned int const inWrt1, unsigned int const inWrt2, std::vector< Eigen::VectorXd > const &input, Eigen::VectorXd const &sens, Eigen::VectorXd const &vec)
Definition: ModPiece.cpp:448
std::vector< std::reference_wrapper< const T > > ref_vector
A vector of references to something ...
Definition: WorkPiece.h:37