From dfa48bedd4311fde128544a8fc6633483f0ee670 Mon Sep 17 00:00:00 2001 From: Ngo Nghi Truyen Huynh <129378719+nghi-truyen@users.noreply.github.com> Date: Mon, 29 Jul 2024 16:39:20 +0200 Subject: [PATCH] MAINT/ENH: move Fortran optimizers, `smash.multiple_optimize()` is deprecated (#250) * MAINT/ENH: move Fortran optimizers, multiple_optimizer is deprecated * minor fix optimize.py standardize run args * FIX PR: fix doc complilation and make check * FIX PR: doc compilation * FIX PR: doc compilation Samples object * FIX PR: restore _custom_directive and conf.py, fix _doc.py * Remove redundant in Python function sbs_optimize * Fix PR 1: bound check, raise message, check key rr_parameters * FIX PR 2: compute cost and jac at the same time for bfgs optimizer * FIX PR 3: set final control to update the optimized parameters --- .../principal_methods/simulation.rst | 7 - .../api_reference/returned_objects/index.rst | 1 - smash/__init__.py | 4 - smash/core/model/model.py | 3 +- smash/core/simulation/_doc.py | 143 +--- .../core/simulation/estimate/_standardize.py | 11 +- smash/core/simulation/estimate/_tools.py | 48 +- smash/core/simulation/estimate/estimate.py | 33 +- .../core/simulation/optimize/_standardize.py | 58 -- smash/core/simulation/optimize/optimize.py | 656 +++++++++++------- smash/core/simulation/run/_standardize.py | 73 +- smash/core/simulation/run/run.py | 24 +- .../{optimize => cost}/md_regularization.f90 | 0 smash/fcore/{optimize => cost}/mwd_cost.f90 | 0 smash/fcore/derived_type/mwd_returns.f90 | 43 +- smash/fcore/forward/forward_db.f90 | 32 - smash/fcore/forward/forward_openmp_db.f90 | 32 - smash/fcore/forward/mw_forward.f90 | 22 +- smash/fcore/meson.build | 6 +- smash/fcore/optimize/mw_optimize.f90 | 515 -------------- smash/io/model_ddt.py | 10 +- smash/tests/baseline.hdf5 | Bin 2414152 -> 2416382 bytes smash/tests/core/simulation/test_estimate.py | 61 +- smash/tests/core/simulation/test_optimize.py | 39 -- smash/tests/diff_baseline.csv | 243 +++---- 25 files changed, 700 insertions(+), 1364 deletions(-) rename smash/fcore/{optimize => cost}/md_regularization.f90 (100%) rename smash/fcore/{optimize => cost}/mwd_cost.f90 (100%) delete mode 100644 smash/fcore/optimize/mw_optimize.f90 diff --git a/doc/source/api_reference/principal_methods/simulation.rst b/doc/source/api_reference/principal_methods/simulation.rst index ff1fce6c..b95edf84 100644 --- a/doc/source/api_reference/principal_methods/simulation.rst +++ b/doc/source/api_reference/principal_methods/simulation.rst @@ -28,13 +28,6 @@ Numerical Optimization optimize bayesian_optimize -Multiple Numerical Optimization -******************************* -.. autosummary:: - :toctree: smash/ - - multiple_optimize - Multiple Sets Estimation ************************ .. autosummary:: diff --git a/doc/source/api_reference/returned_objects/index.rst b/doc/source/api_reference/returned_objects/index.rst index 7b9c53dd..78f3574f 100644 --- a/doc/source/api_reference/returned_objects/index.rst +++ b/doc/source/api_reference/returned_objects/index.rst @@ -13,7 +13,6 @@ Simulation Samples MultipleForwardRun - MultipleOptimize ForwardRun Optimize MultisetEstimate diff --git a/smash/__init__.py b/smash/__init__.py index c1c44128..e76c7f5e 100644 --- a/smash/__init__.py +++ b/smash/__init__.py @@ -12,10 +12,8 @@ from smash.core.simulation.estimate.estimate import MultisetEstimate, multiset_estimate from smash.core.simulation.optimize.optimize import ( BayesianOptimize, - MultipleOptimize, Optimize, bayesian_optimize, - multiple_optimize, optimize, ) from smash.core.simulation.options import ( @@ -39,7 +37,6 @@ def __getattr__(name): "forward_run", "multiple_forward_run", "optimize", - "multiple_optimize", "bayesian_optimize", "default_optimize_options", "default_bayesian_optimize_options", @@ -51,7 +48,6 @@ def __getattr__(name): "ForwardRun", "MultipleForwardRun", "Optimize", - "MultipleOptimize", "BayesianOptimize", "MultisetEstimate", "Signatures", diff --git a/smash/core/model/model.py b/smash/core/model/model.py index 118ed63d..1cc4af4c 100644 --- a/smash/core/model/model.py +++ b/smash/core/model/model.py @@ -78,7 +78,6 @@ from smash.core.simulation.estimate.estimate import MultisetEstimate from smash.core.simulation.optimize.optimize import ( BayesianOptimize, - MultipleOptimize, Optimize, ) from smash.core.simulation.run.run import ForwardRun, MultipleForwardRun @@ -2351,7 +2350,7 @@ def optimize( @_multiset_estimate_doc_appender def multiset_estimate( self, - multiset: MultipleForwardRun | MultipleOptimize, + multiset: MultipleForwardRun, alpha: Numeric | ListLike | None = None, common_options: dict[str, Any] | None = None, return_options: dict[str, Any] | None = None, diff --git a/smash/core/simulation/_doc.py b/smash/core/simulation/_doc.py index 0de334ff..5f9b5ea5 100644 --- a/smash/core/simulation/_doc.py +++ b/smash/core/simulation/_doc.py @@ -862,8 +862,8 @@ def _gen_docstring_from_base_doc( ---------- %(model_parameter)s -multiset : `MultipleForwardRun` or `MultipleOptimize` - The returned object created by `multiple_forward_run` or `multiple_optimize` method containing +multiset : `MultipleForwardRun ` + The returned object created by `multiple_forward_run` method containing information about multiple sets of rainfall-runoff parameters or initial states. alpha : `float`, `list[float, ...]`, or None, default None @@ -906,7 +906,6 @@ def _gen_docstring_from_base_doc( -------- MultisetEstimate : Represents multiset estimate optional results. MultipleForwardRun : Represents multiple forward run computation result. -MultipleOptimize : Represents multiple optimize computation result. Examples -------- @@ -1082,8 +1081,10 @@ def _gen_docstring_from_base_doc( model : `Model` Primary data structure of the hydrological model `smash`. -samples : `Samples` - Represents the generated samples result. +samples : `Samples` or `dict[str, Any]` + Represents the rainfall-runoff parameters and/or initial states sample. + This can be either a `Samples` object or a dictionary, where the keys are parameter/state names + and the corresponding value is a sequence of specified values, representing multiple samples. cost_options : `dict[str, Any]` or None, default None Dictionary containing computation cost options for simulated and observed responses. The elements are: @@ -1143,128 +1144,6 @@ def _gen_docstring_from_base_doc( """ ) -_multiple_optimize_doc = ( - # % TODO FC: Add advanced user guide - """ -Run multiple optimization processes with multiple sets of parameters (i.e. starting points), yielding multiple -solutions. - -Parameters ----------- -model : `Model` - Primary data structure of the hydrological model `smash`. - -samples : `Samples` - Represents the generated samples result. - -mapping : `str`, default 'uniform' - Type of mapping. Should be one of - - - ``'uniform'`` - - ``'distributed'`` - - ``'multi-linear'`` - - ``'multi-polynomial'`` - - .. hint:: - See the :ref:`math_num_documentation.mapping` section - -optimizer : `str` or None, default None - Name of optimizer. Should be one of - - - ``'sbs'`` (``'uniform'`` **mapping** only) - - ``'lbfgsb'`` (``'uniform'``, ``'distributed'``, ``'multi-linear'`` or ``'multi-polynomial'`` - **mapping** only) - - .. note:: - If not given, a default optimizer will be set depending on the optimization mapping: - - - **mapping** = ``'uniform'``; **optimizer** = ``'sbs'`` - - **mapping** = ``'distributed'``, ``'multi-linear'``, or ``'multi-polynomial'``; **optimizer** = - ``'lbfgsb'`` - - .. hint:: - See the :ref:`math_num_documentation.optimization_algorithm` section - -optimize_options : `dict[str, Any]` or None, default None - Dictionary containing optimization options for fine-tuning the optimization process. - See `%(default_optimize_options_func)s` to retrieve the default optimize options based on the **mapping** - and **optimizer**. - -""" - + _gen_docstring_from_base_doc( - OPTIMIZE_OPTIONS_BASE_DOC, - [ - "parameters", - "bounds", - "control_tfm", - "descriptor", - "termination_crit", - ], - nindent=1, - ) - + """ -cost_options : `dict[str, Any]` or None, default None - Dictionary containing computation cost options for simulated and observed responses. The elements are: - -""" - + _gen_docstring_from_base_doc( - COST_OPTIONS_BASE_DOC, - DEFAULT_SIMULATION_COST_OPTIONS["optimize"].keys(), - nindent=1, - ) - + """ -common_options : `dict[str, Any]` or None, default None - Dictionary containing common options with two elements: - -""" - + _gen_docstring_from_base_doc( - COMMON_OPTIONS_BASE_DOC, DEFAULT_SIMULATION_COMMON_OPTIONS.keys(), nindent=1 - ) - + """ - -Returns -------- -multiple_optimize : `MultipleOptimize` - It returns an object containing the results of the multiple optimize. - -See Also --------- -Samples : Represents the generated samples result. -MultipleOptimize : Represents the multiple optimize result. - -Examples --------- ->>> from smash.factory import load_dataset ->>> from smash.factory import generate_samples ->>> setup, mesh = load_dataset("cance") ->>> model = smash.Model(setup, mesh) - -Define sampling problem and generate samples - ->>> problem = { -... 'num_vars': 4, -... 'names': ['cp', 'ct', 'kexc', 'llr'], -... 'bounds': [[1, 2000], [1, 1000], [-20, 5], [1, 1000]] -... } ->>> sr = generate_samples(problem, n=3, random_state=11) - -Run multiple optimization processes - ->>> mopt = smash.multiple_optimize( -... model, -... samples=sr, -... optimize_options={"termination_crit": {"maxiter": 2}} -... ) - Multiple Optimize - Optimize 3/3 (100%(percent)s) - -Get the cost values through multiple runs of optimization - ->>> mopt.cost -array([0.51374453, 0.0528878 , 0.15056956], dtype=float32) -""" -) - _optimize_control_info_doc = ( """ Information on the optimization control vector of Model. @@ -1741,16 +1620,6 @@ def _gen_docstring_from_base_doc( _multiple_forward_run_doc_appender = DocAppender(_multiple_forward_run_doc, indents=0) -_multiple_optimize_doc_appender = DocAppender(_multiple_optimize_doc, indents=0) -_smash_multiple_optimize_doc_substitution = DocSubstitution( - default_optimize_options_func="default_optimize_options", - parameters_serr_mu_parameters="", - parameters_serr_sigma_parameters="", - parameters_note_serr_parameters="", - bounds_get_serr_parameters_bounds="", - percent="%", -) - _optimize_control_info_doc_appender = DocAppender(_optimize_control_info_doc, indents=0) _smash_optimize_control_info_doc_substitution = DocSubstitution( default_optimize_options_func="default_optimize_options", diff --git a/smash/core/simulation/estimate/_standardize.py b/smash/core/simulation/estimate/_standardize.py index 6ba1bf79..eacc1c79 100644 --- a/smash/core/simulation/estimate/_standardize.py +++ b/smash/core/simulation/estimate/_standardize.py @@ -7,7 +7,6 @@ _standardize_simulation_return_options, _standardize_simulation_return_options_finalize, ) -from smash.core.simulation.optimize.optimize import MultipleOptimize from smash.core.simulation.run.run import MultipleForwardRun if TYPE_CHECKING: @@ -19,7 +18,7 @@ def _standardize_multiset_estimate_args( model: Model, - multiset: MultipleForwardRun | MultipleOptimize, + multiset: MultipleForwardRun, alpha: Numeric | ListLike, common_options: dict | None, return_options: dict | None, @@ -39,10 +38,10 @@ def _standardize_multiset_estimate_args( def _standardize_multiset_estimate_multiset( - multiset: MultipleForwardRun | MultipleOptimize, -) -> MultipleForwardRun | MultipleOptimize: - if not isinstance(multiset, (MultipleForwardRun, MultipleOptimize)): - raise TypeError("multiset must be a MultipleForwardRun or MultipleOptimize object") + multiset: MultipleForwardRun, +) -> MultipleForwardRun: + if not isinstance(multiset, MultipleForwardRun): + raise TypeError("multiset must be a MultipleForwardRun object") return multiset diff --git a/smash/core/simulation/estimate/_tools.py b/smash/core/simulation/estimate/_tools.py index 77e7f379..c922e176 100644 --- a/smash/core/simulation/estimate/_tools.py +++ b/smash/core/simulation/estimate/_tools.py @@ -3,7 +3,7 @@ from typing import TYPE_CHECKING import numpy as np -from scipy.stats import gaussian_kde +from scipy.stats import gaussian_kde as scipy_gaussian_kde from tqdm import tqdm from smash.core.simulation.run.run import _forward_run @@ -16,19 +16,21 @@ def _compute_density( - samples: Samples, - optimized_parameters: dict, + samples: Samples | None, + spatialized_samples: dict[np.ndarray], active_cell: np.ndarray, ) -> dict: density = {} - for p, optim_param in optimized_parameters.items(): - dst = getattr(samples, "_dst_" + p) - density[p] = np.tile( - dst, (*active_cell.shape, 1) - ) # spatialized density (*active_cell.shape, n_sample) + for p, spl_sample in spatialized_samples.items(): + if samples is not None: + dst = getattr(samples, "_dst_" + p) + density[p] = np.tile( + dst, (*active_cell.shape, 1) + ) # convert to spatialized density (*active_cell.shape, n_sample) - if isinstance(optim_param, np.ndarray): + else: + density[p] = np.zeros((*active_cell.shape, spl_sample.shape[-1])) estimated_cell = np.zeros(active_cell.shape) for ac in [0, 1]: # Iterate on two blocs active/inactive cell @@ -37,33 +39,29 @@ def _compute_density( if np.all( [ np.allclose( - optim_param[..., i][mask], - optim_param[..., i][mask][0], + spl_sample[..., i][mask], + spl_sample[..., i][mask][0], ) - for i in range(optim_param.shape[-1]) + for i in range(spl_sample.shape[-1]) ] - ): # if optim_param[mask] contain only uniform values - unf_optim_param = optim_param[mask][0, :] + ): # if spl_sample[mask] contain only uniform values + unif_sample = spl_sample[mask][0, :] - if np.allclose(unf_optim_param, unf_optim_param[0]): - estimted_density = np.ones(unf_optim_param.shape) + if np.allclose(unif_sample, unif_sample[0]): + density[p][mask] = np.ones(unif_sample.shape) else: - estimted_density = gaussian_kde(unf_optim_param)(unf_optim_param) - - density[p][mask] *= estimted_density # compute joint-probability + density[p][mask] = scipy_gaussian_kde(unif_sample)(unif_sample) estimated_cell[mask] = True for i, j in np.ndindex(active_cell.shape): # Iterate on all grid cells if not estimated_cell[i, j]: - unf_optim_param_ij = optim_param[i, j, :] + unif_sample_ij = spl_sample[i, j, :] - if np.allclose(unf_optim_param_ij, unf_optim_param_ij[0]): - estimted_density = np.ones(unf_optim_param_ij.shape) + if np.allclose(unif_sample_ij, unif_sample_ij[0]): + density[p][i, j] = np.ones(unif_sample_ij.shape) else: - estimted_density = gaussian_kde(unf_optim_param_ij)(unf_optim_param_ij) - - density[p][i, j] *= estimted_density # compute joint-probability + density[p][i, j] = scipy_gaussian_kde(unif_sample_ij)(unif_sample_ij) return density diff --git a/smash/core/simulation/estimate/estimate.py b/smash/core/simulation/estimate/estimate.py index 670105e0..b7d5cdb4 100644 --- a/smash/core/simulation/estimate/estimate.py +++ b/smash/core/simulation/estimate/estimate.py @@ -14,13 +14,12 @@ _forward_run_with_estimated_parameters, _lcurve_forward_run_with_estimated_parameters, ) -from smash.core.simulation.optimize.optimize import MultipleOptimize -from smash.core.simulation.run.run import MultipleForwardRun if TYPE_CHECKING: from typing import Any from smash.core.model.model import Model + from smash.core.simulation.run.run import MultipleForwardRun from smash.util._typing import ListLike, Numeric __all__ = ["MultisetEstimate", "multiset_estimate"] @@ -99,7 +98,7 @@ def __repr__(self): @_multiset_estimate_doc_appender def multiset_estimate( model: Model, - multiset: MultipleForwardRun | MultipleOptimize, + multiset: MultipleForwardRun, alpha: Numeric | ListLike | None = None, common_options: dict[str, Any] | None = None, return_options: dict[str, Any] | None = None, @@ -116,7 +115,7 @@ def multiset_estimate( def _multiset_estimate( model: Model, - multiset: MultipleForwardRun | MultipleOptimize, + multiset: MultipleForwardRun, alpha: float | np.ndarray, common_options: dict, return_options: dict, @@ -125,30 +124,8 @@ def _multiset_estimate( if common_options["verbose"]: print(" Multiple Set Estimate") - # % Prepare data - if isinstance(multiset, MultipleForwardRun): - optimized_parameters = {p: None for p in multiset._samples._problem["names"]} - - prior_data = dict( - zip( - optimized_parameters.keys(), - [ - np.tile(getattr(multiset._samples, p), (*model.mesh.flwdir.shape, 1)) - for p in optimized_parameters.keys() - ], - ) - ) - - elif isinstance(multiset, MultipleOptimize): - optimized_parameters = multiset.parameters - - prior_data = multiset.parameters - - else: # In case we have other kind of multiset. Should be unreachable - pass - # % Compute density - density = _compute_density(multiset._samples, optimized_parameters, model.mesh.active_cell) + density = _compute_density(multiset._samples, multiset._spatialized_samples, model.mesh.active_cell) # % Multiple set estimate if isinstance(alpha, float): @@ -163,7 +140,7 @@ def _multiset_estimate( ret_forward_run, lcurve_multiset = estimator( alpha, model, - prior_data, + multiset._spatialized_samples, density, multiset.cost, multiset._cost_options, diff --git a/smash/core/simulation/optimize/_standardize.py b/smash/core/simulation/optimize/_standardize.py index b029606c..7d39dd69 100644 --- a/smash/core/simulation/optimize/_standardize.py +++ b/smash/core/simulation/optimize/_standardize.py @@ -14,28 +14,13 @@ _standardize_simulation_parameters_feasibility, _standardize_simulation_return_options, _standardize_simulation_return_options_finalize, - _standardize_simulation_samples, ) if TYPE_CHECKING: from smash.core.model.model import Model - from smash.factory.samples.samples import Samples from smash.util._typing import AnyTuple -def _standardize_multiple_optimize_mapping(mapping: str) -> str: - avail_mapping = MAPPING.copy() - avail_mapping.remove("ann") # cannot perform multiple optimize with ANN mapping - - if isinstance(mapping, str): - if mapping.lower() not in avail_mapping: - raise ValueError(f"Invalid mapping '{mapping}' for multiple optimize. Choices: {avail_mapping}") - else: - raise TypeError("mapping argument must be a str") - - return mapping.lower() - - def _standardize_bayesian_optimize_mapping(mapping: str) -> str: avail_mapping = MAPPING.copy() avail_mapping.remove("ann") # cannot perform bayesian optimize with ANN mapping @@ -95,49 +80,6 @@ def _standardize_optimize_args( ) -def _standardize_multiple_optimize_args( - model: Model, - samples: Samples, - mapping: str, - optimizer: str | None, - optimize_options: dict | None, - cost_options: dict | None, - common_options: dict | None, -) -> AnyTuple: - func_name = "optimize" - samples = _standardize_simulation_samples(model, samples) - - # % In case model.set_rr_parameters or model.set_rr_initial_states were not used - _standardize_simulation_parameters_feasibility(model) - - mapping = _standardize_multiple_optimize_mapping(mapping) - - optimizer = _standardize_simulation_optimizer(mapping, optimizer) - - optimize_options = _standardize_simulation_optimize_options( - model, func_name, mapping, optimizer, optimize_options - ) - - # % Finalize optimize options - _standardize_simulation_optimize_options_finalize(model, mapping, optimizer, optimize_options) - - cost_options = _standardize_simulation_cost_options(model, func_name, cost_options) - - # % Finalize cost_options - _standardize_simulation_cost_options_finalize(model, func_name, cost_options) - - common_options = _standardize_simulation_common_options(common_options) - - return ( - samples, - mapping, - optimizer, - optimize_options, - cost_options, - common_options, - ) - - def _standardize_bayesian_optimize_args( model: Model, mapping: str, diff --git a/smash/core/simulation/optimize/optimize.py b/smash/core/simulation/optimize/optimize.py index 4b328270..26c946fc 100644 --- a/smash/core/simulation/optimize/optimize.py +++ b/smash/core/simulation/optimize/optimize.py @@ -1,9 +1,9 @@ from __future__ import annotations -from copy import deepcopy from typing import TYPE_CHECKING import numpy as np +from scipy.optimize import minimize as scipy_minimize from smash._constant import ( CONTROL_PRIOR_DISTRIBUTION, @@ -14,22 +14,13 @@ from smash.core.model._build_model import _map_dict_to_fortran_derived_type from smash.core.simulation._doc import ( _bayesian_optimize_doc_appender, - _multiple_optimize_doc_appender, _optimize_doc_appender, _smash_bayesian_optimize_doc_substitution, - _smash_multiple_optimize_doc_substitution, _smash_optimize_doc_substitution, ) -from smash.core.simulation.optimize._standardize import ( - _standardize_multiple_optimize_args, -) +from smash.factory.net._loss import _inf_norm # this import will be removed when all optimizers are combined from smash.fcore._mw_forward import forward_run as wrap_forward_run -from smash.fcore._mw_optimize import ( - multiple_optimize as wrap_multiple_optimize, -) -from smash.fcore._mw_optimize import ( - optimize as wrap_optimize, -) +from smash.fcore._mw_forward import forward_run_b as wrap_forward_run_b from smash.fcore._mwd_options import OptionsDT from smash.fcore._mwd_parameters_manipulation import ( parameters_to_control as wrap_parameters_to_control, @@ -39,64 +30,21 @@ if TYPE_CHECKING: from typing import Any - from numpy.typing import NDArray + from scipy.optimize import OptimizeResult as scipy_OptimizeResult from smash.core.model.model import Model from smash.factory.net.net import Net - from smash.factory.samples.samples import Samples + from smash.fcore._mwd_parameters import ParametersDT __all__ = [ - "MultipleOptimize", "Optimize", "BayesianOptimize", - "multiple_optimize", "optimize", "bayesian_optimize", ] -class MultipleOptimize: - """ - Represents multiple optimize result. - - Attributes - ---------- - cost : `numpy.ndarray` - An array of shape *(n,)* representing cost values from *n* simulations. - - q : `numpy.ndarray` - An array of shape *(ng, ntime_step, n)* representing simulated discharges from *n* simulations. - - parameters : `dict[str, np.ndarray]` - A dictionary containing optimized rainfall-runoff parameters and/or initial states. - Each key represents an array of shape *(nrow, ncol, n)* corresponding to a specific rainfall-runoff - parameter or initial state. - - See Also - -------- - multiple_optimize : Run multiple optimization processes with multiple sets of parameters (i.e. starting - points), yielding multiple solutions. - """ - - def __init__(self, data: dict[str, NDArray[np.float32]] | None = None): - if data is None: - data = {} - - self.__dict__.update(data) - - def __repr__(self): - dct = self.__dict__ - - if dct.keys(): - m = max(map(len, list(dct.keys()))) + 1 - return "\n".join( - [k.rjust(m) + ": " + repr(type(v)) for k, v in sorted(dct.items()) if not k.startswith("_")] - ) - else: - return self.__class__.__name__ + "()" - - class Optimize: """ Represents optimize optional results. @@ -267,6 +215,49 @@ def __repr__(self): return self.__class__.__name__ + "()" +class _OptimizeCallback: + # % Private callback class for external optimizer i.e. L-BFGS-B from scipy + def __init__(self, verbose: bool): + self.verbose = verbose + + self.iterations = 0 + + self.nfg = 1 + self.count_nfg = 0 + + self.iter_cost = np.array([]) + + self.iter_projg = np.array([]) + self.projg = None + + def callback(self, intermediate_result: scipy_OptimizeResult): + # % intermediate_result is required by callback function in scipy + if self.verbose: + print( + f" At iterate{str(self.iterations).rjust(7)} nfg = {str(self.nfg).rjust(4)}" + f" J = {self.iter_cost[-1]:14.6f} |proj g| = {self.projg:14.6f}" + ) + + self.iterations += 1 + + self.nfg = self.count_nfg + + self.iter_cost = np.append(self.iter_cost, intermediate_result.fun) + + self.iter_projg = np.append(self.iter_projg, self.projg) + self.projg = self.tmp_projg + + def termination(self, final_result: scipy_OptimizeResult): + if self.verbose: + print( + f" At iterate{str(self.iterations).rjust(7)} nfg = {str(self.nfg).rjust(4)}" + f" J = {final_result.fun:14.6f} |proj g| = {self.projg:14.6f}" + ) + print(f" {final_result.message}") + + self.iter_projg = np.append(self.iter_projg, self.projg) + + def _get_control_info( model: Model, mapping: str, @@ -306,7 +297,7 @@ def _get_control_info( return ret -def _get_fast_wjreg(model: Model, options: OptionsDT, returns: ReturnsDT) -> float: +def _get_fast_wjreg(model: Model, options: OptionsDT, returns: ReturnsDT, return_options: dict) -> float: if options.comm.verbose: print(f"{' '*4}FAST WJREG CYCLE 1") @@ -327,15 +318,8 @@ def _get_fast_wjreg(model: Model, options: OptionsDT, returns: ReturnsDT) -> flo # Avoid to make a complete copy of model wparameters = model._parameters.copy() - wrap_optimize( - model.setup, - model.mesh, - model._input_data, - wparameters, - model._output, - options, - returns, - ) + _apply_optimizer(model, wparameters, options, returns, return_options) + jobs = returns.jobs jreg = returns.jreg @@ -381,7 +365,9 @@ def _get_lcurve_wjreg_best( return distance, wjreg -def _get_lcurve_wjreg(model: Model, options: OptionsDT, returns: ReturnsDT) -> (float, dict): +def _get_lcurve_wjreg( + model: Model, options: OptionsDT, returns: ReturnsDT, return_options: dict +) -> (float, dict): if options.comm.verbose: print(f"{' '*4}LCURVE WJREG CYCLE 1") @@ -402,15 +388,8 @@ def _get_lcurve_wjreg(model: Model, options: OptionsDT, returns: ReturnsDT) -> ( # % Avoid to make a complete copy of model wparameters = model._parameters.copy() - wrap_optimize( - model.setup, - model.mesh, - model._input_data, - wparameters, - model._output, - options, - returns, - ) + _apply_optimizer(model, wparameters, options, returns, return_options) + cost = returns.cost jobs_min = returns.jobs jreg_min = 0.0 @@ -439,15 +418,7 @@ def _get_lcurve_wjreg(model: Model, options: OptionsDT, returns: ReturnsDT) -> ( print(f"{' '*4}LCURVE WJREG CYCLE {i + 2}") wparameters = model._parameters.copy() - wrap_optimize( - model.setup, - model.mesh, - model._input_data, - wparameters, - model._output, - options, - returns, - ) + _apply_optimizer(model, wparameters, options, returns, return_options) cost_arr[i + 1] = returns.cost jobs_arr[i + 1] = returns.jobs @@ -543,32 +514,27 @@ def _optimize( common_options, wrap_options, wrap_returns, - ) + ) # % TODO TH: this function will be merged into _apply_optimizer + + pyret = {} else: if auto_wjreg == "fast": - wrap_options.cost.wjreg = _get_fast_wjreg(model, wrap_options, wrap_returns) + wrap_options.cost.wjreg = _get_fast_wjreg(model, wrap_options, wrap_returns, return_options) if wrap_options.comm.verbose: print(f"{' '*4}FAST WJREG LAST CYCLE. wjreg: {'{:.6f}'.format(wrap_options.cost.wjreg)}") elif auto_wjreg == "lcurve": - wrap_options.cost.wjreg, lcurve_wjreg = _get_lcurve_wjreg(model, wrap_options, wrap_returns) + wrap_options.cost.wjreg, lcurve_wjreg = _get_lcurve_wjreg( + model, wrap_options, wrap_returns, return_options + ) if wrap_options.comm.verbose: print(f"{' '*4}LCURVE WJREG LAST CYCLE. wjreg: {'{:.6f}'.format(wrap_options.cost.wjreg)}") else: pass - wrap_optimize( - model.setup, - model.mesh, - model._input_data, - model._parameters, - model._output, - wrap_options, - wrap_returns, - ) + pyret = _apply_optimizer(model, model._parameters, wrap_options, wrap_returns, return_options) fret = {} - pyret = {} # % Fortran returns for key in return_options["keys"]: @@ -685,152 +651,6 @@ def _ann_optimize( return net -@_smash_multiple_optimize_doc_substitution -@_multiple_optimize_doc_appender -def multiple_optimize( - model: Model, - samples: Samples, - mapping: str = "uniform", - optimizer: str | None = None, - optimize_options: dict[str, Any] | None = None, - cost_options: dict[str, Any] | None = None, - common_options: dict[str, Any] | None = None, -) -> MultipleOptimize: - args_options = [deepcopy(arg) for arg in [optimize_options, cost_options, common_options]] - - args = _standardize_multiple_optimize_args( - model, - samples, - mapping, - optimizer, - *args_options, - ) - - res = _multiple_optimize(model, *args) - - return MultipleOptimize(res) - - -def _multiple_optimize( - model: Model, - samples: Samples, - mapping: str, - optimizer: str, - optimize_options: dict, - cost_options: dict, - common_options: dict, -) -> dict: - if common_options["verbose"]: - print(" Multiple Optimize") - - wrap_options = OptionsDT( - model.setup, - model.mesh, - cost_options["njoc"], - cost_options["njrc"], - ) - - # % Map optimize_options dict to derived type - _map_dict_to_fortran_derived_type(optimize_options, wrap_options.optimize) - - # % Map cost_options dict to derived type - _map_dict_to_fortran_derived_type(cost_options, wrap_options.cost) - - # % Map common_options dict to derived type - _map_dict_to_fortran_derived_type(common_options, wrap_options.comm) - - # % Generate samples info - nv = samples._problem["num_vars"] - samples_kind = np.zeros(shape=nv, dtype=np.int32, order="F") - samples_ind = np.zeros(shape=nv, dtype=np.int32, order="F") - - for i, name in enumerate(samples._problem["names"]): - if name in model._parameters.rr_parameters.keys: - samples_kind[i] = 0 - # % Adding 1 because Fortran uses one based indexing - samples_ind[i] = np.argwhere(model._parameters.rr_parameters.keys == name).item() + 1 - elif name in model._parameters.rr_initial_states.keys: - samples_kind[i] = 1 - # % Adding 1 because Fortran uses one based indexing - samples_ind[i] = np.argwhere(model._parameters.rr_initial_states.keys == name).item() + 1 - # % Should be unreachable - else: - pass - - # % Initialise results - cost = np.zeros(shape=samples.n_sample, dtype=np.float32, order="F") - q = np.zeros( - shape=(*model.response_data.q.shape, samples.n_sample), - dtype=np.float32, - order="F", - ) - # % Only work with grids (might be changed) - parameters = np.zeros( - shape=( - *model.mesh.flwdir.shape, - len(optimize_options["parameters"]), - samples.n_sample, - ), - dtype=np.float32, - order="F", - ) - - wrap_multiple_optimize( - model.setup, - model.mesh, - model._input_data, - model._parameters, - model._output, - wrap_options, - samples.to_numpy(), - samples_kind, - samples_ind, - cost, - q, - parameters, - ) - - # % Finalize parameters and samples for returns - parameters = dict( - zip( - optimize_options["parameters"], - np.transpose(parameters, (2, 0, 1, 3)), - ) - ) - - for sp in samples._problem["names"]: # add uncalibrated parameters from samples to parameters - if sp not in optimize_options["parameters"]: - value = getattr(samples, sp) - value = np.tile(value, (*model.mesh.flwdir.shape, 1)) - - parameters.update({sp: value}) - - samples_fnl = deepcopy(samples) # make a deepcopy of samples (will be modified by setattr) - - for op in optimize_options["parameters"]: # add calibrated paramters from parameters to samples - if op not in samples._problem["names"]: - if op in model.rr_parameters.keys: - value = model.get_rr_parameters(op)[0, 0] - - elif op in model.rr_initial_states.keys: - value = model.get_rr_initial_states(op)[0, 0] - - # % In case we have other kind of parameters. Should be unreachable. - else: - pass - - setattr(samples_fnl, op, value * np.ones(samples.n_sample)) - setattr(samples_fnl, "_dst_" + op, np.ones(samples.n_sample)) - - return { - "cost": cost, - "q": q, - "parameters": parameters, - "_samples": samples_fnl, - "_cost_options": cost_options, - } - - def _handle_bayesian_optimize_control_prior(model: Model, control_prior: dict, options: OptionsDT): wrap_parameters_to_control(model.setup, model.mesh, model._input_data, model._parameters, options) @@ -949,20 +769,10 @@ def _bayesian_optimize( # % Control prior check _handle_bayesian_optimize_control_prior(model, cost_options["control_prior"], wrap_options) - wrap_optimize( - model.setup, - model.mesh, - model._input_data, - model._parameters, - model._output, - wrap_options, - wrap_returns, - ) - - fret = {} - pyret = {} + pyret = _apply_optimizer(model, model._parameters, wrap_options, wrap_returns, return_options) # % Fortran returns + fret = {} for key in return_options["keys"]: try: value = getattr(wrap_returns, key) @@ -984,3 +794,335 @@ def _bayesian_optimize( if any(k in SIMULATION_RETURN_OPTIONS_TIME_STEP_KEYS for k in ret.keys()): ret["time_step"] = return_options["time_step"].copy() return BayesianOptimize(ret) + + +def _apply_optimizer( + model: Model, + parameters: ParametersDT, + wrap_options: OptionsDT, + wrap_returns: ReturnsDT, + return_options: dict, +) -> dict: + if wrap_options.optimize.optimizer == "sbs": + ret = _sbs_optimize(model, parameters, wrap_options, wrap_returns, return_options) + + elif wrap_options.optimize.optimizer == "lbfgsb": + ret = _lbfgsb_optimize(model, parameters, wrap_options, wrap_returns, return_options) + + else: # % Machine learning optimizer (adam, adagrad, etc.) + pass # TODO TH: add ML opt + + # % Manually deallocate control + parameters.control.dealloc() + + return ret + + +def _lbfgsb_optimize( + model: Model, + parameters: ParametersDT, + wrap_options: OptionsDT, + wrap_returns: ReturnsDT, + return_options: dict, +) -> dict: + wrap_parameters_to_control( + model.setup, + model.mesh, + model._input_data, + parameters, + wrap_options, + ) + + x0 = parameters.control.x.copy() + + # % Set None values for unbounded/semi-unbounded controls to pass to scipy l-bfgs-b + l_control = np.where(np.isin(parameters.control.nbd, [0, 3]), None, parameters.control.l) + u_control = np.where(np.isin(parameters.control.nbd, [0, 1]), None, parameters.control.u) + + cb = _OptimizeCallback(wrap_options.comm.verbose) + + res_optimize = scipy_minimize( + _gradient_based_optimize_problem, + x0, + args=(model, parameters, wrap_options, wrap_returns, cb), + method="l-bfgs-b", + jac=True, + bounds=tuple(zip(l_control, u_control)), + callback=cb.callback, + options={ + "maxiter": wrap_options.optimize.maxiter, + "ftol": 2.22e-16 * wrap_options.optimize.factr, + "gtol": wrap_options.optimize.pgtol, + "disp": False, # TODO: change this with logger for multiple display levels + }, + ) + + cb.termination(res_optimize) + + # % Apply final control and forward run for updating final states + setattr(parameters.control, "x", res_optimize["x"]) + + wrap_forward_run( + model.setup, + model.mesh, + model._input_data, + parameters, + model._output, + wrap_options, + wrap_returns, + ) + + ret = {} + + if "control_vector" in return_options["keys"]: + ret["control_vector"] = parameters.control.x.copy() + + if "iter_cost" in return_options["keys"]: + ret["iter_cost"] = cb.iter_cost + + if "iter_projg" in return_options["keys"]: + ret["iter_projg"] = cb.iter_projg + + if "serr_mu" in return_options["keys"]: + ret["serr_mu"] = model.get_serr_mu().copy() + + if "serr_sigma" in return_options["keys"]: + ret["serr_sigma"] = model.get_serr_sigma().copy() + + return ret + + +def _sbs_optimize( + model: Model, + parameters: ParametersDT, + wrap_options: OptionsDT, + wrap_returns: ReturnsDT, + return_options: dict, +) -> dict: + wrap_parameters_to_control( + model.setup, + model.mesh, + model._input_data, + parameters, + wrap_options, + ) + + n = parameters.control.n + + sdx = np.zeros(n) + + y_wa = parameters.control.x.copy() + z_wa = np.copy(y_wa) + + l_wa = parameters.control.l.copy() + u_wa = parameters.control.u.copy() + + wrap_forward_run( + model.setup, + model.mesh, + model._input_data, + parameters, + model._output, + wrap_options, + wrap_returns, + ) + + gx = model._output.cost + ga = gx + clg = 0.7 ** (1 / n) + ddx = 0.64 + dxn = ddx + ia = iaa = iam = -1 + jfaa = 0 + nfg = 1 + + ret = {} + + message = "STOP: TOTAL NO. OF ITERATION EXCEEDS LIMIT" + + if wrap_options.comm.verbose: + print( + f" At iterate{str(0).rjust(7)} nfg = {str(nfg).rjust(4)}" + f" J = {gx:14.6f} ddx = {ddx:5.2f}" + ) + + if "iter_cost" in return_options["keys"]: + ret["iter_cost"] = np.array([gx]) + + for iter in range(1, wrap_options.optimize.maxiter * n + 1): + if dxn > ddx: + dxn = ddx + if ddx > 2: + ddx = dxn + + for i in range(n): + x_wa = np.copy(y_wa) + + for j in range(1, 3): + jf = 2 * j - 3 + if i == iaa and jf == -jfaa: + continue + if y_wa[i] <= l_wa[i] and jf < 0: + continue + if y_wa[i] >= u_wa[i] and jf > 0: + continue + + x_wa[i] = y_wa[i] + jf * ddx + x_wa[i] = max(min(x_wa[i], u_wa[i]), l_wa[i]) + + parameters.control.x = x_wa + parameters.control.l = l_wa + parameters.control.u = u_wa + + wrap_forward_run( + model.setup, + model.mesh, + model._input_data, + parameters, + model._output, + wrap_options, + wrap_returns, + ) + nfg += 1 + + if model._output.cost < gx: + z_wa = np.copy(x_wa) + gx = model._output.cost + ia = i + jfa = jf + + iaa = ia + jfaa = jfa + + if ia > -1: + y_wa = np.copy(z_wa) + + sdx *= clg + sdx[ia] = (1.0 - clg) * jfa * ddx + clg * sdx[ia] + + iam += 1 + + if iam + 1 > 2 * n: + ddx *= 2 + iam = 0 + + if gx < ga - 2: + ga = gx + else: + ddx /= 2 + iam = -1 + + if iter > 4 * n: + for i in range(n): + x_wa[i] = y_wa[i] + sdx[i] + x_wa[i] = max(min(x_wa[i], u_wa[i]), l_wa[i]) + + parameters.control.x = x_wa + parameters.control.l = l_wa + parameters.control.u = u_wa + + wrap_forward_run( + model.setup, + model.mesh, + model._input_data, + parameters, + model._output, + wrap_options, + wrap_returns, + ) + nfg += 1 + + if model._output.cost < gx: + gx = model._output.cost + jfaa = 0 + y_wa = np.copy(x_wa) + z_wa = np.copy(x_wa) + + if gx < ga - 2: + ga = gx + + ia = -1 + + if iter % n == 0: + if wrap_options.comm.verbose: + print( + f" At iterate{str(iter // n).rjust(7)} nfg = {str(nfg).rjust(4)}" + f" J = {gx:14.6f} ddx = {ddx:5.2f}" + ) + + if "iter_cost" in return_options["keys"]: + ret["iter_cost"] = np.append(ret["iter_cost"], gx) + + if ddx < 0.01: + message = "CONVERGENCE: DDX < 0.01" + break + + parameters.control.x = z_wa + parameters.control.l = l_wa + parameters.control.u = u_wa + + wrap_forward_run( + model.setup, + model.mesh, + model._input_data, + parameters, + model._output, + wrap_options, + wrap_returns, + ) + + if "control_vector" in return_options["keys"]: + ret["control_vector"] = parameters.control.x.copy() + + if "serr_mu" in return_options["keys"]: + ret["serr_mu"] = model.get_serr_mu().copy() + + if "serr_sigma" in return_options["keys"]: + ret["serr_sigma"] = model.get_serr_sigma().copy() + + if wrap_options.comm.verbose: + print(f" {message}") + + return ret + + +def _gradient_based_optimize_problem( + x: np.ndarray, + model: Model, + parameters: ParametersDT, + wrap_options: OptionsDT, + wrap_returns: ReturnsDT, + callback: _OptimizeCallback, +) -> tuple[float, np.ndarray]: + setattr(parameters.control, "x", x) + + parameters_b = parameters.copy() + output_b = model._output.copy() + output_b.cost = np.float32(1) + + wrap_forward_run_b( + model.setup, + model.mesh, + model._input_data, + parameters, + parameters_b, + model._output, + output_b, + wrap_options, + wrap_returns, + ) + + if callback.iter_cost.size == 0: + callback.iter_cost = np.append(callback.iter_cost, model._output.cost) + + callback.count_nfg += 1 + + grad = parameters_b.control.x.copy() + + if callback.projg is None: + callback.projg = _inf_norm(grad) + + else: + callback.tmp_projg = _inf_norm(grad) + + return (model._output.cost, grad) diff --git a/smash/core/simulation/run/_standardize.py b/smash/core/simulation/run/_standardize.py index d9015a27..bf03c565 100644 --- a/smash/core/simulation/run/_standardize.py +++ b/smash/core/simulation/run/_standardize.py @@ -2,6 +2,9 @@ from typing import TYPE_CHECKING +import numpy as np + +from smash.core.model._standardize import _standardize_rr_parameters_value, _standardize_rr_states_value from smash.core.simulation._standardize import ( _standardize_simulation_common_options, _standardize_simulation_cost_options, @@ -11,10 +14,12 @@ _standardize_simulation_return_options_finalize, _standardize_simulation_samples, ) +from smash.factory.samples.samples import Samples if TYPE_CHECKING: + from typing import Any + from smash.core.model.model import Model - from smash.factory.samples.samples import Samples from smash.util._typing import AnyTuple @@ -24,17 +29,18 @@ def _standardize_forward_run_args( common_options: dict | None, return_options: dict | None, ) -> AnyTuple: + func_name = "forward_run" # % In case model.set_rr_parameters or model.set_rr_initial_states were not used _standardize_simulation_parameters_feasibility(model) - cost_options = _standardize_simulation_cost_options(model, "forward_run", cost_options) + cost_options = _standardize_simulation_cost_options(model, func_name, cost_options) # % Finalize cost_options - _standardize_simulation_cost_options_finalize(model, "forward_run", cost_options) + _standardize_simulation_cost_options_finalize(model, func_name, cost_options) common_options = _standardize_simulation_common_options(common_options) - return_options = _standardize_simulation_return_options(model, "forward_run", return_options) + return_options = _standardize_simulation_return_options(model, func_name, return_options) # % Finalize return_options _standardize_simulation_return_options_finalize(model, return_options) @@ -44,11 +50,11 @@ def _standardize_forward_run_args( def _standardize_multiple_forward_run_args( model: Model, - samples: Samples, + samples: Samples | dict, cost_options: dict | None, common_options: dict | None, ) -> AnyTuple: - samples = _standardize_simulation_samples(model, samples) + samples, spatialized_samples = _standardize_multiple_forward_run_samples(model, samples) # % In case model.set_rr_parameters or model.set_rr_initial_states were not used _standardize_simulation_parameters_feasibility(model) @@ -60,4 +66,57 @@ def _standardize_multiple_forward_run_args( common_options = _standardize_simulation_common_options(common_options) - return (samples, cost_options, common_options) + return (samples, spatialized_samples, cost_options, common_options) + + +def _standardize_multiple_forward_run_samples( + model: Model, samples: Samples | dict[str, Any] +) -> tuple[Samples | None, dict[str, np.ndarray]]: + if isinstance(samples, Samples): + uniform_samples = _standardize_simulation_samples(model, samples) + spatialized_samples = { + k: np.stack( + [v * np.ones(model.mesh.flwdir.shape, dtype=np.float32) for v in getattr(samples, k)], axis=-1 + ) + for k in samples._problem["names"] + } + + elif isinstance(samples, dict): + uniform_samples = None + + try: + lengths = [len(v) for v in samples.values()] + if not lengths: + raise ValueError("samples argument cannot be empty") from None + + except Exception: + raise ValueError("samples argument cannot contain non-iterable elements") from None + + if not all(length == lengths[0] for length in lengths): + raise ValueError("All elements in the samples dictionary must have the same length") + + spatialized_samples = {} + + for key, value in samples.items(): + spatialized_samples[key] = np.ones((*model.mesh.flwdir.shape, len(value)), dtype=np.float32) + + if key in model.rr_parameters.keys: + for i, v in enumerate(value): + v = _standardize_rr_parameters_value(model, key, v) + spatialized_samples[key][..., i] = v + + elif key in model.rr_initial_states.keys: + for i, v in enumerate(value): + v = _standardize_rr_states_value(model, "rr_initial_state", key, v) + spatialized_samples[key][..., i] = v + + else: + raise ValueError( + f"Unknown model rr_parameter or rr_initial_states '{key}'. " + f"Choices: {list(model.rr_parameters.keys)+list(model.rr_initial_states.keys)}" + ) + + else: + raise TypeError("samples argument must a Samples object or dictionary") + + return uniform_samples, spatialized_samples diff --git a/smash/core/simulation/run/run.py b/smash/core/simulation/run/run.py index b97d2a81..8a46d594 100644 --- a/smash/core/simulation/run/run.py +++ b/smash/core/simulation/run/run.py @@ -214,7 +214,7 @@ def _forward_run( @_multiple_forward_run_doc_appender def multiple_forward_run( model: Model, - samples: Samples, + samples: Samples | dict[str, Any], cost_options: dict[str, Any] | None = None, common_options: dict[str, Any] | None = None, ) -> MultipleForwardRun: @@ -229,7 +229,8 @@ def multiple_forward_run( def _multiple_forward_run( model: Model, - samples: Samples, + samples: Samples | None, + spatialized_samples: dict[str, np.ndarray], cost_options: dict, common_options: dict, ) -> dict: @@ -250,11 +251,11 @@ def _multiple_forward_run( _map_dict_to_fortran_derived_type(common_options, wrap_options.comm) # % Generate samples info - nv = samples._problem["num_vars"] + nv = len(spatialized_samples) samples_kind = np.zeros(shape=nv, dtype=np.int32, order="F") samples_ind = np.zeros(shape=nv, dtype=np.int32, order="F") - for i, name in enumerate(samples._problem["names"]): + for i, name in enumerate(spatialized_samples.keys()): if name in model._parameters.rr_parameters.keys: samples_kind[i] = 0 # % Adding 1 because Fortran uses one based indexing @@ -268,9 +269,10 @@ def _multiple_forward_run( pass # % Initialise results - cost = np.zeros(shape=samples.n_sample, dtype=np.float32, order="F") + n_sample = next(iter(spatialized_samples.values())).shape[-1] + cost = np.zeros(shape=n_sample, dtype=np.float32, order="F") q = np.zeros( - shape=(*model.response_data.q.shape, samples.n_sample), + shape=(*model.response_data.q.shape, n_sample), dtype=np.float32, order="F", ) @@ -282,11 +284,17 @@ def _multiple_forward_run( model._parameters, model._output, wrap_options, - samples.to_numpy(), + np.transpose(list(spatialized_samples.values()), (1, 2, 0, 3)), samples_kind, samples_ind, cost, q, ) - return {"cost": cost, "q": q, "_samples": samples, "_cost_options": cost_options} + return { + "cost": cost, + "q": q, + "_samples": samples, + "_spatialized_samples": spatialized_samples, + "_cost_options": cost_options, + } diff --git a/smash/fcore/optimize/md_regularization.f90 b/smash/fcore/cost/md_regularization.f90 similarity index 100% rename from smash/fcore/optimize/md_regularization.f90 rename to smash/fcore/cost/md_regularization.f90 diff --git a/smash/fcore/optimize/mwd_cost.f90 b/smash/fcore/cost/mwd_cost.f90 similarity index 100% rename from smash/fcore/optimize/mwd_cost.f90 rename to smash/fcore/cost/mwd_cost.f90 diff --git a/smash/fcore/derived_type/mwd_returns.f90 b/smash/fcore/derived_type/mwd_returns.f90 index 0f15662b..7fe14a78 100644 --- a/smash/fcore/derived_type/mwd_returns.f90 +++ b/smash/fcore/derived_type/mwd_returns.f90 @@ -15,12 +15,6 @@ !% ``rr_states_flag`` Return flag of rr_states !% ``q_domain`` Array of discharge !% ``q_domain_flag`` Return flag of q_domain -!% ``iter_cost`` Array of cost iteration -!% ``iter_cost_flag`` Return flag of iter_cost -!% ``iter_projg`` Array of infinity norm of projected gradient iteration -!% ``iter_projg_flag`` Return flag of iter_projg -!% ``control_vector`` Array of control vector -!% ``control_vector_flag`` Return flag of control_vector !% ``cost`` Cost value !% ``cost_flag`` Return flag of cost !% ``jobs`` Jobs value @@ -33,10 +27,6 @@ !% ``log_prior_flag`` Return flag of log_prior !% ``log_h`` Log_h value !% ``log_h_flag`` Return flag of log_h -!% ``serr_mu`` Serr mu value -!% ``serr_mu_flag`` Return flag of serr_mu -!% ``serr_sigma`` Serr sigma value -!% ``serr_sigma_flag`` Return flag of serr_sigma !% ======================== ======================================= !% !% Subroutine @@ -67,15 +57,6 @@ module mwd_returns real(sp), dimension(:, :, :), allocatable :: q_domain logical :: q_domain_flag = .false. - real(sp), dimension(:), allocatable :: iter_cost - logical :: iter_cost_flag = .false. - - real(sp), dimension(:), allocatable :: iter_projg - logical :: iter_projg_flag = .false. - - real(sp), dimension(:), allocatable :: control_vector - logical :: control_vector_flag = .false. - real(sp) :: cost logical :: cost_flag = .false. @@ -94,12 +75,6 @@ module mwd_returns real(sp) :: log_h logical :: log_h_flag = .false. - real(sp), dimension(:, :), allocatable :: serr_mu - logical :: serr_mu_flag = .false. - - real(sp), dimension(:, :), allocatable :: serr_sigma - logical :: serr_sigma_flag = .false. - real(sp), dimension(:, :, :, :), allocatable :: internal_fluxes logical :: internal_fluxes_flag = .false. @@ -153,15 +128,6 @@ subroutine ReturnsDT_initialise(this, setup, mesh, nmts, keys) allocate (this%q_domain(mesh%nrow, mesh%ncol, this%nmts)) this%q_domain = -99._sp - case ("iter_cost") - this%iter_cost_flag = .true. - - case ("iter_projg") - this%iter_projg_flag = .true. - - case ("control_vector") - this%control_vector_flag = .true. - case ("cost") this%cost_flag = .true. @@ -180,17 +146,10 @@ subroutine ReturnsDT_initialise(this, setup, mesh, nmts, keys) case ("log_h") this%log_h_flag = .true. - case ("serr_mu") - this%serr_mu_flag = .true. - allocate (this%serr_mu(mesh%ng, setup%ntime_step)) - - case ("serr_sigma") - this%serr_sigma_flag = .true. - allocate (this%serr_sigma(mesh%ng, setup%ntime_step)) - case ("internal_fluxes") this%internal_fluxes_flag = .true. allocate (this%internal_fluxes(mesh%nrow, mesh%ncol, this%nmts, setup%n_internal_fluxes)) + end select end do diff --git a/smash/fcore/forward/forward_db.f90 b/smash/fcore/forward/forward_db.f90 index 877e2e24..044ee591 100644 --- a/smash/fcore/forward/forward_db.f90 +++ b/smash/fcore/forward/forward_db.f90 @@ -2578,12 +2578,6 @@ END MODULE MWD_PARAMETERS_DIFF !% ``rr_states_flag`` Return flag of rr_states !% ``q_domain`` Array of discharge !% ``q_domain_flag`` Return flag of q_domain -!% ``iter_cost`` Array of cost iteration -!% ``iter_cost_flag`` Return flag of iter_cost -!% ``iter_projg`` Array of infinity norm of projected gradient iteration -!% ``iter_projg_flag`` Return flag of iter_projg -!% ``control_vector`` Array of control vector -!% ``control_vector_flag`` Return flag of control_vector !% ``cost`` Cost value !% ``cost_flag`` Return flag of cost !% ``jobs`` Jobs value @@ -2596,10 +2590,6 @@ END MODULE MWD_PARAMETERS_DIFF !% ``log_prior_flag`` Return flag of log_prior !% ``log_h`` Log_h value !% ``log_h_flag`` Return flag of log_h -!% ``serr_mu`` Serr mu value -!% ``serr_mu_flag`` Return flag of serr_mu -!% ``serr_sigma`` Serr sigma value -!% ``serr_sigma_flag`` Return flag of serr_sigma !% ======================== ======================================= !% !% Subroutine @@ -2627,12 +2617,6 @@ MODULE MWD_RETURNS_DIFF LOGICAL :: rr_states_flag=.false. REAL(sp), DIMENSION(:, :, :), ALLOCATABLE :: q_domain LOGICAL :: q_domain_flag=.false. - REAL(sp), DIMENSION(:), ALLOCATABLE :: iter_cost - LOGICAL :: iter_cost_flag=.false. - REAL(sp), DIMENSION(:), ALLOCATABLE :: iter_projg - LOGICAL :: iter_projg_flag=.false. - REAL(sp), DIMENSION(:), ALLOCATABLE :: control_vector - LOGICAL :: control_vector_flag=.false. REAL(sp) :: cost LOGICAL :: cost_flag=.false. REAL(sp) :: jobs @@ -2645,10 +2629,6 @@ MODULE MWD_RETURNS_DIFF LOGICAL :: log_prior_flag=.false. REAL(sp) :: log_h LOGICAL :: log_h_flag=.false. - REAL(sp), DIMENSION(:, :), ALLOCATABLE :: serr_mu - LOGICAL :: serr_mu_flag=.false. - REAL(sp), DIMENSION(:, :), ALLOCATABLE :: serr_sigma - LOGICAL :: serr_sigma_flag=.false. REAL(sp), DIMENSION(:, :, :, :), ALLOCATABLE :: internal_fluxes LOGICAL :: internal_fluxes_flag=.false. END TYPE RETURNSDT @@ -2689,12 +2669,6 @@ SUBROUTINE RETURNSDT_INITIALISE(this, setup, mesh, nmts, keys) this%q_domain_flag = .true. ALLOCATE(this%q_domain(mesh%nrow, mesh%ncol, this%nmts)) this%q_domain = -99._sp - CASE ('iter_cost') - this%iter_cost_flag = .true. - CASE ('iter_projg') - this%iter_projg_flag = .true. - CASE ('control_vector') - this%control_vector_flag = .true. CASE ('cost') this%cost_flag = .true. CASE ('jobs') @@ -2707,12 +2681,6 @@ SUBROUTINE RETURNSDT_INITIALISE(this, setup, mesh, nmts, keys) this%log_prior_flag = .true. CASE ('log_h') this%log_h_flag = .true. - CASE ('serr_mu') - this%serr_mu_flag = .true. - ALLOCATE(this%serr_mu(mesh%ng, setup%ntime_step)) - CASE ('serr_sigma') - this%serr_sigma_flag = .true. - ALLOCATE(this%serr_sigma(mesh%ng, setup%ntime_step)) CASE ('internal_fluxes') this%internal_fluxes_flag = .true. ALLOCATE(this%internal_fluxes(mesh%nrow, mesh%ncol, this%nmts, & diff --git a/smash/fcore/forward/forward_openmp_db.f90 b/smash/fcore/forward/forward_openmp_db.f90 index 8472b13c..ed3a42d3 100644 --- a/smash/fcore/forward/forward_openmp_db.f90 +++ b/smash/fcore/forward/forward_openmp_db.f90 @@ -2578,12 +2578,6 @@ END MODULE MWD_PARAMETERS_DIFF !% ``rr_states_flag`` Return flag of rr_states !% ``q_domain`` Array of discharge !% ``q_domain_flag`` Return flag of q_domain -!% ``iter_cost`` Array of cost iteration -!% ``iter_cost_flag`` Return flag of iter_cost -!% ``iter_projg`` Array of infinity norm of projected gradient iteration -!% ``iter_projg_flag`` Return flag of iter_projg -!% ``control_vector`` Array of control vector -!% ``control_vector_flag`` Return flag of control_vector !% ``cost`` Cost value !% ``cost_flag`` Return flag of cost !% ``jobs`` Jobs value @@ -2596,10 +2590,6 @@ END MODULE MWD_PARAMETERS_DIFF !% ``log_prior_flag`` Return flag of log_prior !% ``log_h`` Log_h value !% ``log_h_flag`` Return flag of log_h -!% ``serr_mu`` Serr mu value -!% ``serr_mu_flag`` Return flag of serr_mu -!% ``serr_sigma`` Serr sigma value -!% ``serr_sigma_flag`` Return flag of serr_sigma !% ======================== ======================================= !% !% Subroutine @@ -2627,12 +2617,6 @@ MODULE MWD_RETURNS_DIFF LOGICAL :: rr_states_flag=.false. REAL(sp), DIMENSION(:, :, :), ALLOCATABLE :: q_domain LOGICAL :: q_domain_flag=.false. - REAL(sp), DIMENSION(:), ALLOCATABLE :: iter_cost - LOGICAL :: iter_cost_flag=.false. - REAL(sp), DIMENSION(:), ALLOCATABLE :: iter_projg - LOGICAL :: iter_projg_flag=.false. - REAL(sp), DIMENSION(:), ALLOCATABLE :: control_vector - LOGICAL :: control_vector_flag=.false. REAL(sp) :: cost LOGICAL :: cost_flag=.false. REAL(sp) :: jobs @@ -2645,10 +2629,6 @@ MODULE MWD_RETURNS_DIFF LOGICAL :: log_prior_flag=.false. REAL(sp) :: log_h LOGICAL :: log_h_flag=.false. - REAL(sp), DIMENSION(:, :), ALLOCATABLE :: serr_mu - LOGICAL :: serr_mu_flag=.false. - REAL(sp), DIMENSION(:, :), ALLOCATABLE :: serr_sigma - LOGICAL :: serr_sigma_flag=.false. REAL(sp), DIMENSION(:, :, :, :), ALLOCATABLE :: internal_fluxes LOGICAL :: internal_fluxes_flag=.false. END TYPE RETURNSDT @@ -2689,12 +2669,6 @@ SUBROUTINE RETURNSDT_INITIALISE(this, setup, mesh, nmts, keys) this%q_domain_flag = .true. ALLOCATE(this%q_domain(mesh%nrow, mesh%ncol, this%nmts)) this%q_domain = -99._sp - CASE ('iter_cost') - this%iter_cost_flag = .true. - CASE ('iter_projg') - this%iter_projg_flag = .true. - CASE ('control_vector') - this%control_vector_flag = .true. CASE ('cost') this%cost_flag = .true. CASE ('jobs') @@ -2707,12 +2681,6 @@ SUBROUTINE RETURNSDT_INITIALISE(this, setup, mesh, nmts, keys) this%log_prior_flag = .true. CASE ('log_h') this%log_h_flag = .true. - CASE ('serr_mu') - this%serr_mu_flag = .true. - ALLOCATE(this%serr_mu(mesh%ng, setup%ntime_step)) - CASE ('serr_sigma') - this%serr_sigma_flag = .true. - ALLOCATE(this%serr_sigma(mesh%ng, setup%ntime_step)) CASE ('internal_fluxes') this%internal_fluxes_flag = .true. ALLOCATE(this%internal_fluxes(mesh%nrow, mesh%ncol, this%nmts, & diff --git a/smash/fcore/forward/mw_forward.f90 b/smash/fcore/forward/mw_forward.f90 index fdc1a64d..cd6d4569 100644 --- a/smash/fcore/forward/mw_forward.f90 +++ b/smash/fcore/forward/mw_forward.f90 @@ -77,21 +77,21 @@ subroutine multiple_forward_run_sample_to_parameters(sample, samples_kind, sampl implicit none - real(sp), dimension(:), intent(in) :: sample - integer, dimension(size(sample)), intent(in) :: samples_kind, samples_ind + real(sp), dimension(:, :, :), intent(in) :: sample + integer, dimension(size(sample, 3)), intent(in) :: samples_kind, samples_ind type(ParametersDT), intent(inout) :: parameters integer :: i - do i = 1, size(sample) + do i = 1, size(sample, 3) select case (samples_kind(i)) case (0) - parameters%rr_parameters%values(:, :, samples_ind(i)) = sample(i) + parameters%rr_parameters%values(:, :, samples_ind(i)) = sample(:, :, i) case (1) - parameters%rr_initial_states%values(:, :, samples_ind(i)) = sample(i) + parameters%rr_initial_states%values(:, :, samples_ind(i)) = sample(:, :, i) ! Should be unreachable case default @@ -113,10 +113,10 @@ subroutine multiple_forward_run(setup, mesh, input_data, parameters, output, opt type(ParametersDT), intent(inout) :: parameters type(OutputDT), intent(inout) :: output type(OptionsDT), intent(inout) :: options - real(sp), dimension(:, :), intent(in) :: samples - integer, dimension(size(samples, 1)) :: samples_kind, samples_ind - real(sp), dimension(size(samples, 2)), intent(inout) :: cost - real(sp), dimension(mesh%ng, setup%ntime_step, size(samples, 2)), intent(inout) :: q + real(sp), dimension(:, :, :, :), intent(in) :: samples + integer, dimension(size(samples, 3)) :: samples_kind, samples_ind + real(sp), dimension(size(samples, 4)), intent(inout) :: cost + real(sp), dimension(mesh%ng, setup%ntime_step, size(samples, 4)), intent(inout) :: q integer :: i, iter, niter, ncpu logical :: verbose @@ -125,7 +125,7 @@ subroutine multiple_forward_run(setup, mesh, input_data, parameters, output, opt type(OutputDT) :: output_thread type(ReturnsDT) :: returns - niter = size(samples, 2) + niter = size(samples, 4) iter = 0 task = "Forward Run" @@ -149,7 +149,7 @@ subroutine multiple_forward_run(setup, mesh, input_data, parameters, output, opt parameters_thread = parameters output_thread = output - call multiple_forward_run_sample_to_parameters(samples(:, i), samples_kind, samples_ind, parameters_thread) + call multiple_forward_run_sample_to_parameters(samples(:, :, :, i), samples_kind, samples_ind, parameters_thread) call forward_run(setup, mesh, input_data, parameters_thread, output_thread, options, returns) #ifdef _OPENMP diff --git a/smash/fcore/meson.build b/smash/fcore/meson.build index ac6bfe4a..aece821b 100644 --- a/smash/fcore/meson.build +++ b/smash/fcore/meson.build @@ -32,14 +32,12 @@ md_f90_sources = [ 'operator/md_snow_operator.f90', 'operator/md_vic3l_operator.f90', - 'optimize/md_regularization.f90', + 'cost/md_regularization.f90', ] mw_f90_sources = [ 'forward/mw_forward.f90', - 'optimize/mw_optimize.f90', - 'routine/mw_atmos_statistic.f90', 'routine/mw_interception_capacity.f90', 'routine/mw_mask.f90', @@ -72,7 +70,7 @@ mwd_f90_sources = [ 'external/mwd_bayesian_tools.f90', - 'optimize/mwd_cost.f90', + 'cost/mwd_cost.f90', 'routine/mwd_atmos_manipulation.f90', 'routine/mwd_parameters_manipulation.f90', diff --git a/smash/fcore/optimize/mw_optimize.f90 b/smash/fcore/optimize/mw_optimize.f90 deleted file mode 100644 index 4e021d32..00000000 --- a/smash/fcore/optimize/mw_optimize.f90 +++ /dev/null @@ -1,515 +0,0 @@ -!% (MW) Module Wrapped. -!% -!% Subroutine -!% ---------- -!% -!% - sbs_optimize -!% - lbfgsb_optimize -!% - optimize -!% - multiple_optimize_sample_to_parameters -!% - multiple_optimize_save_parameters -!% - multiple_optimize - -module mw_optimize - - use md_constant, only: sp, dp, lchar - use m_screen_display, only: display_iteration_progress - use m_array_manipulation, only: reallocate - use mwd_setup, only: SetupDT - use mwd_mesh, only: MeshDT - use mwd_input_data, only: Input_DataDT - use mwd_parameters, only: ParametersDT - use mwd_output, only: OutputDT - use mwd_options, only: OptionsDT - use mwd_returns, only: ReturnsDT - use mw_forward, only: forward_run, forward_run_b - use mwd_parameters_manipulation, only: parameters_to_control, get_serr_mu, get_serr_sigma - use mwd_control, only: ControlDT, ControlDT_finalise - - implicit none - - public :: optimize - -contains - - subroutine sbs_optimize(setup, mesh, input_data, parameters, output, options, returns) - - implicit none - - type(SetupDT), intent(in) :: setup - type(MeshDT), intent(in) :: mesh - type(Input_DataDT), intent(in) :: input_data - type(ParametersDT), intent(inout) :: parameters - type(OutputDT), intent(inout) :: output - type(OptionsDT), intent(in) :: options - type(ReturnsDT), intent(inout) :: returns - - character(lchar) :: task - integer :: n, i, j, ia, iaa, iam, jf, jfa, jfaa, nfg, iter - real(sp) :: gx, ga, clg, ddx, dxn - real(sp), dimension(:), allocatable :: x_wa, y_wa, z_wa, l_wa, u_wa, sdx - - call parameters_to_control(setup, mesh, input_data, parameters, options) - - n = parameters%control%n - - allocate (x_wa(n), y_wa(n), z_wa(n), l_wa(n), u_wa(n), sdx(n)) - - x_wa = parameters%control%x - l_wa = parameters%control%l - u_wa = parameters%control%u - y_wa = x_wa - z_wa = x_wa - - call forward_run(setup, mesh, input_data, parameters, output, options, returns) - - gx = output%cost - ga = gx - clg = 0.7_sp**(1._sp/real(n, sp)) - sdx = 0._sp - ddx = 0.64_sp - dxn = ddx - ia = 0 - iaa = 0 - iam = 0 - jfaa = 0 - nfg = 1 - - task = "STOP: TOTAL NO. OF ITERATION EXCEEDS LIMIT" - - if (options%comm%verbose) then - write (*, '(4x,a,4x,i3,4x,a,i5,4x,a,f14.6,4x,a,f5.2)') & - & "At iterate", 0, "nfg = ", nfg, "J =", gx, "ddx =", ddx - end if - - if (returns%iter_cost_flag) then - allocate (returns%iter_cost(options%optimize%maxiter + 1)) - returns%iter_cost(1) = gx - end if - - do iter = 1, options%optimize%maxiter*n - - if (dxn .gt. ddx) dxn = ddx - if (ddx .gt. 2._sp) ddx = dxn - - do i = 1, n - - x_wa = y_wa - - do j = 1, 2 - - jf = 2*j - 3 - if (i .eq. iaa .and. jf .eq. -jfaa) cycle - if (y_wa(i) .le. l_wa(i) .and. jf .lt. 0) cycle - if (y_wa(i) .ge. u_wa(i) .and. jf .gt. 0) cycle - - x_wa(i) = y_wa(i) + jf*ddx - if (x_wa(i) .lt. l_wa(i)) x_wa(i) = l_wa(i) - if (x_wa(i) .gt. u_wa(i)) x_wa(i) = u_wa(i) - - parameters%control%x = x_wa - parameters%control%l = l_wa - parameters%control%u = u_wa - - call forward_run(setup, mesh, input_data, parameters, output, options, returns) - nfg = nfg + 1 - - if (output%cost .lt. gx) then - - z_wa = x_wa - gx = output%cost - ia = i - jfa = jf - - end if - - end do - - end do - - iaa = ia - jfaa = jfa - - if (ia .ne. 0) then - - y_wa = z_wa - - sdx = clg*sdx - sdx(ia) = (1._sp - clg)*real(jfa, sp)*ddx + clg*sdx(ia) - - iam = iam + 1 - - if (iam .gt. 2*n) then - - ddx = ddx*2._sp - iam = 0 - - end if - - if (gx .lt. ga - 2) ga = gx - - else - - ddx = ddx/2._sp - iam = 0 - - end if - - if (iter .gt. 4*n) then - - do i = 1, n - - x_wa(i) = y_wa(i) + sdx(i) - if (x_wa(i) .lt. l_wa(i)) x_wa(i) = l_wa(i) - if (x_wa(i) .gt. u_wa(i)) x_wa(i) = u_wa(i) - - end do - - parameters%control%x = x_wa - parameters%control%l = l_wa - parameters%control%u = u_wa - - call forward_run(setup, mesh, input_data, parameters, output, options, returns) - nfg = nfg + 1 - - if (output%cost .lt. gx) then - - gx = output%cost - jfaa = 0 - y_wa = x_wa - z_wa = x_wa - - if (gx .lt. ga - 2) ga = gx - - end if - - end if - - ia = 0 - - if (mod(iter, n) .eq. 0) then - - if (options%comm%verbose) then - write (*, '(4x,a,4x,i3,4x,a,i5,4x,a,f14.6,4x,a,f5.2)') & - & "At iterate", (iter/n), "nfg = ", nfg, "J =", gx, "ddx =", ddx - end if - - if (returns%iter_cost_flag) returns%iter_cost(iter/n + 1) = gx - - end if - - if (ddx .lt. 0.01_sp) then - task = "CONVERGENCE: DDX < 0.01" - exit - end if - - if (iter .eq. options%optimize%maxiter*n) then - task = "STOP: TOTAL NO. OF ITERATION EXCEEDS LIMIT" - exit - end if - - end do - - parameters%control%x = z_wa - parameters%control%l = l_wa - parameters%control%u = u_wa - - call forward_run(setup, mesh, input_data, parameters, output, options, returns) - - if (returns%control_vector_flag) then - allocate (returns%control_vector(n)) - returns%control_vector = parameters%control%x - end if - - if (returns%serr_mu_flag) call get_serr_mu(setup, mesh, parameters, output, returns%serr_mu) - if (returns%serr_sigma_flag) call get_serr_sigma(setup, mesh, parameters, output, returns%serr_sigma) - - if (returns%iter_cost_flag) call reallocate(returns%iter_cost, iter/n + 1) - - call ControlDT_finalise(parameters%control) - - if (options%comm%verbose) write (*, '(4x,2a)') task, new_line("") - - end subroutine sbs_optimize - - subroutine lbfgsb_optimize(setup, mesh, input_data, parameters, output, options, returns) - - implicit none - - type(SetupDT), intent(in) :: setup - type(MeshDT), intent(in) :: mesh - type(Input_DataDT), intent(in) :: input_data - type(ParametersDT), intent(inout) :: parameters - type(OutputDT), intent(inout) :: output - type(OptionsDT), intent(in) :: options - type(ReturnsDT), intent(inout) :: returns - - integer :: iprint, n, m - real(dp) :: factr, pgtol, f, projg - character(lchar) :: task, csave - logical, dimension(4) :: lsave - integer, dimension(44) :: isave - real(dp), dimension(29) :: dsave - integer, dimension(:), allocatable :: iwa - real(dp), dimension(:), allocatable :: g, wa, x_wa, l_wa, u_wa - type(ParametersDT) :: parameters_b - type(OutputDT) :: output_b - - call parameters_to_control(setup, mesh, input_data, parameters, options) - - iprint = -1 - n = parameters%control%n - m = 10 - factr = real(options%optimize%factr, dp) - pgtol = real(options%optimize%pgtol, dp) - - allocate (g(n), x_wa(n), l_wa(n), u_wa(n)) - allocate (iwa(3*n)) - allocate (wa(2*m*n + 5*n + 11*m*m + 8*m)) - - parameters_b = parameters - output_b = output - output_b%cost = 1._sp - - task = "START" - - if (returns%iter_cost_flag) allocate (returns%iter_cost(options%optimize%maxiter + 1)) - if (returns%iter_projg_flag) allocate (returns%iter_projg(options%optimize%maxiter + 1)) - - x_wa = real(parameters%control%x, dp) - l_wa = real(parameters%control%l, dp) - u_wa = real(parameters%control%u, dp) - - do while (task(1:2) .eq. "FG" .or. task .eq. "NEW_X" .or. task .eq. "START") - - call setulb(n, m, x_wa, l_wa, u_wa, parameters%control%nbd, f, g, & - & factr, pgtol, wa, iwa, task, iprint, csave, lsave, isave, dsave) - - parameters%control%x = real(x_wa, sp) - parameters%control%l = real(l_wa, sp) - parameters%control%u = real(u_wa, sp) - - if (task(1:2) .eq. "FG") then - - call forward_run_b(setup, mesh, input_data, parameters, parameters_b, & - & output, output_b, options, returns) - - f = real(output%cost, dp) - g = real(parameters_b%control%x, dp) - - if (task(4:8) .eq. "START") then - - call projgr(n, l_wa, x_wa, parameters%control%nbd, x_wa, g, projg) - if (returns%iter_cost_flag) returns%iter_cost(1) = real(f, sp) - if (returns%iter_projg_flag) returns%iter_projg(1) = real(projg, sp) - - if (options%comm%verbose) then - - write (*, '(4x,a,4x,i3,4x,a,i5,3(4x,a,f14.6),4x,a,f10.6)') & - & "At iterate", 0, "nfg = ", 1, "J =", f, "|proj g| =", projg - - end if - - end if - - else if (task(1:5) .eq. "NEW_X") then - - if (returns%iter_cost_flag) returns%iter_cost(isave(30) + 1) = real(f, sp) - if (returns%iter_projg_flag) returns%iter_projg(isave(30) + 1) = real(dsave(13), sp) - - if (options%comm%verbose) then - - write (*, '(4x,a,4x,i3,4x,a,i5,3(4x,a,f14.6),4x,a,f10.6)') & - & "At iterate", isave(30), "nfg = ", isave(34), "J =", f, "|proj g| =", dsave(13) - - end if - - if (isave(30) .ge. options%optimize%maxiter) task = "STOP: TOTAL NO. OF ITERATION EXCEEDS LIMIT" - - if (dsave(13) .le. 1.d-10*(1.0d0 + abs(f))) task = "STOP: THE PROJECTED GRADIENT IS SUFFICIENTLY SMALL" - - end if - - end do - - call forward_run(setup, mesh, input_data, parameters, output, options, returns) - - if (returns%control_vector_flag) then - allocate (returns%control_vector(n)) - returns%control_vector = parameters%control%x - end if - - if (returns%serr_mu_flag) call get_serr_mu(setup, mesh, parameters, output, returns%serr_mu) - if (returns%serr_sigma_flag) call get_serr_sigma(setup, mesh, parameters, output, returns%serr_sigma) - - if (returns%iter_cost_flag) call reallocate(returns%iter_cost, isave(30) + 1) - if (returns%iter_projg_flag) call reallocate(returns%iter_projg, isave(30) + 1) - - call ControlDT_finalise(parameters%control) - - if (options%comm%verbose) write (*, '(4x,2a)') task, new_line("") - - end subroutine lbfgsb_optimize - - subroutine optimize(setup, mesh, input_data, parameters, output, options, returns) - - implicit none - - type(SetupDT), intent(in) :: setup - type(MeshDT), intent(in) :: mesh - type(Input_DataDT), intent(in) :: input_data - type(ParametersDT), intent(inout) :: parameters - type(OutputDT), intent(inout) :: output - type(OptionsDT), intent(in) :: options - type(ReturnsDT), intent(inout) :: returns - - select case (options%optimize%optimizer) - - case ("sbs") - - call sbs_optimize(setup, mesh, input_data, parameters, output, options, returns) - - case ("lbfgsb") - - call lbfgsb_optimize(setup, mesh, input_data, parameters, output, options, returns) - - end select - - end subroutine optimize - - subroutine multiple_optimize_sample_to_parameters(sample, samples_kind, samples_ind, parameters) - - implicit none - - real(sp), dimension(:), intent(in) :: sample - integer, dimension(size(sample)), intent(in) :: samples_kind, samples_ind - type(ParametersDT), intent(inout) :: parameters - - integer :: i - - do i = 1, size(sample) - - select case (samples_kind(i)) - - case (0) - parameters%rr_parameters%values(:, :, samples_ind(i)) = sample(i) - - case (1) - parameters%rr_initial_states%values(:, :, samples_ind(i)) = sample(i) - - ! Should be unreachable - case default - - end select - - end do - - end subroutine multiple_optimize_sample_to_parameters - - subroutine multiple_optimize_save_parameters(setup, parameters, options, optimized_parameters) - - implicit none - - type(SetupDT), intent(in) :: setup - type(ParametersDT), intent(in) :: parameters - type(OptionsDT), intent(in) :: options - real(sp), dimension(:, :, :) :: optimized_parameters - - integer :: i, j - - j = 0 - - do i = 1, setup%nrrp - - if (options%optimize%rr_parameters(i) .ne. 1) cycle - - j = j + 1 - - optimized_parameters(:, :, j) = parameters%rr_parameters%values(:, :, i) - - end do - - do i = 1, setup%nrrs - - if (options%optimize%rr_initial_states(i) .ne. 1) cycle - - j = j + 1 - - optimized_parameters(:, :, j) = parameters%rr_initial_states%values(:, :, i) - - end do - - end subroutine multiple_optimize_save_parameters - - subroutine multiple_optimize(setup, mesh, input_data, parameters, output, options, & - & samples, samples_kind, samples_ind, cost, q, optimized_parameters) - - implicit none - - type(SetupDT), intent(in) :: setup - type(MeshDT), intent(in) :: mesh - type(Input_DataDT), intent(in) :: input_data - type(ParametersDT), intent(inout) :: parameters - type(OutputDT), intent(inout) :: output - type(OptionsDT), intent(inout) :: options - real(sp), dimension(:, :), intent(in) :: samples - integer, dimension(size(samples, 1)) :: samples_kind, samples_ind - real(sp), dimension(size(samples, 2)), intent(inout) :: cost - real(sp), dimension(mesh%ng, setup%ntime_step, size(samples, 2)), intent(inout) :: q - real(sp), dimension(mesh%nrow, mesh%ncol, & - & sum(options%optimize%rr_parameters) + sum(options%optimize%rr_initial_states), & - & size(samples, 2)) :: optimized_parameters - - integer :: i, iter, niter, ncpu - logical :: verbose - character(lchar) :: task - type(ParametersDT) :: parameters_thread - type(OutputDT) :: output_thread - type(ReturnsDT) :: returns - - niter = size(samples, 2) - iter = 0 - task = "Optimize" - - ! Trigger parallel in multiple optimize and not inside optimize - ncpu = options%comm%ncpu - options%comm%ncpu = 1 - - ! Deactivate other verbose - verbose = options%comm%verbose - options%comm%verbose = .false. - - if (verbose) call display_iteration_progress(iter, niter, task) -#ifdef _OPENMP - !$OMP parallel do schedule(static) num_threads(ncpu) & - !$OMP& shared(setup, mesh, input_data, parameters, output, options, returns) & - !$OMP& shared(samples, samples_kind, samples_ind, iter, niter, cost, q, optimized_parameters) & - !$OMP& private(i, parameters_thread, output_thread) -#endif - do i = 1, niter - - parameters_thread = parameters - output_thread = output - - call multiple_optimize_sample_to_parameters(samples(:, i), samples_kind, samples_ind, parameters_thread) - - call optimize(setup, mesh, input_data, parameters_thread, output_thread, options, returns) -#ifdef _OPENMP - !$OMP critical -#endif - cost(i) = output_thread%cost - q(:, :, i) = output_thread%response%q - call multiple_optimize_save_parameters(setup, parameters_thread, options, optimized_parameters(:, :, :, i)) - - iter = iter + 1 - if (verbose) call display_iteration_progress(iter, niter, task) -#ifdef _OPENMP - !$OMP end critical -#endif - end do -#ifdef _OPENMP - !$OMP end parallel do -#endif - end subroutine multiple_optimize - -end module mw_optimize diff --git a/smash/io/model_ddt.py b/smash/io/model_ddt.py index 637b6572..f133b275 100644 --- a/smash/io/model_ddt.py +++ b/smash/io/model_ddt.py @@ -23,11 +23,13 @@ def save_model_ddt(model: Model, path: FilePath): """ Save some derived data types of the Model object to HDF5. - This method is considerably lighter than `smash.io.save_model ` method that saves the entire - Model object. However, it is not capable of reconstructing the Model object from the saved data file. + This method is considerably lighter than `smash.io.save_model ` method that saves + the entire Model object. Note that there is no method to reconstruct the Model object with + the saved data file from this method, as some information is left out to ensure a lighter memory backup. + To read the saved data, use `smash.io.read_model_ddt `, + which returns a dictionary reflecting the structure of the Model object. - By default, the following data are stored into the `HDF5 `__ - file: + The following data are stored into the `HDF5 `__ file: - ``snow_module``, ``hydrological_module``, ``routing_module``, ``serr_mu_mapping``, ``serr_sigma_mapping``, ``start_time``, ``end_time``, ``dt``, ``descriptor_name`` from diff --git a/smash/tests/baseline.hdf5 b/smash/tests/baseline.hdf5 index 20e602a3df76b692269418c768983166f4f15c95..add0a1448f1d9b2b5850ad5f34be2eb42db7af66 100644 GIT binary patch delta 132577 zcmb5WcRbhM|Nrm#d>T(9dy|!wQAUxiB7{(s$_#}>X0o0MmA!kA5s|E9_C)py$rhrF zB(h6J8NbK#c^=;H&*yXb{`2dP*Q@LOoaZ^Wv+nnE&g1c@y)YiNR~wIt5k>EPjTH-U z5R4`#A^g!M{+EP=K9`61H+n2EoVY|m{EHM5V5d>QeC&V&gpLsZl7RtC8VSm?QUF{f z$4LB3ZW#mW6^e@f4ltk9fMUgH+2f^9=gRmn>?rEH)*#`WAYVK`>M*q^!jo@#iA;}h z#%sVCRvTjzK3P^gR4p)LB&fCiHp;{ z{m0^Wv#2DwB#8hzJvN1L)BujrC2;Oh&mH+jkE#`YUlME&$1QIQ@i+wwQFpUm6bbDO z^gjqCOT!LD%N?SHGWPhe@#P zqGJBvzlhiR;7PrD0qzI*&q6pG7!m`(;)#Hz5Wbxb*c9Qi62K1-K3fMk7vbrkHXl*xb|Y%;Ky+0M?fK&y8Iv8bC+-yK2T z|E5Un7ArsnsdVi4bvYCn7I$j!DyCs={C!2cikRFZP0eTDPRagAo!HLHwaq#)Dsi#2 zl)0oo=HE*V{`0R*MkS$X^OK|G_csK}HD2P2J2%b=U37?dcES0p_53#ferNLQa1qAl z?`tcMA?__hM-p9snn|@ta;bic9&?@?x}mZ4sq{0tjLi4Qdqn$%4C?oAa{YCpYnj+bl$7;l{MRZj5IasCaoB3Plsl;be{d6ahvH{xH;&Dc=g_(E6i51d*TM>$v*(5$|FKs;u3l=W_@wBOb6nT{ zQB7qdF|Fu@8T+wKYtz3I+{-~Thj#Z)Gsu5dIIl9L)2aXb#my==pU=fl(kucZM>$e$ z8dr2pC#RLYp7&UJMatv|gxlFPY0FiMMtDjbvNrh{7%}!PS>gRZ*?k^0Tuwq+I>*gz zsR?11%hQ!lmo69HRQ0VL>Gw=8JmJA|JN#Nl)b}@5h0Q_9jy}affy%yFRuVnWq^De? zbY5L4&SZ;tO>NsXMf?87OYQ=$3<>$T()4@5N23^7f1XLQIDYd7lhiftLzp|hSI6x$mcG67Ta6Kjr^_gDK? z7Vi(+2-ke)(%PSYh>SiU{dk*W^+-Qx5;gB)w2F4YVp|}F7Ep+)vr!&eHva# zUU0mls*}-aplwm6a^cA0nyIt%BzN}|8)4S%aTdRe8gGbSYx_t z=|Gh&!44(pqvW@fQn=&-os(aEm@KQL(Kcm0(b@f2ZSdvUFSEAZFHFe|6f~L(mHJk9 zh1}Q87$}avZELQ*Us5b9K`xiz{P?#YzWMk$^km+7T#{oo>imzwhkfFUg5M#prnLlY zrO)Y8HTUJ{H|$88%*DPIZ;VyoitWBonKE}}v{9q4i+{1Ik`DgG!IqRdOVf8!)jLLtkGla)gkF39+&1HFnjntq4U>DK zv&_YbvtggU2u$_-!;asDY*iLTq~GG=AC3RZe&Ld|Uhl8X)64LyV_tfG$>;pToOFi1 z7E%X4IUS##T0vQ@SM9nGu4Af0KKtd2WL|xd#@SzqbMg9}#*Qz~+?%+Z*_NC?$e3>w zX>rm~!`Jea zQfQO$eZEvzoGrIZy6X)>6FXg8BNaZHp)FfG#y(Wux?g=o`&_9dwR(*C|=t+_cYKWFPFm_bg zP`{!e@rU$BuTwlALg)(WX9-= zLyjx?LAmZ|tJxQ1F(o7sztFu*FDPW>90P^u5(7I_P42dw!8pmJGf1nk&~wO83+g+O z^6qb7mY&N!w7%_PD4-OzJI5(=F|}&v@w$wAn}X z*R?bzA8$MGI!#85D?0mL72jv(IW6&J-~P1i;A6D{SteCSjmx&#^*@EaGTWlXDb6No zOY@#d+`W{SIqdw*TlR^n+nD-3owaxOVM53!38edH7sZC|OWxJAYCHR{*pPn9(PeaV zI?!n>+uthv!R`+Un)M1&ZVKYSayxXZt=k zs?`^Ut)IE;X#9J~f4Jkc_FYNB*x?N&WwA7SzK+dIi6B4%JA9Kfz2Y zhk`yakcvY+3-IPdB^pHoeOo~BLx$fO-0|;CQS>OZ;9=-=JUWPKjudQ31eYM`0Dc~- zQ)Ga%_W_R}TxbTk7~$0G1Saetp2zcH_#kd^au1XcgyKf~5;=kk?T!wXBpS-3P*@ak z2ZA5BKqb(YwZ4}}K?5wXKo(OJFZ7W95Es~d2)dw1vABO~3EMm*cP}kID_N*+&Iu0V zwg?sOk^QaQqdd{GnLN(od-3|fRlLR1Ue-htfpAl=?{VXtP^728yP~O6iE&9+zGw4a zFJDf}61`qjk=_OOViAb)vf3E9&o?=ALb<}`zgN)+2QM%6AQX&mu%eYv}b zYwyl5ELFdFp&6;-G0<>nUP(=W?@dvu`0& ztw?P$?zH1{bPuvrZLIaVZu`g1p)^C^#w^p0Q~pX=0yj$HuXmPnDyrO%efs64{|78TkSg>J{4koIx835S*y!0{1UshaliPU z0N2G^G7as@hu7Q+B0 z!^A!5+4;#wo?e~fyRYorEHAg|I(<_N)~YNV+893*CdXzd8hnW z2m{OH7V@Q6l_3*Xms?(NY0z_h$OKrgm<0E6&kvD=X8i@NP_!AT+HXVm--$5Dnxr2cq%;Y zuU@=@7j&&ie#$Oxp*?Q)Ua0j74(j@ONT*-dM@YlzO>obp^F{x(WS+%-h+CYG?Arh8 zVN`u0=Y*eBD_2Hdl)C$qCrZ?GKbA_MI)%4t%9t;xv=|#p3iLhRBaOD$91j6o?P1@1JNvv!08**F}NTBwxfwx?OSCr4tm*{ zD=8Q0-$+oJAJiBH~=ODeY}P+R4~~6Y}2*r@OI|l{AlioML!GKQ7?E zL9>6i{5B=ZNjDyt;En`ScV>JMqL$dv9Qkc0>g7EX@)fdA_4!zg?u6>Ud0i+q~`Uo6s3^JG4VTw_a3dP=_x5YiQ_;yKeu| z#7aUF)wYl82q zQ2jj<-^Sw}Jo*0Wjo*>d50h7pFn<-B#>b9nm@V9yF7cJkbjlOCz)(RNm&o+L+fHuqw!erEwY@$iHkiy7$en-5YRp(f=G3*oWiQ(o zmPJAtOqMH6I`1Xca6_Sra}ugl6&4rnn)Q%G9Irp;Pq!CzCS9K2+J-}>p!>|>Z5?eE z?oe+0R@Ro33v=z0*zH@S)n*Ql#hT?a!iI9}FIqo2f6cR3y@*w&w_pAG0^5k-1jpMS zA1J-X{hw6mEZHrC(VQ*Lm_Y3WteSI;X6d@%l`2!0UFQeDueh8G)q} z)TbPl(JzJq9(=!jT5#*|gNKX~Rv$mB#q{ti<&HU#SoYMN(bQC#+c$x}qRJZIE1{s@ z0Vo~Rb@FxEa||9(eOULSCnr(Ap>}kd%x>9Rpp!p;#fc0DgMNxDX{uHG*6fF=v4w zY=s1E?smX22%GgC1m%0gaEp2fSyMBzVNzeCUIp&aVR1da%ELe4&|0-)TogMN7SEkp zJiTZq@<+Mn$8W!@DcQC&aXFq>?fO)1w+X)tA4`~i)q0$n|K=I~F3FjIqq~M01@_1J zhucT%SN6Xy_=Jt5_oHXu#P%pstdusUI^E=sYb{*tPmaHGG<#$GMu@(S)Aq|A?;AJ8 z$CQVf+#Ye^Mi<=_q(&z?WD?$uc1D^P7S_dUrY~4Y*1s+JITR`3bQ_cM`7PavFFYll zaf)7wC65jzsM*RZen<}TQdm$lZrV65anpJF%c470^6o^H15{cvT{rb=@iUr=(nedKWHEUZ`w7-n>ird=sBW)7RTV z#oDpKn$cfwO|a%Zm=9AH_Ug8|=k_b9-=1s>mvbz4NOz0P|5orNhA{3&-@Wg@pt(Y6 zIIWdiXO(Rw;Jq}=tk`KwiYdD?-dvYhu)G(qTi^Y?Db{$oY(sJX!;wef$AaC5N6L28 z_33$|mD)CUaCaZLJV@K|e$Caxs<3ukscw3pfb8q3cj>$n+X}~1%4Vkd-P5g|JL6Xh zXL7V?wnEQ7zsnLTx36{q1%*wLtzg~W|^3ev~%69SG5nN91`+pYUq`!#l zW+2-tMV0J`7*ntdPAuAHt})2e)tPQ%{~kr>;^#-_s8gkGPn~1l{+u~TzZy5M$gN@@ zd4cKamcRtM%=60BQ~kCr?Hf-npCe~C{zv&WqOZ|}U$^AAAEg{??u#LolQqT#5jS>Q zM|g{#@O-ASj~5T8+vv!s7?#k;GdR7tAT8=GM-#3_6BzmZHoF>5ool(4}JzyE;}hJn5wy5TIZiuABF>}o)wJFyW?K8 z)dnPdn=i{sn%L;U<+9)dkI{`3cJ1$8OdCu8`=E&HYsRxRnl>-B=Gw+Evv+UVzK5r* zea4BEWSg8HS$J2Io`V+BYKWYSgwGp(3#{_9&o2I>&O{%`k#axG(U^g|G3%g8(@hcc(Z zUQ#rF8LM=Qy4tgvOJM?6&K=Rdv#WWdY)?R;evW%>+xzLvsZ{>X^RINS+Dj$lsRWN} z25OA$h%h=bX}_&b73!ar&Az$95jV)I7myG^vj3c4Q6jCe(1o^CX4S6SC!p)h20eA> zKvPVU>FTeDN1t+~>~R%`Lau*pd_Z^MG&IJrN~uPY>GiJR*Nj(tpJ&L;G)elOE_Cj~ zUVMe5?GqKWlT{~e-(PKfKWQ-K)+FZruakXIJ@k6B>to(fb>h*Q`&P&Zs~O}A4{v;K9MiN-RjwAH5>=j1d&AD)YAeXDe6 z$ELRHRNdp3D^E*x#zdSLZr>8GbF_9=jasm#_sIcM4)dNRl2A_)0y{U_Od)t zFF!=te2Wmjd{kD#QK~sB>_czq6|yg4wrf7^qDlF6BwBgGK5xZrZp3grqmgW|JfX#R z#F2d2UzNmB|2LnUAN4ZL?RO2u^{73%wXA(cD9RM`9D=XYts&W3)D1{F8pR%;!9p4z zR>(+vo?{6rlbLs9krBeG)n&JoQqShPgP|FEOY&mj@Fe1H&f zeG?lPu~bq>upF-g!E*}(k^`U~W z==Je<{uy6lyoH=*SlBUw-;rqB>8t!{6OOh}+ixrDW&D+X9s4xd4vzYj&42#_>eL=x zw*P3Sm7WvS=^&m~Tz*(f?4{d%dbc#~l8XlVRc*cTGVvegOU$TzVr}K<_A1w%1j0I_WhA-C{Vt zFs{=z%hT+!wq5c3qudHpsyZ{%)^5&w(mK*{@jvq~H$7UKpB0I0d9h7=`zXDLQY zaqQm?tJ=iMeRcZuIr4SdJ-fb(TC792d*1#TE0($0aj`3M^h_=fHT~@}^;mLWu8ht? zo?7&7_SL(dN#xrqLfJEPjW9sxiS;3pX}(4zcfeDHx*tM)o(6&cd5i!1ao@B9rT2D5nWxl@9#))JzWeCKQ=Hu5 zMA?)Xu^<_Z~||UB9hL=029L{#U+FwuOZG|oo3kS?x$rW9Y?ZSY#PsVu+xz$AdX(7TGEl;-Q>;FV8JkG~g8s+G)IMMUsD z91bdFzJo34CvB!YNgpZE_gnS2!^@8+KE@gJWh6`IKjFv`cpi}NzKTom@VpqFL^1dy z{+%)Q_KUGMpN#&T#OF-}aSf`ziNpEK8uzaLmEp|0dM3PH?1jNZ$16<}h4taAA9G{J zW#*wcC(&yzZK-17qmz}X+oo*AKU-}ITiw{)XUCJ$+*B4krEOT;Z=8#_IQv^n=q}y6 zse;uZr_J+BadD%=OlW0}dOD4ZRO5^o7(&*+>9Btg& z(Ae~g!FAn9vjPFBGp63W@~WS^=dW~DH7^w1b=G2>Z>=7f>s=Exz81jjkj%S}4 z8a`U#m+ z11~(H+FrUFu!NdT%%dEKb*yhc#k{Ncr+&V;D$Tpo7JlXG#>|_`_tlpy$V@6Kaay(I zw?%K)p1BvrGEfukmV47etaidbZn=ibz`#VSPs5e;^`Eag`gH${hGQg8OeU)Tk>~T- zt72jqbI!zZF%;Q_v;4Lx|+8sIQGHD=c6OIHl}D+p64~qAJ}ehZM_gvb&rlvJ66?sPc!lN z`oHj?bH1Gy(-c2jNezMdSthkjgIn`Cp7VT`02e9_!<;Fel2s$RL%6lhsnNJ z8g1IBkjgreq~cb-v@)`N;Uiep*OV2uftL-UdlUI*i^m$--Bj-eUe6b}%Y7}Q#gjAC znU^Qa)|kahu)Ft?4Q6nWSFK--H$*(M6-lq$2@~0s|yo4221I&`M**dnEBWt<}4IF-j4|lN5OIuDE1S&0Ml~t1N1sG zxM6Om0`XHK5OR&;keg#}y!0=kS~0qhm{y^jO|=6Hq{v??W9?3xu#fn?vg{(r?| z&~oD-V(sXN3cTttK~@BW3PTs5DV*`Nk{FmFAZ8LN-Org=8>F0o#-dviK-Gqbl;CiX zXjTm;M&$l)9r*ELbO9D^mhs=wz_&~hG^FMc6=C?=N$@>2ShxpDf#Ds&;7tx2YJrLv zq$0iNpyFPHyGj7BB24oRNv8o*ELad)D?d~R=8zsGDLeXd2i}=5yU^Kf1U&_qEa!s` zn&|-pLT8G?_Xv=|wU2@+-_${ZfBpvp8@>TKhRB;h%p=6=psq={-DZ2B?gk{0`ww6~ zN}y$&9kS**@)&-gBLCkxjah-qo(Ln9y$EXOf@|mfMlfs;M+8&8fWlj*5e)mFcMKO% zh#V|bvVbYTjMHQA`z;hG?5hDLQZycZYvn11xaG!wGr?5+&j&GRSsEc|$Ck_k#R09Y z!#`DGAg(reW9=ab@oQrOX~;>e5W(3Jg!RfxiC`)PSib5Aa|-~bM;;j2ZVoE!3d4P22j{T zkV6sna=<`MTo&=EtL&IfU2>$H1W>wPIXOG#h8}DUBM2GAOTWR;qR=O%z+X_dc&RrS zIuv>wev0)5;|m$`@Y_QKZ-cqZdLStubm$0d0KHWPI+SGzg+G3t;HBz7_gNusd9f69 zPdmcvJ%BS1E^h;@j&Nb#|LH!W-$Ap%LrV0*??H=?!v@fdzW?@TCv04qBlO(o|IwdI zuoXDa86fQeQk6svsG1&G-X7C{SCRA+qks*ObmhJOBTeErDF=FyxLPn+sB@AO!p~j8 zB!kzz2n&aS407+Kkb`=P$XKAQK?(>>vjK(>TEgJfCye*C-G3lAc-~f1m>j#F9nj+#6t`^;JNF6 z-4;e-1r{wpsGXZoSv&~dq3p1xVS)ts!7RZ_42)r&BzQVW!rGA{$Oxn%BRO>l_@Ic> zpl*7E^-cjUMzm;f0bWJ8MUu#n(Z7>q3D#u)%5-HV|F=WvKBY+(%Z3l&IQ@dZxNW6k`^d8_5sNmNOFP& z;7Np;T>%#(i(XI-Oa)P7kxQ5nn3od4Y$Grtgtz7(;;evm0soS13Hp+-ZNNZl2j&@j z(8LYc0-}Q(FvR{kXpt}Rhs32U@%!L+*}(}SV_gv_~JaWArwAsn)Cz;-^NO+hlYB8kly{z zTcCuuBLyJ8mlzLJD?xt&W&!rU+v`w`9|QAc{<&*4Q(K^lB8(A;G} zeGHHoA26Z)T`%NIa*F3yv}w>I?$HLkA%QH`(#1eraM&uItF zXVyT9cwsoa#*+n6O(HeT{022+=|MjW?h+YNCMUz97wHMhmWQemNi38A9D}gak%MIo zp4@;1oVR}9l^LK+I)a(4gA{iy}Jr^T03*8-OTdsBs8Z8Q4sUI7bVhauQK>LLSJlLS&pU1N;Et8fPLy zHP_)zUBCE$G!pj@H8;tS*$F%FJ`^5)&qNJFn4{`wh^dhL3S?PGra<@)4YV>yaR?%p zrQwIh`Qg`BTp(9FSlpFcZ~-3)Zu34-K6?EYUX_9zZXX<-@4*?q{zrW{BpnDFqV36$ zh?D@v=|T&_NLRxKa9k(>BSajxKnF5pIWfQc@4#U)VKeZ@tzZ~>k(#?c0wpmB zlU4(!N8V}In*@CDj(f!XfjDHg5Jy7Ekqq(f-9X$Y*Z@M$2$%=1x5(} zCm0L|C%6paZu<`uxCYPXyNCqiT_9ls8#QGp7EF24!13~4YtYCF5 zrh;%|k1);i|L#20&G@Cz69+Dq5$dBOFF?~e<1Nw%E|&{p;DC8y9dY)8kdXj+0p^r5 zEQ7cKJ`Q9wAkF4xfUK8!d8p`_LCvX009zq!D-ZYy!rAHs2B&O-5{w;OGP09C1?qDB zkEQ%HL0x>j*$6vkMu!}nDj@SBvYXIeAsL>yyzqpTg@RfO$S>e4UX#(H2uZi`_OHoL zVxYkia&KtS8Qu~JI56-*#Fxb2RZJ|Du*E%po*ZeG8PNziU4*x|6|fa-pl=cyOW3g# zBl2gAKyyYA7Q9Yu4kZg{y{#=V8B#VQho232gS-!r#KJIQUgC-(Ha#6~DA)wM5Jv%n zf_L1&-QFh-112AI1?(E&!!}_Y#NixZhZ+mUfe$Hs(HT@`g|Jf~;9P_~l8Fq}9HoFS zPhK1-c@DqBPl_WU;UzivOyuBmkb}=f1hc_C%)v8%r+&Z(k12Qz_=#;lg*>)+6ax5x zFzAxM(O@?`g7BF-z*|BfeL#;It{?tW34TX{76h9jJ^_&7{6)Z0NP5ED!JZ1Fhfjg@ z+#`S)vjE?f1e`Dg_GDJa0FPt93S5-{TpN!A8FEE|VN(ZeHw_V{q65q)4$?K=f=h^Y zF~GPwkREda@bSMOLO(bO_?{>THuOlkYB@-6KMvBFaq&RWUBr-W3|L(TWZ2LKKbVsS zoJs+>SPAe^3gDA6lmWY*1T2N5U+(}uV@?jFZ@mG6Vi2ZMyAKRj3h)yrR>G8kv_r^g z91cD;0zV@mIe3)SUF-9iRA$wPvZjLe|$Ds&_ z%8!a2!&XKUZ~2i0?|qaHi-jJjGrOZ{I-#{**fk$3!>9MbM=$ipi;(L#@)Y7*w&>j( z1gHQdO1gs?O)Sxa_92j|&{ShD|)kj50h_2zw_fFb<`J zgFf*>lXzCB`wtS&2y-y1siVoTRJjK+<{xOhHo`k;AO<}_m^%ZUakyD2uoyj3ii3xn z>=1Ehu?`mqV)YL2ef;|5NUSDy)6tgIj;)T9AHleH8o+$&ZxZ#ekG|uq{e+Pl6Mg%y$iSj;ova9a|qKU5=Z*K+foc)5CyU@pMtr@9YMj4u`oJV zozMTr4D5!jV2S4bkJN0q7H~^82BbVeiZ*^nD4K@~S(D7epym-I zdGI4(LnM7?k*MUq3*z7_+=Fe@!AWKOH<%s=+kV>&FrN-?LnNjEAKV{!P=Ndg2lX0B zzz64K4RgTi$T1+Bg18yMksNIG6V|})q!;me<7{B*9C)!sNsxZ9A@{HY`~Y!PHQ|8U z5zZC|zd!I!gTml}LM7s@xb+DPyT~oXmn<5AAMml4@uSGWcNpMe+9ZVHKNqRQxxNM) zz{z(R44CgD3glLE6O0$zV|cuXPoq%KX+do8!T8jC1LNV1jEC|D;0%QQ_5nWu-%67> zZ2+H2ykJ|*#j;~c;gZ2@VWx%xvDg9({}WgZ@es`nH8Q{kN!S2Z?_rSR3Tyx|N|c}` zh}s_M1U)I>!dH>%HJAXaBk3(dfDbyY>&*X3?qN@CEm=HYi5>xf1`IJtW!qbOkFq5o1lS~qe+r&=NY5DifS%bp=*g#mdk=ap0x;iU(DSJo z1SY=3#SS?=h3B36RV)&uGoh(rxT;#%05%Qz1Tpatae5kD!y<7Xz62$Ru7eFgba@?^ zeA-AI<9VRYB!tas0N+KJyA1Fg!h*d(6VZ#h{HN*b??Ka-;EKRezYognhHF;7eo(W= zXCS!>wt$1{43N@*6g|@hs-j1ho$V;#QwV2I1D3J{-Sf5dKkvA)Lp#%O_vo5okt6Uj zXm=HCfZGipfj7Y-oP!PEbWQ?Eb5X`aHGA;y)?q7Aa{4X0I$CYw!z{N;<;XWZh4;7Lu!3dIbk+Dw*A|&4dtDx{X zEUE#n9$ZWwCRAU5Sr?)NcZCo+4tpEt|H1zh{C+&eU0J%mO>w=e)22KDYKtF~ztlT# z_W0w}CMOK}ng>AP)xBs3~9ran1ns@Etix&)9TsoS?hU*mA&KcF%yH1|h z@qusexnR7;lC7JvQlPi-GM~-kES^jE-mU#j`ckZ&ivuB*gM+$z_WDJ_qc00?W zCv%)EcD8Y-Wwu)0)puIwYv>ExqL8@XxWnSw0eKG##Xfmmc{UpVODyn|*ENP8WKkNO zL!P)S-P6r#lKf@vtt~@2!DdSAo#`P8x;74JcNMlmn0d<|)vA4Kym3=y;>kX(117F9l_jYiIx5)HQW{$L$l|b^1;_&7QRr)wNJzdW%)X8aoG?klU=y zj~a)qJYMr_G`P{Pa6Zs_rYcxyMk;5nycj*pH|W6M;+KVa8bZwne>&vp{;YTOC2DiP zlFT_;(fEEXdZA{JZ*1jd?$oa{Cp=PEhH;U4;dZA(SJyMr9ZfXx<+GboCcRg-^M~7Z zO#C4;lQP~t{XZK*7T;4cb4vF;^geUQ@|ojT5}IzMysQ~4V|2NZ?dCaXtZ6b=uyJQc zKMbD|^Y@-(ew@Lf^Ff;A`Ao9)=c^NUC~Jurw4uYd^nV?B_u)F4om&dGRSO zv2S^gNAsuQs~ddv*QH%^xK|b=-yh3M+_E}NR%c`q)%+{UMzxf*{s4Ey^0+0+ZEvi6_85;#4-*L(387B>w(J&uW2YtqyPz!5 z!je`sQYTFz^7Q3&7Dt}<=>_NUrDsoGe#LngvM@)w{8(xj#vCbbI*t}edUPYv1-m@P z6|sMG>s!kZ*V+-DfA%Sy#phwp8@{l@;$%a6Z+BjtkDlV5TQHBMWm{f>j#_p>;S z{qf}bmoC`^xlwq>Shv*;M%e`xNM5y16jI8&-Rg9#`_?-$YQ>u!9&r+;qpZ3cU(9vA zaBa?a-A+b*r%8Mt4$KYgP2ZG7()#dj}GwtoIIv$wy}k|n$uu#D== ztHOomSMP`X)9zl%x;^P`|00j}wLIlHh$$+=_lj7b)>|#Zv6NBm zwda=wuL@{WQHW7axbO4(9q%v`61#=mAQ1MH3ABMF}iO4X>UbydZkVL^pyLR`)4b&PV6nd z?JwRIdD*63HA0_n;QM}ke)BO+?h3_U50fXVX?1l^Sa1I9J2tH8;f^wpSD5e9`r-ZT zuYv*Y`pG|{Yt!@dx0Fv>bPjBtO8*=DYj9myEA8!XW0lk_5oh=Hy`9-WjKTW>@1Gta zSyepBwQQ|M@l4!Hid{w*thIZ3TnG8XUR9q}mK<%q6kq?_!&SjRYu0yZWP5@m>X!}o z$#=5#2GhBXd|Dqj-3RRxvLp|2r&V|Mr9_{~=fXAjt@jCee8{`F7TL||di^3hY4%*x zdaYOAZ`U&WDent|_HS5IUVmssU6i1Wm*eubDS-_dGp3J}t%o~{Du4A=6%=QI$|VkZ-2W+O zZo=P}M9_%rqqjxDuyPIVQed|Q`6Kdw+OY~&KHCL}zG+U*OQ@2NpH7W8)I9Dlo{{i# zI=xtNlDgppNf+)2OCqs6?_S4$UGO*TREO?;#*iF&M0&&9LTT$~+(5VP$8H*RsRify zBP7}->8*PkQ`wpg)4`*i@+Qhm^pQ32o@zmNfraQO^T#v9|yOs9d6r2 zxNVQ%ww;07<_Ncq+YD~pzpAS$-#H3Ya&F``G`zSh7r4bB@9~d46XHixC!+P>cNPRG zgQy=MG2ibLvL!&cMhEaD!aLUh)ANB1ju(X&1`PC{)P4@1L#D8O_kH}Xf#@)!J$=A_Y$mtji<*(4sD{9xMSaK=* zS6%epvv%*nkL0?0W*SAIEv2j3`fkJ7)su9;{ja@W@)6tJveSK$7=M*S2Z!CzpxAu$ zLNjHzZ#=11_aFXV?A7FwnvY@{0dKAvIDdH~Wa(pYcG+4flB(^MVRQNMW1fDIXsGtw z<&d7(vy+1T)psfEZXU|K{J3E5SGd=Sr(Yj3K0SOkUG=@WMbWiM#^;}&jJMu0eB_HM z{aeZ-X4N1m_hg+<*BT)nP*UBtzCp%XUuDethe#<@S=>=)A!U2@l(`u%8MkL!@f{6GKS zxee0>9xFZiJFMR|Ex6M=A?hz%N$-SrUT`_q2yUQi(|UCzefD(<)FiWp*UKDm@g_1t zzmJHfZoU%l-#ZtN9?vz&la-7e?F)+)@^F4f`Eg!48xzUfH_>?_H(yJ;2jBDHZ-eYe znJ2gLZhb?K<}SU9H|E+`&qlw;*C&fcX?35UXpS=AeUmHOlqdFy?X;%P??Cn`zw zyV4F!WIb=z6xuhe*=MesFybVh>yzwr^~L-VM2q=vsB8Y9H9V$x=y|QC->sk5 z0_I-lh%Z31`6~I}tCu#*{0eMjo{O8TI@Fx3|M5)DAX@bmi-F6)V*BMzyH6KG@j`FT zU+tdIc19MbPyO#f%+KADqn0C5nk)A8Ro5chFiG)q%mt}_@CdIb3bSFbNugufb;O`iR(}Qa1}_U zTH#e{S~RO>@! zjw5kgCkxMCZBqQqQd0J`N`fiRR-X1|v7F^$+b`7aBXvVqb~mYK9L@d4SoO|_>OOa~iv#1Gj%58T1c^@Qr?KkV_9VP9#Pdw8u{rZk( z$73H?NzVA@gf5zThMg)sls)5g$f&STzztX7CcwxV@2sP`rWSLy&M#5Z@O7Lm1@5dH z^U-YE>x}o6V$^$=g9P1cm=l67c+8CZUdv)@i0-1?9-??=@1Q9r>G?%3=*^pK9pQ83 z;}+U~7I0*-OP+J<_K#YPHU`c4UOv8ccs|8J@^9|8P@#)#hSG<&#?v)Pe<#@tU4O_u z!R3EezjWtOC`Ti;$(_CMJ(2YNG1;Xf#{%TfCas3ix6!-UJzdl6;;&aer?!2)&8{M@ z#Jl`?p33322&v47n?WK><|`fC`^t~zXIZ)yXz0#aS4C|v4_#}U4#6$jzl*m!a#5G_WkkwH-pL2J#b^Y#D#T9YthhJoB=`>vDOQRQGBzHU#ZCeh? zF6I+H_fog?lbN7_`THsJP>u`6$iY> zJyfbQXu7h%xYk+4Zg#zj4hnB;&wFEMc*ROPdDC_Me)zFNrE?D&r<_iCDbQbg5cI1# zXHx$pe~wLD1}{as@i(ESK(bS<*Bb^!xUB!74##-uF>DW4Ke*G@@yPxNHlO*7=?@hd zI!k`?ebiaa%H1-4R0w>fM~GDL8*+q51$AjtvSW5GB5?{oYe)${o1!rTiIOjw*fGks zl;Csl=0nPZ4)6zR3h|){Ve4+89!FolU9wBx-sgq?t(BEGPGfgdMq0c|vMU5Q9$TN4 zfHK8xbzjz`ZD>pCe*UN%PA^10KP1UV1<2YDK8ZAt7EV44p zrG;`rKPGHIKjt|b_K3n-Q&HwE5ATjkK6h4Rs}1Md7YlRvej3uXyzW&GSUP_9L?!9D zBflHIs8OqmT?i@?I(oPDC_~q`8~pMoxM@3srhaDQ)ON<&xUS{+o?-L~dOLh9LuQMH z(_B9AB}35R!|Z-n&QE=qIV5%B8&j@h`Qt_0Xd^WLmfp)zp~e37)ccdV)~`m$1HNuv z8Iin38fwBC!*-MQ{QLX#YiryicT~CjE+;*3u8{V2dXD;~an{@0gjBPPX0iycnlL^X zRE$}<+RB4F9DnXYX;YFkD|b+?4hUrJw+{$B6Z z(NNQ#YANm1ox;}j{eE-Rj@H7f-~V(q{BAT|KX%+d$^8!RjNpfWZ=a5}KfTj2_(SE$ z`h9-wXkK~W4&42Hxt377wDBpQJGGu2Pvl1d+y4Ka0G^bnn2Mt=Wh`To4pwE(}c zHkH1NwH4SJb_{#;^VLepIQv_?b@O z;WOgTId(5Prv>-rGBp`nahsFu0Jd@ziuti&t}1V>S4B{TB_U#4*fScsFn40!|9}>kt2g8 zd*f@Oq3wzmXA*Q6>%9_f)m8a8c7EsMk1%QtyM~^R6-@C-59X7k{P<;E@?!3<-W48& zIo|kJy&sgWie628Bv<(|V_1pqh$D041rDvOS7T@U66zR3yLr#>-Z)|yB*A^iZz{Sa zuWl}$?_T+xO!3b++1ZFEi8Oc0pJuj~F^8nR5WO9i(XA$z!Q6VyR^et)H_kDr@E=>2 zk_~n5Te{h~Z*dAwT6@mPhegCJH_#Z1Gag~mWpKNG>%srW-djb*wQgIZ1PvZMxVsbF z-3jgx+=9DP!GgOK?hq`vySux)ySrRg$ol`i?|Hbd_u)MDIctuZty+UVq>uh3g|0|a z8OsRq4xf@7^I>L9`;*IGucP#xE=d@Ewt;iS!X9H@mc42cL*zQ|QZRm;R!GbYin9PH zS&^ELVU_DxJECl(!;cqDMy}ao5w#Q&V%xKjSf>6oyujLU%uCj~GhwrxJtU+4(kNb6 z98w2ZmAH^2XH+Td--tq(AUY+8XFT3&TeD<3FARH{%?+#CULuNEw2BtnVUrkaQXx9B zAj}(K3#`vdJd&{@nm-^@u$&hsN+|)v;E90Q!j+N_mpg7b&6JXGoM4>~l#&|vvvko^ zCgBVe65$r8N=Tp3=R7~AL&s_nj*!L)w_Y&qTNV=>P;dL$=M!K|2AJxVlQwd@h6GjN zs|i{_C5tzAEIeJPn<{c9N0T#Qn?NY$x>ROtrdKW;w&l%Q7!IbQ4mmLd+77ddsrNl= z7kkvhPI4~}8@JjTUXnj0Fu7y9YfH?fiX6_r$(%hON&Zxmx?}U`>mNbD20wTJ=}uuV zU@DCkc3?q3Yv0B%!GVab!1YR$2w<@TGUeYw(ej<}q}X9UgLydqTeT@qJn~K5sxl#>=0AsRjI3A z)n;)d5)VGkxYJEn;{Zlv1T?cZ{Z1WPQNp35-Yhu|vjXEr_q!hlMc|KHh-O>qP?BzG zkyXUZKDsX}Gh-#@Iv*A?&J)^S1p#sNCc`K-P9G&WIkF@0;%>(*!)U866me;TT4hV; zVx%BR6;#PO&2mhC;VRFDJ2rZ(%|mN0&9 zu;o6fMruTpKgt#ny-T-7-*hgjbIITbbH1-CEBX2RXiOMq(awSTaX5w0oM@whdg5n! zfEUWm7+rgS788KMgc~}5r!i1wFNS?B3LGDL&RLiNJN>ucUERso zHWBCgp}Xd5te38HTYK&{u`)ihTOadX5%^2TWp$BPKO|0&sr~)}z3=TPcd7tUxTSEW zqXv$TW$%qM?1RXONkAFn>!E{X8lCX zzF-OaXthOvV3Nh2>CKuEeU#~wa~faj1zznXQf`S*o_=$3^?K-vLr!XCee1Gtk3eH0 zISo&$zR3QyyCT^wRDM6WeegDxV&aYHR0@zau75UfK`CMn7uRjdzW#$_k9dF^MpfuU zsoXC&z?#DSq`jfz0r-8nZEP2xbClT4W5^BNSY|q4St&bVW;AE%9KQZ(X><$Wne}4P zpLT1gTEi|wTp$mhhB#t%gm4;vCz8Q7bxD_&JfuUR-_8uj)sZYdh4v$HI?y@FwYoLN zcLR@!D_#oz-mU;uj4s#d7|eC80wR{S@Wb!~D~{(m+(i?$&~!h!oEAS#1t)1c`iP)( z@XQ)u&fEX)Zj61(%}Jmy49jIH4(eE#ljczTM{*{Hz32)+{f!B8VZMD|I z1{cxTCry_HOCtRu&*HN+idglG^rZT_cdbhH!XRFnzmAt`M`E{Spjt$ot(JVAFU9}Ctco3 zhm|PPi52lXR!x)_Co*A^!Vdz_*MSQFZ&$x!0N!|$hQJb6=~p=e9R1%r*aD`#`5EqF zl>}W4@;07%S_BPA^m}Y0X!%Q9KB<5keFhb|Dr$|4bKuAJ6e2m@=+6{&mF}(l`zX|7 zkUHLzzrfqoU(AS3!$arfD2R(I5s?a>x=k%|Ks<5wKuWoVdMpEb=hQC}lu4-pm@7-r zHY{bn&D)Tls-j?#erHqkuQMi@6^hagyXGrLg@5x*4y-Fd3M`J#)J%W%&hc<|*ne@l z3PH{ua|hS30Y(&lP0W1wCS;hG7s1_GC9k>y%*UqZUyjF_DtJj7-;!o5+|8Cg*po75 zY6h+YU)n5^yoR{*O$|j~wMUEJe0BA3EYXHELy+^f90)g;qdSj6`t_|c;Y24XQ}?;u z<0wt*hR$wD808IYL!Uc8@64u%8_U?TD_*a0U&>Saam1i>(I{PIZZLx~QL!)<;RgRo z0_t9~!Jkz-Gub>f3$#Xq?wjK!1emw^x5{KPE&np@E=CS=&0Cw*h4XYL>9)!KhGHSD zOwsH@>7xBvfG)8iqlg7@=~{;%;LP|6%GPvcy7oyFHsHg%jBpC@PruU}9tygK*stOb23~nU-+_S#{#yo~`2SM|qDKA0ibY_;iT@I!Ozb0H+&y0R zu|COWiS4|S6>fGv%j3NJn{oHER|}$Vj`U~2o-K_aePPw$prEmNI+QRiv3ygCMC5Iz zQp&grYQpKL{j9#+)Imnat4`O{%5SCD8i$B3r6R4{<93$=Z~w;Rj)qW3K10H~!GS_F z`aSqCSc`}n1m&%LwMc&koE0zzQY>`;Je4w5UF<2p_CDW>9btFBszxfDGykauVc@_h zhA-i~N6<`U6k9KWX{oatcpF-nkt(YkDJ+C(Btk11wTO`+N{Q&dH(H^Xd#W~VzG)$S zD5dh{7V^Pz3c(+mY@YIabXbt0%h%+YA8+9|GYvG2Sh;Kr%bpk~{M5Bo7E zLOJZfK&a)&2+V3AJ9PiCc=V2EWib?w8dh-WP#3#C zH5=OZ0aC?6giZVd_9i_xw&-@d?d?I1)7dqGv?|AZmBVeNPExH~4!{YQl#~^#bQpDb z8Ubdwa}e_#k@^=6fF#^82}#ePSOp<>Qr9s8fq#^hp)9gg%B^P145p%j8(R%;plI1_K zp;OZ0fFw`P?bHJ**`&$%OvQuQ7|P?!v5J1E3J_{MHoi0H0wAsoySAGi>H(J#)#xS!U=2z_zq58Z6(u>4vbdR1vhhVctgTB4zrr7%Eyg}iTX}#ck*u>H$36`b4dKBeF%1Ej=J#X9eiF8D=IjCvr5yck!ib!X! zgop|hz5>wdj)jcszOHKmTWrb+?~e~daMCHy{um+jiRUwP?W{FuNTU@)zb?D35ft5O za;L+f!kJ4g_z_XiO20956VA{Gy~2xihkYcu7Kf8+QOC&9JDc>F4{C7F~tw1 z_D0;ytf`DjS|ln5AF872ui^F zsK26uZ$fc_owY?G8XvTD8-#n8HLL{nA?(}mSv*C>tY-9(ntmgG;+ud*JCsV2EDkzI zK%f8o$VL-~|KrmrYXViVcXVY@phyA7y;C~81eFTOZ3#kWaVq3I8z+c>W<1LMeJ1I> zqfZgw5u$FBQOI*6J1e6*&t+vNd2}9!wy=7AH>mnWEILK2Fa;jLDiqcEzzW5=$b)uf z1`e%=`y)CvYUM_cbot#_SwkJUI$5v+4l*TpTyR>yq;PMCy|DH(UkI<$R!GX@gh&DG zq;QkgSHos>VcLcTB7A?@fjs?rFHNQ3- zfbtVJmQ$`^1vbgAxa;ST1!FR$8u<_n47iS{ZunkeJYjn8x>zjn<6 zfU;Z4C7ru4$aM;6;CeucguZcKW-CHeQUtxbUB@G4l?YF1N!vsN))!R+n6#s?-uSPX zE<4Q_EA~Cmz{@VR=PJ_pn1qcd0^S>z@eX6Ofx4Za+&ktkVKld4*&Xe>6yaVOJL zm6a&8aHe9@(PUQ}wXl0tLbLB zaV=RQ4dyazBphGXFyV~IOgUz&3mygb{eZ0E=J7}~TC2xN2=sHy-B*TW_EI(iiHBMO zRz|4raUE?-%5btHXM_vVAE;KE+Jg3+68NF~ zjnlds|Gi#P56%AZU3ov%^}f;YpIUx}H}&2B)$$W)BHM$ajsU#}-(r}3d($TkLBGj= zm1cqMQ*T%NR{xD^wfujgF75wER0rS~0Qn;<2;uvLv8(f)k9GfI;h8@eri}FcekXd2 zd;}gW1IarC&4T%(VfqU@68?d4KsjC_1~8BRdeJqnw-?2^1PYwK>8AeZCUMT+I=#}5 z(7()mkw4b5-9y*FgZe-N&+1`ffJ)PE_bQNJ{+VUIO)EWz-I=HNvD$3yqzD&GU&l<7 z`aT;jJ}x&mw?4PD?$*l7koV;DHH(T0C)ozmDR!|}QdA~8B6kG#@G!FEB^qdq%ScP4 z>~An-V$DjX{>%=ke0)rCe7P&W<~HX!d@O$6DPgkJ`E5tB*%~%OU`N=fa<9@(4R1c) z*r;zbQVBpS50_O5l;oSXO(wCk&hr7sn2Nl7na**w#>CWeiI(o&iZNhL*P1EF<4A@L zB5Q~oS{fp!AxW1;Fc&vy{#mtP6m1y{r*9hf)u{z2oW`|3cF0ju7^gZZ?y1HZlqgB~ zOi8&VsmHB8k0!P>BaF-w!jN_PNwAKcZ(@8~3=RN4^9lQQx~sQCNjXVSVz@4tn>r>Y z-iZKj1bMo|fWI=jP@*~~sV-DCYGsj;rrr;O<+?UwbBg9VyX|v)BUj+@6nME?Gb%`&D*)$vN_uv*!%uS*Uq>u`+~!J0B(^=d}l)E?K&Q! zceE(7=Cp~MaN_Lmx9?xZH-)ftvcO-@1NGRV1=4RkvxaK{-QtEE>95W|F~nULZ4LSA z#Ox0yyVH?3#G#931?L|q5qR!=v-jK5jC3mMP-O&g z_f&Er{rilgyL+e4Y)0ovIv!YnU0y{8{1Y!In}b zH@&U1_%oE-u0HG~x7K$6`0O@rkL4`F`uY_!4g*7`hQ}HBjfO_(b2{q!Y-YWSq8?pZ zH7zXA#b{l11k+{og4x4qUI3?-4O0x@)r`Hm@`^bE8{8{()2*L9jZ}xxaURlt&F&5W z{rXv}MSqZ=(hFYG$v) zF^{f(_!lW&;6PIL(tM$n^NnjpD6J-efwEL}V|}P+{^3Z9v|%xeRF83MJmV=q5)mD9 zt-VRf4&A=P7owHkga?0c{`uaH)m3QZfs<#Bk{aUBLY2W6K&fWVte-Xw!}>W~ZR{%q zY<<42s0rH9mU0x&)b@OQglkQ8gvpGU%S<8Z(@5q0pliHmya{%w>rH)<$uZIB(kqFD z?B~(=mcdF@owFeev{9HQSK~VX=IBN5N9qwclif+7H9IL3i`Sy`e2OwuXD-;*Ab~xww?$9TefcS(ICQ%Zkx~!Fcm|1iy@WBb$3A znPri~i>r~fgyi?)KA|!I@IosteIj2}1t@NN`5hisM5i)X;-bTo=yZ+pBZ}>WIs;aO&0 zxNah|TfVYhse_8);@La2MrX4uyrd}O9Dk0P_-Z+-6p@Yn#DTRpG>+Fb?)Mufb?Roy zeI;8|tGukYLZxm}3l|!_a;KB9_ARUU8Y1UjBp>;hhQ!LI3QgCO+u`@sTMp>1#IAH* z&EWmTUvgEiUD-+E?zj$uJ&qOnmdXqD;o<~Z3Xl1tm$j%L_BI9O6;bXP*6E(Pi|kT_~lM4T52w;G#D6V z8%-82%VfGwX*P;WsEE9kdG)Nrbv4NeG?!V|y|?MB_^rx(-3m~lu=#fD%92njiaMIS zS$=faO2@ij(^NWQ*|poT7RtESHb<=3jffKftZSHu6S+^cR(wQ`mKGU~zu-xs>F=Wv z;khMV(L95)v{g489DI12+4ZCFC5=GI*uB8k_ zKr(O)Dn)8fa#FA%`;4u@v%c1Wf;pX+&m-7)*?w<)Eq&jop2$q!1{B3!QMSUZIc@71 zh9}5E8M4vx(XE10BBYO%!v^z$QU!~xCpj_s4*Xw}!XWGa>tKp0++Nxrk%#&QJt2<5q5J9g8tHu+AoXV~VW z=6U!JV~gfTh#KNi+X)?6#!F2eI^Mg_0fPrNN`|z&JyUDxtV)}F6Q}D-fns;mo9-?% zKO5_cTR{1c;|(Iuxo%jReeIo}5Fgc6IvOViY$C)czk0giK9Xs7dabCQ2hJv<&wy(P%xP!%DI@gO+lh<`(`<@#^=4*==F+8+_J znr+|k!SdM)5wW*57%rw!l?(6rSd??}YPcd4evKk1AaMFl)q;|;+#6v`JC=kjXei%k$r7F1=l2k!9b@WXHm4)hU_SIHiyX$T(g6vDCrIFIV!{}p*nJy!CPVH9~gkb`E~!7r$yLn z5!dX1-Ddf$5X7X~X(;uZhm1`kq-fkvnSEABZpE!2M$4IU;`fY8draQcB>N<{mD~!2 z;$)>wtdUh`y2!NjyuR4V*2d>5OrI} z49PR_{CtfvyMBYn+g;BwJ~0IJNHT^@FKCP4Z$C)Gt~2hw!n;%|q@hM#x;3K{B7?g=kbRR44ytFswIPn47E zgfyWT{juOB%4WY4aEh0)4cnNIBE&Nk?FA82P-@s085}e}(X00R&_tmEDiQpZu*Yax zM_OQiRhksj*kdQ0fp9~9$9q<6=jDl!ta=;Yn4hV=&j0)8v~>~`ImUjH--*UpO6i|{ zi`9>A2dmV~GSRuvN{2O8r;JBM_seL1a~4zt@7pdfj$6^uecl9tYm~E$AvY zaNya%cO?Jd130-?qToB5oPEC)aWP5e3l~S#>yFc1((KR;6ZLC6*x3YpfPh;t`+tdN zpIRSpKq#UhQCz+qPH;D^=E#}Qg9-UQfA~kyJNTyPHTa|GW%)Q&N(?fNIa>0Rwz5D(a=lmktDL=dWTh#x=+9T;rD zn{L*ZTHEq`n%7%`6@W(KLAMo0^v!r1RB%wx?CCS-v@N zqp4ZQFRz(PezGY9nX7p(8-_RNNrH!FE}aK)2)?adpsaokMDF*(e}M0Q z<{+@N|CxhW&m!A{!AQUW2|{7rfNSJ$-Y3Mg(0~03q7{K<%P`*X5FmknGY>b~_srw$ zFMbev$8~>k1MfSgAb!tOIOX5*zcv}*!~bM9Z&0AMD^DqllrSUCDzjL<38rA$O zV#9^eu7cD!RGsVrw2jmr#32hGrAA4`0gdv#9Xh-9`11^_xE9mSY*!Pu7?30766)E- zwi6WQ4n=4s7b%7)fKA@X{s|u*!O2zfsup|i= zW-`MRMY= zJIdSE_1}R4Czdl(bZXju-~~)fZ->gNg>gjEBYZ}F#efuc5s4^vCnN}g`epkZAo0Y* z7EIds(^hO50J3r~g`Y+>t-G5^?s83vwz50@^V(CBA<(kJUj(si_`&_|sK9LrLoq~# zReAIGjIv9;3~394J#0wI0ONLXTT&U*Q>QY=&AhU=a)}*Wg`{ofv*Q!zJyqJL__b6H zkvSo)Kq2hcw%I3`GNpuw;ghZPIKBEg`0cgxL>i0VfO}l}hO{6dS)Go4F?#)GOH8%t zjCR>c(kE-E_%rhn!wVn4=!JI@R}(j5z%Mb`bIP6o*K(6j>5pNEr&N9(KIvZoOpD%t z)F(_n2bv!`02{>8n&r_|>Z>*FO&4B)#<~KUB|SAZ^T)Rln9mrD4_qkOAr&ogU3$b@6&!uC!S>1d2y{N_kw;7eE@L zVTIvO>DwTPp)(lIpCyw&FTU2+!zcO zP#Oy|Tmr3h_`g^RN=?0AKON)Vri{QIXZH76aoW`RvQnL9+%B?>cM6Q|n^*QG(g#w0 zaWlnLr2f{M<5+5x*OB^p#|x%#!m77u(@6Lv@*}MSiXKVxyDTdOahKy@-Q9E2BQUj(IP5h-1)rsjAv1q@P3oNg*_BBmG?t58< z5Vcf`$VXU4E%hN-UeyYjmo8+ciE?$}I|%R71+nLvfj%a_O1o(okz5&m%8bH?<`_iD z7G#@9+z}7%Jr-9RY88)~Nl1_o5k4pu3*~7c8hK>wXRlB6qnbexlZA%HY0tTtlLRQN zH2XK%*pnIE;`H6q>MKkjL;s{h1?}xtZqxNe&JkwyRd+-j+dui>8}m%izBkPW>_9+TAN_v zH;8Dvaz^-IQ}f^-zK8cn{p_+q}(b1Q;LOT z&f{_&#Gf5YAa55`_Tox?I0#eA4wK2t?AM^Vbtd6aR(bu27t`C>zVJk1 z9r?Eacmt*-o*5k5K`aD)&k`r4?lKB+dCu%$@A4&VcC4d_LbZLb6ZUVVZJZ_9Xgz+ycL{8uK-@{>8>5w|`4#!>LsQx`B3 zZkEYizFk7IE~oj&jM&>u9^q7pf{r}J{#cwRUc=#qu4@gwuG=o(&Ob}VO69e|$_B;c zb>l$=EL`E^bb0t&t_Y-{l_RXKG{V%rnucV5p*ed1H+bTsMk+}i-8B16!9_O&-+2Je zhC^%DG2Z>jdf;1-PPgkCA_T}OqK?0_R#i6u%=E|Y58yo_ZZHr688!{*{Rx*C2+f9y z0c^*>j{9KvUTf>ZB7X)0wS2F&Yje$D*#5TQk)8gFiT~K?X#6)5!=c!NDF9%AHoLHe zV76~0jJpT>)`O1@d=LFc!_^V_FJ=C(hUq=#`d9TWVuB~(H~_|qHDpnb16 zSyJKu!7%?CEr!ni@kjf=jh1qav)^dtJav{wRhmVd3XZ?Jf;h@3&1iGNZ*paY#}Trfl2x&t`N282YY5)yKo}(UxI;!lzsrzB=E?X!KZ$6 zA^W�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 delta 133563 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 Cv|3I8 diff --git a/smash/tests/core/simulation/test_estimate.py b/smash/tests/core/simulation/test_estimate.py index 5354ac96..d2ac4543 100644 --- a/smash/tests/core/simulation/test_estimate.py +++ b/smash/tests/core/simulation/test_estimate.py @@ -19,50 +19,55 @@ def generic_multiset_estimate(model: smash.Model, **kwargs) -> dict: "bounds": [(20, 1000), (-20, 5), (0.2, 0.8)], } - sample = smash.factory.generate_samples(problem, n=30, random_state=11) + sample = smash.factory.generate_samples(problem, n=12, random_state=1) - multisets = {} + multiset_1 = smash.multiple_forward_run(model, sample, common_options={"ncpu": ncpu, "verbose": False}) - multisets["mfwr"] = smash.multiple_forward_run( - model, sample, common_options={"ncpu": ncpu, "verbose": False} - ) + spl_sample = {k: [] for k in problem["names"]} + for i in range(sample.n_sample): + instance = model.copy() - multisets["mopt_unf"] = smash.multiple_optimize( - model, - sample, - mapping="uniform", - optimize_options={"termination_crit": {"maxiter": 1}}, - common_options={"ncpu": ncpu, "verbose": False}, - ) + for k in problem["names"]: + if k in instance.rr_parameters.keys: + instance.set_rr_parameters(k, getattr(sample, k)[i]) + elif k in instance.rr_initial_states.keys: + instance.set_rr_initial_states(k, getattr(sample, k)[i]) + + instance.optimize( + mapping="uniform", + optimize_options={"parameters": problem["names"], "termination_crit": {"maxiter": 1}}, + common_options={"ncpu": ncpu, "verbose": False}, + ) - multisets["mopt_ml"] = smash.multiple_optimize( - model, - sample, - mapping="multi-linear", - optimize_options={"termination_crit": {"maxiter": 1}}, - common_options={"ncpu": ncpu, "verbose": False}, + for k in problem["names"]: + try: + value = instance.get_rr_parameters(k).copy() + except ValueError: + value = instance.get_rr_initial_states(k).copy() + spl_sample[k].append(value) + + del instance + + multiset_2 = smash.multiple_forward_run( + model, spl_sample, common_options={"ncpu": ncpu, "verbose": False} ) - for key, multiset in multisets.items(): + for i, multiset in enumerate([multiset_1, multiset_2]): instance, ret = smash.multiset_estimate( model, multiset, - np.linspace(-1, 8, 10), + alpha=np.linspace(-1, 6, 10), common_options={"ncpu": ncpu, "verbose": False}, return_options={"lcurve_multiset": True}, ) + for key, value in ret.lcurve_multiset.items(): + res[f"multiset_estimate.set_{i+1}.lcurve_multiset.{key}"] = np.array(value, ndmin=1) + qsim = instance.response.q[:].flatten() qsim = qsim[::10] # extract values at every 10th position - res[f"multiset_estimate.{key}.sim_q"] = qsim - - for lc_key, lc_value in ret.lcurve_multiset.items(): - # Remove mahal_dist (precision issue with a number limited of multi-set runs) - # Remove multi-linear temporarily (solver precision issue) - # TODO: fix these issues for a future release - if lc_key != "mahal_dist" and key != "mopt_ml": - res[f"multiset_estimate.{key}.lcurve_multiset.{lc_key}"] = np.array(lc_value, ndmin=1) + res[f"multiset_estimate.set_{i+1}.sim_q"] = qsim return res diff --git a/smash/tests/core/simulation/test_optimize.py b/smash/tests/core/simulation/test_optimize.py index 343ba910..eec308cc 100644 --- a/smash/tests/core/simulation/test_optimize.py +++ b/smash/tests/core/simulation/test_optimize.py @@ -237,42 +237,3 @@ def test_custom_optimize(): for key, value in res.items(): # % Check qsim in sparse storage run assert np.allclose(value, pytest.baseline[key][:], atol=1e-03), key - - -def test_multiple_optimize(): - instance = pytest.model.copy() - ncpu = min(5, max(1, os.cpu_count() - 1)) - - problem = { - "num_vars": 5, - "names": ["cp", "ct", "kexc", "llr", "hp"], - "bounds": [(1, 1_000), (1, 1_000), (-20, 5), (1, 200), (0.1, 0.9)], - } - n_sample = 5 - samples = smash.factory.generate_samples(problem, random_state=99, n=n_sample) - - optq = np.zeros(shape=(*instance.response_data.q.shape, n_sample), dtype=np.float32) - - for i in range(n_sample): - for key in samples._problem["names"]: - if key in instance.rr_parameters.keys: - instance.set_rr_parameters(key, getattr(samples, key)[i]) - elif key in instance.rr_initial_states.keys: - instance.set_rr_initial_states(key, getattr(samples, key)[i]) - instance.optimize( - mapping="distributed", - optimize_options={"termination_crit": {"maxiter": 1}}, - common_options={"verbose": False, "ncpu": ncpu}, - ) - optq[..., i] = instance.response.q.copy() - - mopt = smash.multiple_optimize( - instance, - samples, - mapping="distributed", - optimize_options={"termination_crit": {"maxiter": 1}}, - common_options={"verbose": False, "ncpu": ncpu}, - ) - - # % Check that optimize discharge is equivalent to multiple optimize discharge - assert np.allclose(optq, mopt.q, atol=1e-03, equal_nan=True), "multiple_optimize.q" diff --git a/smash/tests/diff_baseline.csv b/smash/tests/diff_baseline.csv index 5e199388..507b804d 100644 --- a/smash/tests/diff_baseline.csv +++ b/smash/tests/diff_baseline.csv @@ -1,9 +1,8 @@ -commit 234951d2ce5d8629558ad245f509a3ae3b8a9d0f -Merge: 64a96c5 ccc178d -Author: Apolline Elbaz -Date: Wed Jul 24 16:45:17 2024 +0200 +commit 0ffd8adeb0b010452fafeacc6bee897c95862059 +Author: ngo-nghi-truyen.huynh +Date: Wed Jul 24 17:39:29 2024 +0200 - Merge branch 'main' into exponential_store_GR6 + Remove redundant in Python function sbs_optimize TEST NAME |STATUS bbox_mesh.active_cell |NON MODIFIED @@ -89,31 +88,31 @@ forward_run.zero-gr5-lr.rr_states.hlr |NON MODIFIED forward_run.zero-gr5-lr.rr_states.hp |NON MODIFIED forward_run.zero-gr5-lr.rr_states.ht |NON MODIFIED forward_run.zero-gr5-lr.sim_q |NON MODIFIED -forward_run.zero-gr6-kw.cost |ADDED -forward_run.zero-gr6-kw.jobs |ADDED -forward_run.zero-gr6-kw.q_domain |ADDED -forward_run.zero-gr6-kw.rr_states.he |ADDED -forward_run.zero-gr6-kw.rr_states.hi |ADDED -forward_run.zero-gr6-kw.rr_states.hp |ADDED -forward_run.zero-gr6-kw.rr_states.ht |ADDED -forward_run.zero-gr6-kw.sim_q |ADDED -forward_run.zero-gr6-lag0.cost |ADDED -forward_run.zero-gr6-lag0.jobs |ADDED -forward_run.zero-gr6-lag0.q_domain |ADDED -forward_run.zero-gr6-lag0.rr_states.he |ADDED -forward_run.zero-gr6-lag0.rr_states.hi |ADDED -forward_run.zero-gr6-lag0.rr_states.hp |ADDED -forward_run.zero-gr6-lag0.rr_states.ht |ADDED -forward_run.zero-gr6-lag0.sim_q |ADDED -forward_run.zero-gr6-lr.cost |ADDED -forward_run.zero-gr6-lr.jobs |ADDED -forward_run.zero-gr6-lr.q_domain |ADDED -forward_run.zero-gr6-lr.rr_states.he |ADDED -forward_run.zero-gr6-lr.rr_states.hi |ADDED -forward_run.zero-gr6-lr.rr_states.hlr |ADDED -forward_run.zero-gr6-lr.rr_states.hp |ADDED -forward_run.zero-gr6-lr.rr_states.ht |ADDED -forward_run.zero-gr6-lr.sim_q |ADDED +forward_run.zero-gr6-kw.cost |NON MODIFIED +forward_run.zero-gr6-kw.jobs |NON MODIFIED +forward_run.zero-gr6-kw.q_domain |NON MODIFIED +forward_run.zero-gr6-kw.rr_states.he |NON MODIFIED +forward_run.zero-gr6-kw.rr_states.hi |NON MODIFIED +forward_run.zero-gr6-kw.rr_states.hp |NON MODIFIED +forward_run.zero-gr6-kw.rr_states.ht |NON MODIFIED +forward_run.zero-gr6-kw.sim_q |NON MODIFIED +forward_run.zero-gr6-lag0.cost |NON MODIFIED +forward_run.zero-gr6-lag0.jobs |NON MODIFIED +forward_run.zero-gr6-lag0.q_domain |NON MODIFIED +forward_run.zero-gr6-lag0.rr_states.he |NON MODIFIED +forward_run.zero-gr6-lag0.rr_states.hi |NON MODIFIED +forward_run.zero-gr6-lag0.rr_states.hp |NON MODIFIED +forward_run.zero-gr6-lag0.rr_states.ht |NON MODIFIED +forward_run.zero-gr6-lag0.sim_q |NON MODIFIED +forward_run.zero-gr6-lr.cost |NON MODIFIED +forward_run.zero-gr6-lr.jobs |NON MODIFIED +forward_run.zero-gr6-lr.q_domain |NON MODIFIED +forward_run.zero-gr6-lr.rr_states.he |NON MODIFIED +forward_run.zero-gr6-lr.rr_states.hi |NON MODIFIED +forward_run.zero-gr6-lr.rr_states.hlr |NON MODIFIED +forward_run.zero-gr6-lr.rr_states.hp |NON MODIFIED +forward_run.zero-gr6-lr.rr_states.ht |NON MODIFIED +forward_run.zero-gr6-lr.sim_q |NON MODIFIED forward_run.zero-grd-kw.cost |NON MODIFIED forward_run.zero-grd-kw.jobs |NON MODIFIED forward_run.zero-grd-kw.q_domain |NON MODIFIED @@ -247,45 +246,45 @@ internal_fluxes.zero-gr5-lr.qd |NON MODIFIED internal_fluxes.zero-gr5-lr.qr |NON MODIFIED internal_fluxes.zero-gr5-lr.qt |NON MODIFIED internal_fluxes.zero-gr5-lr.qup |NON MODIFIED -internal_fluxes.zero-gr6-kw.en |ADDED -internal_fluxes.zero-gr6-kw.lexc |ADDED -internal_fluxes.zero-gr6-kw.perc |ADDED -internal_fluxes.zero-gr6-kw.pn |ADDED -internal_fluxes.zero-gr6-kw.pr |ADDED -internal_fluxes.zero-gr6-kw.prd |ADDED -internal_fluxes.zero-gr6-kw.pre |ADDED -internal_fluxes.zero-gr6-kw.prr |ADDED -internal_fluxes.zero-gr6-kw.qd |ADDED -internal_fluxes.zero-gr6-kw.qe |ADDED -internal_fluxes.zero-gr6-kw.qim1j |ADDED -internal_fluxes.zero-gr6-kw.qr |ADDED -internal_fluxes.zero-gr6-kw.qt |ADDED -internal_fluxes.zero-gr6-lag0.en |ADDED -internal_fluxes.zero-gr6-lag0.lexc |ADDED -internal_fluxes.zero-gr6-lag0.perc |ADDED -internal_fluxes.zero-gr6-lag0.pn |ADDED -internal_fluxes.zero-gr6-lag0.pr |ADDED -internal_fluxes.zero-gr6-lag0.prd |ADDED -internal_fluxes.zero-gr6-lag0.pre |ADDED -internal_fluxes.zero-gr6-lag0.prr |ADDED -internal_fluxes.zero-gr6-lag0.qd |ADDED -internal_fluxes.zero-gr6-lag0.qe |ADDED -internal_fluxes.zero-gr6-lag0.qr |ADDED -internal_fluxes.zero-gr6-lag0.qt |ADDED -internal_fluxes.zero-gr6-lag0.qup |ADDED -internal_fluxes.zero-gr6-lr.en |ADDED -internal_fluxes.zero-gr6-lr.lexc |ADDED -internal_fluxes.zero-gr6-lr.perc |ADDED -internal_fluxes.zero-gr6-lr.pn |ADDED -internal_fluxes.zero-gr6-lr.pr |ADDED -internal_fluxes.zero-gr6-lr.prd |ADDED -internal_fluxes.zero-gr6-lr.pre |ADDED -internal_fluxes.zero-gr6-lr.prr |ADDED -internal_fluxes.zero-gr6-lr.qd |ADDED -internal_fluxes.zero-gr6-lr.qe |ADDED -internal_fluxes.zero-gr6-lr.qr |ADDED -internal_fluxes.zero-gr6-lr.qt |ADDED -internal_fluxes.zero-gr6-lr.qup |ADDED +internal_fluxes.zero-gr6-kw.en |NON MODIFIED +internal_fluxes.zero-gr6-kw.lexc |NON MODIFIED +internal_fluxes.zero-gr6-kw.perc |NON MODIFIED +internal_fluxes.zero-gr6-kw.pn |NON MODIFIED +internal_fluxes.zero-gr6-kw.pr |NON MODIFIED +internal_fluxes.zero-gr6-kw.prd |NON MODIFIED +internal_fluxes.zero-gr6-kw.pre |NON MODIFIED +internal_fluxes.zero-gr6-kw.prr |NON MODIFIED +internal_fluxes.zero-gr6-kw.qd |NON MODIFIED +internal_fluxes.zero-gr6-kw.qe |NON MODIFIED +internal_fluxes.zero-gr6-kw.qim1j |NON MODIFIED +internal_fluxes.zero-gr6-kw.qr |NON MODIFIED +internal_fluxes.zero-gr6-kw.qt |NON MODIFIED +internal_fluxes.zero-gr6-lag0.en |NON MODIFIED +internal_fluxes.zero-gr6-lag0.lexc |NON MODIFIED +internal_fluxes.zero-gr6-lag0.perc |NON MODIFIED +internal_fluxes.zero-gr6-lag0.pn |NON MODIFIED +internal_fluxes.zero-gr6-lag0.pr |NON MODIFIED +internal_fluxes.zero-gr6-lag0.prd |NON MODIFIED +internal_fluxes.zero-gr6-lag0.pre |NON MODIFIED +internal_fluxes.zero-gr6-lag0.prr |NON MODIFIED +internal_fluxes.zero-gr6-lag0.qd |NON MODIFIED +internal_fluxes.zero-gr6-lag0.qe |NON MODIFIED +internal_fluxes.zero-gr6-lag0.qr |NON MODIFIED +internal_fluxes.zero-gr6-lag0.qt |NON MODIFIED +internal_fluxes.zero-gr6-lag0.qup |NON MODIFIED +internal_fluxes.zero-gr6-lr.en |NON MODIFIED +internal_fluxes.zero-gr6-lr.lexc |NON MODIFIED +internal_fluxes.zero-gr6-lr.perc |NON MODIFIED +internal_fluxes.zero-gr6-lr.pn |NON MODIFIED +internal_fluxes.zero-gr6-lr.pr |NON MODIFIED +internal_fluxes.zero-gr6-lr.prd |NON MODIFIED +internal_fluxes.zero-gr6-lr.pre |NON MODIFIED +internal_fluxes.zero-gr6-lr.prr |NON MODIFIED +internal_fluxes.zero-gr6-lr.qd |NON MODIFIED +internal_fluxes.zero-gr6-lr.qe |NON MODIFIED +internal_fluxes.zero-gr6-lr.qr |NON MODIFIED +internal_fluxes.zero-gr6-lr.qt |NON MODIFIED +internal_fluxes.zero-gr6-lr.qup |NON MODIFIED internal_fluxes.zero-grd-kw.ei |NON MODIFIED internal_fluxes.zero-grd-kw.en |NON MODIFIED internal_fluxes.zero-grd-kw.perc |NON MODIFIED @@ -432,15 +431,25 @@ model_io.rr_parameters.values |NON MODIFIED model_io.setup.end_time |NON MODIFIED model_io.setup.start_time |NON MODIFIED model_io.setup.structure |NON MODIFIED -multiset_estimate.mfwr.lcurve_multiset.alpha |NON MODIFIED -multiset_estimate.mfwr.lcurve_multiset.alpha_opt |NON MODIFIED -multiset_estimate.mfwr.lcurve_multiset.cost |NON MODIFIED -multiset_estimate.mfwr.sim_q |NON MODIFIED -multiset_estimate.mopt_ml.sim_q |NON MODIFIED -multiset_estimate.mopt_unf.lcurve_multiset.alpha |NON MODIFIED -multiset_estimate.mopt_unf.lcurve_multiset.alpha_opt |NON MODIFIED -multiset_estimate.mopt_unf.lcurve_multiset.cost |NON MODIFIED -multiset_estimate.mopt_unf.sim_q |NON MODIFIED +multiset_estimate.mfwr.lcurve_multiset.alpha |DELETED +multiset_estimate.mfwr.lcurve_multiset.alpha_opt |DELETED +multiset_estimate.mfwr.lcurve_multiset.cost |DELETED +multiset_estimate.mfwr.sim_q |DELETED +multiset_estimate.mopt_ml.sim_q |DELETED +multiset_estimate.mopt_unf.lcurve_multiset.alpha |DELETED +multiset_estimate.mopt_unf.lcurve_multiset.alpha_opt |DELETED +multiset_estimate.mopt_unf.lcurve_multiset.cost |DELETED +multiset_estimate.mopt_unf.sim_q |DELETED +multiset_estimate.set_1.lcurve_multiset.alpha |ADDED +multiset_estimate.set_1.lcurve_multiset.alpha_opt |ADDED +multiset_estimate.set_1.lcurve_multiset.cost |ADDED +multiset_estimate.set_1.lcurve_multiset.mahal_dist |ADDED +multiset_estimate.set_1.sim_q |ADDED +multiset_estimate.set_2.lcurve_multiset.alpha |ADDED +multiset_estimate.set_2.lcurve_multiset.alpha_opt |ADDED +multiset_estimate.set_2.lcurve_multiset.cost |ADDED +multiset_estimate.set_2.lcurve_multiset.mahal_dist |ADDED +multiset_estimate.set_2.sim_q |ADDED net_init.bias_layer_1 |NON MODIFIED net_init.bias_layer_2 |NON MODIFIED net_init.bias_layer_3 |NON MODIFIED @@ -528,45 +537,45 @@ optimize.zero-gr5-lr.multi-polynomial.sim_q |NON MODIFIED optimize.zero-gr5-lr.uniform.control_vector |NON MODIFIED optimize.zero-gr5-lr.uniform.iter_cost |NON MODIFIED optimize.zero-gr5-lr.uniform.sim_q |NON MODIFIED -optimize.zero-gr6-kw.ann.sim_q |ADDED -optimize.zero-gr6-kw.distributed.control_vector |ADDED -optimize.zero-gr6-kw.distributed.iter_cost |ADDED -optimize.zero-gr6-kw.distributed.sim_q |ADDED -optimize.zero-gr6-kw.multi-linear.control_vector |ADDED -optimize.zero-gr6-kw.multi-linear.iter_cost |ADDED -optimize.zero-gr6-kw.multi-linear.sim_q |ADDED -optimize.zero-gr6-kw.multi-polynomial.control_vector |ADDED -optimize.zero-gr6-kw.multi-polynomial.iter_cost |ADDED -optimize.zero-gr6-kw.multi-polynomial.sim_q |ADDED -optimize.zero-gr6-kw.uniform.control_vector |ADDED -optimize.zero-gr6-kw.uniform.iter_cost |ADDED -optimize.zero-gr6-kw.uniform.sim_q |ADDED -optimize.zero-gr6-lag0.ann.sim_q |ADDED -optimize.zero-gr6-lag0.distributed.control_vector |ADDED -optimize.zero-gr6-lag0.distributed.iter_cost |ADDED -optimize.zero-gr6-lag0.distributed.sim_q |ADDED -optimize.zero-gr6-lag0.multi-linear.control_vector |ADDED -optimize.zero-gr6-lag0.multi-linear.iter_cost |ADDED -optimize.zero-gr6-lag0.multi-linear.sim_q |ADDED -optimize.zero-gr6-lag0.multi-polynomial.control_vector |ADDED -optimize.zero-gr6-lag0.multi-polynomial.iter_cost |ADDED -optimize.zero-gr6-lag0.multi-polynomial.sim_q |ADDED -optimize.zero-gr6-lag0.uniform.control_vector |ADDED -optimize.zero-gr6-lag0.uniform.iter_cost |ADDED -optimize.zero-gr6-lag0.uniform.sim_q |ADDED -optimize.zero-gr6-lr.ann.sim_q |ADDED -optimize.zero-gr6-lr.distributed.control_vector |ADDED -optimize.zero-gr6-lr.distributed.iter_cost |ADDED -optimize.zero-gr6-lr.distributed.sim_q |ADDED -optimize.zero-gr6-lr.multi-linear.control_vector |ADDED -optimize.zero-gr6-lr.multi-linear.iter_cost |ADDED -optimize.zero-gr6-lr.multi-linear.sim_q |ADDED -optimize.zero-gr6-lr.multi-polynomial.control_vector |ADDED -optimize.zero-gr6-lr.multi-polynomial.iter_cost |ADDED -optimize.zero-gr6-lr.multi-polynomial.sim_q |ADDED -optimize.zero-gr6-lr.uniform.control_vector |ADDED -optimize.zero-gr6-lr.uniform.iter_cost |ADDED -optimize.zero-gr6-lr.uniform.sim_q |ADDED +optimize.zero-gr6-kw.ann.sim_q |NON MODIFIED +optimize.zero-gr6-kw.distributed.control_vector |NON MODIFIED +optimize.zero-gr6-kw.distributed.iter_cost |NON MODIFIED +optimize.zero-gr6-kw.distributed.sim_q |NON MODIFIED +optimize.zero-gr6-kw.multi-linear.control_vector |NON MODIFIED +optimize.zero-gr6-kw.multi-linear.iter_cost |NON MODIFIED +optimize.zero-gr6-kw.multi-linear.sim_q |NON MODIFIED +optimize.zero-gr6-kw.multi-polynomial.control_vector |NON MODIFIED +optimize.zero-gr6-kw.multi-polynomial.iter_cost |NON MODIFIED +optimize.zero-gr6-kw.multi-polynomial.sim_q |NON MODIFIED +optimize.zero-gr6-kw.uniform.control_vector |NON MODIFIED +optimize.zero-gr6-kw.uniform.iter_cost |NON MODIFIED +optimize.zero-gr6-kw.uniform.sim_q |NON MODIFIED +optimize.zero-gr6-lag0.ann.sim_q |NON MODIFIED +optimize.zero-gr6-lag0.distributed.control_vector |NON MODIFIED +optimize.zero-gr6-lag0.distributed.iter_cost |NON MODIFIED +optimize.zero-gr6-lag0.distributed.sim_q |NON MODIFIED +optimize.zero-gr6-lag0.multi-linear.control_vector |NON MODIFIED +optimize.zero-gr6-lag0.multi-linear.iter_cost |NON MODIFIED +optimize.zero-gr6-lag0.multi-linear.sim_q |NON MODIFIED +optimize.zero-gr6-lag0.multi-polynomial.control_vector |NON MODIFIED +optimize.zero-gr6-lag0.multi-polynomial.iter_cost |NON MODIFIED +optimize.zero-gr6-lag0.multi-polynomial.sim_q |NON MODIFIED +optimize.zero-gr6-lag0.uniform.control_vector |NON MODIFIED +optimize.zero-gr6-lag0.uniform.iter_cost |NON MODIFIED +optimize.zero-gr6-lag0.uniform.sim_q |NON MODIFIED +optimize.zero-gr6-lr.ann.sim_q |NON MODIFIED +optimize.zero-gr6-lr.distributed.control_vector |NON MODIFIED +optimize.zero-gr6-lr.distributed.iter_cost |NON MODIFIED +optimize.zero-gr6-lr.distributed.sim_q |NON MODIFIED +optimize.zero-gr6-lr.multi-linear.control_vector |NON MODIFIED +optimize.zero-gr6-lr.multi-linear.iter_cost |NON MODIFIED +optimize.zero-gr6-lr.multi-linear.sim_q |NON MODIFIED +optimize.zero-gr6-lr.multi-polynomial.control_vector |NON MODIFIED +optimize.zero-gr6-lr.multi-polynomial.iter_cost |NON MODIFIED +optimize.zero-gr6-lr.multi-polynomial.sim_q |NON MODIFIED +optimize.zero-gr6-lr.uniform.control_vector |NON MODIFIED +optimize.zero-gr6-lr.uniform.iter_cost |NON MODIFIED +optimize.zero-gr6-lr.uniform.sim_q |NON MODIFIED optimize.zero-grd-kw.ann.sim_q |NON MODIFIED optimize.zero-grd-kw.distributed.control_vector |NON MODIFIED optimize.zero-grd-kw.distributed.iter_cost |NON MODIFIED