Skip to content

Commit

Permalink
add objective uncertainty
Browse files Browse the repository at this point in the history
  • Loading branch information
hlefebvr committed Nov 28, 2024
1 parent 72aaca1 commit 4683059
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 2 deletions.
7 changes: 7 additions & 0 deletions lib/include/idol/robust/modeling/Description.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class idol::Robust::Description {
mutable std::optional<Annotation<unsigned int>> m_stages;
Map<Ctr, LinExpr<Var, LinExpr<Var>>> m_uncertain_mat_coeff;
Map<Ctr, LinExpr<Var>> m_uncertain_rhs;
Map<Var, LinExpr<Var>> m_uncertain_obj;
const Model& m_uncertainty_set;
public:
explicit Description(const Model& t_uncertainty_set) : m_uncertainty_set(t_uncertainty_set) {}
Expand All @@ -42,6 +43,8 @@ class idol::Robust::Description {

const LinExpr<Var>& uncertain_rhs(const Ctr& t_ctr) const;

const LinExpr<Var>& uncertain_obj(const Var& t_var) const;

void set_uncertain_mat_coeff(const Ctr& t_ctr, const Var& t_var, const LinExpr<Var>& t_coeff) {
m_uncertain_mat_coeff[t_ctr].set(t_var, t_coeff);
}
Expand All @@ -50,6 +53,10 @@ class idol::Robust::Description {
m_uncertain_rhs[t_ctr] = t_rhs;
}

void set_uncertain_obj(const Var& t_var, const LinExpr<Var>& t_obj) {
m_uncertain_obj[t_var] = t_obj;
}

class View {
const Description& m_description;
const Model& m_deterministic_model;
Expand Down
33 changes: 31 additions & 2 deletions lib/src/robust/modeling/Description.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,22 +61,51 @@ idol::Robust::Description::uncertain_mat_coeffs(const idol::Ctr &t_ctr) const {
return it_ctr->second;
}

const idol::LinExpr<idol::Var> &idol::Robust::Description::uncertain_obj(const idol::Var &t_var) const {
auto it_var = m_uncertain_obj.find(t_var);
if (it_var == m_uncertain_obj.end()) {
return LinExpr<Var>::Zero;
}
return it_var->second;
}

std::ostream &idol::operator<<(std::ostream &t_os, const idol::Robust::Description::View &t_view) {

LimitedWidthStream stream(t_os, 120);

const auto& model = t_view.deterministic_model();
const auto& description = t_view.description();

stream << "Minimize\n" << model.get_obj_expr();
const auto& print_linear = [&stream](const LinExpr<Var>& t_linear, const LinExpr<Var, LinExpr<Var>>& uncertain_mat_coeff) {

};

const auto& obj = model.get_obj_expr();

stream << "Minimize\n" << obj.affine().constant() << " + ";
for (const auto& [var, constant] : obj.affine().linear()) {

const auto& uncertainty = description.uncertain_obj(var);
if (uncertainty.is_zero(Tolerance::Sparsity)) {
stream << constant;
} else {
stream << "[ " << constant << " + " << uncertainty << "]";
}
stream << " " << var;

}
for (const auto& [pair, constant] : obj) {
stream << " + " << constant << " " << pair.first << " " << pair.second;
}

stream << "\nSubject To" << std::endl;
for (const auto &ctr : model.ctrs()) {

stream << '\t' << ctr.name() << ": ";
const auto& linear = model.get_ctr_row(ctr);

const auto& uncertain_mat_coeff = description.uncertain_mat_coeffs(ctr);


if (uncertain_mat_coeff.is_zero(Tolerance::Sparsity)) {
stream << linear;
} else {
Expand Down

0 comments on commit 4683059

Please sign in to comment.