65 template<
typename ModelBuilderType>
friend class Solver;
67 friend class algorithms::AdaptiveSearchErrorProjection;
68 friend class algorithms::CulpritSearchErrorProjection;
70 std::vector<Variable*> _variables;
71 std::vector<int> _variables_index;
72 std::map<int,int> _variables_position;
74 double _current_error;
77 mutable bool _is_optional_delta_error_defined;
79 struct nanException : std::exception
81 std::vector<Variable*> ptr_variables;
82 std::vector<Variable> variables;
85 nanException(
const std::vector<Variable*>& ptr_variables ) : ptr_variables(ptr_variables)
87 message =
"Constraint required_error returned a NaN value on variables (";
88 for(
int i = 0; i < static_cast<int>( ptr_variables.size() ) - 1; ++i )
89 message += std::to_string( ptr_variables[i]->get_value() ) +
", ";
90 message += std::to_string( ptr_variables[
static_cast<int>( ptr_variables.size() ) - 1 ]->get_value() ) +
")\n";
93 nanException(
const std::vector<Variable>& variables ) : variables(variables)
95 message =
"Constraint optional_delta_error returned a NaN value on variables (";
96 for(
int i = 0; i < static_cast<int>( variables.size() ) - 1; ++i )
97 message += std::to_string( variables[i].get_value() ) +
", ";
98 message += std::to_string( variables[
static_cast<int>( variables.size() ) - 1 ].get_value() ) +
")\n";
101 const char* what() const noexcept {
return message.c_str(); }
104 struct negativeException : std::exception
106 std::vector<Variable*> ptr_variables;
107 std::vector<Variable> variables;
110 negativeException(
const std::vector<Variable*>& ptr_variables ) : ptr_variables(ptr_variables)
112 message =
"Constraint required_error returned a negative value on variables (";
113 for(
int i = 0; i < static_cast<int>( ptr_variables.size() ) - 1; ++i )
114 message += std::to_string( ptr_variables[i]->get_value() ) +
", ";
115 message += std::to_string( ptr_variables[
static_cast<int>( ptr_variables.size() ) - 1 ]->get_value() ) +
")\n";
118 const char* what() const noexcept {
return message.c_str(); }
121 struct deltaErrorNotDefinedException : std::exception
125 deltaErrorNotDefinedException()
127 message =
"Constraint::optional_delta_error() has not been user-defined.\n";
129 const char* what() const noexcept {
return message.c_str(); }
132 struct variableOutOfTheScope : std::exception
136 variableOutOfTheScope(
int var_id,
int ctr_id )
138 message =
"Variable* ID " + std::to_string( var_id ) +
" is not in the scope of Constraint ID " + std::to_string( ctr_id ) +
".\n";
140 const char* what() const noexcept {
return message.c_str(); }
143 inline bool is_optional_delta_error_defined() {
return _is_optional_delta_error_defined; }
146 double error()
const;
151 double delta_error(
const std::vector<int>& variables_index,
const std::vector<int>& candidate_values )
const;
155 double simulate_delta(
const std::vector<int>& variables_index,
const std::vector<int>& candidate_values );
158 inline std::vector<int> get_variable_ids()
const {
return _variables_index; }
202 virtual double required_error(
const std::vector<Variable*>& variables )
const = 0;
241 virtual double optional_delta_error(
const std::vector<Variable*>& variables,
const std::vector<int>& indexes,
const std::vector<int>& candidate_values )
const;
268 inline int get_id()
const {
return _id; }
308 return os <<
"Constraint type: " <<
typeid(c).name()