Hi Johannes
Thanks for the fix! I was able to successfully use the optimizer TrustConstr()
in v0.7.3 to estimate one variable (CSTR volume to simulate dispersion).
In a further step, I would like to estimate multiple variables (bed_porosity, axial_dispersion, particle_porosity
) in one optimization problem using the TrustConstr
() optimizer.
Unfortunately, once I want to optimize multiple variables in one optimization, I receive an error message. See the script below.
# Setup Optimization algorithm to estimate: [bed_poros, axial_disp, particle_poros]
from CADETProcess.reference import ReferenceIO
from CADETProcess.comparison import Comparator
from CADETProcess.optimization import OptimizationProblem
from CADETProcess.optimization import TrustConstr
# Setup Reference & Comparator
exp_time = df2.iloc[:,2].dropna()*1e-6/Q #mL Q=V/t <=> t=V/Q
exp_conc = df2.iloc[:,3].dropna()
reference = ReferenceIO('Salt', exp_time, exp_conc)
comparator = Comparator()
comparator.add_reference(reference)
comparator.add_difference_metric('SSE', reference, 'column.outlet', start=((injVol-2)*1e-6/Q), end=(11*1e-6)/Q) # start => t = V/Q
metrics = comparator.evaluate(simulation_results)
print(f"{metrics = }")
# Setup Optimization
optimization_problem = OptimizationProblem('TC')
optimization_problem.add_evaluation_object(process)
optimization_problem.add_variable('flow_sheet.column.bed_porosity', lb=0.2, ub=1)
optimization_problem.add_variable('flow_sheet.column.axial_dispersion', lb=1e-8, ub=1e-5)
optimization_problem.add_variable('flow_sheet.column.particle_porosity', lb=0.2, ub=1)
simulator = Cadet()
optimization_problem.add_evaluator(simulator, cache=True)
optimization_problem.add_objective(comparator,
n_objectives=comparator.n_metrics,
requires=[simulator])
def callback(simulation_results, individual, evaluation_object, callbacks_dir='./'):
comparator.plot_comparison(
simulation_results,
file_name=f'{callbacks_dir}/{individual.id}_{evaluation_object}_comparison.png',
show=False
)
optimization_problem.add_callback(callback, requires=[simulator],
frequency=1, keep_progress=True)
optimizer = TrustConstr()
if __name__ == "__main__":
from CADETProcess import settings
settings.working_directory = './OPT'
settings.temp_dir = '/dev/shm'
print('Starting Optimization')
optimization_results = optimizer.optimize(optimization_problem, x0=None, save_results=True,
results_directory=None, use_checkpoint=False,
overwrite_results_directory=True, exist_ok=True,
log_level='INFO', reinit_cache=True, delete_cache=True)
The following error message appears:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
C:/dev/shm\ipykernel_12700\1015459542.py in <module>
5 print('Starting Optimization')
6
----> 7 optimization_results = optimizer.optimize(optimization_problem, x0=None, save_results=True,
8 results_directory=None, use_checkpoint=False,
9 overwrite_results_directory=True, exist_ok=True,
~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizer.py in optimize(self, optimization_problem, x0, save_results, results_directory, use_checkpoint, overwrite_results_directory, exist_ok, log_level, reinit_cache, delete_cache, *args, **kwargs)
208 start = time.time()
209
--> 210 self.run(self.optimization_problem, x0, *args, **kwargs)
211
212 self.results.time_elapsed = time.time() - start
~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\scipyAdapter.py in run(self, optimization_problem, x0)
82 warnings.filterwarnings('ignore', category=OptimizeWarning)
83 warnings.filterwarnings('ignore', category=RuntimeWarning)
---> 84 scipy_results = optimize.minimize(
85 objective_function,
86 x0=x0,
~\anaconda3\envs\cadet\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
706 constraints, callback=callback, **options)
707 elif meth == 'trust-constr':
--> 708 res = _minimize_trustregion_constr(fun, x0, args, jac, hess, hessp,
709 bounds, constraints,
710 callback=callback, **options)
~\anaconda3\envs\cadet\lib\site-packages\scipy\optimize\_trustregion_constr\minimize_trustregion_constr.py in _minimize_trustregion_constr(fun, x0, args, grad, hess, hessp, bounds, constraints, xtol, gtol, barrier_tol, sparse_jacobian, callback, maxiter, verbose, finite_diff_rel_step, initial_constr_penalty, initial_tr_radius, initial_barrier_parameter, initial_barrier_tolerance, factorization_method, disp)
507
508 elif method == 'tr_interior_point':
--> 509 _, result = tr_interior_point(
510 objective.fun, objective.grad, lagrangian_hess,
511 n_vars, canonical.n_ineq, canonical.n_eq,
~\anaconda3\envs\cadet\lib\site-packages\scipy\optimize\_trustregion_constr\tr_interior_point.py in tr_interior_point(fun, grad, lagr_hess, n_vars, n_ineq, n_eq, constr, jac, x0, fun0, grad0, constr_ineq0, jac_ineq0, constr_eq0, jac_eq0, stop_criteria, enforce_feasibility, xtol, state, initial_barrier_parameter, initial_tolerance, initial_penalty, initial_trust_radius, factorization_method)
319 while True:
320 # Solve SQP subproblem
--> 321 z, state = equality_constrained_sqp(
322 subprob.function_and_constraints,
323 subprob.gradient_and_jacobian,
~\anaconda3\envs\cadet\lib\site-packages\scipy\optimize\_trustregion_constr\equality_constrained_sqp.py in equality_constrained_sqp(fun_and_constr, grad_and_jac, lagr_hess, x0, fun0, grad0, constr0, jac0, stop_criteria, state, initial_penalty, initial_trust_radius, factorization_method, trust_lb, trust_ub, scaling)
91
92 last_iteration_failed = False
---> 93 while not stop_criteria(state, x, last_iteration_failed,
94 optimality, constr_violation,
95 trust_radius, penalty, cg_info):
~\anaconda3\envs\cadet\lib\site-packages\scipy\optimize\_trustregion_constr\tr_interior_point.py in stop_criteria(self, state, z, last_iteration_failed, optimality, constr_violation, trust_radius, penalty, cg_info)
249 """
250 x = self.get_variables(z)
--> 251 if self.global_stop_criteria(state, x,
252 last_iteration_failed,
253 trust_radius, penalty,
~\anaconda3\envs\cadet\lib\site-packages\scipy\optimize\_trustregion_constr\minimize_trustregion_constr.py in stop_criteria(state, x, last_iteration_failed, tr_radius, constr_penalty, cg_info, barrier_parameter, barrier_tolerance)
467 state.status = None
468 state.niter = state.nit # Alias for callback (backward compatibility)
--> 469 if callback is not None and callback(np.copy(state.x), state):
470 state.status = 3
471 elif state.optimality < gtol and state.constr_violation < gtol:
~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\scipyAdapter.py in callback_function(x, state)
72 cv = optimization_problem.evaluate_nonlinear_constraints_violation(x)
73
---> 74 self.run_post_evaluation_processing(x, f, g, cv, self.n_evals)
75
76 return False
~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizer.py in run_post_evaluation_processing(self, x, f, g, cv, current_evaluation, x_opt)
380 self.results.update_pareto(pareto_front)
381
--> 382 self._run_post_processing(current_evaluation)
383
384 self.logger.info(
~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\optimizer.py in _run_post_processing(self, current_iteration)
308
309 if current_iteration % self.progress_frequency == 0:
--> 310 self.results.plot_figures(show=False)
311
312 for callback in self.optimization_problem.callbacks:
~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\results.py in plot_figures(self, show)
381 )
382 if self.optimization_problem.n_variables > 1:
--> 383 self.plot_corner(
384 show=show, plot_directory=self.plot_directory
385 )
~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\results.py in plot_corner(self, *args, **kwargs)
536 """
537 try:
--> 538 self.population_all.plot_corner(*args, **kwargs)
539 except AssertionError:
540 pass
~\anaconda3\envs\cadet\lib\site-packages\CADETProcess\optimization\population.py in plot_corner(self, untransformed, show, plot_directory)
573 labels = [label for label in labels if label not in singular_labels]
574
--> 575 fig = corner.corner(
576 x,
577 labels=labels,
~\anaconda3\envs\cadet\lib\site-packages\corner\corner.py in corner(data, bins, range, weights, color, hist_bin_factor, smooth, smooth1d, labels, label_kwargs, titles, show_titles, title_fmt, title_kwargs, truths, truth_color, scale_hist, quantiles, verbose, fig, max_n_ticks, top_ticks, use_math_text, reverse, labelpad, hist_kwargs, group, var_names, filter_vars, coords, divergences, divergences_kwargs, labeller, **hist2d_kwargs)
254 )
255
--> 256 return arviz_corner(
257 data,
258 bins=bins,
~\anaconda3\envs\cadet\lib\site-packages\corner\arviz_corner.py in arviz_corner(data, bins, range, weights, color, hist_bin_factor, smooth, smooth1d, labels, label_kwargs, titles, show_titles, title_fmt, title_kwargs, truths, truth_color, scale_hist, quantiles, verbose, fig, max_n_ticks, top_ticks, use_math_text, reverse, labelpad, hist_kwargs, group, var_names, filter_vars, coords, divergences, divergences_kwargs, labeller, **hist2d_kwargs)
133
134 # Coerce the samples into the expected format
--> 135 samples = np.stack([x[-1].flatten() for x in plotters], axis=-1)
136 fig = corner_impl(
137 samples,
~\anaconda3\envs\cadet\lib\site-packages\numpy\core\overrides.py in stack(*args, **kwargs)
~\anaconda3\envs\cadet\lib\site-packages\numpy\core\shape_base.py in stack(arrays, axis, out)
420 arrays = [asanyarray(arr) for arr in arrays]
421 if not arrays:
--> 422 raise ValueError('need at least one array to stack')
423
424 shapes = {arr.shape for arr in arrays}
ValueError: need at least one array to stack
How can I optimze the three variables in one optimization using the TrustConstr()
optimizer?
Your help is greatly appreciated!