ert 17.1.9__py3-none-any.whl → 18.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. _ert/events.py +19 -2
  2. ert/__main__.py +8 -7
  3. ert/analysis/_update_commons.py +12 -3
  4. ert/cli/main.py +6 -3
  5. ert/cli/monitor.py +7 -0
  6. ert/config/__init__.py +13 -3
  7. ert/config/_create_observation_dataframes.py +60 -12
  8. ert/config/_observations.py +14 -1
  9. ert/config/_read_summary.py +8 -6
  10. ert/config/ensemble_config.py +6 -14
  11. ert/config/ert_config.py +19 -13
  12. ert/config/{everest_objective_config.py → everest_response.py} +23 -12
  13. ert/config/ext_param_config.py +133 -1
  14. ert/config/field.py +12 -8
  15. ert/config/forward_model_step.py +108 -6
  16. ert/config/gen_data_config.py +2 -6
  17. ert/config/gen_kw_config.py +0 -9
  18. ert/config/known_response_types.py +14 -0
  19. ert/config/parameter_config.py +0 -17
  20. ert/config/parsing/config_keywords.py +1 -0
  21. ert/config/parsing/config_schema.py +12 -0
  22. ert/config/parsing/config_schema_deprecations.py +11 -0
  23. ert/config/parsing/config_schema_item.py +1 -1
  24. ert/config/queue_config.py +4 -4
  25. ert/config/response_config.py +0 -7
  26. ert/config/rft_config.py +230 -0
  27. ert/config/summary_config.py +2 -6
  28. ert/config/violations.py +0 -0
  29. ert/config/workflow_fixtures.py +2 -1
  30. ert/dark_storage/client/__init__.py +2 -2
  31. ert/dark_storage/client/_session.py +4 -4
  32. ert/dark_storage/client/client.py +2 -2
  33. ert/dark_storage/compute/misfits.py +7 -6
  34. ert/dark_storage/endpoints/compute/misfits.py +2 -2
  35. ert/dark_storage/endpoints/observations.py +4 -4
  36. ert/dark_storage/endpoints/responses.py +15 -1
  37. ert/ensemble_evaluator/__init__.py +8 -1
  38. ert/ensemble_evaluator/evaluator.py +81 -29
  39. ert/ensemble_evaluator/event.py +6 -0
  40. ert/ensemble_evaluator/snapshot.py +3 -1
  41. ert/ensemble_evaluator/state.py +1 -0
  42. ert/field_utils/__init__.py +8 -0
  43. ert/field_utils/field_utils.py +211 -1
  44. ert/gui/ertwidgets/__init__.py +23 -16
  45. ert/gui/ertwidgets/analysismoduleedit.py +2 -2
  46. ert/gui/ertwidgets/checklist.py +1 -1
  47. ert/gui/ertwidgets/create_experiment_dialog.py +3 -1
  48. ert/gui/ertwidgets/ensembleselector.py +2 -2
  49. ert/gui/ertwidgets/models/__init__.py +2 -0
  50. ert/gui/ertwidgets/models/activerealizationsmodel.py +2 -1
  51. ert/gui/ertwidgets/models/path_model.py +1 -1
  52. ert/gui/ertwidgets/models/targetensemblemodel.py +2 -1
  53. ert/gui/ertwidgets/models/text_model.py +1 -1
  54. ert/gui/ertwidgets/searchbox.py +13 -4
  55. ert/gui/{suggestor → ertwidgets/suggestor}/_suggestor_message.py +13 -4
  56. ert/gui/main.py +11 -6
  57. ert/gui/main_window.py +1 -2
  58. ert/gui/simulation/ensemble_experiment_panel.py +1 -1
  59. ert/gui/simulation/ensemble_information_filter_panel.py +1 -1
  60. ert/gui/simulation/ensemble_smoother_panel.py +1 -1
  61. ert/gui/simulation/evaluate_ensemble_panel.py +1 -1
  62. ert/gui/simulation/experiment_panel.py +1 -1
  63. ert/gui/simulation/manual_update_panel.py +31 -8
  64. ert/gui/simulation/multiple_data_assimilation_panel.py +12 -8
  65. ert/gui/simulation/run_dialog.py +25 -4
  66. ert/gui/simulation/single_test_run_panel.py +2 -2
  67. ert/gui/summarypanel.py +1 -1
  68. ert/gui/tools/load_results/load_results_panel.py +1 -1
  69. ert/gui/tools/manage_experiments/storage_info_widget.py +7 -7
  70. ert/gui/tools/manage_experiments/storage_widget.py +1 -2
  71. ert/gui/tools/plot/plot_api.py +13 -10
  72. ert/gui/tools/plot/plot_window.py +12 -0
  73. ert/gui/tools/plot/plottery/plot_config.py +2 -0
  74. ert/gui/tools/plot/plottery/plot_context.py +14 -0
  75. ert/gui/tools/plot/plottery/plots/ensemble.py +9 -2
  76. ert/gui/tools/plot/plottery/plots/statistics.py +59 -19
  77. ert/mode_definitions.py +2 -0
  78. ert/plugins/__init__.py +0 -1
  79. ert/plugins/hook_implementations/workflows/gen_data_rft_export.py +10 -2
  80. ert/plugins/hook_specifications/__init__.py +0 -2
  81. ert/plugins/hook_specifications/jobs.py +0 -9
  82. ert/plugins/plugin_manager.py +2 -33
  83. ert/resources/shell_scripts/delete_directory.py +2 -2
  84. ert/run_models/__init__.py +18 -5
  85. ert/run_models/_create_run_path.py +33 -21
  86. ert/run_models/ensemble_experiment.py +10 -4
  87. ert/run_models/ensemble_information_filter.py +8 -1
  88. ert/run_models/ensemble_smoother.py +9 -3
  89. ert/run_models/evaluate_ensemble.py +8 -6
  90. ert/run_models/event.py +7 -3
  91. ert/run_models/everest_run_model.py +155 -44
  92. ert/run_models/initial_ensemble_run_model.py +23 -22
  93. ert/run_models/manual_update.py +4 -2
  94. ert/run_models/manual_update_enif.py +37 -0
  95. ert/run_models/model_factory.py +81 -22
  96. ert/run_models/multiple_data_assimilation.py +21 -10
  97. ert/run_models/run_model.py +54 -34
  98. ert/run_models/single_test_run.py +7 -4
  99. ert/run_models/update_run_model.py +4 -2
  100. ert/runpaths.py +5 -6
  101. ert/sample_prior.py +9 -4
  102. ert/scheduler/driver.py +37 -0
  103. ert/scheduler/event.py +3 -1
  104. ert/scheduler/job.py +23 -13
  105. ert/scheduler/lsf_driver.py +6 -2
  106. ert/scheduler/openpbs_driver.py +7 -1
  107. ert/scheduler/scheduler.py +5 -0
  108. ert/scheduler/slurm_driver.py +6 -2
  109. ert/services/__init__.py +2 -2
  110. ert/services/_base_service.py +31 -15
  111. ert/services/ert_server.py +317 -0
  112. ert/shared/_doc_utils/ert_jobs.py +1 -4
  113. ert/shared/storage/connection.py +3 -3
  114. ert/shared/version.py +3 -3
  115. ert/storage/local_ensemble.py +25 -5
  116. ert/storage/local_experiment.py +6 -14
  117. ert/storage/local_storage.py +35 -30
  118. ert/storage/migration/to18.py +12 -0
  119. ert/storage/migration/to8.py +4 -4
  120. ert/substitutions.py +12 -28
  121. ert/validation/active_range.py +7 -7
  122. ert/validation/rangestring.py +16 -16
  123. {ert-17.1.9.dist-info → ert-18.0.0.dist-info}/METADATA +8 -7
  124. {ert-17.1.9.dist-info → ert-18.0.0.dist-info}/RECORD +160 -159
  125. everest/api/everest_data_api.py +1 -14
  126. everest/bin/config_branch_script.py +3 -6
  127. everest/bin/everconfigdump_script.py +1 -9
  128. everest/bin/everest_script.py +21 -11
  129. everest/bin/kill_script.py +2 -2
  130. everest/bin/monitor_script.py +2 -2
  131. everest/bin/utils.py +6 -3
  132. everest/config/__init__.py +4 -1
  133. everest/config/control_config.py +61 -2
  134. everest/config/control_variable_config.py +2 -1
  135. everest/config/everest_config.py +38 -16
  136. everest/config/forward_model_config.py +5 -3
  137. everest/config/install_data_config.py +7 -5
  138. everest/config/install_job_config.py +7 -3
  139. everest/config/install_template_config.py +3 -3
  140. everest/config/optimization_config.py +19 -6
  141. everest/config/output_constraint_config.py +8 -2
  142. everest/config/server_config.py +6 -49
  143. everest/config/utils.py +25 -105
  144. everest/config/validation_utils.py +10 -10
  145. everest/config_file_loader.py +13 -2
  146. everest/detached/everserver.py +7 -8
  147. everest/everest_storage.py +6 -10
  148. everest/gui/everest_client.py +0 -1
  149. everest/gui/main_window.py +2 -2
  150. everest/optimizer/everest2ropt.py +59 -32
  151. everest/optimizer/opt_model_transforms.py +12 -13
  152. everest/optimizer/utils.py +0 -29
  153. everest/strings.py +0 -5
  154. ert/config/everest_constraints_config.py +0 -95
  155. ert/services/storage_service.py +0 -127
  156. everest/config/sampler_config.py +0 -103
  157. everest/simulator/__init__.py +0 -88
  158. everest/simulator/everest_to_ert.py +0 -51
  159. /ert/gui/{suggestor → ertwidgets/suggestor}/__init__.py +0 -0
  160. /ert/gui/{suggestor → ertwidgets/suggestor}/_colors.py +0 -0
  161. /ert/gui/{suggestor → ertwidgets/suggestor}/suggestor.py +0 -0
  162. {ert-17.1.9.dist-info → ert-18.0.0.dist-info}/WHEEL +0 -0
  163. {ert-17.1.9.dist-info → ert-18.0.0.dist-info}/entry_points.txt +0 -0
  164. {ert-17.1.9.dist-info → ert-18.0.0.dist-info}/licenses/COPYING +0 -0
  165. {ert-17.1.9.dist-info → ert-18.0.0.dist-info}/top_level.txt +0 -0
ert/substitutions.py CHANGED
@@ -4,6 +4,7 @@ import logging
4
4
  import re
5
5
  from collections import UserDict
6
6
  from collections.abc import Mapping
7
+ from typing import Self
7
8
 
8
9
  logger = logging.getLogger(__name__)
9
10
  _PATTERN = re.compile(r"<[^<>]+>")
@@ -25,44 +26,27 @@ class Substitutions(UserDict[str, str]):
25
26
  """
26
27
  return _substitute(self, to_substitute, context, max_iterations, warn_max_iter)
27
28
 
28
- @staticmethod
29
- def substitute_parameters(
30
- to_substitute: str, parameter_values: Mapping[str, Mapping[str, str | float]]
31
- ) -> str:
32
- """Applies the substitution '<param_name>' to parameter value
33
- Args:
34
- parameter_values: Mapping from parameter name to parameter value
35
- to_substitute: string to substitute magic strings in
36
- Returns:
37
- substituted string
38
- """
39
- for values in parameter_values.values():
40
- for param_name, value in values.items():
41
- if isinstance(value, (int, float)):
42
- formatted_value = f"{value:.6g}"
43
- else:
44
- formatted_value = str(value)
45
- to_substitute = to_substitute.replace(
46
- f"<{param_name}>", formatted_value
47
- )
48
- return to_substitute
49
-
50
- def substitute_real_iter(
51
- self, to_substitute: str, realization: int, iteration: int
52
- ) -> str:
29
+ def real_iter_substituter(self, realization: int, iteration: int) -> Self:
53
30
  extra_data = {
54
31
  "<IENS>": str(realization),
55
32
  "<ITER>": str(iteration),
56
33
  }
57
34
 
58
- model_id_key = f"<GEO_ID_{realization}_{iteration}>"
35
+ model_id_key = f"<REALIZATION_ID_{realization}_{iteration}>"
59
36
  if model_id_key in self:
60
- extra_data["<GEO_ID>"] = self[model_id_key]
37
+ extra_data["<REALIZATION_ID>"] = self[model_id_key]
61
38
  sim_id_key = f"<SIM_DIR_{realization}_{iteration}>"
62
39
  if sim_id_key in self:
63
40
  extra_data["<SIM_DIR>"] = self[sim_id_key]
64
41
 
65
- return Substitutions({**self, **extra_data}).substitute(to_substitute)
42
+ return type(self)({**self, **extra_data})
43
+
44
+ def substitute_real_iter(
45
+ self, to_substitute: str, realization: int, iteration: int
46
+ ) -> str:
47
+ return self.real_iter_substituter(realization, iteration).substitute(
48
+ to_substitute
49
+ )
66
50
 
67
51
  def _concise_representation(self) -> str:
68
52
  return (
@@ -47,19 +47,19 @@ class ActiveRange:
47
47
  raise ValueError(
48
48
  f"Only digits, commas, dashes and spaces are allowed, got {rangestring}"
49
49
  )
50
- for _range in rangestring.split(","):
51
- if "-" in _range:
52
- if len(_range.split("-")) != 2:
53
- raise ValueError(f"Invalid range specified, got {_range}")
54
- realization_bounds = _range.split("-")
50
+ for range_ in rangestring.split(","):
51
+ if "-" in range_:
52
+ if len(range_.split("-")) != 2:
53
+ raise ValueError(f"Invalid range specified, got {range_}")
54
+ realization_bounds = range_.split("-")
55
55
  start = int(realization_bounds[0])
56
56
  end = int(realization_bounds[1])
57
57
  if end < start:
58
58
  raise ValueError(
59
- f"Invalid direction in range specified, got {_range}"
59
+ f"Invalid direction in range specified, got {range_}"
60
60
  )
61
61
  else:
62
- int(_range)
62
+ int(range_)
63
63
  return rangestring
64
64
 
65
65
  @classmethod
@@ -66,11 +66,11 @@ def rangestring_to_mask(rangestring: str, length: int) -> list[bool]:
66
66
  # An empty string means no active indecies. Note that an
67
67
  # IndexRange-typed instance being None means the opposite
68
68
  return mask
69
- for _range in rangestring.split(","):
70
- if "-" in _range:
71
- if len(_range.strip().split("-")) != 2:
72
- raise ValueError(f"Wrong range syntax {_range}")
73
- start, end = map(int, _range.strip().split("-"))
69
+ for range_ in rangestring.split(","):
70
+ if "-" in range_:
71
+ if len(range_.strip().split("-")) != 2:
72
+ raise ValueError(f"Wrong range syntax {range_}")
73
+ start, end = map(int, range_.strip().split("-"))
74
74
  if end < start:
75
75
  raise ValueError(f"Range {start}-{end} has invalid direction")
76
76
  if end + 1 > length:
@@ -78,12 +78,12 @@ def rangestring_to_mask(rangestring: str, length: int) -> list[bool]:
78
78
  f"Range endpoint {end} is beyond the mask length {length}"
79
79
  )
80
80
  mask[start : end + 1] = [True] * (end + 1 - start)
81
- elif _range:
82
- if int(_range) + 1 > length:
81
+ elif range_:
82
+ if int(range_) + 1 > length:
83
83
  raise ValueError(
84
- f"Realization index {_range} is beyond the mask length {length}"
84
+ f"Realization index {range_} is beyond the mask length {length}"
85
85
  )
86
- mask[int(_range)] = True
86
+ mask[int(range_)] = True
87
87
  return mask
88
88
 
89
89
 
@@ -102,14 +102,14 @@ def rangestring_to_list(rangestring: str) -> list[int]:
102
102
  result: set[int] = set()
103
103
  if not rangestring:
104
104
  return []
105
- for _range in rangestring.split(","):
106
- if "-" in _range:
107
- if len(_range.strip().split("-")) != 2:
108
- raise ValueError(f"Wrong range syntax {_range}")
109
- start, end = map(int, _range.strip().split("-"))
105
+ for range_ in rangestring.split(","):
106
+ if "-" in range_:
107
+ if len(range_.strip().split("-")) != 2:
108
+ raise ValueError(f"Wrong range syntax {range_}")
109
+ start, end = map(int, range_.strip().split("-"))
110
110
  if end < start:
111
111
  raise ValueError(f"Range {start}-{end} has invalid direction")
112
112
  result.update(range(start, end + 1))
113
- elif _range:
114
- result.add(int(_range))
113
+ elif range_:
114
+ result.add(int(range_))
115
115
  return list(result)
@@ -1,15 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ert
3
- Version: 17.1.9
3
+ Version: 18.0.0
4
4
  Summary: Ensemble based Reservoir Tool (ERT)
5
5
  Author-email: Equinor ASA <fg_sib-scout@equinor.com>
6
- License: GPL-3.0
6
+ License-Expression: GPL-3.0-only
7
7
  Project-URL: Repository, https://github.com/equinor/ert
8
8
  Platform: all
9
9
  Classifier: Development Status :: 5 - Production/Stable
10
10
  Classifier: Environment :: Other Environment
11
11
  Classifier: Intended Audience :: Science/Research
12
- Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
13
12
  Classifier: Natural Language :: English
14
13
  Classifier: Programming Language :: Python
15
14
  Classifier: Programming Language :: Python :: 3.11
@@ -21,6 +20,7 @@ Requires-Python: <3.14,>=3.11
21
20
  Description-Content-Type: text/markdown
22
21
  License-File: COPYING
23
22
  Requires-Dist: aiohttp
23
+ Requires-Dist: anyio
24
24
  Requires-Dist: colorama
25
25
  Requires-Dist: cryptography
26
26
  Requires-Dist: decorator
@@ -59,8 +59,8 @@ Requires-Dist: pyyaml
59
59
  Requires-Dist: pyzmq
60
60
  Requires-Dist: requests
61
61
  Requires-Dist: resfo>=5.0.0
62
- Requires-Dist: ropt-dakota<0.25,>=0.24
63
- Requires-Dist: ropt[pandas]<0.25,>=0.24
62
+ Requires-Dist: ropt-dakota<0.26,>=0.25
63
+ Requires-Dist: ropt[pandas]<0.26,>=0.25
64
64
  Requires-Dist: ruamel.yaml
65
65
  Requires-Dist: scipy>=1.10.1
66
66
  Requires-Dist: seaborn
@@ -73,7 +73,7 @@ Requires-Dist: uvicorn>=0.17.0
73
73
  Requires-Dist: websockets
74
74
  Requires-Dist: xarray
75
75
  Requires-Dist: xtgeo>=3.3.0
76
- Requires-Dist: resfo-utilities>=0.3.0
76
+ Requires-Dist: resfo-utilities>=0.5.0
77
77
  Provides-Extra: dev
78
78
  Requires-Dist: furo; extra == "dev"
79
79
  Requires-Dist: hypothesis!=6.102.0,!=6.112.3,>=6.85; extra == "dev"
@@ -94,6 +94,7 @@ Requires-Dist: pytest-rerunfailures!=16.0; extra == "dev"
94
94
  Requires-Dist: pytest-snapshot; extra == "dev"
95
95
  Requires-Dist: pytest-timeout; extra == "dev"
96
96
  Requires-Dist: pytest-xdist; extra == "dev"
97
+ Requires-Dist: pytest-durations; extra == "dev"
97
98
  Requires-Dist: pytest>6; extra == "dev"
98
99
  Requires-Dist: resdata; extra == "dev"
99
100
  Requires-Dist: rust-just; extra == "dev"
@@ -105,7 +106,7 @@ Requires-Dist: sphinx-copybutton; extra == "dev"
105
106
  Requires-Dist: sphinxcontrib.datatemplates; extra == "dev"
106
107
  Requires-Dist: json-schema-for-humans; extra == "dev"
107
108
  Requires-Dist: xlsxwriter>=3.2.3; extra == "dev"
108
- Requires-Dist: resfo-utilities[testing]>=0.3.0; extra == "dev"
109
+ Requires-Dist: resfo-utilities[testing]>=0.5.0; extra == "dev"
109
110
  Provides-Extra: style
110
111
  Requires-Dist: pre-commit; extra == "style"
111
112
  Provides-Extra: types