/** * @brief Allocates a transformed problem that wraps the inner_problem. * * By default all methods will dispatch to the inner_problem. A prefix is prepended to the problem name * in order to reflect the transformation somewhere. */ static coco_problem_t *coco_problem_transformed_allocate(coco_problem_t *inner_problem, void *user_data, coco_data_free_function_t data_free_function, const char *name_prefix) { coco_problem_transformed_data_t *problem; coco_problem_t *inner_copy; char *old_name = coco_strdup(inner_problem->problem_name); problem = (coco_problem_transformed_data_t *) coco_allocate_memory(sizeof(*problem)); problem->inner_problem = inner_problem; problem->data = user_data; problem->data_free_function = data_free_function; inner_copy = coco_problem_duplicate(inner_problem); inner_copy->evaluate_function = coco_problem_transformed_evaluate_function; inner_copy->evaluate_constraint = coco_problem_transformed_evaluate_constraint; inner_copy->recommend_solution = coco_problem_transformed_recommend_solution; inner_copy->problem_free_function = coco_problem_transformed_free; inner_copy->data = problem; coco_problem_set_name(inner_copy, "%s(%s)", name_prefix, old_name); coco_free_memory(old_name); return inner_copy; }
/** * coco_transformed_allocate(inner_problem): * * Allocate a transformed problem that wraps ${inner_problem}. By * default all methods will dispatch to the ${inner_problem} method. * */ coco_problem_t *coco_transformed_allocate(coco_problem_t *inner_problem, void *userdata, coco_transformed_free_data_t free_data) { coco_transformed_data_t *data; coco_problem_t *self; data = coco_allocate_memory(sizeof(*data)); data->inner_problem = inner_problem; data->data = userdata; data->free_data = free_data; self = coco_problem_duplicate(inner_problem); self->evaluate_function = transformed_evaluate_function; self->evaluate_constraint = transformed_evaluate_constraint; self->recommend_solutions = transformed_recommend_solutions; self->free_problem = transformed_free_problem; self->data = data; return self; }