Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
libnest2d::opt::SubplexOptimizer Class Reference

#include <src/libnest2d/include/libnest2d/optimizers/nlopt/subplex.hpp>

+ Inheritance diagram for libnest2d::opt::SubplexOptimizer:
+ Collaboration diagram for libnest2d::opt::SubplexOptimizer:

Public Member Functions

 SubplexOptimizer (const StopCriteria &scr={})
 
Result< Args... > optimize_min (Func &&objectfunction, Input< Args... > initvals, Bound< Args >... bounds)
 Optimize for minimum value of the provided objectfunction.
 
Result< Args... > optimize_min (Func &&objectfunction, Input< Args... > initvals)
 
Result< Args... > optimize_min (Func &&objectfunction)
 
Result< Args... > optimize_max (Func &&objectfunction, Input< Args... > initvals, Bound< Args >... bounds)
 Same as optimize_min but optimizes for maximum function value.
 
Result< Args... > optimize_max (Func &&objectfunction, Input< Args... > initvals)
 
Result< Args... > optimize_max (Func &&objectfunction)
 

Protected Types

using Base = Optimizer< NloptOptimizer >
 
enum  OptDir
 

Protected Member Functions

template<class Func , class... Args>
Result< Args... > optimize (Func &&func, std::tuple< Args... > initvals, Bound< Args >... args)
 

Static Protected Member Functions

template<class Fn , class... Args>
static double optfunc (const std::vector< double > &params, std::vector< double > &, void *data)
 

Protected Attributes

friend Base
 
nlopt::opt opt_
 
std::vector< double > lower_bounds_
 
std::vector< double > upper_bounds_
 
std::vector< double > initvals_
 
nlopt::algorithm alg_
 
Method localmethod_
 
enum libnest2d::opt::Optimizer::OptDir dir_
 
StopCriteria stopcr_
 

Detailed Description

Member Typedef Documentation

◆ Base

Member Enumeration Documentation

◆ OptDir

enum libnest2d::opt::Optimizer::OptDir
strongprotectedinherited
124 {
125 MIN,
126 MAX
127 } dir_;
#define MIN(a, b)
Definition avrftdi.c:48
#define MAX(a, b)
Definition avrftdi.c:45
enum libnest2d::opt::Optimizer::OptDir dir_

Constructor & Destructor Documentation

◆ SubplexOptimizer()

libnest2d::opt::SubplexOptimizer::SubplexOptimizer ( const StopCriteria scr = {})
inlineexplicit
10 {}):
NloptOptimizer(nlopt::algorithm alg, StopCriteria stopcr={})
Definition nlopt_boilerplate.hpp:190
Method
Specific optimization methods for which a default optimizer implementation can be instantiated.
Definition optimizer.hpp:60
nlopt::algorithm method2nloptAlg(Method m)
Definition nlopt_boilerplate.hpp:22

Member Function Documentation

◆ optfunc()

template<class Fn , class... Args>
static double libnest2d::opt::NloptOptimizer::optfunc ( const std::vector< double > &  params,
std::vector< double > &  ,
void data 
)
inlinestaticprotectedinherited
102 {
103 using TData = std::pair<remove_ref_t<Fn>*, NloptOptimizer*>;
104 auto typeddata = static_cast<TData*>(data);
105
106 if(typeddata->second->stopcr_.stop_condition())
107 typeddata->second->opt_.force_stop();
108
109 auto fnptr = typeddata->first;
110 auto funval = std::tuple<Args...>();
111
112 // copy the obtained objectfunction arguments to the funval tuple.
113 metaloop::apply(FunvalCopyFunc(params), funval);
114
115 auto ret = metaloop::callFunWithTuple(*fnptr, funval,
116 index_sequence_for<Args...>());
117
118 return ret;
119 }
static void apply(Fn &&fn, Args &&...args)
The final usable function template.
Definition metaloop.hpp:189
static auto callFunWithTuple(Fn &&fn, Tup &&tup, index_sequence< Is... >) -> decltype(fn(std::get< Is >(tup)...))
Definition metaloop.hpp:217
constexpr auto data(C &c) -> decltype(c.data())
Definition span.hpp:195

References libnest2d::opt::metaloop::apply(), libnest2d::opt::metaloop::callFunWithTuple(), and libnest2d::opt::NloptOptimizer::opt_.

+ Here is the call graph for this function:

◆ optimize()

template<class Func , class... Args>
Result< Args... > libnest2d::opt::NloptOptimizer::optimize ( Func &&  func,
std::tuple< Args... >  initvals,
Bound< Args >...  args 
)
inlineprotectedinherited
125 {
126 lower_bounds_.resize(sizeof...(Args));
127 upper_bounds_.resize(sizeof...(Args));
128 initvals_.resize(sizeof...(Args));
129
130 opt_ = nlopt::opt(alg_, sizeof...(Args) );
131
132 // Copy the bounds which is obtained as a parameter pack in args into
133 // lower_bounds_ and upper_bounds_
134 metaloop::apply(BoundsFunc(*this), args...);
135
136 opt_.set_lower_bounds(lower_bounds_);
137 opt_.set_upper_bounds(upper_bounds_);
138
139 nlopt::opt localopt;
140 switch(opt_.get_algorithm()) {
141 case nlopt::GN_MLSL:
142 case nlopt::GN_MLSL_LDS:
143 localopt = nlopt::opt(method2nloptAlg(localmethod_),
144 sizeof...(Args));
145 localopt.set_lower_bounds(lower_bounds_);
146 localopt.set_upper_bounds(upper_bounds_);
147 opt_.set_local_optimizer(localopt);
148 default: ;
149 }
150
151 double abs_diff = stopcr_.absolute_score_difference;
152 double rel_diff = stopcr_.relative_score_difference;
153 double stopval = stopcr_.stop_score;
154 if(!std::isnan(abs_diff)) opt_.set_ftol_abs(abs_diff);
155 if(!std::isnan(rel_diff)) opt_.set_ftol_rel(rel_diff);
156 if(!std::isnan(stopval)) opt_.set_stopval(stopval);
157
158 if(this->stopcr_.max_iterations > 0)
159 opt_.set_maxeval(this->stopcr_.max_iterations );
160
161 // Take care of the initial values, copy them to initvals_
162 metaloop::apply(InitValFunc(*this), initvals);
163
164 std::pair<remove_ref_t<Func>*, NloptOptimizer*> data =
165 std::make_pair(&func, this);
166
167 switch(dir_) {
168 case OptDir::MIN:
169 opt_.set_min_objective(optfunc<Func, Args...>, &data); break;
170 case OptDir::MAX:
171 opt_.set_max_objective(optfunc<Func, Args...>, &data); break;
172 }
173
174 Result<Args...> result;
175 nlopt::result rescode;
176
177 try {
178 rescode = opt_.optimize(initvals_, result.score);
179 result.resultcode = static_cast<ResultCodes>(rescode);
180 } catch( nlopt::forced_stop& ) {
181 result.resultcode = ResultCodes::FORCED_STOP;
182 }
183
184 metaloop::apply(ResultCopyFunc(*this), result.optimum);
185
186 return result;
187 }
std::vector< double > upper_bounds_
Definition nlopt_boilerplate.hpp:41
std::vector< double > lower_bounds_
Definition nlopt_boilerplate.hpp:40
Method localmethod_
Definition nlopt_boilerplate.hpp:44
nlopt::algorithm alg_
Definition nlopt_boilerplate.hpp:43
std::vector< double > initvals_
Definition nlopt_boilerplate.hpp:42
nlopt::opt opt_
Definition nlopt_boilerplate.hpp:39
StopCriteria stopcr_
Definition optimizer.hpp:129
ResultCodes
Info about result of an optimization. These codes are exactly the same as the nlopt codes for convini...
Definition optimizer.hpp:72
@ FORCED_STOP
Definition optimizer.hpp:77
double absolute_score_difference
If the absolute value difference between two scores.
Definition optimizer.hpp:102
unsigned max_iterations
The max allowed number of iterations.
Definition optimizer.hpp:115
double relative_score_difference
If the relative value difference between two scores.
Definition optimizer.hpp:105
double stop_score
Stop if this value or better is found.
Definition optimizer.hpp:108

References libnest2d::opt::StopCriteria::absolute_score_difference, libnest2d::opt::NloptOptimizer::alg_, libnest2d::opt::metaloop::apply(), libnest2d::opt::Optimizer< NloptOptimizer >::dir_, libnest2d::opt::FORCED_STOP, libnest2d::opt::initvals(), libnest2d::opt::NloptOptimizer::initvals_, libnest2d::opt::NloptOptimizer::localmethod_, libnest2d::opt::NloptOptimizer::lower_bounds_, libnest2d::opt::StopCriteria::max_iterations, libnest2d::opt::method2nloptAlg(), libnest2d::opt::NloptOptimizer::opt_, libnest2d::opt::StopCriteria::relative_score_difference, libnest2d::opt::StopCriteria::stop_score, libnest2d::opt::Optimizer< NloptOptimizer >::stopcr_, and libnest2d::opt::NloptOptimizer::upper_bounds_.

+ Here is the call graph for this function:

◆ optimize_max() [1/3]

Result< Args... > libnest2d::opt::Optimizer< NloptOptimizer >::optimize_max ( Func &&  objectfunction)
inlineinherited
203 {
204 dir_ = OptDir::MAX;
205 return static_cast<Subclass*>(this)->template optimize<Func, Args...>(
206 forward<Func>(objectfunction),
207 Input<Args...>(),
208 Bound<Args>()... );
209 }
tuple< Args... > Input
Definition optimizer.hpp:51

◆ optimize_max() [2/3]

Result< Args... > libnest2d::opt::Optimizer< NloptOptimizer >::optimize_max ( Func &&  objectfunction,
Input< Args... >  initvals 
)
inlineinherited
195 {
196 dir_ = OptDir::MAX;
197 return static_cast<Subclass*>(this)->template optimize<Func, Args...>(
198 forward<Func>(objectfunction), initvals, Bound<Args>()... );
199 }
tuple< Args... > initvals(Args...args)
Definition optimizer.hpp:54

◆ optimize_max() [3/3]

Result< Args... > libnest2d::opt::Optimizer< NloptOptimizer >::optimize_max ( Func &&  objectfunction,
Input< Args... >  initvals,
Bound< Args >...  bounds 
)
inlineinherited

Same as optimize_min but optimizes for maximum function value.

186 {
187 dir_ = OptDir::MAX;
188 return static_cast<Subclass*>(this)->template optimize<Func, Args...>(
189 forward<Func>(objectfunction), initvals, bounds... );
190 }
Bounds< N > bounds(const Bound(&b)[N])
Definition Optimizer.hpp:192

◆ optimize_min() [1/3]

Result< Args... > libnest2d::opt::Optimizer< NloptOptimizer >::optimize_min ( Func &&  objectfunction)
inlineinherited
173 {
174 dir_ = OptDir::MIN;
175 return static_cast<Subclass*>(this)->template optimize<Func, Args...>(
176 forward<Func>(objectfunction),
177 Input<Args...>(),
178 Bound<Args>()... );
179 }

◆ optimize_min() [2/3]

Result< Args... > libnest2d::opt::Optimizer< NloptOptimizer >::optimize_min ( Func &&  objectfunction,
Input< Args... >  initvals 
)
inlineinherited
165 {
166 dir_ = OptDir::MIN;
167 return static_cast<Subclass*>(this)->template optimize<Func, Args...>(
168 forward<Func>(objectfunction), initvals, Bound<Args>()... );
169 }

◆ optimize_min() [3/3]

Result< Args... > libnest2d::opt::Optimizer< NloptOptimizer >::optimize_min ( Func &&  objectfunction,
Input< Args... >  initvals,
Bound< Args >...  bounds 
)
inlineinherited

Optimize for minimum value of the provided objectfunction.

Parameters
objectfunctionThe function that will be searched for the minimum return value.
initvalsA tuple with the initial values for the search
boundsA parameter pack with the bounds for each dimension.
Returns
Returns a Result<Args...> structure. An example call would be: auto result = opt.optimize_min( [](tuple<double> x) // object function { return std::pow(std::get<0>(x), 2); }, make_tuple(-0.5), // initial value {-1.0, 1.0} // search space bounds );
156 {
157 dir_ = OptDir::MIN;
158 return static_cast<Subclass*>(this)->template optimize<Func, Args...>(
159 forward<Func>(objectfunction), initvals, bounds... );
160 }

Member Data Documentation

◆ alg_

nlopt::algorithm libnest2d::opt::NloptOptimizer::alg_
protectedinherited

◆ Base

friend libnest2d::opt::NloptOptimizer::Base
protectedinherited

◆ dir_

◆ initvals_

std::vector<double> libnest2d::opt::NloptOptimizer::initvals_
protectedinherited

◆ localmethod_

Method libnest2d::opt::NloptOptimizer::localmethod_
protectedinherited

◆ lower_bounds_

std::vector<double> libnest2d::opt::NloptOptimizer::lower_bounds_
protectedinherited

◆ opt_

nlopt::opt libnest2d::opt::NloptOptimizer::opt_
protectedinherited

◆ stopcr_

StopCriteria libnest2d::opt::Optimizer< NloptOptimizer >::stopcr_
protectedinherited

◆ upper_bounds_

std::vector<double> libnest2d::opt::NloptOptimizer::upper_bounds_
protectedinherited

The documentation for this class was generated from the following file: