LINE Solver (C++)
Templated C++ port of the LINE queueing solver
Toggle main menu visibility
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
30
namespace
line
{
31
namespace
opt
{
32
33
using
OptimizationModel
=
LineEvaluator::Model
;
34
35
struct
Scenario
{
36
OptimizationModel
model
;
37
double
weight
= 1.0;
38
};
39
40
class
OptimizationProblem
{
41
public
:
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
46
OptimizationProblem
&
add_variable
(
VariablePtr
variable) {
47
variables_.push_back(std::move(variable));
48
return
*
this
;
49
}
50
OptimizationProblem
&
set_objective
(
ObjectivePtr
objective
) {
51
objective_ = std::move(
objective
);
52
return
*
this
;
53
}
54
OptimizationProblem
&
add_constraint
(
ConstraintPtr
constraint) {
55
constraints_.push_back(std::move(constraint));
56
return
*
this
;
57
}
58
OptimizationProblem
&
set_fixed_variables
(
59
std::vector<std::pair<VariablePtr, Value>>
variables
) {
60
fixed_ = std::move(
variables
);
61
return
*
this
;
62
}
63
OptimizationProblem
&
add_scenario
(
qn::Network<double>
model
,
double
weight = 1.0) {
64
scenarios_.push_back({std::move(
model
), weight});
65
return
*
this
;
66
}
67
OptimizationProblem
&
add_scenario
(
lqn::LqnModel<double>
model
,
double
weight = 1.0) {
68
scenarios_.push_back({std::move(
model
), weight});
69
return
*
this
;
70
}
71
OptimizationProblem
&
add_scenario
(
OptimizationModel
model
,
double
weight = 1.0) {
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
}
105
const
lqn::LqnModel<double>
&
layered_model
()
const
{
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
115
private
:
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
line::opt::LineEvaluator::Model
std::variant< qn::Network< double >, lqn::LqnModel< double > > Model
Definition
evaluator.h:48
line::opt::OptimizationProblem::OptimizationProblem
OptimizationProblem(OptimizationModel model)
Definition
problem.h:44
line::opt::OptimizationProblem::add_variable
OptimizationProblem & add_variable(VariablePtr variable)
Definition
problem.h:46
line::opt::OptimizationProblem::constraints
const std::vector< ConstraintPtr > & constraints() const
Definition
problem.h:111
line::opt::OptimizationProblem::validate
std::vector< std::string > validate() const
Definition
problem.h:79
line::opt::OptimizationProblem::objective
const ObjectivePtr & objective() const
Definition
problem.h:110
line::opt::OptimizationProblem::set_fixed_variables
OptimizationProblem & set_fixed_variables(std::vector< std::pair< VariablePtr, Value > > variables)
Definition
problem.h:58
line::opt::OptimizationProblem::model
const qn::Network< double > & model() const
Definition
problem.h:102
line::opt::OptimizationProblem::variables
const std::vector< VariablePtr > & variables() const
Definition
problem.h:109
line::opt::OptimizationProblem::add_constraint
OptimizationProblem & add_constraint(ConstraintPtr constraint)
Definition
problem.h:54
line::opt::OptimizationProblem::add_scenario
OptimizationProblem & add_scenario(OptimizationModel model, double weight=1.0)
Definition
problem.h:71
line::opt::OptimizationProblem::layered_model
const lqn::LqnModel< double > & layered_model() const
Definition
problem.h:105
line::opt::OptimizationProblem::add_scenario
OptimizationProblem & add_scenario(qn::Network< double > model, double weight=1.0)
Definition
problem.h:63
line::opt::OptimizationProblem::add_scenario
OptimizationProblem & add_scenario(lqn::LqnModel< double > model, double weight=1.0)
Definition
problem.h:67
line::opt::OptimizationProblem::scenarios
const std::vector< Scenario > & scenarios() const
Definition
problem.h:113
line::opt::OptimizationProblem::OptimizationProblem
OptimizationProblem(lqn::LqnModel< double > model)
Definition
problem.h:43
line::opt::OptimizationProblem::set_objective
OptimizationProblem & set_objective(ObjectivePtr objective)
Definition
problem.h:50
line::opt::OptimizationProblem::is_layered
bool is_layered() const
Definition
problem.h:76
line::opt::OptimizationProblem::OptimizationProblem
OptimizationProblem(qn::Network< double > model)
Definition
problem.h:42
line::opt::OptimizationProblem::model_variant
const OptimizationModel & model_variant() const
Definition
problem.h:108
line::opt::OptimizationProblem::fixed_variables
const std::vector< std::pair< VariablePtr, Value > > & fixed_variables() const
Definition
problem.h:112
line::qn::Network
A queueing network under construction.
Definition
network_builder.h:96
evaluator.h
Solves the model at one point of the variable space.
line::opt
Definition
bisection_solver.h:31
line::opt::ConstraintPtr
std::shared_ptr< Constraint > ConstraintPtr
Definition
objectives.h:34
line::opt::OptimizationModel
LineEvaluator::Model OptimizationModel
Definition
problem.h:33
line::opt::ObjectivePtr
std::shared_ptr< Objective > ObjectivePtr
Definition
objectives.h:40
line::opt::VariablePtr
std::shared_ptr< DecisionVariable > VariablePtr
Definition
variables.h:160
line
Definition
aoi_dist2ph.h:52
objectives.h
The objectives to minimize and the constraints to respect.
line::lqn::LqnModel
The intermediate model, and the second stage that flattens it.
Definition
lqn_reader.h:399
line::opt::Scenario
Definition
problem.h:35
line::opt::Scenario::model
OptimizationModel model
Definition
problem.h:36
line::opt::Scenario::weight
double weight
Definition
problem.h:37
include
line
opt
problem.h
Generated by
1.18.0