ert 19.0.0__py3-none-any.whl → 19.0.0rc0__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.
@@ -2,7 +2,6 @@ from __future__ import annotations
2
2
 
3
3
  import functools
4
4
  import logging
5
- import re
6
5
  import time
7
6
  import warnings
8
7
  from collections.abc import Callable, Iterable, Sequence
@@ -442,12 +441,6 @@ def smoother_update(
442
441
  with warnings.catch_warnings():
443
442
  original_showwarning = warnings.showwarning
444
443
 
445
- ILL_CONDITIONED_RE = re.compile(
446
- r"^LinAlgWarning:.*ill[- ]?conditioned\s+matrix", re.IGNORECASE
447
- )
448
- LIMIT_ILL_CONDITIONED_WARNING = 1000
449
- illconditioned_warn_counter = 0
450
-
451
444
  def log_warning(
452
445
  message: Warning | str,
453
446
  category: type[Warning],
@@ -456,18 +449,12 @@ def smoother_update(
456
449
  file: TextIO | None = None,
457
450
  line: str | None = None,
458
451
  ) -> None:
459
- nonlocal illconditioned_warn_counter
460
-
461
- if ILL_CONDITIONED_RE.search(str(message)):
462
- illconditioned_warn_counter += 1
463
-
464
- if illconditioned_warn_counter < LIMIT_ILL_CONDITIONED_WARNING:
465
- logger.warning(
466
- f"{category.__name__}: {message} (from {filename}:{lineno})"
467
- )
468
- original_showwarning(
469
- message, category, filename, lineno, file=file, line=line
470
- )
452
+ logger.warning(
453
+ f"{category.__name__}: {message} (from {filename}:{lineno})"
454
+ )
455
+ original_showwarning(
456
+ message, category, filename, lineno, file=file, line=line
457
+ )
471
458
 
472
459
  warnings.showwarning = log_warning
473
460
  analysis_ES(
@@ -36,7 +36,7 @@ if TYPE_CHECKING:
36
36
 
37
37
 
38
38
  DEFAULT_TIME_DELTA = timedelta(seconds=30)
39
- DEFAULT_LOCALIZATION_RADIUS = 3000
39
+ DEFAULT_LOCATION_RANGE_M = 3000
40
40
 
41
41
 
42
42
  def create_observation_dataframes(
@@ -205,9 +205,6 @@ 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),
211
208
  }
212
209
  )
213
210
 
@@ -300,7 +297,40 @@ def _get_restart(
300
297
 
301
298
 
302
299
  def _has_localization(summary_dict: SummaryObservation) -> bool:
303
- return summary_dict.east is not None and summary_dict.north is not None
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
+ )
304
334
 
305
335
 
306
336
  def _handle_summary_observation(
@@ -340,24 +370,23 @@ def _handle_summary_observation(
340
370
  "Observation uncertainty must be strictly > 0", summary_key
341
371
  ) from None
342
372
 
343
- localization_radius = (
344
- summary_dict.radius or DEFAULT_LOCALIZATION_RADIUS
345
- if _has_localization(summary_dict)
346
- else None
347
- )
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
+ )
348
388
 
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
- )
389
+ return pl.DataFrame(data_dict)
361
390
 
362
391
 
363
392
  def _handle_general_observation(
@@ -485,11 +514,6 @@ def _handle_general_observation(
485
514
  "index": pl.Series(indices, dtype=pl.UInt16),
486
515
  "observations": pl.Series(values, dtype=pl.Float32),
487
516
  "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),
493
517
  }
494
518
  )
495
519
 
@@ -532,6 +556,5 @@ def _handle_rft_observation(
532
556
  "tvd": pl.Series([location[2]], dtype=pl.Float32),
533
557
  "observations": pl.Series([rft_observation.value], dtype=pl.Float32),
534
558
  "std": pl.Series([rft_observation.error], dtype=pl.Float32),
535
- "radius": pl.Series([None], dtype=pl.Float32),
536
559
  }
537
560
  )
@@ -1,4 +1,5 @@
1
1
  import os
2
+ from collections import Counter
2
3
  from collections.abc import Sequence
3
4
  from dataclasses import dataclass
4
5
  from enum import StrEnum
@@ -89,9 +90,9 @@ class _SummaryValues:
89
90
  name: str
90
91
  value: float
91
92
  key: str #: The :term:`summary key` in the summary response
92
- east: float | None = None
93
- north: float | None = None
94
- radius: float | None = None
93
+ location_x: float | None = None
94
+ location_y: float | None = None
95
+ location_range: float | None = None
95
96
 
96
97
 
97
98
  @dataclass
@@ -103,7 +104,7 @@ class SummaryObservation(ObservationDate, _SummaryValues, ObservationError):
103
104
 
104
105
  date_dict: ObservationDate = ObservationDate()
105
106
  float_values: dict[str, float] = {"ERROR_MIN": 0.1}
106
- localization_values: dict[str, float | None] = {}
107
+ localization_values: dict[str, float] = {}
107
108
  for key, value in observation_dict.items():
108
109
  match key:
109
110
  case "type" | "name":
@@ -124,15 +125,12 @@ class SummaryObservation(ObservationDate, _SummaryValues, ObservationError):
124
125
  summary_key = value
125
126
  case "DATE":
126
127
  date_dict.date = value
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
- )
128
+ case "LOCATION_X":
129
+ localization_values["x"] = validate_float(value, key)
130
+ case "LOCATION_Y":
131
+ localization_values["y"] = validate_float(value, key)
132
+ case "LOCATION_RANGE":
133
+ localization_values["range"] = validate_float(value, key)
136
134
  case _:
137
135
  raise _unknown_key_error(str(key), observation_dict["name"])
138
136
  if "VALUE" not in float_values:
@@ -149,9 +147,9 @@ class SummaryObservation(ObservationDate, _SummaryValues, ObservationError):
149
147
  error_min=float_values["ERROR_MIN"],
150
148
  key=summary_key,
151
149
  value=float_values["VALUE"],
152
- east=localization_values.get("east"),
153
- north=localization_values.get("north"),
154
- radius=localization_values.get("radius"),
150
+ location_x=localization_values.get("x"),
151
+ location_y=localization_values.get("y"),
152
+ location_range=localization_values.get("range"),
155
153
  **date_dict.__dict__,
156
154
  )
157
155
 
@@ -326,9 +324,25 @@ def make_observations(
326
324
  if error_list:
327
325
  raise ObservationConfigError.from_collected(error_list)
328
326
 
327
+ _validate_unique_names(result)
329
328
  return result
330
329
 
331
330
 
331
+ def _validate_unique_names(
332
+ observations: Sequence[Observation],
333
+ ) -> None:
334
+ names_counter = Counter(d.name for d in observations)
335
+ duplicate_names = [n for n, c in names_counter.items() if c > 1]
336
+ errors = [
337
+ ErrorInfo(
338
+ f"Duplicate observation name {n}",
339
+ ).set_context(n)
340
+ for n in duplicate_names
341
+ ]
342
+ if errors:
343
+ raise ObservationConfigError.from_collected(errors)
344
+
345
+
332
346
  def _validate_segment_dict(name_token: str, inp: dict[str, Any]) -> Segment:
333
347
  start = None
334
348
  stop = None
@@ -401,19 +415,6 @@ def validate_positive_float(val: str, key: str) -> float:
401
415
  return v
402
416
 
403
417
 
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
-
417
418
  def validate_positive_int(val: str, key: str) -> int:
418
419
  try:
419
420
  v = int(val)
ert/config/ert_config.py CHANGED
@@ -688,14 +688,6 @@ def log_observation_keys(
688
688
  if key not in {"name", "type"}
689
689
  )
690
690
 
691
- if "HISTORY_OBSERVATION" in observation_type_counts:
692
- msg = (
693
- "HISTORY_OBSERVATION is deprecated and will be removed. "
694
- "Please use SUMMARY_OBSERVATION instead."
695
- )
696
- ConfigWarning.warn(msg)
697
- logger.warning(msg)
698
-
699
691
  logger.info(
700
692
  f"Count of observation types:\n\t{dict(observation_type_counts)}\n"
701
693
  f"Count of observation keywords:\n\t{dict(observation_keyword_counts)}"
@@ -217,4 +217,15 @@ deprecated_keywords_list = [
217
217
  ),
218
218
  check=lambda line: line[0] == "DESIGN2PARAMS",
219
219
  ),
220
+ DeprecationInfo(
221
+ keyword="FORWARD_MODEL",
222
+ message=(
223
+ "FORWARD_MODEL DESIGN_KW will be replaced with RUN_TEMPLATE. "
224
+ "DESIGN2PARAMS has been replaced by DESIGN_MATRIX, so the "
225
+ "parameters are already available for magic string replacement "
226
+ "with the RUN_TEMPLATE keyword. Please use this format: "
227
+ "'RUN_TEMPLATE my_text_file_template.txt my_text_output_file.txt'"
228
+ ),
229
+ check=lambda line: line[0] == "DESIGN_KW",
230
+ ),
220
231
  ]
@@ -138,7 +138,6 @@ observations_parser = Lark(
138
138
  PARAMETER_NAME : CHAR+
139
139
  object : "{" [(declaration";")*] "}"
140
140
  ?declaration: "SEGMENT" STRING object -> segment
141
- | "LOCALIZATION" object -> localization
142
141
  | pair
143
142
  pair : PARAMETER_NAME "=" value
144
143
 
@@ -194,11 +193,6 @@ class TreeToObservations(Transformer[FileContextToken, list[ObservationDict]]):
194
193
  def segment(tree):
195
194
  return (("SEGMENT", tree[0]), tree[1])
196
195
 
197
- @staticmethod
198
- @no_type_check
199
- def localization(tree):
200
- return ("LOCALIZATION", tree[0])
201
-
202
196
  @staticmethod
203
197
  @no_type_check
204
198
  def object(tree):
@@ -84,7 +84,6 @@ async def get_observations_for_response(
84
84
  ensemble.experiment,
85
85
  obs_keys,
86
86
  json.loads(filter_on) if filter_on is not None else None,
87
- requested_response_type=response_type,
88
87
  )
89
88
  if not obss:
90
89
  return []
@@ -108,17 +107,10 @@ def _get_observations(
108
107
  experiment: Experiment,
109
108
  observation_keys: list[str] | None = None,
110
109
  filter_on: dict[str, Any] | None = None,
111
- requested_response_type: str | None = None,
112
110
  ) -> list[dict[str, Any]]:
113
111
  observations = []
114
112
 
115
- for stored_response_type, df in experiment.observations.items():
116
- if (
117
- requested_response_type is not None
118
- and stored_response_type != requested_response_type
119
- ):
120
- continue
121
-
113
+ for response_type, df in experiment.observations.items():
122
114
  if observation_keys is not None:
123
115
  df = df.filter(pl.col("observation_key").is_in(observation_keys))
124
116
 
@@ -135,7 +127,7 @@ def _get_observations(
135
127
  if df.is_empty():
136
128
  continue
137
129
 
138
- x_axis_fn = response_to_pandas_x_axis_fns[stored_response_type]
130
+ x_axis_fn = response_to_pandas_x_axis_fns[response_type]
139
131
  df = df.rename(
140
132
  {
141
133
  "observation_key": "name",
@@ -1,6 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- import io
4
3
  import operator
5
4
  import os
6
5
  from collections.abc import Iterator
@@ -258,9 +257,6 @@ def import_bgrdecl(
258
257
  raise ValueError(f"Did not find field parameter {field_name} in {file_path}")
259
258
 
260
259
 
261
- _BUFFER_SIZE = 2**20 # 1.04 megabytes
262
-
263
-
264
260
  def export_grdecl(
265
261
  values: np.ma.MaskedArray[Any, np.dtype[np.float32]] | npt.NDArray[np.float32],
266
262
  file_path: str | os.PathLike[str],
@@ -275,25 +271,12 @@ def export_grdecl(
275
271
  if binary:
276
272
  resfo.write(file_path, [(param_name.ljust(8), values.astype(np.float32))])
277
273
  else:
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")
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")
ert/gui/main.py CHANGED
@@ -29,6 +29,7 @@ from ert.gui.tools.event_viewer import (
29
29
  from ert.namespace import Namespace
30
30
  from ert.plugins import ErtRuntimePlugins, get_site_plugins
31
31
  from ert.services import ErtServer
32
+ from ert.shared import __version__
32
33
  from ert.storage import (
33
34
  ErtStorageException,
34
35
  LocalStorage,
@@ -171,10 +172,9 @@ def _start_initial_gui_window(
171
172
  None,
172
173
  f"Migrate storage to version {current_version}?",
173
174
  f"Ert storage is version {storage_version} and needs to be migrated"
174
- f" to version {current_version} to be compatible with the current"
175
- f" version of Ert\n\n"
176
- f"After migration, this storage can only be opened with current or"
177
- f" later versions of Ert\n\n"
175
+ f" to version {current_version} to be able to continue\n\n"
176
+ f"After migration, this storage can only be opened with Ert"
177
+ f" version {__version__} or newer\n\n"
178
178
  "Do you wish to continue migrating storage?\n",
179
179
  QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No,
180
180
  )
@@ -360,10 +360,6 @@ class ExperimentPanel(QWidget):
360
360
  return
361
361
  QApplication.restoreOverrideCursor()
362
362
 
363
- self.configuration_summary.log_summary(
364
- args.mode, model.get_number_of_active_realizations()
365
- )
366
-
367
363
  self._dialog = RunDialog(
368
364
  f"Experiment - {self._config_file} {find_ert_info()}",
369
365
  model.api,
ert/gui/summarypanel.py CHANGED
@@ -1,6 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- import logging
4
3
  from typing import TYPE_CHECKING, Any
5
4
 
6
5
  from PyQt6.QtCore import Qt
@@ -19,8 +18,6 @@ from ert.gui.ertwidgets import ErtSummary
19
18
  if TYPE_CHECKING:
20
19
  from ert.config import ErtConfig
21
20
 
22
- logger = logging.getLogger(__name__)
23
-
24
21
 
25
22
  class SummaryTemplate:
26
23
  def __init__(self, title: str) -> None:
@@ -126,22 +123,6 @@ class SummaryPanel(QFrame):
126
123
 
127
124
  self._layout.addLayout(layout)
128
125
 
129
- def log_summary(self, run_model: str, num_realizations: int) -> None:
130
- summary = ErtSummary(self.config)
131
-
132
- observations = summary.getObservations()
133
- observations_count = sum(e["count"] for e in observations)
134
-
135
- _, parameter_count = summary.get_parameters()
136
-
137
- logger.info(
138
- f"Experiment summary:\n"
139
- f"Runmodel: {run_model}\n"
140
- f"Realizations: {num_realizations}\n"
141
- f"Parameters: {parameter_count}\n"
142
- f"Observations: {observations_count}"
143
- )
144
-
145
126
  @staticmethod
146
127
  def _runlength_encode_list(strings: list[str]) -> list[tuple[str, int]]:
147
128
  """Runlength encode a list of strings.
@@ -11,7 +11,6 @@ from polars import DataFrame
11
11
  from PyQt6.QtCore import Qt
12
12
  from PyQt6.QtCore import pyqtSlot as Slot
13
13
  from PyQt6.QtWidgets import (
14
- QAbstractItemView,
15
14
  QFrame,
16
15
  QHBoxLayout,
17
16
  QLabel,
@@ -166,9 +165,6 @@ class _EnsembleWidget(QWidget):
166
165
  observations_frame.setLayout(observations_layout)
167
166
 
168
167
  self._parameters_table = QTableWidget()
169
- self._parameters_table.setEditTriggers(
170
- QAbstractItemView.EditTrigger.NoEditTriggers
171
- )
172
168
  self._export_params_button = QPushButton("Export...")
173
169
  self._export_params_button.clicked.connect(self.onClickExportParameters)
174
170
 
@@ -223,12 +219,9 @@ class _EnsembleWidget(QWidget):
223
219
  return
224
220
 
225
221
  observation_key = selected.data(1, Qt.ItemDataRole.DisplayRole)
226
- parent = selected.parent()
227
-
228
- if not observation_key or not parent:
222
+ if not observation_key:
229
223
  return
230
224
 
231
- response_type = parent.data(0, Qt.ItemDataRole.UserRole)
232
225
  observation_label = selected.data(0, Qt.ItemDataRole.DisplayRole)
233
226
  assert self._ensemble is not None
234
227
  observations_dict = self._ensemble.experiment.observations
@@ -238,7 +231,17 @@ class _EnsembleWidget(QWidget):
238
231
  ax.set_title(observation_key)
239
232
  ax.grid(True)
240
233
 
241
- obs_for_type = observations_dict[response_type]
234
+ response_type, obs_for_type = next(
235
+ (
236
+ (response_type, df)
237
+ for response_type, df in observations_dict.items()
238
+ if observation_key in df["observation_key"]
239
+ ),
240
+ (None, None),
241
+ )
242
+
243
+ assert response_type is not None
244
+ assert obs_for_type is not None
242
245
 
243
246
  response_config = self._ensemble.experiment.response_configuration[
244
247
  response_type
@@ -370,23 +373,14 @@ class _EnsembleWidget(QWidget):
370
373
  .to_numpy()
371
374
  ):
372
375
  match_list = self._observations_tree_widget.findItems(
373
- response_key, Qt.MatchFlag.MatchExactly, 0
376
+ response_key, Qt.MatchFlag.MatchExactly
374
377
  )
375
-
376
- root = next(
377
- (
378
- item
379
- for item in match_list
380
- if item.data(0, Qt.ItemDataRole.UserRole) == response_type
381
- ),
382
- None,
383
- )
384
-
385
- if root is None:
378
+ if len(match_list) == 0:
386
379
  root = QTreeWidgetItem(
387
380
  self._observations_tree_widget, [response_key]
388
381
  )
389
- root.setData(0, Qt.ItemDataRole.UserRole, response_type)
382
+ else:
383
+ root = match_list[0]
390
384
 
391
385
  obs_ds = obs_ds_for_type.filter(
392
386
  pl.col("observation_key").eq(obs_key)
@@ -402,7 +396,9 @@ class _EnsembleWidget(QWidget):
402
396
  ],
403
397
  )
404
398
 
405
- self._observations_tree_widget.sortItems(0, Qt.SortOrder.AscendingOrder)
399
+ self._observations_tree_widget.sortItems(
400
+ 0, Qt.SortOrder.AscendingOrder
401
+ )
406
402
 
407
403
  for i in range(self._observations_tree_widget.topLevelItemCount()):
408
404
  item = self._observations_tree_widget.topLevelItem(i)
@@ -163,7 +163,6 @@ class PlotWidget(QWidget):
163
163
  vbox.addSpacing(8)
164
164
  self.setLayout(vbox)
165
165
 
166
- self._negative_values_in_data = False
167
166
  self._dirty = True
168
167
  self._active = False
169
168
  self.resetPlot()
@@ -176,15 +175,11 @@ class PlotWidget(QWidget):
176
175
  self._figure.clear()
177
176
 
178
177
  def _sync_log_checkbox(self) -> None:
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
- ):
178
+ if type(self._plotter).__name__ in {
179
+ "HistogramPlot",
180
+ "DistributionPlot",
181
+ "GaussianKDEPlot",
182
+ }:
188
183
  self._log_checkbox.setVisible(True)
189
184
  else:
190
185
  self._log_checkbox.setVisible(False)
@@ -203,11 +198,8 @@ class PlotWidget(QWidget):
203
198
  ) -> None:
204
199
  self.resetPlot()
205
200
  try:
206
- self._sync_log_checkbox()
207
201
  plot_context.log_scale = (
208
- self._log_checkbox.isVisible()
209
- and self._log_checkbox.isChecked()
210
- and self._negative_values_in_data is False
202
+ self._log_checkbox.isVisible() and self._log_checkbox.isChecked()
211
203
  )
212
204
  self._plotter.plot(
213
205
  self._figure,
@@ -218,6 +210,7 @@ class PlotWidget(QWidget):
218
210
  key_def,
219
211
  )
220
212
  self._canvas.draw()
213
+ self._sync_log_checkbox()
221
214
  except Exception as e:
222
215
  exc_type, _, exc_tb = sys.exc_info()
223
216
  sys.stderr.write("-" * 80 + "\n")
@@ -284,15 +284,6 @@ 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
296
287
  observations = None
297
288
  if key_def.observations and selected_ensembles:
298
289
  try:
@@ -253,8 +253,28 @@ class RunModel(RunModelConfig, ABC):
253
253
  for key, value in self.__dict__.items()
254
254
  if key not in keys_to_drop
255
255
  }
256
+ settings_summary = {
257
+ "run_model": self.name(),
258
+ "num_realizations": self.runpath_config.num_realizations,
259
+ "num_active_realizations": self.active_realizations.count(True),
260
+ "num_parameters": (
261
+ sum(
262
+ len(param_config.parameter_keys)
263
+ for param_config in self.parameter_configuration
264
+ )
265
+ if hasattr(self, "parameter_configuration")
266
+ else "NA"
267
+ ),
268
+ "localization": getattr(
269
+ settings_dict.get("analysis_settings", {}), "localization", "NA"
270
+ ),
271
+ }
256
272
 
257
- logger.info(f"Running '{self.name()}'\n\nSettings: {settings_dict}")
273
+ logger.info(
274
+ f"Running '{self.name()}'\n\n"
275
+ f"Settings summary: {settings_summary}\n\n"
276
+ f"Settings: {settings_dict}"
277
+ )
258
278
 
259
279
  @field_validator("env_vars", mode="after")
260
280
  @classmethod
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.0'
32
- __version_tuple__ = version_tuple = (19, 0, 0)
31
+ __version__ = version = '19.0.0rc0'
32
+ __version_tuple__ = version_tuple = (19, 0, 0, 'rc0')
33
33
 
34
- __commit_id__ = commit_id = 'g2518c4485'
34
+ __commit_id__ = commit_id = 'gacbd663a0'
@@ -679,9 +679,6 @@ 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
- )
685
682
  complete_df = (
686
683
  complete_df.join(ds, on="realization", how="left")
687
684
  .unique(subset=["realization"], keep="first")
@@ -1099,11 +1096,6 @@ class LocalEnsemble(BaseMode):
1099
1096
  on=["response_key", *response_cls.primary_key],
1100
1097
  )
1101
1098
 
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
- )
1107
1099
  joined = (
1108
1100
  joined.with_columns(
1109
1101
  pl.concat_str(
@@ -1113,7 +1105,7 @@ class LocalEnsemble(BaseMode):
1113
1105
  # Avoid potential collisions w/ primary key
1114
1106
  )
1115
1107
  )
1116
- .drop(primary_keys_to_drop)
1108
+ .drop(response_cls.primary_key)
1117
1109
  .rename({"__tmp_index_key__": "index"})
1118
1110
  )
1119
1111
 
@@ -1129,9 +1121,6 @@ class LocalEnsemble(BaseMode):
1129
1121
  "observation_key",
1130
1122
  "observations",
1131
1123
  "std",
1132
- "east",
1133
- "north",
1134
- "radius",
1135
1124
  ]
1136
1125
  )
1137
1126
 
@@ -31,7 +31,7 @@ from .realization_storage_state import RealizationStorageState
31
31
 
32
32
  logger = logging.getLogger(__name__)
33
33
 
34
- _LOCAL_STORAGE_VERSION = 23
34
+ _LOCAL_STORAGE_VERSION = 21
35
35
 
36
36
 
37
37
  class _Migrations(BaseModel):
@@ -517,8 +517,6 @@ class LocalStorage(BaseMode):
517
517
  to19,
518
518
  to20,
519
519
  to21,
520
- to22,
521
- to23,
522
520
  )
523
521
 
524
522
  try:
@@ -569,8 +567,6 @@ class LocalStorage(BaseMode):
569
567
  18: to19,
570
568
  19: to20,
571
569
  20: to21,
572
- 21: to22,
573
- 22: to23,
574
570
  }
575
571
  for from_version in range(version, _LOCAL_STORAGE_VERSION):
576
572
  migrations[from_version].migrate(self.path)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ert
3
- Version: 19.0.0
3
+ Version: 19.0.0rc0
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
@@ -32,7 +32,7 @@ ert/trace.py,sha256=m2ZjKd1nf7LjBM2lL0fk1cNF04HnQs8blZhQbTXgcB0,1274
32
32
  ert/workflow_runner.py,sha256=3x0k6D_2euNLf2YbjjIPwICz7q7OvrvIoKUQuBcBsuc,7334
33
33
  ert/analysis/__init__.py,sha256=NNLGQG9gex6lJ8IZjEg_tXTfSeJceRA9zjOek-UeY0Y,591
34
34
  ert/analysis/_enif_update.py,sha256=Oh9oUiMLbBT8o3TPl9x3ZR24gqBpIn6nFPwrOjMNtnY,7654
35
- ert/analysis/_es_update.py,sha256=cKwkJu-iTeQArQcW5NrAGhSASTBQJHMCieuLj5_p9ho,17107
35
+ ert/analysis/_es_update.py,sha256=tav1ku3uqPBPDqDfVzsMS1gi5Zn0lRk_oXqt2LZolPs,16592
36
36
  ert/analysis/_update_commons.py,sha256=y2MYW_B02TDBcnuPJBh3WWqBCUmL0f9JoZ8nB_-K0pQ,12375
37
37
  ert/analysis/event.py,sha256=vBYqtTl5DXePPWHTLX9bROmGTD2ixcrQh4K07g-UikM,2248
38
38
  ert/analysis/misfit_preprocessor.py,sha256=2MjlL2yIg5KQpqWiD3675-hoy_5QM49pWQ7VXK4rous,8001
@@ -42,10 +42,10 @@ ert/cli/main.py,sha256=oWiIUF5r2E1QOforFY-nQ2k3mrE74EDqrk8QcjcdfmE,6567
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=FHwTXR6awIFkVxdxOGdy6QQuar_lz4C7oBw_lPCox8E,19099
45
+ ert/config/_create_observation_dataframes.py,sha256=P-cyJlushUR4Em58rRAsmK3jw3PoYhbqsT5qsHrpL7c,19717
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=nm6GsFAwh16anXDuz04p9jn6sT4hd233Do7H__QpATY,15000
48
+ ert/config/_observations.py,sha256=EUWQCEMqEpJgmQYvGrvyOIF25nu6w566XV-vw7QPqjU,14814
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=_UXsCXU_aV_IBqfQEuDGOT9ylopjpWrThDaYVwIWweA,57147
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
@@ -88,7 +88,7 @@ ert/config/parsing/config_dict.py,sha256=yyBb-NeaFnIjENrcziVA11Bq43uGguUiPECcKWL
88
88
  ert/config/parsing/config_errors.py,sha256=p3lAcRPXTm4okupdVyLwRCVWJ_86a7rgCohkDaLRM10,4806
89
89
  ert/config/parsing/config_keywords.py,sha256=Ub09FvpRuxjReqc81JMOLsTWVyCZbro0alvCQYyGmVw,1928
90
90
  ert/config/parsing/config_schema.py,sha256=XacwMh-PZqUUbt1g0AhKRPOGt44lRUvaMrVny2jYsV8,9846
91
- ert/config/parsing/config_schema_deprecations.py,sha256=Jz-dBgapEGuGutC7WCsaSTkqhLE9htm14lKlJ9QgGBQ,8605
91
+ ert/config/parsing/config_schema_deprecations.py,sha256=4EgkP1DnW4Dvflqa2VPqeBhQQAndeAMw-xpXaFKfmJU,9119
92
92
  ert/config/parsing/config_schema_item.py,sha256=WOdE1fzEyIVMdiCzj4fJuqgEbC3Ivc7uR4gENEH2s6Q,14500
93
93
  ert/config/parsing/context_values.py,sha256=cNfiT1I93Y2g9rwAnS9jXKSqSDxI9-jZVOSwVMQHTZ0,2280
94
94
  ert/config/parsing/deprecation_info.py,sha256=E31LBTiG1qNeqACU8lTxp54bESIeuuVHgFim8j8uVjg,663
@@ -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=idpvJGkP72eO3P95g3kwKjovZS9C1loDQAclDRlFAbU,6955
102
+ ert/config/parsing/observations_parser.py,sha256=35l2UdX3mBPh51wOjyUnruo5FdH5YOxqQ1X6TuRMYyQ,6792
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
@@ -122,7 +122,7 @@ ert/dark_storage/endpoints/__init__.py,sha256=o093-GLgw8br7PDKhHna0LviXeJQdC5P1R
122
122
  ert/dark_storage/endpoints/ensembles.py,sha256=22M358HTAjiNuKaRYp9FZ3SZvkWL3v9wMDD0DGwLF8M,1363
123
123
  ert/dark_storage/endpoints/experiment_server.py,sha256=snaCwRXayGn6_SIqH49Qmi4u1ZILiH2ynFZL6L4YsxQ,14118
124
124
  ert/dark_storage/endpoints/experiments.py,sha256=_tY95HzW6ibJy7N9C-1XICFHSOrKdz4vM3bv7ePRvY8,3413
125
- ert/dark_storage/endpoints/observations.py,sha256=gnww5S1B9G8vAw7AwcR1fgW_vFgyf5WlU1gOSUXW1i4,4841
125
+ ert/dark_storage/endpoints/observations.py,sha256=EpetZi7cjlrexfU9VPdiTJV1PT6k0ZNx366WGlfKZM4,4574
126
126
  ert/dark_storage/endpoints/parameters.py,sha256=LERil7H-L3ZsPGGFm97kvy3XeIqpceyBe5aSFLkSVEY,4406
127
127
  ert/dark_storage/endpoints/responses.py,sha256=tFEdgqP1vcOuRPmr4YpE9okEpxowXMoYjYdUq2wljZ8,6195
128
128
  ert/dark_storage/endpoints/updates.py,sha256=BWEh2XUTqdsPPEtiSE8bJtXcFVzw-GlbKIK3vvc_Cu8,142
@@ -151,15 +151,15 @@ 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=QbRbcZIfNyRliMwyFwmUnMIHc4Za9-uUSitm4l3uT0k,9521
154
+ ert/field_utils/grdecl_io.py,sha256=kgSE3Fyr_7KDS1HQRmO7RQLMwgrkgJ_Tsmo7jE9GE1s,8971
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
158
158
  ert/gui/ertnotifier.py,sha256=4ZFXOrk2ATr5Dq-WW-0s_wokfKHIUgrBn3Y6cfb3JlM,3030
159
159
  ert/gui/find_ert_info.py,sha256=hwqiCa5rDZEL_25QVsx920d9NOaVM2PyUor89_-70-Q,301
160
- ert/gui/main.py,sha256=dsT2AAPFgSEGLlsHiaEwALCdJNt2OcUe11TkdB7WU-g,10123
160
+ ert/gui/main.py,sha256=1Of1DzQ89IH93zdax9akZUi260trVwH01F24Khb-S20,10110
161
161
  ert/gui/main_window.py,sha256=kvqQgf-6XUJibJhFgefD1vqFQm0TRTcBGcYVGdP8Uxk,14780
162
- ert/gui/summarypanel.py,sha256=pIMCUyEulNB-TzC1d6NBSUv4dzmM3RzDKiDRc6HuUe4,4832
162
+ ert/gui/summarypanel.py,sha256=t12-A7Xx9ASoHa90VBZAISpSOVWvOYFb4GDTUpXkeSc,4235
163
163
  ert/gui/ertwidgets/__init__.py,sha256=LtwHe4wpA0YpbealTrukMb7rDSSTxSyGkVaM8IvlI8A,1878
164
164
  ert/gui/ertwidgets/analysismoduleedit.py,sha256=Ff9gzaQHrEH1yQ2tWg15fZrUN0mr_rJEUMciatOjlLc,1444
165
165
  ert/gui/ertwidgets/analysismodulevariablespanel.py,sha256=xL_UHZsTkETF1hovkLa9ax58ofBVpa-jO0fhnL6ZyA4,4954
@@ -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=s9kepWEoYiRyJ7V9m7HntGXEk9AdTQdlTORS3hST_XM,15410
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=3xgJCkY3QmslmatptXPqmzCUONuNUaiK_pwTE3G973A,19723
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=kQvX89b4z2TAwXIzRuDEDnfJNq-jMyTC8Lzyn8T0HwU,7755
276
- ert/gui/tools/plot/plot_window.py,sha256=gZZCDLVcFJ-HPVYRaQcNQoYmJ3IRWEXi1_z6HJm97Es,17757
275
+ ert/gui/tools/plot/plot_widget.py,sha256=w_avqCvBe68rvZXOa4WiFC2IsXSbIAYOGEZhHtzFeiA,7527
276
+ ert/gui/tools/plot/plot_window.py,sha256=_9KgIi_jbNNUnOW80DkCJb1GACStYRQ7BZYAq2fE7Hs,17327
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
@@ -378,7 +378,7 @@ ert/run_models/manual_update.py,sha256=CjuoWjtVeyo4fT7HmKqtmiQflKJtcoQVJWrf6BXTB
378
378
  ert/run_models/manual_update_enif.py,sha256=79l_hSrNN-6gvuBQBFiEYYbKOAdLLI0UwyMbzVlFSTU,995
379
379
  ert/run_models/model_factory.py,sha256=DzRIIlSOWOn2VpUFAoThiKVDohNgT2a804qcw-RYcrY,21166
380
380
  ert/run_models/multiple_data_assimilation.py,sha256=Mg6OoR3ncNgOm7bNeV-5FdBRRljEs7Nyef4W48yPVks,8471
381
- ert/run_models/run_model.py,sha256=2UmXKhcWlbyuGl36DeL8EbkJItim_ttfzNocdOhlKCc,30260
381
+ ert/run_models/run_model.py,sha256=uudHZOlsuuIQL68Me0FtT27_dxJtt5Awk1VGF9F7iLg,31005
382
382
  ert/run_models/single_test_run.py,sha256=-5Z-JB_VYlR4p4PAtKTcj5QzYjdj7EFn6_6odjlPJH0,1069
383
383
  ert/run_models/update_run_model.py,sha256=nWTnLVnXN_1Si55v_ZJaKYhDgo_G1JgZ-bz6JFjbvOg,5407
384
384
  ert/scheduler/__init__.py,sha256=Swxw-mDWEUr6jD8LLfF2tWDJnMv3oEVSbRrOh9DtZwE,1368
@@ -397,7 +397,7 @@ ert/services/ert_server.py,sha256=qIzqugIHcxwKuzjkItiMt3jah3hNI7x3NQ3p_WBBf_o,10
397
397
  ert/services/webviz_ert_service.py,sha256=J5vznqb_-DjlDMOze7tdvuBE4GWEPgJ5dIIXvRLKd0Y,650
398
398
  ert/shared/__init__.py,sha256=OwgL-31MxA0fabETJ5Svw0tqJpHi569CZDRFHdHiqA0,644
399
399
  ert/shared/net_utils.py,sha256=Wp9Qyd5wWNHPU0Myh1GCbUONu0a-akYEdJ07MjQJt4I,6130
400
- ert/shared/version.py,sha256=GM1jeyX1cQtyItCPqTE2CcSvmTh8vU6gANW_x2g3w60,714
400
+ ert/shared/version.py,sha256=dYRH7xFlGgBM4Odm4Eg0B4zUpeD9MIneMf8amlwjaeo,724
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=t88F0ZdmduD6_tUhc78X1HxhEXuJUZnRaIQicdq42yk,51513
417
+ ert/storage/local_ensemble.py,sha256=m3p8pUG8mYzYO8l_tnhjlVvhQwvPp97ztUNDO4Zjd1s,50965
418
418
  ert/storage/local_experiment.py,sha256=JNdTQWn0jJLqN8pYeh4XbuSxxiTN5Qbc0nkJzzgjhAU,16871
419
- ert/storage/local_storage.py,sha256=Ni2IThA8jWeRsYmF1n56cHjcDIx4GTCZR2mo0kyFqjE,24107
419
+ ert/storage/local_storage.py,sha256=oDdhtQkuKXrmXiFX-RKSoyfHwSWkS1M61yZZvmJQJQ0,24011
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,8 +432,6 @@ 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
437
435
  ert/storage/migration/to6.py,sha256=Pj9lVCyPCOP0-dt4uypsZtS5Awbc8B7oaySu_VTwnnA,1514
438
436
  ert/storage/migration/to7.py,sha256=hV5lLfaQegyvxsy_lWfsiQAYVPCvS8Oe0fYc_fvKXzY,4500
439
437
  ert/storage/migration/to8.py,sha256=VL7A5KWTSFhBWmx3n-vCKBaEd2U8SUqyz8vPieyVd9E,5390
@@ -455,7 +453,7 @@ ert/validation/validation_status.py,sha256=f47_B7aS-9DEh6uaVzKxD97pXienkyTVVCqTy
455
453
  ert/warnings/__init__.py,sha256=IBwQVkdD7Njaad9PAB-9K-kr15wnA4EBKboxyqgu9NA,214
456
454
  ert/warnings/_warnings.py,sha256=7qhNZ0W4nnljzoOx6AXX7VlMv5pa34Ek5M5n1Ep0Kak,189
457
455
  ert/warnings/specific_warning_handler.py,sha256=5dVXtOhzcMmtPBGx4AOddXNPfzTFOPA7RVtdH8hLv68,932
458
- ert-19.0.0.dist-info/licenses/COPYING,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
456
+ ert-19.0.0rc0.dist-info/licenses/COPYING,sha256=jOtLnuWt7d5Hsx6XXB2QxzrSe2sWWh3NgMfFRetluQM,35147
459
457
  everest/__init__.py,sha256=8_f50f6H3-onqaiuNCwC0Eiotdl9JuTxhwyF_54MVvU,306
460
458
  everest/config_file_loader.py,sha256=rOHYvB4ayB2MaKdaAynvJVtbCOqi_z25EdwEqJ02-DQ,5675
461
459
  everest/everest_storage.py,sha256=c3sgU7-3BDSRXxJfCR_4F58rWEaoII1wygz6VvM-GGI,42025
@@ -519,8 +517,8 @@ everest/templates/well_drill.tmpl,sha256=9iLexmBHMsMQNXyyRK4GlmVuVpVIxRcCHpy1av5
519
517
  everest/templates/well_order.tmpl,sha256=XJ1eVRkeyTdLu5sLsltJSSK6BDLN7rFOAqLdM3ZZy3w,75
520
518
  everest/util/__init__.py,sha256=xEYLz6pUtgkH8VHer1RfoCwKiO70dBnuhHonsOPaOx0,1359
521
519
  everest/util/forward_models.py,sha256=JPxHhLI6TrmQJwW50wwGBmw57TfRd8SG2svYhXFHrc8,1617
522
- ert-19.0.0.dist-info/METADATA,sha256=TuGDziT6GLvUZksqtx232yMBEZKNE6acjT7v1kl8CBw,10012
523
- ert-19.0.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
524
- ert-19.0.0.dist-info/entry_points.txt,sha256=ChZ7vn8Qy9v9rT8GM2JtAvWDN3NVoy4BIcvVRtU73CM,189
525
- ert-19.0.0.dist-info/top_level.txt,sha256=LRh9GfdfyDWfAGmrQgp_XdoMHA4v6aotw8xgsy5YyHE,17
526
- ert-19.0.0.dist-info/RECORD,,
520
+ ert-19.0.0rc0.dist-info/METADATA,sha256=vVVYDH1Ft-IoeiPEyBd90igwASV5MnX5WcTP-m7SK6I,10015
521
+ ert-19.0.0rc0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
522
+ ert-19.0.0rc0.dist-info/entry_points.txt,sha256=ChZ7vn8Qy9v9rT8GM2JtAvWDN3NVoy4BIcvVRtU73CM,189
523
+ ert-19.0.0rc0.dist-info/top_level.txt,sha256=LRh9GfdfyDWfAGmrQgp_XdoMHA4v6aotw8xgsy5YyHE,17
524
+ ert-19.0.0rc0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.10.2)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,18 +0,0 @@
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)
@@ -1,49 +0,0 @@
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)