Skip to content

Commit c658b72

Browse files
committed
Merge branch 'main' into fmu_setproperty_dict
2 parents 159ef93 + d73900c commit c658b72

23 files changed

Lines changed: 839 additions & 401 deletions

corrai/base/model.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,11 @@ def simulate_parameter(
141141
Simulation results as a DataFrame with a DateTimeIndex and one
142142
or more output columns.
143143
"""
144+
sim_kwargs = {} if simulation_kwargs is None else simulation_kwargs
144145
return self.simulate(
145146
self.get_property_from_param(parameter_value_pairs),
146147
simulation_options,
147-
**{} if simulation_kwargs is None else simulation_kwargs,
148+
**sim_kwargs,
148149
)
149150

150151
def get_property_values(self, property_list: list[str]) -> list[str | int | float]:

corrai/base/simulate.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def run_simulations(
108108
results = Parallel(n_jobs=n_cpu)(
109109
delayed(
110110
lambda param: model.simulate_parameter(
111-
param, simulation_options, **simulation_kwargs
111+
param, simulation_options, simulation_kwargs
112112
)
113113
)(param)
114114
for param in bar

corrai/fmu.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,13 @@ def parse_simulation_times(start, stop, step, output_int):
5252
and isinstance(step, (pd.Timedelta, dt.timedelta))
5353
and isinstance(output_int, (pd.Timedelta, dt.timedelta))
5454
):
55-
return map(datetime_to_second, (start, stop, step, output_int))
55+
# Handle 2 years with datetime_index_to_seconds_index function
56+
start_s, stop_s = datetime_index_to_seconds_index(
57+
pd.date_range(start, stop, periods=2)
58+
).astype(int)
59+
step_s, output_int_s = map(datetime_to_second, (step, output_int))
60+
return start_s, stop_s, step_s, output_int_s
61+
5662
raise ValueError("Invalid 'startTime', 'stopTime', 'stepSize', or 'outputInterval")
5763

5864

@@ -111,7 +117,7 @@ def datetime_to_second(datetime_in: dt.datetime | pd.Timestamp | pd.Timedelta):
111117
"""
112118
if isinstance(datetime_in, (dt.datetime | pd.Timestamp)):
113119
year = datetime_in.year
114-
origin = dt.datetime(year, 1, 1)
120+
origin = dt.datetime(year, 1, 1, tzinfo=datetime_in.tz)
115121
return int((datetime_in - origin).total_seconds())
116122
return int(datetime_in.total_seconds())
117123

@@ -327,8 +333,11 @@ def get_property_values(
327333
values = []
328334
for prop in property_list:
329335
if prop in variable_map:
330-
val = variable_map[prop].start
331-
values.append(val if val is not None else None)
336+
try:
337+
val = float(variable_map[prop].start)
338+
except (ValueError, TypeError):
339+
val = variable_map[prop].start
340+
values.append(val)
332341
else:
333342
values.append(None)
334343
return values
@@ -515,7 +524,8 @@ def simulate(
515524
logger=logger,
516525
)
517526

518-
df = pd.DataFrame(result, columns=["time"] + self.output_list)
527+
columns = ["time"] + self.output_list if self.output_list else None
528+
df = pd.DataFrame(result, columns=columns)
519529

520530
if isinstance(start, (pd.Timestamp, dt.datetime)):
521531
df.index = seconds_index_to_datetime_index(df["time"], start.year)

corrai/optimize.py

Lines changed: 6 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from abc import ABC
22
from typing import Callable
3-
from functools import wraps
43

54
import numpy as np
65
import pandas as pd
@@ -10,12 +9,10 @@
109
from pymoo.core.problem import ElementwiseProblem
1110
from pymoo.core.variable import Integer, Real, Choice, Binary
1211

13-
import plotly.graph_objects as go
14-
1512
from corrai.base.math import METHODS
1613
from corrai.base.model import Model
1714
from corrai.base.utils import check_indicators_configs
18-
from corrai.sampling import Sample
15+
from corrai.sampling import Sample, SampleMethodsMixin
1916
from corrai.base.parameter import Parameter
2017

2118

@@ -577,7 +574,7 @@ def _evaluate(self, x, out, *args, **kwargs):
577574
self._post_evaluate(pairs, out)
578575

579576

580-
class SciOptimizer:
577+
class SciOptimizer(SampleMethodsMixin):
581578
"""
582579
Optimization wrapper for models using SciPy.
583580
@@ -635,6 +632,10 @@ def __init__(
635632
def parameters(self):
636633
return self.model_evaluator.parameters
637634

635+
@property
636+
def sample(self):
637+
return self.model_evaluator.sample
638+
638639
@property
639640
def values(self):
640641
return self.model_evaluator.sample.values
@@ -787,75 +788,3 @@ def diff_evo_minimize(
787788
rng=rng,
788789
workers=workers,
789790
)
790-
791-
@wraps(Sample.plot_sample)
792-
def plot_sample(
793-
self,
794-
indicator: str | None,
795-
reference_timeseries: pd.Series | None = None,
796-
title: str | None = None,
797-
y_label: str | None = None,
798-
x_label: str | None = None,
799-
alpha: float = 0.5,
800-
show_legends: bool = False,
801-
round_ndigits: int = 2,
802-
quantile_band: float = 0.75,
803-
type_graph: str = "area",
804-
) -> go.Figure:
805-
return self.model_evaluator.sample.plot_sample(
806-
indicator=indicator,
807-
reference_timeseries=reference_timeseries,
808-
title=title,
809-
y_label=y_label,
810-
x_label=x_label,
811-
alpha=alpha,
812-
show_legends=show_legends,
813-
round_ndigits=round_ndigits,
814-
quantile_band=quantile_band,
815-
type_graph=type_graph,
816-
)
817-
818-
@wraps(Sample.plot_pcp)
819-
def plot_pcp(
820-
self,
821-
indicators_configs: list[str]
822-
| list[tuple[str, str | Callable] | tuple[str, str | Callable, pd.Series]],
823-
color_by: str | None = None,
824-
title: str | None = "Parallel Coordinates — Samples",
825-
html_file_path: str | None = None,
826-
) -> go.Figure:
827-
return self.model_evaluator.sample.plot_pcp(
828-
indicators_configs=indicators_configs,
829-
color_by=color_by,
830-
title=title,
831-
html_file_path=html_file_path,
832-
)
833-
834-
@wraps(Sample.plot_hist)
835-
def plot_hist(
836-
self,
837-
indicator: str,
838-
method: str = "mean",
839-
unit: str = "",
840-
agg_method_kwarg: dict = None,
841-
reference_time_series: pd.Series = None,
842-
bins: int = 30,
843-
colors: str = "orange",
844-
reference_value: int | float = None,
845-
reference_label: str = "Reference",
846-
show_rug: bool = False,
847-
title: str = None,
848-
):
849-
return self.model_evaluator.sample.plot_hist(
850-
indicator=indicator,
851-
method=method,
852-
unit=unit,
853-
agg_method_kwarg=agg_method_kwarg,
854-
reference_time_series=reference_time_series,
855-
bins=bins,
856-
colors=colors,
857-
reference_value=reference_value,
858-
reference_label=reference_label,
859-
show_rug=show_rug,
860-
title=title,
861-
)

0 commit comments

Comments
 (0)