From d17189024e71e320846c25fd7d5d2da308f53437 Mon Sep 17 00:00:00 2001 From: "Yngve S. Kristiansen" Date: Thu, 16 Jan 2025 14:28:06 +0100 Subject: [PATCH] tmp --- src/ert/run_models/everest_run_model.py | 27 ++++++++++++++++ src/ert/storage/local_experiment.py | 31 +++++++++++++++++++ .../everest/math_func/config_advanced.yml | 14 +++++++++ 3 files changed, 72 insertions(+) diff --git a/src/ert/run_models/everest_run_model.py b/src/ert/run_models/everest_run_model.py index b3b89b7bb05..a2fa8072675 100644 --- a/src/ert/run_models/everest_run_model.py +++ b/src/ert/run_models/everest_run_model.py @@ -451,6 +451,33 @@ def _forward_model_evaluator( def _get_cached_results( self, control_values: NDArray[np.float64], evaluator_context: EvaluatorContext ) -> dict[int, Any]: + control_groups = {c.name: c for c in self._everest_config.controls} + control_variables = {g: len(c.variables) for g, c in control_groups.items()} + control_group_spans = [] + span_ = 0 + for num_vars in control_variables.values(): + control_group_spans.append((span_, span_ + num_vars)) + span_ += num_vars + + def controls_1d_to_dict(realization: int): + values_ = control_values[realization] + return { + group: values_[span_[0] : span_[1]] + for group, span_ in zip( + control_groups, control_group_spans, strict=False + ) + } + + for ert_realization in control_values: + parameter_group_values = controls_1d_to_dict(ert_realization) + matching_realization = ( + self._experiment.find_realization_by_parameter_values( + parameter_group_values + ) + ) + if matching_realization is not None: + print("Found a cached one!") + cached_results: dict[int, Any] = {} if self._simulator_cache is not None: for control_idx, real_idx in enumerate(evaluator_context.realizations): diff --git a/src/ert/storage/local_experiment.py b/src/ert/storage/local_experiment.py index ef4d88b78ed..4e1344b427f 100644 --- a/src/ert/storage/local_experiment.py +++ b/src/ert/storage/local_experiment.py @@ -390,3 +390,34 @@ def _update_response_keys( if self.response_type_to_response_keys is not None: del self.response_type_to_response_keys + + def find_realization_by_parameter_values( + self, parameter_values: dict[str, np.array] + ) -> int | None: + if not list(self.ensembles): + return None + + for ensemble in self.ensembles: + ens_parameters = { + group: ensemble.load_parameters(group) + .to_dataarray() + .data.reshape((ensemble.ensemble_size, -1)) + for group in parameter_values + } + + matching_real = next( + ( + i + for i in range(ensemble.ensemble_size) + if all( + np.allclose(ens_parameters[group][i], group_data) + for group, group_data in parameter_values.items() + ) + ), + None, + ) + + if matching_real is not None: + return matching_real + + return None diff --git a/test-data/everest/math_func/config_advanced.yml b/test-data/everest/math_func/config_advanced.yml index b9952f51557..fe979ff9e65 100644 --- a/test-data/everest/math_func/config_advanced.yml +++ b/test-data/everest/math_func/config_advanced.yml @@ -14,6 +14,20 @@ controls: index: 1 - name: x index: 2 + - name: point2 + max: 1.0 + min: -1.0 + initial_guess: 0.25 + perturbation_magnitude: 0.005 + type: generic_control + variables: + - name: x + index: 0 + - name: x + index: 1 + - name: x + index: 2 + objective_functions: - name: distance