1 /// \file IOHprofiler_observer.cpp
2 /// \brief Cpp file for the class IOHprofiler_observer.
3 ///
4 /// \author Furong Ye
5 
6 #include "IOHprofiler_observer.h"
7 
set_complete_flag(bool complete_flag)8 void IOHprofiler_observer::set_complete_flag(bool complete_flag) {
9   this->observer_complete_flag = complete_flag;
10 }
11 
complete_status() const12 bool IOHprofiler_observer::complete_status() const {
13   return observer_complete_flag;
14 }
15 
complete_trigger() const16 bool IOHprofiler_observer::complete_trigger() const {
17   return observer_complete_flag;
18 }
19 
set_interval(int interval)20 void IOHprofiler_observer::set_interval(int interval) {
21   this->observer_interval = interval;
22 }
23 
interval_status() const24 bool IOHprofiler_observer::interval_status() const {
25   if (observer_interval == 0) {
26     return false;
27   } else {
28     return true;
29   }
30 }
31 
interval_trigger(size_t evaluations) const32 bool IOHprofiler_observer::interval_trigger(size_t evaluations) const {
33   if (observer_interval == 0) {
34     return false;
35   }
36   if (evaluations == 1 || evaluations % observer_interval == 0) {
37     return true;
38   } else {
39     return false;
40   }
41 }
42 
set_update_flag(bool update_flag)43 void IOHprofiler_observer::set_update_flag(bool update_flag) {
44   this->observer_update_flag = update_flag;
45 }
46 
update_status() const47 bool IOHprofiler_observer::update_status() const {
48   return observer_update_flag;
49 }
50 
update_trigger(double fitness,IOH_optimization_type optimization_type)51 bool IOHprofiler_observer::update_trigger(double fitness, IOH_optimization_type optimization_type) {
52   if (observer_update_flag == false) {
53     return false;
54   }
55 
56   if (compareObjectives(fitness, current_best_fitness, optimization_type)) {
57     this->current_best_fitness = fitness;
58     return true;
59   }
60 
61   return false;
62 }
63 
set_time_points(const std::vector<int> & time_points,const int number_of_evaluations,const int time_points_exp_base1,const int time_points_exp_base2)64 void IOHprofiler_observer::set_time_points(const std::vector<int> & time_points, const int number_of_evaluations, const int time_points_exp_base1, const int time_points_exp_base2) {
65   this->observer_time_points = time_points;
66   this->observer_number_of_evaluations = number_of_evaluations;
67   this->observer_time_points_exp_base1 = time_points_exp_base1;
68   this->observer_time_points_exp_base2 = time_points_exp_base2;
69 }
70 
time_points_status() const71 bool IOHprofiler_observer::time_points_status() const {
72   if (this->observer_time_points.size() > 0) {
73     if(!(this->observer_time_points.size() == 1 && this->observer_time_points[0] == 0)) {
74       return true;
75     }
76   }
77   if (this->observer_number_of_evaluations > 0) {
78     return true;
79   }
80   return false;
81 }
82 
time_points_trigger(size_t evaluations)83 bool IOHprofiler_observer::time_points_trigger(size_t evaluations) {
84   if (this->time_points_status() == false) {
85     return false;
86   }
87   bool result = false;
88 
89   /// evaluations_values is to be set by 10^n * elements of observer_time_points.
90   /// For example, observer_time_points = {1,2,5}, the trigger returns true at 1, 2, 5, 10*1, 10*2, 10*5, 100*1, 100*2, 100*5,...
91   if(evaluations == this->evaluations_value1) {
92     result = true;
93     if (this->time_points_index < this->observer_time_points.size() - 1) {
94       this->time_points_index++;
95     } else {
96       this->time_points_index = 0;
97       this->time_points_expi++;
98     }
99     this->evaluations_value1 = (size_t)(this->observer_time_points[this->time_points_index] * pow(observer_time_points_exp_base1,this->time_points_expi));
100     while (this->evaluations_value1 <= evaluations) {
101       if (this->time_points_index < this->observer_time_points.size() - 1) {
102         this->time_points_index++;
103       } else {
104         this->time_points_index = 0;
105         this->time_points_expi++;
106       }
107       this->evaluations_value1 = (size_t)(this->observer_time_points[this->time_points_index] * pow(observer_time_points_exp_base1,this->time_points_expi));
108     }
109   }
110 
111   /// evaluations_value2 = floor(10^(i/n), n is observer_number_of_evaluations.
112   /// It maintains that in each [10^m, 10^(m+1)], there will be observer_number_of_evaluations evaluations are stored.
113   if (evaluations == this->evaluations_value2) {
114     while ((size_t)floor(pow(observer_time_points_exp_base2,(double)this->evaluations_expi/(double)this->observer_number_of_evaluations)) <= this->evaluations_value2) {
115       this->evaluations_expi++;
116     }
117     this->evaluations_value2 = (size_t)floor(pow(observer_time_points_exp_base2,(double)this->evaluations_expi/(double)this->observer_number_of_evaluations));
118     result = true;
119   }
120   return result;
121 }
122 
reset_observer(const IOH_optimization_type optimization_type)123 void IOHprofiler_observer::reset_observer(const IOH_optimization_type optimization_type) {
124   if (optimization_type == IOH_optimization_type::Maximization) {
125     this->current_best_fitness = std::numeric_limits<double>::lowest();
126   } else {
127     this->current_best_fitness = (std::numeric_limits<double>::max)();
128   }
129   this->evaluations_value1 = 1;
130   this->time_points_index = 0;
131   this->time_points_expi = 0;
132   this->evaluations_value2 = 1;
133   this->evaluations_expi = 0;
134 }