Skip to content

Commit 4bb0383

Browse files
committed
add option to change when statistics are written
1 parent 6b1cbbb commit 4bb0383

18 files changed

+196
-98
lines changed

gomea/discrete.pxd

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ cdef extern from "gomea/src/discrete/Config.hpp" namespace "gomea::discrete":
1111
int maximumNumberOfGOMEAs, IMSsubgenerationFactor, basePopulationSize, maxArchiveSize, maximumNumberOfEvaluations, maximumNumberOfGenerations, AnalyzeFOS
1212
long long randomSeed
1313
bool fix_seed, generational_statistics, generational_solution, verbose
14+
output_frequency_t output_frequency
1415
double maximumNumberOfSeconds
1516
string folder, problemInstancePath
1617
fitness_t[char] *fitness
@@ -26,3 +27,7 @@ cdef extern from "gomea/src/discrete/gomeaIMS.hpp" namespace "gomea::discrete":
2627
bool checkTermination() except +
2728
double getProgressUntilTermination() except +
2829
output_statistics_t output
30+
31+
cdef extern from "src/common/gomea_defs.hpp" namespace "gomea":
32+
ctypedef enum output_frequency_t:
33+
GEN, IMS_GEN, NEW_ELITE

gomea/discrete.pyx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ cdef class DiscreteGOMEA:
3939
# Output settings (optional)
4040
generational_statistics = True,
4141
generational_solution = False,
42+
output_frequency = 'GEN',
4243
verbose = False,
4344
):
4445

@@ -74,6 +75,14 @@ cdef class DiscreteGOMEA:
7475
self.c_config.generational_statistics = generational_statistics
7576
self.c_config.generational_solution = generational_solution
7677
self.c_config.verbose = verbose
78+
if output_frequency.lower() == 'gen':
79+
self.c_config.output_frequency = GEN
80+
elif output_frequency.lower() == 'ims_gen':
81+
self.c_config.output_frequency = IMS_GEN
82+
elif output_frequency.lower() == 'new_elite':
83+
self.c_config.output_frequency = NEW_ELITE
84+
else:
85+
raise ValueError("output_frequency must be one of 'GEN', 'IMS_GEN', 'NEW_ELITE'")
7786
self.c_config.fix_seed = False
7887
if random_seed != -1:
7988
self.c_config.randomSeed = random_seed

gomea/real_valued.pxd

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ cdef extern from "src/real_valued/Config.hpp" namespace "gomea::realvalued":
1111
int problem_index, maximum_no_improvement_stretch, maximum_number_of_populations, number_of_subgenerations_per_population_factor, base_population_size, maximum_number_of_generations
1212
double lower_user_range, upper_user_range, tau, distribution_multiplier_decrease, st_dev_ratio_threshold, fitness_variance_tolerance, maximum_number_of_evaluations, maximum_number_of_seconds
1313
bool fix_seed, use_vtr, generational_statistics, generational_solution, black_box_evaluations, selection_during_gom, update_elitist_during_gom, verbose, verbose, print_verbose_overview
14+
output_frequency_t output_frequency
1415
long long random_seed
1516
linkage_config_t *linkage_config
1617
fitness_t[double] *fitness
@@ -24,3 +25,7 @@ cdef extern from "src/real_valued/rv-gomea.hpp" namespace "gomea::realvalued":
2425
void run() except +
2526

2627
output_statistics_t output
28+
29+
cdef extern from "src/common/gomea_defs.hpp" namespace "gomea":
30+
ctypedef enum output_frequency_t:
31+
GEN, IMS_GEN, NEW_ELITE

gomea/real_valued.pyx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ cdef class RealValuedGOMEA:
3939
# Output settings (optional)
4040
generational_statistics = True,
4141
generational_solution = False,
42+
#output_frequency = 'GEN',
4243
verbose = False,
4344
):
4445

@@ -76,6 +77,15 @@ cdef class RealValuedGOMEA:
7677
self.c_config.generational_solution = generational_solution
7778
self.c_config.verbose = verbose
7879
self.c_config.print_verbose_overview = False
80+
output_frequency = 'GEN'
81+
if output_frequency == 'GEN':
82+
self.c_config.output_frequency = GEN
83+
elif output_frequency == 'IMS_GEN':
84+
self.c_config.output_frequency = IMS_GEN
85+
elif output_frequency == 'NEW_ELITE':
86+
self.c_config.output_frequency = NEW_ELITE
87+
else:
88+
raise ValueError("output_frequency must be one of 'GEN', 'IMS_GEN', 'NEW_ELITE'")
7989
self.c_config.fix_seed = 0
8090
if random_seed != -1:
8191
self.c_config.random_seed = random_seed

gomea/src/common/gomea_defs.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,6 @@ template<class T>
2525
using vec_t = std::vector<T>;
2626
typedef std::variant<char, int, float, double> genotype_t;
2727
typedef std::map<int,std::set<int>> graph_t;
28+
typedef enum output_frequency_t { GEN, IMS_GEN, NEW_ELITE } output_frequency_t;
2829

2930
}

gomea/src/common/output_statistics.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class output_statistics_t
4242
std::unordered_map<std::string, metric_t> final_metrics_map;
4343
std::set<int> generational_keys;
4444
solution_t<genotype_t> *elitist_solution;
45+
int number_of_writes = 0;
4546
};
4647

4748
}

gomea/src/discrete/Config.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class Config
5353
FOSIndex = 0;
5454
int GPUIndex = -1;
5555
int maximumFOSSetSize = -1;
56+
output_frequency_t output_frequency = output_frequency_t::GEN;
5657

5758
std::string folder = "discrete_gomea_output";
5859
//std::string problemName,

gomea/src/discrete/Population.cpp

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
namespace gomea{
44
namespace discrete{
55

6-
Population::Population(Config *config_, fitness_t<char> *problemInstance_, sharedInformation *sharedInformationPointer_, size_t GOMEAIndex_, size_t populationSize_, linkage_model_pt FOSInstance_ ):
7-
config(config_),
6+
Population::Population(Config *config_, output_statistics_t *output_, fitness_t<char> *problemInstance_, sharedInformation *sharedInformationPointer_, size_t GOMEAIndex_, size_t populationSize_, linkage_model_pt FOSInstance_ ):
7+
config(config_),
8+
output(output_),
89
problemInstance(problemInstance_),
910
sharedInformationPointer(sharedInformationPointer_),
1011
GOMEAIndex(GOMEAIndex_),
@@ -292,6 +293,8 @@ bool Population::GOM(size_t offspringIndex)
292293
//evaluateSolution(offspringPopulation[offspringIndex], backup, touchedGenes, backup->getObjectiveValue());
293294
//problemInstance->evaluatePartialSolution(offspringPopulation[offspringIndex], partial_offspring, FOSInstance->getDependentSubfunctions(ind) );
294295
problemInstance->evaluatePartialSolution(offspringPopulation[offspringIndex], partial_offspring );
296+
if( problemInstance->output_frequency == NEW_ELITE && !problemInstance->elitist_was_written )
297+
writeStatistics();
295298

296299
// accept the change if this solution is not the elitist and the fitness is at least equally good (allows random walk in neutral fitness landscape)
297300
// however, if this is the elitist solution, only accept strict improvements, to avoid convergence problems
@@ -344,6 +347,8 @@ bool Population::FI(size_t offspringIndex)
344347
if (!donorEqualToOffspring)
345348
{
346349
problemInstance->evaluatePartialSolution(offspringPopulation[offspringIndex], partial_offspring );
350+
if( problemInstance->output_frequency == NEW_ELITE && !problemInstance->elitist_was_written )
351+
writeStatistics();
347352

348353
if (partial_offspring->getObjectiveValue() > offspringPopulation[offspringIndex]->getObjectiveValue() )
349354
{
@@ -405,5 +410,42 @@ void Population::updateElitistAndCheckVTR(solution_t<char> *solution)
405410
sharedInformationPointer->firstEvaluationEver = false;
406411
}
407412

413+
void Population::writeStatistics( bool is_final )
414+
{
415+
assert( sharedInformationPointer != NULL );
416+
int key = output->number_of_writes;
417+
double evals = problemInstance->number_of_evaluations;
418+
double elapsed_time = utils::getElapsedTimeSinceStartSeconds();
419+
double eval_time = utils::getTimer("eval_time");
420+
//double elitist_evals = sharedInformationPointer->elitistSolutionHittingTimeEvaluations;
421+
//double time_s = sharedInformationPointer->elitistSolutionHittingTimeMilliseconds/1000.0;
422+
//double best_fitness = sharedInformationPointer->elitistFitness;
423+
output->addGenerationalMetricValue("generation",key,(int)numberOfGenerations);
424+
output->addGenerationalMetricValue("evaluations",key,evals);
425+
//output->addMetricValue("elitist_hitting_evaluations",key,elitist_evals);
426+
output->addGenerationalMetricValue("time",key,elapsed_time);
427+
output->addGenerationalMetricValue("eval_time",key,eval_time);
428+
output->addGenerationalMetricValue("population_index",key,(int)GOMEAIndex);
429+
output->addGenerationalMetricValue("population_size",key,(int)populationSize);
430+
output->addGenerationalMetricValue("best_obj_val",key,problemInstance->elitist_objective_value);
431+
output->addGenerationalMetricValue("best_cons_val",key,problemInstance->elitist_constraint_value);
432+
if( config->generational_solution )
433+
output->addGenerationalMetricValue("best_solution",key,sharedInformationPointer->elitist.variablesToString());
434+
//output->addMetricValue("obj_val_avg",key,population_objective_avg);
435+
//output->addMetricValue("obj_val_var",key,population_objective_var);
436+
437+
if( is_final ){
438+
output->addFinalMetricValue("evaluations",evals);
439+
output->addFinalMetricValue("time",elapsed_time);
440+
output->addFinalMetricValue("eval_time",eval_time);
441+
output->addFinalMetricValue("best_solution",sharedInformationPointer->elitist.variablesToString());
442+
output->addFinalMetricValue("best_obj_val",problemInstance->elitist_objective_value);
443+
output->addFinalMetricValue("best_cons_val",problemInstance->elitist_constraint_value);
444+
}
445+
446+
problemInstance->elitist_was_written = true;
447+
output->number_of_writes++;
448+
}
449+
408450

409451
}}

gomea/src/discrete/Population.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "gomea/src/common/solution.hpp"
1212
#include "gomea/src/common/partial_solution.hpp"
1313
#include "gomea/src/common/linkage_model.hpp"
14+
#include "gomea/src/common/output_statistics.hpp"
1415

1516
namespace gomea{
1617
namespace discrete{
@@ -21,6 +22,7 @@ class Population
2122
Config *config;
2223
fitness_t<char> *problemInstance;
2324
sharedInformation *sharedInformationPointer;
25+
output_statistics_t *output;
2426
size_t GOMEAIndex;
2527
size_t populationSize;
2628

@@ -34,7 +36,7 @@ class Population
3436

3537
linkage_model_pt FOSInstance = NULL;
3638

37-
Population(Config *config_, fitness_t<char> *problemInstance_, sharedInformation *sharedInformationPointer_, size_t GOMEAIndex_, size_t populationSize_, linkage_model_pt FOSInstance_ = NULL );
39+
Population(Config *config_, output_statistics_t *output_, fitness_t<char> *problemInstance_, sharedInformation *sharedInformationPointer_, size_t GOMEAIndex_, size_t populationSize_, linkage_model_pt FOSInstance_ = NULL );
3840
~Population();
3941

4042
friend std::ostream & operator << (std::ostream &out, const Population &populationInstance);
@@ -56,6 +58,7 @@ class Population
5658
bool FI(size_t offspringIndex);
5759
void updateElitistAndCheckVTR(solution_t<char> *solution);
5860
void checkTimeLimit();
61+
void writeStatistics( bool is_final = false );
5962
};
6063

6164
}}

gomea/src/discrete/gomeaIMS.cpp

Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ gomeaIMS::gomeaIMS(Config *config_)
2121
problemInstance = config->fitness;
2222
problemInstance->maximum_number_of_evaluations = config->maximumNumberOfEvaluations;
2323
problemInstance->maximum_number_of_seconds = config->maximumNumberOfSeconds;
24+
problemInstance->output_frequency = config->output_frequency;
2425
if( config->fix_seed )
2526
utils::initializeRandomNumberGenerator(config->randomSeed);
2627
else
@@ -132,7 +133,8 @@ void gomeaIMS::runGeneration( int GOMEAIndex )
132133

133134
GOMEAs[GOMEAIndex]->numberOfGenerations++;
134135

135-
writeStatistics( GOMEAIndex );
136+
if( config->output_frequency == GEN )
137+
writeStatistics( GOMEAIndex );
136138
}
137139

138140
bool gomeaIMS::checkTermination()
@@ -216,12 +218,13 @@ void gomeaIMS::initializeNewGOMEA()
216218
Population *newPopulation = NULL;
217219

218220
if (numberOfGOMEAs == 0)
219-
newPopulation = new Population(config, problemInstance, sharedInformationInstance, numberOfGOMEAs, basePopulationSize);
221+
newPopulation = new Population(config, &output, problemInstance, sharedInformationInstance, numberOfGOMEAs, basePopulationSize);
220222
else
221-
newPopulation = new Population(config, problemInstance, sharedInformationInstance, numberOfGOMEAs, 2 * GOMEAs[numberOfGOMEAs-1]->populationSize, GOMEAs[0]->FOSInstance );
222-
223+
newPopulation = new Population(config, &output, problemInstance, sharedInformationInstance, numberOfGOMEAs, 2 * GOMEAs[numberOfGOMEAs-1]->populationSize, GOMEAs[0]->FOSInstance );
223224
GOMEAs.push_back(newPopulation);
224225
numberOfGOMEAs++;
226+
227+
writeStatistics( numberOfGOMEAs-1 );
225228
}
226229

227230
void gomeaIMS::generationalStepAllGOMEAs()
@@ -261,6 +264,9 @@ void gomeaIMS::GOMEAGenerationalStepAllGOMEAsRecursiveFold(int GOMEAIndexSmalles
261264
for(GOMEAIndex = GOMEAIndexSmallest; GOMEAIndex < GOMEAIndexBiggest; GOMEAIndex++)
262265
GOMEAGenerationalStepAllGOMEAsRecursiveFold(GOMEAIndexSmallest, GOMEAIndex);
263266
}
267+
268+
if( config->output_frequency == IMS_GEN )
269+
writeStatistics( GOMEAIndex );
264270
}
265271

266272
bool gomeaIMS::checkTerminationGOMEA(int GOMEAIndex)
@@ -308,39 +314,7 @@ void gomeaIMS::writeStatistics( int population_index, bool is_final )
308314
// GOMEA in question has terminated already - no statistics available to save.
309315
return;
310316
}
311-
312-
assert( sharedInformationInstance != NULL );
313-
int key = numberOfStatisticsWrites;
314-
double evals = problemInstance->number_of_evaluations;
315-
double elapsed_time = utils::getElapsedTimeSinceStartSeconds();
316-
double eval_time = utils::getTimer("eval_time");
317-
//double elitist_evals = sharedInformationInstance->elitistSolutionHittingTimeEvaluations;
318-
//double time_s = sharedInformationInstance->elitistSolutionHittingTimeMilliseconds/1000.0;
319-
double best_fitness = sharedInformationInstance->elitistFitness;
320-
output.addGenerationalMetricValue("generation",key,(int)GOMEAs[population_index]->numberOfGenerations);
321-
output.addGenerationalMetricValue("evaluations",key,evals);
322-
//output.addMetricValue("elitist_hitting_evaluations",key,elitist_evals);
323-
output.addGenerationalMetricValue("time",key,elapsed_time);
324-
output.addGenerationalMetricValue("eval_time",key,eval_time);
325-
output.addGenerationalMetricValue("population_index",key,population_index);
326-
output.addGenerationalMetricValue("population_size",key,(int)GOMEAs[population_index]->populationSize);
327-
output.addGenerationalMetricValue("best_obj_val",key,sharedInformationInstance->elitistFitness);
328-
output.addGenerationalMetricValue("best_cons_val",key,sharedInformationInstance->elitistConstraintValue);
329-
if( config->generational_solution )
330-
output.addGenerationalMetricValue("best_solution",key,sharedInformationInstance->elitist.variablesToString());
331-
//output.addMetricValue("obj_val_avg",key,population_objective_avg);
332-
//output.addMetricValue("obj_val_var",key,population_objective_var);
333-
334-
if( is_final ){
335-
output.addFinalMetricValue("evaluations",evals);
336-
output.addFinalMetricValue("time",elapsed_time);
337-
output.addFinalMetricValue("eval_time",eval_time);
338-
output.addFinalMetricValue("best_solution",sharedInformationInstance->elitist.variablesToString());
339-
output.addFinalMetricValue("best_obj_val",sharedInformationInstance->elitistFitness);
340-
output.addFinalMetricValue("best_cons_val",sharedInformationInstance->elitistConstraintValue);
341-
}
342-
343-
numberOfStatisticsWrites++;
317+
GOMEAs[population_index]->writeStatistics(is_final);
344318
}
345319

346320

0 commit comments

Comments
 (0)