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,
)