Hey there,
I was currently trying to simulate the protein CEX chromatography elution curve, for which I reviewed the case studies provided in the documentation. I successfully simulated my desired curve and optimised parameters for any of my protein load components. However, I have three variants in my load, therefore three components, except for salt. All of the examples were related to single-component optimisations. How should I approach optimising params simultaneously for multiple components? One way I thought was adding each component as a different reference and then creating a separate optimisation problem for each of them. But that seemed inefficient. Is there a shorter way to create a combined optimisation problem for each of them?
I will share what my current optimization problem looks like for single variable:
from CADETProcess.comparison import Comparator
comparator = Comparator()
from CADETProcess.reference import ReferenceIO
reference = ReferenceIO(“Acidic”, new_time, data[“Cacidic_gauss”], component_system=ComponentSystem([“Acidic”]))
# reference1 = ReferenceIO(“Basic”, new_time, data[“Cbasic_gauss”], component_system=ComponentSystem([“Basic”]))
# reference2 = ReferenceIO(“Main”, new_time, data[“Cmain_gauss”], component_system=ComponentSystem([“Main”]))
#I see how the experimental data is added
#_ = reference.plot()
comparator.add_reference(reference)
# comparator.add_reference(reference1)
# comparator.add_reference(reference2)
comparator.add_difference_metric(‘PeakHeight’, reference, “column.outlet”, components = [“Acidic”], start = 2800)
comparator.add_difference_metric(‘PeakPosition’, reference, “column.outlet”, components = [“Acidic”], start = 2800)
comparator.add_difference_metric(‘Shape’, reference, “column.outlet”, components = [“Acidic”], start = 2800)
# comparator.add_difference_metric(‘SSE’, reference1, “column.outlet”, components = [“Basic”], start = 2620)
# comparator.add_difference_metric(‘SSE’, reference2, “column.outlet”, components = [“Main”], start = 2620)
_ = comparator.plot_comparison(simulation_results)
from CADETProcess.optimization import OptimizationProblem
optimization_problem = OptimizationProblem(“4_params”)
optimization_problem.add_evaluation_object(process)
optimization_problem.add_evaluator(process_simulator)
optimization_problem.add_objective(
comparator,
n_objectives = comparator.n_metrics,
requires = [process_simulator])
optimization_problem.add_variable(
name = “adsorption_rate”,
parameter_path = “flow_sheet.column.binding_model.adsorption_rate”,
lb = 1e7, ub = 1e11,
transform = “auto”,
indices = [1])
optimization_problem.add_variable(
name = “ion_exchange_characteristic”,
parameter_path = “flow_sheet.column.binding_model.ion_exchange_characteristic”,
lb = 1e0, ub = 1.2e1,
transform = “auto”,
indices = [1])
optimization_problem.add_variable(
name = “capacity”,
parameter_path = “flow_sheet.column.binding_model.capacity”,
lb = 1e-01, ub = 1.2e2,
transform = “auto”,
indices = [1])
optimization_problem.add_variable(
name = “pore_diffusion”,
parameter_path = “flow_sheet.column.pore_diffusion”,
lb = 1e-13, ub = 1e-9,
transform = “auto”,
indices = [1])
def callback(simulation_results, individual, evaluation_object, callbacks_dir = “./”):#don’t know what callbacks_dir is
comparator.plot_comparison(
simulation_results,
file_name=f’{callbacks_dir}/{individual.id}_{evaluation_object}_comparison.png’,
show = True
)
print(simulation_results)
print(individual.x, individual.f)
print(evaluation_object)
print(callbacks_dir)
optimization_problem.add_callback(callback, requires=[process_simulator])
from CADETProcess.optimization import U_NSGA3
optimizer = U_NSGA3()
optimizer.n_cores = 6
optimizer.progress_frequency = 2
optimizer.pop_size = 5
optimizer.n_max_gen = 50
optimization_results = optimizer.optimize(
optimization_problem,
use_checkpoint = False
)
Please guide.
Thanks.