Issue with evaluate_callbacks (_population)

Hey Ronald,

unfortunately this fix leads to similar behavior than described here:
Callbacks while having dependent variables - CADET Troubleshooting - CADET (cadet-web.de)

While optimizing with dependent variables, I don’t get any callbacks. When I use the current dev-branch or without dependent variables it works fine.

import numpy as np
import CADETProcess
CADETProcess.settings.working_directory = 'C:/CADET_working_directory'

# Example import
from examples.batch_elution.process import process as process1
components = ['A', 'B']
process1.flow_sheet.column.binding_model.adsorption_rate=[0.011, 0.02]
process1.flow_sheet.column.binding_model.desorption_rate=[1, 1]
process1.flow_sheet.column.binding_model.is_kinetic = True

# simulate processes
from CADETProcess.simulator import Cadet
simulator = Cadet(install_path = 'C:\\ProgramData\\Anaconda3\\envs\\cadet\\')
simulation_result = simulator.simulate(process1)
# Reference data
def gaussian(x, mu, sigma, amplitude):
    return amplitude * np.exp(-((x - mu) ** 2) / (2 * sigma ** 2))

timepoints = np.arange(0, 601)
y_values_1A = gaussian(timepoints, 5 * 60, 80, 9)
y_values_1B = gaussian(timepoints, 8 * 60, 50, 3)
ref_data1 =np.column_stack((y_values_1A, y_values_1B))
# Comparator
from CADETProcess.comparison import Comparator
from CADETProcess.reference import ReferenceIO
reference = ReferenceIO('ref_' + process1.name, timepoints, ref_data1, component_system= process1.component_system)

# add references to comparator and define difference_metric
comparator = Comparator()
comparator.name =  'comparator'
comparator.add_reference(reference)
comparator.add_difference_metric(
                                'SSE', reference, 'column.outlet',
                                components = components
                                )

# Setup optimization problem
from CADETProcess.optimization import OptimizationProblem
optimization_problem = OptimizationProblem('Min_Example')
optimization_problem.add_evaluation_object(process1, name = process1.name)
optimization_problem.add_evaluator(simulator)
    
optimization_problem.add_objective(
    comparator,
    evaluation_objects = process1,
    name = 'obj_' + process1.name,
    n_objectives = comparator.n_metrics,
    requires = [simulator]
    )

k_eq = 0.02 # k_eq for all species

# Adding variables
k_des_lb = 0.1
k_des_ub = 100

#adsorption rate
optimization_problem.add_variable( 
    parameter_path = 'flow_sheet.column.binding_model.adsorption_rate',
    name = ('adsorption_rate'),
    lb = k_des_lb*k_eq, ub=k_des_ub*k_eq,
    transform = 'log',
)
# desorption rate
optimization_problem.add_variable(
    parameter_path = 'flow_sheet.column.binding_model.desorption_rate',
    name = ('desorption_rate'),
    lb = k_des_lb, ub=k_des_ub,
    transform = 'log',
)

# Callbacks
def callback(results, individual, callbacks_dir = './'):
    x_values = ', '.join(f"{num:.5g}" for num in individual.x)
    comparator.plot_comparison(
                        results,
                        show=0, 
                        file_name=f'''{callbacks_dir}/{comparator.name}_x=[{x_values}]_{individual.id}.png''',
                        )

optimization_problem.add_callback(
                            callback,
                            requires=[simulator], 
                            keep_progress = True
                            )

# Dependencies
make_dependencies = 1

if make_dependencies == True:
    
    def k_ads(k_des):
        return k_des*k_eq
    
    optimization_problem.add_variable_dependency('adsorption_rate', 'desorption_rate', 
                                                    transform = k_ads)

# Optimizer
should_optimize = 1

from CADETProcess.optimization import U_NSGA3
optimizer = U_NSGA3()
optimizer.n_cores = 8
optimizer.n_max_gen = 2
optimizer.pop_size = 2
optimizer.progress_frequency = 1

if should_optimize == True:
    
    if optimization_problem.callbacks[0].callbacks_dir != None:
        optimization_problem.callbacks[0].callbacks_dir = None # must be None for callback in optimization, otherwise error appears
    
    optimization_results = optimizer.optimize(
        optimization_problem,
        save_results = True,
        )