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 }