ert 19.0.0rc3__py3-none-any.whl → 19.0.1__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.
ert/cli/main.py CHANGED
@@ -133,7 +133,6 @@ def run_cli(args: Namespace, runtime_plugins: ErtRuntimePlugins | None = None) -
133
133
  if args.port_range is None
134
134
  else (min(args.port_range), max(args.port_range) + 1),
135
135
  use_ipc_protocol=using_local_queuesystem,
136
- prioritize_private_ip_address=ert_config.prioritize_private_ip_address,
137
136
  )
138
137
 
139
138
  if model.check_if_runpath_exists():
@@ -36,7 +36,7 @@ if TYPE_CHECKING:
36
36
 
37
37
 
38
38
  DEFAULT_TIME_DELTA = timedelta(seconds=30)
39
- DEFAULT_LOCATION_RANGE_M = 3000
39
+ DEFAULT_LOCALIZATION_RADIUS = 3000
40
40
 
41
41
 
42
42
  def create_observation_dataframes(
@@ -205,6 +205,9 @@ def _handle_history_observation(
205
205
  "time": dates_series,
206
206
  "observations": pl.Series(values, dtype=pl.Float32),
207
207
  "std": pl.Series(std_dev, dtype=pl.Float32),
208
+ "east": pl.Series([None] * len(values), dtype=pl.Float32),
209
+ "north": pl.Series([None] * len(values), dtype=pl.Float32),
210
+ "radius": pl.Series([None] * len(values), dtype=pl.Float32),
208
211
  }
209
212
  )
210
213
 
@@ -297,40 +300,7 @@ def _get_restart(
297
300
 
298
301
 
299
302
  def _has_localization(summary_dict: SummaryObservation) -> bool:
300
- return any(
301
- [
302
- summary_dict.location_x is not None,
303
- summary_dict.location_y is not None,
304
- summary_dict.location_range is not None,
305
- ]
306
- )
307
-
308
-
309
- def _validate_localization_values(summary_dict: SummaryObservation) -> None:
310
- """The user must provide LOCATION_X and LOCATION_Y to use localization, while
311
- unprovided LOCATION_RANGE should default to some value.
312
-
313
- This method assumes the summary dict contains at least one LOCATION key.
314
- """
315
- if summary_dict.location_x is None or summary_dict.location_y is None:
316
- loc_values = {
317
- "LOCATION_X": summary_dict.location_x,
318
- "LOCATION_Y": summary_dict.location_y,
319
- "LOCATION_RANGE": summary_dict.location_range,
320
- }
321
- provided_loc_values = {k: v for k, v in loc_values.items() if v is not None}
322
-
323
- provided_loc_values_string = ", ".join(
324
- key.upper() for key in provided_loc_values
325
- )
326
- raise ObservationConfigError.with_context(
327
- f"Localization for observation {summary_dict.name} is misconfigured.\n"
328
- f"Only {provided_loc_values_string} were provided. To enable "
329
- f"localization for an observation, ensure that both LOCATION_X and "
330
- f"LOCATION_Y are defined - or remove LOCATION keywords to disable "
331
- f"localization.",
332
- summary_dict,
333
- )
303
+ return summary_dict.east is not None and summary_dict.north is not None
334
304
 
335
305
 
336
306
  def _handle_summary_observation(
@@ -370,23 +340,24 @@ def _handle_summary_observation(
370
340
  "Observation uncertainty must be strictly > 0", summary_key
371
341
  ) from None
372
342
 
373
- data_dict = {
374
- "response_key": [summary_key],
375
- "observation_key": [obs_key],
376
- "time": pl.Series([date]).dt.cast_time_unit("ms"),
377
- "observations": pl.Series([value], dtype=pl.Float32),
378
- "std": pl.Series([std_dev], dtype=pl.Float32),
379
- }
380
-
381
- if _has_localization(summary_dict):
382
- _validate_localization_values(summary_dict)
383
- data_dict["location_x"] = summary_dict.location_x
384
- data_dict["location_y"] = summary_dict.location_y
385
- data_dict["location_range"] = (
386
- summary_dict.location_range or DEFAULT_LOCATION_RANGE_M
387
- )
343
+ localization_radius = (
344
+ summary_dict.radius or DEFAULT_LOCALIZATION_RADIUS
345
+ if _has_localization(summary_dict)
346
+ else None
347
+ )
388
348
 
389
- return pl.DataFrame(data_dict)
349
+ return pl.DataFrame(
350
+ {
351
+ "response_key": [summary_key],
352
+ "observation_key": [obs_key],
353
+ "time": pl.Series([date]).dt.cast_time_unit("ms"),
354
+ "observations": pl.Series([value], dtype=pl.Float32),
355
+ "std": pl.Series([std_dev], dtype=pl.Float32),
356
+ "east": pl.Series([summary_dict.east], dtype=pl.Float32),
357
+ "north": pl.Series([summary_dict.north], dtype=pl.Float32),
358
+ "radius": pl.Series([localization_radius], dtype=pl.Float32),
359
+ }
360
+ )
390
361
 
391
362
 
392
363
  def _handle_general_observation(
@@ -514,6 +485,11 @@ def _handle_general_observation(
514
485
  "index": pl.Series(indices, dtype=pl.UInt16),
515
486
  "observations": pl.Series(values, dtype=pl.Float32),
516
487
  "std": pl.Series(stds, dtype=pl.Float32),
488
+ # Location attributes will always be None for general observations, but are
489
+ # necessary to concatenate with other observation dataframes.
490
+ "east": pl.Series([None] * len(values), dtype=pl.Float32),
491
+ "north": pl.Series([None] * len(values), dtype=pl.Float32),
492
+ "radius": pl.Series([None] * len(values), dtype=pl.Float32),
517
493
  }
518
494
  )
519
495
 
@@ -556,5 +532,6 @@ def _handle_rft_observation(
556
532
  "tvd": pl.Series([location[2]], dtype=pl.Float32),
557
533
  "observations": pl.Series([rft_observation.value], dtype=pl.Float32),
558
534
  "std": pl.Series([rft_observation.error], dtype=pl.Float32),
535
+ "radius": pl.Series([None], dtype=pl.Float32),
559
536
  }
560
537
  )
@@ -89,9 +89,9 @@ class _SummaryValues:
89
89
  name: str
90
90
  value: float
91
91
  key: str #: The :term:`summary key` in the summary response
92
- location_x: float | None = None
93
- location_y: float | None = None
94
- location_range: float | None = None
92
+ east: float | None = None
93
+ north: float | None = None
94
+ radius: float | None = None
95
95
 
96
96
 
97
97
  @dataclass
@@ -103,7 +103,7 @@ class SummaryObservation(ObservationDate, _SummaryValues, ObservationError):
103
103
 
104
104
  date_dict: ObservationDate = ObservationDate()
105
105
  float_values: dict[str, float] = {"ERROR_MIN": 0.1}
106
- localization_values: dict[str, float] = {}
106
+ localization_values: dict[str, float | None] = {}
107
107
  for key, value in observation_dict.items():
108
108
  match key:
109
109
  case "type" | "name":
@@ -124,12 +124,15 @@ class SummaryObservation(ObservationDate, _SummaryValues, ObservationError):
124
124
  summary_key = value
125
125
  case "DATE":
126
126
  date_dict.date = value
127
- case "LOCATION_X":
128
- localization_values["x"] = validate_float(value, key)
129
- case "LOCATION_Y":
130
- localization_values["y"] = validate_float(value, key)
131
- case "LOCATION_RANGE":
132
- localization_values["range"] = validate_float(value, key)
127
+ case "LOCALIZATION":
128
+ validate_localization(value, observation_dict["name"])
129
+ localization_values["east"] = validate_float(value["EAST"], key)
130
+ localization_values["north"] = validate_float(value["NORTH"], key)
131
+ localization_values["radius"] = (
132
+ validate_float(value["RADIUS"], key)
133
+ if "RADIUS" in value
134
+ else None
135
+ )
133
136
  case _:
134
137
  raise _unknown_key_error(str(key), observation_dict["name"])
135
138
  if "VALUE" not in float_values:
@@ -146,9 +149,9 @@ class SummaryObservation(ObservationDate, _SummaryValues, ObservationError):
146
149
  error_min=float_values["ERROR_MIN"],
147
150
  key=summary_key,
148
151
  value=float_values["VALUE"],
149
- location_x=localization_values.get("x"),
150
- location_y=localization_values.get("y"),
151
- location_range=localization_values.get("range"),
152
+ east=localization_values.get("east"),
153
+ north=localization_values.get("north"),
154
+ radius=localization_values.get("radius"),
152
155
  **date_dict.__dict__,
153
156
  )
154
157
 
@@ -398,6 +401,19 @@ def validate_positive_float(val: str, key: str) -> float:
398
401
  return v
399
402
 
400
403
 
404
+ def validate_localization(val: dict[str, Any], obs_name: str) -> None:
405
+ errors = []
406
+ if "EAST" not in val:
407
+ errors.append(_missing_value_error(f"LOCALIZATION for {obs_name}", "EAST"))
408
+ if "NORTH" not in val:
409
+ errors.append(_missing_value_error(f"LOCALIZATION for {obs_name}", "NORTH"))
410
+ for key in val:
411
+ if key not in {"EAST", "NORTH", "RADIUS"}:
412
+ errors.append(_unknown_key_error(key, f"LOCALIZATION for {obs_name}"))
413
+ if errors:
414
+ raise ObservationConfigError.from_collected(errors)
415
+
416
+
401
417
  def validate_positive_int(val: str, key: str) -> int:
402
418
  try:
403
419
  v = int(val)
ert/config/ert_config.py CHANGED
@@ -717,7 +717,6 @@ class ErtConfig(BaseModel):
717
717
  QUEUE_OPTIONS: ClassVar[KnownQueueOptions | None] = None
718
718
  RESERVED_KEYWORDS: ClassVar[list[str]] = RESERVED_KEYWORDS
719
719
  ENV_VARS: ClassVar[dict[str, str]] = {}
720
- PRIORITIZE_PRIVATE_IP_ADDRESS: ClassVar[bool] = False
721
720
 
722
721
  substitutions: dict[str, str] = Field(default_factory=dict)
723
722
  ensemble_config: EnsembleConfig = Field(default_factory=EnsembleConfig)
@@ -732,7 +731,6 @@ class ErtConfig(BaseModel):
732
731
  default_factory=lambda: defaultdict(lambda: cast(list[Workflow], []))
733
732
  )
734
733
  runpath_file: Path = Path(DEFAULT_RUNPATH_FILE)
735
- prioritize_private_ip_address: bool = False
736
734
 
737
735
  ert_templates: list[tuple[str, str]] = Field(default_factory=list)
738
736
 
@@ -868,9 +866,6 @@ class ErtConfig(BaseModel):
868
866
  )
869
867
  ENV_VARS = dict(runtime_plugins.environment_variables)
870
868
  QUEUE_OPTIONS = runtime_plugins.queue_options
871
- PRIORITIZE_PRIVATE_IP_ADDRESS = (
872
- runtime_plugins.prioritize_private_ip_address
873
- )
874
869
 
875
870
  ErtConfigWithPlugins.model_rebuild()
876
871
  assert issubclass(ErtConfigWithPlugins, ErtConfig)
@@ -1123,19 +1118,6 @@ class ErtConfig(BaseModel):
1123
1118
  user_configured_.add(key)
1124
1119
  env_vars[key] = substituter.substitute(val)
1125
1120
 
1126
- prioritize_private_ip_address: bool = cls.PRIORITIZE_PRIVATE_IP_ADDRESS
1127
- if ConfigKeys.PRIORITIZE_PRIVATE_IP_ADDRESS in config_dict:
1128
- user_prioritize_private_ip_address = bool(
1129
- config_dict[ConfigKeys.PRIORITIZE_PRIVATE_IP_ADDRESS]
1130
- )
1131
- if prioritize_private_ip_address != user_prioritize_private_ip_address:
1132
- logger.warning(
1133
- "PRIORITIZE_PRIVATE_IP_ADDRESS was overwritten by user: "
1134
- f"{prioritize_private_ip_address} -> "
1135
- f"{user_prioritize_private_ip_address}"
1136
- )
1137
- prioritize_private_ip_address = user_prioritize_private_ip_address
1138
-
1139
1121
  try:
1140
1122
  refcase = Refcase.from_config_dict(config_dict)
1141
1123
  cls_config = cls(
@@ -1162,7 +1144,6 @@ class ErtConfig(BaseModel):
1162
1144
  time_map=time_map,
1163
1145
  history_source=history_source,
1164
1146
  refcase=refcase,
1165
- prioritize_private_ip_address=prioritize_private_ip_address,
1166
1147
  )
1167
1148
 
1168
1149
  # The observations are created here because create_observation_dataframes
@@ -56,7 +56,6 @@ class ConfigKeys(StrEnum):
56
56
  REALIZATION_MEMORY = "REALIZATION_MEMORY"
57
57
  SUBMIT_SLEEP = "SUBMIT_SLEEP"
58
58
  MAX_RUNNING = "MAX_RUNNING"
59
- PRIORITIZE_PRIVATE_IP_ADDRESS = "PRIORITIZE_PRIVATE_IP_ADDRESS"
60
59
 
61
60
  def __repr__(self) -> str:
62
61
  return f"{self.value!r}"
@@ -126,13 +126,6 @@ def hook_workflow_keyword() -> SchemaItem:
126
126
  )
127
127
 
128
128
 
129
- def prioritize_private_ip_address_keyword() -> SchemaItem:
130
- return SchemaItem(
131
- kw=ConfigKeys.PRIORITIZE_PRIVATE_IP_ADDRESS,
132
- type_map=[SchemaItemType.BOOL],
133
- )
134
-
135
-
136
129
  def set_env_keyword() -> SchemaItem:
137
130
  # You can set environment variables which will be applied to the run-time
138
131
  # environment.
@@ -356,7 +349,6 @@ def init_user_config_schema() -> ConfigSchemaDict:
356
349
  install_job_keyword(),
357
350
  install_job_directory_keyword(),
358
351
  hook_workflow_keyword(),
359
- prioritize_private_ip_address_keyword(),
360
352
  ]:
361
353
  schema[item.kw] = item
362
354
  if item.kw in ConfigAliases:
@@ -138,6 +138,7 @@ observations_parser = Lark(
138
138
  PARAMETER_NAME : CHAR+
139
139
  object : "{" [(declaration";")*] "}"
140
140
  ?declaration: "SEGMENT" STRING object -> segment
141
+ | "LOCALIZATION" object -> localization
141
142
  | pair
142
143
  pair : PARAMETER_NAME "=" value
143
144
 
@@ -193,6 +194,11 @@ class TreeToObservations(Transformer[FileContextToken, list[ObservationDict]]):
193
194
  def segment(tree):
194
195
  return (("SEGMENT", tree[0]), tree[1])
195
196
 
197
+ @staticmethod
198
+ @no_type_check
199
+ def localization(tree):
200
+ return ("LOCALIZATION", tree[0])
201
+
196
202
  @staticmethod
197
203
  @no_type_check
198
204
  def object(tree):
@@ -317,11 +317,9 @@ class ExperimentRunner:
317
317
  simulation_future = loop.run_in_executor(
318
318
  None,
319
319
  lambda: run_model.start_simulations_thread(
320
- EvaluatorServerConfig(
321
- use_ipc_protocol=run_model.queue_config.queue_system
322
- == QueueSystem.LOCAL,
323
- prioritize_private_ip_address=site_plugins.prioritize_private_ip_address,
324
- )
320
+ EvaluatorServerConfig()
321
+ if run_model.queue_config.queue_system == QueueSystem.LOCAL
322
+ else EvaluatorServerConfig(use_ipc_protocol=False)
325
323
  ),
326
324
  )
327
325
  while True:
@@ -27,7 +27,6 @@ class EvaluatorServerConfig:
27
27
  use_token: bool = True,
28
28
  host: str | None = None,
29
29
  use_ipc_protocol: bool = True,
30
- prioritize_private_ip_address: bool = False,
31
30
  ) -> None:
32
31
  self.host: str | None = host
33
32
  self.router_port: int | None = None
@@ -51,7 +50,7 @@ class EvaluatorServerConfig:
51
50
  if use_ipc_protocol:
52
51
  self.uri = f"ipc:///tmp/socket-{uuid.uuid4().hex[:8]}"
53
52
  elif self.host is None:
54
- self.host = get_ip_address(prioritize_private_ip_address)
53
+ self.host = get_ip_address()
55
54
 
56
55
  if use_token:
57
56
  self.server_public_key, self.server_secret_key = zmq.curve_keypair()
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import io
3
4
  import operator
4
5
  import os
5
6
  from collections.abc import Iterator
@@ -257,6 +258,9 @@ def import_bgrdecl(
257
258
  raise ValueError(f"Did not find field parameter {field_name} in {file_path}")
258
259
 
259
260
 
261
+ _BUFFER_SIZE = 2**20 # 1.04 megabytes
262
+
263
+
260
264
  def export_grdecl(
261
265
  values: np.ma.MaskedArray[Any, np.dtype[np.float32]] | npt.NDArray[np.float32],
262
266
  file_path: str | os.PathLike[str],
@@ -271,12 +275,25 @@ def export_grdecl(
271
275
  if binary:
272
276
  resfo.write(file_path, [(param_name.ljust(8), values.astype(np.float32))])
273
277
  else:
274
- with open(file_path, "w", encoding="utf-8") as fh:
275
- fh.write(param_name + "\n")
276
- for i, v in enumerate(values):
277
- fh.write(" ")
278
- fh.write(f"{v:3e}")
279
- if i % 6 == 5:
280
- fh.write("\n")
281
-
282
- fh.write(" /\n")
278
+ length = values.shape[0]
279
+ per_line = 6
280
+ iters = 5
281
+ per_iter = per_line * iters
282
+ fmt = " ".join(["%3e"] * per_line)
283
+ fmt = "\n".join([fmt] * iters) + "\n"
284
+ with (
285
+ open(file_path, "wb+", 0) as fh,
286
+ io.BufferedWriter(fh, _BUFFER_SIZE) as bw,
287
+ io.TextIOWrapper(bw, write_through=True, encoding="utf-8") as tw,
288
+ ):
289
+ tw.write(param_name + "\n")
290
+ i = 0
291
+ while i + per_iter <= length:
292
+ tw.write(fmt % tuple(values[i : i + per_iter]))
293
+ i += per_iter
294
+
295
+ for j, v in enumerate(values[length - (length % per_iter) :]):
296
+ tw.write(f" {v:3e}")
297
+ if j % 6 == 5:
298
+ tw.write("\n")
299
+ tw.write(" /\n")
@@ -55,15 +55,9 @@ def create_md_table(kv: dict[str, str], output: str) -> str:
55
55
 
56
56
 
57
57
  def get_simulation_thread(
58
- model: Any,
59
- rerun_failed_realizations: bool = False,
60
- use_ipc_protocol: bool = False,
61
- prioritize_private_ip_address: bool = False,
58
+ model: Any, rerun_failed_realizations: bool = False, use_ipc_protocol: bool = False
62
59
  ) -> ErtThread:
63
- evaluator_server_config = EvaluatorServerConfig(
64
- use_ipc_protocol=use_ipc_protocol,
65
- prioritize_private_ip_address=prioritize_private_ip_address,
66
- )
60
+ evaluator_server_config = EvaluatorServerConfig(use_ipc_protocol=use_ipc_protocol)
67
61
 
68
62
  def run() -> None:
69
63
  model.api.start_simulations_thread(
@@ -387,7 +381,6 @@ class ExperimentPanel(QWidget):
387
381
  rerun_failed_realizations,
388
382
  use_ipc_protocol=self.config.queue_config.queue_system
389
383
  == QueueSystem.LOCAL,
390
- prioritize_private_ip_address=self.config.prioritize_private_ip_address,
391
384
  )
392
385
  self._dialog.setup_event_monitoring(rerun_failed_realizations)
393
386
  simulation_thread.start()
@@ -7,6 +7,7 @@ import seaborn as sns
7
7
  import yaml
8
8
  from matplotlib.backends.backend_qt5agg import FigureCanvas # type: ignore
9
9
  from matplotlib.figure import Figure
10
+ from pandas.errors import PerformanceWarning
10
11
  from polars import DataFrame
11
12
  from PyQt6.QtCore import Qt
12
13
  from PyQt6.QtCore import pyqtSlot as Slot
@@ -29,6 +30,7 @@ from PyQt6.QtWidgets import (
29
30
 
30
31
  from ert import LibresFacade
31
32
  from ert.storage import Ensemble, Experiment, RealizationStorageState
33
+ from ert.warnings import capture_specific_warning
32
34
 
33
35
  from .export_dialog import ExportDialog
34
36
 
@@ -446,7 +448,8 @@ class _EnsembleWidget(QWidget):
446
448
 
447
449
  def get_misfit_df(self) -> DataFrame:
448
450
  assert self._ensemble is not None
449
- df = LibresFacade.load_all_misfit_data(self._ensemble)
451
+ with capture_specific_warning(PerformanceWarning):
452
+ df = LibresFacade.load_all_misfit_data(self._ensemble)
450
453
  realization_column = pl.Series(df.index)
451
454
  df = pl.from_pandas(df)
452
455
  df.insert_column(0, realization_column)
@@ -163,6 +163,7 @@ class PlotWidget(QWidget):
163
163
  vbox.addSpacing(8)
164
164
  self.setLayout(vbox)
165
165
 
166
+ self._negative_values_in_data = False
166
167
  self._dirty = True
167
168
  self._active = False
168
169
  self.resetPlot()
@@ -175,11 +176,15 @@ class PlotWidget(QWidget):
175
176
  self._figure.clear()
176
177
 
177
178
  def _sync_log_checkbox(self) -> None:
178
- if type(self._plotter).__name__ in {
179
- "HistogramPlot",
180
- "DistributionPlot",
181
- "GaussianKDEPlot",
182
- }:
179
+ if (
180
+ type(self._plotter).__name__
181
+ in {
182
+ "HistogramPlot",
183
+ "DistributionPlot",
184
+ "GaussianKDEPlot",
185
+ }
186
+ and self._negative_values_in_data is False
187
+ ):
183
188
  self._log_checkbox.setVisible(True)
184
189
  else:
185
190
  self._log_checkbox.setVisible(False)
@@ -198,8 +203,11 @@ class PlotWidget(QWidget):
198
203
  ) -> None:
199
204
  self.resetPlot()
200
205
  try:
206
+ self._sync_log_checkbox()
201
207
  plot_context.log_scale = (
202
- self._log_checkbox.isVisible() and self._log_checkbox.isChecked()
208
+ self._log_checkbox.isVisible()
209
+ and self._log_checkbox.isChecked()
210
+ and self._negative_values_in_data is False
203
211
  )
204
212
  self._plotter.plot(
205
213
  self._figure,
@@ -210,7 +218,6 @@ class PlotWidget(QWidget):
210
218
  key_def,
211
219
  )
212
220
  self._canvas.draw()
213
- self._sync_log_checkbox()
214
221
  except Exception as e:
215
222
  exc_type, _, exc_tb = sys.exc_info()
216
223
  sys.stderr.write("-" * 80 + "\n")
@@ -284,6 +284,15 @@ class PlotWindow(QMainWindow):
284
284
  except BaseException as e:
285
285
  handle_exception(e)
286
286
 
287
+ negative_values_in_data = False
288
+ if key_def.parameter is not None and key_def.parameter.type == "gen_kw":
289
+ for data in ensemble_to_data_map.values():
290
+ data = data.T
291
+ if data.le(0).any().any():
292
+ negative_values_in_data = True
293
+ break
294
+
295
+ plot_widget._negative_values_in_data = negative_values_in_data
287
296
  observations = None
288
297
  if key_def.observations and selected_ensembles:
289
298
  try:
@@ -338,7 +338,6 @@ class ErtRuntimePlugins(BaseModel):
338
338
  environment_variables: Mapping[str, str] = Field(default_factory=dict)
339
339
  env_pr_fm_step: Mapping[str, Mapping[str, Any]] = Field(default_factory=dict)
340
340
  help_links: dict[str, str] = Field(default_factory=dict)
341
- prioritize_private_ip_address: bool = False
342
341
 
343
342
 
344
343
  def get_site_plugins(
@@ -387,9 +386,6 @@ def get_site_plugins(
387
386
  ),
388
387
  env_pr_fm_step=plugin_manager.get_forward_model_configuration(),
389
388
  help_links=plugin_manager.get_help_links(),
390
- prioritize_private_ip_address=site_configurations.prioritize_private_ip_address
391
- if site_configurations
392
- else False,
393
389
  )
394
390
 
395
391
  return runtime_plugins
ert/shared/net_utils.py CHANGED
@@ -1,10 +1,8 @@
1
- import ipaddress
2
1
  import logging
3
2
  import random
4
3
  import socket
5
4
  from functools import lru_cache
6
5
 
7
- import psutil
8
6
  from dns import exception, resolver, reversename
9
7
 
10
8
 
@@ -52,7 +50,6 @@ def get_machine_name() -> str:
52
50
  def find_available_socket(
53
51
  host: str | None = None,
54
52
  port_range: range = range(51820, 51840 + 1),
55
- prioritize_private_ip_address: bool = False,
56
53
  ) -> socket.socket:
57
54
  """
58
55
  The default and recommended approach here is to return a bound socket to the
@@ -74,9 +71,7 @@ def find_available_socket(
74
71
 
75
72
  See e.g. implementation and comments in EvaluatorServerConfig
76
73
  """
77
- current_host = (
78
- host if host is not None else get_ip_address(prioritize_private_ip_address)
79
- )
74
+ current_host = host if host is not None else get_ip_address()
80
75
 
81
76
  if port_range.start == port_range.stop:
82
77
  ports = list(range(port_range.start, port_range.stop + 1))
@@ -140,40 +135,20 @@ def get_family(host: str) -> socket.AddressFamily:
140
135
  return socket.AF_INET6
141
136
 
142
137
 
143
- def get_ip_address(prioritize_private: bool = False) -> str:
144
- """
145
- Get the first (private or public) IPv4 address of the current machine on the LAN.
146
- Default behaviour returns the first public IP if found, then private, then loopback.
147
-
148
- Parameters:
149
- prioritize_private (bool): If True, private IP addresses are prioritized
150
-
151
- Returns:
152
- str: The selected IP address as a string.
153
- """
154
- loopback = ""
155
- public = ""
156
- private = ""
157
- interfaces = psutil.net_if_addrs()
158
- for addresses in interfaces.values():
159
- for address in addresses:
160
- if address.family.name == "AF_INET":
161
- ip = address.address
162
- if ipaddress.ip_address(ip).is_loopback and not loopback:
163
- loopback = ip
164
- elif ipaddress.ip_address(ip).is_private and not private:
165
- private = ip
166
- elif not public:
167
- public = ip
168
-
169
- # Select first non-empty value, based on prioritization
170
- if prioritize_private:
171
- selected_ip = private or public or loopback
172
- else:
173
- selected_ip = public or private or loopback
174
-
175
- if selected_ip:
176
- return selected_ip
177
- else:
178
- logger.warning("Cannot determine ip-address. Falling back to 127.0.0.1")
179
- return "127.0.0.1"
138
+ # See https://stackoverflow.com/a/28950776
139
+ def get_ip_address() -> str:
140
+ try:
141
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
142
+ try:
143
+ s.settimeout(0)
144
+ # try pinging a reserved, internal address in order
145
+ # to determine IP representing the default route
146
+ s.connect(("10.255.255.255", 1))
147
+ address = s.getsockname()[0]
148
+ finally:
149
+ s.close()
150
+ except BaseException:
151
+ logger.warning("Cannot determine ip-address. Falling back to localhost.")
152
+ address = "127.0.0.1"
153
+ logger.debug(f"ip-address: {address}")
154
+ return address
ert/shared/version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '19.0.0rc3'
32
- __version_tuple__ = version_tuple = (19, 0, 0, 'rc3')
31
+ __version__ = version = '19.0.1'
32
+ __version_tuple__ = version_tuple = (19, 0, 1)
33
33
 
34
- __commit_id__ = commit_id = 'g40bbd3ce0'
34
+ __commit_id__ = commit_id = 'gd8015f3be'
@@ -679,6 +679,9 @@ class LocalEnsemble(BaseMode):
679
679
  if complete_df is None:
680
680
  complete_df = ds
681
681
  else:
682
+ complete_df = complete_df.drop(
683
+ [c for c in ds.columns if c != "realization"], strict=False
684
+ )
682
685
  complete_df = (
683
686
  complete_df.join(ds, on="realization", how="left")
684
687
  .unique(subset=["realization"], keep="first")
@@ -1096,6 +1099,11 @@ class LocalEnsemble(BaseMode):
1096
1099
  on=["response_key", *response_cls.primary_key],
1097
1100
  )
1098
1101
 
1102
+ # Do not drop primary keys which
1103
+ # overlap with localization attributes
1104
+ primary_keys_to_drop = set(response_cls.primary_key).difference(
1105
+ {"north", "east", "radius"}
1106
+ )
1099
1107
  joined = (
1100
1108
  joined.with_columns(
1101
1109
  pl.concat_str(
@@ -1105,7 +1113,7 @@ class LocalEnsemble(BaseMode):
1105
1113
  # Avoid potential collisions w/ primary key
1106
1114
  )
1107
1115
  )
1108
- .drop(response_cls.primary_key)
1116
+ .drop(primary_keys_to_drop)
1109
1117
  .rename({"__tmp_index_key__": "index"})
1110
1118
  )
1111
1119
 
@@ -1121,6 +1129,9 @@ class LocalEnsemble(BaseMode):
1121
1129
  "observation_key",
1122
1130
  "observations",
1123
1131
  "std",
1132
+ "east",
1133
+ "north",
1134
+ "radius",
1124
1135
  ]
1125
1136
  )
1126
1137
 
@@ -31,7 +31,7 @@ from .realization_storage_state import RealizationStorageState
31
31
 
32
32
  logger = logging.getLogger(__name__)
33
33
 
34
- _LOCAL_STORAGE_VERSION = 21
34
+ _LOCAL_STORAGE_VERSION = 23
35
35
 
36
36
 
37
37
  class _Migrations(BaseModel):
@@ -517,6 +517,8 @@ class LocalStorage(BaseMode):
517
517
  to19,
518
518
  to20,
519
519
  to21,
520
+ to22,
521
+ to23,
520
522
  )
521
523
 
522
524
  try:
@@ -567,6 +569,8 @@ class LocalStorage(BaseMode):
567
569
  18: to19,
568
570
  19: to20,
569
571
  20: to21,
572
+ 21: to22,
573
+ 22: to23,
570
574
  }
571
575
  for from_version in range(version, _LOCAL_STORAGE_VERSION):
572
576
  migrations[from_version].migrate(self.path)
@@ -0,0 +1,18 @@
1
+ from pathlib import Path
2
+
3
+ import polars as pl
4
+
5
+ info = "Add default None values to summary observations LOCATION keywords"
6
+
7
+
8
+ def migrate(path: Path) -> None:
9
+ for summary_observation in path.glob("experiments/*/observations/summary"):
10
+ summary_df = pl.read_parquet(summary_observation)
11
+
12
+ for location_kw in ["location_x", "location_y", "location_range"]:
13
+ if location_kw not in summary_df.columns:
14
+ summary_df = summary_df.with_columns(
15
+ pl.lit(None, dtype=pl.Float32).alias(location_kw)
16
+ )
17
+
18
+ summary_df.write_parquet(summary_observation)
@@ -0,0 +1,49 @@
1
+ from pathlib import Path
2
+
3
+ import polars as pl
4
+
5
+ info = "Add default None values to summary observations LOCATION keywords"
6
+
7
+ old_localization_keywords = ["location_x", "location_y", "location_range"]
8
+ new_localization_keywords = ["east", "north", "radius"]
9
+
10
+
11
+ def migrate(path: Path) -> None:
12
+ for gen_obs in path.glob("experiments/*/observations/gen_data"):
13
+ gen_obs_df = pl.read_parquet(gen_obs)
14
+
15
+ for new_kw in new_localization_keywords:
16
+ if new_kw not in gen_obs_df.columns:
17
+ gen_obs_df = gen_obs_df.with_columns(
18
+ pl.lit(None, dtype=pl.Float32).alias(new_kw)
19
+ )
20
+
21
+ gen_obs_df.write_parquet(gen_obs)
22
+
23
+ for rft_obs in path.glob("experiments/*/observations/rft"):
24
+ rft_obs_df = pl.read_parquet(rft_obs)
25
+
26
+ for new_kw in new_localization_keywords:
27
+ if new_kw not in rft_obs_df.columns:
28
+ rft_obs_df = rft_obs_df.with_columns(
29
+ pl.lit(None, dtype=pl.Float32).alias(new_kw)
30
+ )
31
+
32
+ rft_obs_df.write_parquet(rft_obs)
33
+
34
+ for summary_obs in path.glob("experiments/*/observations/summary"):
35
+ summary_df = pl.read_parquet(summary_obs)
36
+
37
+ for old_kw, new_kw in zip(
38
+ old_localization_keywords, new_localization_keywords, strict=True
39
+ ):
40
+ if old_kw in summary_df.columns:
41
+ column = summary_df[old_kw]
42
+ summary_df = summary_df.with_columns(column.alias(new_kw))
43
+ summary_df = summary_df.drop(old_kw)
44
+ else:
45
+ summary_df = summary_df.with_columns(
46
+ pl.lit(None, dtype=pl.Float32).alias(new_kw)
47
+ )
48
+
49
+ summary_df.write_parquet(summary_obs)
@@ -7,7 +7,7 @@ from typing import TextIO
7
7
  @contextmanager
8
8
  def capture_specific_warning(
9
9
  warning_class_to_capture: type[Warning],
10
- propagate_warning: Callable[[Warning | str], None],
10
+ propagate_warning: Callable[[Warning | str], None] | None = None,
11
11
  ) -> Generator[None, None, None]:
12
12
  original_warning_handler = warnings.showwarning
13
13
 
@@ -20,7 +20,8 @@ def capture_specific_warning(
20
20
  line: str | None = None,
21
21
  ) -> None:
22
22
  if issubclass(category, warning_class_to_capture):
23
- propagate_warning(message)
23
+ if propagate_warning is not None:
24
+ propagate_warning(message)
24
25
  else:
25
26
  original_warning_handler(message, category, filename, lineno, file, line)
26
27
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ert
3
- Version: 19.0.0rc3
3
+ Version: 19.0.1
4
4
  Summary: Ensemble based Reservoir Tool (ERT)
5
5
  Author-email: Equinor ASA <fg_sib-scout@equinor.com>
6
6
  License-Expression: GPL-3.0-only
@@ -38,14 +38,14 @@ ert/analysis/event.py,sha256=vBYqtTl5DXePPWHTLX9bROmGTD2ixcrQh4K07g-UikM,2248
38
38
  ert/analysis/misfit_preprocessor.py,sha256=2MjlL2yIg5KQpqWiD3675-hoy_5QM49pWQ7VXK4rous,8001
39
39
  ert/analysis/snapshots.py,sha256=rLMxg4y5dlA_GZ2ETnZilfmggsqDm3O8Fiuq2xpshz8,2106
40
40
  ert/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- ert/cli/main.py,sha256=oWiIUF5r2E1QOforFY-nQ2k3mrE74EDqrk8QcjcdfmE,6567
41
+ ert/cli/main.py,sha256=VbqfWytyEEbpJoHd4TyKbXzdYTt6X0oufDV8dBV1WNA,6487
42
42
  ert/cli/monitor.py,sha256=ad6aT1Ch-To5XpQR6eR1SMCBZ9HNRjPE9X8o6TEGURg,5973
43
43
  ert/cli/workflow.py,sha256=QKbpHr_Tc5NQjSNL1tB4uCo9ykTkqvwohywbjGAm-r4,1260
44
44
  ert/config/__init__.py,sha256=RVLt_v8nF9xjG51smLK9OXZT6yAH5KEmSgnFYYvVogU,4310
45
- ert/config/_create_observation_dataframes.py,sha256=P-cyJlushUR4Em58rRAsmK3jw3PoYhbqsT5qsHrpL7c,19717
45
+ ert/config/_create_observation_dataframes.py,sha256=FHwTXR6awIFkVxdxOGdy6QQuar_lz4C7oBw_lPCox8E,19099
46
46
  ert/config/_design_matrix_validator.py,sha256=_eEk07L4c7sv8WwTYYGHc_rT1HEOZDqLrgla0r9rpj0,1308
47
47
  ert/config/_get_num_cpu.py,sha256=IXOEHkGJEz7kEOysc29q-jpaXqbWeu-Y4FlQvGp0ryM,7684
48
- ert/config/_observations.py,sha256=wByDMhvJau9iqimyVPcfY10ALlVJFP7nKoaMyON2r1A,14318
48
+ ert/config/_observations.py,sha256=nm6GsFAwh16anXDuz04p9jn6sT4hd233Do7H__QpATY,15000
49
49
  ert/config/_read_summary.py,sha256=_1f6iZV2tBDRtPn5C_29cyjN7suA5hh1HnLKyF9L4jY,7500
50
50
  ert/config/_str_to_bool.py,sha256=AxNCJAuTtKF-562CRh7HgjQIyM7N-jjSlRJKvpCNk9I,852
51
51
  ert/config/analysis_config.py,sha256=v-ZppIlP_NkmhtuYuxm31m2V3eA7YjvC3rDsMXm5qPk,8646
@@ -54,7 +54,7 @@ ert/config/capture_validation.py,sha256=8HGEbJ2z9FXeEaxSewejP7NtEh4LLomPwcdpC0CJ
54
54
  ert/config/design_matrix.py,sha256=yyAFBppTwZXt4OeN6kxRmLk16jF8bntQWLHU_-rDQn4,17236
55
55
  ert/config/distribution.py,sha256=rzpO-U8c2ptsj1KlfUw6n_CRaj-e1cvzVvasR0t5sZI,12728
56
56
  ert/config/ensemble_config.py,sha256=b0KuQ_y85kr4AOPPX_qieYKgnDGZ4_87bSjYpVZuOlM,7322
57
- ert/config/ert_config.py,sha256=jLiqGYLA-lBlnHoh6tmWa1kZE6LT11gwoSZD-eLEYCs,57415
57
+ ert/config/ert_config.py,sha256=L7oLAXDUfPmXnyZ-xmZCir50zLXRPWkXjFiGgWTDVhE,56408
58
58
  ert/config/ert_plugin.py,sha256=hENwrc9FfhqUYjVpFYcmy66jDLgU_gagOJFBcYjxe6A,458
59
59
  ert/config/ert_script.py,sha256=64FZ-dMI8DZtRLHWReC19KY-ZOsBhdgYkwAe9ZWLc_I,8405
60
60
  ert/config/everest_control.py,sha256=-bwFEb_GpdodQ3N_BscQdcKatMlWBs8UVSCDURV8Q3s,8072
@@ -86,8 +86,8 @@ ert/config/parsing/_option_dict.py,sha256=7sMLIYYsq9onlEUsRZJsA5l1qIvHfZkwwqasSp
86
86
  ert/config/parsing/_read_file.py,sha256=QKMQSNG5J05AdTzy_VQiK5AQ26g0bDHyxlSSPqIhiDE,1935
87
87
  ert/config/parsing/config_dict.py,sha256=yyBb-NeaFnIjENrcziVA11Bq43uGguUiPECcKWLDg8w,52
88
88
  ert/config/parsing/config_errors.py,sha256=p3lAcRPXTm4okupdVyLwRCVWJ_86a7rgCohkDaLRM10,4806
89
- ert/config/parsing/config_keywords.py,sha256=Ub09FvpRuxjReqc81JMOLsTWVyCZbro0alvCQYyGmVw,1928
90
- ert/config/parsing/config_schema.py,sha256=XacwMh-PZqUUbt1g0AhKRPOGt44lRUvaMrVny2jYsV8,9846
89
+ ert/config/parsing/config_keywords.py,sha256=J8kgzDVhuM8jvCwzO1kfOxvOH_DnDASOZPaJZujcIgQ,1860
90
+ ert/config/parsing/config_schema.py,sha256=9ws2C3Oc-eT5uB_Xy2IEvPWON7b9rZnIc2FpID7hhWc,9614
91
91
  ert/config/parsing/config_schema_deprecations.py,sha256=Jz-dBgapEGuGutC7WCsaSTkqhLE9htm14lKlJ9QgGBQ,8605
92
92
  ert/config/parsing/config_schema_item.py,sha256=WOdE1fzEyIVMdiCzj4fJuqgEbC3Ivc7uR4gENEH2s6Q,14500
93
93
  ert/config/parsing/context_values.py,sha256=cNfiT1I93Y2g9rwAnS9jXKSqSDxI9-jZVOSwVMQHTZ0,2280
@@ -99,7 +99,7 @@ ert/config/parsing/forward_model_schema.py,sha256=m2a9rVVPbw8HusoIv5bgrGbnPVKt-9
99
99
  ert/config/parsing/history_source.py,sha256=z-DCe5TS3egxSXoK1kOIXC2IWL70kUhQNtzfTWsl8iU,141
100
100
  ert/config/parsing/hook_runtime.py,sha256=f1rRgYOXl6HY0acMNT0am5cdS-5cJFA0FnCausoEDmA,315
101
101
  ert/config/parsing/lark_parser.py,sha256=SS0yXTI5w_qmpFvePMO-r0g9NPqOOrlCFF3amPefnLM,15930
102
- ert/config/parsing/observations_parser.py,sha256=35l2UdX3mBPh51wOjyUnruo5FdH5YOxqQ1X6TuRMYyQ,6792
102
+ ert/config/parsing/observations_parser.py,sha256=idpvJGkP72eO3P95g3kwKjovZS9C1loDQAclDRlFAbU,6955
103
103
  ert/config/parsing/queue_system.py,sha256=2bFuVc1JSVyE3gnBnN4YsUXHfLHeWAtasnPPCu9Za_w,793
104
104
  ert/config/parsing/schema_dict.py,sha256=MWKhtLhdRvqfWm8oZatWFnAhiIU03DdQCOaX6A71068,4313
105
105
  ert/config/parsing/schema_item_type.py,sha256=LP6lXE7YihnAEVP3kCJ80kdpgH6Veu--xcPfgaqJhdc,653
@@ -120,7 +120,7 @@ ert/dark_storage/compute/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
120
120
  ert/dark_storage/compute/misfits.py,sha256=7dYyYIBH1Jt9g4bIsnHJbjR7mWcoeZpqqaHQMhd12OY,1374
121
121
  ert/dark_storage/endpoints/__init__.py,sha256=o093-GLgw8br7PDKhHna0LviXeJQdC5P1RoIW2xlLqs,895
122
122
  ert/dark_storage/endpoints/ensembles.py,sha256=22M358HTAjiNuKaRYp9FZ3SZvkWL3v9wMDD0DGwLF8M,1363
123
- ert/dark_storage/endpoints/experiment_server.py,sha256=snaCwRXayGn6_SIqH49Qmi4u1ZILiH2ynFZL6L4YsxQ,14118
123
+ ert/dark_storage/endpoints/experiment_server.py,sha256=36-ZnKQ2jGVLvig8Y4VRR1C1WfAkbRxwDLSTd7Lj-p4,14027
124
124
  ert/dark_storage/endpoints/experiments.py,sha256=_tY95HzW6ibJy7N9C-1XICFHSOrKdz4vM3bv7ePRvY8,3413
125
125
  ert/dark_storage/endpoints/observations.py,sha256=gnww5S1B9G8vAw7AwcR1fgW_vFgyf5WlU1gOSUXW1i4,4841
126
126
  ert/dark_storage/endpoints/parameters.py,sha256=LERil7H-L3ZsPGGFm97kvy3XeIqpceyBe5aSFLkSVEY,4406
@@ -140,7 +140,7 @@ ert/data/__init__.py,sha256=IXBVV2stoJkjY6JrFE2ELEj9eLGhkuovlNAcvtyNFJ0,69
140
140
  ert/data/_measured_data.py,sha256=L4tgVjCcEUTHeXmnAIeIjIS-4hD91ZZ4MGa6J47aTTo,5003
141
141
  ert/ensemble_evaluator/__init__.py,sha256=pnNNG9fhBvvVjxTJF7uvNs-WdLwwjvew7-wYP6u5G1I,646
142
142
  ert/ensemble_evaluator/_ensemble.py,sha256=2AwBONdgOaKJI3cjYFhKSFbQ0nP7qWt03WFv1dh81vo,6826
143
- ert/ensemble_evaluator/config.py,sha256=9JwfNpP8VITxquuqNr0qbJpYWkGG1L2aKoS3L9kw4T0,1950
143
+ ert/ensemble_evaluator/config.py,sha256=N1aByZ_nGVNLGNTtomPN0ceSYrEVR_h1d-IypmG5SoY,1868
144
144
  ert/ensemble_evaluator/evaluator.py,sha256=PdOHJlFynNIJXoeItSgUpMkCy9AOEOhfnHII7LeZ1r4,29240
145
145
  ert/ensemble_evaluator/event.py,sha256=97afkQRmU3xFtO_4xjp6qlilJ9Wq8rRoWs5SB_x7Lk4,1741
146
146
  ert/ensemble_evaluator/identifiers.py,sha256=H3qIRyAfYIdAY22OJx9_45HpZQFSuuWCpaXBY-co8eY,363
@@ -151,7 +151,7 @@ ert/exceptions/_exceptions.py,sha256=dv4rs5oWe00PcelvGEsTscD3AKhI1uwwSjprMSHk4xw
151
151
  ert/field_utils/__init__.py,sha256=bnjVYQq0A1lkTUSDUHU8pBtnkQmvdw-zrtFhUT41FW4,768
152
152
  ert/field_utils/field_file_format.py,sha256=QWDQYsba2zUfbMltBxReZqAZOYWkHb8kG_xY7BvBzO0,297
153
153
  ert/field_utils/field_utils.py,sha256=Z6mbMHLNyCPdPDyD01Z_myLXfiki3j9MkT08S4awVuk,16791
154
- ert/field_utils/grdecl_io.py,sha256=kgSE3Fyr_7KDS1HQRmO7RQLMwgrkgJ_Tsmo7jE9GE1s,8971
154
+ ert/field_utils/grdecl_io.py,sha256=QbRbcZIfNyRliMwyFwmUnMIHc4Za9-uUSitm4l3uT0k,9521
155
155
  ert/field_utils/roff_io.py,sha256=m4RX2134kVbEkuPjIY5OthavRe4kNirtL4jNdEf_xpU,4014
156
156
  ert/gui/__init__.py,sha256=Q-BjtVNAk8Kw2hcPMlCkbTOSjNZPzSX5xl0tFUUI2bY,689
157
157
  ert/gui/about_dialog.py,sha256=H0Jfso2v9s1eONTVgghH84UcaUlwVs0Cqqbv17Hvw4g,3127
@@ -238,7 +238,7 @@ ert/gui/simulation/ensemble_information_filter_panel.py,sha256=GafKsROmB2AmzvuR4
238
238
  ert/gui/simulation/ensemble_smoother_panel.py,sha256=kZ1i6BXQB7e1MnUp8dSmXCSPO9d_4r8_jARlDzUqVNI,6489
239
239
  ert/gui/simulation/evaluate_ensemble_panel.py,sha256=o5enKuNViMWRKUtEtzUqumcS8FHhGNkheYF3wji5EJs,4978
240
240
  ert/gui/simulation/experiment_config_panel.py,sha256=wDFwfJ6JtFZrQVd66qwakzsbSR3uhPOLfFszwg-bAXQ,850
241
- ert/gui/simulation/experiment_panel.py,sha256=f5KNFzAtVK6d62LzeGmCUok_A3ouPWtax428EPfcW1o,15534
241
+ ert/gui/simulation/experiment_panel.py,sha256=4FDBWWvUfbTDAJBNN3pT8sP02CdZKV6LwU8TMmNfg-Q,15303
242
242
  ert/gui/simulation/manual_update_panel.py,sha256=mhXKnNGJqR8NtXHFvWtDHRsrDA_SCwBbRsB38kIX1OU,6955
243
243
  ert/gui/simulation/multiple_data_assimilation_panel.py,sha256=O3sCbHFfzaVft2kSWcs3gVHeWa5DXhUvdhUBZM0xv_Y,14951
244
244
  ert/gui/simulation/queue_emitter.py,sha256=Rse2W2mL7NQBiYM3iYunRWN7hCCD_kHb1ThuO5ixxZQ,1916
@@ -263,7 +263,7 @@ ert/gui/tools/load_results/load_results_tool.py,sha256=deP__dGX8z5iycPMYv3cYyOta
263
263
  ert/gui/tools/manage_experiments/__init__.py,sha256=MAB41GPqlpALPYRvFFpKCcr2Sz3cya7Grd88jLxUj2A,99
264
264
  ert/gui/tools/manage_experiments/export_dialog.py,sha256=tWtttCLqr4T0HK9uEtM8JUubBLvytn_A2cZRZBvJ1AI,4485
265
265
  ert/gui/tools/manage_experiments/manage_experiments_panel.py,sha256=EUGOo68g8E9f4oG3K4MFRCu8a7rm7ojOF6jUvz_dqic,5680
266
- ert/gui/tools/manage_experiments/storage_info_widget.py,sha256=J3Xm59mQ6VIYTrwCkhKzZqojrBtncxgEI_f_nLfbFF4,19940
266
+ ert/gui/tools/manage_experiments/storage_info_widget.py,sha256=BFYJwIVqYmZI2Ke4a2rPdwL88sjQ0jiKL87bzUB3HDk,20098
267
267
  ert/gui/tools/manage_experiments/storage_model.py,sha256=wf5JPqvbFWLI9ZcVTc4gpZh3hUPDNwOxRdbdcRtjKCc,6802
268
268
  ert/gui/tools/manage_experiments/storage_widget.py,sha256=pe5mWOgw-uNGXaZYhl1JsF5--Krz1W4n3Ut4sRcx6uc,6692
269
269
  ert/gui/tools/plot/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -272,8 +272,8 @@ ert/gui/tools/plot/data_type_keys_widget.py,sha256=AgJh_7vfXFKzzzCMq8pxhldkzuhBt
272
272
  ert/gui/tools/plot/data_type_proxy_model.py,sha256=DGj7GsDwbvr2OUIudmQpdnoqtPeWyKVJHlctxl1TzzQ,2176
273
273
  ert/gui/tools/plot/plot_api.py,sha256=8nkfFZJENIrHI-yWwHnrg01AOjYGiV3eE1Qfj-7aUTI,16361
274
274
  ert/gui/tools/plot/plot_ensemble_selection_widget.py,sha256=WnXsI5SwIklPvlkJ_02qjv6T8pDhXVStiHqerD53u_4,7619
275
- ert/gui/tools/plot/plot_widget.py,sha256=w_avqCvBe68rvZXOa4WiFC2IsXSbIAYOGEZhHtzFeiA,7527
276
- ert/gui/tools/plot/plot_window.py,sha256=_9KgIi_jbNNUnOW80DkCJb1GACStYRQ7BZYAq2fE7Hs,17327
275
+ ert/gui/tools/plot/plot_widget.py,sha256=kQvX89b4z2TAwXIzRuDEDnfJNq-jMyTC8Lzyn8T0HwU,7755
276
+ ert/gui/tools/plot/plot_window.py,sha256=gZZCDLVcFJ-HPVYRaQcNQoYmJ3IRWEXi1_z6HJm97Es,17757
277
277
  ert/gui/tools/plot/customize/__init__.py,sha256=spAW99ubzOmWuScii_idW0frGDttKCcT4XQegF3vOSU,151
278
278
  ert/gui/tools/plot/customize/color_chooser.py,sha256=fxrXEFCCvHwJnE0pQMELIy0torqSNATnARx6hBgSV5E,2576
279
279
  ert/gui/tools/plot/customize/customization_view.py,sha256=er1PQnhePTs43dsB9gDV7nkMDV0tDmqFneHG7R5UDkM,5093
@@ -324,7 +324,7 @@ ert/logging/__init__.py,sha256=UfFNC5DUGRT81KyydbaZhh6QfvdOSdcekaH0tsaB6r8,3084
324
324
  ert/logging/logger.conf,sha256=eDQRTVb5tPhVgbuf7U6QU0xlsdctgO4N8IKWDJihMBE,970
325
325
  ert/logging/storage_log.conf,sha256=DIBxUK38K83tWuARlGxCCCZ5QkE7OvpJ8Oea6TyM1eU,1132
326
326
  ert/plugins/__init__.py,sha256=sVd-DAyIxxXknv5dhONtHsSQ5PYp79tFH20zI_Jp-TM,1514
327
- ert/plugins/plugin_manager.py,sha256=Ux0VDGkx4W5GOeMfyZwF9pnh0n22Qz_mR_XzoMGvzDs,15094
327
+ ert/plugins/plugin_manager.py,sha256=GF0foJ3sscCBDzCRU4ODBAxjS0F9nSA57VrZLyoM8RU,14907
328
328
  ert/plugins/plugin_response.py,sha256=ZWYIgkI09xTOZ8OgoQo33RfnTSm3OBGxoAMSgAUu-yY,364
329
329
  ert/plugins/hook_implementations/__init__.py,sha256=2-c5P2sOaZ0rzb2OEzE54Vm-0T62iAibAHVH-1tnmPk,321
330
330
  ert/plugins/hook_implementations/forward_model_steps.py,sha256=LlbZ0NbOFMw97AVcfK1kFQTu36N0s8QGtU__zOclhIs,22452
@@ -396,8 +396,8 @@ ert/services/_storage_main.py,sha256=adooB5K2atXhX-rM5jFrEUJHly0ZSAQymhTndm7qhpk
396
396
  ert/services/ert_server.py,sha256=qIzqugIHcxwKuzjkItiMt3jah3hNI7x3NQ3p_WBBf_o,10768
397
397
  ert/services/webviz_ert_service.py,sha256=J5vznqb_-DjlDMOze7tdvuBE4GWEPgJ5dIIXvRLKd0Y,650
398
398
  ert/shared/__init__.py,sha256=OwgL-31MxA0fabETJ5Svw0tqJpHi569CZDRFHdHiqA0,644
399
- ert/shared/net_utils.py,sha256=Wp9Qyd5wWNHPU0Myh1GCbUONu0a-akYEdJ07MjQJt4I,6130
400
- ert/shared/version.py,sha256=l535qCMHPX_OouidXmZZfWhYSl0-tdcRVCWcfczt7-0,724
399
+ ert/shared/net_utils.py,sha256=DDHIZLHdBnh7ZZ--1s-FUlsoNTSJJsfHmLQE44E2JqU,5324
400
+ ert/shared/version.py,sha256=6aEtsHZNo85BiGgopmGsgUXYXdpTnRpFd9CZ2FT8eZ0,714
401
401
  ert/shared/_doc_utils/__init__.py,sha256=09KMJxjza26BXouUy6yJmMiSuYFGSI6c8nZ-1_qXh90,995
402
402
  ert/shared/_doc_utils/ert_jobs.py,sha256=uHP8ozhKwCHG6BkyhAgCGoy59JEFb102pHKot-5ZEys,8054
403
403
  ert/shared/_doc_utils/everest_jobs.py,sha256=uBDN7tIwlBJIZVZ6ZFL1tkewEJJGDLoeVrFIIrJznvM,2081
@@ -414,9 +414,9 @@ ert/shared/storage/connection.py,sha256=Y5P8B8B__j3doE9UE-1QROFYwrLcrmFcG80LhGTd
414
414
  ert/shared/storage/extraction.py,sha256=52Nyh2SITXIglEBMIRcW2a_iqJL3OdAf_dWMY0plTZE,1307
415
415
  ert/storage/__init__.py,sha256=f4uzzomaB1TpFpzGMF2Jd_PV54lq4EfkiZzQApDBuPQ,2110
416
416
  ert/storage/load_status.py,sha256=7h_GdA2qYGgQ-M5AOIo7xG43ljwzEEgbRb7vg0xSYEE,304
417
- ert/storage/local_ensemble.py,sha256=m3p8pUG8mYzYO8l_tnhjlVvhQwvPp97ztUNDO4Zjd1s,50965
417
+ ert/storage/local_ensemble.py,sha256=t88F0ZdmduD6_tUhc78X1HxhEXuJUZnRaIQicdq42yk,51513
418
418
  ert/storage/local_experiment.py,sha256=JNdTQWn0jJLqN8pYeh4XbuSxxiTN5Qbc0nkJzzgjhAU,16871
419
- ert/storage/local_storage.py,sha256=oDdhtQkuKXrmXiFX-RKSoyfHwSWkS1M61yZZvmJQJQ0,24011
419
+ ert/storage/local_storage.py,sha256=Ni2IThA8jWeRsYmF1n56cHjcDIx4GTCZR2mo0kyFqjE,24107
420
420
  ert/storage/mode.py,sha256=GJBlRSqS0Q06qDvaAztdcG-oV2MLsVID2Mo3OgQKjUw,2470
421
421
  ert/storage/realization_storage_state.py,sha256=JdiBr__Ce5e1MzmRsRdMuwgCtiuHZRjsQ-as8ivTX7Q,220
422
422
  ert/storage/migration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -432,6 +432,8 @@ ert/storage/migration/to18.py,sha256=R6ou46jS-R03WJKB4ZeHTehzTsxH4df2QsJ9wczeQPk
432
432
  ert/storage/migration/to19.py,sha256=1FmfNeXBW149W07u78AyU39g57TXXNl-fG9c4kqlIpU,1090
433
433
  ert/storage/migration/to20.py,sha256=DZ79hfJxdbaewP4W8TyRdsQvi-FkeSco_0uZKBdyD_4,697
434
434
  ert/storage/migration/to21.py,sha256=ArUePLN6placVlgKFS2Fi1kWD4qQZ1bsJGOxYMmhCP0,811
435
+ ert/storage/migration/to22.py,sha256=UxPy5i5o0UzNk9chY024PmwbHMdJCXCngmsquG_yGkI,622
436
+ ert/storage/migration/to23.py,sha256=ynhYCm1yZEUvCmJpSBNrElzpGLOKpb29IjSe-Dd8azg,1740
435
437
  ert/storage/migration/to6.py,sha256=Pj9lVCyPCOP0-dt4uypsZtS5Awbc8B7oaySu_VTwnnA,1514
436
438
  ert/storage/migration/to7.py,sha256=hV5lLfaQegyvxsy_lWfsiQAYVPCvS8Oe0fYc_fvKXzY,4500
437
439
  ert/storage/migration/to8.py,sha256=VL7A5KWTSFhBWmx3n-vCKBaEd2U8SUqyz8vPieyVd9E,5390
@@ -452,8 +454,8 @@ ert/validation/string_definition.py,sha256=r7DF4zLInIMqXb7jtPL646rAGXrPwdHKByQL3
452
454
  ert/validation/validation_status.py,sha256=f47_B7aS-9DEh6uaVzKxD97pXienkyTVVCqTytZy8BQ,722
453
455
  ert/warnings/__init__.py,sha256=IBwQVkdD7Njaad9PAB-9K-kr15wnA4EBKboxyqgu9NA,214
454
456
  ert/warnings/_warnings.py,sha256=7qhNZ0W4nnljzoOx6AXX7VlMv5pa34Ek5M5n1Ep0Kak,189
455
- ert/warnings/specific_warning_handler.py,sha256=5dVXtOhzcMmtPBGx4AOddXNPfzTFOPA7RVtdH8hLv68,932
456
- ert-19.0.0rc3.dist-info/licenses/COPYING,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
457
+ ert/warnings/specific_warning_handler.py,sha256=PnXYgBl95ZHCRvf_ylLw4NBx0WD6MEhViqNlUFwJ1us,996
458
+ ert-19.0.1.dist-info/licenses/COPYING,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
457
459
  everest/__init__.py,sha256=8_f50f6H3-onqaiuNCwC0Eiotdl9JuTxhwyF_54MVvU,306
458
460
  everest/config_file_loader.py,sha256=rOHYvB4ayB2MaKdaAynvJVtbCOqi_z25EdwEqJ02-DQ,5675
459
461
  everest/everest_storage.py,sha256=c3sgU7-3BDSRXxJfCR_4F58rWEaoII1wygz6VvM-GGI,42025
@@ -517,8 +519,8 @@ everest/templates/well_drill.tmpl,sha256=9iLexmBHMsMQNXyyRK4GlmVuVpVIxRcCHpy1av5
517
519
  everest/templates/well_order.tmpl,sha256=XJ1eVRkeyTdLu5sLsltJSSK6BDLN7rFOAqLdM3ZZy3w,75
518
520
  everest/util/__init__.py,sha256=xEYLz6pUtgkH8VHer1RfoCwKiO70dBnuhHonsOPaOx0,1359
519
521
  everest/util/forward_models.py,sha256=JPxHhLI6TrmQJwW50wwGBmw57TfRd8SG2svYhXFHrc8,1617
520
- ert-19.0.0rc3.dist-info/METADATA,sha256=SRYfiXI2kEriVA505ALyGhUxZSM7zaUzkO4BnCdBwoY,10015
521
- ert-19.0.0rc3.dist-info/WHEEL,sha256=qELbo2s1Yzl39ZmrAibXA2jjPLUYfnVhUNTlyF1rq0Y,92
522
- ert-19.0.0rc3.dist-info/entry_points.txt,sha256=ChZ7vn8Qy9v9rT8GM2JtAvWDN3NVoy4BIcvVRtU73CM,189
523
- ert-19.0.0rc3.dist-info/top_level.txt,sha256=LRh9GfdfyDWfAGmrQgp_XdoMHA4v6aotw8xgsy5YyHE,17
524
- ert-19.0.0rc3.dist-info/RECORD,,
522
+ ert-19.0.1.dist-info/METADATA,sha256=OoBJtNovlHFnC-QCKzY1w-sPH3Om-oTdzLOZIJDQZqo,10012
523
+ ert-19.0.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
524
+ ert-19.0.1.dist-info/entry_points.txt,sha256=ChZ7vn8Qy9v9rT8GM2JtAvWDN3NVoy4BIcvVRtU73CM,189
525
+ ert-19.0.1.dist-info/top_level.txt,sha256=LRh9GfdfyDWfAGmrQgp_XdoMHA4v6aotw8xgsy5YyHE,17
526
+ ert-19.0.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.10.1)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5