9#include "response_optimization.h"
24 neural_network_pointer = new_neural_network_pointer;
27 const Index outputs_number = neural_network_pointer->get_outputs_number();
29 inputs_conditions.resize(inputs_number);
30 inputs_conditions.setConstant(Condition::Between);
32 outputs_conditions.resize(outputs_number);
33 outputs_conditions.setConstant(Condition::Minimum);
50void ResponseOptimization::set_evaluations_number(
const Index& new_evaluations_number)
52 evaluations_number = new_evaluations_number;
56Tensor<ResponseOptimization::Condition, 1> ResponseOptimization::get_inputs_conditions()
58 return inputs_conditions;
62Tensor<ResponseOptimization::Condition, 1> ResponseOptimization::get_outputs_conditions()
64 return outputs_conditions;
68Tensor<type, 1> ResponseOptimization::get_inputs_minimums()
70 return inputs_minimums;
74Tensor<type, 1> ResponseOptimization::get_inputs_maximums()
76 return inputs_maximums;
80Tensor<type, 1> ResponseOptimization::get_outputs_minimums()
82 return outputs_minimums;
86Tensor<type, 1> ResponseOptimization::get_outputs_maximums()
88 return outputs_maximums;
91void ResponseOptimization::set_input_condition(
const string& name,
93 const Tensor<type, 1>& values)
97 set_input_condition(index, condition, values);
105 set_output_condition(index, condition, values);
111 inputs_conditions[index] = condition;
113 ostringstream buffer;
117 case Condition::Minimum:
119 if(values.size() != 0)
121 buffer <<
"OpenNN Exception: ResponseOptimization class.\n"
122 <<
"void set_input_condition() method.\n"
123 <<
"For Minimum condition, size of values must be 0.\n";
125 throw logic_error(buffer.str());
130 case Condition::Maximum:
132 if(values.size() != 0)
134 buffer <<
"OpenNN Exception: ResponseOptimization class.\n"
135 <<
"void set_input_condition() method.\n"
136 <<
"For Maximum condition, size of values must be 0.\n";
138 throw logic_error(buffer.str());
143 case Condition::EqualTo:
145 if(values.size() != 1)
147 buffer <<
"OpenNN Exception: ResponseOptimization class.\n"
148 <<
"void set_input_condition() method.\n"
149 <<
"For LessEqualTo condition, size of values must be 1.\n";
151 throw logic_error(buffer.str());
154 inputs_minimums[index] = values[0];
155 inputs_maximums[index] = values[0];
159 case Condition::LessEqualTo:
161 if(values.size() != 1)
163 buffer <<
"OpenNN Exception: ResponseOptimization class.\n"
164 <<
"void set_input_condition() method.\n"
165 <<
"For LessEqualTo condition, size of values must be 1.\n";
167 throw logic_error(buffer.str());
170 inputs_maximums[index] = values[0];
174 case Condition::GreaterEqualTo:
176 if(values.size() != 1)
178 buffer <<
"OpenNN Exception: ResponseOptimization class.\n"
179 <<
"void set_input_condition() method.\n"
180 <<
"For LessEqualTo condition, size of values must be 1.\n";
182 throw logic_error(buffer.str());
185 inputs_minimums[index] = values[0];
189 case Condition::Between:
191 if(values.size() != 2)
193 buffer <<
"OpenNN Exception: ResponseOptimization class.\n"
194 <<
"void set_input_condition() method.\n"
195 <<
"For Between condition, size of values must be 2.\n";
197 throw logic_error(buffer.str());
200 inputs_minimums[index] = values[0];
201 inputs_maximums[index] = values[1];
210 outputs_conditions[index] = condition;
212 ostringstream buffer;
216 case Condition::Minimum:
218 if(values.size() != 0)
220 buffer <<
"OpenNN Exception: ResponseOptimization class.\n"
221 <<
"void set_output_condition() method.\n"
222 <<
"For Minimum condition, size of values must be 0.\n";
224 throw logic_error(buffer.str());
229 case Condition::Maximum:
231 if(values.size() != 0)
233 buffer <<
"OpenNN Exception: ResponseOptimization class.\n"
234 <<
"void set_output_condition() method.\n"
235 <<
"For Maximum condition, size of values must be 0.\n";
237 throw logic_error(buffer.str());
242 case Condition::EqualTo:
244 if(values.size() != 1)
246 buffer <<
"OpenNN Exception: ResponseOptimization class.\n"
247 <<
"void set_output_condition() method.\n"
248 <<
"For LessEqualTo condition, size of values must be 1.\n";
250 throw logic_error(buffer.str());
253 outputs_minimums[index] = values[0];
254 outputs_maximums[index] = values[0];
258 case Condition::LessEqualTo:
260 if(values.size() != 1)
262 buffer <<
"OpenNN Exception: ResponseOptimization class.\n"
263 <<
"void set_output_condition() method.\n"
264 <<
"For LessEqualTo condition, size of values must be 1.\n";
266 throw logic_error(buffer.str());
269 outputs_maximums[index] = values[0];
273 case Condition::GreaterEqualTo:
275 if(values.size() != 1)
277 buffer <<
"OpenNN Exception: ResponseOptimization class.\n"
278 <<
"void set_output_condition() method.\n"
279 <<
"For LessEqualTo condition, size of values must be 1.\n";
281 throw logic_error(buffer.str());
284 outputs_minimums[index] = values[0];
288 case Condition::Between:
290 if(values.size() != 2)
292 buffer <<
"OpenNN Exception: ResponseOptimization class.\n"
293 <<
"void set_output_condition() method.\n"
294 <<
"For Between condition, size of values must be 2.\n";
296 throw logic_error(buffer.str());
299 outputs_minimums[index] = values[0];
300 outputs_maximums[index] = values[1];
310 const Tensor<string, 1>& conditions_string,
311 const Tensor<type, 1>& values)
313 const Tensor<Condition, 1> conditions = get_conditions(conditions_string);
315 const Tensor<Tensor<type, 1>, 1> values_conditions = get_values_conditions(conditions, values);
317 const Index variables_number = conditions_string.size();
319 const Tensor<string, 1> inputs_names = neural_network_pointer->
get_inputs_names();
323 for(Index i = 0; i < variables_number; i ++)
329 set_input_condition(index, conditions[i], values_conditions[i]);
335 set_output_condition(index, conditions[i], values_conditions[i]);
341Tensor<ResponseOptimization::Condition, 1> ResponseOptimization::get_conditions(
const Tensor<string, 1>& conditions_string)
const
343 const Index conditions_size = conditions_string.size();
345 Tensor<Condition, 1> conditions(conditions_size);
347 for(Index i = 0; i < conditions_size; i++)
349 if(conditions_string[i] ==
"Minimize")
351 conditions[i] = Condition::Minimum;
353 else if(conditions_string[i] ==
"Maximize")
355 conditions[i] = Condition::Maximum;
357 else if(conditions_string[i] ==
"=")
359 conditions[i] = Condition::EqualTo;
361 else if(conditions_string[i] ==
"Between")
363 conditions[i] = Condition::Between;
365 else if(conditions_string[i] ==
">="
366 || conditions_string[i] ==
">")
368 conditions[i] = Condition::GreaterEqualTo;
370 else if(conditions_string[i] ==
"<="
371 || conditions_string[i] ==
"<")
373 conditions[i] = Condition::LessEqualTo;
381Tensor<Tensor<type, 1>, 1> ResponseOptimization::get_values_conditions(
const Tensor<ResponseOptimization::Condition, 1>& conditions,
const Tensor<type, 1>& values)
const
383 const Index conditions_size = conditions.size();
385 Tensor<Tensor<type, 1>, 1> values_conditions(conditions_size);
389 ostringstream buffer;
391 for(Index i = 0; i < conditions_size; i++)
393 Tensor<type, 1> current_values;
395 const Condition current_condition = conditions[i];
397 switch(current_condition)
399 case Condition::Minimum:
401 values_conditions[i].resize(0);
406 case Condition::Maximum:
408 values_conditions[i].resize(0);
413 case Condition::EqualTo:
415 current_values.resize(1);
416 current_values[0] = values[index];
419 values_conditions[i] = current_values;
423 case Condition::LessEqualTo:
425 current_values.resize(1);
426 current_values[0] = values[index];
429 values_conditions[i] = current_values;
433 case Condition::GreaterEqualTo:
435 current_values.resize(1);
436 current_values[0] = values[index];
440 values_conditions[i] = current_values;
444 case Condition::Between:
446 current_values.resize(2);
447 current_values[0] = values[index];
449 current_values[1] = values[index];
452 values_conditions[i] = current_values;
458 return values_conditions;
462Tensor<type, 2> ResponseOptimization::calculate_inputs()
const
466 Tensor<type, 2> inputs(evaluations_number, inputs_number);
468 for(Index i = 0; i < evaluations_number; i++)
470 for(Index j = 0; j < inputs_number; j++)
472 inputs(i,j) = calculate_random_uniform(inputs_minimums[j], inputs_maximums[j]);
480Tensor<type, 2> ResponseOptimization::calculate_envelope(
const Tensor<type, 2>& inputs,
const Tensor<type, 2>& outputs)
const
483 const Index outputs_number = neural_network_pointer->get_outputs_number();
487 for(Index i = 0; i < outputs_number; i++)
494 return Tensor<type, 2>();
504 const Tensor<type, 2> inputs = calculate_inputs();
506 const Tensor<type, 2> outputs = neural_network_pointer->
calculate_outputs(inputs);
508 const Tensor<type, 2> envelope = calculate_envelope(inputs, outputs);
510 const Index samples_number = envelope.dimension(0);
513 const Index outputs_number = neural_network_pointer->get_outputs_number();
515 Tensor<type, 1> objective(samples_number);
517 for(Index i = 0; i < samples_number; i++)
519 for(Index j = 0; j < inputs_number; j++)
521 if(inputs_conditions[j] == Condition::Minimum)
523 objective[i] += envelope(i,j);
525 else if(inputs_conditions[j] == Condition::Maximum)
527 objective[i] += -envelope(i,j);
531 for(Index j = 0; j < outputs_number; j++)
533 if(outputs_conditions[j] == Condition::Minimum)
535 objective[i] += envelope(i, inputs_number+j);
537 else if(outputs_conditions[j] == Condition::Maximum)
539 objective[i] += -envelope(i, inputs_number+j);
544 const Index optimal_index = minimal_index(objective);
548 results->optimum_objective = objective[optimal_index];
554type ResponseOptimization::calculate_random_uniform(
const type& minimum,
const type& maximum)
const
556 const type random =
static_cast<type
>(rand()/(RAND_MAX+1.0));
558 const type random_uniform = minimum + (maximum - minimum) * random;
560 return random_uniform;
const Tensor< type, 1 > & get_upper_bounds() const
Returns the upper bounds values of all the bounding neurons in the layer.
const Tensor< type, 1 > & get_lower_bounds() const
Returns the lower bounds values of all the bounding neurons in the layer.
ScalingLayer * get_scaling_layer_pointer() const
Returns a pointer to the scaling layers object composing this neural network object.
Index get_inputs_number() const
Returns the number of inputs to the neural network.
Index get_input_index(const string &) const
const Tensor< string, 1 > & get_inputs_names() const
Returns a string vector with the names of the variables used as inputs.
Index get_output_index(const string &) const
Tensor< type, 2 > calculate_outputs(const Tensor< type, 2 > &)
BoundingLayer * get_bounding_layer_pointer() const
Returns a pointer to the bounding layers object composing this neural network object.
ResponseOptimizationResults * perform_optimization() const
void set_inputs_outputs_conditions(const Tensor< string, 1 > &, const Tensor< string, 1 > &, const Tensor< type, 1 > &=Tensor< type, 1 >())
Condition
Enumeration of available conditions for response optimization.
virtual ~ResponseOptimization()
Destructor.
Tensor< type, 1 > get_minimums() const
Returns a single matrix with the minimums of all scaling neurons.
Tensor< type, 1 > get_maximums() const
Returns a single matrix with the maximums of all scaling neurons.