ert 19.0.0rc3__py3-none-any.whl → 19.0.0rc4__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/config/_create_observation_dataframes.py +28 -51
- ert/config/_observations.py +29 -13
- ert/config/parsing/observations_parser.py +6 -0
- ert/field_utils/grdecl_io.py +26 -9
- ert/gui/tools/plot/plot_widget.py +14 -7
- ert/gui/tools/plot/plot_window.py +9 -0
- ert/shared/version.py +3 -3
- ert/storage/local_ensemble.py +12 -1
- ert/storage/local_storage.py +5 -1
- ert/storage/migration/to22.py +18 -0
- ert/storage/migration/to23.py +49 -0
- {ert-19.0.0rc3.dist-info → ert-19.0.0rc4.dist-info}/METADATA +1 -1
- {ert-19.0.0rc3.dist-info → ert-19.0.0rc4.dist-info}/RECORD +17 -15
- {ert-19.0.0rc3.dist-info → ert-19.0.0rc4.dist-info}/WHEEL +1 -1
- {ert-19.0.0rc3.dist-info → ert-19.0.0rc4.dist-info}/entry_points.txt +0 -0
- {ert-19.0.0rc3.dist-info → ert-19.0.0rc4.dist-info}/licenses/COPYING +0 -0
- {ert-19.0.0rc3.dist-info → ert-19.0.0rc4.dist-info}/top_level.txt +0 -0
|
@@ -36,7 +36,7 @@ if TYPE_CHECKING:
|
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
DEFAULT_TIME_DELTA = timedelta(seconds=30)
|
|
39
|
-
|
|
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
|
|
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
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
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(
|
|
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
|
)
|
ert/config/_observations.py
CHANGED
|
@@ -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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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 "
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
localization_values["
|
|
131
|
-
|
|
132
|
-
|
|
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
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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)
|
|
@@ -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):
|
ert/field_utils/grdecl_io.py
CHANGED
|
@@ -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
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
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")
|
|
@@ -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
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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()
|
|
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:
|
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.
|
|
32
|
-
__version_tuple__ = version_tuple = (19, 0, 0, '
|
|
31
|
+
__version__ = version = '19.0.0rc4'
|
|
32
|
+
__version_tuple__ = version_tuple = (19, 0, 0, 'rc4')
|
|
33
33
|
|
|
34
|
-
__commit_id__ = commit_id = '
|
|
34
|
+
__commit_id__ = commit_id = 'g2518c4485'
|
ert/storage/local_ensemble.py
CHANGED
|
@@ -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(
|
|
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
|
|
ert/storage/local_storage.py
CHANGED
|
@@ -31,7 +31,7 @@ from .realization_storage_state import RealizationStorageState
|
|
|
31
31
|
|
|
32
32
|
logger = logging.getLogger(__name__)
|
|
33
33
|
|
|
34
|
-
_LOCAL_STORAGE_VERSION =
|
|
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)
|
|
@@ -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=
|
|
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=
|
|
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
|
|
@@ -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=
|
|
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
|
|
@@ -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=
|
|
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
|
|
@@ -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=
|
|
276
|
-
ert/gui/tools/plot/plot_window.py,sha256=
|
|
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
|
|
@@ -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=
|
|
400
|
+
ert/shared/version.py,sha256=KsmvkbSRbh0t0L3rD-7UvoIOd2pj2KF4yMF-pmHEnYk,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=
|
|
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=
|
|
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
|
|
@@ -453,7 +455,7 @@ ert/validation/validation_status.py,sha256=f47_B7aS-9DEh6uaVzKxD97pXienkyTVVCqTy
|
|
|
453
455
|
ert/warnings/__init__.py,sha256=IBwQVkdD7Njaad9PAB-9K-kr15wnA4EBKboxyqgu9NA,214
|
|
454
456
|
ert/warnings/_warnings.py,sha256=7qhNZ0W4nnljzoOx6AXX7VlMv5pa34Ek5M5n1Ep0Kak,189
|
|
455
457
|
ert/warnings/specific_warning_handler.py,sha256=5dVXtOhzcMmtPBGx4AOddXNPfzTFOPA7RVtdH8hLv68,932
|
|
456
|
-
ert-19.0.
|
|
458
|
+
ert-19.0.0rc4.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.
|
|
521
|
-
ert-19.0.
|
|
522
|
-
ert-19.0.
|
|
523
|
-
ert-19.0.
|
|
524
|
-
ert-19.0.
|
|
522
|
+
ert-19.0.0rc4.dist-info/METADATA,sha256=G819IMtndapqr2Vhl69WeFq80kwSdEdtFcDlKGJsvdo,10015
|
|
523
|
+
ert-19.0.0rc4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
524
|
+
ert-19.0.0rc4.dist-info/entry_points.txt,sha256=ChZ7vn8Qy9v9rT8GM2JtAvWDN3NVoy4BIcvVRtU73CM,189
|
|
525
|
+
ert-19.0.0rc4.dist-info/top_level.txt,sha256=LRh9GfdfyDWfAGmrQgp_XdoMHA4v6aotw8xgsy5YyHE,17
|
|
526
|
+
ert-19.0.0rc4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|