5#ifndef LINE_OPT_PARETO_H
6#define LINE_OPT_PARETO_H
48 std::vector<double> epsilons, std::string solver =
"de",
51 constraint_factory_(std::move(constraint_factory)),
52 epsilons_(std::move(epsilons)),
53 solver_(std::move(solver)),
54 solve_(std::move(
solve)) {
55 if (!constraint_factory_)
56 throw InputError(
"ParetoSweep: the constraint factory is empty");
57 if (solver_ !=
"de" && solver_ !=
"bisection")
58 throw InputError(
"ParetoSweep: solver must be 'de' or 'bisection'");
63 for (
double epsilon : epsilons_) {
66 solver_ ==
"bisection" ?
BisectionSolver(clone,
"min_feasible", solve_).solve()
74 const std::vector<ParetoPoint>&
points()
const {
return points_; }
77 std::vector<ParetoPoint> out;
79 if (!point.feasible)
continue;
80 bool dominated =
false;
82 if (!other.feasible)
continue;
83 if (other.objective_value <= point.objective_value &&
84 other.epsilon <= point.epsilon &&
85 (other.objective_value < point.objective_value ||
86 other.epsilon < point.epsilon)) {
91 if (!dominated) out.push_back(point);
93 std::sort(out.begin(), out.end(),
95 return a.epsilon < b.epsilon;
114 const OptimizationProblem& problem_;
116 std::vector<double> epsilons_;
119 std::vector<ParetoPoint> points_;
Binary search for the smallest, or largest, feasible value of ONE variable.
BisectionSolver(const OptimizationProblem &p, std::string direction="min_feasible", LineEvaluator::SolveFunction solve={})
std::function< mva::AvgResult< double >( const qn::NetworkStruct< double > &)> SolveFunction
LineOptSolver(const OptimizationProblem &problem, LineOptSolverOptions options={}, LineEvaluator::SolveFunction solve={})
OptimizationProblem & add_variable(VariablePtr variable)
const std::vector< ConstraintPtr > & constraints() const
const ObjectivePtr & objective() const
OptimizationProblem & set_fixed_variables(std::vector< std::pair< VariablePtr, Value > > variables)
const std::vector< VariablePtr > & variables() const
OptimizationProblem & add_constraint(ConstraintPtr constraint)
OptimizationProblem & add_scenario(qn::Network< double > model, double weight=1.0)
const std::vector< Scenario > & scenarios() const
OptimizationProblem & set_objective(ObjectivePtr objective)
const OptimizationModel & model_variant() const
const std::vector< std::pair< VariablePtr, Value > > & fixed_variables() const
std::function< ConstraintPtr(double)> ConstraintFactory
const std::vector< ParetoPoint > & solve(const LineOptSolverOptions &options={})
const std::vector< ParetoPoint > & points() const
ParetoSweep(const OptimizationProblem &problem, ConstraintFactory constraint_factory, std::vector< double > epsilons, std::string solver="de", LineEvaluator::SolveFunction solve={})
std::vector< ParetoPoint > frontier() const
The optimizer: search the variable space for the best feasible point.
std::shared_ptr< Constraint > ConstraintPtr
std::shared_ptr< DecisionVariable > VariablePtr
std::vector< T > solve(const Matrix< T > &A, const std::vector< T > &b)
Convenience: solve Ax = b, leaving A and b untouched.
OptimizationResult result