LINE Solver (C++)
Templated C++ port of the LINE queueing solver
Loading...
Searching...
No Matches
problem.h
Go to the documentation of this file.
1#ifndef LINE_OPT_PROBLEM_H
2#define LINE_OPT_PROBLEM_H
3
4/**
5 * @file
6 * @ingroup line_opt
7 * The optimization problem: a model, the decision variables to search over, an
8 * objective, and the constraints a solution must satisfy.
9 *
10 * Built fluently -- `add_variable`, `set_objective`, `add_constraint`,
11 * `set_fixed_variables`, `add_scenario` each return `*this`. The model is a
12 * `std::variant` of `qn::Network<double>` and `lqn::LqnModel<double>`, so one
13 * problem type covers the flat and the layered case and the solver dispatches on
14 * the alternative rather than on a flag.
15 *
16 * `add_scenario` attaches further models with weights: the objective is then
17 * evaluated on each and aggregated, which is how a design is optimized against a
18 * set of load conditions rather than one. `validate()` returns the reasons the
19 * problem cannot be solved, empty when it can.
20 */
21
22#include <string>
23#include <utility>
24#include <variant>
25#include <vector>
26
27#include "line/opt/evaluator.h"
28#include "line/opt/objectives.h"
29
30namespace line {
31namespace opt {
32
34
35struct Scenario {
37 double weight = 1.0;
38};
39
41public:
42 explicit OptimizationProblem(qn::Network<double> model) : model_(std::move(model)) {}
43 explicit OptimizationProblem(lqn::LqnModel<double> model) : model_(std::move(model)) {}
44 explicit OptimizationProblem(OptimizationModel model) : model_(std::move(model)) {}
45
47 variables_.push_back(std::move(variable));
48 return *this;
49 }
51 objective_ = std::move(objective);
52 return *this;
53 }
55 constraints_.push_back(std::move(constraint));
56 return *this;
57 }
59 std::vector<std::pair<VariablePtr, Value>> variables) {
60 fixed_ = std::move(variables);
61 return *this;
62 }
64 scenarios_.push_back({std::move(model), weight});
65 return *this;
66 }
68 scenarios_.push_back({std::move(model), weight});
69 return *this;
70 }
72 scenarios_.push_back({std::move(model), weight});
73 return *this;
74 }
75
76 bool is_layered() const {
77 return std::holds_alternative<lqn::LqnModel<double>>(model_);
78 }
79 std::vector<std::string> validate() const {
80 std::vector<std::string> errors;
81 if (variables_.empty()) errors.push_back("No decision variables defined");
82 if (!objective_) errors.push_back("Objective function is not set");
83 for (const VariablePtr& variable : variables_) {
84 const std::string type = variable->type();
85 const bool layered_variable =
86 type == "host_demand" || type == "think_time" ||
87 type == "task_multiplicity" || type == "task_replication" ||
88 type == "processor_multiplicity";
89 if (is_layered() && !layered_variable)
90 errors.push_back("Variable '" + variable->name() + "' (" + type +
91 ") is a flat-network variable but the model is a LayeredNetwork");
92 else if (!is_layered() && layered_variable)
93 errors.push_back("Variable '" + variable->name() + "' is a LayeredNetwork "
94 "variable but the model is a flat Network");
95 }
96 for (const Scenario& scenario : scenarios_)
97 if (scenario.model.index() != model_.index())
98 errors.push_back("Scenario model kind differs from the base model");
99 return errors;
100 }
101
102 const qn::Network<double>& model() const {
103 return std::get<qn::Network<double>>(model_);
104 }
106 return std::get<lqn::LqnModel<double>>(model_);
107 }
108 const OptimizationModel& model_variant() const { return model_; }
109 const std::vector<VariablePtr>& variables() const { return variables_; }
110 const ObjectivePtr& objective() const { return objective_; }
111 const std::vector<ConstraintPtr>& constraints() const { return constraints_; }
112 const std::vector<std::pair<VariablePtr, Value>>& fixed_variables() const { return fixed_; }
113 const std::vector<Scenario>& scenarios() const { return scenarios_; }
114
115private:
116 OptimizationModel model_;
117 std::vector<VariablePtr> variables_;
118 ObjectivePtr objective_;
119 std::vector<ConstraintPtr> constraints_;
120 std::vector<std::pair<VariablePtr, Value>> fixed_;
121 std::vector<Scenario> scenarios_;
122};
123
124} // namespace opt
125} // namespace line
126
127#endif
std::variant< qn::Network< double >, lqn::LqnModel< double > > Model
Definition evaluator.h:48
OptimizationProblem(OptimizationModel model)
Definition problem.h:44
OptimizationProblem & add_variable(VariablePtr variable)
Definition problem.h:46
const std::vector< ConstraintPtr > & constraints() const
Definition problem.h:111
std::vector< std::string > validate() const
Definition problem.h:79
const ObjectivePtr & objective() const
Definition problem.h:110
OptimizationProblem & set_fixed_variables(std::vector< std::pair< VariablePtr, Value > > variables)
Definition problem.h:58
const qn::Network< double > & model() const
Definition problem.h:102
const std::vector< VariablePtr > & variables() const
Definition problem.h:109
OptimizationProblem & add_constraint(ConstraintPtr constraint)
Definition problem.h:54
OptimizationProblem & add_scenario(OptimizationModel model, double weight=1.0)
Definition problem.h:71
const lqn::LqnModel< double > & layered_model() const
Definition problem.h:105
OptimizationProblem & add_scenario(qn::Network< double > model, double weight=1.0)
Definition problem.h:63
OptimizationProblem & add_scenario(lqn::LqnModel< double > model, double weight=1.0)
Definition problem.h:67
const std::vector< Scenario > & scenarios() const
Definition problem.h:113
OptimizationProblem(lqn::LqnModel< double > model)
Definition problem.h:43
OptimizationProblem & set_objective(ObjectivePtr objective)
Definition problem.h:50
OptimizationProblem(qn::Network< double > model)
Definition problem.h:42
const OptimizationModel & model_variant() const
Definition problem.h:108
const std::vector< std::pair< VariablePtr, Value > > & fixed_variables() const
Definition problem.h:112
A queueing network under construction.
Solves the model at one point of the variable space.
std::shared_ptr< Constraint > ConstraintPtr
Definition objectives.h:34
LineEvaluator::Model OptimizationModel
Definition problem.h:33
std::shared_ptr< Objective > ObjectivePtr
Definition objectives.h:40
std::shared_ptr< DecisionVariable > VariablePtr
Definition variables.h:160
The objectives to minimize and the constraints to respect.
The intermediate model, and the second stage that flattens it.
Definition lqn_reader.h:399
OptimizationModel model
Definition problem.h:36