LINE Solver (C++)
Templated C++ port of the LINE queueing solver
Loading...
Searching...
No Matches
results.h
Go to the documentation of this file.
1#ifndef LINE_OPT_RESULTS_H
2#define LINE_OPT_RESULTS_H
3
4/**
5 * @file
6 * @ingroup line_opt
7 * What an evaluation and a solve return.
8 *
9 * A `Value` is the vector a decision variable decodes to, and `VariableValues`
10 * maps a variable name to one. `EvaluationResult` carries the metrics read back
11 * from the solved model, keyed by `metric_key(station, jobclass)` -- the
12 * `station||jobclass` spelling -- with accessors that sum over classes when the
13 * class is left empty.
14 *
15 * `SensitivityData` is a three-level map (kind, metric, parameter), accumulated
16 * rather than overwritten, so several sources can contribute to one entry.
17 * `OptimizationResult` is the outcome: the variable values, the objective, the
18 * feasibility flag and the per-constraint violations, plus the iteration and
19 * model-evaluation counts and what terminated the search.
20 */
21
22#include <cmath>
23#include <limits>
24#include <map>
25#include <memory>
26#include <numeric>
27#include <string>
28#include <vector>
29
30namespace line { namespace opt {
31
32using Value = std::vector<double>;
33using VariableValues = std::map<std::string, Value>;
34
35inline double scalar_value(const Value& v) { return v.empty() ? 0.0 : v[0]; }
36inline std::string metric_key(const std::string& station, const std::string& jobclass) {
37 return station + "||" + jobclass;
38}
39
41public:
42 using ParameterMap = std::map<std::string, double>;
43 using MetricMap = std::map<std::string, ParameterMap>;
44 using Data = std::map<std::string, MetricMap>;
45
46 void add(const std::string& kind, const std::string& metric,
47 const std::string& parameter, double value) {
48 data_[kind][metric][parameter] += value;
49 }
50 const MetricMap* for_kind(const std::string& kind) const {
51 const auto found = data_.find(kind);
52 return found == data_.end() ? nullptr : &found->second;
53 }
54 bool empty() const { return data_.empty(); }
55 const Data& data() const { return data_; }
56 static std::string metric_key(const std::string& station,
57 const std::string& jobclass) {
58 return station + "||" + jobclass;
59 }
60 static std::string parameter_key(const std::string& station,
61 const std::string& jobclass) {
62 return "rate||" + station + "||" + jobclass;
63 }
64private:
65 Data data_;
66};
67
69 bool feasible = true;
70 std::map<std::string,double> response_times, throughputs, queue_lengths, utilizations;
71 std::map<std::string,double> system_response_times, system_throughputs;
72 double solve_time = 0.0;
73 std::string solver_used;
74 std::shared_ptr<SensitivityData> sensitivities;
75
76 void set_response_time(const std::string& s,const std::string& c,double v){response_times[metric_key(s,c)]=v;}
77 void set_throughput(const std::string& s,const std::string& c,double v){throughputs[metric_key(s,c)]=v;}
78 void set_queue_length(const std::string& s,const std::string& c,double v){queue_lengths[metric_key(s,c)]=v;}
79 static double exact(const std::map<std::string,double>& m,const std::string& k,double d){auto i=m.find(k);return i==m.end()?d:i->second;}
80 static double aggregate(const std::map<std::string,double>& m,const std::string& s,bool mean,double d){
81 const std::string p=s+"||"; double total=0; std::size_t n=0;
82 for(const auto& kv:m) if(kv.first.compare(0,p.size(),p)==0){total+=kv.second;++n;}
83 return n==0?d:(mean?total/n:total);
84 }
85 double response_time(const std::string&s,const std::string&c="")const{return c.empty()?aggregate(response_times,s,true,std::numeric_limits<double>::infinity()):exact(response_times,metric_key(s,c),std::numeric_limits<double>::infinity());}
86 double throughput(const std::string&s,const std::string&c="")const{return c.empty()?aggregate(throughputs,s,false,0):exact(throughputs,metric_key(s,c),0);}
87 double queue_length(const std::string&s,const std::string&c="")const{return c.empty()?aggregate(queue_lengths,s,false,0):exact(queue_lengths,metric_key(s,c),0);}
88 double utilization(const std::string&s)const{return exact(utilizations,s,0);}
89 double system_response_time(const std::string& c="")const{
90 if(!c.empty()) return exact(system_response_times,c,std::numeric_limits<double>::infinity());
91 if(system_response_times.empty()) return std::numeric_limits<double>::infinity();
92 double w=0,x=0; for(const auto& kv:system_response_times){double t=exact(system_throughputs,kv.first,0);w+=kv.second*t;x+=t;}
93 if(x>0)return w/x; double s=0;for(const auto&kv:system_response_times)s+=kv.second;return s/system_response_times.size();
94 }
95 double system_throughput(const std::string& c="")const{if(!c.empty())return exact(system_throughputs,c,0);double x=0;for(const auto&kv:system_throughputs)x+=kv.second;return x;}
96};
97
99 double objective_value=std::numeric_limits<double>::infinity();
101 std::map<std::string,double> constraint_violations;
102 bool feasible=false; std::size_t iterations=0,model_evaluations=0; double solve_time=0;
103 std::vector<double> convergence_history; std::string terminated_by;
104 double total_violation()const{double x=0;for(const auto&kv:constraint_violations)x+=kv.second;return x;}
105};
106
107} }
108#endif
std::map< std::string, MetricMap > Data
Definition results.h:44
const Data & data() const
Definition results.h:55
void add(const std::string &kind, const std::string &metric, const std::string &parameter, double value)
Definition results.h:46
static std::string metric_key(const std::string &station, const std::string &jobclass)
Definition results.h:56
std::map< std::string, ParameterMap > MetricMap
Definition results.h:43
const MetricMap * for_kind(const std::string &kind) const
Definition results.h:50
static std::string parameter_key(const std::string &station, const std::string &jobclass)
Definition results.h:60
std::map< std::string, double > ParameterMap
Definition results.h:42
double scalar_value(const Value &v)
Definition results.h:35
std::string metric_key(const std::string &station, const std::string &jobclass)
Definition results.h:36
std::map< std::string, Value > VariableValues
Definition results.h:33
std::vector< double > Value
Definition results.h:32
void set_queue_length(const std::string &s, const std::string &c, double v)
Definition results.h:78
std::map< std::string, double > utilizations
Definition results.h:70
static double aggregate(const std::map< std::string, double > &m, const std::string &s, bool mean, double d)
Definition results.h:80
double utilization(const std::string &s) const
Definition results.h:88
double response_time(const std::string &s, const std::string &c="") const
Definition results.h:85
void set_response_time(const std::string &s, const std::string &c, double v)
Definition results.h:76
std::shared_ptr< SensitivityData > sensitivities
Definition results.h:74
std::map< std::string, double > system_throughputs
Definition results.h:71
static double exact(const std::map< std::string, double > &m, const std::string &k, double d)
Definition results.h:79
double queue_length(const std::string &s, const std::string &c="") const
Definition results.h:87
std::map< std::string, double > system_response_times
Definition results.h:71
double system_response_time(const std::string &c="") const
Definition results.h:89
double system_throughput(const std::string &c="") const
Definition results.h:95
std::map< std::string, double > response_times
Definition results.h:70
std::map< std::string, double > throughputs
Definition results.h:70
double throughput(const std::string &s, const std::string &c="") const
Definition results.h:86
std::map< std::string, double > queue_lengths
Definition results.h:70
void set_throughput(const std::string &s, const std::string &c, double v)
Definition results.h:77
VariableValues variable_values
Definition results.h:100
double total_violation() const
Definition results.h:104
std::vector< double > convergence_history
Definition results.h:103
std::map< std::string, double > constraint_violations
Definition results.h:101