From 30266c6157618173e33407c12e8f05fdf32df2e9 Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Mon, 20 Jan 2025 15:20:48 +0100 Subject: [PATCH 01/48] Make checking parent alive more portable Checking if parent process is 1 does not e.g. work on ubuntu where the adopting process is systemd --user which is unlikely to be 1. --- src/ert/__main__.py | 4 +++- src/ert/services/_storage_main.py | 6 +++--- src/ert/services/storage_service.py | 3 +++ src/ert/shared/storage/command.py | 6 ++++++ 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/ert/__main__.py b/src/ert/__main__.py index 11808d0ed2c..6b5155ecbb7 100755 --- a/src/ert/__main__.py +++ b/src/ert/__main__.py @@ -53,7 +53,9 @@ def run_ert_storage(args: Namespace, _: ErtPluginManager | None = None) -> None: with StorageService.start_server( - verbose=True, project=ErtConfig.from_file(args.config).ens_path + verbose=True, + project=ErtConfig.from_file(args.config).ens_path, + parent_pid=os.getpid(), ) as server: server.wait() diff --git a/src/ert/services/_storage_main.py b/src/ert/services/_storage_main.py index 14b1626b560..e582588f68c 100644 --- a/src/ert/services/_storage_main.py +++ b/src/ert/services/_storage_main.py @@ -139,14 +139,14 @@ def run_server( def terminate_on_parent_death( - stopped: threading.Event, poll_interval: float = 1.0 + stopped: threading.Event, parent: int, poll_interval: float = 1.0 ) -> None: """ Quit the server when the parent process is no longer running. """ def check_parent_alive() -> bool: - return os.getppid() != 1 + return os.getppid() == parent while check_parent_alive(): if stopped.is_set(): @@ -182,7 +182,7 @@ def main() -> None: stopped = threading.Event() terminate_on_parent_death_thread = threading.Thread( - target=terminate_on_parent_death, args=[stopped, 1.0] + target=terminate_on_parent_death, args=[stopped, args.parent_pid, 1.0] ) with ErtPluginContext(logger=logging.getLogger(), trace_provider=tracer_provider): terminate_on_parent_death_thread.start() diff --git a/src/ert/services/storage_service.py b/src/ert/services/storage_service.py index 10a6b4c7018..017937259f2 100644 --- a/src/ert/services/storage_service.py +++ b/src/ert/services/storage_service.py @@ -22,6 +22,7 @@ def __init__( self, exec_args: Sequence[str] = (), timeout: int = 120, + parent_pid: int | None = None, conn_info: Mapping[str, Any] | Exception | None = None, project: str | None = None, verbose: bool = False, @@ -39,6 +40,8 @@ def __init__( get_traceparent() if traceparent == "inherit_parent" else traceparent ) exec_args.extend(["--traceparent", str(traceparent)]) + if parent_pid is not None: + exec_args.extend(["--parent_pid", str(parent_pid)]) super().__init__(exec_args, timeout, conn_info, project) diff --git a/src/ert/shared/storage/command.py b/src/ert/shared/storage/command.py index 73be6dcd75b..295827e0bd4 100644 --- a/src/ert/shared/storage/command.py +++ b/src/ert/shared/storage/command.py @@ -22,6 +22,12 @@ def add_parser_options(ap: ArgumentParser) -> None: help="Trace parent id to be used by the storage root span", default=None, ) + ap.add_argument( + "--parent_pid", + type=int, + help="The parent process id", + default=os.getppid(), + ) ap.add_argument( "--host", type=str, default=os.environ.get("ERT_STORAGE_HOST", "127.0.0.1") ) From b437827275908fa5a3967876db730d23aad63082 Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Mon, 20 Jan 2025 15:33:14 +0100 Subject: [PATCH 02/48] Add check-all to justfile --- justfile | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/justfile b/justfile index 7de5c605d55..d10cdf7de7b 100644 --- a/justfile +++ b/justfile @@ -11,3 +11,13 @@ snake_oil: # execute rapid unittests rapid-tests: nice pytest -n auto tests/ert/unit_tests --hypothesis-profile=fast -m "not integration_test" + +check-all: + mypy src/ert src/everest + pre-commit run --all-files + pytest tests/everest -n 4 -m everest_models_test --dist loadgroup + pytest tests/everest -n 4 -m integration_test --dist loadgroup + pytest tests/ert/ui_tests/ --mpl --dist loadgroup + pytest tests/ert/unit_tests/ -n 4 --dist loadgroup + pytest --doctest-modules src/ --ignore src/ert/dark_storage + pytest tests/ert/performance_tests --benchmark-disable --dist loadgroup From 551848117517dbbc886ce62a4a15c6e62b841d4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=98yvind=20Eide?= Date: Mon, 20 Jan 2025 14:04:53 +0100 Subject: [PATCH 03/48] Add unit tests to pre-commit --- .pre-commit-config.yaml | 12 ++++++++++++ README.md | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a0e849e59f9..a52dca55a7a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,3 +1,4 @@ +default_install_hook_types: [pre-commit] repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v5.0.0 @@ -16,3 +17,14 @@ repos: - id: ruff args: [ --fix ] - id: ruff-format + +- repo: local + hooks: + - id: pytest + name: pytest + entry: pytest + args: [-n, auto, tests/ert/unit_tests, --hypothesis-profile=fast, -m, not integration_test] + language: system + types: [python] + stages: [pre-push] + pass_filenames: false diff --git a/README.md b/README.md index 9f77ae49b26..0572fa41b1f 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,14 @@ $ pip install pre-commit $ pre-commit install ``` +There is also a pre-push hook configured in `pre-commit` to run a collection of +relatively fast tests, to install this hook: + +```sh +$ pre-commit install --hook-type pre-push +``` + + ### Trouble with setup As a simple test of your `ert` installation, you may try to run one of the From bf7d1828fcdffe29c11101a46f9e75bb9ae5cd08 Mon Sep 17 00:00:00 2001 From: larsevj Date: Mon, 20 Jan 2025 16:01:19 +0100 Subject: [PATCH 04/48] Remove redundant apt download in run-ert-test-data --- .github/workflows/run_ert_test_data_setups.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/run_ert_test_data_setups.yml b/.github/workflows/run_ert_test_data_setups.yml index 6f2f2a0b0d0..c5ec7c0bf83 100644 --- a/.github/workflows/run_ert_test_data_setups.yml +++ b/.github/workflows/run_ert_test_data_setups.yml @@ -37,12 +37,6 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: Install Ubuntu dependencies - if: matrix.os == 'ubuntu-latest' - run: | - sudo apt-get update - sudo apt-get install xvfb libxcb-image0 libxcb-icccm4 libxcb-keysyms1 libxcb-randr0 libxcb-render0 libxcb-render-util0 libxcb-shape0 libxcb-shm0 libxcb-xfixes0 libxcb-xinerama0 libfontconfig1 libxcb-xkb1 libxkbcommon-x11-0 libdbus-1-3 - - name: Install uv uses: astral-sh/setup-uv@v5 From a1a2d59c093239ba6f84636ee806b54e71f94521 Mon Sep 17 00:00:00 2001 From: xjules Date: Tue, 21 Jan 2025 10:33:36 +0100 Subject: [PATCH 05/48] Add integration test label to potentially conflicting tests --- tests/ert/unit_tests/config/test_forward_model.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/ert/unit_tests/config/test_forward_model.py b/tests/ert/unit_tests/config/test_forward_model.py index fe04b0ac5ab..362cfd3b7b1 100644 --- a/tests/ert/unit_tests/config/test_forward_model.py +++ b/tests/ert/unit_tests/config/test_forward_model.py @@ -305,6 +305,7 @@ def test_ert_config_throws_on_missing_forward_model_step( ) +@pytest.mark.integration_test def test_that_substitutions_can_be_done_in_job_names(): """ Regression test for a usage case involving setting ECL100 or ECL300 @@ -441,6 +442,7 @@ def test_that_installing_two_forward_model_steps_with_the_same_name_warn(): _ = ErtConfig.from_file(test_config_file_name) +@pytest.mark.integration_test @pytest.mark.usefixtures("use_tmpdir") def test_that_forward_model_substitution_does_not_warn_about_reaching_max_iterations( caplog, @@ -490,6 +492,7 @@ def test_that_installing_two_forward_model_steps_with_the_same_name_warn_with_di _ = ErtConfig.from_file(test_config_file_name) +@pytest.mark.integration_test def test_that_spaces_in_forward_model_args_are_dropped(): # Intentionally inserted several spaces before comma ert_config = ErtConfig.with_plugins().from_file_contents( @@ -543,6 +546,7 @@ def test_that_eclipse_fm_step_require_explicit_version(eclipse_v): ) +@pytest.mark.integration_test @pytest.mark.skipif(shutil.which("eclrun") is None, reason="eclrun is not in $PATH") @pytest.mark.parametrize("eclipse_v", ["ECLIPSE100", "ECLIPSE300"]) @pytest.mark.usefixtures("use_tmpdir") From 91f048446587ec9788d8a145309fe830791184a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Berland?= Date: Mon, 20 Jan 2025 15:53:19 +0100 Subject: [PATCH 06/48] Trust the queue system when a job is finished in tests This avoids always spending 120 billable cpu-seconds on every test. Instead we trust that the queue system is correct when it claims a job is finished, instead of waiting it out. --- .../scheduler/test_generic_driver.py | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/tests/ert/unit_tests/scheduler/test_generic_driver.py b/tests/ert/unit_tests/scheduler/test_generic_driver.py index 9c73abf0e66..6b1fbec06a9 100644 --- a/tests/ert/unit_tests/scheduler/test_generic_driver.py +++ b/tests/ert/unit_tests/scheduler/test_generic_driver.py @@ -154,33 +154,26 @@ async def test_repeated_submit_same_iens(driver: Driver, tmp_path): @pytest.mark.flaky(reruns=5) async def test_kill_actually_kills(driver: Driver, tmp_path, pytestconfig): os.chdir(tmp_path) - if ( - (isinstance(driver, LsfDriver) and pytestconfig.getoption("lsf")) # noqa: PLR0916 - or (isinstance(driver, OpenPBSDriver) and pytestconfig.getoption("openpbs")) - or (isinstance(driver, SlurmDriver) and pytestconfig.getoption("slurm")) - ): - # Allow more time when tested on a real compute cluster to avoid false positives. - job_kill_window = 60 - test_grace_time = 120 - else: - job_kill_window = 5 # Busy test nodes require a long kill window - test_grace_time = 8 + finished = False async def kill_job_once_started(iens): nonlocal driver await driver.kill(iens) + async def mark_as_finished(iens, code): + nonlocal finished + finished = True + await driver.submit( 0, "sh", "-c", - f"sleep {job_kill_window}; touch {tmp_path}/survived", + f"sleep 10; touch {tmp_path}/survived", name="kill_me", ) - await poll(driver, {0}, started=kill_job_once_started) + await poll(driver, {0}, started=kill_job_once_started, finished=mark_as_finished) + assert finished - # Give the script a chance to finish if it is running - await asyncio.sleep(test_grace_time) assert not Path("survived").exists(), "Job should have been killed" From fe97d1bada509d815b8984f44271fde3db00dfce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Berland?= Date: Thu, 16 Jan 2025 10:24:21 +0100 Subject: [PATCH 07/48] Mark ES_MDA as recommended algorithm in GUI --- src/ert/gui/simulation/experiment_panel.py | 8 +++++--- src/ert/run_models/base_run_model.py | 4 ++++ src/ert/run_models/iterated_ensemble_smoother.py | 2 +- src/ert/run_models/multiple_data_assimilation.py | 6 +++++- tests/ert/ui_tests/gui/conftest.py | 4 ++-- tests/ert/ui_tests/gui/test_csv_export.py | 2 +- tests/ert/ui_tests/gui/test_main_window.py | 15 +++++++++------ .../gui/test_missing_parameters_to_update.py | 14 ++++++++++---- tests/ert/ui_tests/gui/test_restart_esmda.py | 8 ++++---- 9 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/ert/gui/simulation/experiment_panel.py b/src/ert/gui/simulation/experiment_panel.py index 7be4a058423..3de30c78a4d 100644 --- a/src/ert/gui/simulation/experiment_panel.py +++ b/src/ert/gui/simulation/experiment_panel.py @@ -192,7 +192,7 @@ def addExperimentConfigPanel( experiment_type = panel.get_experiment_type() self._experiment_widgets[experiment_type] = panel self._experiment_type_combo.addDescriptionItem( - experiment_type.name(), + experiment_type.display_name(), experiment_type.description(), experiment_type.group(), ) @@ -221,9 +221,11 @@ def getActions() -> list[QAction]: return [] def get_current_experiment_type(self) -> Any: - experiment_type_name = self._experiment_type_combo.currentText() + experiment_type_display_name = self._experiment_type_combo.currentText() return next( - w for w in self._experiment_widgets if w.name() == experiment_type_name + w + for w in self._experiment_widgets + if w.display_name() == experiment_type_display_name ) def get_experiment_arguments(self) -> Any: diff --git a/src/ert/run_models/base_run_model.py b/src/ert/run_models/base_run_model.py index d8c795e10ac..040c18d978b 100644 --- a/src/ert/run_models/base_run_model.py +++ b/src/ert/run_models/base_run_model.py @@ -220,6 +220,10 @@ def log_at_startup(self) -> None: @abstractmethod def name(cls) -> str: ... + @classmethod + def display_name(cls) -> str: + return cls.name() + @classmethod @abstractmethod def description(cls) -> str: ... diff --git a/src/ert/run_models/iterated_ensemble_smoother.py b/src/ert/run_models/iterated_ensemble_smoother.py index e89c7935533..497cc0f1165 100644 --- a/src/ert/run_models/iterated_ensemble_smoother.py +++ b/src/ert/run_models/iterated_ensemble_smoother.py @@ -244,4 +244,4 @@ def name(cls) -> str: @classmethod def description(cls) -> str: - return "Sample parameters → [evaluate → update] several iterations" + return "Sample parameters → [evaluate → update] several iterations.\nDeprecated algorithm. Prefer ES-MDA." diff --git a/src/ert/run_models/multiple_data_assimilation.py b/src/ert/run_models/multiple_data_assimilation.py index 9d7a43ad802..7f6fe4a65b4 100644 --- a/src/ert/run_models/multiple_data_assimilation.py +++ b/src/ert/run_models/multiple_data_assimilation.py @@ -208,9 +208,13 @@ def parse_weights(weights: str) -> list[float]: def name(cls) -> str: return "Multiple data assimilation" + @classmethod + def display_name(cls) -> str: + return cls.name() + " - Recommended algorithm" + @classmethod def description(cls) -> str: - return "[Sample|restart] → [evaluate → update] for each weight" + return "[Sample|restart] → [evaluate → update] for each weight." @classmethod def group(cls) -> str | None: diff --git a/tests/ert/ui_tests/gui/conftest.py b/tests/ert/ui_tests/gui/conftest.py index bfdddf77a97..2100ced7685 100644 --- a/tests/ert/ui_tests/gui/conftest.py +++ b/tests/ert/ui_tests/gui/conftest.py @@ -239,7 +239,7 @@ def func(experiment_mode, gui, click_done=True): assert isinstance(experiment_panel, ExperimentPanel) simulation_mode_combo = experiment_panel.findChild(QComboBox) assert isinstance(simulation_mode_combo, QComboBox) - simulation_mode_combo.setCurrentText(experiment_mode.name()) + simulation_mode_combo.setCurrentText(experiment_mode.display_name()) simulation_settings = experiment_panel._experiment_widgets[ experiment_panel.get_current_experiment_type() ] @@ -255,7 +255,7 @@ def handle_dialog(): lambda: handle_run_path_dialog(gui, qtbot, delete_run_path=False), ) - if not experiment_mode.name() in { + if experiment_mode.name() not in { "Ensemble experiment", "Evaluate ensemble", }: diff --git a/tests/ert/ui_tests/gui/test_csv_export.py b/tests/ert/ui_tests/gui/test_csv_export.py index 9452c236b86..263b0278cd8 100644 --- a/tests/ert/ui_tests/gui/test_csv_export.py +++ b/tests/ert/ui_tests/gui/test_csv_export.py @@ -89,7 +89,7 @@ def test_csv_export(esmda_has_run, qtbot, ensemble_select): def run_experiment_via_gui(gui, qtbot): experiment_panel = get_child(gui, ExperimentPanel) simulation_mode_combo = get_child(experiment_panel, QComboBox) - simulation_mode_combo.setCurrentText(EnsembleExperiment.name()) + simulation_mode_combo.setCurrentText(EnsembleExperiment.display_name()) ensemble_experiment_panel = get_child(experiment_panel, EnsembleExperimentPanel) ensemble_experiment_panel._ensemble_name_field.setText("iter-0") diff --git a/tests/ert/ui_tests/gui/test_main_window.py b/tests/ert/ui_tests/gui/test_main_window.py index f31f6ff0928..7d51123c6f0 100644 --- a/tests/ert/ui_tests/gui/test_main_window.py +++ b/tests/ert/ui_tests/gui/test_main_window.py @@ -242,7 +242,7 @@ def test_that_es_mda_is_disabled_when_weights_are_invalid(qtbot): combo_box = get_child(gui, QComboBox, name="experiment_type") combo_box.setCurrentIndex(3) - assert combo_box.currentText() == "Multiple data assimilation" + assert combo_box.currentText() == MultipleDataAssimilation.display_name() es_mda_panel = get_child(gui, QWidget, name="ES_MDA_panel") assert es_mda_panel @@ -701,7 +701,7 @@ def test_that_es_mda_restart_run_box_is_disabled_when_there_are_no_cases(qtbot): assert combo_box.count() == 7 combo_box.setCurrentIndex(3) - assert combo_box.currentText() == "Multiple data assimilation" + assert combo_box.currentText() == MultipleDataAssimilation.display_name() es_mda_panel = get_child(gui, QWidget, name="ES_MDA_panel") assert es_mda_panel @@ -751,10 +751,13 @@ def test_validation_of_experiment_names_in_run_models( run_experiment = get_child(experiment_panel, QWidget, name="run_experiment") experiment_types_to_test = ( - (EnsembleExperiment.name(), "Ensemble_experiment_panel"), - (EnsembleSmoother.name(), "ensemble_smoother_panel"), - (MultipleDataAssimilation.name(), "ES_MDA_panel"), - (IteratedEnsembleSmoother.name(), "iterated_ensemble_smoother_panel"), + (EnsembleExperiment.display_name(), "Ensemble_experiment_panel"), + (EnsembleSmoother.display_name(), "ensemble_smoother_panel"), + ( + MultipleDataAssimilation.display_name(), + "ES_MDA_panel", + ), + (IteratedEnsembleSmoother.display_name(), "iterated_ensemble_smoother_panel"), ) for exp_type, panel_name in experiment_types_to_test: experiment_types.setCurrentText(exp_type) diff --git a/tests/ert/ui_tests/gui/test_missing_parameters_to_update.py b/tests/ert/ui_tests/gui/test_missing_parameters_to_update.py index 02fc047604a..e8d744924a1 100644 --- a/tests/ert/ui_tests/gui/test_missing_parameters_to_update.py +++ b/tests/ert/ui_tests/gui/test_missing_parameters_to_update.py @@ -5,6 +5,12 @@ from qtpy.QtWidgets import QComboBox from ert.gui.simulation.experiment_panel import ExperimentPanel +from ert.run_models import ( + EnsembleExperiment, + EnsembleSmoother, + IteratedEnsembleSmoother, + MultipleDataAssimilation, +) from tests.ert.ui_tests.gui.conftest import get_child, open_gui_with_config @@ -20,19 +26,19 @@ def test_no_updateable_parameters(qtbot): for gui in open_gui_with_config("poly.ert"): experiment_panel = get_child(gui, ExperimentPanel) simulation_mode_combo = get_child(experiment_panel, QComboBox) - idx = simulation_mode_combo.findText("Ensemble smoother") + idx = simulation_mode_combo.findText(EnsembleSmoother.display_name()) assert not ( simulation_mode_combo.model().item(idx).flags() & Qt.ItemFlag.ItemIsEnabled ) - idx = simulation_mode_combo.findText("Multiple data assimilation") + idx = simulation_mode_combo.findText(MultipleDataAssimilation.display_name()) assert not ( simulation_mode_combo.model().item(idx).flags() & Qt.ItemFlag.ItemIsEnabled ) - idx = simulation_mode_combo.findText("Iterated ensemble smoother") + idx = simulation_mode_combo.findText(IteratedEnsembleSmoother.display_name()) assert not ( simulation_mode_combo.model().item(idx).flags() & Qt.ItemFlag.ItemIsEnabled ) - idx = simulation_mode_combo.findText("Ensemble experiment") + idx = simulation_mode_combo.findText(EnsembleExperiment.display_name()) assert ( simulation_mode_combo.model().item(idx).flags() & Qt.ItemFlag.ItemIsEnabled ) diff --git a/tests/ert/ui_tests/gui/test_restart_esmda.py b/tests/ert/ui_tests/gui/test_restart_esmda.py index 6c7c8e312ed..e99f39e4350 100644 --- a/tests/ert/ui_tests/gui/test_restart_esmda.py +++ b/tests/ert/ui_tests/gui/test_restart_esmda.py @@ -18,7 +18,7 @@ def test_restart_esmda(ensemble_experiment_has_run_no_failure, qtbot): experiment_panel = get_child(gui, ExperimentPanel) simulation_mode_combo = get_child(experiment_panel, QComboBox) - simulation_mode_combo.setCurrentText(MultipleDataAssimilation.name()) + simulation_mode_combo.setCurrentText(MultipleDataAssimilation.display_name()) es_mda_panel = gui.findChild(QWidget, name="ES_MDA_panel") assert es_mda_panel @@ -49,7 +49,7 @@ def test_active_realizations_esmda(opened_main_window_poly, qtbot): experiment_panel = get_child(gui, ExperimentPanel) simulation_mode_combo = get_child(experiment_panel, QComboBox) - simulation_mode_combo.setCurrentText(SingleTestRun.name()) + simulation_mode_combo.setCurrentText(SingleTestRun.display_name()) single_test_run_panel = gui.findChild(QWidget, name="Single_test_run_panel") assert single_test_run_panel @@ -63,7 +63,7 @@ def test_active_realizations_esmda(opened_main_window_poly, qtbot): == "Total progress 100% — Experiment completed." ) - simulation_mode_combo.setCurrentText(MultipleDataAssimilation.name()) + simulation_mode_combo.setCurrentText(MultipleDataAssimilation.display_name()) es_mda_panel = gui.findChild(QWidget, name="ES_MDA_panel") assert es_mda_panel active_reals = gui.findChild(StringBox, "active_realizations_box") @@ -88,7 +88,7 @@ def test_custom_weights_stored_and_retrieved_from_metadata_esmda( experiment_panel = get_child(gui, ExperimentPanel) simulation_mode_combo = get_child(experiment_panel, QComboBox) - simulation_mode_combo.setCurrentText(MultipleDataAssimilation.name()) + simulation_mode_combo.setCurrentText(MultipleDataAssimilation.display_name()) es_mda_panel = gui.findChild(QWidget, name="ES_MDA_panel") assert es_mda_panel From b4ac65e8eea04674e6a84e2c30242e1a1961a361 Mon Sep 17 00:00:00 2001 From: Jonathan Karlsen Date: Tue, 21 Jan 2025 10:37:42 +0100 Subject: [PATCH 08/48] Fix rerun button not disabled for ES-MDA This commit fixes the issue where the rerun button was enabled for ES-MDA and ensemble smoother. The issue was due to us setting support_restart before calling the super class's constructor which overwrote it to False. --- src/ert/run_models/iterated_ensemble_smoother.py | 2 +- src/ert/run_models/multiple_data_assimilation.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ert/run_models/iterated_ensemble_smoother.py b/src/ert/run_models/iterated_ensemble_smoother.py index 497cc0f1165..29245dc7ae0 100644 --- a/src/ert/run_models/iterated_ensemble_smoother.py +++ b/src/ert/run_models/iterated_ensemble_smoother.py @@ -50,7 +50,6 @@ def __init__( update_settings: UpdateSettings, status_queue: SimpleQueue[StatusEvents], ): - self.support_restart = False self.analysis_config = analysis_config self.update_settings = update_settings @@ -83,6 +82,7 @@ def __init__( random_seed=random_seed, minimum_required_realizations=minimum_required_realizations, ) + self.support_restart = False # Initialize sies_smoother to None # It is initialized later, but kept track of here diff --git a/src/ert/run_models/multiple_data_assimilation.py b/src/ert/run_models/multiple_data_assimilation.py index 7f6fe4a65b4..ca20865e860 100644 --- a/src/ert/run_models/multiple_data_assimilation.py +++ b/src/ert/run_models/multiple_data_assimilation.py @@ -51,7 +51,6 @@ def __init__( update_settings: UpdateSettings, status_queue: SimpleQueue[StatusEvents], ): - self.support_restart = False self._relative_weights = weights self.weights = self.parse_weights(weights) @@ -89,6 +88,7 @@ def __init__( random_seed=random_seed, minimum_required_realizations=minimum_required_realizations, ) + self.support_restart = False self._observations = config.observations self._parameter_configuration = config.ensemble_config.parameter_configuration self._response_configuration = config.ensemble_config.response_configuration From 70c89e68e230bf85c73f208b7522dafbc5c4475b Mon Sep 17 00:00:00 2001 From: xjules Date: Wed, 15 Jan 2025 12:39:40 +0100 Subject: [PATCH 09/48] zmq: replace server_started Event with Future to handle exceptions In a very special case zmq server might fail during initialization and all occurrences of server_started.wait() will wait indefinitely and therefore replacing it with asyncio.Future which provides additional exception trigger. --- src/ert/ensemble_evaluator/evaluator.py | 11 ++++++----- src/ert/run_models/base_run_model.py | 2 +- .../ensemble_evaluator/test_ensemble_evaluator.py | 2 +- .../ensemble_evaluator/test_ensemble_legacy.py | 2 +- .../unit_tests/ensemble_evaluator/test_scheduler.py | 2 +- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/ert/ensemble_evaluator/evaluator.py b/src/ert/ensemble_evaluator/evaluator.py index e17beb95923..9737f26e56c 100644 --- a/src/ert/ensemble_evaluator/evaluator.py +++ b/src/ert/ensemble_evaluator/evaluator.py @@ -64,7 +64,7 @@ def __init__(self, ensemble: Ensemble, config: EvaluatorServerConfig): self._max_batch_size: int = 500 self._batching_interval: float = 2.0 self._complete_batch: asyncio.Event = asyncio.Event() - self._server_started: asyncio.Event = asyncio.Event() + self._server_started: asyncio.Future[None] = asyncio.Future() self._clients_connected: set[bytes] = set() self._clients_empty: asyncio.Event = asyncio.Event() self._clients_empty.set() @@ -73,7 +73,7 @@ def __init__(self, ensemble: Ensemble, config: EvaluatorServerConfig): self._dispatchers_empty.set() async def _publisher(self) -> None: - await self._server_started.wait() + await self._server_started while True: event = await self._events_to_send.get() for identity in self._clients_connected: @@ -243,7 +243,7 @@ async def handle_dispatch(self, dealer: bytes, frame: bytes) -> None: await self._events.put(event) async def listen_for_messages(self) -> None: - await self._server_started.wait() + await self._server_started while True: try: dealer, _, frame = await self._router_socket.recv_multipart() @@ -285,9 +285,10 @@ async def _server(self) -> None: self._router_socket.bind(f"tcp://*:{self._config.router_port}") else: self._router_socket.bind(self._config.url) - self._server_started.set() + self._server_started.set_result(None) except zmq.error.ZMQError as e: logger.error(f"ZMQ error encountered {e} during evaluator initialization") + self._server_started.set_exception(e) raise try: await self._server_done.wait() @@ -350,7 +351,7 @@ async def _start_running(self) -> None: asyncio.create_task(self.listen_for_messages(), name="listener_task"), ] - await self._server_started.wait() + await self._server_started self._ee_tasks.append( asyncio.create_task( self._ensemble.evaluate( diff --git a/src/ert/run_models/base_run_model.py b/src/ert/run_models/base_run_model.py index 040c18d978b..f4fd22c9844 100644 --- a/src/ert/run_models/base_run_model.py +++ b/src/ert/run_models/base_run_model.py @@ -583,7 +583,7 @@ async def run_ensemble_evaluator_async( evaluator_task = asyncio.create_task( evaluator.run_and_get_successful_realizations() ) - await evaluator._server_started.wait() + await evaluator._server_started if not (await self.run_monitor(ee_config, ensemble.iteration)): return [] diff --git a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py index 3959beaa273..e3f3dd7ba51 100644 --- a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py +++ b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py @@ -144,7 +144,7 @@ async def evaluator_to_use_fixture(make_ee_config): evaluator = EnsembleEvaluator(ensemble, make_ee_config(use_token=False)) evaluator._batching_interval = 0.5 # batching can be faster for tests run_task = asyncio.create_task(evaluator.run_and_get_successful_realizations()) - await evaluator._server_started.wait() + await evaluator._server_started yield evaluator evaluator.stop() await run_task diff --git a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_legacy.py b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_legacy.py index 59fc4da5405..7a2ee7291cf 100644 --- a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_legacy.py +++ b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_legacy.py @@ -18,7 +18,7 @@ def evaluator_to_use(): async def run_evaluator(ensemble, ee_config): evaluator = EnsembleEvaluator(ensemble, ee_config) run_task = asyncio.create_task(evaluator.run_and_get_successful_realizations()) - await evaluator._server_started.wait() + await evaluator._server_started try: yield evaluator finally: diff --git a/tests/ert/unit_tests/ensemble_evaluator/test_scheduler.py b/tests/ert/unit_tests/ensemble_evaluator/test_scheduler.py index 43abdad5d3a..83887bf3c04 100644 --- a/tests/ert/unit_tests/ensemble_evaluator/test_scheduler.py +++ b/tests/ert/unit_tests/ensemble_evaluator/test_scheduler.py @@ -66,7 +66,7 @@ def create_manifest_file(): run_task = asyncio.create_task( evaluator.run_and_get_successful_realizations() ) - await evaluator._server_started.wait() + await evaluator._server_started await _run_monitor() await run_task assert "Waiting for disk synchronization" in caplog.messages From 411bfc557879f997a38f77d341532ef8bf905cce Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Wed, 22 Jan 2025 06:22:18 +0100 Subject: [PATCH 10/48] Add everest to rapid tests --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- .pre-commit-config.yaml | 2 +- README.md | 2 +- justfile | 2 +- tests/everest/test_api_snapshots.py | 1 + tests/everest/test_detached.py | 1 + tests/everest/test_egg_simulation.py | 2 ++ tests/everest/test_everlint.py | 1 + tests/everest/test_everserver.py | 4 ++++ tests/everest/test_fix_control.py | 3 +++ tests/everest/test_samplers.py | 2 ++ tests/everest/test_simulator_cache.py | 2 ++ tests/everest/test_templating.py | 1 + 13 files changed, 21 insertions(+), 4 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index aea34402aac..170f05ffed5 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -12,7 +12,7 @@ _Short description of the approach_ - [ ] Added appropriate release note label - [ ] Commit history is consistent and clean, in line with the [contribution guidelines](https://github.com/equinor/ert/blob/main/CONTRIBUTING.md). - [ ] Make sure unit tests pass locally after every commit (`git rebase -i main - --exec 'pytest tests/ert/unit_tests -n auto --hypothesis-profile=fast -m "not integration_test"'`) + --exec 'pytest tests/ert/unit_tests tests/everest -n auto --hypothesis-profile=fast -m "not integration_test"'`) ## When applicable - [ ] **When there are user facing changes**: Updated documentation diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a52dca55a7a..ffb4ff25131 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,7 +23,7 @@ repos: - id: pytest name: pytest entry: pytest - args: [-n, auto, tests/ert/unit_tests, --hypothesis-profile=fast, -m, not integration_test] + args: [-n, auto, tests/ert/unit_tests, tests/everest, --hypothesis-profile=fast, -m, not integration_test] language: system types: [python] stages: [pre-push] diff --git a/README.md b/README.md index 0572fa41b1f..714560d6e3c 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,7 @@ There are many kinds of tests in the `tests` directory, while iterating on your code you can run a fast subset of the tests with ```sh -pytest -n auto --hypothesis-profile=fast tests/ert/unit_tests -m "not integration_test" +pytest -n auto --hypothesis-profile=fast tests/ert/unit_tests tests/everest -m "not integration_test" ``` [Git LFS](https://git-lfs.com/) must be installed to get all the files. This is diff --git a/justfile b/justfile index d10cdf7de7b..810d6793548 100644 --- a/justfile +++ b/justfile @@ -10,7 +10,7 @@ snake_oil: # execute rapid unittests rapid-tests: - nice pytest -n auto tests/ert/unit_tests --hypothesis-profile=fast -m "not integration_test" + nice pytest -n auto tests/ert/unit_tests tests/everest --hypothesis-profile=fast -m "not integration_test" check-all: mypy src/ert src/everest diff --git a/tests/everest/test_api_snapshots.py b/tests/everest/test_api_snapshots.py index aa742a6764b..cac5fdac177 100644 --- a/tests/everest/test_api_snapshots.py +++ b/tests/everest/test_api_snapshots.py @@ -77,6 +77,7 @@ def test_api_snapshots(config_file, snapshot, cached_example): snapshot.assert_match(snapshot_str, "snapshot.json") +@pytest.mark.integration_test @pytest.mark.parametrize( "config_file", ["config_advanced.yml", "config_minimal.yml", "config_multiobj.yml"], diff --git a/tests/everest/test_detached.py b/tests/everest/test_detached.py index 064c881301d..e3cba39d7fc 100644 --- a/tests/everest/test_detached.py +++ b/tests/everest/test_detached.py @@ -140,6 +140,7 @@ def test_server_status(copy_math_func_test_data_to_tmp): assert status["message"] == f"{err_msg_1}\n{err_msg_2}" +@pytest.mark.integration_test @patch("everest.detached.server_is_running", return_value=False) def test_wait_for_server(server_is_running_mock, caplog, monkeypatch): config = EverestConfig.with_defaults() diff --git a/tests/everest/test_egg_simulation.py b/tests/everest/test_egg_simulation.py index d20de3a3f9d..96d466cf74c 100644 --- a/tests/everest/test_egg_simulation.py +++ b/tests/everest/test_egg_simulation.py @@ -553,6 +553,7 @@ def _generate_exp_ert_config(config_path, output_dir): } +@pytest.mark.integration_test @skipif_no_opm def test_egg_model_convert(copy_egg_test_data_to_tmp): config = EverestConfig.load_file(CONFIG_FILE) @@ -667,6 +668,7 @@ def test_init_egg_model(copy_egg_test_data_to_tmp): ErtConfig.with_plugins().from_dict(config_dict=ert_config) +@pytest.mark.integration_test @skipif_no_everest_models @pytest.mark.everest_models_test @skipif_no_opm diff --git a/tests/everest/test_everlint.py b/tests/everest/test_everlint.py index a64b165c91d..d76c74f89e7 100644 --- a/tests/everest/test_everlint.py +++ b/tests/everest/test_everlint.py @@ -246,6 +246,7 @@ def test_control_ref_validation(min_config): EverestConfig(**min_config) +@pytest.mark.integration_test def test_init_context_controls(): test_configs = [ "test_data/mocked_test_case/config_input_constraints.yml", diff --git a/tests/everest/test_everserver.py b/tests/everest/test_everserver.py index 4075e3fbc41..fa95bae4126 100644 --- a/tests/everest/test_everserver.py +++ b/tests/everest/test_everserver.py @@ -5,6 +5,7 @@ from pathlib import Path from unittest.mock import patch +import pytest from seba_sqlite.snapshot import SebaSnapshot from ert.run_models.everest_run_model import EverestExitCode @@ -52,6 +53,7 @@ def set_shared_status(*args, progress, shared_data): } +@pytest.mark.integration_test def test_certificate_generation(copy_math_func_test_data_to_tmp): config = EverestConfig.load_file("config_minimal.yml") cert, key, pw = everserver._generate_certificate( @@ -194,6 +196,7 @@ def test_everserver_status_exception( assert "Exception: Failed optimization" in status["message"] +@pytest.mark.integration_test @patch("sys.argv", ["name", "--config-file", "config_minimal.yml"]) @patch( "everest.detached.jobs.everserver._sim_monitor", @@ -223,6 +226,7 @@ def test_everserver_status_max_batch_num( assert {data.batch for data in snapshot.simulation_data} == {0} +@pytest.mark.integration_test @patch("sys.argv", ["name", "--config-file", "config_minimal.yml"]) def test_everserver_status_contains_max_runtime_failure( mock_server, change_to_tmpdir, min_config diff --git a/tests/everest/test_fix_control.py b/tests/everest/test_fix_control.py index bcf75e5a333..11b75bed06c 100644 --- a/tests/everest/test_fix_control.py +++ b/tests/everest/test_fix_control.py @@ -1,9 +1,12 @@ +import pytest + from ert.run_models.everest_run_model import EverestRunModel from everest.config import EverestConfig CONFIG_FILE_ADVANCED = "config_advanced.yml" +@pytest.mark.integration_test def test_fix_control( copy_math_func_test_data_to_tmp, evaluator_server_config_generator ): diff --git a/tests/everest/test_samplers.py b/tests/everest/test_samplers.py index 663db860c70..418a199df9d 100644 --- a/tests/everest/test_samplers.py +++ b/tests/everest/test_samplers.py @@ -7,6 +7,7 @@ CONFIG_FILE_ADVANCED = "config_advanced.yml" +@pytest.mark.integration_test def test_sampler_uniform( copy_math_func_test_data_to_tmp, evaluator_server_config_generator ): @@ -38,6 +39,7 @@ def test_sampler_uniform( assert expected_opt == pytest.approx(run_model.result.total_objective, abs=0.001) +@pytest.mark.integration_test def test_sampler_mixed( copy_math_func_test_data_to_tmp, evaluator_server_config_generator ): diff --git a/tests/everest/test_simulator_cache.py b/tests/everest/test_simulator_cache.py index 14765b49b14..8a61b6bca65 100644 --- a/tests/everest/test_simulator_cache.py +++ b/tests/everest/test_simulator_cache.py @@ -1,6 +1,7 @@ from pathlib import Path import numpy as np +import pytest from ert.config import QueueSystem from ert.ensemble_evaluator import EvaluatorServerConfig @@ -8,6 +9,7 @@ from everest.config import EverestConfig, SimulatorConfig +@pytest.mark.integration_test def test_simulator_cache(copy_math_func_test_data_to_tmp): n_evals = 0 diff --git a/tests/everest/test_templating.py b/tests/everest/test_templating.py index f023752ce62..6d7e0101cc5 100644 --- a/tests/everest/test_templating.py +++ b/tests/everest/test_templating.py @@ -94,6 +94,7 @@ def test_render_multiple_input(copy_template_test_data_to_tmp): assert output == ["0.2 vs 0.8"] +@pytest.mark.integration_test def test_render_executable(copy_template_test_data_to_tmp): assert os.access(everest.jobs.render, os.X_OK) From 0dfb67825f2a5fcc55bcf0eb83d8c8cbd5402bf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Berland?= Date: Tue, 21 Jan 2025 12:14:04 +0100 Subject: [PATCH 11/48] Adapt Slurm setup to Ubuntu 24.04 --- .github/workflows/test_ert_with_slurm.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test_ert_with_slurm.yml b/.github/workflows/test_ert_with_slurm.yml index 2acc76cb723..a38a5f4b7a3 100644 --- a/.github/workflows/test_ert_with_slurm.yml +++ b/.github/workflows/test_ert_with_slurm.yml @@ -13,7 +13,7 @@ jobs: test-ert-on-slurm: name: Run ert tests timeout-minutes: 20 - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 @@ -36,11 +36,16 @@ jobs: sudo apt install slurmd slurmctld -y + sudo mkdir /var/spool/slurm + sudo chown slurm /var/spool/slurm + cat < slurm.conf ClusterName=localcluster + SlurmUser=slurm SlurmctldHost=localhost - SelectType=select/cons_res # Select nodes based on consumable resources + SelectType=select/cons_tres # Select nodes based on consumable resources SelectTypeParameters=CR_Core # Cores are the consumable resource + StateSaveLocation=/var/spool/slurm ProctrackType=proctrack/linuxproc # Use /proc to track processes PartitionName=LocalQ Nodes=ALL Default=YES MaxTime=INFINITE State=UP PartitionName=AlternativeQ Nodes=ALL Default=YES MaxTime=INFINITE State=UP @@ -55,6 +60,9 @@ jobs: sudo systemctl start slurmd # The compute node slurm daemon sudo systemctl start slurmctld # The slurm controller daemon + systemctl status slurmd + systemctl status slurmctld + # Show partition and node information configured: sinfo From e70740d2b9546261d454bb952652b69b6e101c4d Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Wed, 22 Jan 2025 08:07:54 +0100 Subject: [PATCH 12/48] Skip slow tests in mac ci --- .github/workflows/build_and_test.yml | 1 + .github/workflows/test_ert.yml | 11 +++++++---- .github/workflows/test_everest.yml | 4 ++-- pyproject.toml | 2 +- tests/ert/ui_tests/cli/test_parameter_passing.py | 3 ++- tests/ert/ui_tests/gui/test_plotting_of_snake_oil.py | 1 + .../dark_storage/test_dark_storage_state.py | 4 +++- tests/ert/unit_tests/gui/model/test_snapshot.py | 1 + tests/everest/entry_points/test_everexport.py | 10 +++++----- tests/everest/functional/test_main_everest_entry.py | 2 +- tests/everest/test_detached.py | 2 +- tests/everest/test_everlint.py | 2 +- tests/everest/test_res_initialization.py | 2 +- tests/everest/test_yaml_parser.py | 4 ++-- 14 files changed, 29 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 16736f5146c..8921113e99f 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -109,6 +109,7 @@ jobs: test-type: [ 'performance-tests', 'unit-tests', 'gui-tests', 'cli-tests' ] python-version: [ '3.12' ] os: [ 'macos-latest'] + select-string: ['"not skip_mac_ci"'] uses: ./.github/workflows/test_ert.yml with: diff --git a/.github/workflows/test_ert.yml b/.github/workflows/test_ert.yml index 9e0da2f02d7..338b7899987 100644 --- a/.github/workflows/test_ert.yml +++ b/.github/workflows/test_ert.yml @@ -7,6 +7,9 @@ on: type: string test-type: type: string + select-string: + type: string + default: "''" env: ERT_SHOW_BACKTRACE: 1 @@ -40,7 +43,7 @@ jobs: - name: GUI Test if: inputs.test-type == 'gui-tests' run: | - pytest --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -v --mpl --benchmark-disable tests/ert/ui_tests/gui --durations=25 + pytest -m ${{ inputs.select-string }} --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -v --mpl --benchmark-disable tests/ert/ui_tests/gui --durations=25 - name: Upload artifact images uses: actions/upload-artifact@v4 @@ -53,18 +56,18 @@ jobs: - name: CLI Test if: inputs.test-type == 'cli-tests' run: | - pytest --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -v --benchmark-disable --dist loadgroup tests/ert/ui_tests/cli --durations=25 + pytest -m ${{ inputs.select-string }} --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -v --benchmark-disable --dist loadgroup tests/ert/ui_tests/cli --durations=25 - name: Unit Test if: inputs.test-type == 'unit-tests' run: | - pytest --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -n logical --show-capture=stderr -v --benchmark-disable --mpl --dist loadgroup tests/ert/unit_tests --durations=25 + pytest -m ${{ inputs.select-string }} --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -n logical --show-capture=stderr -v --benchmark-disable --mpl --dist loadgroup tests/ert/unit_tests --durations=25 pytest --doctest-modules --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov2.xml src/ --ignore src/ert/dark_storage - name: Performance Test if: inputs.test-type == 'performance-tests' run: | - pytest --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -n logical --show-capture=stderr -v --benchmark-disable --dist loadgroup tests/ert/performance_tests --durations=25 + pytest -m ${{ inputs.select-string }} --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -n logical --show-capture=stderr -v --benchmark-disable --dist loadgroup tests/ert/performance_tests --durations=25 - name: Upload coverage to Codecov id: codecov1 diff --git a/.github/workflows/test_everest.yml b/.github/workflows/test_everest.yml index f3dfb60f845..f3e400d39cd 100644 --- a/.github/workflows/test_everest.yml +++ b/.github/workflows/test_everest.yml @@ -46,7 +46,7 @@ jobs: - name: Run Tests macOS if: ${{ inputs.test-type == 'test' && runner.os == 'macOS'}} run: | - python -m pytest tests/everest -n 4 --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -m "not integration_test and not fails_on_macos_github_workflow" --dist loadgroup -sv + python -m pytest tests/everest -n 4 --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -m "not integration_test and not skip_mac_ci" --dist loadgroup -sv - name: Run Integration Tests Linux if: ${{inputs.test-type == 'integration-test' && runner.os != 'macOS'}} @@ -56,7 +56,7 @@ jobs: - name: Run Integration Tests macOS if: ${{inputs.test-type == 'integration-test' && runner.os == 'macOS'}} run: | - python -m pytest tests/everest -n 4 --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -m "integration_test and not fails_on_macos_github_workflow" --dist loadgroup + python -m pytest tests/everest -n 4 --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -m "integration_test and not skip_mac_ci" --dist loadgroup - name: Build Documentation if: inputs.test-type == 'doc' diff --git a/pyproject.toml b/pyproject.toml index 010607a8298..c08c27b0a6e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -171,7 +171,7 @@ markers = [ "slow", "everest_models_test", "integration_test", - "fails_on_macos_github_workflow", # Tests marked fail due to gui-related issues + "skip_mac_ci", ] log_cli = "false" asyncio_mode = "auto" diff --git a/tests/ert/ui_tests/cli/test_parameter_passing.py b/tests/ert/ui_tests/cli/test_parameter_passing.py index b808a467c65..e1090ed7f6f 100644 --- a/tests/ert/ui_tests/cli/test_parameter_passing.py +++ b/tests/ert/ui_tests/cli/test_parameter_passing.py @@ -19,7 +19,7 @@ import xtgeo from hypothesis import given, note, settings from hypothesis.extra.numpy import arrays -from pytest import MonkeyPatch, TempPathFactory +from pytest import MonkeyPatch, TempPathFactory, mark from resdata import ResDataType from resdata.grid import GridGenerator from resdata.resfile import ResdataKW @@ -409,6 +409,7 @@ def check(self, io_source: IoProvider, mask, num_realizations: int): max_size=3, ), ) +@mark.skip_mac_ci # test is slow def test_that_parameters_are_placed_in_the_runpath_as_expected( io_source: IoProvider, grid_format: Literal["grid", "egrid"], diff --git a/tests/ert/ui_tests/gui/test_plotting_of_snake_oil.py b/tests/ert/ui_tests/gui/test_plotting_of_snake_oil.py index 617acceb206..1e5691bc290 100644 --- a/tests/ert/ui_tests/gui/test_plotting_of_snake_oil.py +++ b/tests/ert/ui_tests/gui/test_plotting_of_snake_oil.py @@ -121,6 +121,7 @@ def plot_figure(qtbot, heat_equation_storage, snake_oil_case_storage, request): # The tolerance is chosen by guess, in one bug we observed a # mismatch of 58 which would fail the test by being above 10.0 @pytest.mark.mpl_image_compare(tolerance=10.0) +@pytest.mark.skip_mac_ci # test is slow def test_that_all_snake_oil_visualisations_matches_snapshot(plot_figure): return plot_figure diff --git a/tests/ert/unit_tests/dark_storage/test_dark_storage_state.py b/tests/ert/unit_tests/dark_storage/test_dark_storage_state.py index d93320e4982..6a218bd8bf9 100644 --- a/tests/ert/unit_tests/dark_storage/test_dark_storage_state.py +++ b/tests/ert/unit_tests/dark_storage/test_dark_storage_state.py @@ -111,4 +111,6 @@ def teardown(self): del os.environ["ERT_STORAGE_ENS_PATH"] -TestDarkStorage = pytest.mark.integration_test(DarkStorageStateTest.TestCase) +TestDarkStorage = pytest.mark.skip_mac_ci( + pytest.mark.integration_test(DarkStorageStateTest.TestCase) +) diff --git a/tests/ert/unit_tests/gui/model/test_snapshot.py b/tests/ert/unit_tests/gui/model/test_snapshot.py index b8a369bbd68..13a29eb1019 100644 --- a/tests/ert/unit_tests/gui/model/test_snapshot.py +++ b/tests/ert/unit_tests/gui/model/test_snapshot.py @@ -10,6 +10,7 @@ @pytest.mark.integration_test +@pytest.mark.skip_mac_ci # slow def test_using_qt_model_tester(qtmodeltester, full_snapshot): model = SnapshotModel() diff --git a/tests/everest/entry_points/test_everexport.py b/tests/everest/entry_points/test_everexport.py index 88dc26ff4c8..e16ca6f4a57 100644 --- a/tests/everest/entry_points/test_everexport.py +++ b/tests/everest/entry_points/test_everexport.py @@ -101,7 +101,7 @@ def test_everexport_entry_empty(mocked_func, cached_example): side_effect=validate_export_mock, ) @patch("everest.bin.utils.export_data") -@pytest.mark.fails_on_macos_github_workflow +@pytest.mark.skip_mac_ci def test_everexport_entry_batches(mocked_func, validate_export_mock, cached_example): """Test running everexport with the --batches flag""" _, config_file, _ = cached_example("math_func/config_minimal.yml") @@ -156,7 +156,7 @@ def test_everexport_entry_empty_export(mocked_func, cached_example): @patch("everest.bin.utils.export_data") -@pytest.mark.fails_on_macos_github_workflow +@pytest.mark.skip_mac_ci def test_everexport_entry_no_usr_def_ecl_keys(mocked_func, cached_example): """Test running everexport with config file containing only the keywords label without any list of keys""" @@ -190,7 +190,7 @@ def condition(config): @patch("everest.bin.utils.export_data") -@pytest.mark.fails_on_macos_github_workflow +@pytest.mark.skip_mac_ci def test_everexport_entry_internalized_usr_def_ecl_keys(mocked_func, cached_example): """Test running everexport with config file containing a key in the list of user defined ecl keywords, that has been internalized on @@ -226,7 +226,7 @@ def condition(config): @patch("everest.bin.utils.export_data") -@pytest.mark.fails_on_macos_github_workflow +@pytest.mark.skip_mac_ci def test_everexport_entry_non_int_usr_def_ecl_keys(mocked_func, caplog, cached_example): """Test running everexport when config file contains non internalized ecl keys in the user defined keywords list""" @@ -269,7 +269,7 @@ def condition(config): @patch("everest.bin.utils.export_data") -@pytest.mark.fails_on_macos_github_workflow +@pytest.mark.skip_mac_ci def test_everexport_entry_not_available_batches(mocked_func, caplog, cached_example): """Test running everexport when config file contains non existing batch numbers in the list of user defined batches""" diff --git a/tests/everest/functional/test_main_everest_entry.py b/tests/everest/functional/test_main_everest_entry.py index 028248e0d5a..1ec7695a22a 100644 --- a/tests/everest/functional/test_main_everest_entry.py +++ b/tests/everest/functional/test_main_everest_entry.py @@ -41,7 +41,7 @@ def test_everest_main_entry_bad_command(): @pytest.mark.flaky(reruns=5) -@pytest.mark.fails_on_macos_github_workflow +@pytest.mark.skip_mac_ci @pytest.mark.integration_test def test_everest_entry_run(cached_example): _, config_file, _ = cached_example("math_func/config_minimal.yml") diff --git a/tests/everest/test_detached.py b/tests/everest/test_detached.py index e3cba39d7fc..994de4c3fd8 100644 --- a/tests/everest/test_detached.py +++ b/tests/everest/test_detached.py @@ -42,7 +42,7 @@ @pytest.mark.flaky(reruns=5) @pytest.mark.integration_test -@pytest.mark.fails_on_macos_github_workflow +@pytest.mark.skip_mac_ci @pytest.mark.xdist_group(name="starts_everest") async def test_https_requests(copy_math_func_test_data_to_tmp): everest_config = EverestConfig.load_file("config_minimal.yml") diff --git a/tests/everest/test_everlint.py b/tests/everest/test_everlint.py index d76c74f89e7..12f5886a410 100644 --- a/tests/everest/test_everlint.py +++ b/tests/everest/test_everlint.py @@ -333,7 +333,7 @@ def test_date_type(date, valid, min_config): EverestConfig(**min_config) -@pytest.mark.fails_on_macos_github_workflow +@pytest.mark.skip_mac_ci def test_lint_everest_models_jobs(): pytest.importorskip("everest_models") config_file = relpath("../../test-data/everest/egg/everest/model/config.yml") diff --git a/tests/everest/test_res_initialization.py b/tests/everest/test_res_initialization.py index 27fc2e5db81..56f1dacf614 100644 --- a/tests/everest/test_res_initialization.py +++ b/tests/everest/test_res_initialization.py @@ -241,7 +241,7 @@ def test_summary_default(copy_egg_test_data_to_tmp): @hide_opm @skipif_no_everest_models @pytest.mark.everest_models_test -@pytest.mark.fails_on_macos_github_workflow +@pytest.mark.skip_mac_ci def test_summary_default_no_opm(copy_egg_test_data_to_tmp): config_dir = "everest/model" config_file = os.path.join(config_dir, "config.yml") diff --git a/tests/everest/test_yaml_parser.py b/tests/everest/test_yaml_parser.py index 8d5376ce418..d173c53c188 100644 --- a/tests/everest/test_yaml_parser.py +++ b/tests/everest/test_yaml_parser.py @@ -106,7 +106,7 @@ def test_valid_config_file(copy_test_data_to_tmp, monkeypatch): assert "could not find expected ':'" in parser.get_error() -@pytest.mark.fails_on_macos_github_workflow +@pytest.mark.skip_mac_ci @skipif_no_everest_models @pytest.mark.everest_models_test def test_valid_forward_model_config_files(copy_test_data_to_tmp, monkeypatch): @@ -121,7 +121,7 @@ def test_valid_forward_model_config_files(copy_test_data_to_tmp, monkeypatch): @skipif_no_everest_models @pytest.mark.everest_models_test -@pytest.mark.fails_on_macos_github_workflow +@pytest.mark.skip_mac_ci def test_invalid_forward_model_config_files(copy_test_data_to_tmp, monkeypatch): monkeypatch.chdir("valid_config_file/forward_models") parser = MockParser() From 53f78e3a7744f845713c107fcbdbe6d49115fbbe Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Wed, 22 Jan 2025 10:17:31 +0100 Subject: [PATCH 13/48] Fix mac select string --- .github/workflows/build_and_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 8921113e99f..c2df15631f4 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -109,13 +109,13 @@ jobs: test-type: [ 'performance-tests', 'unit-tests', 'gui-tests', 'cli-tests' ] python-version: [ '3.12' ] os: [ 'macos-latest'] - select-string: ['"not skip_mac_ci"'] uses: ./.github/workflows/test_ert.yml with: os: ${{ matrix.os }} python-version: ${{ matrix.python-version }} test-type: ${{ matrix.test-type }} + select-string: '"not skip_mac_ci"' secrets: inherit docs-ert: From bef42617360d524dcf7137279c99691d0028ae59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Berland?= Date: Tue, 21 Jan 2025 09:39:16 +0100 Subject: [PATCH 14/48] Add tests for flow vs OMP_NUM_THREADS This serves as documentation and verification of the current interplay between ert, the plugin configuration of ert and the flowrun wrapper, and the flow binary itself. --- .../ui_tests/cli/test_run_flow_simulator.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/tests/ert/ui_tests/cli/test_run_flow_simulator.py b/tests/ert/ui_tests/cli/test_run_flow_simulator.py index 5ffdeb24942..13d173c3060 100644 --- a/tests/ert/ui_tests/cli/test_run_flow_simulator.py +++ b/tests/ert/ui_tests/cli/test_run_flow_simulator.py @@ -128,6 +128,39 @@ def test_ert_will_fetch_parallel_keyword_and_set_mpi_processes(): assert re.search(r"Threads per MPI process:\s+1", flow_stdout) +@pytest.mark.usefixtures("eightcells") +@pytest.mark.skipif(not shutil.which("flowrun"), reason="flowrun not available") +@pytest.mark.parametrize("num_cpu", [1, 2]) +def test_flow_will_always_obey_omp_num_threads_also_when_mpi_is_active(num_cpu): + """This part of flow Ert cannot control, and this scenario should thus be + avoided. However, if the users use SETENV manually it will happen. + SETENV takes precedence over plugin env configuration so configuriation of + the FLOW forward model through plugins will not help either.""" + deck = Path("EIGHTCELLS.DATA").read_text(encoding="utf-8") + assert "PARALLEL" not in deck + Path("flow.ert").write_text( + dedent(f""" + NUM_REALIZATIONS 1 + ECLBASE EIGHTCELLS + NUM_CPU {num_cpu} + DATA_FILE EIGHTCELLS.DATA + SETENV OMP_NUM_THREADS 2 + RUNPATH realization- + FORWARD_MODEL FLOW() + """).strip(), + encoding="utf-8", + ) + + run_cli(TEST_RUN_MODE, "--disable-monitoring", "flow.ert") + flow_stdout = Path("realization-0/FLOW.stdout.0").read_text(encoding="utf-8") + assert ( + "Warning: Environment variable OMP_NUM_THREADS takes precedence over the --threads-per-process" + in flow_stdout + ) + assert re.search(rf"Number of MPI processes:\s+{num_cpu}", flow_stdout) + assert re.search(r"Threads per MPI process:\s+2", flow_stdout) + + @pytest.mark.usefixtures("eightcells") @pytest.mark.skipif(not shutil.which("flowrun"), reason="flowrun not available") def test_num_cpu_wins_over_parallel_in_deck(): From f4eb706c1a80781d5c6ac930319341e1688aa385 Mon Sep 17 00:00:00 2001 From: Jonathan Karlsen Date: Tue, 21 Jan 2025 12:49:06 +0100 Subject: [PATCH 15/48] Fix unable to have path object in argslist for localdriver --- src/ert/scheduler/local_driver.py | 6 +++--- tests/ert/unit_tests/scheduler/test_local_driver.py | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/ert/scheduler/local_driver.py b/src/ert/scheduler/local_driver.py index 6db0bd838f8..4fbb532b053 100644 --- a/src/ert/scheduler/local_driver.py +++ b/src/ert/scheduler/local_driver.py @@ -63,9 +63,9 @@ async def finish(self) -> None: raise result logger.info("All realization tasks finished") - async def _run(self, iens: int, executable: str, /, *args: str) -> None: + async def _run(self, iens: int, executable: str, /, *args: str | Path) -> None: logger.debug( - f"Submitting realization {iens} as command '{executable} {' '.join(args)}'" + f"Submitting realization {iens} as command '{executable} {' '.join(str(arg) for arg in args)}'" ) try: proc = await self._init( @@ -100,7 +100,7 @@ async def _dispatch_finished_event(self, iens: int, returncode: int) -> None: self._sent_finished_events.add(iens) @staticmethod - async def _init(iens: int, executable: str, /, *args: str) -> Process: + async def _init(iens: int, executable: str, /, *args: str | Path) -> Process: """This method exists to allow for mocking it in tests""" return await asyncio.create_subprocess_exec( executable, diff --git a/tests/ert/unit_tests/scheduler/test_local_driver.py b/tests/ert/unit_tests/scheduler/test_local_driver.py index 473e8e24c76..40c947e97d5 100644 --- a/tests/ert/unit_tests/scheduler/test_local_driver.py +++ b/tests/ert/unit_tests/scheduler/test_local_driver.py @@ -129,3 +129,15 @@ async def test_that_killing_killed_job_does_not_raise(): await driver.kill(23) await driver.kill(23) assert driver.event_queue.empty() + + +@pytest.mark.timeout(10) +async def test_path_as_argument_is_valid(tmp_path): + driver = LocalDriver() + os.chdir(tmp_path) + + await driver.submit(42, "/usr/bin/env", "touch", Path(tmp_path) / "testfile") + assert await driver.event_queue.get() == StartedEvent(iens=42) + assert await driver.event_queue.get() == FinishedEvent(iens=42, returncode=0) + + assert Path("testfile").exists() From 8dfe8abef00ca4503ad0fb8718d6cc439754374d Mon Sep 17 00:00:00 2001 From: larsevj Date: Wed, 22 Jan 2025 09:55:13 +0100 Subject: [PATCH 16/48] Divide instead of multiply with observation errors in misfit preprocessor --- src/ert/analysis/misfit_preprocessor.py | 2 +- .../0-misfit_preprocess0/update_log | 424 +++++++++--------- .../0-misfit_preprocess2/update_log | 424 +++++++++--------- .../0-misfit_preprocess3/update_log | 424 +++++++++--------- 4 files changed, 637 insertions(+), 637 deletions(-) diff --git a/src/ert/analysis/misfit_preprocessor.py b/src/ert/analysis/misfit_preprocessor.py index beb6a5e21c7..af5ac5f5e7b 100644 --- a/src/ert/analysis/misfit_preprocessor.py +++ b/src/ert/analysis/misfit_preprocessor.py @@ -132,7 +132,7 @@ def main( scale_factors = np.ones(len(obs_errors)) nr_components = np.ones(len(obs_errors), dtype=int) - scaled_responses = responses * obs_errors.reshape(-1, 1) + scaled_responses = responses / obs_errors.reshape(-1, 1) if len(obs_errors) <= 2: # Either observations are not correlated, or only correlated diff --git a/tests/ert/unit_tests/analysis/snapshots/test_es_update/test_update_report/0-misfit_preprocess0/update_log b/tests/ert/unit_tests/analysis/snapshots/test_es_update/test_update_report/0-misfit_preprocess0/update_log index c3046ca1832..816518149a4 100644 --- a/tests/ert/unit_tests/analysis/snapshots/test_es_update/test_update_report/0-misfit_preprocess0/update_log +++ b/tests/ert/unit_tests/analysis/snapshots/test_es_update/test_update_report/0-misfit_preprocess0/update_log @@ -1,212 +1,212 @@ ------------- ----------------------- ----- ----- ----- ----- ------ ----- ------ -FOPR 2010-01-10 00:00:00.000 0.002 0.100 5.657 0.566 0.076 0.105 Active -FOPR 2010-01-20 00:00:00.000 0.008 0.100 5.657 0.566 0.079 0.107 Active -FOPR 2010-01-30 00:00:00.000 0.018 0.100 5.657 0.566 0.085 0.110 Active -FOPR 2010-02-09 00:00:00.000 0.032 0.100 5.657 0.566 0.092 0.114 Active -FOPR 2010-02-19 00:00:00.000 0.050 0.100 5.657 0.566 0.103 0.118 Active -FOPR 2010-03-01 00:00:00.000 0.071 0.100 5.657 0.566 0.117 0.122 Active -FOPR 2010-03-11 00:00:00.000 0.097 0.100 5.657 0.566 0.133 0.128 Active -FOPR 2010-03-21 00:00:00.000 0.126 0.100 5.657 0.566 0.151 0.134 Active -FOPR 2010-03-31 00:00:00.000 0.159 0.100 5.657 0.566 0.171 0.140 Active -FOPR 2010-04-10 00:00:00.000 0.194 0.100 5.657 0.566 0.193 0.148 Active -FOPR 2010-04-20 00:00:00.000 0.233 0.100 5.385 0.539 0.221 0.154 Active -FOPR 2010-04-30 00:00:00.000 0.274 0.100 5.385 0.539 0.251 0.161 Active -FOPR 2010-05-10 00:00:00.000 0.318 0.100 5.385 0.539 0.293 0.164 Active -FOPR 2010-05-20 00:00:00.000 0.363 0.100 5.385 0.539 0.340 0.163 Active -FOPR 2010-05-30 00:00:00.000 0.411 0.100 5.385 0.539 0.389 0.163 Active -FOPR 2010-06-09 00:00:00.000 0.460 0.100 5.385 0.539 0.439 0.163 Active -FOPR 2010-06-19 00:00:00.000 0.510 0.100 5.385 0.539 0.491 0.164 Active -FOPR 2010-06-29 00:00:00.000 0.561 0.100 5.657 0.566 0.544 0.164 Active -FOPR 2010-07-09 00:00:00.000 0.613 0.100 5.657 0.566 0.598 0.164 Active -FOPR 2010-07-19 00:00:00.000 0.666 0.100 5.657 0.566 0.652 0.163 Active -FOPR 2010-07-29 00:00:00.000 0.718 0.100 5.657 0.566 0.706 0.164 Active -FOPR 2010-08-08 00:00:00.000 0.770 0.100 3.317 0.332 0.760 0.164 Active -FOPR 2010-08-18 00:00:00.000 0.823 0.100 3.317 0.332 0.813 0.164 Active -FOPR 2010-08-28 00:00:00.000 0.875 0.100 3.317 0.332 0.864 0.164 Active -FOPR 2010-09-07 00:00:00.000 0.926 0.100 3.317 0.332 0.914 0.165 Active -FOPR 2010-09-17 00:00:00.000 0.977 0.100 3.317 0.332 0.963 0.165 Active -FOPR 2010-09-27 00:00:00.000 1.027 0.103 3.317 0.341 1.008 0.167 Active -FOPR 2010-10-07 00:00:00.000 1.075 0.108 3.317 0.357 1.049 0.169 Active -FOPR 2010-10-17 00:00:00.000 1.122 0.112 3.317 0.372 1.089 0.171 Active -FOPR 2010-10-27 00:00:00.000 1.166 0.117 3.317 0.387 1.126 0.172 Active -FOPR 2010-11-06 00:00:00.000 1.208 0.121 3.317 0.400 1.160 0.174 Active -FOPR 2010-11-16 00:00:00.000 1.247 0.125 3.317 0.414 1.192 0.175 Active -FOPR 2010-11-26 00:00:00.000 1.284 0.128 2.000 0.257 1.219 0.175 Active -FOPR 2010-12-06 00:00:00.000 1.317 0.132 2.000 0.263 1.243 0.175 Active -FOPR 2010-12-16 00:00:00.000 1.346 0.135 2.000 0.269 1.263 0.176 Active -FOPR 2010-12-26 00:00:00.000 1.371 0.137 2.000 0.274 1.279 0.176 Active -FOPR 2011-01-05 00:00:00.000 1.392 0.139 3.317 0.462 1.292 0.177 Active -FOPR 2011-01-15 00:00:00.000 1.407 0.141 3.317 0.467 1.300 0.179 Active -FOPR 2011-01-25 00:00:00.000 1.418 0.142 3.317 0.470 1.303 0.181 Active -FOPR 2011-02-04 00:00:00.000 1.422 0.142 3.317 0.472 1.303 0.183 Active -FOPR 2011-02-14 00:00:00.000 1.424 0.142 3.317 0.472 1.299 0.185 Active -FOPR 2011-02-24 00:00:00.000 1.425 0.143 3.317 0.473 1.294 0.187 Active -FOPR 2011-03-06 00:00:00.000 1.427 0.143 3.317 0.473 1.290 0.188 Active -FOPR 2011-03-16 00:00:00.000 1.430 0.143 3.317 0.474 1.283 0.189 Active -FOPR 2011-03-26 00:00:00.000 1.433 0.143 3.317 0.475 1.275 0.187 Active -FOPR 2011-04-05 00:00:00.000 1.438 0.144 3.317 0.477 1.263 0.186 Active -FOPR 2011-04-15 00:00:00.000 1.443 0.144 3.317 0.479 1.250 0.186 Active -FOPR 2011-04-25 00:00:00.000 1.449 0.145 3.000 0.435 1.237 0.186 Active -FOPR 2011-05-05 00:00:00.000 1.455 0.145 3.000 0.436 1.222 0.185 Active -FOPR 2011-05-15 00:00:00.000 1.460 0.146 3.000 0.438 1.207 0.184 Active -FOPR 2011-05-25 00:00:00.000 1.466 0.147 4.472 0.655 1.190 0.184 Active -FOPR 2011-06-04 00:00:00.000 1.470 0.147 4.472 0.658 1.170 0.183 Active -FOPR 2011-06-14 00:00:00.000 1.474 0.147 4.472 0.659 1.146 0.183 Active -FOPR 2011-06-24 00:00:00.000 1.475 0.148 4.472 0.660 1.122 0.184 Active -FOPR 2011-07-04 00:00:00.000 1.474 0.147 3.000 0.442 1.098 0.188 Active -FOPR 2011-07-14 00:00:00.000 1.469 0.147 4.472 0.657 1.077 0.192 Active -FOPR 2011-07-24 00:00:00.000 1.461 0.146 4.472 0.653 1.053 0.194 Active -FOPR 2011-08-03 00:00:00.000 1.449 0.145 3.000 0.435 1.027 0.196 Active -FOPR 2011-08-13 00:00:00.000 1.436 0.144 4.472 0.642 1.002 0.196 Active -FOPR 2011-08-23 00:00:00.000 1.421 0.142 4.472 0.636 0.975 0.197 Active -FOPR 2011-09-02 00:00:00.000 1.403 0.140 3.000 0.421 0.947 0.200 Active -FOPR 2011-09-12 00:00:00.000 1.379 0.138 4.472 0.617 0.928 0.200 Active -FOPR 2011-09-22 00:00:00.000 1.353 0.135 4.472 0.605 0.902 0.203 Active -FOPR 2011-10-02 00:00:00.000 1.324 0.132 4.472 0.592 0.878 0.206 Active -FOPR 2011-10-12 00:00:00.000 1.297 0.130 4.472 0.580 0.851 0.210 Active -FOPR 2011-10-22 00:00:00.000 1.270 0.127 3.000 0.381 0.824 0.213 Active -FOPR 2011-11-01 00:00:00.000 1.243 0.124 3.000 0.373 0.801 0.215 Active -FOPR 2011-11-11 00:00:00.000 1.216 0.122 3.000 0.365 0.781 0.216 Active -FOPR 2011-11-21 00:00:00.000 1.189 0.119 4.472 0.532 0.762 0.216 Active -FOPR 2011-12-01 00:00:00.000 1.161 0.116 4.472 0.519 0.744 0.215 Active -FOPR 2011-12-11 00:00:00.000 1.134 0.113 4.472 0.507 0.725 0.212 Active -FOPR 2011-12-21 00:00:00.000 1.112 0.111 4.472 0.497 0.704 0.206 Active -FOPR 2011-12-31 00:00:00.000 1.091 0.109 4.472 0.488 0.683 0.200 Active -FOPR 2012-01-10 00:00:00.000 1.072 0.107 4.472 0.479 0.661 0.194 Active -FOPR 2012-01-20 00:00:00.000 1.053 0.105 4.472 0.471 0.640 0.189 Active -FOPR 2012-01-30 00:00:00.000 1.033 0.103 4.472 0.462 0.619 0.185 Active -FOPR 2012-02-09 00:00:00.000 1.013 0.101 5.385 0.545 0.597 0.181 Active -FOPR 2012-02-19 00:00:00.000 0.995 0.100 5.385 0.539 0.576 0.176 Active -FOPR 2012-02-29 00:00:00.000 0.975 0.100 5.385 0.539 0.555 0.171 Active -FOPR 2012-03-10 00:00:00.000 0.956 0.100 5.385 0.539 0.533 0.171 Active -FOPR 2012-03-20 00:00:00.000 0.936 0.100 5.385 0.539 0.513 0.171 Active -FOPR 2012-03-30 00:00:00.000 0.916 0.100 5.385 0.539 0.494 0.170 Active -FOPR 2012-04-09 00:00:00.000 0.893 0.100 5.385 0.539 0.477 0.169 Active -FOPR 2012-04-19 00:00:00.000 0.869 0.100 5.385 0.539 0.462 0.169 Active -FOPR 2012-04-29 00:00:00.000 0.842 0.100 5.385 0.539 0.447 0.170 Active -FOPR 2012-05-09 00:00:00.000 0.812 0.100 5.385 0.539 0.432 0.170 Active -FOPR 2012-05-19 00:00:00.000 0.779 0.100 5.385 0.539 0.417 0.171 Active -FOPR 2012-05-29 00:00:00.000 0.742 0.100 5.385 0.539 0.403 0.170 Active -FOPR 2012-06-08 00:00:00.000 0.702 0.100 5.385 0.539 0.389 0.171 Active -FOPR 2012-06-18 00:00:00.000 0.661 0.100 5.385 0.539 0.379 0.171 Active -FOPR 2012-06-28 00:00:00.000 0.619 0.100 5.385 0.539 0.370 0.171 Active -FOPR 2012-07-08 00:00:00.000 0.578 0.100 5.385 0.539 0.361 0.169 Active -FOPR 2012-07-18 00:00:00.000 0.540 0.100 5.385 0.539 0.354 0.168 Active -FOPR 2012-07-28 00:00:00.000 0.505 0.100 5.385 0.539 0.349 0.166 Active -FOPR 2012-08-07 00:00:00.000 0.475 0.100 5.385 0.539 0.344 0.165 Active -FOPR 2012-08-17 00:00:00.000 0.450 0.100 5.385 0.539 0.340 0.165 Active -FOPR 2012-08-27 00:00:00.000 0.431 0.100 5.385 0.539 0.344 0.168 Active -FOPR 2012-09-06 00:00:00.000 0.419 0.100 5.385 0.539 0.350 0.171 Active -FOPR 2012-09-16 00:00:00.000 0.410 0.100 5.385 0.539 0.349 0.171 Active -FOPR 2012-09-26 00:00:00.000 0.406 0.100 5.385 0.539 0.350 0.173 Active -FOPR 2012-10-06 00:00:00.000 0.404 0.100 5.385 0.539 0.347 0.171 Active -FOPR 2012-10-16 00:00:00.000 0.399 0.100 5.385 0.539 0.344 0.168 Active -FOPR 2012-10-26 00:00:00.000 0.389 0.100 5.385 0.539 0.346 0.165 Active -FOPR 2012-11-05 00:00:00.000 0.374 0.100 5.385 0.539 0.348 0.162 Active -FOPR 2012-11-15 00:00:00.000 0.355 0.100 5.385 0.539 0.350 0.156 Active -FOPR 2012-11-25 00:00:00.000 0.332 0.100 1.732 0.173 0.350 0.148 Active -FOPR 2012-12-05 00:00:00.000 0.306 0.100 1.732 0.173 0.349 0.140 Active -FOPR 2012-12-15 00:00:00.000 0.282 0.100 1.732 0.173 0.348 0.133 Active -FOPR 2012-12-25 00:00:00.000 0.264 0.100 4.583 0.458 0.344 0.125 Active -FOPR 2013-01-04 00:00:00.000 0.248 0.100 4.583 0.458 0.340 0.118 Active -FOPR 2013-01-14 00:00:00.000 0.233 0.100 4.583 0.458 0.337 0.114 Active -FOPR 2013-01-24 00:00:00.000 0.219 0.100 4.583 0.458 0.335 0.112 Active -FOPR 2013-02-03 00:00:00.000 0.205 0.100 4.583 0.458 0.334 0.110 Active -FOPR 2013-02-13 00:00:00.000 0.192 0.100 4.583 0.458 0.333 0.110 Active -FOPR 2013-02-23 00:00:00.000 0.180 0.100 4.583 0.458 0.332 0.109 Active -FOPR 2013-03-05 00:00:00.000 0.169 0.100 4.583 0.458 0.330 0.107 Active -FOPR 2013-03-15 00:00:00.000 0.160 0.100 4.583 0.458 0.327 0.106 Active -FOPR 2013-03-25 00:00:00.000 0.152 0.100 4.583 0.458 0.323 0.105 Active -FOPR 2013-04-04 00:00:00.000 0.146 0.100 4.583 0.458 0.317 0.102 Active -FOPR 2013-04-14 00:00:00.000 0.141 0.100 4.583 0.458 0.310 0.100 Active -FOPR 2013-04-24 00:00:00.000 0.137 0.100 4.583 0.458 0.303 0.098 Active -FOPR 2013-05-04 00:00:00.000 0.134 0.100 4.583 0.458 0.296 0.096 Active -FOPR 2013-05-14 00:00:00.000 0.130 0.100 4.583 0.458 0.290 0.094 Active -FOPR 2013-05-24 00:00:00.000 0.127 0.100 4.583 0.458 0.284 0.092 Active -FOPR 2013-06-03 00:00:00.000 0.123 0.100 4.583 0.458 0.279 0.090 Active -FOPR 2013-06-13 00:00:00.000 0.119 0.100 4.583 0.458 0.275 0.088 Active -FOPR 2013-06-23 00:00:00.000 0.120 0.100 4.583 0.458 0.270 0.085 Active -FOPR 2013-07-03 00:00:00.000 0.128 0.100 4.583 0.458 0.266 0.081 Active -FOPR 2013-07-13 00:00:00.000 0.136 0.100 4.583 0.458 0.263 0.077 Active -FOPR 2013-07-23 00:00:00.000 0.143 0.100 1.000 0.100 0.261 0.073 Active -FOPR 2013-08-02 00:00:00.000 0.150 0.100 2.000 0.200 0.258 0.069 Active -FOPR 2013-08-12 00:00:00.000 0.155 0.100 2.000 0.200 0.256 0.066 Active -FOPR 2013-08-22 00:00:00.000 0.159 0.100 2.000 0.200 0.254 0.063 Active -FOPR 2013-09-01 00:00:00.000 0.163 0.100 2.000 0.200 0.251 0.061 Active -FOPR 2013-09-11 00:00:00.000 0.166 0.100 3.464 0.346 0.248 0.059 Active -FOPR 2013-09-21 00:00:00.000 0.167 0.100 3.464 0.346 0.247 0.058 Active -FOPR 2013-10-01 00:00:00.000 0.167 0.100 3.464 0.346 0.245 0.058 Active -FOPR 2013-10-11 00:00:00.000 0.166 0.100 3.464 0.346 0.243 0.058 Active -FOPR 2013-10-21 00:00:00.000 0.165 0.100 3.464 0.346 0.243 0.058 Active -FOPR 2013-10-31 00:00:00.000 0.164 0.100 3.464 0.346 0.242 0.059 Active -FOPR 2013-11-10 00:00:00.000 0.165 0.100 3.464 0.346 0.243 0.059 Active -FOPR 2013-11-20 00:00:00.000 0.169 0.100 3.464 0.346 0.243 0.059 Active -FOPR 2013-11-30 00:00:00.000 0.176 0.100 3.464 0.346 0.242 0.058 Active -FOPR 2013-12-10 00:00:00.000 0.186 0.100 3.464 0.346 0.242 0.057 Active -FOPR 2013-12-20 00:00:00.000 0.197 0.100 3.464 0.346 0.241 0.057 Active -FOPR 2013-12-30 00:00:00.000 0.211 0.100 3.464 0.346 0.239 0.058 Active -FOPR 2014-01-09 00:00:00.000 0.225 0.100 1.000 0.100 0.238 0.059 Active -FOPR 2014-01-19 00:00:00.000 0.239 0.100 1.414 0.141 0.238 0.061 Active -FOPR 2014-01-29 00:00:00.000 0.252 0.100 1.414 0.141 0.238 0.061 Active -FOPR 2014-02-08 00:00:00.000 0.264 0.100 2.236 0.224 0.237 0.061 Active -FOPR 2014-02-18 00:00:00.000 0.275 0.100 2.236 0.224 0.236 0.062 Active -FOPR 2014-02-28 00:00:00.000 0.285 0.100 2.236 0.224 0.236 0.064 Active -FOPR 2014-03-10 00:00:00.000 0.295 0.100 2.236 0.224 0.236 0.066 Active -FOPR 2014-03-20 00:00:00.000 0.303 0.100 2.236 0.224 0.235 0.069 Active -FOPR 2014-03-30 00:00:00.000 0.309 0.100 2.449 0.245 0.234 0.072 Active -FOPR 2014-04-09 00:00:00.000 0.312 0.100 2.449 0.245 0.231 0.074 Active -FOPR 2014-04-19 00:00:00.000 0.313 0.100 2.449 0.245 0.229 0.076 Active -FOPR 2014-04-29 00:00:00.000 0.310 0.100 2.449 0.245 0.225 0.077 Active -FOPR 2014-05-09 00:00:00.000 0.304 0.100 2.449 0.245 0.220 0.078 Active -FOPR 2014-05-19 00:00:00.000 0.296 0.100 2.449 0.245 0.215 0.078 Active -FOPR 2014-05-29 00:00:00.000 0.286 0.100 5.657 0.566 0.209 0.078 Active -FOPR 2014-06-08 00:00:00.000 0.275 0.100 5.657 0.566 0.202 0.078 Active -FOPR 2014-06-18 00:00:00.000 0.264 0.100 5.657 0.566 0.195 0.079 Active -FOPR 2014-06-28 00:00:00.000 0.253 0.100 5.657 0.566 0.188 0.079 Active -FOPR 2014-07-08 00:00:00.000 0.241 0.100 5.657 0.566 0.181 0.080 Active -FOPR 2014-07-18 00:00:00.000 0.230 0.100 5.657 0.566 0.173 0.082 Active -FOPR 2014-07-28 00:00:00.000 0.218 0.100 5.657 0.566 0.167 0.084 Active -FOPR 2014-08-07 00:00:00.000 0.207 0.100 5.657 0.566 0.161 0.086 Active -FOPR 2014-08-17 00:00:00.000 0.197 0.100 5.657 0.566 0.155 0.088 Active -FOPR 2014-08-27 00:00:00.000 0.187 0.100 5.657 0.566 0.149 0.090 Active -FOPR 2014-09-06 00:00:00.000 0.178 0.100 5.657 0.566 0.143 0.092 Active -FOPR 2014-09-16 00:00:00.000 0.168 0.100 5.385 0.539 0.138 0.094 Active -FOPR 2014-09-26 00:00:00.000 0.159 0.100 5.385 0.539 0.132 0.095 Active -FOPR 2014-10-06 00:00:00.000 0.150 0.100 5.385 0.539 0.128 0.096 Active -FOPR 2014-10-16 00:00:00.000 0.141 0.100 5.385 0.539 0.124 0.096 Active -FOPR 2014-10-26 00:00:00.000 0.134 0.100 5.385 0.539 0.120 0.096 Active -FOPR 2014-11-05 00:00:00.000 0.127 0.100 5.385 0.539 0.116 0.097 Active -FOPR 2014-11-15 00:00:00.000 0.120 0.100 5.385 0.539 0.113 0.097 Active -FOPR 2014-11-25 00:00:00.000 0.115 0.100 5.385 0.539 0.110 0.096 Active -FOPR 2014-12-05 00:00:00.000 0.111 0.100 5.385 0.539 0.107 0.096 Active -FOPR 2014-12-15 00:00:00.000 0.107 0.100 5.385 0.539 0.105 0.095 Active -FOPR 2014-12-25 00:00:00.000 0.101 0.100 5.385 0.539 0.102 0.095 Active -FOPR 2015-01-04 00:00:00.000 0.096 0.100 5.385 0.539 0.100 0.095 Active -FOPR 2015-01-14 00:00:00.000 0.089 0.100 5.385 0.539 0.097 0.096 Active -FOPR 2015-01-24 00:00:00.000 0.081 0.100 5.385 0.539 0.094 0.096 Active -FOPR 2015-02-03 00:00:00.000 0.073 0.100 5.385 0.539 0.092 0.098 Active -FOPR 2015-02-13 00:00:00.000 0.065 0.100 5.385 0.539 0.090 0.099 Active -FOPR 2015-02-23 00:00:00.000 0.058 0.100 5.385 0.539 0.088 0.101 Active -FOPR 2015-03-05 00:00:00.000 0.050 0.100 5.385 0.539 0.087 0.103 Active -FOPR 2015-03-15 00:00:00.000 0.044 0.100 5.385 0.539 0.086 0.104 Active -FOPR 2015-03-25 00:00:00.000 0.038 0.100 5.385 0.539 0.085 0.106 Active -FOPR 2015-04-04 00:00:00.000 0.033 0.100 5.385 0.539 0.084 0.107 Active -FOPR 2015-04-14 00:00:00.000 0.029 0.100 5.385 0.539 0.084 0.108 Active -FOPR 2015-04-24 00:00:00.000 0.026 0.100 5.657 0.566 0.084 0.108 Active -FOPR 2015-05-04 00:00:00.000 0.024 0.100 5.657 0.566 0.084 0.109 Active -FOPR 2015-05-14 00:00:00.000 0.022 0.100 5.657 0.566 0.084 0.109 Active -FOPR 2015-05-24 00:00:00.000 0.021 0.100 5.657 0.566 0.084 0.109 Active -FOPR 2015-06-03 00:00:00.000 0.020 0.100 5.657 0.566 0.084 0.110 Active -FOPR 2015-06-13 00:00:00.000 0.020 0.100 5.657 0.566 0.084 0.110 Active -FOPR 2015-06-23 00:00:00.000 0.020 0.100 5.657 0.566 0.084 0.110 Active -WOPR_OP1_108 2012-12-15 00:00:00.000 0.300 0.075 1.000 0.075 0.257 0.099 Active -WOPR_OP1_144 2013-12-10 00:00:00.000 0.200 0.035 1.000 0.035 0.183 0.106 Active -WOPR_OP1_190 2015-03-15 00:00:00.000 0.015 0.010 1.732 0.017 0.042 0.041 Active -WOPR_OP1_36 2010-12-26 00:00:00.000 0.700 0.070 1.732 0.121 0.650 0.084 Active -WOPR_OP1_72 2011-12-21 00:00:00.000 0.500 0.050 1.000 0.050 0.405 0.170 Active -WOPR_OP1_9 2010-03-31 00:00:00.000 0.100 0.050 1.732 0.087 0.096 0.060 Active -WPR_DIFF_1 199, 1200 0.200 0.150 1.000 0.150 0.073 0.130 Active -WPR_DIFF_1 199, 1800 0.000 0.050 1.000 0.050 0.127 0.125 Active -WPR_DIFF_1 199, 400 0.000 0.100 1.000 0.100 -0.011 0.060 Active -WPR_DIFF_1 199, 800 0.100 0.200 1.000 0.200 0.081 0.126 Active ------------- ----------------------- ----- ----- ----- ----- ------ ----- ------ +------------ ----------------------- ----- ----- ------ ----- ------ ----- ------ +FOPR 2010-01-10 00:00:00.000 0.002 0.100 14.491 1.449 0.076 0.105 Active +FOPR 2010-01-20 00:00:00.000 0.008 0.100 14.491 1.449 0.079 0.107 Active +FOPR 2010-01-30 00:00:00.000 0.018 0.100 14.491 1.449 0.085 0.110 Active +FOPR 2010-02-09 00:00:00.000 0.032 0.100 14.491 1.449 0.092 0.114 Active +FOPR 2010-02-19 00:00:00.000 0.050 0.100 14.491 1.449 0.103 0.118 Active +FOPR 2010-03-01 00:00:00.000 0.071 0.100 14.491 1.449 0.117 0.122 Active +FOPR 2010-03-11 00:00:00.000 0.097 0.100 14.491 1.449 0.133 0.128 Active +FOPR 2010-03-21 00:00:00.000 0.126 0.100 14.491 1.449 0.151 0.134 Active +FOPR 2010-03-31 00:00:00.000 0.159 0.100 14.491 1.449 0.171 0.140 Active +FOPR 2010-04-10 00:00:00.000 0.194 0.100 14.491 1.449 0.193 0.148 Active +FOPR 2010-04-20 00:00:00.000 0.233 0.100 14.491 1.449 0.221 0.154 Active +FOPR 2010-04-30 00:00:00.000 0.274 0.100 14.491 1.449 0.251 0.161 Active +FOPR 2010-05-10 00:00:00.000 0.318 0.100 14.491 1.449 0.293 0.164 Active +FOPR 2010-05-20 00:00:00.000 0.363 0.100 14.491 1.449 0.340 0.163 Active +FOPR 2010-05-30 00:00:00.000 0.411 0.100 14.491 1.449 0.389 0.163 Active +FOPR 2010-06-09 00:00:00.000 0.460 0.100 14.491 1.449 0.439 0.163 Active +FOPR 2010-06-19 00:00:00.000 0.510 0.100 14.491 1.449 0.491 0.164 Active +FOPR 2010-06-29 00:00:00.000 0.561 0.100 14.491 1.449 0.544 0.164 Active +FOPR 2010-07-09 00:00:00.000 0.613 0.100 14.491 1.449 0.598 0.164 Active +FOPR 2010-07-19 00:00:00.000 0.666 0.100 14.491 1.449 0.652 0.163 Active +FOPR 2010-07-29 00:00:00.000 0.718 0.100 14.491 1.449 0.706 0.164 Active +FOPR 2010-08-08 00:00:00.000 0.770 0.100 14.491 1.449 0.760 0.164 Active +FOPR 2010-08-18 00:00:00.000 0.823 0.100 14.491 1.449 0.813 0.164 Active +FOPR 2010-08-28 00:00:00.000 0.875 0.100 14.491 1.449 0.864 0.164 Active +FOPR 2010-09-07 00:00:00.000 0.926 0.100 14.491 1.449 0.914 0.165 Active +FOPR 2010-09-17 00:00:00.000 0.977 0.100 14.491 1.449 0.963 0.165 Active +FOPR 2010-09-27 00:00:00.000 1.027 0.103 14.491 1.488 1.008 0.167 Active +FOPR 2010-10-07 00:00:00.000 1.075 0.108 14.491 1.558 1.049 0.169 Active +FOPR 2010-10-17 00:00:00.000 1.122 0.112 14.491 1.625 1.089 0.171 Active +FOPR 2010-10-27 00:00:00.000 1.166 0.117 14.491 1.689 1.126 0.172 Active +FOPR 2010-11-06 00:00:00.000 1.208 0.121 14.491 1.750 1.160 0.174 Active +FOPR 2010-11-16 00:00:00.000 1.247 0.125 14.491 1.807 1.192 0.175 Active +FOPR 2010-11-26 00:00:00.000 1.284 0.128 14.491 1.860 1.219 0.175 Active +FOPR 2010-12-06 00:00:00.000 1.317 0.132 14.491 1.908 1.243 0.175 Active +FOPR 2010-12-16 00:00:00.000 1.346 0.135 14.491 1.951 1.263 0.176 Active +FOPR 2010-12-26 00:00:00.000 1.371 0.137 14.491 1.987 1.279 0.176 Active +FOPR 2011-01-05 00:00:00.000 1.392 0.139 14.491 2.017 1.292 0.177 Active +FOPR 2011-01-15 00:00:00.000 1.407 0.141 14.491 2.039 1.300 0.179 Active +FOPR 2011-01-25 00:00:00.000 1.418 0.142 14.491 2.054 1.303 0.181 Active +FOPR 2011-02-04 00:00:00.000 1.422 0.142 14.491 2.061 1.303 0.183 Active +FOPR 2011-02-14 00:00:00.000 1.424 0.142 14.491 2.063 1.299 0.185 Active +FOPR 2011-02-24 00:00:00.000 1.425 0.143 14.491 2.065 1.294 0.187 Active +FOPR 2011-03-06 00:00:00.000 1.427 0.143 14.491 2.068 1.290 0.188 Active +FOPR 2011-03-16 00:00:00.000 1.430 0.143 14.491 2.072 1.283 0.189 Active +FOPR 2011-03-26 00:00:00.000 1.433 0.143 14.491 2.077 1.275 0.187 Active +FOPR 2011-04-05 00:00:00.000 1.438 0.144 14.491 2.083 1.263 0.186 Active +FOPR 2011-04-15 00:00:00.000 1.443 0.144 14.491 2.091 1.250 0.186 Active +FOPR 2011-04-25 00:00:00.000 1.449 0.145 14.491 2.100 1.237 0.186 Active +FOPR 2011-05-05 00:00:00.000 1.455 0.145 14.491 2.108 1.222 0.185 Active +FOPR 2011-05-15 00:00:00.000 1.460 0.146 14.491 2.116 1.207 0.184 Active +FOPR 2011-05-25 00:00:00.000 1.466 0.147 14.491 2.124 1.190 0.184 Active +FOPR 2011-06-04 00:00:00.000 1.470 0.147 14.491 2.131 1.170 0.183 Active +FOPR 2011-06-14 00:00:00.000 1.474 0.147 14.491 2.136 1.146 0.183 Active +FOPR 2011-06-24 00:00:00.000 1.475 0.148 14.491 2.138 1.122 0.184 Active +FOPR 2011-07-04 00:00:00.000 1.474 0.147 14.491 2.136 1.098 0.188 Active +FOPR 2011-07-14 00:00:00.000 1.469 0.147 14.491 2.129 1.077 0.192 Active +FOPR 2011-07-24 00:00:00.000 1.461 0.146 14.491 2.117 1.053 0.194 Active +FOPR 2011-08-03 00:00:00.000 1.449 0.145 14.491 2.101 1.027 0.196 Active +FOPR 2011-08-13 00:00:00.000 1.436 0.144 14.491 2.082 1.002 0.196 Active +FOPR 2011-08-23 00:00:00.000 1.421 0.142 14.491 2.060 0.975 0.197 Active +FOPR 2011-09-02 00:00:00.000 1.403 0.140 14.491 2.033 0.947 0.200 Active +FOPR 2011-09-12 00:00:00.000 1.379 0.138 14.491 1.999 0.928 0.200 Active +FOPR 2011-09-22 00:00:00.000 1.353 0.135 14.491 1.960 0.902 0.203 Active +FOPR 2011-10-02 00:00:00.000 1.324 0.132 14.491 1.919 0.878 0.206 Active +FOPR 2011-10-12 00:00:00.000 1.297 0.130 14.491 1.879 0.851 0.210 Active +FOPR 2011-10-22 00:00:00.000 1.270 0.127 14.491 1.841 0.824 0.213 Active +FOPR 2011-11-01 00:00:00.000 1.243 0.124 14.491 1.802 0.801 0.215 Active +FOPR 2011-11-11 00:00:00.000 1.216 0.122 14.491 1.762 0.781 0.216 Active +FOPR 2011-11-21 00:00:00.000 1.189 0.119 14.491 1.723 0.762 0.216 Active +FOPR 2011-12-01 00:00:00.000 1.161 0.116 14.491 1.683 0.744 0.215 Active +FOPR 2011-12-11 00:00:00.000 1.134 0.113 14.491 1.644 0.725 0.212 Active +FOPR 2011-12-21 00:00:00.000 1.112 0.111 14.491 1.611 0.704 0.206 Active +FOPR 2011-12-31 00:00:00.000 1.091 0.109 14.491 1.581 0.683 0.200 Active +FOPR 2012-01-10 00:00:00.000 1.072 0.107 14.491 1.553 0.661 0.194 Active +FOPR 2012-01-20 00:00:00.000 1.053 0.105 14.491 1.526 0.640 0.189 Active +FOPR 2012-01-30 00:00:00.000 1.033 0.103 14.491 1.496 0.619 0.185 Active +FOPR 2012-02-09 00:00:00.000 1.013 0.101 14.491 1.468 0.597 0.181 Active +FOPR 2012-02-19 00:00:00.000 0.995 0.100 14.491 1.449 0.576 0.176 Active +FOPR 2012-02-29 00:00:00.000 0.975 0.100 14.491 1.449 0.555 0.171 Active +FOPR 2012-03-10 00:00:00.000 0.956 0.100 14.491 1.449 0.533 0.171 Active +FOPR 2012-03-20 00:00:00.000 0.936 0.100 14.491 1.449 0.513 0.171 Active +FOPR 2012-03-30 00:00:00.000 0.916 0.100 14.491 1.449 0.494 0.170 Active +FOPR 2012-04-09 00:00:00.000 0.893 0.100 14.491 1.449 0.477 0.169 Active +FOPR 2012-04-19 00:00:00.000 0.869 0.100 14.491 1.449 0.462 0.169 Active +FOPR 2012-04-29 00:00:00.000 0.842 0.100 14.491 1.449 0.447 0.170 Active +FOPR 2012-05-09 00:00:00.000 0.812 0.100 14.491 1.449 0.432 0.170 Active +FOPR 2012-05-19 00:00:00.000 0.779 0.100 14.491 1.449 0.417 0.171 Active +FOPR 2012-05-29 00:00:00.000 0.742 0.100 14.491 1.449 0.403 0.170 Active +FOPR 2012-06-08 00:00:00.000 0.702 0.100 14.491 1.449 0.389 0.171 Active +FOPR 2012-06-18 00:00:00.000 0.661 0.100 14.491 1.449 0.379 0.171 Active +FOPR 2012-06-28 00:00:00.000 0.619 0.100 14.491 1.449 0.370 0.171 Active +FOPR 2012-07-08 00:00:00.000 0.578 0.100 14.491 1.449 0.361 0.169 Active +FOPR 2012-07-18 00:00:00.000 0.540 0.100 14.491 1.449 0.354 0.168 Active +FOPR 2012-07-28 00:00:00.000 0.505 0.100 14.491 1.449 0.349 0.166 Active +FOPR 2012-08-07 00:00:00.000 0.475 0.100 14.491 1.449 0.344 0.165 Active +FOPR 2012-08-17 00:00:00.000 0.450 0.100 14.491 1.449 0.340 0.165 Active +FOPR 2012-08-27 00:00:00.000 0.431 0.100 14.491 1.449 0.344 0.168 Active +FOPR 2012-09-06 00:00:00.000 0.419 0.100 14.491 1.449 0.350 0.171 Active +FOPR 2012-09-16 00:00:00.000 0.410 0.100 14.491 1.449 0.349 0.171 Active +FOPR 2012-09-26 00:00:00.000 0.406 0.100 14.491 1.449 0.350 0.173 Active +FOPR 2012-10-06 00:00:00.000 0.404 0.100 14.491 1.449 0.347 0.171 Active +FOPR 2012-10-16 00:00:00.000 0.399 0.100 14.491 1.449 0.344 0.168 Active +FOPR 2012-10-26 00:00:00.000 0.389 0.100 14.491 1.449 0.346 0.165 Active +FOPR 2012-11-05 00:00:00.000 0.374 0.100 14.491 1.449 0.348 0.162 Active +FOPR 2012-11-15 00:00:00.000 0.355 0.100 14.491 1.449 0.350 0.156 Active +FOPR 2012-11-25 00:00:00.000 0.332 0.100 14.491 1.449 0.350 0.148 Active +FOPR 2012-12-05 00:00:00.000 0.306 0.100 14.491 1.449 0.349 0.140 Active +FOPR 2012-12-15 00:00:00.000 0.282 0.100 14.491 1.449 0.348 0.133 Active +FOPR 2012-12-25 00:00:00.000 0.264 0.100 14.491 1.449 0.344 0.125 Active +FOPR 2013-01-04 00:00:00.000 0.248 0.100 14.491 1.449 0.340 0.118 Active +FOPR 2013-01-14 00:00:00.000 0.233 0.100 14.491 1.449 0.337 0.114 Active +FOPR 2013-01-24 00:00:00.000 0.219 0.100 14.491 1.449 0.335 0.112 Active +FOPR 2013-02-03 00:00:00.000 0.205 0.100 14.491 1.449 0.334 0.110 Active +FOPR 2013-02-13 00:00:00.000 0.192 0.100 14.491 1.449 0.333 0.110 Active +FOPR 2013-02-23 00:00:00.000 0.180 0.100 14.491 1.449 0.332 0.109 Active +FOPR 2013-03-05 00:00:00.000 0.169 0.100 14.491 1.449 0.330 0.107 Active +FOPR 2013-03-15 00:00:00.000 0.160 0.100 14.491 1.449 0.327 0.106 Active +FOPR 2013-03-25 00:00:00.000 0.152 0.100 14.491 1.449 0.323 0.105 Active +FOPR 2013-04-04 00:00:00.000 0.146 0.100 14.491 1.449 0.317 0.102 Active +FOPR 2013-04-14 00:00:00.000 0.141 0.100 14.491 1.449 0.310 0.100 Active +FOPR 2013-04-24 00:00:00.000 0.137 0.100 14.491 1.449 0.303 0.098 Active +FOPR 2013-05-04 00:00:00.000 0.134 0.100 14.491 1.449 0.296 0.096 Active +FOPR 2013-05-14 00:00:00.000 0.130 0.100 14.491 1.449 0.290 0.094 Active +FOPR 2013-05-24 00:00:00.000 0.127 0.100 14.491 1.449 0.284 0.092 Active +FOPR 2013-06-03 00:00:00.000 0.123 0.100 14.491 1.449 0.279 0.090 Active +FOPR 2013-06-13 00:00:00.000 0.119 0.100 14.491 1.449 0.275 0.088 Active +FOPR 2013-06-23 00:00:00.000 0.120 0.100 14.491 1.449 0.270 0.085 Active +FOPR 2013-07-03 00:00:00.000 0.128 0.100 14.491 1.449 0.266 0.081 Active +FOPR 2013-07-13 00:00:00.000 0.136 0.100 14.491 1.449 0.263 0.077 Active +FOPR 2013-07-23 00:00:00.000 0.143 0.100 14.491 1.449 0.261 0.073 Active +FOPR 2013-08-02 00:00:00.000 0.150 0.100 14.491 1.449 0.258 0.069 Active +FOPR 2013-08-12 00:00:00.000 0.155 0.100 14.491 1.449 0.256 0.066 Active +FOPR 2013-08-22 00:00:00.000 0.159 0.100 14.491 1.449 0.254 0.063 Active +FOPR 2013-09-01 00:00:00.000 0.163 0.100 14.491 1.449 0.251 0.061 Active +FOPR 2013-09-11 00:00:00.000 0.166 0.100 14.491 1.449 0.248 0.059 Active +FOPR 2013-09-21 00:00:00.000 0.167 0.100 14.491 1.449 0.247 0.058 Active +FOPR 2013-10-01 00:00:00.000 0.167 0.100 14.491 1.449 0.245 0.058 Active +FOPR 2013-10-11 00:00:00.000 0.166 0.100 14.491 1.449 0.243 0.058 Active +FOPR 2013-10-21 00:00:00.000 0.165 0.100 14.491 1.449 0.243 0.058 Active +FOPR 2013-10-31 00:00:00.000 0.164 0.100 14.491 1.449 0.242 0.059 Active +FOPR 2013-11-10 00:00:00.000 0.165 0.100 14.491 1.449 0.243 0.059 Active +FOPR 2013-11-20 00:00:00.000 0.169 0.100 14.491 1.449 0.243 0.059 Active +FOPR 2013-11-30 00:00:00.000 0.176 0.100 14.491 1.449 0.242 0.058 Active +FOPR 2013-12-10 00:00:00.000 0.186 0.100 14.491 1.449 0.242 0.057 Active +FOPR 2013-12-20 00:00:00.000 0.197 0.100 14.491 1.449 0.241 0.057 Active +FOPR 2013-12-30 00:00:00.000 0.211 0.100 14.491 1.449 0.239 0.058 Active +FOPR 2014-01-09 00:00:00.000 0.225 0.100 14.491 1.449 0.238 0.059 Active +FOPR 2014-01-19 00:00:00.000 0.239 0.100 14.491 1.449 0.238 0.061 Active +FOPR 2014-01-29 00:00:00.000 0.252 0.100 14.491 1.449 0.238 0.061 Active +FOPR 2014-02-08 00:00:00.000 0.264 0.100 14.491 1.449 0.237 0.061 Active +FOPR 2014-02-18 00:00:00.000 0.275 0.100 14.491 1.449 0.236 0.062 Active +FOPR 2014-02-28 00:00:00.000 0.285 0.100 14.491 1.449 0.236 0.064 Active +FOPR 2014-03-10 00:00:00.000 0.295 0.100 14.491 1.449 0.236 0.066 Active +FOPR 2014-03-20 00:00:00.000 0.303 0.100 14.491 1.449 0.235 0.069 Active +FOPR 2014-03-30 00:00:00.000 0.309 0.100 14.491 1.449 0.234 0.072 Active +FOPR 2014-04-09 00:00:00.000 0.312 0.100 14.491 1.449 0.231 0.074 Active +FOPR 2014-04-19 00:00:00.000 0.313 0.100 14.491 1.449 0.229 0.076 Active +FOPR 2014-04-29 00:00:00.000 0.310 0.100 14.491 1.449 0.225 0.077 Active +FOPR 2014-05-09 00:00:00.000 0.304 0.100 14.491 1.449 0.220 0.078 Active +FOPR 2014-05-19 00:00:00.000 0.296 0.100 14.491 1.449 0.215 0.078 Active +FOPR 2014-05-29 00:00:00.000 0.286 0.100 14.491 1.449 0.209 0.078 Active +FOPR 2014-06-08 00:00:00.000 0.275 0.100 14.491 1.449 0.202 0.078 Active +FOPR 2014-06-18 00:00:00.000 0.264 0.100 14.491 1.449 0.195 0.079 Active +FOPR 2014-06-28 00:00:00.000 0.253 0.100 14.491 1.449 0.188 0.079 Active +FOPR 2014-07-08 00:00:00.000 0.241 0.100 14.491 1.449 0.181 0.080 Active +FOPR 2014-07-18 00:00:00.000 0.230 0.100 14.491 1.449 0.173 0.082 Active +FOPR 2014-07-28 00:00:00.000 0.218 0.100 14.491 1.449 0.167 0.084 Active +FOPR 2014-08-07 00:00:00.000 0.207 0.100 14.491 1.449 0.161 0.086 Active +FOPR 2014-08-17 00:00:00.000 0.197 0.100 14.491 1.449 0.155 0.088 Active +FOPR 2014-08-27 00:00:00.000 0.187 0.100 14.491 1.449 0.149 0.090 Active +FOPR 2014-09-06 00:00:00.000 0.178 0.100 14.491 1.449 0.143 0.092 Active +FOPR 2014-09-16 00:00:00.000 0.168 0.100 14.491 1.449 0.138 0.094 Active +FOPR 2014-09-26 00:00:00.000 0.159 0.100 14.491 1.449 0.132 0.095 Active +FOPR 2014-10-06 00:00:00.000 0.150 0.100 14.491 1.449 0.128 0.096 Active +FOPR 2014-10-16 00:00:00.000 0.141 0.100 14.491 1.449 0.124 0.096 Active +FOPR 2014-10-26 00:00:00.000 0.134 0.100 14.491 1.449 0.120 0.096 Active +FOPR 2014-11-05 00:00:00.000 0.127 0.100 14.491 1.449 0.116 0.097 Active +FOPR 2014-11-15 00:00:00.000 0.120 0.100 14.491 1.449 0.113 0.097 Active +FOPR 2014-11-25 00:00:00.000 0.115 0.100 14.491 1.449 0.110 0.096 Active +FOPR 2014-12-05 00:00:00.000 0.111 0.100 14.491 1.449 0.107 0.096 Active +FOPR 2014-12-15 00:00:00.000 0.107 0.100 14.491 1.449 0.105 0.095 Active +FOPR 2014-12-25 00:00:00.000 0.101 0.100 14.491 1.449 0.102 0.095 Active +FOPR 2015-01-04 00:00:00.000 0.096 0.100 14.491 1.449 0.100 0.095 Active +FOPR 2015-01-14 00:00:00.000 0.089 0.100 14.491 1.449 0.097 0.096 Active +FOPR 2015-01-24 00:00:00.000 0.081 0.100 14.491 1.449 0.094 0.096 Active +FOPR 2015-02-03 00:00:00.000 0.073 0.100 14.491 1.449 0.092 0.098 Active +FOPR 2015-02-13 00:00:00.000 0.065 0.100 14.491 1.449 0.090 0.099 Active +FOPR 2015-02-23 00:00:00.000 0.058 0.100 14.491 1.449 0.088 0.101 Active +FOPR 2015-03-05 00:00:00.000 0.050 0.100 14.491 1.449 0.087 0.103 Active +FOPR 2015-03-15 00:00:00.000 0.044 0.100 14.491 1.449 0.086 0.104 Active +FOPR 2015-03-25 00:00:00.000 0.038 0.100 14.491 1.449 0.085 0.106 Active +FOPR 2015-04-04 00:00:00.000 0.033 0.100 14.491 1.449 0.084 0.107 Active +FOPR 2015-04-14 00:00:00.000 0.029 0.100 14.491 1.449 0.084 0.108 Active +FOPR 2015-04-24 00:00:00.000 0.026 0.100 14.491 1.449 0.084 0.108 Active +FOPR 2015-05-04 00:00:00.000 0.024 0.100 14.491 1.449 0.084 0.109 Active +FOPR 2015-05-14 00:00:00.000 0.022 0.100 14.491 1.449 0.084 0.109 Active +FOPR 2015-05-24 00:00:00.000 0.021 0.100 14.491 1.449 0.084 0.109 Active +FOPR 2015-06-03 00:00:00.000 0.020 0.100 14.491 1.449 0.084 0.110 Active +FOPR 2015-06-13 00:00:00.000 0.020 0.100 14.491 1.449 0.084 0.110 Active +FOPR 2015-06-23 00:00:00.000 0.020 0.100 14.491 1.449 0.084 0.110 Active +WOPR_OP1_108 2012-12-15 00:00:00.000 0.300 0.075 14.491 1.087 0.257 0.099 Active +WOPR_OP1_144 2013-12-10 00:00:00.000 0.200 0.035 14.491 0.507 0.183 0.106 Active +WOPR_OP1_190 2015-03-15 00:00:00.000 0.015 0.010 14.491 0.145 0.042 0.041 Active +WOPR_OP1_36 2010-12-26 00:00:00.000 0.700 0.070 14.491 1.014 0.650 0.084 Active +WOPR_OP1_72 2011-12-21 00:00:00.000 0.500 0.050 14.491 0.725 0.405 0.170 Active +WOPR_OP1_9 2010-03-31 00:00:00.000 0.100 0.050 14.491 0.725 0.096 0.060 Active +WPR_DIFF_1 199, 1200 0.200 0.150 14.491 2.174 0.073 0.130 Active +WPR_DIFF_1 199, 1800 0.000 0.050 14.491 0.725 0.127 0.125 Active +WPR_DIFF_1 199, 400 0.000 0.100 14.491 1.449 -0.011 0.060 Active +WPR_DIFF_1 199, 800 0.100 0.200 14.491 2.898 0.081 0.126 Active +------------ ----------------------- ----- ----- ------ ----- ------ ----- ------ diff --git a/tests/ert/unit_tests/analysis/snapshots/test_es_update/test_update_report/0-misfit_preprocess2/update_log b/tests/ert/unit_tests/analysis/snapshots/test_es_update/test_update_report/0-misfit_preprocess2/update_log index 1d889e46ebe..323ef82811e 100644 --- a/tests/ert/unit_tests/analysis/snapshots/test_es_update/test_update_report/0-misfit_preprocess2/update_log +++ b/tests/ert/unit_tests/analysis/snapshots/test_es_update/test_update_report/0-misfit_preprocess2/update_log @@ -1,212 +1,212 @@ ------------- ----------------------- ----- ----- ----- ----- ------ ----- ------ -FOPR 2010-01-10 00:00:00.000 0.002 0.100 5.657 0.566 0.076 0.105 Active -FOPR 2010-01-20 00:00:00.000 0.008 0.100 5.657 0.566 0.079 0.107 Active -FOPR 2010-01-30 00:00:00.000 0.018 0.100 5.657 0.566 0.085 0.110 Active -FOPR 2010-02-09 00:00:00.000 0.032 0.100 5.657 0.566 0.092 0.114 Active -FOPR 2010-02-19 00:00:00.000 0.050 0.100 5.657 0.566 0.103 0.118 Active -FOPR 2010-03-01 00:00:00.000 0.071 0.100 5.657 0.566 0.117 0.122 Active -FOPR 2010-03-11 00:00:00.000 0.097 0.100 5.657 0.566 0.133 0.128 Active -FOPR 2010-03-21 00:00:00.000 0.126 0.100 5.657 0.566 0.151 0.134 Active -FOPR 2010-03-31 00:00:00.000 0.159 0.100 5.657 0.566 0.171 0.140 Active -FOPR 2010-04-10 00:00:00.000 0.194 0.100 5.657 0.566 0.193 0.148 Active -FOPR 2010-04-20 00:00:00.000 0.233 0.100 5.385 0.539 0.221 0.154 Active -FOPR 2010-04-30 00:00:00.000 0.274 0.100 5.385 0.539 0.251 0.161 Active -FOPR 2010-05-10 00:00:00.000 0.318 0.100 5.385 0.539 0.293 0.164 Active -FOPR 2010-05-20 00:00:00.000 0.363 0.100 5.385 0.539 0.340 0.163 Active -FOPR 2010-05-30 00:00:00.000 0.411 0.100 5.385 0.539 0.389 0.163 Active -FOPR 2010-06-09 00:00:00.000 0.460 0.100 5.385 0.539 0.439 0.163 Active -FOPR 2010-06-19 00:00:00.000 0.510 0.100 5.385 0.539 0.491 0.164 Active -FOPR 2010-06-29 00:00:00.000 0.561 0.100 5.657 0.566 0.544 0.164 Active -FOPR 2010-07-09 00:00:00.000 0.613 0.100 5.657 0.566 0.598 0.164 Active -FOPR 2010-07-19 00:00:00.000 0.666 0.100 5.657 0.566 0.652 0.163 Active -FOPR 2010-07-29 00:00:00.000 0.718 0.100 5.657 0.566 0.706 0.164 Active -FOPR 2010-08-08 00:00:00.000 0.770 0.100 3.317 0.332 0.760 0.164 Active -FOPR 2010-08-18 00:00:00.000 0.823 0.100 3.317 0.332 0.813 0.164 Active -FOPR 2010-08-28 00:00:00.000 0.875 0.100 3.317 0.332 0.864 0.164 Active -FOPR 2010-09-07 00:00:00.000 0.926 0.100 3.317 0.332 0.914 0.165 Active -FOPR 2010-09-17 00:00:00.000 0.977 0.100 3.317 0.332 0.963 0.165 Active -FOPR 2010-09-27 00:00:00.000 1.027 0.103 3.317 0.341 1.008 0.167 Active -FOPR 2010-10-07 00:00:00.000 1.075 0.108 3.317 0.357 1.049 0.169 Active -FOPR 2010-10-17 00:00:00.000 1.122 0.112 3.317 0.372 1.089 0.171 Active -FOPR 2010-10-27 00:00:00.000 1.166 0.117 3.317 0.387 1.126 0.172 Active -FOPR 2010-11-06 00:00:00.000 1.208 0.121 3.317 0.400 1.160 0.174 Active -FOPR 2010-11-16 00:00:00.000 1.247 0.125 3.317 0.414 1.192 0.175 Active -FOPR 2010-11-26 00:00:00.000 1.284 0.128 2.000 0.257 1.219 0.175 Active -FOPR 2010-12-06 00:00:00.000 1.317 0.132 2.000 0.263 1.243 0.175 Active -FOPR 2010-12-16 00:00:00.000 1.346 0.135 2.000 0.269 1.263 0.176 Active -FOPR 2010-12-26 00:00:00.000 1.371 0.137 2.000 0.274 1.279 0.176 Active -FOPR 2011-01-05 00:00:00.000 1.392 0.139 3.317 0.462 1.292 0.177 Active -FOPR 2011-01-15 00:00:00.000 1.407 0.141 3.317 0.467 1.300 0.179 Active -FOPR 2011-01-25 00:00:00.000 1.418 0.142 3.317 0.470 1.303 0.181 Active -FOPR 2011-02-04 00:00:00.000 1.422 0.142 3.317 0.472 1.303 0.183 Active -FOPR 2011-02-14 00:00:00.000 1.424 0.142 3.317 0.472 1.299 0.185 Active -FOPR 2011-02-24 00:00:00.000 1.425 0.143 3.317 0.473 1.294 0.187 Active -FOPR 2011-03-06 00:00:00.000 1.427 0.143 3.317 0.473 1.290 0.188 Active -FOPR 2011-03-16 00:00:00.000 1.430 0.143 3.317 0.474 1.283 0.189 Active -FOPR 2011-03-26 00:00:00.000 1.433 0.143 3.317 0.475 1.275 0.187 Active -FOPR 2011-04-05 00:00:00.000 1.438 0.144 3.317 0.477 1.263 0.186 Active -FOPR 2011-04-15 00:00:00.000 1.443 0.144 3.317 0.479 1.250 0.186 Active -FOPR 2011-04-25 00:00:00.000 1.449 0.145 3.000 0.435 1.237 0.186 Active -FOPR 2011-05-05 00:00:00.000 1.455 0.145 3.000 0.436 1.222 0.185 Active -FOPR 2011-05-15 00:00:00.000 1.460 0.146 3.000 0.438 1.207 0.184 Active -FOPR 2011-05-25 00:00:00.000 1.466 0.147 4.472 0.655 1.190 0.184 Active -FOPR 2011-06-04 00:00:00.000 1.470 0.147 4.472 0.658 1.170 0.183 Active -FOPR 2011-06-14 00:00:00.000 1.474 0.147 4.472 0.659 1.146 0.183 Active -FOPR 2011-06-24 00:00:00.000 1.475 0.148 4.472 0.660 1.122 0.184 Active -FOPR 2011-07-04 00:00:00.000 1.474 0.147 3.000 0.442 1.098 0.188 Active -FOPR 2011-07-14 00:00:00.000 1.469 0.147 4.472 0.657 1.077 0.192 Active -FOPR 2011-07-24 00:00:00.000 1.461 0.146 4.472 0.653 1.053 0.194 Active -FOPR 2011-08-03 00:00:00.000 1.449 0.145 3.000 0.435 1.027 0.196 Active -FOPR 2011-08-13 00:00:00.000 1.436 0.144 4.472 0.642 1.002 0.196 Active -FOPR 2011-08-23 00:00:00.000 1.421 0.142 4.472 0.636 0.975 0.197 Active -FOPR 2011-09-02 00:00:00.000 1.403 0.140 3.000 0.421 0.947 0.200 Active -FOPR 2011-09-12 00:00:00.000 1.379 0.138 4.472 0.617 0.928 0.200 Active -FOPR 2011-09-22 00:00:00.000 1.353 0.135 4.472 0.605 0.902 0.203 Active -FOPR 2011-10-02 00:00:00.000 1.324 0.132 4.472 0.592 0.878 0.206 Active -FOPR 2011-10-12 00:00:00.000 1.297 0.130 4.472 0.580 0.851 0.210 Active -FOPR 2011-10-22 00:00:00.000 1.270 0.127 3.000 0.381 0.824 0.213 Active -FOPR 2011-11-01 00:00:00.000 1.243 0.124 3.000 0.373 0.801 0.215 Active -FOPR 2011-11-11 00:00:00.000 1.216 0.122 3.000 0.365 0.781 0.216 Active -FOPR 2011-11-21 00:00:00.000 1.189 0.119 4.472 0.532 0.762 0.216 Active -FOPR 2011-12-01 00:00:00.000 1.161 0.116 4.472 0.519 0.744 0.215 Active -FOPR 2011-12-11 00:00:00.000 1.134 0.113 4.472 0.507 0.725 0.212 Active -FOPR 2011-12-21 00:00:00.000 1.112 0.111 4.472 0.497 0.704 0.206 Active -FOPR 2011-12-31 00:00:00.000 1.091 0.109 4.472 0.488 0.683 0.200 Active -FOPR 2012-01-10 00:00:00.000 1.072 0.107 4.472 0.479 0.661 0.194 Active -FOPR 2012-01-20 00:00:00.000 1.053 0.105 4.472 0.471 0.640 0.189 Active -FOPR 2012-01-30 00:00:00.000 1.033 0.103 4.472 0.462 0.619 0.185 Active -FOPR 2012-02-09 00:00:00.000 1.013 0.101 5.385 0.545 0.597 0.181 Active -FOPR 2012-02-19 00:00:00.000 0.995 0.100 5.385 0.539 0.576 0.176 Active -FOPR 2012-02-29 00:00:00.000 0.975 0.100 5.385 0.539 0.555 0.171 Active -FOPR 2012-03-10 00:00:00.000 0.956 0.100 5.385 0.539 0.533 0.171 Active -FOPR 2012-03-20 00:00:00.000 0.936 0.100 5.385 0.539 0.513 0.171 Active -FOPR 2012-03-30 00:00:00.000 0.916 0.100 5.385 0.539 0.494 0.170 Active -FOPR 2012-04-09 00:00:00.000 0.893 0.100 5.385 0.539 0.477 0.169 Active -FOPR 2012-04-19 00:00:00.000 0.869 0.100 5.385 0.539 0.462 0.169 Active -FOPR 2012-04-29 00:00:00.000 0.842 0.100 5.385 0.539 0.447 0.170 Active -FOPR 2012-05-09 00:00:00.000 0.812 0.100 5.385 0.539 0.432 0.170 Active -FOPR 2012-05-19 00:00:00.000 0.779 0.100 5.385 0.539 0.417 0.171 Active -FOPR 2012-05-29 00:00:00.000 0.742 0.100 5.385 0.539 0.403 0.170 Active -FOPR 2012-06-08 00:00:00.000 0.702 0.100 5.385 0.539 0.389 0.171 Active -FOPR 2012-06-18 00:00:00.000 0.661 0.100 5.385 0.539 0.379 0.171 Active -FOPR 2012-06-28 00:00:00.000 0.619 0.100 5.385 0.539 0.370 0.171 Active -FOPR 2012-07-08 00:00:00.000 0.578 0.100 5.385 0.539 0.361 0.169 Active -FOPR 2012-07-18 00:00:00.000 0.540 0.100 5.385 0.539 0.354 0.168 Active -FOPR 2012-07-28 00:00:00.000 0.505 0.100 5.385 0.539 0.349 0.166 Active -FOPR 2012-08-07 00:00:00.000 0.475 0.100 5.385 0.539 0.344 0.165 Active -FOPR 2012-08-17 00:00:00.000 0.450 0.100 5.385 0.539 0.340 0.165 Active -FOPR 2012-08-27 00:00:00.000 0.431 0.100 5.385 0.539 0.344 0.168 Active -FOPR 2012-09-06 00:00:00.000 0.419 0.100 5.385 0.539 0.350 0.171 Active -FOPR 2012-09-16 00:00:00.000 0.410 0.100 5.385 0.539 0.349 0.171 Active -FOPR 2012-09-26 00:00:00.000 0.406 0.100 5.385 0.539 0.350 0.173 Active -FOPR 2012-10-06 00:00:00.000 0.404 0.100 5.385 0.539 0.347 0.171 Active -FOPR 2012-10-16 00:00:00.000 0.399 0.100 5.385 0.539 0.344 0.168 Active -FOPR 2012-10-26 00:00:00.000 0.389 0.100 5.385 0.539 0.346 0.165 Active -FOPR 2012-11-05 00:00:00.000 0.374 0.100 5.385 0.539 0.348 0.162 Active -FOPR 2012-11-15 00:00:00.000 0.355 0.100 5.385 0.539 0.350 0.156 Active -FOPR 2012-11-25 00:00:00.000 0.332 0.100 1.732 0.173 0.350 0.148 Active -FOPR 2012-12-05 00:00:00.000 0.306 0.100 1.732 0.173 0.349 0.140 Active -FOPR 2012-12-15 00:00:00.000 0.282 0.100 1.732 0.173 0.348 0.133 Active -FOPR 2012-12-25 00:00:00.000 0.264 0.100 4.583 0.458 0.344 0.125 Active -FOPR 2013-01-04 00:00:00.000 0.248 0.100 4.583 0.458 0.340 0.118 Active -FOPR 2013-01-14 00:00:00.000 0.233 0.100 4.583 0.458 0.337 0.114 Active -FOPR 2013-01-24 00:00:00.000 0.219 0.100 4.583 0.458 0.335 0.112 Active -FOPR 2013-02-03 00:00:00.000 0.205 0.100 4.583 0.458 0.334 0.110 Active -FOPR 2013-02-13 00:00:00.000 0.192 0.100 4.583 0.458 0.333 0.110 Active -FOPR 2013-02-23 00:00:00.000 0.180 0.100 4.583 0.458 0.332 0.109 Active -FOPR 2013-03-05 00:00:00.000 0.169 0.100 4.583 0.458 0.330 0.107 Active -FOPR 2013-03-15 00:00:00.000 0.160 0.100 4.583 0.458 0.327 0.106 Active -FOPR 2013-03-25 00:00:00.000 0.152 0.100 4.583 0.458 0.323 0.105 Active -FOPR 2013-04-04 00:00:00.000 0.146 0.100 4.583 0.458 0.317 0.102 Active -FOPR 2013-04-14 00:00:00.000 0.141 0.100 4.583 0.458 0.310 0.100 Active -FOPR 2013-04-24 00:00:00.000 0.137 0.100 4.583 0.458 0.303 0.098 Active -FOPR 2013-05-04 00:00:00.000 0.134 0.100 4.583 0.458 0.296 0.096 Active -FOPR 2013-05-14 00:00:00.000 0.130 0.100 4.583 0.458 0.290 0.094 Active -FOPR 2013-05-24 00:00:00.000 0.127 0.100 4.583 0.458 0.284 0.092 Active -FOPR 2013-06-03 00:00:00.000 0.123 0.100 4.583 0.458 0.279 0.090 Active -FOPR 2013-06-13 00:00:00.000 0.119 0.100 4.583 0.458 0.275 0.088 Active -FOPR 2013-06-23 00:00:00.000 0.120 0.100 4.583 0.458 0.270 0.085 Active -FOPR 2013-07-03 00:00:00.000 0.128 0.100 4.583 0.458 0.266 0.081 Active -FOPR 2013-07-13 00:00:00.000 0.136 0.100 4.583 0.458 0.263 0.077 Active -FOPR 2013-07-23 00:00:00.000 0.143 0.100 1.000 0.100 0.261 0.073 Active -FOPR 2013-08-02 00:00:00.000 0.150 0.100 2.000 0.200 0.258 0.069 Active -FOPR 2013-08-12 00:00:00.000 0.155 0.100 2.000 0.200 0.256 0.066 Active -FOPR 2013-08-22 00:00:00.000 0.159 0.100 2.000 0.200 0.254 0.063 Active -FOPR 2013-09-01 00:00:00.000 0.163 0.100 2.000 0.200 0.251 0.061 Active -FOPR 2013-09-11 00:00:00.000 0.166 0.100 3.464 0.346 0.248 0.059 Active -FOPR 2013-09-21 00:00:00.000 0.167 0.100 3.464 0.346 0.247 0.058 Active -FOPR 2013-10-01 00:00:00.000 0.167 0.100 3.464 0.346 0.245 0.058 Active -FOPR 2013-10-11 00:00:00.000 0.166 0.100 3.464 0.346 0.243 0.058 Active -FOPR 2013-10-21 00:00:00.000 0.165 0.100 3.464 0.346 0.243 0.058 Active -FOPR 2013-10-31 00:00:00.000 0.164 0.100 3.464 0.346 0.242 0.059 Active -FOPR 2013-11-10 00:00:00.000 0.165 0.100 3.464 0.346 0.243 0.059 Active -FOPR 2013-11-20 00:00:00.000 0.169 0.100 3.464 0.346 0.243 0.059 Active -FOPR 2013-11-30 00:00:00.000 0.176 0.100 3.464 0.346 0.242 0.058 Active -FOPR 2013-12-10 00:00:00.000 0.186 0.100 3.464 0.346 0.242 0.057 Active -FOPR 2013-12-20 00:00:00.000 0.197 0.100 3.464 0.346 0.241 0.057 Active -FOPR 2013-12-30 00:00:00.000 0.211 0.100 3.464 0.346 0.239 0.058 Active -FOPR 2014-01-09 00:00:00.000 0.225 0.100 1.000 0.100 0.238 0.059 Active -FOPR 2014-01-19 00:00:00.000 0.239 0.100 1.414 0.141 0.238 0.061 Active -FOPR 2014-01-29 00:00:00.000 0.252 0.100 1.414 0.141 0.238 0.061 Active -FOPR 2014-02-08 00:00:00.000 0.264 0.100 2.236 0.224 0.237 0.061 Active -FOPR 2014-02-18 00:00:00.000 0.275 0.100 2.236 0.224 0.236 0.062 Active -FOPR 2014-02-28 00:00:00.000 0.285 0.100 2.236 0.224 0.236 0.064 Active -FOPR 2014-03-10 00:00:00.000 0.295 0.100 2.236 0.224 0.236 0.066 Active -FOPR 2014-03-20 00:00:00.000 0.303 0.100 2.236 0.224 0.235 0.069 Active -FOPR 2014-03-30 00:00:00.000 0.309 0.100 2.449 0.245 0.234 0.072 Active -FOPR 2014-04-09 00:00:00.000 0.312 0.100 2.449 0.245 0.231 0.074 Active -FOPR 2014-04-19 00:00:00.000 0.313 0.100 2.449 0.245 0.229 0.076 Active -FOPR 2014-04-29 00:00:00.000 0.310 0.100 2.449 0.245 0.225 0.077 Active -FOPR 2014-05-09 00:00:00.000 0.304 0.100 2.449 0.245 0.220 0.078 Active -FOPR 2014-05-19 00:00:00.000 0.296 0.100 2.449 0.245 0.215 0.078 Active -FOPR 2014-05-29 00:00:00.000 0.286 0.100 5.657 0.566 0.209 0.078 Active -FOPR 2014-06-08 00:00:00.000 0.275 0.100 5.657 0.566 0.202 0.078 Active -FOPR 2014-06-18 00:00:00.000 0.264 0.100 5.657 0.566 0.195 0.079 Active -FOPR 2014-06-28 00:00:00.000 0.253 0.100 5.657 0.566 0.188 0.079 Active -FOPR 2014-07-08 00:00:00.000 0.241 0.100 5.657 0.566 0.181 0.080 Active -FOPR 2014-07-18 00:00:00.000 0.230 0.100 5.657 0.566 0.173 0.082 Active -FOPR 2014-07-28 00:00:00.000 0.218 0.100 5.657 0.566 0.167 0.084 Active -FOPR 2014-08-07 00:00:00.000 0.207 0.100 5.657 0.566 0.161 0.086 Active -FOPR 2014-08-17 00:00:00.000 0.197 0.100 5.657 0.566 0.155 0.088 Active -FOPR 2014-08-27 00:00:00.000 0.187 0.100 5.657 0.566 0.149 0.090 Active -FOPR 2014-09-06 00:00:00.000 0.178 0.100 5.657 0.566 0.143 0.092 Active -FOPR 2014-09-16 00:00:00.000 0.168 0.100 5.385 0.539 0.138 0.094 Active -FOPR 2014-09-26 00:00:00.000 0.159 0.100 5.385 0.539 0.132 0.095 Active -FOPR 2014-10-06 00:00:00.000 0.150 0.100 5.385 0.539 0.128 0.096 Active -FOPR 2014-10-16 00:00:00.000 0.141 0.100 5.385 0.539 0.124 0.096 Active -FOPR 2014-10-26 00:00:00.000 0.134 0.100 5.385 0.539 0.120 0.096 Active -FOPR 2014-11-05 00:00:00.000 0.127 0.100 5.385 0.539 0.116 0.097 Active -FOPR 2014-11-15 00:00:00.000 0.120 0.100 5.385 0.539 0.113 0.097 Active -FOPR 2014-11-25 00:00:00.000 0.115 0.100 5.385 0.539 0.110 0.096 Active -FOPR 2014-12-05 00:00:00.000 0.111 0.100 5.385 0.539 0.107 0.096 Active -FOPR 2014-12-15 00:00:00.000 0.107 0.100 5.385 0.539 0.105 0.095 Active -FOPR 2014-12-25 00:00:00.000 0.101 0.100 5.385 0.539 0.102 0.095 Active -FOPR 2015-01-04 00:00:00.000 0.096 0.100 5.385 0.539 0.100 0.095 Active -FOPR 2015-01-14 00:00:00.000 0.089 0.100 5.385 0.539 0.097 0.096 Active -FOPR 2015-01-24 00:00:00.000 0.081 0.100 5.385 0.539 0.094 0.096 Active -FOPR 2015-02-03 00:00:00.000 0.073 0.100 5.385 0.539 0.092 0.098 Active -FOPR 2015-02-13 00:00:00.000 0.065 0.100 5.385 0.539 0.090 0.099 Active -FOPR 2015-02-23 00:00:00.000 0.058 0.100 5.385 0.539 0.088 0.101 Active -FOPR 2015-03-05 00:00:00.000 0.050 0.100 5.385 0.539 0.087 0.103 Active -FOPR 2015-03-15 00:00:00.000 0.044 0.100 5.385 0.539 0.086 0.104 Active -FOPR 2015-03-25 00:00:00.000 0.038 0.100 5.385 0.539 0.085 0.106 Active -FOPR 2015-04-04 00:00:00.000 0.033 0.100 5.385 0.539 0.084 0.107 Active -FOPR 2015-04-14 00:00:00.000 0.029 0.100 5.385 0.539 0.084 0.108 Active -FOPR 2015-04-24 00:00:00.000 0.026 0.100 5.657 0.566 0.084 0.108 Active -FOPR 2015-05-04 00:00:00.000 0.024 0.100 5.657 0.566 0.084 0.109 Active -FOPR 2015-05-14 00:00:00.000 0.022 0.100 5.657 0.566 0.084 0.109 Active -FOPR 2015-05-24 00:00:00.000 0.021 0.100 5.657 0.566 0.084 0.109 Active -FOPR 2015-06-03 00:00:00.000 0.020 0.100 5.657 0.566 0.084 0.110 Active -FOPR 2015-06-13 00:00:00.000 0.020 0.100 5.657 0.566 0.084 0.110 Active -FOPR 2015-06-23 00:00:00.000 0.020 0.100 5.657 0.566 0.084 0.110 Active -WOPR_OP1_108 2012-12-15 00:00:00.000 0.300 0.075 1.000 0.075 0.257 0.099 Active -WOPR_OP1_144 2013-12-10 00:00:00.000 0.200 0.035 1.000 0.035 0.183 0.106 Active -WOPR_OP1_190 2015-03-15 00:00:00.000 0.015 0.010 1.000 0.010 0.042 0.041 Active -WOPR_OP1_36 2010-12-26 00:00:00.000 0.700 0.070 1.000 0.070 0.650 0.084 Active -WOPR_OP1_72 2011-12-21 00:00:00.000 0.500 0.050 1.000 0.050 0.405 0.170 Active -WOPR_OP1_9 2010-03-31 00:00:00.000 0.100 0.050 1.000 0.050 0.096 0.060 Active -WPR_DIFF_1 199, 1200 0.200 0.150 1.000 0.150 0.073 0.130 Active -WPR_DIFF_1 199, 1800 0.000 0.050 1.000 0.050 0.127 0.125 Active -WPR_DIFF_1 199, 400 0.000 0.100 1.000 0.100 -0.011 0.060 Active -WPR_DIFF_1 199, 800 0.100 0.200 1.000 0.200 0.081 0.126 Active ------------- ----------------------- ----- ----- ----- ----- ------ ----- ------ +------------ ----------------------- ----- ----- ------ ----- ------ ----- ------ +FOPR 2010-01-10 00:00:00.000 0.002 0.100 14.142 1.414 0.076 0.105 Active +FOPR 2010-01-20 00:00:00.000 0.008 0.100 14.142 1.414 0.079 0.107 Active +FOPR 2010-01-30 00:00:00.000 0.018 0.100 14.142 1.414 0.085 0.110 Active +FOPR 2010-02-09 00:00:00.000 0.032 0.100 14.142 1.414 0.092 0.114 Active +FOPR 2010-02-19 00:00:00.000 0.050 0.100 14.142 1.414 0.103 0.118 Active +FOPR 2010-03-01 00:00:00.000 0.071 0.100 14.142 1.414 0.117 0.122 Active +FOPR 2010-03-11 00:00:00.000 0.097 0.100 14.142 1.414 0.133 0.128 Active +FOPR 2010-03-21 00:00:00.000 0.126 0.100 14.142 1.414 0.151 0.134 Active +FOPR 2010-03-31 00:00:00.000 0.159 0.100 14.142 1.414 0.171 0.140 Active +FOPR 2010-04-10 00:00:00.000 0.194 0.100 14.142 1.414 0.193 0.148 Active +FOPR 2010-04-20 00:00:00.000 0.233 0.100 14.142 1.414 0.221 0.154 Active +FOPR 2010-04-30 00:00:00.000 0.274 0.100 14.142 1.414 0.251 0.161 Active +FOPR 2010-05-10 00:00:00.000 0.318 0.100 14.142 1.414 0.293 0.164 Active +FOPR 2010-05-20 00:00:00.000 0.363 0.100 14.142 1.414 0.340 0.163 Active +FOPR 2010-05-30 00:00:00.000 0.411 0.100 14.142 1.414 0.389 0.163 Active +FOPR 2010-06-09 00:00:00.000 0.460 0.100 14.142 1.414 0.439 0.163 Active +FOPR 2010-06-19 00:00:00.000 0.510 0.100 14.142 1.414 0.491 0.164 Active +FOPR 2010-06-29 00:00:00.000 0.561 0.100 14.142 1.414 0.544 0.164 Active +FOPR 2010-07-09 00:00:00.000 0.613 0.100 14.142 1.414 0.598 0.164 Active +FOPR 2010-07-19 00:00:00.000 0.666 0.100 14.142 1.414 0.652 0.163 Active +FOPR 2010-07-29 00:00:00.000 0.718 0.100 14.142 1.414 0.706 0.164 Active +FOPR 2010-08-08 00:00:00.000 0.770 0.100 14.142 1.414 0.760 0.164 Active +FOPR 2010-08-18 00:00:00.000 0.823 0.100 14.142 1.414 0.813 0.164 Active +FOPR 2010-08-28 00:00:00.000 0.875 0.100 14.142 1.414 0.864 0.164 Active +FOPR 2010-09-07 00:00:00.000 0.926 0.100 14.142 1.414 0.914 0.165 Active +FOPR 2010-09-17 00:00:00.000 0.977 0.100 14.142 1.414 0.963 0.165 Active +FOPR 2010-09-27 00:00:00.000 1.027 0.103 14.142 1.452 1.008 0.167 Active +FOPR 2010-10-07 00:00:00.000 1.075 0.108 14.142 1.520 1.049 0.169 Active +FOPR 2010-10-17 00:00:00.000 1.122 0.112 14.142 1.586 1.089 0.171 Active +FOPR 2010-10-27 00:00:00.000 1.166 0.117 14.142 1.649 1.126 0.172 Active +FOPR 2010-11-06 00:00:00.000 1.208 0.121 14.142 1.708 1.160 0.174 Active +FOPR 2010-11-16 00:00:00.000 1.247 0.125 14.142 1.764 1.192 0.175 Active +FOPR 2010-11-26 00:00:00.000 1.284 0.128 14.142 1.815 1.219 0.175 Active +FOPR 2010-12-06 00:00:00.000 1.317 0.132 14.142 1.862 1.243 0.175 Active +FOPR 2010-12-16 00:00:00.000 1.346 0.135 14.142 1.904 1.263 0.176 Active +FOPR 2010-12-26 00:00:00.000 1.371 0.137 14.142 1.939 1.279 0.176 Active +FOPR 2011-01-05 00:00:00.000 1.392 0.139 14.142 1.968 1.292 0.177 Active +FOPR 2011-01-15 00:00:00.000 1.407 0.141 14.142 1.990 1.300 0.179 Active +FOPR 2011-01-25 00:00:00.000 1.418 0.142 14.142 2.005 1.303 0.181 Active +FOPR 2011-02-04 00:00:00.000 1.422 0.142 14.142 2.011 1.303 0.183 Active +FOPR 2011-02-14 00:00:00.000 1.424 0.142 14.142 2.013 1.299 0.185 Active +FOPR 2011-02-24 00:00:00.000 1.425 0.143 14.142 2.016 1.294 0.187 Active +FOPR 2011-03-06 00:00:00.000 1.427 0.143 14.142 2.018 1.290 0.188 Active +FOPR 2011-03-16 00:00:00.000 1.430 0.143 14.142 2.022 1.283 0.189 Active +FOPR 2011-03-26 00:00:00.000 1.433 0.143 14.142 2.027 1.275 0.187 Active +FOPR 2011-04-05 00:00:00.000 1.438 0.144 14.142 2.033 1.263 0.186 Active +FOPR 2011-04-15 00:00:00.000 1.443 0.144 14.142 2.041 1.250 0.186 Active +FOPR 2011-04-25 00:00:00.000 1.449 0.145 14.142 2.049 1.237 0.186 Active +FOPR 2011-05-05 00:00:00.000 1.455 0.145 14.142 2.057 1.222 0.185 Active +FOPR 2011-05-15 00:00:00.000 1.460 0.146 14.142 2.065 1.207 0.184 Active +FOPR 2011-05-25 00:00:00.000 1.466 0.147 14.142 2.073 1.190 0.184 Active +FOPR 2011-06-04 00:00:00.000 1.470 0.147 14.142 2.079 1.170 0.183 Active +FOPR 2011-06-14 00:00:00.000 1.474 0.147 14.142 2.085 1.146 0.183 Active +FOPR 2011-06-24 00:00:00.000 1.475 0.148 14.142 2.086 1.122 0.184 Active +FOPR 2011-07-04 00:00:00.000 1.474 0.147 14.142 2.084 1.098 0.188 Active +FOPR 2011-07-14 00:00:00.000 1.469 0.147 14.142 2.078 1.077 0.192 Active +FOPR 2011-07-24 00:00:00.000 1.461 0.146 14.142 2.066 1.053 0.194 Active +FOPR 2011-08-03 00:00:00.000 1.449 0.145 14.142 2.050 1.027 0.196 Active +FOPR 2011-08-13 00:00:00.000 1.436 0.144 14.142 2.031 1.002 0.196 Active +FOPR 2011-08-23 00:00:00.000 1.421 0.142 14.142 2.010 0.975 0.197 Active +FOPR 2011-09-02 00:00:00.000 1.403 0.140 14.142 1.984 0.947 0.200 Active +FOPR 2011-09-12 00:00:00.000 1.379 0.138 14.142 1.951 0.928 0.200 Active +FOPR 2011-09-22 00:00:00.000 1.353 0.135 14.142 1.913 0.902 0.203 Active +FOPR 2011-10-02 00:00:00.000 1.324 0.132 14.142 1.873 0.878 0.206 Active +FOPR 2011-10-12 00:00:00.000 1.297 0.130 14.142 1.834 0.851 0.210 Active +FOPR 2011-10-22 00:00:00.000 1.270 0.127 14.142 1.797 0.824 0.213 Active +FOPR 2011-11-01 00:00:00.000 1.243 0.124 14.142 1.758 0.801 0.215 Active +FOPR 2011-11-11 00:00:00.000 1.216 0.122 14.142 1.720 0.781 0.216 Active +FOPR 2011-11-21 00:00:00.000 1.189 0.119 14.142 1.682 0.762 0.216 Active +FOPR 2011-12-01 00:00:00.000 1.161 0.116 14.142 1.643 0.744 0.215 Active +FOPR 2011-12-11 00:00:00.000 1.134 0.113 14.142 1.604 0.725 0.212 Active +FOPR 2011-12-21 00:00:00.000 1.112 0.111 14.142 1.572 0.704 0.206 Active +FOPR 2011-12-31 00:00:00.000 1.091 0.109 14.142 1.543 0.683 0.200 Active +FOPR 2012-01-10 00:00:00.000 1.072 0.107 14.142 1.516 0.661 0.194 Active +FOPR 2012-01-20 00:00:00.000 1.053 0.105 14.142 1.489 0.640 0.189 Active +FOPR 2012-01-30 00:00:00.000 1.033 0.103 14.142 1.460 0.619 0.185 Active +FOPR 2012-02-09 00:00:00.000 1.013 0.101 14.142 1.432 0.597 0.181 Active +FOPR 2012-02-19 00:00:00.000 0.995 0.100 14.142 1.414 0.576 0.176 Active +FOPR 2012-02-29 00:00:00.000 0.975 0.100 14.142 1.414 0.555 0.171 Active +FOPR 2012-03-10 00:00:00.000 0.956 0.100 14.142 1.414 0.533 0.171 Active +FOPR 2012-03-20 00:00:00.000 0.936 0.100 14.142 1.414 0.513 0.171 Active +FOPR 2012-03-30 00:00:00.000 0.916 0.100 14.142 1.414 0.494 0.170 Active +FOPR 2012-04-09 00:00:00.000 0.893 0.100 14.142 1.414 0.477 0.169 Active +FOPR 2012-04-19 00:00:00.000 0.869 0.100 14.142 1.414 0.462 0.169 Active +FOPR 2012-04-29 00:00:00.000 0.842 0.100 14.142 1.414 0.447 0.170 Active +FOPR 2012-05-09 00:00:00.000 0.812 0.100 14.142 1.414 0.432 0.170 Active +FOPR 2012-05-19 00:00:00.000 0.779 0.100 14.142 1.414 0.417 0.171 Active +FOPR 2012-05-29 00:00:00.000 0.742 0.100 14.142 1.414 0.403 0.170 Active +FOPR 2012-06-08 00:00:00.000 0.702 0.100 14.142 1.414 0.389 0.171 Active +FOPR 2012-06-18 00:00:00.000 0.661 0.100 14.142 1.414 0.379 0.171 Active +FOPR 2012-06-28 00:00:00.000 0.619 0.100 14.142 1.414 0.370 0.171 Active +FOPR 2012-07-08 00:00:00.000 0.578 0.100 14.142 1.414 0.361 0.169 Active +FOPR 2012-07-18 00:00:00.000 0.540 0.100 14.142 1.414 0.354 0.168 Active +FOPR 2012-07-28 00:00:00.000 0.505 0.100 14.142 1.414 0.349 0.166 Active +FOPR 2012-08-07 00:00:00.000 0.475 0.100 14.142 1.414 0.344 0.165 Active +FOPR 2012-08-17 00:00:00.000 0.450 0.100 14.142 1.414 0.340 0.165 Active +FOPR 2012-08-27 00:00:00.000 0.431 0.100 14.142 1.414 0.344 0.168 Active +FOPR 2012-09-06 00:00:00.000 0.419 0.100 14.142 1.414 0.350 0.171 Active +FOPR 2012-09-16 00:00:00.000 0.410 0.100 14.142 1.414 0.349 0.171 Active +FOPR 2012-09-26 00:00:00.000 0.406 0.100 14.142 1.414 0.350 0.173 Active +FOPR 2012-10-06 00:00:00.000 0.404 0.100 14.142 1.414 0.347 0.171 Active +FOPR 2012-10-16 00:00:00.000 0.399 0.100 14.142 1.414 0.344 0.168 Active +FOPR 2012-10-26 00:00:00.000 0.389 0.100 14.142 1.414 0.346 0.165 Active +FOPR 2012-11-05 00:00:00.000 0.374 0.100 14.142 1.414 0.348 0.162 Active +FOPR 2012-11-15 00:00:00.000 0.355 0.100 14.142 1.414 0.350 0.156 Active +FOPR 2012-11-25 00:00:00.000 0.332 0.100 14.142 1.414 0.350 0.148 Active +FOPR 2012-12-05 00:00:00.000 0.306 0.100 14.142 1.414 0.349 0.140 Active +FOPR 2012-12-15 00:00:00.000 0.282 0.100 14.142 1.414 0.348 0.133 Active +FOPR 2012-12-25 00:00:00.000 0.264 0.100 14.142 1.414 0.344 0.125 Active +FOPR 2013-01-04 00:00:00.000 0.248 0.100 14.142 1.414 0.340 0.118 Active +FOPR 2013-01-14 00:00:00.000 0.233 0.100 14.142 1.414 0.337 0.114 Active +FOPR 2013-01-24 00:00:00.000 0.219 0.100 14.142 1.414 0.335 0.112 Active +FOPR 2013-02-03 00:00:00.000 0.205 0.100 14.142 1.414 0.334 0.110 Active +FOPR 2013-02-13 00:00:00.000 0.192 0.100 14.142 1.414 0.333 0.110 Active +FOPR 2013-02-23 00:00:00.000 0.180 0.100 14.142 1.414 0.332 0.109 Active +FOPR 2013-03-05 00:00:00.000 0.169 0.100 14.142 1.414 0.330 0.107 Active +FOPR 2013-03-15 00:00:00.000 0.160 0.100 14.142 1.414 0.327 0.106 Active +FOPR 2013-03-25 00:00:00.000 0.152 0.100 14.142 1.414 0.323 0.105 Active +FOPR 2013-04-04 00:00:00.000 0.146 0.100 14.142 1.414 0.317 0.102 Active +FOPR 2013-04-14 00:00:00.000 0.141 0.100 14.142 1.414 0.310 0.100 Active +FOPR 2013-04-24 00:00:00.000 0.137 0.100 14.142 1.414 0.303 0.098 Active +FOPR 2013-05-04 00:00:00.000 0.134 0.100 14.142 1.414 0.296 0.096 Active +FOPR 2013-05-14 00:00:00.000 0.130 0.100 14.142 1.414 0.290 0.094 Active +FOPR 2013-05-24 00:00:00.000 0.127 0.100 14.142 1.414 0.284 0.092 Active +FOPR 2013-06-03 00:00:00.000 0.123 0.100 14.142 1.414 0.279 0.090 Active +FOPR 2013-06-13 00:00:00.000 0.119 0.100 14.142 1.414 0.275 0.088 Active +FOPR 2013-06-23 00:00:00.000 0.120 0.100 14.142 1.414 0.270 0.085 Active +FOPR 2013-07-03 00:00:00.000 0.128 0.100 14.142 1.414 0.266 0.081 Active +FOPR 2013-07-13 00:00:00.000 0.136 0.100 14.142 1.414 0.263 0.077 Active +FOPR 2013-07-23 00:00:00.000 0.143 0.100 14.142 1.414 0.261 0.073 Active +FOPR 2013-08-02 00:00:00.000 0.150 0.100 14.142 1.414 0.258 0.069 Active +FOPR 2013-08-12 00:00:00.000 0.155 0.100 14.142 1.414 0.256 0.066 Active +FOPR 2013-08-22 00:00:00.000 0.159 0.100 14.142 1.414 0.254 0.063 Active +FOPR 2013-09-01 00:00:00.000 0.163 0.100 14.142 1.414 0.251 0.061 Active +FOPR 2013-09-11 00:00:00.000 0.166 0.100 14.142 1.414 0.248 0.059 Active +FOPR 2013-09-21 00:00:00.000 0.167 0.100 14.142 1.414 0.247 0.058 Active +FOPR 2013-10-01 00:00:00.000 0.167 0.100 14.142 1.414 0.245 0.058 Active +FOPR 2013-10-11 00:00:00.000 0.166 0.100 14.142 1.414 0.243 0.058 Active +FOPR 2013-10-21 00:00:00.000 0.165 0.100 14.142 1.414 0.243 0.058 Active +FOPR 2013-10-31 00:00:00.000 0.164 0.100 14.142 1.414 0.242 0.059 Active +FOPR 2013-11-10 00:00:00.000 0.165 0.100 14.142 1.414 0.243 0.059 Active +FOPR 2013-11-20 00:00:00.000 0.169 0.100 14.142 1.414 0.243 0.059 Active +FOPR 2013-11-30 00:00:00.000 0.176 0.100 14.142 1.414 0.242 0.058 Active +FOPR 2013-12-10 00:00:00.000 0.186 0.100 14.142 1.414 0.242 0.057 Active +FOPR 2013-12-20 00:00:00.000 0.197 0.100 14.142 1.414 0.241 0.057 Active +FOPR 2013-12-30 00:00:00.000 0.211 0.100 14.142 1.414 0.239 0.058 Active +FOPR 2014-01-09 00:00:00.000 0.225 0.100 14.142 1.414 0.238 0.059 Active +FOPR 2014-01-19 00:00:00.000 0.239 0.100 14.142 1.414 0.238 0.061 Active +FOPR 2014-01-29 00:00:00.000 0.252 0.100 14.142 1.414 0.238 0.061 Active +FOPR 2014-02-08 00:00:00.000 0.264 0.100 14.142 1.414 0.237 0.061 Active +FOPR 2014-02-18 00:00:00.000 0.275 0.100 14.142 1.414 0.236 0.062 Active +FOPR 2014-02-28 00:00:00.000 0.285 0.100 14.142 1.414 0.236 0.064 Active +FOPR 2014-03-10 00:00:00.000 0.295 0.100 14.142 1.414 0.236 0.066 Active +FOPR 2014-03-20 00:00:00.000 0.303 0.100 14.142 1.414 0.235 0.069 Active +FOPR 2014-03-30 00:00:00.000 0.309 0.100 14.142 1.414 0.234 0.072 Active +FOPR 2014-04-09 00:00:00.000 0.312 0.100 14.142 1.414 0.231 0.074 Active +FOPR 2014-04-19 00:00:00.000 0.313 0.100 14.142 1.414 0.229 0.076 Active +FOPR 2014-04-29 00:00:00.000 0.310 0.100 14.142 1.414 0.225 0.077 Active +FOPR 2014-05-09 00:00:00.000 0.304 0.100 14.142 1.414 0.220 0.078 Active +FOPR 2014-05-19 00:00:00.000 0.296 0.100 14.142 1.414 0.215 0.078 Active +FOPR 2014-05-29 00:00:00.000 0.286 0.100 14.142 1.414 0.209 0.078 Active +FOPR 2014-06-08 00:00:00.000 0.275 0.100 14.142 1.414 0.202 0.078 Active +FOPR 2014-06-18 00:00:00.000 0.264 0.100 14.142 1.414 0.195 0.079 Active +FOPR 2014-06-28 00:00:00.000 0.253 0.100 14.142 1.414 0.188 0.079 Active +FOPR 2014-07-08 00:00:00.000 0.241 0.100 14.142 1.414 0.181 0.080 Active +FOPR 2014-07-18 00:00:00.000 0.230 0.100 14.142 1.414 0.173 0.082 Active +FOPR 2014-07-28 00:00:00.000 0.218 0.100 14.142 1.414 0.167 0.084 Active +FOPR 2014-08-07 00:00:00.000 0.207 0.100 14.142 1.414 0.161 0.086 Active +FOPR 2014-08-17 00:00:00.000 0.197 0.100 14.142 1.414 0.155 0.088 Active +FOPR 2014-08-27 00:00:00.000 0.187 0.100 14.142 1.414 0.149 0.090 Active +FOPR 2014-09-06 00:00:00.000 0.178 0.100 14.142 1.414 0.143 0.092 Active +FOPR 2014-09-16 00:00:00.000 0.168 0.100 14.142 1.414 0.138 0.094 Active +FOPR 2014-09-26 00:00:00.000 0.159 0.100 14.142 1.414 0.132 0.095 Active +FOPR 2014-10-06 00:00:00.000 0.150 0.100 14.142 1.414 0.128 0.096 Active +FOPR 2014-10-16 00:00:00.000 0.141 0.100 14.142 1.414 0.124 0.096 Active +FOPR 2014-10-26 00:00:00.000 0.134 0.100 14.142 1.414 0.120 0.096 Active +FOPR 2014-11-05 00:00:00.000 0.127 0.100 14.142 1.414 0.116 0.097 Active +FOPR 2014-11-15 00:00:00.000 0.120 0.100 14.142 1.414 0.113 0.097 Active +FOPR 2014-11-25 00:00:00.000 0.115 0.100 14.142 1.414 0.110 0.096 Active +FOPR 2014-12-05 00:00:00.000 0.111 0.100 14.142 1.414 0.107 0.096 Active +FOPR 2014-12-15 00:00:00.000 0.107 0.100 14.142 1.414 0.105 0.095 Active +FOPR 2014-12-25 00:00:00.000 0.101 0.100 14.142 1.414 0.102 0.095 Active +FOPR 2015-01-04 00:00:00.000 0.096 0.100 14.142 1.414 0.100 0.095 Active +FOPR 2015-01-14 00:00:00.000 0.089 0.100 14.142 1.414 0.097 0.096 Active +FOPR 2015-01-24 00:00:00.000 0.081 0.100 14.142 1.414 0.094 0.096 Active +FOPR 2015-02-03 00:00:00.000 0.073 0.100 14.142 1.414 0.092 0.098 Active +FOPR 2015-02-13 00:00:00.000 0.065 0.100 14.142 1.414 0.090 0.099 Active +FOPR 2015-02-23 00:00:00.000 0.058 0.100 14.142 1.414 0.088 0.101 Active +FOPR 2015-03-05 00:00:00.000 0.050 0.100 14.142 1.414 0.087 0.103 Active +FOPR 2015-03-15 00:00:00.000 0.044 0.100 14.142 1.414 0.086 0.104 Active +FOPR 2015-03-25 00:00:00.000 0.038 0.100 14.142 1.414 0.085 0.106 Active +FOPR 2015-04-04 00:00:00.000 0.033 0.100 14.142 1.414 0.084 0.107 Active +FOPR 2015-04-14 00:00:00.000 0.029 0.100 14.142 1.414 0.084 0.108 Active +FOPR 2015-04-24 00:00:00.000 0.026 0.100 14.142 1.414 0.084 0.108 Active +FOPR 2015-05-04 00:00:00.000 0.024 0.100 14.142 1.414 0.084 0.109 Active +FOPR 2015-05-14 00:00:00.000 0.022 0.100 14.142 1.414 0.084 0.109 Active +FOPR 2015-05-24 00:00:00.000 0.021 0.100 14.142 1.414 0.084 0.109 Active +FOPR 2015-06-03 00:00:00.000 0.020 0.100 14.142 1.414 0.084 0.110 Active +FOPR 2015-06-13 00:00:00.000 0.020 0.100 14.142 1.414 0.084 0.110 Active +FOPR 2015-06-23 00:00:00.000 0.020 0.100 14.142 1.414 0.084 0.110 Active +WOPR_OP1_108 2012-12-15 00:00:00.000 0.300 0.075 1.000 0.075 0.257 0.099 Active +WOPR_OP1_144 2013-12-10 00:00:00.000 0.200 0.035 1.000 0.035 0.183 0.106 Active +WOPR_OP1_190 2015-03-15 00:00:00.000 0.015 0.010 1.000 0.010 0.042 0.041 Active +WOPR_OP1_36 2010-12-26 00:00:00.000 0.700 0.070 1.000 0.070 0.650 0.084 Active +WOPR_OP1_72 2011-12-21 00:00:00.000 0.500 0.050 1.000 0.050 0.405 0.170 Active +WOPR_OP1_9 2010-03-31 00:00:00.000 0.100 0.050 1.000 0.050 0.096 0.060 Active +WPR_DIFF_1 199, 1200 0.200 0.150 1.000 0.150 0.073 0.130 Active +WPR_DIFF_1 199, 1800 0.000 0.050 1.000 0.050 0.127 0.125 Active +WPR_DIFF_1 199, 400 0.000 0.100 1.000 0.100 -0.011 0.060 Active +WPR_DIFF_1 199, 800 0.100 0.200 1.000 0.200 0.081 0.126 Active +------------ ----------------------- ----- ----- ------ ----- ------ ----- ------ diff --git a/tests/ert/unit_tests/analysis/snapshots/test_es_update/test_update_report/0-misfit_preprocess3/update_log b/tests/ert/unit_tests/analysis/snapshots/test_es_update/test_update_report/0-misfit_preprocess3/update_log index f0d91911faf..a0a5faa2178 100644 --- a/tests/ert/unit_tests/analysis/snapshots/test_es_update/test_update_report/0-misfit_preprocess3/update_log +++ b/tests/ert/unit_tests/analysis/snapshots/test_es_update/test_update_report/0-misfit_preprocess3/update_log @@ -1,212 +1,212 @@ ------------- ----------------------- ----- ----- ----- ----- ------ ----- ------ -FOPR 2010-01-10 00:00:00.000 0.002 0.100 5.657 0.566 0.076 0.105 Active -FOPR 2010-01-20 00:00:00.000 0.008 0.100 5.657 0.566 0.079 0.107 Active -FOPR 2010-01-30 00:00:00.000 0.018 0.100 5.657 0.566 0.085 0.110 Active -FOPR 2010-02-09 00:00:00.000 0.032 0.100 5.657 0.566 0.092 0.114 Active -FOPR 2010-02-19 00:00:00.000 0.050 0.100 5.657 0.566 0.103 0.118 Active -FOPR 2010-03-01 00:00:00.000 0.071 0.100 5.657 0.566 0.117 0.122 Active -FOPR 2010-03-11 00:00:00.000 0.097 0.100 5.657 0.566 0.133 0.128 Active -FOPR 2010-03-21 00:00:00.000 0.126 0.100 5.657 0.566 0.151 0.134 Active -FOPR 2010-03-31 00:00:00.000 0.159 0.100 5.657 0.566 0.171 0.140 Active -FOPR 2010-04-10 00:00:00.000 0.194 0.100 5.657 0.566 0.193 0.148 Active -FOPR 2010-04-20 00:00:00.000 0.233 0.100 5.385 0.539 0.221 0.154 Active -FOPR 2010-04-30 00:00:00.000 0.274 0.100 5.385 0.539 0.251 0.161 Active -FOPR 2010-05-10 00:00:00.000 0.318 0.100 5.385 0.539 0.293 0.164 Active -FOPR 2010-05-20 00:00:00.000 0.363 0.100 5.385 0.539 0.340 0.163 Active -FOPR 2010-05-30 00:00:00.000 0.411 0.100 5.385 0.539 0.389 0.163 Active -FOPR 2010-06-09 00:00:00.000 0.460 0.100 5.385 0.539 0.439 0.163 Active -FOPR 2010-06-19 00:00:00.000 0.510 0.100 5.385 0.539 0.491 0.164 Active -FOPR 2010-06-29 00:00:00.000 0.561 0.100 5.657 0.566 0.544 0.164 Active -FOPR 2010-07-09 00:00:00.000 0.613 0.100 5.657 0.566 0.598 0.164 Active -FOPR 2010-07-19 00:00:00.000 0.666 0.100 5.657 0.566 0.652 0.163 Active -FOPR 2010-07-29 00:00:00.000 0.718 0.100 5.657 0.566 0.706 0.164 Active -FOPR 2010-08-08 00:00:00.000 0.770 0.100 3.317 0.332 0.760 0.164 Active -FOPR 2010-08-18 00:00:00.000 0.823 0.100 3.317 0.332 0.813 0.164 Active -FOPR 2010-08-28 00:00:00.000 0.875 0.100 3.317 0.332 0.864 0.164 Active -FOPR 2010-09-07 00:00:00.000 0.926 0.100 3.317 0.332 0.914 0.165 Active -FOPR 2010-09-17 00:00:00.000 0.977 0.100 3.317 0.332 0.963 0.165 Active -FOPR 2010-09-27 00:00:00.000 1.027 0.103 3.317 0.341 1.008 0.167 Active -FOPR 2010-10-07 00:00:00.000 1.075 0.108 3.317 0.357 1.049 0.169 Active -FOPR 2010-10-17 00:00:00.000 1.122 0.112 3.317 0.372 1.089 0.171 Active -FOPR 2010-10-27 00:00:00.000 1.166 0.117 3.317 0.387 1.126 0.172 Active -FOPR 2010-11-06 00:00:00.000 1.208 0.121 3.317 0.400 1.160 0.174 Active -FOPR 2010-11-16 00:00:00.000 1.247 0.125 3.317 0.414 1.192 0.175 Active -FOPR 2010-11-26 00:00:00.000 1.284 0.128 2.000 0.257 1.219 0.175 Active -FOPR 2010-12-06 00:00:00.000 1.317 0.132 2.000 0.263 1.243 0.175 Active -FOPR 2010-12-16 00:00:00.000 1.346 0.135 2.000 0.269 1.263 0.176 Active -FOPR 2010-12-26 00:00:00.000 1.371 0.137 2.000 0.274 1.279 0.176 Active -FOPR 2011-01-05 00:00:00.000 1.392 0.139 3.317 0.462 1.292 0.177 Active -FOPR 2011-01-15 00:00:00.000 1.407 0.141 3.317 0.467 1.300 0.179 Active -FOPR 2011-01-25 00:00:00.000 1.418 0.142 3.317 0.470 1.303 0.181 Active -FOPR 2011-02-04 00:00:00.000 1.422 0.142 3.317 0.472 1.303 0.183 Active -FOPR 2011-02-14 00:00:00.000 1.424 0.142 3.317 0.472 1.299 0.185 Active -FOPR 2011-02-24 00:00:00.000 1.425 0.143 3.317 0.473 1.294 0.187 Active -FOPR 2011-03-06 00:00:00.000 1.427 0.143 3.317 0.473 1.290 0.188 Active -FOPR 2011-03-16 00:00:00.000 1.430 0.143 3.317 0.474 1.283 0.189 Active -FOPR 2011-03-26 00:00:00.000 1.433 0.143 3.317 0.475 1.275 0.187 Active -FOPR 2011-04-05 00:00:00.000 1.438 0.144 3.317 0.477 1.263 0.186 Active -FOPR 2011-04-15 00:00:00.000 1.443 0.144 3.317 0.479 1.250 0.186 Active -FOPR 2011-04-25 00:00:00.000 1.449 0.145 3.000 0.435 1.237 0.186 Active -FOPR 2011-05-05 00:00:00.000 1.455 0.145 3.000 0.436 1.222 0.185 Active -FOPR 2011-05-15 00:00:00.000 1.460 0.146 3.000 0.438 1.207 0.184 Active -FOPR 2011-05-25 00:00:00.000 1.466 0.147 4.472 0.655 1.190 0.184 Active -FOPR 2011-06-04 00:00:00.000 1.470 0.147 4.472 0.658 1.170 0.183 Active -FOPR 2011-06-14 00:00:00.000 1.474 0.147 4.472 0.659 1.146 0.183 Active -FOPR 2011-06-24 00:00:00.000 1.475 0.148 4.472 0.660 1.122 0.184 Active -FOPR 2011-07-04 00:00:00.000 1.474 0.147 3.000 0.442 1.098 0.188 Active -FOPR 2011-07-14 00:00:00.000 1.469 0.147 4.472 0.657 1.077 0.192 Active -FOPR 2011-07-24 00:00:00.000 1.461 0.146 4.472 0.653 1.053 0.194 Active -FOPR 2011-08-03 00:00:00.000 1.449 0.145 3.000 0.435 1.027 0.196 Active -FOPR 2011-08-13 00:00:00.000 1.436 0.144 4.472 0.642 1.002 0.196 Active -FOPR 2011-08-23 00:00:00.000 1.421 0.142 4.472 0.636 0.975 0.197 Active -FOPR 2011-09-02 00:00:00.000 1.403 0.140 3.000 0.421 0.947 0.200 Active -FOPR 2011-09-12 00:00:00.000 1.379 0.138 4.472 0.617 0.928 0.200 Active -FOPR 2011-09-22 00:00:00.000 1.353 0.135 4.472 0.605 0.902 0.203 Active -FOPR 2011-10-02 00:00:00.000 1.324 0.132 4.472 0.592 0.878 0.206 Active -FOPR 2011-10-12 00:00:00.000 1.297 0.130 4.472 0.580 0.851 0.210 Active -FOPR 2011-10-22 00:00:00.000 1.270 0.127 3.000 0.381 0.824 0.213 Active -FOPR 2011-11-01 00:00:00.000 1.243 0.124 3.000 0.373 0.801 0.215 Active -FOPR 2011-11-11 00:00:00.000 1.216 0.122 3.000 0.365 0.781 0.216 Active -FOPR 2011-11-21 00:00:00.000 1.189 0.119 4.472 0.532 0.762 0.216 Active -FOPR 2011-12-01 00:00:00.000 1.161 0.116 4.472 0.519 0.744 0.215 Active -FOPR 2011-12-11 00:00:00.000 1.134 0.113 4.472 0.507 0.725 0.212 Active -FOPR 2011-12-21 00:00:00.000 1.112 0.111 4.472 0.497 0.704 0.206 Active -FOPR 2011-12-31 00:00:00.000 1.091 0.109 4.472 0.488 0.683 0.200 Active -FOPR 2012-01-10 00:00:00.000 1.072 0.107 4.472 0.479 0.661 0.194 Active -FOPR 2012-01-20 00:00:00.000 1.053 0.105 4.472 0.471 0.640 0.189 Active -FOPR 2012-01-30 00:00:00.000 1.033 0.103 4.472 0.462 0.619 0.185 Active -FOPR 2012-02-09 00:00:00.000 1.013 0.101 5.385 0.545 0.597 0.181 Active -FOPR 2012-02-19 00:00:00.000 0.995 0.100 5.385 0.539 0.576 0.176 Active -FOPR 2012-02-29 00:00:00.000 0.975 0.100 5.385 0.539 0.555 0.171 Active -FOPR 2012-03-10 00:00:00.000 0.956 0.100 5.385 0.539 0.533 0.171 Active -FOPR 2012-03-20 00:00:00.000 0.936 0.100 5.385 0.539 0.513 0.171 Active -FOPR 2012-03-30 00:00:00.000 0.916 0.100 5.385 0.539 0.494 0.170 Active -FOPR 2012-04-09 00:00:00.000 0.893 0.100 5.385 0.539 0.477 0.169 Active -FOPR 2012-04-19 00:00:00.000 0.869 0.100 5.385 0.539 0.462 0.169 Active -FOPR 2012-04-29 00:00:00.000 0.842 0.100 5.385 0.539 0.447 0.170 Active -FOPR 2012-05-09 00:00:00.000 0.812 0.100 5.385 0.539 0.432 0.170 Active -FOPR 2012-05-19 00:00:00.000 0.779 0.100 5.385 0.539 0.417 0.171 Active -FOPR 2012-05-29 00:00:00.000 0.742 0.100 5.385 0.539 0.403 0.170 Active -FOPR 2012-06-08 00:00:00.000 0.702 0.100 5.385 0.539 0.389 0.171 Active -FOPR 2012-06-18 00:00:00.000 0.661 0.100 5.385 0.539 0.379 0.171 Active -FOPR 2012-06-28 00:00:00.000 0.619 0.100 5.385 0.539 0.370 0.171 Active -FOPR 2012-07-08 00:00:00.000 0.578 0.100 5.385 0.539 0.361 0.169 Active -FOPR 2012-07-18 00:00:00.000 0.540 0.100 5.385 0.539 0.354 0.168 Active -FOPR 2012-07-28 00:00:00.000 0.505 0.100 5.385 0.539 0.349 0.166 Active -FOPR 2012-08-07 00:00:00.000 0.475 0.100 5.385 0.539 0.344 0.165 Active -FOPR 2012-08-17 00:00:00.000 0.450 0.100 5.385 0.539 0.340 0.165 Active -FOPR 2012-08-27 00:00:00.000 0.431 0.100 5.385 0.539 0.344 0.168 Active -FOPR 2012-09-06 00:00:00.000 0.419 0.100 5.385 0.539 0.350 0.171 Active -FOPR 2012-09-16 00:00:00.000 0.410 0.100 5.385 0.539 0.349 0.171 Active -FOPR 2012-09-26 00:00:00.000 0.406 0.100 5.385 0.539 0.350 0.173 Active -FOPR 2012-10-06 00:00:00.000 0.404 0.100 5.385 0.539 0.347 0.171 Active -FOPR 2012-10-16 00:00:00.000 0.399 0.100 5.385 0.539 0.344 0.168 Active -FOPR 2012-10-26 00:00:00.000 0.389 0.100 5.385 0.539 0.346 0.165 Active -FOPR 2012-11-05 00:00:00.000 0.374 0.100 5.385 0.539 0.348 0.162 Active -FOPR 2012-11-15 00:00:00.000 0.355 0.100 5.385 0.539 0.350 0.156 Active -FOPR 2012-11-25 00:00:00.000 0.332 0.100 1.732 0.173 0.350 0.148 Active -FOPR 2012-12-05 00:00:00.000 0.306 0.100 1.732 0.173 0.349 0.140 Active -FOPR 2012-12-15 00:00:00.000 0.282 0.100 1.732 0.173 0.348 0.133 Active -FOPR 2012-12-25 00:00:00.000 0.264 0.100 4.583 0.458 0.344 0.125 Active -FOPR 2013-01-04 00:00:00.000 0.248 0.100 4.583 0.458 0.340 0.118 Active -FOPR 2013-01-14 00:00:00.000 0.233 0.100 4.583 0.458 0.337 0.114 Active -FOPR 2013-01-24 00:00:00.000 0.219 0.100 4.583 0.458 0.335 0.112 Active -FOPR 2013-02-03 00:00:00.000 0.205 0.100 4.583 0.458 0.334 0.110 Active -FOPR 2013-02-13 00:00:00.000 0.192 0.100 4.583 0.458 0.333 0.110 Active -FOPR 2013-02-23 00:00:00.000 0.180 0.100 4.583 0.458 0.332 0.109 Active -FOPR 2013-03-05 00:00:00.000 0.169 0.100 4.583 0.458 0.330 0.107 Active -FOPR 2013-03-15 00:00:00.000 0.160 0.100 4.583 0.458 0.327 0.106 Active -FOPR 2013-03-25 00:00:00.000 0.152 0.100 4.583 0.458 0.323 0.105 Active -FOPR 2013-04-04 00:00:00.000 0.146 0.100 4.583 0.458 0.317 0.102 Active -FOPR 2013-04-14 00:00:00.000 0.141 0.100 4.583 0.458 0.310 0.100 Active -FOPR 2013-04-24 00:00:00.000 0.137 0.100 4.583 0.458 0.303 0.098 Active -FOPR 2013-05-04 00:00:00.000 0.134 0.100 4.583 0.458 0.296 0.096 Active -FOPR 2013-05-14 00:00:00.000 0.130 0.100 4.583 0.458 0.290 0.094 Active -FOPR 2013-05-24 00:00:00.000 0.127 0.100 4.583 0.458 0.284 0.092 Active -FOPR 2013-06-03 00:00:00.000 0.123 0.100 4.583 0.458 0.279 0.090 Active -FOPR 2013-06-13 00:00:00.000 0.119 0.100 4.583 0.458 0.275 0.088 Active -FOPR 2013-06-23 00:00:00.000 0.120 0.100 4.583 0.458 0.270 0.085 Active -FOPR 2013-07-03 00:00:00.000 0.128 0.100 4.583 0.458 0.266 0.081 Active -FOPR 2013-07-13 00:00:00.000 0.136 0.100 4.583 0.458 0.263 0.077 Active -FOPR 2013-07-23 00:00:00.000 0.143 0.100 1.000 0.100 0.261 0.073 Active -FOPR 2013-08-02 00:00:00.000 0.150 0.100 2.000 0.200 0.258 0.069 Active -FOPR 2013-08-12 00:00:00.000 0.155 0.100 2.000 0.200 0.256 0.066 Active -FOPR 2013-08-22 00:00:00.000 0.159 0.100 2.000 0.200 0.254 0.063 Active -FOPR 2013-09-01 00:00:00.000 0.163 0.100 2.000 0.200 0.251 0.061 Active -FOPR 2013-09-11 00:00:00.000 0.166 0.100 3.464 0.346 0.248 0.059 Active -FOPR 2013-09-21 00:00:00.000 0.167 0.100 3.464 0.346 0.247 0.058 Active -FOPR 2013-10-01 00:00:00.000 0.167 0.100 3.464 0.346 0.245 0.058 Active -FOPR 2013-10-11 00:00:00.000 0.166 0.100 3.464 0.346 0.243 0.058 Active -FOPR 2013-10-21 00:00:00.000 0.165 0.100 3.464 0.346 0.243 0.058 Active -FOPR 2013-10-31 00:00:00.000 0.164 0.100 3.464 0.346 0.242 0.059 Active -FOPR 2013-11-10 00:00:00.000 0.165 0.100 3.464 0.346 0.243 0.059 Active -FOPR 2013-11-20 00:00:00.000 0.169 0.100 3.464 0.346 0.243 0.059 Active -FOPR 2013-11-30 00:00:00.000 0.176 0.100 3.464 0.346 0.242 0.058 Active -FOPR 2013-12-10 00:00:00.000 0.186 0.100 3.464 0.346 0.242 0.057 Active -FOPR 2013-12-20 00:00:00.000 0.197 0.100 3.464 0.346 0.241 0.057 Active -FOPR 2013-12-30 00:00:00.000 0.211 0.100 3.464 0.346 0.239 0.058 Active -FOPR 2014-01-09 00:00:00.000 0.225 0.100 1.000 0.100 0.238 0.059 Active -FOPR 2014-01-19 00:00:00.000 0.239 0.100 1.414 0.141 0.238 0.061 Active -FOPR 2014-01-29 00:00:00.000 0.252 0.100 1.414 0.141 0.238 0.061 Active -FOPR 2014-02-08 00:00:00.000 0.264 0.100 2.236 0.224 0.237 0.061 Active -FOPR 2014-02-18 00:00:00.000 0.275 0.100 2.236 0.224 0.236 0.062 Active -FOPR 2014-02-28 00:00:00.000 0.285 0.100 2.236 0.224 0.236 0.064 Active -FOPR 2014-03-10 00:00:00.000 0.295 0.100 2.236 0.224 0.236 0.066 Active -FOPR 2014-03-20 00:00:00.000 0.303 0.100 2.236 0.224 0.235 0.069 Active -FOPR 2014-03-30 00:00:00.000 0.309 0.100 2.449 0.245 0.234 0.072 Active -FOPR 2014-04-09 00:00:00.000 0.312 0.100 2.449 0.245 0.231 0.074 Active -FOPR 2014-04-19 00:00:00.000 0.313 0.100 2.449 0.245 0.229 0.076 Active -FOPR 2014-04-29 00:00:00.000 0.310 0.100 2.449 0.245 0.225 0.077 Active -FOPR 2014-05-09 00:00:00.000 0.304 0.100 2.449 0.245 0.220 0.078 Active -FOPR 2014-05-19 00:00:00.000 0.296 0.100 2.449 0.245 0.215 0.078 Active -FOPR 2014-05-29 00:00:00.000 0.286 0.100 5.657 0.566 0.209 0.078 Active -FOPR 2014-06-08 00:00:00.000 0.275 0.100 5.657 0.566 0.202 0.078 Active -FOPR 2014-06-18 00:00:00.000 0.264 0.100 5.657 0.566 0.195 0.079 Active -FOPR 2014-06-28 00:00:00.000 0.253 0.100 5.657 0.566 0.188 0.079 Active -FOPR 2014-07-08 00:00:00.000 0.241 0.100 5.657 0.566 0.181 0.080 Active -FOPR 2014-07-18 00:00:00.000 0.230 0.100 5.657 0.566 0.173 0.082 Active -FOPR 2014-07-28 00:00:00.000 0.218 0.100 5.657 0.566 0.167 0.084 Active -FOPR 2014-08-07 00:00:00.000 0.207 0.100 5.657 0.566 0.161 0.086 Active -FOPR 2014-08-17 00:00:00.000 0.197 0.100 5.657 0.566 0.155 0.088 Active -FOPR 2014-08-27 00:00:00.000 0.187 0.100 5.657 0.566 0.149 0.090 Active -FOPR 2014-09-06 00:00:00.000 0.178 0.100 5.657 0.566 0.143 0.092 Active -FOPR 2014-09-16 00:00:00.000 0.168 0.100 5.385 0.539 0.138 0.094 Active -FOPR 2014-09-26 00:00:00.000 0.159 0.100 5.385 0.539 0.132 0.095 Active -FOPR 2014-10-06 00:00:00.000 0.150 0.100 5.385 0.539 0.128 0.096 Active -FOPR 2014-10-16 00:00:00.000 0.141 0.100 5.385 0.539 0.124 0.096 Active -FOPR 2014-10-26 00:00:00.000 0.134 0.100 5.385 0.539 0.120 0.096 Active -FOPR 2014-11-05 00:00:00.000 0.127 0.100 5.385 0.539 0.116 0.097 Active -FOPR 2014-11-15 00:00:00.000 0.120 0.100 5.385 0.539 0.113 0.097 Active -FOPR 2014-11-25 00:00:00.000 0.115 0.100 5.385 0.539 0.110 0.096 Active -FOPR 2014-12-05 00:00:00.000 0.111 0.100 5.385 0.539 0.107 0.096 Active -FOPR 2014-12-15 00:00:00.000 0.107 0.100 5.385 0.539 0.105 0.095 Active -FOPR 2014-12-25 00:00:00.000 0.101 0.100 5.385 0.539 0.102 0.095 Active -FOPR 2015-01-04 00:00:00.000 0.096 0.100 5.385 0.539 0.100 0.095 Active -FOPR 2015-01-14 00:00:00.000 0.089 0.100 5.385 0.539 0.097 0.096 Active -FOPR 2015-01-24 00:00:00.000 0.081 0.100 5.385 0.539 0.094 0.096 Active -FOPR 2015-02-03 00:00:00.000 0.073 0.100 5.385 0.539 0.092 0.098 Active -FOPR 2015-02-13 00:00:00.000 0.065 0.100 5.385 0.539 0.090 0.099 Active -FOPR 2015-02-23 00:00:00.000 0.058 0.100 5.385 0.539 0.088 0.101 Active -FOPR 2015-03-05 00:00:00.000 0.050 0.100 5.385 0.539 0.087 0.103 Active -FOPR 2015-03-15 00:00:00.000 0.044 0.100 5.385 0.539 0.086 0.104 Active -FOPR 2015-03-25 00:00:00.000 0.038 0.100 5.385 0.539 0.085 0.106 Active -FOPR 2015-04-04 00:00:00.000 0.033 0.100 5.385 0.539 0.084 0.107 Active -FOPR 2015-04-14 00:00:00.000 0.029 0.100 5.385 0.539 0.084 0.108 Active -FOPR 2015-04-24 00:00:00.000 0.026 0.100 5.657 0.566 0.084 0.108 Active -FOPR 2015-05-04 00:00:00.000 0.024 0.100 5.657 0.566 0.084 0.109 Active -FOPR 2015-05-14 00:00:00.000 0.022 0.100 5.657 0.566 0.084 0.109 Active -FOPR 2015-05-24 00:00:00.000 0.021 0.100 5.657 0.566 0.084 0.109 Active -FOPR 2015-06-03 00:00:00.000 0.020 0.100 5.657 0.566 0.084 0.110 Active -FOPR 2015-06-13 00:00:00.000 0.020 0.100 5.657 0.566 0.084 0.110 Active -FOPR 2015-06-23 00:00:00.000 0.020 0.100 5.657 0.566 0.084 0.110 Active -WOPR_OP1_108 2012-12-15 00:00:00.000 0.300 0.075 1.000 0.075 0.257 0.099 Active -WOPR_OP1_144 2013-12-10 00:00:00.000 0.200 0.035 1.414 0.049 0.183 0.106 Active -WOPR_OP1_190 2015-03-15 00:00:00.000 0.015 0.010 1.414 0.014 0.042 0.041 Active -WOPR_OP1_36 2010-12-26 00:00:00.000 0.700 0.070 1.000 0.070 0.650 0.084 Active -WOPR_OP1_72 2011-12-21 00:00:00.000 0.500 0.050 1.000 0.050 0.405 0.170 Active -WOPR_OP1_9 2010-03-31 00:00:00.000 0.100 0.050 1.000 0.050 0.096 0.060 Active -WPR_DIFF_1 199, 1200 0.200 0.150 1.000 0.150 0.073 0.130 Active -WPR_DIFF_1 199, 1800 0.000 0.050 1.000 0.050 0.127 0.125 Active -WPR_DIFF_1 199, 400 0.000 0.100 1.000 0.100 -0.011 0.060 Active -WPR_DIFF_1 199, 800 0.100 0.200 1.000 0.200 0.081 0.126 Active ------------- ----------------------- ----- ----- ----- ----- ------ ----- ------ +------------ ----------------------- ----- ----- ------ ----- ------ ----- ------ +FOPR 2010-01-10 00:00:00.000 0.002 0.100 14.142 1.414 0.076 0.105 Active +FOPR 2010-01-20 00:00:00.000 0.008 0.100 14.142 1.414 0.079 0.107 Active +FOPR 2010-01-30 00:00:00.000 0.018 0.100 14.142 1.414 0.085 0.110 Active +FOPR 2010-02-09 00:00:00.000 0.032 0.100 14.142 1.414 0.092 0.114 Active +FOPR 2010-02-19 00:00:00.000 0.050 0.100 14.142 1.414 0.103 0.118 Active +FOPR 2010-03-01 00:00:00.000 0.071 0.100 14.142 1.414 0.117 0.122 Active +FOPR 2010-03-11 00:00:00.000 0.097 0.100 14.142 1.414 0.133 0.128 Active +FOPR 2010-03-21 00:00:00.000 0.126 0.100 14.142 1.414 0.151 0.134 Active +FOPR 2010-03-31 00:00:00.000 0.159 0.100 14.142 1.414 0.171 0.140 Active +FOPR 2010-04-10 00:00:00.000 0.194 0.100 14.142 1.414 0.193 0.148 Active +FOPR 2010-04-20 00:00:00.000 0.233 0.100 14.142 1.414 0.221 0.154 Active +FOPR 2010-04-30 00:00:00.000 0.274 0.100 14.142 1.414 0.251 0.161 Active +FOPR 2010-05-10 00:00:00.000 0.318 0.100 14.142 1.414 0.293 0.164 Active +FOPR 2010-05-20 00:00:00.000 0.363 0.100 14.142 1.414 0.340 0.163 Active +FOPR 2010-05-30 00:00:00.000 0.411 0.100 14.142 1.414 0.389 0.163 Active +FOPR 2010-06-09 00:00:00.000 0.460 0.100 14.142 1.414 0.439 0.163 Active +FOPR 2010-06-19 00:00:00.000 0.510 0.100 14.142 1.414 0.491 0.164 Active +FOPR 2010-06-29 00:00:00.000 0.561 0.100 14.142 1.414 0.544 0.164 Active +FOPR 2010-07-09 00:00:00.000 0.613 0.100 14.142 1.414 0.598 0.164 Active +FOPR 2010-07-19 00:00:00.000 0.666 0.100 14.142 1.414 0.652 0.163 Active +FOPR 2010-07-29 00:00:00.000 0.718 0.100 14.142 1.414 0.706 0.164 Active +FOPR 2010-08-08 00:00:00.000 0.770 0.100 14.142 1.414 0.760 0.164 Active +FOPR 2010-08-18 00:00:00.000 0.823 0.100 14.142 1.414 0.813 0.164 Active +FOPR 2010-08-28 00:00:00.000 0.875 0.100 14.142 1.414 0.864 0.164 Active +FOPR 2010-09-07 00:00:00.000 0.926 0.100 14.142 1.414 0.914 0.165 Active +FOPR 2010-09-17 00:00:00.000 0.977 0.100 14.142 1.414 0.963 0.165 Active +FOPR 2010-09-27 00:00:00.000 1.027 0.103 14.142 1.452 1.008 0.167 Active +FOPR 2010-10-07 00:00:00.000 1.075 0.108 14.142 1.520 1.049 0.169 Active +FOPR 2010-10-17 00:00:00.000 1.122 0.112 14.142 1.586 1.089 0.171 Active +FOPR 2010-10-27 00:00:00.000 1.166 0.117 14.142 1.649 1.126 0.172 Active +FOPR 2010-11-06 00:00:00.000 1.208 0.121 14.142 1.708 1.160 0.174 Active +FOPR 2010-11-16 00:00:00.000 1.247 0.125 14.142 1.764 1.192 0.175 Active +FOPR 2010-11-26 00:00:00.000 1.284 0.128 14.142 1.815 1.219 0.175 Active +FOPR 2010-12-06 00:00:00.000 1.317 0.132 14.142 1.862 1.243 0.175 Active +FOPR 2010-12-16 00:00:00.000 1.346 0.135 14.142 1.904 1.263 0.176 Active +FOPR 2010-12-26 00:00:00.000 1.371 0.137 14.142 1.939 1.279 0.176 Active +FOPR 2011-01-05 00:00:00.000 1.392 0.139 14.142 1.968 1.292 0.177 Active +FOPR 2011-01-15 00:00:00.000 1.407 0.141 14.142 1.990 1.300 0.179 Active +FOPR 2011-01-25 00:00:00.000 1.418 0.142 14.142 2.005 1.303 0.181 Active +FOPR 2011-02-04 00:00:00.000 1.422 0.142 14.142 2.011 1.303 0.183 Active +FOPR 2011-02-14 00:00:00.000 1.424 0.142 14.142 2.013 1.299 0.185 Active +FOPR 2011-02-24 00:00:00.000 1.425 0.143 14.142 2.016 1.294 0.187 Active +FOPR 2011-03-06 00:00:00.000 1.427 0.143 14.142 2.018 1.290 0.188 Active +FOPR 2011-03-16 00:00:00.000 1.430 0.143 14.142 2.022 1.283 0.189 Active +FOPR 2011-03-26 00:00:00.000 1.433 0.143 14.142 2.027 1.275 0.187 Active +FOPR 2011-04-05 00:00:00.000 1.438 0.144 14.142 2.033 1.263 0.186 Active +FOPR 2011-04-15 00:00:00.000 1.443 0.144 14.142 2.041 1.250 0.186 Active +FOPR 2011-04-25 00:00:00.000 1.449 0.145 14.142 2.049 1.237 0.186 Active +FOPR 2011-05-05 00:00:00.000 1.455 0.145 14.142 2.057 1.222 0.185 Active +FOPR 2011-05-15 00:00:00.000 1.460 0.146 14.142 2.065 1.207 0.184 Active +FOPR 2011-05-25 00:00:00.000 1.466 0.147 14.142 2.073 1.190 0.184 Active +FOPR 2011-06-04 00:00:00.000 1.470 0.147 14.142 2.079 1.170 0.183 Active +FOPR 2011-06-14 00:00:00.000 1.474 0.147 14.142 2.085 1.146 0.183 Active +FOPR 2011-06-24 00:00:00.000 1.475 0.148 14.142 2.086 1.122 0.184 Active +FOPR 2011-07-04 00:00:00.000 1.474 0.147 14.142 2.084 1.098 0.188 Active +FOPR 2011-07-14 00:00:00.000 1.469 0.147 14.142 2.078 1.077 0.192 Active +FOPR 2011-07-24 00:00:00.000 1.461 0.146 14.142 2.066 1.053 0.194 Active +FOPR 2011-08-03 00:00:00.000 1.449 0.145 14.142 2.050 1.027 0.196 Active +FOPR 2011-08-13 00:00:00.000 1.436 0.144 14.142 2.031 1.002 0.196 Active +FOPR 2011-08-23 00:00:00.000 1.421 0.142 14.142 2.010 0.975 0.197 Active +FOPR 2011-09-02 00:00:00.000 1.403 0.140 14.142 1.984 0.947 0.200 Active +FOPR 2011-09-12 00:00:00.000 1.379 0.138 14.142 1.951 0.928 0.200 Active +FOPR 2011-09-22 00:00:00.000 1.353 0.135 14.142 1.913 0.902 0.203 Active +FOPR 2011-10-02 00:00:00.000 1.324 0.132 14.142 1.873 0.878 0.206 Active +FOPR 2011-10-12 00:00:00.000 1.297 0.130 14.142 1.834 0.851 0.210 Active +FOPR 2011-10-22 00:00:00.000 1.270 0.127 14.142 1.797 0.824 0.213 Active +FOPR 2011-11-01 00:00:00.000 1.243 0.124 14.142 1.758 0.801 0.215 Active +FOPR 2011-11-11 00:00:00.000 1.216 0.122 14.142 1.720 0.781 0.216 Active +FOPR 2011-11-21 00:00:00.000 1.189 0.119 14.142 1.682 0.762 0.216 Active +FOPR 2011-12-01 00:00:00.000 1.161 0.116 14.142 1.643 0.744 0.215 Active +FOPR 2011-12-11 00:00:00.000 1.134 0.113 14.142 1.604 0.725 0.212 Active +FOPR 2011-12-21 00:00:00.000 1.112 0.111 14.142 1.572 0.704 0.206 Active +FOPR 2011-12-31 00:00:00.000 1.091 0.109 14.142 1.543 0.683 0.200 Active +FOPR 2012-01-10 00:00:00.000 1.072 0.107 14.142 1.516 0.661 0.194 Active +FOPR 2012-01-20 00:00:00.000 1.053 0.105 14.142 1.489 0.640 0.189 Active +FOPR 2012-01-30 00:00:00.000 1.033 0.103 14.142 1.460 0.619 0.185 Active +FOPR 2012-02-09 00:00:00.000 1.013 0.101 14.142 1.432 0.597 0.181 Active +FOPR 2012-02-19 00:00:00.000 0.995 0.100 14.142 1.414 0.576 0.176 Active +FOPR 2012-02-29 00:00:00.000 0.975 0.100 14.142 1.414 0.555 0.171 Active +FOPR 2012-03-10 00:00:00.000 0.956 0.100 14.142 1.414 0.533 0.171 Active +FOPR 2012-03-20 00:00:00.000 0.936 0.100 14.142 1.414 0.513 0.171 Active +FOPR 2012-03-30 00:00:00.000 0.916 0.100 14.142 1.414 0.494 0.170 Active +FOPR 2012-04-09 00:00:00.000 0.893 0.100 14.142 1.414 0.477 0.169 Active +FOPR 2012-04-19 00:00:00.000 0.869 0.100 14.142 1.414 0.462 0.169 Active +FOPR 2012-04-29 00:00:00.000 0.842 0.100 14.142 1.414 0.447 0.170 Active +FOPR 2012-05-09 00:00:00.000 0.812 0.100 14.142 1.414 0.432 0.170 Active +FOPR 2012-05-19 00:00:00.000 0.779 0.100 14.142 1.414 0.417 0.171 Active +FOPR 2012-05-29 00:00:00.000 0.742 0.100 14.142 1.414 0.403 0.170 Active +FOPR 2012-06-08 00:00:00.000 0.702 0.100 14.142 1.414 0.389 0.171 Active +FOPR 2012-06-18 00:00:00.000 0.661 0.100 14.142 1.414 0.379 0.171 Active +FOPR 2012-06-28 00:00:00.000 0.619 0.100 14.142 1.414 0.370 0.171 Active +FOPR 2012-07-08 00:00:00.000 0.578 0.100 14.142 1.414 0.361 0.169 Active +FOPR 2012-07-18 00:00:00.000 0.540 0.100 14.142 1.414 0.354 0.168 Active +FOPR 2012-07-28 00:00:00.000 0.505 0.100 14.142 1.414 0.349 0.166 Active +FOPR 2012-08-07 00:00:00.000 0.475 0.100 14.142 1.414 0.344 0.165 Active +FOPR 2012-08-17 00:00:00.000 0.450 0.100 14.142 1.414 0.340 0.165 Active +FOPR 2012-08-27 00:00:00.000 0.431 0.100 14.142 1.414 0.344 0.168 Active +FOPR 2012-09-06 00:00:00.000 0.419 0.100 14.142 1.414 0.350 0.171 Active +FOPR 2012-09-16 00:00:00.000 0.410 0.100 14.142 1.414 0.349 0.171 Active +FOPR 2012-09-26 00:00:00.000 0.406 0.100 14.142 1.414 0.350 0.173 Active +FOPR 2012-10-06 00:00:00.000 0.404 0.100 14.142 1.414 0.347 0.171 Active +FOPR 2012-10-16 00:00:00.000 0.399 0.100 14.142 1.414 0.344 0.168 Active +FOPR 2012-10-26 00:00:00.000 0.389 0.100 14.142 1.414 0.346 0.165 Active +FOPR 2012-11-05 00:00:00.000 0.374 0.100 14.142 1.414 0.348 0.162 Active +FOPR 2012-11-15 00:00:00.000 0.355 0.100 14.142 1.414 0.350 0.156 Active +FOPR 2012-11-25 00:00:00.000 0.332 0.100 14.142 1.414 0.350 0.148 Active +FOPR 2012-12-05 00:00:00.000 0.306 0.100 14.142 1.414 0.349 0.140 Active +FOPR 2012-12-15 00:00:00.000 0.282 0.100 14.142 1.414 0.348 0.133 Active +FOPR 2012-12-25 00:00:00.000 0.264 0.100 14.142 1.414 0.344 0.125 Active +FOPR 2013-01-04 00:00:00.000 0.248 0.100 14.142 1.414 0.340 0.118 Active +FOPR 2013-01-14 00:00:00.000 0.233 0.100 14.142 1.414 0.337 0.114 Active +FOPR 2013-01-24 00:00:00.000 0.219 0.100 14.142 1.414 0.335 0.112 Active +FOPR 2013-02-03 00:00:00.000 0.205 0.100 14.142 1.414 0.334 0.110 Active +FOPR 2013-02-13 00:00:00.000 0.192 0.100 14.142 1.414 0.333 0.110 Active +FOPR 2013-02-23 00:00:00.000 0.180 0.100 14.142 1.414 0.332 0.109 Active +FOPR 2013-03-05 00:00:00.000 0.169 0.100 14.142 1.414 0.330 0.107 Active +FOPR 2013-03-15 00:00:00.000 0.160 0.100 14.142 1.414 0.327 0.106 Active +FOPR 2013-03-25 00:00:00.000 0.152 0.100 14.142 1.414 0.323 0.105 Active +FOPR 2013-04-04 00:00:00.000 0.146 0.100 14.142 1.414 0.317 0.102 Active +FOPR 2013-04-14 00:00:00.000 0.141 0.100 14.142 1.414 0.310 0.100 Active +FOPR 2013-04-24 00:00:00.000 0.137 0.100 14.142 1.414 0.303 0.098 Active +FOPR 2013-05-04 00:00:00.000 0.134 0.100 14.142 1.414 0.296 0.096 Active +FOPR 2013-05-14 00:00:00.000 0.130 0.100 14.142 1.414 0.290 0.094 Active +FOPR 2013-05-24 00:00:00.000 0.127 0.100 14.142 1.414 0.284 0.092 Active +FOPR 2013-06-03 00:00:00.000 0.123 0.100 14.142 1.414 0.279 0.090 Active +FOPR 2013-06-13 00:00:00.000 0.119 0.100 14.142 1.414 0.275 0.088 Active +FOPR 2013-06-23 00:00:00.000 0.120 0.100 14.142 1.414 0.270 0.085 Active +FOPR 2013-07-03 00:00:00.000 0.128 0.100 14.142 1.414 0.266 0.081 Active +FOPR 2013-07-13 00:00:00.000 0.136 0.100 14.142 1.414 0.263 0.077 Active +FOPR 2013-07-23 00:00:00.000 0.143 0.100 14.142 1.414 0.261 0.073 Active +FOPR 2013-08-02 00:00:00.000 0.150 0.100 14.142 1.414 0.258 0.069 Active +FOPR 2013-08-12 00:00:00.000 0.155 0.100 14.142 1.414 0.256 0.066 Active +FOPR 2013-08-22 00:00:00.000 0.159 0.100 14.142 1.414 0.254 0.063 Active +FOPR 2013-09-01 00:00:00.000 0.163 0.100 14.142 1.414 0.251 0.061 Active +FOPR 2013-09-11 00:00:00.000 0.166 0.100 14.142 1.414 0.248 0.059 Active +FOPR 2013-09-21 00:00:00.000 0.167 0.100 14.142 1.414 0.247 0.058 Active +FOPR 2013-10-01 00:00:00.000 0.167 0.100 14.142 1.414 0.245 0.058 Active +FOPR 2013-10-11 00:00:00.000 0.166 0.100 14.142 1.414 0.243 0.058 Active +FOPR 2013-10-21 00:00:00.000 0.165 0.100 14.142 1.414 0.243 0.058 Active +FOPR 2013-10-31 00:00:00.000 0.164 0.100 14.142 1.414 0.242 0.059 Active +FOPR 2013-11-10 00:00:00.000 0.165 0.100 14.142 1.414 0.243 0.059 Active +FOPR 2013-11-20 00:00:00.000 0.169 0.100 14.142 1.414 0.243 0.059 Active +FOPR 2013-11-30 00:00:00.000 0.176 0.100 14.142 1.414 0.242 0.058 Active +FOPR 2013-12-10 00:00:00.000 0.186 0.100 14.142 1.414 0.242 0.057 Active +FOPR 2013-12-20 00:00:00.000 0.197 0.100 14.142 1.414 0.241 0.057 Active +FOPR 2013-12-30 00:00:00.000 0.211 0.100 14.142 1.414 0.239 0.058 Active +FOPR 2014-01-09 00:00:00.000 0.225 0.100 14.142 1.414 0.238 0.059 Active +FOPR 2014-01-19 00:00:00.000 0.239 0.100 14.142 1.414 0.238 0.061 Active +FOPR 2014-01-29 00:00:00.000 0.252 0.100 14.142 1.414 0.238 0.061 Active +FOPR 2014-02-08 00:00:00.000 0.264 0.100 14.142 1.414 0.237 0.061 Active +FOPR 2014-02-18 00:00:00.000 0.275 0.100 14.142 1.414 0.236 0.062 Active +FOPR 2014-02-28 00:00:00.000 0.285 0.100 14.142 1.414 0.236 0.064 Active +FOPR 2014-03-10 00:00:00.000 0.295 0.100 14.142 1.414 0.236 0.066 Active +FOPR 2014-03-20 00:00:00.000 0.303 0.100 14.142 1.414 0.235 0.069 Active +FOPR 2014-03-30 00:00:00.000 0.309 0.100 14.142 1.414 0.234 0.072 Active +FOPR 2014-04-09 00:00:00.000 0.312 0.100 14.142 1.414 0.231 0.074 Active +FOPR 2014-04-19 00:00:00.000 0.313 0.100 14.142 1.414 0.229 0.076 Active +FOPR 2014-04-29 00:00:00.000 0.310 0.100 14.142 1.414 0.225 0.077 Active +FOPR 2014-05-09 00:00:00.000 0.304 0.100 14.142 1.414 0.220 0.078 Active +FOPR 2014-05-19 00:00:00.000 0.296 0.100 14.142 1.414 0.215 0.078 Active +FOPR 2014-05-29 00:00:00.000 0.286 0.100 14.142 1.414 0.209 0.078 Active +FOPR 2014-06-08 00:00:00.000 0.275 0.100 14.142 1.414 0.202 0.078 Active +FOPR 2014-06-18 00:00:00.000 0.264 0.100 14.142 1.414 0.195 0.079 Active +FOPR 2014-06-28 00:00:00.000 0.253 0.100 14.142 1.414 0.188 0.079 Active +FOPR 2014-07-08 00:00:00.000 0.241 0.100 14.142 1.414 0.181 0.080 Active +FOPR 2014-07-18 00:00:00.000 0.230 0.100 14.142 1.414 0.173 0.082 Active +FOPR 2014-07-28 00:00:00.000 0.218 0.100 14.142 1.414 0.167 0.084 Active +FOPR 2014-08-07 00:00:00.000 0.207 0.100 14.142 1.414 0.161 0.086 Active +FOPR 2014-08-17 00:00:00.000 0.197 0.100 14.142 1.414 0.155 0.088 Active +FOPR 2014-08-27 00:00:00.000 0.187 0.100 14.142 1.414 0.149 0.090 Active +FOPR 2014-09-06 00:00:00.000 0.178 0.100 14.142 1.414 0.143 0.092 Active +FOPR 2014-09-16 00:00:00.000 0.168 0.100 14.142 1.414 0.138 0.094 Active +FOPR 2014-09-26 00:00:00.000 0.159 0.100 14.142 1.414 0.132 0.095 Active +FOPR 2014-10-06 00:00:00.000 0.150 0.100 14.142 1.414 0.128 0.096 Active +FOPR 2014-10-16 00:00:00.000 0.141 0.100 14.142 1.414 0.124 0.096 Active +FOPR 2014-10-26 00:00:00.000 0.134 0.100 14.142 1.414 0.120 0.096 Active +FOPR 2014-11-05 00:00:00.000 0.127 0.100 14.142 1.414 0.116 0.097 Active +FOPR 2014-11-15 00:00:00.000 0.120 0.100 14.142 1.414 0.113 0.097 Active +FOPR 2014-11-25 00:00:00.000 0.115 0.100 14.142 1.414 0.110 0.096 Active +FOPR 2014-12-05 00:00:00.000 0.111 0.100 14.142 1.414 0.107 0.096 Active +FOPR 2014-12-15 00:00:00.000 0.107 0.100 14.142 1.414 0.105 0.095 Active +FOPR 2014-12-25 00:00:00.000 0.101 0.100 14.142 1.414 0.102 0.095 Active +FOPR 2015-01-04 00:00:00.000 0.096 0.100 14.142 1.414 0.100 0.095 Active +FOPR 2015-01-14 00:00:00.000 0.089 0.100 14.142 1.414 0.097 0.096 Active +FOPR 2015-01-24 00:00:00.000 0.081 0.100 14.142 1.414 0.094 0.096 Active +FOPR 2015-02-03 00:00:00.000 0.073 0.100 14.142 1.414 0.092 0.098 Active +FOPR 2015-02-13 00:00:00.000 0.065 0.100 14.142 1.414 0.090 0.099 Active +FOPR 2015-02-23 00:00:00.000 0.058 0.100 14.142 1.414 0.088 0.101 Active +FOPR 2015-03-05 00:00:00.000 0.050 0.100 14.142 1.414 0.087 0.103 Active +FOPR 2015-03-15 00:00:00.000 0.044 0.100 14.142 1.414 0.086 0.104 Active +FOPR 2015-03-25 00:00:00.000 0.038 0.100 14.142 1.414 0.085 0.106 Active +FOPR 2015-04-04 00:00:00.000 0.033 0.100 14.142 1.414 0.084 0.107 Active +FOPR 2015-04-14 00:00:00.000 0.029 0.100 14.142 1.414 0.084 0.108 Active +FOPR 2015-04-24 00:00:00.000 0.026 0.100 14.142 1.414 0.084 0.108 Active +FOPR 2015-05-04 00:00:00.000 0.024 0.100 14.142 1.414 0.084 0.109 Active +FOPR 2015-05-14 00:00:00.000 0.022 0.100 14.142 1.414 0.084 0.109 Active +FOPR 2015-05-24 00:00:00.000 0.021 0.100 14.142 1.414 0.084 0.109 Active +FOPR 2015-06-03 00:00:00.000 0.020 0.100 14.142 1.414 0.084 0.110 Active +FOPR 2015-06-13 00:00:00.000 0.020 0.100 14.142 1.414 0.084 0.110 Active +FOPR 2015-06-23 00:00:00.000 0.020 0.100 14.142 1.414 0.084 0.110 Active +WOPR_OP1_108 2012-12-15 00:00:00.000 0.300 0.075 1.732 0.130 0.257 0.099 Active +WOPR_OP1_144 2013-12-10 00:00:00.000 0.200 0.035 1.732 0.061 0.183 0.106 Active +WOPR_OP1_190 2015-03-15 00:00:00.000 0.015 0.010 1.732 0.017 0.042 0.041 Active +WOPR_OP1_36 2010-12-26 00:00:00.000 0.700 0.070 1.000 0.070 0.650 0.084 Active +WOPR_OP1_72 2011-12-21 00:00:00.000 0.500 0.050 1.000 0.050 0.405 0.170 Active +WOPR_OP1_9 2010-03-31 00:00:00.000 0.100 0.050 1.000 0.050 0.096 0.060 Active +WPR_DIFF_1 199, 1200 0.200 0.150 1.000 0.150 0.073 0.130 Active +WPR_DIFF_1 199, 1800 0.000 0.050 1.000 0.050 0.127 0.125 Active +WPR_DIFF_1 199, 400 0.000 0.100 1.000 0.100 -0.011 0.060 Active +WPR_DIFF_1 199, 800 0.100 0.200 1.000 0.200 0.081 0.126 Active +------------ ----------------------- ----- ----- ------ ----- ------ ----- ------ From c065695aadcc2e7f418a7cab99db04ea63250ea4 Mon Sep 17 00:00:00 2001 From: DanSava Date: Tue, 17 Dec 2024 15:19:45 +0200 Subject: [PATCH 17/48] Add event serialization testing --- tests/everest/test_everserver.py | 34 +++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/tests/everest/test_everserver.py b/tests/everest/test_everserver.py index fa95bae4126..2891ab5b47e 100644 --- a/tests/everest/test_everserver.py +++ b/tests/everest/test_everserver.py @@ -8,7 +8,8 @@ import pytest from seba_sqlite.snapshot import SebaSnapshot -from ert.run_models.everest_run_model import EverestExitCode +from _ert.events import event_from_json, event_to_json +from ert.run_models.everest_run_model import EverestExitCode, EverestRunModel from everest.config import EverestConfig, OptimizationConfig, ServerConfig from everest.detached import ServerStatus, everserver_status from everest.detached.jobs import everserver @@ -252,3 +253,34 @@ def test_everserver_status_contains_max_runtime_failure( "sleep Failed with: The run is cancelled due to reaching MAX_RUNTIME" in status["message"] ) + + +def test_event_serialization( + copy_math_func_test_data_to_tmp, + evaluator_server_config_generator, +): + config = EverestConfig.load_file("config_minimal.yml") + + def check_status_round_tripping(status): + round_trip_status = json.loads(json.dumps(status)) + assert round_trip_status == status + + run_model = EverestRunModel.create( + config, + simulation_callback=check_status_round_tripping, + ) + + send_snapshot_event = run_model.send_snapshot_event + + def check_event_serialization_round_trip(*args, **_): + event, _ = args + event_json = event_to_json(event) + round_trip_event = event_from_json(str(event_json)) + assert event == round_trip_event + send_snapshot_event(*args) + + run_model.send_snapshot_event = check_event_serialization_round_trip + + evaluator_server_config = evaluator_server_config_generator(run_model) + + run_model.run_experiment(evaluator_server_config) From 9824ff6fc9773e746bb92ce9c57ea04d1f5bbc89 Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Thu, 23 Jan 2025 09:28:28 +0100 Subject: [PATCH 18/48] Reduce test matrix for flow and slurm tests --- .github/workflows/build_and_test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index c2df15631f4..afb9700dc1d 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -66,7 +66,7 @@ jobs: fail-fast: false matrix: os: [ ubuntu-latest ] - python-version: [ '3.11', '3.12' ] + python-version: [ '3.11' ] uses: ./.github/workflows/test_ert_with_slurm.yml with: os: ${{ matrix.os }} @@ -78,7 +78,7 @@ jobs: fail-fast: false matrix: os: [ ubuntu-latest ] - python-version: [ '3.11', '3.12' ] + python-version: [ '3.11' ] uses: ./.github/workflows/test_ert_with_flow.yml with: os: ${{ matrix.os }} From ceade12707a09353479f07afb5d7c1fe21bdc978 Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Thu, 23 Jan 2025 09:48:14 +0100 Subject: [PATCH 19/48] Increase timeout of killed_ert_does_not_leave_storage_server_process Also add more debug info --- src/ert/services/_storage_main.py | 1 + tests/ert/ui_tests/cli/test_cli.py | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ert/services/_storage_main.py b/src/ert/services/_storage_main.py index e582588f68c..68bde57bc87 100644 --- a/src/ert/services/_storage_main.py +++ b/src/ert/services/_storage_main.py @@ -190,6 +190,7 @@ def main() -> None: logger = logging.getLogger("ert.shared.storage.info") try: logger.info("Starting dark storage") + logger.info(f"Started dark storage with parent {args.parent_pid}") run_server(args, debug=False, uvicorn_config=uvicorn_config) except SystemExit: logger.info("Stopping dark storage") diff --git a/tests/ert/ui_tests/cli/test_cli.py b/tests/ert/ui_tests/cli/test_cli.py index 0859197d02f..2c3509a3f80 100644 --- a/tests/ert/ui_tests/cli/test_cli.py +++ b/tests/ert/ui_tests/cli/test_cli.py @@ -990,6 +990,9 @@ async def _wait_for_storage_process_to_shut_down(): if not storage_process.is_running(): storage_server_has_shutdown.set() await asyncio.sleep(0.1) + print( + f"Waiting for killed ert:{ert_subprocess.pid} to stop storage:{storage_process.pid}" + ) - await asyncio.wait_for(_wait_for_storage_process_to_shut_down(), timeout=45) + await asyncio.wait_for(_wait_for_storage_process_to_shut_down(), timeout=90) assert not storage_process.is_running() From f0019af67a40b21be8637e4546ddf994bdde4eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Berland?= Date: Thu, 23 Jan 2025 10:13:49 +0100 Subject: [PATCH 20/48] Skip testing lsf/openpbs in slurm specific test Also use multiple workers since many tests do a lot of sleeping. --- .github/workflows/test_ert_with_slurm.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test_ert_with_slurm.yml b/.github/workflows/test_ert_with_slurm.yml index a38a5f4b7a3..e90d430aaac 100644 --- a/.github/workflows/test_ert_with_slurm.yml +++ b/.github/workflows/test_ert_with_slurm.yml @@ -77,7 +77,10 @@ jobs: run: | set -e export _ERT_TESTS_ALTERNATIVE_QUEUE=AlternativeQ - pytest tests/ert/unit_tests/scheduler --slurm + pytest tests/ert/unit_tests/scheduler/test_{generic,slurm}_driver.py --slurm \ + -n 8 --durations=10 -k "not (LsfDriver or LocalDriver or OpenPBSDriver)" + scontrol show job + pytest tests/ert/ui_tests/cli/test_missing_runpath.py --slurm - name: Test poly-example on slurm From e2b6898f3f92d089df14b833dfc4e57ac3ec99d6 Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Thu, 23 Jan 2025 10:21:54 +0100 Subject: [PATCH 21/48] Do not split integration_test in everest --- .github/workflows/build_and_test.yml | 2 +- .github/workflows/test_everest.yml | 14 ++------------ 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index afb9700dc1d..33d4648463a 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -47,7 +47,7 @@ jobs: strategy: fail-fast: false matrix: - test-type: [ 'test', 'integration-test', 'everest-models-test', 'doc'] + test-type: [ 'test', 'everest-models-test', 'doc'] python-version: [ '3.11', '3.12' ] os: [ ubuntu-latest ] exclude: diff --git a/.github/workflows/test_everest.yml b/.github/workflows/test_everest.yml index f3e400d39cd..3becdf4feda 100644 --- a/.github/workflows/test_everest.yml +++ b/.github/workflows/test_everest.yml @@ -41,22 +41,12 @@ jobs: - name: Run Tests Linux if: ${{ inputs.test-type == 'test' && runner.os != 'macOS'}} run: | - pytest tests/everest -n 4 --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -m "not integration_test" --dist loadgroup -sv + pytest tests/everest -n 4 --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy --dist loadgroup -sv - name: Run Tests macOS if: ${{ inputs.test-type == 'test' && runner.os == 'macOS'}} run: | - python -m pytest tests/everest -n 4 --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -m "not integration_test and not skip_mac_ci" --dist loadgroup -sv - - - name: Run Integration Tests Linux - if: ${{inputs.test-type == 'integration-test' && runner.os != 'macOS'}} - run: | - pytest tests/everest -n 4 --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -m "integration_test" --dist loadgroup -sv - - - name: Run Integration Tests macOS - if: ${{inputs.test-type == 'integration-test' && runner.os == 'macOS'}} - run: | - python -m pytest tests/everest -n 4 --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -m "integration_test and not skip_mac_ci" --dist loadgroup + python -m pytest tests/everest -n 4 --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -m "not skip_mac_ci" --dist loadgroup -sv - name: Build Documentation if: inputs.test-type == 'doc' From aad9552d5e1b53ae6dd52d3f53223a216e05496a Mon Sep 17 00:00:00 2001 From: Jonathan Karlsen Date: Wed, 22 Jan 2025 13:57:41 +0100 Subject: [PATCH 22/48] Have parameter config keep parameters types for design matrix This commit makes enkf_main's _value_export_json keep types when dumping the json. Before this commit, all values (also numerical) were turned to strings if used alongside categorical values. --- src/ert/enkf_main.py | 19 +++++++++++++++++-- .../cli/analysis/test_design_matrix.py | 19 ++++++++++++++++++- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/ert/enkf_main.py b/src/ert/enkf_main.py index 73114a7c8e9..78b04a9e7f2 100644 --- a/src/ert/enkf_main.py +++ b/src/ert/enkf_main.py @@ -65,9 +65,24 @@ def _value_export_json( if len(values) == 0: return + def parse_value(value: float | int | str) -> float | int | str: + if isinstance(value, float | int): + return value + try: + return int(value) + except ValueError: + try: + return float(value) + except ValueError: + return value + # Hierarchical - json_out: dict[str, float | dict[str, float]] = { - key: dict(param_map.items()) for key, param_map in values.items() + json_out: dict[str, float | dict[str, float | int | str]] = { + key: { + inner_key: parse_value(inner_value) + for inner_key, inner_value in param_map.items() + } + for key, param_map in values.items() } # Disallow NaN from being written: ERT produces the parameters and the only diff --git a/tests/ert/ui_tests/cli/analysis/test_design_matrix.py b/tests/ert/ui_tests/cli/analysis/test_design_matrix.py index 13ad73d06da..87fe0f57719 100644 --- a/tests/ert/ui_tests/cli/analysis/test_design_matrix.py +++ b/tests/ert/ui_tests/cli/analysis/test_design_matrix.py @@ -1,5 +1,7 @@ +import json import os import stat +from pathlib import Path from textwrap import dedent import numpy as np @@ -90,17 +92,32 @@ def _evaluate(coeffs, x): "test-experiment", ) storage_path = ErtConfig.from_file("poly.ert").ens_path + config_path = ErtConfig.from_file("poly.ert").config_path with open_storage(storage_path) as storage: experiment = storage.get_experiment_by_name("test-experiment") params = experiment.get_ensemble_by_name("default").load_parameters( "DESIGN_MATRIX" )["values"] - # All parameters are strings, this needs to be fixed np.testing.assert_array_equal(params[:, 0], [str(idx) for idx in a_values]) np.testing.assert_array_equal(params[:, 1], 5 * ["cat1"] + 5 * ["cat2"]) np.testing.assert_array_equal(params[:, 2], 10 * ["1"]) np.testing.assert_array_equal(params[:, 3], 10 * ["2"]) + real_0_iter_0_parameters_json_path = ( + Path(config_path) / "poly_out" / "realization-0" / "iter-0" / "parameters.json" + ) + assert real_0_iter_0_parameters_json_path.exists() + with open(real_0_iter_0_parameters_json_path, mode="r+", encoding="utf-8") as fs: + parameters_contents = json.load(fs) + assert isinstance(parameters_contents, dict) + design_matrix_content = parameters_contents.get("DESIGN_MATRIX") + assert isinstance(design_matrix_content, dict) + for k, v in design_matrix_content.items(): + if k == "category": + assert isinstance(v, str) + else: + assert isinstance(v, float | int) + @pytest.mark.usefixtures("copy_poly_case") @pytest.mark.parametrize( From 0937c6e7d3bfc618e0f34a31e787903fbc4876ac Mon Sep 17 00:00:00 2001 From: Frode Aarstad Date: Tue, 21 Jan 2025 13:25:10 +0100 Subject: [PATCH 23/48] Fix bug where only literal error had position info --- src/everest/config/everest_config.py | 9 ++++---- .../functional/test_main_everest_entry.py | 2 +- tests/everest/test_config_validation.py | 22 ++++++++++++++++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/everest/config/everest_config.py b/src/everest/config/everest_config.py index d9dc43c9657..333bc4b15e8 100644 --- a/src/everest/config/everest_config.py +++ b/src/everest/config/everest_config.py @@ -797,14 +797,13 @@ def load_file(config_file: str) -> "EverestConfig": for e in error.errors( include_context=True, include_input=True, include_url=False ): - if e["type"] == "literal_error": + if e["type"] in {"missing", "value_error"} or e["input"] is None: + exp.errors.append((e, None)) + else: for index, line in enumerate(file_content): - if (pos := line.find(e["input"])) != -1: + if (pos := line.find(str(e["input"]))) != -1: exp.errors.append((e, (index + 1, pos + 1))) break - else: - exp.errors.append((e, None)) - raise exp from error @staticmethod diff --git a/tests/everest/functional/test_main_everest_entry.py b/tests/everest/functional/test_main_everest_entry.py index 1ec7695a22a..8a80384d74e 100644 --- a/tests/everest/functional/test_main_everest_entry.py +++ b/tests/everest/functional/test_main_everest_entry.py @@ -125,7 +125,7 @@ def test_everest_main_lint_entry(cached_example): f"""Loading config file failed with: Found 1 validation error: -controls -> 0 -> initial_guess +line: 2, column: 18. controls -> 0 -> initial_guess * Input should be a valid number, unable to parse string as a number {type_} """ ) diff --git a/tests/everest/test_config_validation.py b/tests/everest/test_config_validation.py index 6778b69da60..f75ba9ebb57 100644 --- a/tests/everest/test_config_validation.py +++ b/tests/everest/test_config_validation.py @@ -998,7 +998,11 @@ def test_load_file_with_errors(copy_math_func_test_data_to_tmp, capsys): content = file.read() with open("config_minimal_error.yml", "w", encoding="utf-8") as file: - file.write(content.replace("generic_control", "yolo_control")) + content = content.replace("generic_control", "yolo_control") + content = content.replace("max: 1.0", "max: not_a number") + pos = content.find("name: distance") + content = content[: pos + 14] + "\n invalid: invalid" + content[pos + 14 :] + file.write(content) with pytest.raises(SystemExit): parser = ArgumentParser(prog="test") @@ -1006,6 +1010,18 @@ def test_load_file_with_errors(copy_math_func_test_data_to_tmp, capsys): captured = capsys.readouterr() - assert "Found 1 validation error" in captured.err + assert "Found 3 validation error" in captured.err assert "line: 3, column: 11" in captured.err - assert "Input should be 'well_control' or 'generic_control'" in captured.err + assert ( + "Input should be 'well_control' or 'generic_control' (type=literal_error)" + in captured.err + ) + + assert "line: 5, column: 10" in captured.err + assert ( + "Input should be a valid number, unable to parse string as a number (type=float_parsing)" + in captured.err + ) + + assert "line: 16, column: 5" in captured.err + assert "Extra inputs are not permitted (type=extra_forbidden)" in captured.err From 9fde13f6345547d8874fb3bd6c90f29f6eaf442e Mon Sep 17 00:00:00 2001 From: Julius Parulek Date: Fri, 17 Jan 2025 21:35:59 +0100 Subject: [PATCH 24/48] zmq: implement task for heeartbeats on clients to detect reconnection Heartbeat task sends HEARTBEAT to all the clients (ie. Monitor) at client.HEARTBEAT_TIMEOUT intervals. Clients do not reply, just process the message. If client detects longer delay between two heartbeats, the client will send CONNECT to evaluator in addition; ie. getting the connection re-established after a break. This is to simulate re-connection. Each CONNECT_MSG will then trigger sending FullSnapshot from the ensemble evaluator. Initially HEARTBEAT_TIMEOUT is set to 5 seconds while Monitor accepts 10 seconds at max as a delay. Additionally, initial connection will now undergo same amount of retries as standard messages. --- src/_ert/forward_model_runner/client.py | 18 +++++++- src/ert/ensemble_evaluator/evaluator.py | 38 +++++++++++++--- .../test_ensemble_client.py | 44 +++++++++++++++---- .../test_ensemble_evaluator.py | 33 +++++++++++++- .../ensemble_evaluator/test_monitor.py | 3 +- .../test_event_reporter.py | 4 +- tests/ert/utils.py | 27 ++++++++++-- 7 files changed, 142 insertions(+), 25 deletions(-) diff --git a/src/_ert/forward_model_runner/client.py b/src/_ert/forward_model_runner/client.py index 62fdd4056fb..cf9f6ea7edd 100644 --- a/src/_ert/forward_model_runner/client.py +++ b/src/_ert/forward_model_runner/client.py @@ -18,6 +18,8 @@ class ClientConnectionError(Exception): CONNECT_MSG = b"CONNECT" DISCONNECT_MSG = b"DISCONNECT" ACK_MSG = b"ACK" +HEARTBEAT_MSG = b"BEAT" +HEARTBEAT_TIMEOUT = 5.0 class Client: @@ -83,7 +85,7 @@ async def connect(self) -> None: await self._term_receiver_task() self._receiver_task = asyncio.create_task(self._receiver()) try: - await self.send(CONNECT_MSG, retries=1) + await self.send(CONNECT_MSG) except ClientConnectionError: await self._term_receiver_task() self.term() @@ -93,11 +95,23 @@ async def process_message(self, msg: str) -> None: raise NotImplementedError("Only monitor can receive messages!") async def _receiver(self) -> None: + last_heartbeat_time: float | None = None while True: try: _, raw_msg = await self.socket.recv_multipart() if raw_msg == ACK_MSG: self._ack_event.set() + elif raw_msg == HEARTBEAT_MSG: + if ( + last_heartbeat_time + and (asyncio.get_running_loop().time() - last_heartbeat_time) + > 2 * HEARTBEAT_TIMEOUT + ): + await self.socket.send_multipart([b"", CONNECT_MSG]) + logger.warning( + f"{self.dealer_id} heartbeat failed - reconnecting." + ) + last_heartbeat_time = asyncio.get_running_loop().time() else: await self.process_message(raw_msg.decode("utf-8")) except zmq.ZMQError as exc: @@ -144,5 +158,5 @@ async def send(self, message: str | bytes, retries: int | None = None) -> None: self.socket.connect(self.url) backoff = min(backoff * 2, 10) # Exponential backoff raise ClientConnectionError( - f"{self.dealer_id} Failed to send {message!r} after retries!" + f"{self.dealer_id} Failed to send {message!r} to {self.url} after retries!" ) diff --git a/src/ert/ensemble_evaluator/evaluator.py b/src/ert/ensemble_evaluator/evaluator.py index 9737f26e56c..c5c3122ef2a 100644 --- a/src/ert/ensemble_evaluator/evaluator.py +++ b/src/ert/ensemble_evaluator/evaluator.py @@ -5,6 +5,7 @@ import logging import traceback from collections.abc import Awaitable, Callable, Iterable, Sequence +from enum import Enum from typing import Any, get_args import zmq.asyncio @@ -27,7 +28,13 @@ event_from_json, event_to_json, ) -from _ert.forward_model_runner.client import ACK_MSG, CONNECT_MSG, DISCONNECT_MSG +from _ert.forward_model_runner.client import ( + ACK_MSG, + CONNECT_MSG, + DISCONNECT_MSG, + HEARTBEAT_MSG, + HEARTBEAT_TIMEOUT, +) from ert.ensemble_evaluator import identifiers as ids from ._ensemble import FMStepSnapshot @@ -45,13 +52,17 @@ EVENT_HANDLER = Callable[[list[Event]], Awaitable[None]] +class HeartbeatEvent(Enum): + event = HEARTBEAT_MSG + + class EnsembleEvaluator: def __init__(self, ensemble: Ensemble, config: EvaluatorServerConfig): self._config: EvaluatorServerConfig = config self._ensemble: Ensemble = ensemble self._events: asyncio.Queue[Event] = asyncio.Queue() - self._events_to_send: asyncio.Queue[Event] = asyncio.Queue() + self._events_to_send: asyncio.Queue[Event | HeartbeatEvent] = asyncio.Queue() self._manifest_queue: asyncio.Queue[Any] = asyncio.Queue() self._ee_tasks: list[asyncio.Task[None]] = [] @@ -72,14 +83,28 @@ def __init__(self, ensemble: Ensemble, config: EvaluatorServerConfig): self._dispatchers_empty: asyncio.Event = asyncio.Event() self._dispatchers_empty.set() + async def _do_heartbeat_clients(self) -> None: + await self._server_started + while True: + if self._clients_connected: + await self._events_to_send.put(HeartbeatEvent.event) + await asyncio.sleep(HEARTBEAT_TIMEOUT) + else: + await asyncio.sleep(0.1) + async def _publisher(self) -> None: await self._server_started while True: event = await self._events_to_send.get() for identity in self._clients_connected: - await self._router_socket.send_multipart( - [identity, b"", event_to_json(event).encode("utf-8")] - ) + if isinstance(event, HeartbeatEvent): + await self._router_socket.send_multipart( + [identity, b"", event.value] + ) + else: + await self._router_socket.send_multipart( + [identity, b"", event_to_json(event).encode("utf-8")] + ) self._events_to_send.task_done() async def _append_message(self, snapshot_update_event: EnsembleSnapshot) -> None: @@ -197,6 +222,8 @@ def ensemble(self) -> Ensemble: async def handle_client(self, dealer: bytes, frame: bytes) -> None: if frame == CONNECT_MSG: + if dealer in self._clients_connected: + logger.warning(f"{dealer!r} wants to reconnect.") self._clients_connected.add(dealer) self._clients_empty.clear() current_snapshot_dict = self._ensemble.snapshot.to_dict() @@ -343,6 +370,7 @@ async def _start_running(self) -> None: raise ValueError("no config for evaluator") self._ee_tasks = [ asyncio.create_task(self._server(), name="server_task"), + asyncio.create_task(self._do_heartbeat_clients(), name="heartbeat_task"), asyncio.create_task( self._batch_events_into_buffer(), name="dispatcher_task" ), diff --git a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py index 1a0ab130f13..d09f89099eb 100644 --- a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py +++ b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py @@ -1,5 +1,8 @@ +import asyncio + import pytest +import _ert.forward_model_runner.client from _ert.forward_model_runner.client import Client, ClientConnectionError from tests.ert.utils import MockZMQServer @@ -18,12 +21,12 @@ async def test_invalid_server(): async def test_successful_sending(unused_tcp_port): host = "localhost" url = f"tcp://{host}:{unused_tcp_port}" - messages_c1 = ["test_1", "test_2", "test_3"] - async with MockZMQServer(unused_tcp_port) as mock_server, Client(url) as c1: - for message in messages_c1: - await c1.send(message) + messages = ["test_1", "test_2", "test_3"] + async with MockZMQServer(unused_tcp_port) as mock_server, Client(url) as client: + for message in messages: + await client.send(message) - for msg in messages_c1: + for msg in messages: assert msg in mock_server.messages @@ -32,14 +35,14 @@ async def test_retry(unused_tcp_port): host = "localhost" url = f"tcp://{host}:{unused_tcp_port}" client_connection_error_set = False - messages_c1 = ["test_1", "test_2", "test_3"] + messages = ["test_1", "test_2", "test_3"] async with ( MockZMQServer(unused_tcp_port, signal=2) as mock_server, - Client(url, ack_timeout=0.5) as c1, + Client(url, ack_timeout=0.5) as client, ): - for message in messages_c1: + for message in messages: try: - await c1.send(message, retries=1) + await client.send(message, retries=1) except ClientConnectionError: client_connection_error_set = True mock_server.signal(0) @@ -47,3 +50,26 @@ async def test_retry(unused_tcp_port): assert mock_server.messages.count("test_1") == 2 assert mock_server.messages.count("test_2") == 1 assert mock_server.messages.count("test_3") == 1 + + +async def test_reconnect_when_missing_heartbeat(unused_tcp_port, monkeypatch): + host = "localhost" + url = f"tcp://{host}:{unused_tcp_port}" + monkeypatch.setattr(_ert.forward_model_runner.client, "HEARTBEAT_TIMEOUT", 0.1) + + async with ( + MockZMQServer(unused_tcp_port, signal=3) as mock_server, + Client(url) as client, + ): + await client.send("start", retries=1) + + await mock_server.do_heartbeat() + await asyncio.sleep(1) + await mock_server.do_heartbeat() + await client.send("stop", retries=1) + + # when reconnection happens CONNECT message is sent again + assert mock_server.messages.count("CONNECT") == 2 + assert mock_server.messages.count("DISCONNECT") == 1 + assert "start" in mock_server.messages + assert "stop" in mock_server.messages diff --git a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py index e3f3dd7ba51..eaa5eb5caca 100644 --- a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py +++ b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py @@ -2,6 +2,7 @@ import datetime from functools import partial from typing import cast +from unittest.mock import patch import pytest from hypothesis import given @@ -20,7 +21,13 @@ RealizationSuccess, event_to_json, ) -from _ert.forward_model_runner.client import CONNECT_MSG, DISCONNECT_MSG, Client +from _ert.forward_model_runner.client import ( + ACK_MSG, + CONNECT_MSG, + DISCONNECT_MSG, + HEARTBEAT_MSG, + Client, +) from ert.ensemble_evaluator import ( EnsembleEvaluator, EnsembleSnapshot, @@ -356,6 +363,30 @@ def check_if_final_snapshot_is_complete(final_snapshot: EnsembleSnapshot) -> boo break +@patch("ert.ensemble_evaluator.evaluator.HEARTBEAT_TIMEOUT", 0.1) +@pytest.mark.integration_test +async def test_monitor_receive_heartbeats(evaluator_to_use): + evaluator = evaluator_to_use + conn_info = evaluator._config.get_connection_info() + received_heartbeats = 0 + + async def mock_receiver(self): + nonlocal received_heartbeats + while True: + _, raw_msg = await self.socket.recv_multipart() + if raw_msg == ACK_MSG: + self._ack_event.set() + elif raw_msg == HEARTBEAT_MSG: + received_heartbeats += 1 + + with patch.object(Monitor, "_receiver", mock_receiver): + async with Monitor(conn_info) as monitor: + await asyncio.sleep(1.0) + await monitor.signal_done() + # in 1 second we should receive at least 2 heartbeats + assert received_heartbeats > 1 + + @pytest.mark.integration_test async def test_dispatch_endpoint_clients_can_connect_and_monitor_can_shut_down_evaluator( evaluator_to_use, diff --git a/tests/ert/unit_tests/ensemble_evaluator/test_monitor.py b/tests/ert/unit_tests/ensemble_evaluator/test_monitor.py index bbe114d15f3..2adc385f3e1 100644 --- a/tests/ert/unit_tests/ensemble_evaluator/test_monitor.py +++ b/tests/ert/unit_tests/ensemble_evaluator/test_monitor.py @@ -55,8 +55,9 @@ async def mock_event_handler(router_socket): assert msg == DISCONNECT_MSG -async def test_no_connection_established(make_ee_config): +async def test_no_connection_established(monkeypatch, make_ee_config): ee_config = make_ee_config() + monkeypatch.setattr(Monitor, "DEFAULT_MAX_RETRIES", 0) monitor = Monitor(ee_config.get_connection_info()) monitor._ack_timeout = 0.1 with pytest.raises(ClientConnectionError): diff --git a/tests/ert/unit_tests/forward_model_runner/test_event_reporter.py b/tests/ert/unit_tests/forward_model_runner/test_event_reporter.py index 3d5753f5595..02c49c96dba 100644 --- a/tests/ert/unit_tests/forward_model_runner/test_event_reporter.py +++ b/tests/ert/unit_tests/forward_model_runner/test_event_reporter.py @@ -213,9 +213,7 @@ def test_report_with_failed_reporter_but_finished_jobs(unused_tcp_port): def test_report_with_reconnected_reporter_but_finished_jobs(unused_tcp_port): # this is to show when the reporter fails but reconnects # reporter still manages to send events and completes fine - # see assert reporter._timeout_timestamp is not None - # meaning Finish event initiated _timeout but timeout wasn't reached since - # it finished succesfully + # see reporter._event_publisher for more details. host = "localhost" url = f"tcp://{host}:{unused_tcp_port}" diff --git a/tests/ert/utils.py b/tests/ert/utils.py index 4f66f93e157..4f5bbdbbc55 100644 --- a/tests/ert/utils.py +++ b/tests/ert/utils.py @@ -9,7 +9,12 @@ import zmq import zmq.asyncio -from _ert.forward_model_runner.client import ACK_MSG, CONNECT_MSG, DISCONNECT_MSG +from _ert.forward_model_runner.client import ( + ACK_MSG, + CONNECT_MSG, + DISCONNECT_MSG, + HEARTBEAT_MSG, +) from _ert.threading import ErtThread from ert.scheduler.event import FinishedEvent, StartedEvent @@ -64,9 +69,10 @@ def wait_until(func, interval=0.5, timeout=30): class MockZMQServer: def __init__(self, port, signal=0): """Mock ZMQ server for testing - signal = 0: normal operation + signal = 0: normal operation, receive messages but don't store CONNECT and DISCONNECT messages signal = 1: don't send ACK and don't receive messages signal = 2: don't send ACK, but receive messages + signal = 3: normal operation, and store also CONNECT and DISCONNECT messages """ self.port = port self.messages = [] @@ -74,6 +80,7 @@ def __init__(self, port, signal=0): self.loop = None self.server_task = None self.handler_task = None + self.dealers = set() def start_event_loop(self): asyncio.set_event_loop(self.loop) @@ -116,13 +123,25 @@ async def mock_zmq_server(self): def signal(self, value): self.value = value + async def do_heartbeat(self): + for dealer in self.dealers: + await self.router_socket.send_multipart([dealer, b"", HEARTBEAT_MSG]) + async def _handler(self): while True: try: dealer, __, frame = await self.router_socket.recv_multipart() - if frame in {CONNECT_MSG, DISCONNECT_MSG} or self.value == 0: + if frame == CONNECT_MSG: + await self.router_socket.send_multipart([dealer, b"", ACK_MSG]) + self.dealers.add(dealer) + elif frame == DISCONNECT_MSG: + await self.router_socket.send_multipart([dealer, b"", ACK_MSG]) + self.dealers.discard(dealer) + elif self.value in {0, 3}: await self.router_socket.send_multipart([dealer, b"", ACK_MSG]) - if frame not in {CONNECT_MSG, DISCONNECT_MSG} and self.value != 1: + if ( + self.value in {0, 2} and frame not in {CONNECT_MSG, DISCONNECT_MSG} + ) or self.value == 3: self.messages.append(frame.decode("utf-8")) except asyncio.CancelledError: break From eb8e652a9d0e7ef053ee0b267295f11a421b136a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Berland?= Date: Tue, 21 Jan 2025 12:45:52 +0100 Subject: [PATCH 25/48] Make the run dialogue snappier by tuning batching interval The batching interval of 2 seconds is legacy from the time when Ert was a mixture of Python and C, and a lot of threading issues attached. The underlying message structure and message processing infrastructure now handles a lot more messages, and the GUI can thus appear more responsive to the incoming messages from compute nodes. --- src/ert/ensemble_evaluator/evaluator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ert/ensemble_evaluator/evaluator.py b/src/ert/ensemble_evaluator/evaluator.py index c5c3122ef2a..873cebe0f2f 100644 --- a/src/ert/ensemble_evaluator/evaluator.py +++ b/src/ert/ensemble_evaluator/evaluator.py @@ -73,7 +73,7 @@ def __init__(self, ensemble: Ensemble, config: EvaluatorServerConfig): list[tuple[EVENT_HANDLER, Event]] ] = asyncio.Queue() self._max_batch_size: int = 500 - self._batching_interval: float = 2.0 + self._batching_interval: float = 0.5 self._complete_batch: asyncio.Event = asyncio.Event() self._server_started: asyncio.Future[None] = asyncio.Future() self._clients_connected: set[bytes] = set() From f7fcf5a55901af310c920d21b73b87a8bf4d83cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Berland?= Date: Thu, 23 Jan 2025 12:03:36 +0100 Subject: [PATCH 26/48] Remove tests for OMP_NUM_THREADS This test depends on a separate implementation of a flowrun executable, and an example of this executabe just changed implementation to always overwrite the environment variable OMP_NUM_THREADS in order to successfully control the behaviour of flow. --- .../ui_tests/cli/test_run_flow_simulator.py | 55 ------------------- 1 file changed, 55 deletions(-) diff --git a/tests/ert/ui_tests/cli/test_run_flow_simulator.py b/tests/ert/ui_tests/cli/test_run_flow_simulator.py index 13d173c3060..1ed8a41eac5 100644 --- a/tests/ert/ui_tests/cli/test_run_flow_simulator.py +++ b/tests/ert/ui_tests/cli/test_run_flow_simulator.py @@ -81,28 +81,6 @@ def test_user_can_specify_threads_and_mpi_processes_and_oversubscribe_compute_no assert re.search(r"Threads per MPI process:\s+2", flow_stdout) -@pytest.mark.usefixtures("eightcells") -@pytest.mark.skipif(not shutil.which("flowrun"), reason="flowrun not available") -def test_setenv_can_be_used_to_set_threads(): - Path("flow.ert").write_text( - dedent(""" - NUM_REALIZATIONS 1 - ECLBASE EIGHTCELLS - DATA_FILE EIGHTCELLS.DATA - RUNPATH realization- - SETENV OMP_NUM_THREADS 2 - NUM_CPU 1 - FORWARD_MODEL FLOW() - """).strip(), - encoding="utf-8", - ) - - run_cli(TEST_RUN_MODE, "--disable-monitoring", "flow.ert") - flow_stdout = Path("realization-0/FLOW.stdout.0").read_text(encoding="utf-8") - assert re.search(r"Number of MPI processes:\s+1", flow_stdout) - assert re.search(r"Threads per MPI process:\s+2", flow_stdout) - - @pytest.mark.usefixtures("eightcells") @pytest.mark.skipif(not shutil.which("flowrun"), reason="flowrun not available") def test_ert_will_fetch_parallel_keyword_and_set_mpi_processes(): @@ -128,39 +106,6 @@ def test_ert_will_fetch_parallel_keyword_and_set_mpi_processes(): assert re.search(r"Threads per MPI process:\s+1", flow_stdout) -@pytest.mark.usefixtures("eightcells") -@pytest.mark.skipif(not shutil.which("flowrun"), reason="flowrun not available") -@pytest.mark.parametrize("num_cpu", [1, 2]) -def test_flow_will_always_obey_omp_num_threads_also_when_mpi_is_active(num_cpu): - """This part of flow Ert cannot control, and this scenario should thus be - avoided. However, if the users use SETENV manually it will happen. - SETENV takes precedence over plugin env configuration so configuriation of - the FLOW forward model through plugins will not help either.""" - deck = Path("EIGHTCELLS.DATA").read_text(encoding="utf-8") - assert "PARALLEL" not in deck - Path("flow.ert").write_text( - dedent(f""" - NUM_REALIZATIONS 1 - ECLBASE EIGHTCELLS - NUM_CPU {num_cpu} - DATA_FILE EIGHTCELLS.DATA - SETENV OMP_NUM_THREADS 2 - RUNPATH realization- - FORWARD_MODEL FLOW() - """).strip(), - encoding="utf-8", - ) - - run_cli(TEST_RUN_MODE, "--disable-monitoring", "flow.ert") - flow_stdout = Path("realization-0/FLOW.stdout.0").read_text(encoding="utf-8") - assert ( - "Warning: Environment variable OMP_NUM_THREADS takes precedence over the --threads-per-process" - in flow_stdout - ) - assert re.search(rf"Number of MPI processes:\s+{num_cpu}", flow_stdout) - assert re.search(r"Threads per MPI process:\s+2", flow_stdout) - - @pytest.mark.usefixtures("eightcells") @pytest.mark.skipif(not shutil.which("flowrun"), reason="flowrun not available") def test_num_cpu_wins_over_parallel_in_deck(): From 516578b8d2249990fe44f082a83fd3989ecc8a54 Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Thu, 23 Jan 2025 12:54:39 +0100 Subject: [PATCH 27/48] Fix mac failing on main Due to integration-test not being a test type any more --- .github/workflows/build_and_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 33d4648463a..2ec00811955 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -90,7 +90,7 @@ jobs: strategy: fail-fast: false matrix: - test-type: [ 'test', 'integration-test', 'everest-models-test' ] + test-type: [ 'test', 'everest-models-test' ] os: [ 'macos-latest' ] python-version: [ '3.12' ] From 4c136dec4dc4c4e0b36dd76ecef7994cc44ad67d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Berland?= Date: Thu, 23 Jan 2025 12:16:51 +0100 Subject: [PATCH 28/48] Install correct dependency and adjust slurm config Dramatic speedup in test time (~10-fold) --- .github/workflows/test_ert_with_slurm.yml | 9 ++++++--- tests/ert/unit_tests/scheduler/test_slurm_driver.py | 6 +----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/.github/workflows/test_ert_with_slurm.yml b/.github/workflows/test_ert_with_slurm.yml index e90d430aaac..80041c70bad 100644 --- a/.github/workflows/test_ert_with_slurm.yml +++ b/.github/workflows/test_ert_with_slurm.yml @@ -34,7 +34,7 @@ jobs: run: | set -e - sudo apt install slurmd slurmctld -y + sudo apt install libpmix-dev slurmd slurmctld -y sudo mkdir /var/spool/slurm sudo chown slurm /var/spool/slurm @@ -43,9 +43,11 @@ jobs: ClusterName=localcluster SlurmUser=slurm SlurmctldHost=localhost + SchedulerType=sched/builtin # Avoid default backfill scheduler which adds delays SelectType=select/cons_tres # Select nodes based on consumable resources SelectTypeParameters=CR_Core # Cores are the consumable resource StateSaveLocation=/var/spool/slurm + PriorityType=priority/basic # Tests depend on FIFO scheduling ProctrackType=proctrack/linuxproc # Use /proc to track processes PartitionName=LocalQ Nodes=ALL Default=YES MaxTime=INFINITE State=UP PartitionName=AlternativeQ Nodes=ALL Default=YES MaxTime=INFINITE State=UP @@ -59,12 +61,13 @@ jobs: sudo mv slurm.conf /etc/slurm/ sudo systemctl start slurmd # The compute node slurm daemon sudo systemctl start slurmctld # The slurm controller daemon - + sleep 1 systemctl status slurmd systemctl status slurmctld # Show partition and node information configured: sinfo + scontrol show nodes - name: Verify slurm cluster works # Timeout is set low to catch a misconfigured cluster where srun will hang. @@ -77,7 +80,7 @@ jobs: run: | set -e export _ERT_TESTS_ALTERNATIVE_QUEUE=AlternativeQ - pytest tests/ert/unit_tests/scheduler/test_{generic,slurm}_driver.py --slurm \ + pytest tests/ert/unit_tests/scheduler/test_{generic,slurm}_driver.py -sv --slurm \ -n 8 --durations=10 -k "not (LsfDriver or LocalDriver or OpenPBSDriver)" scontrol show job diff --git a/tests/ert/unit_tests/scheduler/test_slurm_driver.py b/tests/ert/unit_tests/scheduler/test_slurm_driver.py index 0152608ca63..83a3cdbf7fe 100644 --- a/tests/ert/unit_tests/scheduler/test_slurm_driver.py +++ b/tests/ert/unit_tests/scheduler/test_slurm_driver.py @@ -373,11 +373,7 @@ async def test_kill_before_submit_is_finished( ): os.chdir(tmp_path) - if pytestconfig.getoption("slurm"): - # Allow more time when tested on a real compute cluster to avoid false positives. - job_kill_window = 5 - test_grace_time = 10 - elif sys.platform.startswith("darwin"): + if sys.platform.startswith("darwin"): # Mitigate flakiness on low-power test nodes job_kill_window = 5 test_grace_time = 10 From 7e179f6ffc1e27171ddcc75703c625113ac5d694 Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Thu, 23 Jan 2025 13:40:25 +0100 Subject: [PATCH 29/48] Combine running of unit and performance tests --- .github/workflows/build_and_test.yml | 4 ++-- .github/workflows/test_ert.yml | 9 ++------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 2ec00811955..1a0d944922f 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -33,7 +33,7 @@ jobs: strategy: fail-fast: false matrix: - test-type: [ 'performance-tests', 'unit-tests', 'gui-tests', 'cli-tests' ] + test-type: [ 'performance-and-unit-tests', 'gui-tests', 'cli-tests' ] python-version: [ '3.11', '3.12' ] os: [ ubuntu-latest ] uses: ./.github/workflows/test_ert.yml @@ -106,7 +106,7 @@ jobs: strategy: fail-fast: false matrix: - test-type: [ 'performance-tests', 'unit-tests', 'gui-tests', 'cli-tests' ] + test-type: [ 'performance-and-unit-tests', 'gui-tests', 'cli-tests' ] python-version: [ '3.12' ] os: [ 'macos-latest'] diff --git a/.github/workflows/test_ert.yml b/.github/workflows/test_ert.yml index 338b7899987..c38a0f520dc 100644 --- a/.github/workflows/test_ert.yml +++ b/.github/workflows/test_ert.yml @@ -59,16 +59,11 @@ jobs: pytest -m ${{ inputs.select-string }} --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -v --benchmark-disable --dist loadgroup tests/ert/ui_tests/cli --durations=25 - name: Unit Test - if: inputs.test-type == 'unit-tests' + if: inputs.test-type == 'performance-and-unit-tests' run: | - pytest -m ${{ inputs.select-string }} --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -n logical --show-capture=stderr -v --benchmark-disable --mpl --dist loadgroup tests/ert/unit_tests --durations=25 + pytest -m ${{ inputs.select-string }} --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -n logical --show-capture=stderr -v --benchmark-disable --mpl --dist loadgroup tests/ert/unit_tests tests/ert/performance_tests --durations=25 pytest --doctest-modules --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov2.xml src/ --ignore src/ert/dark_storage - - name: Performance Test - if: inputs.test-type == 'performance-tests' - run: | - pytest -m ${{ inputs.select-string }} --cov=ert --cov=everest --cov=_ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -o junit_family=legacy -n logical --show-capture=stderr -v --benchmark-disable --dist loadgroup tests/ert/performance_tests --durations=25 - - name: Upload coverage to Codecov id: codecov1 uses: codecov/codecov-action@v5 From 92ce748a130a7d4a621bd449c82ef4c2d9400584 Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Thu, 23 Jan 2025 14:51:41 +0100 Subject: [PATCH 30/48] Fix deprecated use of get_event_loop --- .../performance_tests/test_dark_storage_performance.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/ert/performance_tests/test_dark_storage_performance.py b/tests/ert/performance_tests/test_dark_storage_performance.py index 669c98d43bb..7890ea824e8 100644 --- a/tests/ert/performance_tests/test_dark_storage_performance.py +++ b/tests/ert/performance_tests/test_dark_storage_performance.py @@ -1,9 +1,9 @@ +import asyncio import contextlib import gc import io import os import time -from asyncio import get_event_loop from collections.abc import Awaitable from datetime import datetime, timedelta from typing import TypeVar @@ -45,7 +45,13 @@ def test_escape(s: str) -> str: def run_in_loop(coro: Awaitable[T]) -> T: - return get_event_loop().run_until_complete(coro) + try: + loop = asyncio.get_running_loop() + except RuntimeError: + loop = asyncio.new_event_loop() + + asyncio.set_event_loop(loop) + return loop.run_until_complete(coro) def get_single_record_csv(storage, ensemble_id1, keyword, poly_ran): From 993b3d82519626278dc133dec5d6889f9ff356b6 Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Thu, 23 Jan 2025 14:52:31 +0100 Subject: [PATCH 31/48] Remove unused async_utils.py --- src/_ert/async_utils.py | 54 ----------------------------------------- 1 file changed, 54 deletions(-) delete mode 100644 src/_ert/async_utils.py diff --git a/src/_ert/async_utils.py b/src/_ert/async_utils.py deleted file mode 100644 index efd49b958b8..00000000000 --- a/src/_ert/async_utils.py +++ /dev/null @@ -1,54 +0,0 @@ -from __future__ import annotations - -import asyncio -import logging -import traceback -from collections.abc import Coroutine, Generator -from contextlib import suppress -from typing import Any, TypeVar - -logger = logging.getLogger(__name__) - -_T = TypeVar("_T") -_T_co = TypeVar("_T_co", covariant=True) - - -def new_event_loop() -> asyncio.AbstractEventLoop: - loop = asyncio.new_event_loop() - loop.set_task_factory(_create_task) - return loop - - -def get_running_loop() -> asyncio.AbstractEventLoop: - try: - return asyncio.get_running_loop() - except RuntimeError: - loop = new_event_loop() - asyncio.set_event_loop(loop) - return loop - - -def _create_task( - loop: asyncio.AbstractEventLoop, - coro: Coroutine[Any, Any, _T] | Generator[Any, None, _T], -) -> asyncio.Task[_T]: - assert asyncio.iscoroutine(coro) - task = asyncio.Task(coro, loop=loop) - task.add_done_callback(_done_callback) - return task - - -def _done_callback(task: asyncio.Task[_T_co]) -> None: - assert task.done() - with suppress(asyncio.CancelledError): - if (exc := task.exception()) is None: - return - - exc_traceback = "".join( - traceback.format_exception(None, exc, exc.__traceback__) - ) - logger.error( - f"Exception in scheduler task {task.get_name()}: {exc}\n" - f"Traceback: {exc_traceback}" - ) - raise exc From 234fc9fec04af5f3e5d842fd0830db110f692390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Berland?= Date: Thu, 23 Jan 2025 15:42:50 +0100 Subject: [PATCH 32/48] Ensure SETENV is also substituted when writing json This is a regression from 1ae12f6efb66e9fa4208faef2a04898043cdcb37 --- src/ert/config/ert_config.py | 4 ++-- .../ert/unit_tests/config/test_ert_config.py | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/ert/config/ert_config.py b/src/ert/config/ert_config.py index 2153caa2502..1ce9b13d0a6 100644 --- a/src/ert/config/ert_config.py +++ b/src/ert/config/ert_config.py @@ -528,7 +528,7 @@ def from_dict(cls, config_dict) -> Self: env_vars = {} for key, val in config_dict.get("SETENV", []): - env_vars[key] = val + env_vars[key] = substitutions.substitute(val) return cls( substitutions=substitutions, @@ -753,7 +753,7 @@ def _create_list_of_forward_model_steps_to_run( env_vars = {} for key, val in config_dict.get("SETENV", []): - env_vars[key] = val + env_vars[key] = substitutions.substitute(val) for fm_step_description in config_dict.get(ConfigKeys.FORWARD_MODEL, []): if len(fm_step_description) > 1: diff --git a/tests/ert/unit_tests/config/test_ert_config.py b/tests/ert/unit_tests/config/test_ert_config.py index 1ddaffba18f..05dac456989 100644 --- a/tests/ert/unit_tests/config/test_ert_config.py +++ b/tests/ert/unit_tests/config/test_ert_config.py @@ -939,6 +939,29 @@ def test_fm_step_config_via_plugin_is_overridden_by_setenv(monkeypatch): assert step_json["jobList"][0]["environment"]["STEP_LOCAL_VAR"] == "com_from_plugin" +@pytest.mark.usefixtures("use_tmpdir") +def test_setenv_will_be_substituted_in_jobs_json(monkeypatch): + Path("config.ert").write_text( + dedent( + """ + NUM_REALIZATIONS 1 + SETENV FOO + NUM_CPU 2 + """ + ), + encoding="utf-8", + ) + ert_config = ErtConfig.with_plugins().from_file("config.ert") + step_json = create_forward_model_json( + context=ert_config.substitutions, + forward_model_steps=ert_config.forward_model_steps, + env_vars=ert_config.env_vars, + env_pr_fm_step=ert_config.env_pr_fm_step, + run_id=None, + ) + assert step_json["global_environment"]["FOO"] == "2" + + @pytest.mark.usefixtures("use_tmpdir") def test_fm_step_config_via_plugin_does_not_override_default_env(monkeypatch): monkeypatch.setattr( From 3abeea94e38d9472c6f74ca8fce8c53084e570d4 Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Fri, 24 Jan 2025 08:43:05 +0100 Subject: [PATCH 33/48] Fix get_priors test --- .../unit_tests/config/test_gen_kw_config.py | 46 ++++++------------- 1 file changed, 15 insertions(+), 31 deletions(-) diff --git a/tests/ert/unit_tests/config/test_gen_kw_config.py b/tests/ert/unit_tests/config/test_gen_kw_config.py index 7fade0d7dbd..f75989c43b7 100644 --- a/tests/ert/unit_tests/config/test_gen_kw_config.py +++ b/tests/ert/unit_tests/config/test_gen_kw_config.py @@ -57,41 +57,25 @@ def test_gen_kw_config_duplicate_keys_raises(): ) -@pytest.mark.usefixtures("use_tmpdir") def test_gen_kw_config_get_priors(): - parameter_file = "parameters.txt" - template_file = "template.txt" - - with open(template_file, "w", encoding="utf-8") as f: - f.write("Hello") - - with open(parameter_file, "w", encoding="utf-8") as f: - f.write("KEY1 NORMAL 0 1\n") - f.write("KEY2 LOGNORMAL 2 3\n") - f.write("KEY3 TRUNCATED_NORMAL 4 5 6 7\n") - f.write("KEY4 TRIANGULAR 0 1 2\n") - f.write("KEY5 UNIFORM 2 3\n") - f.write("KEY6 DUNIF 3 0 1\n") - f.write("KEY7 ERRF 0 1 2 3\n") - f.write("KEY8 DERRF 1 1 2 3 4\n") - f.write("KEY9 LOGUNIF 0 1\n") - f.write("KEY10 CONST 10\n") - - transform_function_definitions = [] - with open(parameter_file, encoding="utf-8") as file: - for item in file: - items = item.split() - transform_function_definitions.append( - TransformFunctionDefinition( - name=items[0], param_name=items[1], values=items[2:] - ) - ) - conf = GenKwConfig( name="KW_NAME", forward_init=False, - template_file=template_file, - transform_function_definitions=transform_function_definitions, + template_file="template.txt", + transform_function_definitions=[ + TransformFunctionDefinition("KEY1", "NORMAL", ["0", "1"]), + TransformFunctionDefinition("KEY2", "LOGNORMAL", ["2", "3"]), + TransformFunctionDefinition( + "KEY3", "TRUNCATED_NORMAL", ["4", "5", "6", "7"] + ), + TransformFunctionDefinition("KEY4", "TRIANGULAR", ["0", "1", "2"]), + TransformFunctionDefinition("KEY5", "UNIFORM", ["2", "3"]), + TransformFunctionDefinition("KEY6", "DUNIF", ["3", "0", "1"]), + TransformFunctionDefinition("KEY7", "ERRF", ["0", "1", "2", "3"]), + TransformFunctionDefinition("KEY8", "DERRF", ["1", "1", "2", "3", "4"]), + TransformFunctionDefinition("KEY9", "LOGUNIF", ["0", "1"]), + TransformFunctionDefinition("KEY10", "CONST", ["10"]), + ], output_file="param.txt", update=True, ) From 4c337a087cb8bb66e60ebe8de701d5cc028c362e Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Fri, 24 Jan 2025 09:01:27 +0100 Subject: [PATCH 34/48] Raise ConfigValidationError on short parameter file lines --- src/ert/config/gen_kw_config.py | 26 ++++++++++++++----- .../unit_tests/config/test_gen_kw_config.py | 14 ++++++++++ 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/ert/config/gen_kw_config.py b/src/ert/config/gen_kw_config.py index e7b9124d22c..a415026243e 100644 --- a/src/ert/config/gen_kw_config.py +++ b/src/ert/config/gen_kw_config.py @@ -156,22 +156,34 @@ def from_config_list(cls, gen_kw: list[str]) -> Self: "Loading GEN_KW from files requires %d in file format", gen_kw ) ) + if errors: raise ConfigValidationError.from_collected(errors) transform_function_definitions: list[TransformFunctionDefinition] = [] with open(parameter_file, encoding="utf-8") as file: - for item in file: + for line_number, item in enumerate(file): item = item.split("--")[0] # remove comments if item.strip(): # only lines with content items = item.split() - transform_function_definitions.append( - TransformFunctionDefinition( - name=items[0], - param_name=items[1], - values=items[2:], + if len(items) < 2: + errors.append( + ConfigValidationError.with_context( + f"Too few values on line {line_number} in parameter file {parameter_file}", + gen_kw, + ) ) - ) + else: + transform_function_definitions.append( + TransformFunctionDefinition( + name=items[0], + param_name=items[1], + values=items[2:], + ) + ) + + if errors: + raise ConfigValidationError.from_collected(errors) if gen_kw_key == "PRED" and update_parameter: ConfigWarning.warn( diff --git a/tests/ert/unit_tests/config/test_gen_kw_config.py b/tests/ert/unit_tests/config/test_gen_kw_config.py index f75989c43b7..f13fec0c43b 100644 --- a/tests/ert/unit_tests/config/test_gen_kw_config.py +++ b/tests/ert/unit_tests/config/test_gen_kw_config.py @@ -57,6 +57,20 @@ def test_gen_kw_config_duplicate_keys_raises(): ) +def test_short_definition_raises_config_error(tmp_path): + parameter_file = tmp_path / "parameter.txt" + parameter_file.write_text("incorrect", encoding="utf-8") + + with pytest.raises(ConfigValidationError, match="Too few values"): + GenKwConfig.from_config_list( + [ + "GEN", + str(parameter_file), + "INIT_FILES:%dgen_init.txt", + ] + ) + + def test_gen_kw_config_get_priors(): conf = GenKwConfig( name="KW_NAME", From 1d199a0b4c541751ea0d3e057236c52267583127 Mon Sep 17 00:00:00 2001 From: xjules Date: Wed, 22 Jan 2025 10:15:21 +0100 Subject: [PATCH 35/48] Make design_matrix parameter_configuration a single GenKw element The dictionary introduced in parameter configuration in design matrix config seems to be not necessary and thus removing it. The type will those become GenKwConfig directly. --- src/ert/config/design_matrix.py | 21 +++++++------------ .../test_design_matrix.py | 4 ++-- tests/ert/unit_tests/test_libres_facade.py | 2 +- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/ert/config/design_matrix.py b/src/ert/config/design_matrix.py index 4d38933c2a6..1ecd5995bd8 100644 --- a/src/ert/config/design_matrix.py +++ b/src/ert/config/design_matrix.py @@ -100,19 +100,15 @@ def merge_with_other(self, dm_other: DesignMatrix) -> None: except ValueError as exc: errors.append(ErrorInfo(f"Error when merging design matrices {exc}!")) - pc_other = dm_other.parameter_configuration[DESIGN_MATRIX_GROUP] - pc_self = self.parameter_configuration[DESIGN_MATRIX_GROUP] - assert isinstance(pc_other, GenKwConfig) - assert isinstance(pc_self, GenKwConfig) - for tfd in pc_other.transform_function_definitions: - pc_self.transform_function_definitions.append(tfd) + for tfd in dm_other.parameter_configuration.transform_function_definitions: + self.parameter_configuration.transform_function_definitions.append(tfd) if errors: raise ConfigValidationError.from_collected(errors) def merge_with_existing_parameters( self, existing_parameters: list[ParameterConfig] - ) -> tuple[list[ParameterConfig], ParameterConfig | None]: + ) -> tuple[list[ParameterConfig], GenKwConfig]: """ This method merges the design matrix parameters with the existing parameters and returns the new list of existing parameters, wherein we drop GEN_KW group having a full overlap with the design matrix group. @@ -131,10 +127,8 @@ def merge_with_existing_parameters( new_param_config: list[ParameterConfig] = [] - design_parameter_group = self.parameter_configuration[DESIGN_MATRIX_GROUP] - design_keys = [] - if isinstance(design_parameter_group, GenKwConfig): - design_keys = [e.name for e in design_parameter_group.transform_functions] + design_parameter_group = self.parameter_configuration + design_keys = [e.name for e in design_parameter_group.transform_functions] design_group_added = False for parameter_group in existing_parameters: @@ -163,7 +157,7 @@ def merge_with_existing_parameters( def read_design_matrix( self, - ) -> tuple[list[bool], pd.DataFrame, dict[str, ParameterConfig]]: + ) -> tuple[list[bool], pd.DataFrame, GenKwConfig]: # Read the parameter names (first row) as strings to prevent pandas from modifying them. # This ensures that duplicate or empty column names are preserved exactly as they appear in the Excel sheet. # By doing this, we can properly validate variable names, including detecting duplicates or missing names. @@ -204,7 +198,6 @@ def read_design_matrix( ) design_matrix_df = design_matrix_df.assign(**defaults_to_use) - parameter_configuration: dict[str, ParameterConfig] = {} transform_function_definitions: list[TransformFunctionDefinition] = [] for parameter in design_matrix_df.columns: transform_function_definitions.append( @@ -214,7 +207,7 @@ def read_design_matrix( values=[], ) ) - parameter_configuration[DESIGN_MATRIX_GROUP] = GenKwConfig( + parameter_configuration = GenKwConfig( name=DESIGN_MATRIX_GROUP, forward_init=False, template_file=None, diff --git a/tests/ert/unit_tests/sensitivity_analysis/test_design_matrix.py b/tests/ert/unit_tests/sensitivity_analysis/test_design_matrix.py index 35408875d47..9e9ab76344d 100644 --- a/tests/ert/unit_tests/sensitivity_analysis/test_design_matrix.py +++ b/tests/ert/unit_tests/sensitivity_analysis/test_design_matrix.py @@ -77,7 +77,7 @@ def test_merge_multiple_occurrences( design_matrix_1.merge_with_other(design_matrix_2) else: design_matrix_1.merge_with_other(design_matrix_2) - design_params = design_matrix_1.parameter_configuration.get("DESIGN_MATRIX", []) + design_params = design_matrix_1.parameter_configuration assert all(param in design_params for param in ("a", "b", "c", "d")) assert design_matrix_1.active_realizations == [True, True, True] df = design_matrix_1.design_matrix_df @@ -181,7 +181,7 @@ def test_reading_design_matrix(tmp_path): xl_write, index=False, sheet_name="DefaultValues", header=False ) design_matrix = DesignMatrix(design_path, "DesignSheet01", "DefaultValues") - design_params = design_matrix.parameter_configuration.get(DESIGN_MATRIX_GROUP, []) + design_params = design_matrix.parameter_configuration assert all(param in design_params for param in ("a", "b", "c", "one", "d")) assert design_matrix.active_realizations == [True, True, False, False, True] diff --git a/tests/ert/unit_tests/test_libres_facade.py b/tests/ert/unit_tests/test_libres_facade.py index a446646d6b3..14d1ab01ee0 100644 --- a/tests/ert/unit_tests/test_libres_facade.py +++ b/tests/ert/unit_tests/test_libres_facade.py @@ -284,7 +284,7 @@ def test_save_parameters_to_storage_from_design_dataframe( design_matrix = DesignMatrix(design_path, "DesignSheet01", "DefaultValues") with open_storage(tmp_path / "storage", mode="w") as storage: experiment_id = storage.create_experiment( - parameters=[design_matrix.parameter_configuration[DESIGN_MATRIX_GROUP]] + parameters=[design_matrix.parameter_configuration] ) ensemble = storage.create_ensemble( experiment_id, name="default", ensemble_size=ensemble_size From 785eb69f69237be1ba60a22e5f6a0d2a72499484 Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Fri, 24 Jan 2025 10:01:50 +0100 Subject: [PATCH 36/48] zmq: Speed up tests using MockZMQServer --- .../unit_tests/ensemble_evaluator/test_ensemble_client.py | 4 ++-- .../unit_tests/forward_model_runner/test_event_reporter.py | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py index d09f89099eb..f7a3a402dab 100644 --- a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py +++ b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py @@ -55,7 +55,7 @@ async def test_retry(unused_tcp_port): async def test_reconnect_when_missing_heartbeat(unused_tcp_port, monkeypatch): host = "localhost" url = f"tcp://{host}:{unused_tcp_port}" - monkeypatch.setattr(_ert.forward_model_runner.client, "HEARTBEAT_TIMEOUT", 0.1) + monkeypatch.setattr(_ert.forward_model_runner.client, "HEARTBEAT_TIMEOUT", 0.01) async with ( MockZMQServer(unused_tcp_port, signal=3) as mock_server, @@ -64,7 +64,7 @@ async def test_reconnect_when_missing_heartbeat(unused_tcp_port, monkeypatch): await client.send("start", retries=1) await mock_server.do_heartbeat() - await asyncio.sleep(1) + await asyncio.sleep(0.1) await mock_server.do_heartbeat() await client.send("stop", retries=1) diff --git a/tests/ert/unit_tests/forward_model_runner/test_event_reporter.py b/tests/ert/unit_tests/forward_model_runner/test_event_reporter.py index 02c49c96dba..394c8d93493 100644 --- a/tests/ert/unit_tests/forward_model_runner/test_event_reporter.py +++ b/tests/ert/unit_tests/forward_model_runner/test_event_reporter.py @@ -179,7 +179,6 @@ def test_report_inconsistent_events(unused_tcp_port): reporter.report(Finish()) -@pytest.mark.integration_test def test_report_with_failed_reporter_but_finished_jobs(unused_tcp_port): # this is to show when the reporter fails ert won't crash nor # staying hanging but instead finishes up the job; @@ -192,7 +191,10 @@ def test_report_with_failed_reporter_but_finished_jobs(unused_tcp_port): url = f"tcp://{host}:{unused_tcp_port}" with MockZMQServer(unused_tcp_port) as mock_server: reporter = Event( - evaluator_url=url, ack_timeout=2, max_retries=0, finished_event_timeout=2 + evaluator_url=url, + ack_timeout=0.1, + max_retries=0, + finished_event_timeout=0.1, ) fmstep1 = ForwardModelStep( {"name": "fmstep1", "stdout": "stdout", "stderr": "stderr"}, 0 From 920efa87b17031fc3f48f592800b9b0634d7747c Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Fri, 24 Jan 2025 10:08:45 +0100 Subject: [PATCH 37/48] zmq: Add integration_test marker to slow tests --- .../ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py | 1 + tests/ert/unit_tests/gui/simulation/test_run_dialog.py | 1 + tests/ert/unit_tests/gui/simulation/view/test_realization.py | 1 + 3 files changed, 3 insertions(+) diff --git a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py index eaa5eb5caca..d22bbdf12ad 100644 --- a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py +++ b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py @@ -129,6 +129,7 @@ async def mock_done_prematurely(message, *args, **kwargs): await evaluator.run_and_get_successful_realizations() +@pytest.mark.integration_test async def test_new_connections_are_no_problem_when_evaluator_is_closing_down( evaluator_to_use, ): diff --git a/tests/ert/unit_tests/gui/simulation/test_run_dialog.py b/tests/ert/unit_tests/gui/simulation/test_run_dialog.py index 39f8d629e6d..a0efbae646d 100644 --- a/tests/ert/unit_tests/gui/simulation/test_run_dialog.py +++ b/tests/ert/unit_tests/gui/simulation/test_run_dialog.py @@ -111,6 +111,7 @@ def test_run_dialog_polls_run_model_for_runtime( qtbot.waitUntil(lambda: run_dialog.is_simulation_done() == True) +@pytest.mark.integration_test def test_large_snapshot( large_snapshot, qtbot: QtBot, diff --git a/tests/ert/unit_tests/gui/simulation/view/test_realization.py b/tests/ert/unit_tests/gui/simulation/view/test_realization.py index 4de9ecab378..17126e6fca4 100644 --- a/tests/ert/unit_tests/gui/simulation/view/test_realization.py +++ b/tests/ert/unit_tests/gui/simulation/view/test_realization.py @@ -80,6 +80,7 @@ def test_delegate_drawing_count(small_snapshot, qtbot): ) +@pytest.mark.integration_test def test_selection_success(large_snapshot, qtbot): it = 0 widget = RealizationWidget(it) From 54e644427d4d0bbbafc415092f57214f61c9a567 Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Fri, 24 Jan 2025 10:15:31 +0100 Subject: [PATCH 38/48] zmq: Speed up test_invalid_server --- .../unit_tests/ensemble_evaluator/test_ensemble_client.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py index f7a3a402dab..20bda2f3198 100644 --- a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py +++ b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py @@ -7,14 +7,15 @@ from tests.ert.utils import MockZMQServer -@pytest.mark.integration_test -async def test_invalid_server(): +async def test_invalid_server(monkeypatch): port = 7777 host = "localhost" url = f"tcp://{host}:{port}" + monkeypatch.setattr(Client, "DEFAULT_MAX_RETRIES", 0) + with pytest.raises(ClientConnectionError): - async with Client(url, ack_timeout=1.0): + async with Client(url, ack_timeout=0.01): pass From b7795d95c6fadf2546381376aefc3c7eb05dff04 Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Fri, 24 Jan 2025 10:36:46 +0100 Subject: [PATCH 39/48] Speed up test_default_installed_jobs --- tests/everest/test_res_initialization.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/tests/everest/test_res_initialization.py b/tests/everest/test_res_initialization.py index 56f1dacf614..33eec7c3b6b 100644 --- a/tests/everest/test_res_initialization.py +++ b/tests/everest/test_res_initialization.py @@ -124,9 +124,8 @@ def test_everest_to_ert_controls(): ) -@pytest.mark.parametrize( - "name", - [ +def test_default_installed_jobs(): + jobs = [ "render", "recovery_factor", "wdreorder", @@ -140,22 +139,18 @@ def test_everest_to_ert_controls(): "copy_file", "move_file", "symlink", - ], -) -def test_default_installed_jobs(tmp_path, monkeypatch, name): - monkeypatch.chdir(tmp_path) + ] ever_config_dict = EverestConfig.with_defaults( **yaml.safe_load( dedent(f""" model: {{"realizations": [0]}} - forward_model: - - {name} + forward_model: {jobs} """) ) ) config = everest_to_ert_config(ever_config_dict) # Index 0 is the copy job for wells.json - assert config.forward_model_steps[1].name == name + assert [c.name for c in config.forward_model_steps[1:]] == jobs def test_combined_wells_everest_to_ert(tmp_path, monkeypatch): From 7914ce3e155a0b893d274f2f3bbcb86a8f8b79cf Mon Sep 17 00:00:00 2001 From: Eivind Jahren Date: Fri, 24 Jan 2025 10:45:45 +0100 Subject: [PATCH 40/48] Speed up lsf driver tests --- tests/ert/unit_tests/scheduler/test_lsf_driver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/ert/unit_tests/scheduler/test_lsf_driver.py b/tests/ert/unit_tests/scheduler/test_lsf_driver.py index ce5ba233011..900631b1a8a 100644 --- a/tests/ert/unit_tests/scheduler/test_lsf_driver.py +++ b/tests/ert/unit_tests/scheduler/test_lsf_driver.py @@ -581,7 +581,7 @@ async def test_that_bsub_will_retry_and_fail( bsub_path.chmod(bsub_path.stat().st_mode | stat.S_IEXEC) driver = LsfDriver() driver._max_bsub_attempts = 2 - driver._sleep_time_between_cmd_retries = 0.2 + driver._sleep_time_between_cmd_retries = 0.0 match_str = ( f"failed after 2 attempts with exit code {exit_code}.*" f'error: "{error_msg if error_msg else ""}"' @@ -666,7 +666,7 @@ async def test_that_bsub_will_retry_and_succeed( bsub_path.chmod(bsub_path.stat().st_mode | stat.S_IEXEC) driver = LsfDriver() driver._max_bsub_attempts = 2 - driver._sleep_time_between_cmd_retries = 0.2 + driver._sleep_time_between_cmd_retries = 0.0 await driver.submit(0, "sleep 10") From 421971c1603e23bf6fab4a32f7b53515e0493e50 Mon Sep 17 00:00:00 2001 From: larsevj Date: Fri, 24 Jan 2025 10:08:46 +0100 Subject: [PATCH 41/48] Fix everest tests failing when using editable installs --- src/everest/bin/main.py | 5 ++++- src/everest/util/__init__.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/everest/bin/main.py b/src/everest/bin/main.py index 438c22a6604..df063e48776 100644 --- a/src/everest/bin/main.py +++ b/src/everest/bin/main.py @@ -3,7 +3,10 @@ import logging import sys -from ert.shared.version import __version__ as everest_version +try: + from ert.shared.version import __version__ as everest_version +except ImportError: + everest_version = "0.0.0" from everest.bin.config_branch_script import config_branch_entry from everest.bin.everconfigdump_script import config_dump_entry from everest.bin.everest_script import everest_entry diff --git a/src/everest/util/__init__.py b/src/everest/util/__init__.py index d1c32bbb51b..29f5d69cd2f 100644 --- a/src/everest/util/__init__.py +++ b/src/everest/util/__init__.py @@ -4,7 +4,10 @@ from ropt.version import version as ropt_version -from ert.shared.version import version as ert_version +try: + from ert.shared.version import version as ert_version +except ImportError: + ert_version = "0.0.0" from everest.strings import DATE_FORMAT, EVEREST try: From 9e44c8aa2073e0cceb21dc9e9e5ce8e53f38d660 Mon Sep 17 00:00:00 2001 From: Julius Parulek Date: Mon, 30 Dec 2024 13:59:11 +0100 Subject: [PATCH 42/48] zmq: add test that monitor can't connect to a secured server A simple test that provides either wrong or good server key. --- .../ensemble_evaluator/test_monitor.py | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/tests/ert/unit_tests/ensemble_evaluator/test_monitor.py b/tests/ert/unit_tests/ensemble_evaluator/test_monitor.py index 2adc385f3e1..1ee90c03743 100644 --- a/tests/ert/unit_tests/ensemble_evaluator/test_monitor.py +++ b/tests/ert/unit_tests/ensemble_evaluator/test_monitor.py @@ -1,5 +1,6 @@ import asyncio import logging +from contextlib import suppress import pytest import zmq @@ -16,9 +17,13 @@ from ert.ensemble_evaluator.config import EvaluatorConnectionInfo -async def async_zmq_server(port, handler): +async def async_zmq_server(port, handler, secret_key: bytes | None = None): zmq_context = zmq.asyncio.Context() router_socket = zmq_context.socket(zmq.ROUTER) + if secret_key is not None: + router_socket.curve_secretkey = secret_key + router_socket.curve_publickey = zmq.curve_public(secret_key) + router_socket.curve_server = True router_socket.setsockopt(zmq.LINGER, 0) router_socket.bind(f"tcp://*:{port}") await handler(router_socket) @@ -123,6 +128,55 @@ async def mock_event_handler(router_socket): await websocket_server_task +@pytest.mark.parametrize( + "correct_server_key", + [ + pytest.param(True), + pytest.param(False), + ], +) +async def test_that_monitor_cannot_connect_with_wrong_server_key( + correct_server_key, monkeypatch, unused_tcp_port +): + public_key, secret_key = zmq.curve_keypair() + ee_con_info = EvaluatorConnectionInfo( + f"tcp://127.0.0.1:{unused_tcp_port}", + public_key.decode("utf-8") if correct_server_key else None, + ) + + monkeypatch.setattr(Monitor, "DEFAULT_MAX_RETRIES", 0) + monkeypatch.setattr(Monitor, "DEFAULT_ACK_TIMEOUT", 0.5) + + connected = False + + async def mock_event_handler(router_socket): + nonlocal connected + while True: + dealer, _, frame = await router_socket.recv_multipart() + await router_socket.send_multipart([dealer, b"", ACK_MSG]) + if frame == CONNECT_MSG: + connected = True + elif frame == DISCONNECT_MSG: + connected = False + return + + websocket_server_task = asyncio.create_task( + async_zmq_server(unused_tcp_port, mock_event_handler, secret_key=secret_key) + ) + if correct_server_key: + async with Monitor(ee_con_info): + assert connected + assert connected is False + else: + with pytest.raises(ClientConnectionError): + async with Monitor(ee_con_info): + pass + assert connected is False + websocket_server_task.cancel() + with suppress(asyncio.CancelledError): + await websocket_server_task + + async def test_that_monitor_track_can_exit_without_terminated_event_from_evaluator( unused_tcp_port, caplog ): From 625b256b830578c5d2fe939e8d4faf1678095ea6 Mon Sep 17 00:00:00 2001 From: larsevj Date: Fri, 24 Jan 2025 13:01:05 +0100 Subject: [PATCH 43/48] Use tmp_path for test_everest_to_ert_controls --- tests/everest/test_res_initialization.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/everest/test_res_initialization.py b/tests/everest/test_res_initialization.py index 33eec7c3b6b..b894ea00e2b 100644 --- a/tests/everest/test_res_initialization.py +++ b/tests/everest/test_res_initialization.py @@ -102,7 +102,8 @@ def test_everest_to_ert_queue_config(config, config_class): assert ert_config.queue_config.queue_options == config_class(**config) -def test_everest_to_ert_controls(): +def test_everest_to_ert_controls(tmp_path, monkeypatch): + monkeypatch.chdir(tmp_path) ever_config = EverestConfig.with_defaults( **yaml.safe_load( dedent(""" From 4a2e5e3866ed13625379fb61a2be070f0953e79b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Berland?= Date: Fri, 24 Jan 2025 14:00:35 +0100 Subject: [PATCH 44/48] Ensure cpu_seconds is always reported increasingly The summation of cpu_seconds for a process and all its descendants can never work properly during teardown of a process tree, as the root process typically outlives its children. Thus, the maximum observed cpu_seconds for a process tree is always the best estimate of the correct sum. --- src/_ert/forward_model_runner/forward_model_step.py | 4 +++- .../forward_model_runner/test_forward_model_step.py | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/_ert/forward_model_runner/forward_model_step.py b/src/_ert/forward_model_runner/forward_model_step.py index b9350ce1b00..0757be89003 100644 --- a/src/_ert/forward_model_runner/forward_model_step.py +++ b/src/_ert/forward_model_runner/forward_model_step.py @@ -186,9 +186,11 @@ def _run(self) -> Generator[Start | Exited | Running | None]: exit_code = None max_memory_usage = 0 + max_cpu_seconds = 0 fm_step_pids = {int(process.pid)} while exit_code is None: (memory_rss, cpu_seconds, oom_score, pids) = _get_processtree_data(process) + max_cpu_seconds = max(max_cpu_seconds, cpu_seconds or 0) fm_step_pids |= pids max_memory_usage = max(memory_rss, max_memory_usage) yield Running( @@ -198,7 +200,7 @@ def _run(self) -> Generator[Start | Exited | Running | None]: max_rss=max_memory_usage, fm_step_id=self.index, fm_step_name=self.job_data.get("name"), - cpu_seconds=cpu_seconds, + cpu_seconds=max_cpu_seconds, oom_score=oom_score, ), ) diff --git a/tests/ert/unit_tests/forward_model_runner/test_forward_model_step.py b/tests/ert/unit_tests/forward_model_runner/test_forward_model_step.py index 6e624a91234..5a6413c93c5 100644 --- a/tests/ert/unit_tests/forward_model_runner/test_forward_model_step.py +++ b/tests/ert/unit_tests/forward_model_runner/test_forward_model_step.py @@ -28,6 +28,10 @@ def test_run_with_process_failing(mock_process, mock_popen, mock_check_executabl ) mock_process.return_value.wait.return_value = 9 + mock_cpu_times = MagicMock() + mock_cpu_times.user = 0.0 + mock_process.return_value.cpu_times.return_value = mock_cpu_times + run = fmstep.run() assert isinstance(next(run), Start), "run did not yield Start message" From dce4e05769e9c0aa82b5ddcf1033ef82d6e60320 Mon Sep 17 00:00:00 2001 From: xjules Date: Fri, 24 Jan 2025 14:11:49 +0100 Subject: [PATCH 45/48] zmq: make sure client disconnects before moczmqserver closes This also makes sure that there are no lingering events when closing zmq server socket. --- .../ensemble_evaluator/test_ensemble_client.py | 18 ++++++++---------- tests/ert/utils.py | 1 + 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py index 20bda2f3198..a7923d109e4 100644 --- a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py +++ b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py @@ -56,18 +56,16 @@ async def test_retry(unused_tcp_port): async def test_reconnect_when_missing_heartbeat(unused_tcp_port, monkeypatch): host = "localhost" url = f"tcp://{host}:{unused_tcp_port}" - monkeypatch.setattr(_ert.forward_model_runner.client, "HEARTBEAT_TIMEOUT", 0.01) - async with ( - MockZMQServer(unused_tcp_port, signal=3) as mock_server, - Client(url) as client, - ): - await client.send("start", retries=1) + async with MockZMQServer(unused_tcp_port, signal=3) as mock_server: + monkeypatch.setattr(_ert.forward_model_runner.client, "HEARTBEAT_TIMEOUT", 0.01) + async with Client(url) as client: + await client.send("start", retries=1) - await mock_server.do_heartbeat() - await asyncio.sleep(0.1) - await mock_server.do_heartbeat() - await client.send("stop", retries=1) + await mock_server.do_heartbeat() + await asyncio.sleep(0.1) + await mock_server.do_heartbeat() + await client.send("stop", retries=1) # when reconnection happens CONNECT message is sent again assert mock_server.messages.count("CONNECT") == 2 diff --git a/tests/ert/utils.py b/tests/ert/utils.py index 4f5bbdbbc55..7bdf868c1d6 100644 --- a/tests/ert/utils.py +++ b/tests/ert/utils.py @@ -111,6 +111,7 @@ async def __aexit__(self, exc_type, exc_value, traceback): async def mock_zmq_server(self): zmq_context = zmq.asyncio.Context() self.router_socket = zmq_context.socket(zmq.ROUTER) + self.router_socket.setsockopt(zmq.LINGER, 0) self.router_socket.bind(f"tcp://*:{self.port}") self.handler_task = asyncio.create_task(self._handler()) From b01c86871acf27e1dc19360fafe5461c12bc4b47 Mon Sep 17 00:00:00 2001 From: Julius Parulek Date: Fri, 24 Jan 2025 23:39:57 +0100 Subject: [PATCH 46/48] Add no_dealers Event to mockzmqserver --- .../test_ensemble_client.py | 3 +++ tests/ert/utils.py | 19 +++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py index a7923d109e4..89c138bdae3 100644 --- a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py +++ b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_client.py @@ -67,6 +67,9 @@ async def test_reconnect_when_missing_heartbeat(unused_tcp_port, monkeypatch): await mock_server.do_heartbeat() await client.send("stop", retries=1) + # the client should be disconnected + assert len(mock_server.dealers) == 0 + # when reconnection happens CONNECT message is sent again assert mock_server.messages.count("CONNECT") == 2 assert mock_server.messages.count("DISCONNECT") == 1 diff --git a/tests/ert/utils.py b/tests/ert/utils.py index 7bdf868c1d6..2138adcd64d 100644 --- a/tests/ert/utils.py +++ b/tests/ert/utils.py @@ -81,6 +81,8 @@ def __init__(self, port, signal=0): self.server_task = None self.handler_task = None self.dealers = set() + self.no_dealers = asyncio.Event() + self.no_dealers.set() def start_event_loop(self): asyncio.set_event_loop(self.loop) @@ -104,6 +106,8 @@ async def __aenter__(self): async def __aexit__(self, exc_type, exc_value, traceback): if not self.server_task.done(): + with contextlib.suppress(asyncio.TimeoutError): + await asyncio.wait_for(self.no_dealers.wait(), timeout=2.0) self.server_task.cancel() with contextlib.suppress(asyncio.CancelledError): await self.server_task @@ -132,18 +136,21 @@ async def _handler(self): while True: try: dealer, __, frame = await self.router_socket.recv_multipart() + if ( + self.value in {0, 2} and frame not in {CONNECT_MSG, DISCONNECT_MSG} + ) or self.value == 3: + self.messages.append(frame.decode("utf-8")) if frame == CONNECT_MSG: - await self.router_socket.send_multipart([dealer, b"", ACK_MSG]) self.dealers.add(dealer) - elif frame == DISCONNECT_MSG: + self.no_dealers.clear() await self.router_socket.send_multipart([dealer, b"", ACK_MSG]) + elif frame == DISCONNECT_MSG: self.dealers.discard(dealer) + if not self.dealers: + self.no_dealers.set() + await self.router_socket.send_multipart([dealer, b"", ACK_MSG]) elif self.value in {0, 3}: await self.router_socket.send_multipart([dealer, b"", ACK_MSG]) - if ( - self.value in {0, 2} and frame not in {CONNECT_MSG, DISCONNECT_MSG} - ) or self.value == 3: - self.messages.append(frame.decode("utf-8")) except asyncio.CancelledError: break From ed7ce1abb868362be769b1614ec53811b10de7da Mon Sep 17 00:00:00 2001 From: Jon Holba Date: Tue, 28 Jan 2025 12:44:11 +0100 Subject: [PATCH 47/48] Change port range of dark storage There is an issue where dark storage would try to use the same port as ensemble evaluator. Switching the port range for dark storage should fix this problem until we can fix the bug. --- src/ert/services/_storage_main.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ert/services/_storage_main.py b/src/ert/services/_storage_main.py index 68bde57bc87..43c89b5cf9d 100644 --- a/src/ert/services/_storage_main.py +++ b/src/ert/services/_storage_main.py @@ -106,7 +106,9 @@ def run_server( config_args.update(reload=True, reload_dirs=[os.path.dirname(ert_shared_path)]) os.environ["ERT_STORAGE_DEBUG"] = "1" - sock = find_available_socket(custom_host=args.host) + sock = find_available_socket( + custom_host=args.host, custom_range=range(51850, 51870) + ) connection_info = _create_connection_info(sock, authtoken) # Appropriated from uvicorn.main:run From ad04429a46b7ea08822bb093f7021eb71453614e Mon Sep 17 00:00:00 2001 From: xjules Date: Mon, 27 Jan 2025 12:52:43 +0100 Subject: [PATCH 48/48] zmq: await server started first then create all evaluator tasks Additionally, _server_started can be removed from the tasks. The commits also adds a test for zmq start up failure when port already in use --- src/ert/ensemble_evaluator/evaluator.py | 16 +++++----------- .../test_ensemble_evaluator.py | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/ert/ensemble_evaluator/evaluator.py b/src/ert/ensemble_evaluator/evaluator.py index 873cebe0f2f..b9ea3bfaa78 100644 --- a/src/ert/ensemble_evaluator/evaluator.py +++ b/src/ert/ensemble_evaluator/evaluator.py @@ -84,7 +84,6 @@ def __init__(self, ensemble: Ensemble, config: EvaluatorServerConfig): self._dispatchers_empty.set() async def _do_heartbeat_clients(self) -> None: - await self._server_started while True: if self._clients_connected: await self._events_to_send.put(HeartbeatEvent.event) @@ -93,7 +92,6 @@ async def _do_heartbeat_clients(self) -> None: await asyncio.sleep(0.1) async def _publisher(self) -> None: - await self._server_started while True: event = await self._events_to_send.get() for identity in self._clients_connected: @@ -270,7 +268,6 @@ async def handle_dispatch(self, dealer: bytes, frame: bytes) -> None: await self._events.put(event) async def listen_for_messages(self) -> None: - await self._server_started while True: try: dealer, _, frame = await self._router_socket.recv_multipart() @@ -368,8 +365,9 @@ async def _signal_cancel(self) -> None: async def _start_running(self) -> None: if not self._config: raise ValueError("no config for evaluator") - self._ee_tasks = [ - asyncio.create_task(self._server(), name="server_task"), + self._ee_tasks = [asyncio.create_task(self._server(), name="server_task")] + await self._server_started + self._ee_tasks += [ asyncio.create_task(self._do_heartbeat_clients(), name="heartbeat_task"), asyncio.create_task( self._batch_events_into_buffer(), name="dispatcher_task" @@ -377,17 +375,13 @@ async def _start_running(self) -> None: asyncio.create_task(self._process_event_buffer(), name="processing_task"), asyncio.create_task(self._publisher(), name="publisher_task"), asyncio.create_task(self.listen_for_messages(), name="listener_task"), - ] - - await self._server_started - self._ee_tasks.append( asyncio.create_task( self._ensemble.evaluate( self._config, self._events, self._manifest_queue ), name="ensemble_task", - ) - ) + ), + ] CLOSE_SERVER_TIMEOUT = 60 diff --git a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py index d22bbdf12ad..17edb28fd69 100644 --- a/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py +++ b/tests/ert/unit_tests/ensemble_evaluator/test_ensemble_evaluator.py @@ -5,6 +5,7 @@ from unittest.mock import patch import pytest +import zmq.asyncio from hypothesis import given from hypothesis import strategies as st from pydantic import ValidationError @@ -97,6 +98,19 @@ async def test_evaluator_handles_dispatchers_connected( assert evaluator._dispatchers_empty.is_set() +async def test_evaluator_raises_on_start_with_address_in_use(make_ee_config): + ee_config = make_ee_config(use_ipc_protocol=False) + ctx = zmq.asyncio.Context() + socket = ctx.socket(zmq.ROUTER) + try: + socket.bind(f"tcp://*:{ee_config.router_port}") + evaluator = EnsembleEvaluator(TestEnsemble(0, 2, 2, id_="0"), ee_config) + with pytest.raises(zmq.error.ZMQError, match="Address already in use"): + await evaluator.run_and_get_successful_realizations() + finally: + ctx.destroy() + + async def test_no_config_raises_valueerror_when_running(): evaluator = EnsembleEvaluator(TestEnsemble(0, 2, 2, id_="0"), None) with pytest.raises(ValueError, match="no config for evaluator"):