/** * @brief Frees the memory of the given biobjective logger. */ static void logger_biobj_free(void *stuff) { logger_biobj_data_t *logger; size_t i; assert(stuff != NULL); logger = (logger_biobj_data_t *) stuff; if (logger->log_nondom_mode == LOG_NONDOM_FINAL) { logger_biobj_finalize(logger); } if (logger->compute_indicators) { for (i = 0; i < OBSERVER_BIOBJ_NUMBER_OF_INDICATORS; i++) { logger_biobj_indicator_finalize(logger->indicators[i], logger); logger_biobj_indicator_free(logger->indicators[i]); } } if ((logger->log_nondom_mode != LOG_NONDOM_NONE) && (logger->archive_file != NULL)) { fclose(logger->archive_file); logger->archive_file = NULL; } avl_tree_destruct(logger->archive_tree); avl_tree_destruct(logger->buffer_tree); }
void coco_archive_free(coco_archive_t *archive) { assert(archive != NULL); avl_tree_destruct(archive->tree); coco_free_memory(archive->ideal); coco_free_memory(archive->nadir); coco_free_memory(archive); }
/** * @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); }