1#ifndef LINE_OPT_OBJECTIVES_H
2#define LINE_OPT_OBJECTIVES_H
35class ResponseTimeConstraint final:
public Constraint{
public:
ResponseTimeConstraint(std::string s,std::string c,
double m,std::string n=
""):
Constraint(std::move(n)),s_(std::move(s)),c_(std::move(c)),m_(m){}
double evaluate(
const EvaluationResult&r,
const VariableValues&)
const override{
return upper(r.
response_time(s_,c_),m_);}std::string
generated_name()
const override{
return "RT_"+s_+(c_.empty()?
"":
"_"+c_)+
"_le_"+std::to_string(m_);}
private:std::string s_,c_;
double m_;};
37class ThroughputConstraint final:
public Constraint{
public:
ThroughputConstraint(std::string s,std::string c,
double m,std::string n=
""):
Constraint(std::move(n)),s_(std::move(s)),c_(std::move(c)),m_(m){}
double evaluate(
const EvaluationResult&r,
const VariableValues&)
const override{
return lower(r.
throughput(s_,c_),m_);}std::string
generated_name()
const override{
return "Tput_"+s_+(c_.empty()?
"":
"_"+c_)+
"_ge_"+std::to_string(m_);}
private:std::string s_,c_;
double m_;};
39class BudgetConstraint final:
public Constraint{
public:
BudgetConstraint(
double b,std::map<std::string,double>c={},std::string n=
""):
Constraint(std::move(n)),budget_(b),cost_(std::move(c)){}
double cost(
const VariableValues&v)
const{
double x=0;
for(
const auto&kv:cost_){
auto i=v.find(kv.first);
if(i!=v.end())x+=kv.second*std::accumulate(i->second.begin(),i->second.end(),0.0);}
return x;}
double evaluate(
const EvaluationResult&,
const VariableValues&v)
const override{
return std::max(0.0,
cost(v)-budget_);}std::string
generated_name()
const override{
return "Budget_le_"+std::to_string(budget_);}
private:
double budget_;std::map<std::string,double>cost_;};
41class MinimizeCost final:
public Objective{
public:
MinimizeCost(std::map<std::string,double>s={},std::map<std::string,double>r={},std::map<std::string,double>p={},std::vector<ConstraintPtr>c={}):rate_(std::move(r)){
for(
auto&kv:s)server_[kv.first+
"_servers"]=kv.second;
for(
auto&kv:p)replica_[kv.first+
"_replicas"]=kv.second;
constraints=std::move(c);}
double evaluate(
const EvaluationResult&,
const VariableValues&v)
const override{
double x=0;
for(
const auto&kv:server_){
auto i=v.find(kv.first);
if(i!=v.end())x+=kv.second*
scalar_value(i->second);}
for(
const auto&kv:replica_){
auto i=v.find(kv.first);
if(i!=v.end())x+=kv.second*
scalar_value(i->second);}
for(
const auto&rk:rate_)
for(
const auto&vv:v)
if(vv.first.find(rk.first)!=std::string::npos&&vv.first.find(
"rate")!=std::string::npos)x+=rk.second*
scalar_value(vv.second);
return x;}
private:std::map<std::string,double>server_,rate_,replica_;};
43class MaximizePerformance final:
public Objective{
public:
MaximizePerformance(
double tw=1,
double rw=1,
double qw=0,std::vector<std::string>s={}):tw_(tw),rw_(rw),qw_(qw),stations_(std::move(s)){}
double evaluate(
const EvaluationResult&r,
const VariableValues&)
const override{std::vector<std::string>s=stations_;
if(s.empty())
for(
const auto&kv:r.
throughputs){
auto p=kv.first.find(
"||");
auto n=kv.first.substr(0,p);
if(std::find(s.begin(),s.end(),n)==s.end())s.push_back(n);}
double x=0;
for(
const auto&n:s){
if(tw_>0)x+=tw_*r.
throughput(n);
double rt=r.
response_time(n);
if(rw_>0&&rt>0&&std::isfinite(rt))x+=rw_/rt;
double q=r.
queue_length(n);
if(qw_>0&&q>0)x+=qw_/q;}
return -x;}
private:
double tw_,rw_,qw_;std::vector<std::string>stations_;};
double cost(const VariableValues &v) const
std::string generated_name() const override
double evaluate(const EvaluationResult &, const VariableValues &v) const override
BudgetConstraint(double b, std::map< std::string, double >c={}, std::string n="")
virtual double evaluate(const EvaluationResult &, const VariableValues &) const =0
Constraint(std::string n="")
static double upper(double a, double b)
bool satisfied(const EvaluationResult &r, const VariableValues &v, double t=1e-6) const
virtual std::string generated_name() const =0
static double lower(double a, double b)
MinimizeCost(std::map< std::string, double >s={}, std::map< std::string, double >r={}, std::map< std::string, double >p={}, std::vector< ConstraintPtr >c={})
double evaluate(const EvaluationResult &, const VariableValues &v) const override
MinimizeSystemResponseTime(std::string c="", std::vector< ConstraintPtr >x={})
double evaluate(const EvaluationResult &r, const VariableValues &) const override
virtual bool is_minimization() const
virtual double evaluate(const EvaluationResult &, const VariableValues &) const =0
double evaluate_with_penalty(const EvaluationResult &r, const VariableValues &v, double w=1e6) const
std::vector< ConstraintPtr > constraints
ResponseTimeConstraint(std::string s, std::string c, double m, std::string n="")
std::string generated_name() const override
double evaluate(const EvaluationResult &r, const VariableValues &) const override
SystemResponseTimeConstraint(std::string c, double m, std::string n="")
double evaluate(const EvaluationResult &r, const VariableValues &) const override
std::string generated_name() const override
ThroughputConstraint(std::string s, std::string c, double m, std::string n="")
std::string generated_name() const override
double evaluate(const EvaluationResult &r, const VariableValues &) const override
double evaluate(const EvaluationResult &r, const VariableValues &) const override
std::string generated_name() const override
UtilizationConstraint(std::string s, double m, std::string n="")
double scalar_value(const Value &v)
std::shared_ptr< Constraint > ConstraintPtr
std::shared_ptr< Objective > ObjectivePtr
std::map< std::string, Value > VariableValues
What an evaluation and a solve return.
double utilization(const std::string &s) const
double response_time(const std::string &s, const std::string &c="") const
double queue_length(const std::string &s, const std::string &c="") const
double system_response_time(const std::string &c="") const
std::map< std::string, double > throughputs
double throughput(const std::string &s, const std::string &c="") const