/** * @brief Outputs the final nondominated solutions to the archive file. */ static void logger_biobj_finalize(logger_biobj_data_t *logger) { avl_tree_t *resorted_tree; avl_node_t *solution; /* Re-sort archive_tree according to time stamp and then output it */ resorted_tree = avl_tree_construct((avl_compare_t) avl_tree_compare_by_time_stamp, NULL); if (logger->archive_tree->tail) { /* There is at least a solution in the tree to output */ solution = logger->archive_tree->head; while (solution != NULL) { avl_item_insert(resorted_tree, solution->item); solution = solution->next; } } logger_biobj_tree_output(logger->archive_file, resorted_tree, logger->number_of_variables, logger->number_of_objectives, logger->log_vars, logger->precision_x, logger->precision_f); avl_tree_destruct(resorted_tree); }
/** * @brief Allocates memory for the archive and initializes its fields. */ static coco_archive_t *coco_archive_allocate(void) { /* Allocate memory to hold the data structure coco_archive_t */ coco_archive_t *archive = (coco_archive_t*) coco_allocate_memory(sizeof(*archive)); /* Initialize the AVL tree */ archive->tree = avl_tree_construct((avl_compare_t) coco_archive_compare_by_last_objective, (avl_free_t) coco_archive_node_item_free); archive->ideal = NULL; /* To be allocated in coco_archive() */ archive->nadir = NULL; /* To be allocated in coco_archive() */ archive->number_of_objectives = 2; archive->is_up_to_date = 0; archive->number_of_solutions = 0; archive->hypervolume = 0.0; archive->current_solution = NULL; archive->extreme1 = NULL; /* To be set in coco_archive() */ archive->extreme2 = NULL; /* To be set in coco_archive() */ archive->extremes_already_returned = 0; return archive; }
/** * @brief Initializes the biobjective logger. */ static coco_problem_t *logger_biobj(coco_observer_t *observer, coco_problem_t *inner_problem) { coco_problem_t *problem; logger_biobj_data_t *logger_biobj; observer_biobj_data_t *observer_biobj; const char nondom_folder_name[] = "archive"; char *path_name, *file_name = NULL, *prefix; size_t i; if (inner_problem->number_of_objectives != 2) { coco_error("logger_biobj(): The bi-objective logger cannot log a problem with %d objective(s)", inner_problem->number_of_objectives); return NULL; /* Never reached. */ } logger_biobj = (logger_biobj_data_t *) coco_allocate_memory(sizeof(*logger_biobj)); logger_biobj->observer = observer; logger_biobj->number_of_evaluations = 0; logger_biobj->number_of_variables = inner_problem->number_of_variables; logger_biobj->number_of_objectives = inner_problem->number_of_objectives; logger_biobj->suite_dep_instance = inner_problem->suite_dep_instance; observer_biobj = (observer_biobj_data_t *) observer->data; /* Copy values from the observes that you might need even if they do not exist any more */ logger_biobj->log_nondom_mode = observer_biobj->log_nondom_mode; logger_biobj->compute_indicators = observer_biobj->compute_indicators; logger_biobj->precision_x = observer->precision_x; logger_biobj->precision_f = observer->precision_f; if (((observer_biobj->log_vars_mode == LOG_VARS_LOW_DIM) && (inner_problem->number_of_variables > 5)) || (observer_biobj->log_vars_mode == LOG_VARS_NEVER)) logger_biobj->log_vars = 0; else logger_biobj->log_vars = 1; /* Initialize logging of nondominated solutions into the archive file */ if (logger_biobj->log_nondom_mode != LOG_NONDOM_NONE) { /* Create the path to the file */ path_name = coco_allocate_string(COCO_PATH_MAX); memcpy(path_name, observer->result_folder, strlen(observer->result_folder) + 1); coco_join_path(path_name, COCO_PATH_MAX, nondom_folder_name, NULL); coco_create_directory(path_name); /* Construct file name */ prefix = coco_remove_from_string(inner_problem->problem_id, "_i", "_d"); if (logger_biobj->log_nondom_mode == LOG_NONDOM_ALL) file_name = coco_strdupf("%s_nondom_all.adat", prefix); else if (logger_biobj->log_nondom_mode == LOG_NONDOM_FINAL) file_name = coco_strdupf("%s_nondom_final.adat", prefix); coco_join_path(path_name, COCO_PATH_MAX, file_name, NULL); if (logger_biobj->log_nondom_mode != LOG_NONDOM_NONE) coco_free_memory(file_name); coco_free_memory(prefix); /* Open and initialize the archive file */ logger_biobj->archive_file = fopen(path_name, "a"); if (logger_biobj->archive_file == NULL) { coco_error("logger_biobj() failed to open file '%s'.", path_name); return NULL; /* Never reached */ } coco_free_memory(path_name); /* Output header information */ fprintf(logger_biobj->archive_file, "%% instance = %ld, name = %s\n", inner_problem->suite_dep_instance, inner_problem->problem_name); if (logger_biobj->log_vars) { fprintf(logger_biobj->archive_file, "%% function evaluation | %lu objectives | %lu variables\n", inner_problem->number_of_objectives, inner_problem->number_of_variables); } else { fprintf(logger_biobj->archive_file, "%% function evaluation | %lu objectives \n", inner_problem->number_of_objectives); } } /* Initialize the AVL trees */ logger_biobj->archive_tree = avl_tree_construct((avl_compare_t) avl_tree_compare_by_last_objective, (avl_free_t) logger_biobj_node_free); logger_biobj->buffer_tree = avl_tree_construct((avl_compare_t) avl_tree_compare_by_time_stamp, NULL); problem = coco_problem_transformed_allocate(inner_problem, logger_biobj, logger_biobj_free); problem->evaluate_function = logger_biobj_evaluate; /* Initialize the indicators */ if (logger_biobj->compute_indicators) { for (i = 0; i < OBSERVER_BIOBJ_NUMBER_OF_INDICATORS; i++) logger_biobj->indicators[i] = logger_biobj_indicator(logger_biobj, inner_problem, observer_biobj_indicators[i]); observer_biobj->previous_function = (long) inner_problem->suite_dep_function; } return problem; }