41 explicit ObjectiveFunctor(std::function<
double(Eigen::Ref<const Eigen::VectorXd>)> fval)
45 explicit ObjectiveFunctor(std::function<
double(Eigen::Ref<const Eigen::VectorXd>, Eigen::Ref<Eigen::VectorXd>)> fval_grad)
61 double operator()(Eigen::Ref<const Eigen::VectorXd> x_opt, Eigen::Ref<Eigen::VectorXd> grad_opt)
const {
63 Eigen::VectorXd x_real =
mapToReal(x_opt);
72 Eigen::VectorXd dummy_grad(x_opt.size());
81 static double NLoptCallback(
const std::vector<double> &x, std::vector<double> &grad,
void *data) {
83 Eigen::Map<const Eigen::VectorXd> x_eig(x.data(), x.size());
84 Eigen::Map<Eigen::VectorXd> grad_map(grad.data(), grad.size());
85 return (*functor)(x_eig, grad_map);
101 void addEqualityConstraint(std::function<
double(Eigen::Ref<const Eigen::VectorXd>, Eigen::Ref<Eigen::VectorXd>)> h) {
117 Eigen::Map<const Eigen::VectorXd> x_opt(x.data(), x.size());
118 Eigen::Map<Eigen::VectorXd> grad_opt(grad.data(), grad.size());
123 std::vector<std::function<double(Eigen::Ref<const Eigen::VectorXd>, Eigen::Ref<Eigen::VectorXd>)>>
getInequalityConstraints()
const {
127 std::vector<std::function<double(Eigen::Ref<const Eigen::VectorXd>, Eigen::Ref<Eigen::VectorXd>)>>
getEqualityConstraints()
const {
134 std::function<double(Eigen::Ref<const Eigen::VectorXd>)>
fval_only_;
135 std::function<double(Eigen::Ref<const Eigen::VectorXd>, Eigen::Ref<Eigen::VectorXd>)>
fval_grad_inplace_;
137 std::vector<std::function<double(Eigen::Ref<const Eigen::VectorXd>, Eigen::Ref<Eigen::VectorXd>)>>
ineq_constraints_;
138 std::vector<std::function<double(Eigen::Ref<const Eigen::VectorXd>, Eigen::Ref<Eigen::VectorXd>)>>
eq_constraints_;
159 Eigen::VectorXd
mapToReal(Eigen::Ref<const Eigen::VectorXd> x_opt)
const {
161 Eigen::VectorXd x_real = x_opt;
162 for(
int i = 0; i < x_real.size(); ++i) {
164 x_real(i) = std::exp(x_opt(i));
182 void mapGradientToOpt(Eigen::Ref<const Eigen::VectorXd> x_real, Eigen::Ref<Eigen::VectorXd> grad_real)
const {
183 if(
log_scale_.empty() || grad_real.size() == 0)
return;
184 for(
int i = 0; i < grad_real.size(); ++i) {
187 grad_real(i) = grad_real(i) * x_real(i);
201 double evaluateConstraint(
size_t index,
bool is_ineq, Eigen::Ref<const Eigen::VectorXd> x_opt, Eigen::Ref<Eigen::VectorXd> grad_opt)
const {
202 Eigen::VectorXd x_real =
mapToReal(x_opt);
207 if(grad_opt.size() > 0) {
208 val = constraint_func(x_real, grad_opt);
211 Eigen::VectorXd dummy_grad(x_opt.size());
212 val = constraint_func(x_real, dummy_grad);
222double nlopt_max(
cmp::ObjectiveFunctor &f, Eigen::Ref<Eigen::VectorXd> x0,
const Eigen::Ref<const Eigen::VectorXd> &lb,
const Eigen::Ref<const Eigen::VectorXd> &ub, nlopt::algorithm alg = nlopt::LN_SBPLX,
double ftol_rel = 1e-6);
Functor wrapper for NLopt with automatic, transparent parameter space mapping (e.g....
Definition optimization.h:38
std::vector< std::function< double(Eigen::Ref< const Eigen::VectorXd >, Eigen::Ref< Eigen::VectorXd >)> > ineq_constraints_
Collection of inequality constraint functions.
Definition optimization.h:137
const std::vector< bool > & getLogScale() const
Definition optimization.h:56
std::function< double(Eigen::Ref< const Eigen::VectorXd >)> fval_only_
Pointer to a gradient-free objective function.
Definition optimization.h:134
ObjectiveFunctor(std::function< double(Eigen::Ref< const Eigen::VectorXd >, Eigen::Ref< Eigen::VectorXd >)> fval_grad)
Definition optimization.h:45
std::vector< bool > log_scale_
Mask indicating which parameter dimensions are optimized in log-scale.
Definition optimization.h:141
std::vector< std::function< double(Eigen::Ref< const Eigen::VectorXd >, Eigen::Ref< Eigen::VectorXd >)> > getInequalityConstraints() const
Definition optimization.h:123
void addEqualityConstraint(std::function< double(Eigen::Ref< const Eigen::VectorXd >, Eigen::Ref< Eigen::VectorXd >)> h)
Definition optimization.h:101
bool usesGradient() const
Checks if the functor utilizes gradient information.
Definition optimization.h:92
ObjectiveFunctor(std::function< double(Eigen::Ref< const Eigen::VectorXd >)> fval)
Definition optimization.h:41
void mapGradientToOpt(Eigen::Ref< const Eigen::VectorXd > x_real, Eigen::Ref< Eigen::VectorXd > grad_real) const
Transforms gradients from real space back to optimization space using the chain rule.
Definition optimization.h:182
bool use_gradient_
Flag indicating whether the objective function uses gradient information.
Definition optimization.h:140
std::vector< std::function< double(Eigen::Ref< const Eigen::VectorXd >, Eigen::Ref< Eigen::VectorXd >)> > getEqualityConstraints() const
Definition optimization.h:127
std::function< double(Eigen::Ref< const Eigen::VectorXd >, Eigen::Ref< Eigen::VectorXd >)> fval_grad_inplace_
Pointer to a gradient-based objective function.
Definition optimization.h:135
double operator()(Eigen::Ref< const Eigen::VectorXd > x_opt, Eigen::Ref< Eigen::VectorXd > grad_opt) const
Definition optimization.h:61
std::vector< std::function< double(Eigen::Ref< const Eigen::VectorXd >, Eigen::Ref< Eigen::VectorXd >)> > eq_constraints_
Collection of equality constraint functions.
Definition optimization.h:138
static double NLoptCallback(const std::vector< double > &x, std::vector< double > &grad, void *data)
Definition optimization.h:81
void setLogScale(const std::vector< bool > &log_scale)
Set which parameters should be optimized in log-space.
Definition optimization.h:52
double evaluateConstraint(size_t index, bool is_ineq, Eigen::Ref< const Eigen::VectorXd > x_opt, Eigen::Ref< Eigen::VectorXd > grad_opt) const
Evaluates a constraint while properly translating inputs and mapping output gradients.
Definition optimization.h:201
static double NLoptConstraintWrapper(const std::vector< double > &x, std::vector< double > &grad, void *data)
Definition optimization.h:115
void addInequalityConstraint(std::function< double(Eigen::Ref< const Eigen::VectorXd >, Eigen::Ref< Eigen::VectorXd >)> g)
Definition optimization.h:97
Eigen::VectorXd mapToReal(Eigen::Ref< const Eigen::VectorXd > x_opt) const
Maps parameters from optimization space (potentially log-scaled) to physical space.
Definition optimization.h:159
Definition classifier.h:17
double nlopt_max(cmp::ObjectiveFunctor &f, Eigen::Ref< Eigen::VectorXd > x0, const Eigen::Ref< const Eigen::VectorXd > &lb, const Eigen::Ref< const Eigen::VectorXd > &ub, nlopt::algorithm alg=nlopt::LN_SBPLX, double ftol_rel=1e-6)
Global helper function to execute NLopt maximization, managing the log-scaling wrapper....
Definition optimization.cpp:3
Context struct for NLopt constraint evaluation callback.
Definition optimization.h:108
size_t index
Index of the constraint in the vector.
Definition optimization.h:110
bool is_inequality
True if it is an inequality constraint, false if equality.
Definition optimization.h:111
ObjectiveFunctor * functor
Pointer to the parent functor.
Definition optimization.h:109