21#include <boost/format.hpp>
34 double lastcost =
cost_;
40 Eigen::VectorXd delta_p_trial = Eigen::VectorXd::Zero(
parameters_.size());
41 Eigen::VectorXd last_gradient = Eigen::VectorXd::Zero(
parameters_.size());
42 double delta_cost = 0;
44 for (
Index i = 0; i < 100; i++) {
50 delta_cost = trialcost - lastcost;
64 last_gradient = gradient;
73 << (boost::format(
"BFGS-TRM @iteration %1$d: not converged after "
85 const Eigen::VectorXd& gradient,
87 bool step_accepted =
false;
88 if (cost_delta > 0.0) {
92 << (boost::format(
"BFGS-TRM @iteration %1$d: DeltaCost %2$2.4e step "
99 "BFGS-TRM @iteration %1$d: new trust radius %2$2.4e") %
107 step_accepted =
true;
110 double norm_delta_p = delta_p.squaredNorm();
111 if (tr_check > 0.75 &&
114 }
else if (tr_check < 0.25) {
119 "BFGS-TRM @iteration %1$d: DeltaCost/QuadraticApprox %2$2.4f "
126 "BFGS-TRM @iteration %1$d: new trust radius %2$2.4e") %
131 return step_accepted;
135 const Eigen::VectorXd& delta_gradient) {
139 (delta_pos.transpose() *
hessian_ * delta_pos).value();
141 hessian_ += (delta_gradient * delta_gradient.transpose()) /
142 (delta_gradient.transpose() * delta_pos);
150 const Eigen::VectorXd& delta_pos)
const {
151 return (gradient.transpose() * delta_pos).value() +
152 0.5 * (delta_pos.transpose() *
hessian_ * delta_pos).value();
void Optimize(const Eigen::VectorXd &initialparameters)
Eigen::VectorXd parameters_
double QuadraticEnergy(const Eigen::VectorXd &gradient, const Eigen::VectorXd &delta_pos) const
bool AcceptRejectStep(const Eigen::VectorXd &delta_pos, const Eigen::VectorXd &gradient, double energy_delta)
Optimiser_costfunction & costfunction_
void UpdateHessian(const Eigen::VectorXd &delta_pos, const Eigen::VectorXd &delta_gradient)
std::vector< std::function< void()> > callbacks_
virtual double EvaluateCost(const Eigen::VectorXd ¶meters)=0
virtual Eigen::VectorXd EvaluateGradient(const Eigen::VectorXd ¶meters)=0
virtual bool Converged(const Eigen::VectorXd &delta_parameters, double delta_cost, const Eigen::VectorXd &gradient)=0
Eigen::VectorXd CalculateStep(const Eigen::VectorXd &gradient, const Eigen::MatrixXd &Hessian, double delta) const
#define XTP_LOG(level, log)
base class for all analysis tools