/** * Initializes the biobjective observer. Possible options: * - log_nondominated : none (don't log nondominated solutions) * - log_nondominated : final (log only the final nondominated solutions; default value) * - log_nondominated : all (log every solution that is nondominated at creation time) * - log_decision_variables : none (don't output decision variables) * - log_decision_variables : log_dim (output decision variables only for dimensions lower or equal to 5; default value) * - log_decision_variables : all (output all decision variables) * - compute_indicators : 0 / 1 (whether to compute and output performance indicators; default value is 1) * - produce_all_data: 0 / 1 (whether to produce all data; if set to 1, overwrites other options and is equivalent to * setting log_nondominated to all, log_decision_variables to log_dim and compute_indicators to 1; if set to 0, it * does not change the values of other options; default value is 0) */ static void observer_biobj(coco_observer_t *self, const char *options) { observer_biobj_t *data; char string_value[COCO_PATH_MAX]; data = coco_allocate_memory(sizeof(*data)); data->log_nondom_mode = FINAL; if (coco_options_read_string(options, "log_nondominated", string_value) > 0) { if (strcmp(string_value, "none") == 0) data->log_nondom_mode = NONE; else if (strcmp(string_value, "all") == 0) data->log_nondom_mode = ALL; } data->log_vars_mode = LOW_DIM; if (coco_options_read_string(options, "log_decision_variables", string_value) > 0) { if (strcmp(string_value, "none") == 0) data->log_vars_mode = NEVER; else if (strcmp(string_value, "all") == 0) data->log_vars_mode = ALWAYS; } if (coco_options_read_int(options, "compute_indicators", &(data->compute_indicators)) == 0) data->compute_indicators = 1; if (coco_options_read_int(options, "produce_all_data", &(data->produce_all_data)) == 0) data->produce_all_data = 0; if (data->produce_all_data) { data->log_vars_mode = LOW_DIM; data->compute_indicators = 1; data->log_nondom_mode = ALL; } if (data->compute_indicators) { data->previous_function = -1; } self->logger_initialize_function = logger_biobj; self->data_free_function = NULL; self->data = data; if ((data->log_nondom_mode == NONE) && (!data->compute_indicators)) { /* No logging required */ self->is_active = 0; } }
/** * @brief Initializes the bi-objective observer. * * Possible options: * - log_nondominated : none (don't log nondominated solutions) * - log_nondominated : final (log only the final nondominated solutions) * - log_nondominated : all (log every solution that is nondominated at creation time; default value) * - log_decision_variables : none (don't output decision variables) * - log_decision_variables : log_dim (output decision variables only for dimensions lower or equal to 5; * default value) * - log_decision_variables : all (output all decision variables) * - compute_indicators : 0 / 1 (whether to compute and output performance indicators; default value is 1) * - produce_all_data: 0 / 1 (whether to produce all data; if set to 1, overwrites other options and is * equivalent to setting log_nondominated to all, log_decision_variables to log_dim and compute_indicators * to 1; if set to 0, it does not change the values of other options; default value is 0) */ static void observer_biobj(coco_observer_t *observer, const char *options) { observer_biobj_data_t *observer_biobj; char string_value[COCO_PATH_MAX]; observer_biobj = (observer_biobj_data_t *) coco_allocate_memory(sizeof(*observer_biobj)); observer_biobj->log_nondom_mode = LOG_NONDOM_ALL; if (coco_options_read_string(options, "log_nondominated", string_value) > 0) { if (strcmp(string_value, "none") == 0) observer_biobj->log_nondom_mode = LOG_NONDOM_NONE; else if (strcmp(string_value, "final") == 0) observer_biobj->log_nondom_mode = LOG_NONDOM_FINAL; } observer_biobj->log_vars_mode = LOG_VARS_LOW_DIM; if (coco_options_read_string(options, "log_decision_variables", string_value) > 0) { if (strcmp(string_value, "none") == 0) observer_biobj->log_vars_mode = LOG_VARS_NEVER; else if (strcmp(string_value, "all") == 0) observer_biobj->log_vars_mode = LOG_VARS_ALWAYS; } if (coco_options_read_int(options, "compute_indicators", &(observer_biobj->compute_indicators)) == 0) observer_biobj->compute_indicators = 1; if (coco_options_read_int(options, "produce_all_data", &(observer_biobj->produce_all_data)) == 0) observer_biobj->produce_all_data = 0; if (observer_biobj->produce_all_data) { observer_biobj->log_vars_mode = LOG_VARS_LOW_DIM; observer_biobj->compute_indicators = 1; observer_biobj->log_nondom_mode = LOG_NONDOM_ALL; } if (observer_biobj->compute_indicators) { observer_biobj->previous_function = -1; } observer->logger_initialize_function = logger_biobj; observer->data_free_function = NULL; observer->data = observer_biobj; if ((observer_biobj->log_nondom_mode == LOG_NONDOM_NONE) && (!observer_biobj->compute_indicators)) { /* No logging required */ observer->is_active = 0; } }
/** * Currently, three observers are supported: * - "bbob" is the observer for single-objective (both noisy and noiseless) problems with known optima, which * creates *.info, *.dat, *.tdat and *.rdat files and logs the distance to the optimum. * - "bbob-biobj" is the observer for bi-objective problems, which creates *.info and *.dat files for the * given indicators, as well as an archive folder with *.dat files containing nondominated solutions. * - "toy" is a simple observer that logs when a target has been hit. * * @param observer_name A string containing the name of the observer. Currently supported observer names are * "bbob", "bbob-biobj", "toy". "no_observer", "" or NULL return NULL. * @param observer_options A string of pairs "key: value" used to pass the options to the observer. Some * observer options are general, while others are specific to some observers. Here we list only the general * options, see observer_bbob, observer_biobj and observer_toy for options of the specific observers. * - "result_folder: NAME" determines the output folder. If the folder with the given name already exists, * first NAME_001 will be tried, then NAME_002 and so on. The default value is "results". * - "algorithm_name: NAME", where NAME is a short name of the algorithm that will be used in plots (no * spaces are allowed). The default value is "ALG". * - "algorithm_info: STRING" stores the description of the algorithm. If it contains spaces, it must be * surrounded by double quotes. The default value is "" (no description). * - "precision_x: VALUE" defines the precision used when outputting variables and corresponds to the number * of digits to be printed after the decimal point. The default value is 8. * - precision_f: VALUE defines the precision used when outputting f values and corresponds to the number of * digits to be printed after the decimal point. The default value is 15. * @return The constructed observer object or NULL if observer_name equals NULL, "" or "no_observer". */ coco_observer_t *coco_observer(const char *observer_name, const char *observer_options) { coco_observer_t *observer; char *result_folder, *algorithm_name, *algorithm_info; int precision_x, precision_f; if (0 == strcmp(observer_name, "no_observer")) { return NULL; } else if (strlen(observer_name) == 0) { coco_warning("Empty observer_name has no effect. To prevent this warning use 'no_observer' instead"); return NULL; } result_folder = (char *) coco_allocate_memory(COCO_PATH_MAX); algorithm_name = (char *) coco_allocate_memory(COCO_PATH_MAX); algorithm_info = (char *) coco_allocate_memory(5 * COCO_PATH_MAX); /* Read result_folder, algorithm_name and algorithm_info from the observer_options and use * them to initialize the observer */ if (coco_options_read_string(observer_options, "result_folder", result_folder) == 0) { strcpy(result_folder, "exdata-default"); } coco_create_unique_path(&result_folder); coco_info("Results will be output to folder %s", result_folder); if (coco_options_read_string(observer_options, "algorithm_name", algorithm_name) == 0) { strcpy(algorithm_name, "ALG"); } if (coco_options_read_string(observer_options, "algorithm_info", algorithm_info) == 0) { strcpy(algorithm_info, ""); } precision_x = 8; if (coco_options_read_int(observer_options, "precision_x", &precision_x) != 0) { if ((precision_x < 1) || (precision_x > 32)) precision_x = 8; } precision_f = 15; if (coco_options_read_int(observer_options, "precision_f", &precision_f) != 0) { if ((precision_f < 1) || (precision_f > 32)) precision_f = 15; } observer = coco_observer_allocate(result_folder, algorithm_name, algorithm_info, precision_x, precision_f); coco_free_memory(result_folder); coco_free_memory(algorithm_name); coco_free_memory(algorithm_info); /* Here each observer must have an entry */ if (0 == strcmp(observer_name, "toy")) { observer_toy(observer, observer_options); } else if (0 == strcmp(observer_name, "bbob")) { observer_bbob(observer, observer_options); } else if (0 == strcmp(observer_name, "bbob-biobj")) { observer_biobj(observer, observer_options); } else { coco_warning("Unknown observer!"); return NULL; } return observer; }