Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix #551: up and gain_scale_factor are set by StressModel #573

Merged
merged 5 commits into from
May 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
26 changes: 13 additions & 13 deletions doc/benchmarks/check_response_functions.ipynb

Large diffs are not rendered by default.

6 changes: 5 additions & 1 deletion pastas/io/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,11 @@ def _load_stressmodel(ts, data):

if "rfunc" in ts.keys():
rfunc_class = ts["rfunc"].pop("class") # Determine response class
ts["rfunc"] = getattr(ps.rfunc, rfunc_class)(**ts["rfunc"])
rfunc_up = ts["rfunc"].pop("up", None) # get up value
rfunc_gsf = ts["rfunc"].pop("gain_scale_factor", None) # get gain_scale_factor
rfunc = getattr(ps.rfunc, rfunc_class)(**ts["rfunc"])
rfunc.update_rfunc_settings(up=rfunc_up, gain_scale_factor=rfunc_gsf)
ts["rfunc"] = rfunc

if "recharge" in ts.keys():
recharge_class = ts["recharge"].pop("class")
Expand Down
85 changes: 25 additions & 60 deletions pastas/rfunc.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,16 +55,25 @@ class RfuncBase:

def __init__(
self,
up: bool = True,
gain_scale_factor: float = 1.0,
cutoff: float = 0.999,
**kwargs,
) -> None:
self.up = up
self.gain_scale_factor = gain_scale_factor
self.cutoff = cutoff
if "up" in kwargs:
raise TypeError(
"keyword argument 'up' is not supported in init. "
"Set with update_rfunc_settings()."
)
if "gain_scale_factor" in kwargs:
raise TypeError(
"keyword argument 'gain_scale_factor' is not supported in "
"init. Set with update_rfunc_settings()."
)
# initialize attributes, these can be set with update_rfunc_settings()
self.up = None
self.gain_scale_factor = 1.0

def _update_rfunc_settings(
def update_rfunc_settings(
self,
up: Optional[bool] = "nochange",
gain_scale_factor: Optional[float] = None,
Expand Down Expand Up @@ -302,14 +311,10 @@ class Gamma(RfuncBase):

def __init__(
self,
up: bool = True,
gain_scale_factor: float = 1.0,
cutoff: float = 0.999,
**kwargs,
) -> None:
RfuncBase.__init__(
self, up=up, gain_scale_factor=gain_scale_factor, cutoff=cutoff, **kwargs
)
RfuncBase.__init__(self, cutoff=cutoff, **kwargs)
self.nparam = 3

def get_init_parameters(self, name: str) -> DataFrame:
Expand Down Expand Up @@ -398,14 +403,10 @@ class Exponential(RfuncBase):

def __init__(
self,
up: bool = True,
gain_scale_factor: float = 1.0,
cutoff: float = 0.999,
**kwargs,
) -> None:
RfuncBase.__init__(
self, up=up, gain_scale_factor=gain_scale_factor, cutoff=cutoff, **kwargs
)
RfuncBase.__init__(self, cutoff=cutoff, **kwargs)
self.nparam = 2

def get_init_parameters(self, name: str) -> DataFrame:
Expand Down Expand Up @@ -503,16 +504,12 @@ class HantushWellModel(RfuncBase):

def __init__(
self,
up: bool = True,
gain_scale_factor: float = 1.0,
cutoff: float = 0.999,
use_numba: bool = False,
quad: bool = False,
**kwargs,
) -> None:
RfuncBase.__init__(
self, up=up, gain_scale_factor=gain_scale_factor, cutoff=cutoff, **kwargs
)
RfuncBase.__init__(self, cutoff=cutoff, **kwargs)
self.distances = None
self.nparam = 3
self.use_numba = use_numba # requires numba_scipy for real speedups
Expand Down Expand Up @@ -795,16 +792,12 @@ class Hantush(RfuncBase):

def __init__(
self,
up: bool = True,
gain_scale_factor: float = 1.0,
cutoff: float = 0.999,
use_numba: bool = False,
quad: bool = False,
**kwargs,
) -> None:
RfuncBase.__init__(
self, up=up, gain_scale_factor=gain_scale_factor, cutoff=cutoff, **kwargs
)
RfuncBase.__init__(self, cutoff=cutoff, **kwargs)
self.nparam = 3
self.use_numba = use_numba
self.quad = quad
Expand Down Expand Up @@ -990,14 +983,10 @@ class Polder(RfuncBase):

def __init__(
self,
up: bool = True,
gain_scale_factor: float = 1.0,
cutoff: float = 0.999,
**kwargs,
) -> None:
RfuncBase.__init__(
self, up=up, gain_scale_factor=gain_scale_factor, cutoff=cutoff, **kwargs
)
RfuncBase.__init__(self, cutoff=cutoff, **kwargs)
self.nparam = 3

def get_init_parameters(self, name) -> DataFrame:
Expand Down Expand Up @@ -1074,14 +1063,10 @@ class One(RfuncBase):

def __init__(
self,
up: bool = True,
gain_scale_factor: float = 1.0,
cutoff: float = 0.999,
**kwargs,
) -> None:
RfuncBase.__init__(
self, up=up, gain_scale_factor=gain_scale_factor, cutoff=cutoff, **kwargs
)
RfuncBase.__init__(self, cutoff=cutoff, **kwargs)
self.nparam = 1

def get_init_parameters(self, name: str) -> DataFrame:
Expand Down Expand Up @@ -1171,15 +1156,11 @@ class FourParam(RfuncBase):

def __init__(
self,
up: bool = True,
gain_scale_factor: float = 1.0,
cutoff: float = 0.999,
quad: bool = False,
**kwargs,
) -> None:
RfuncBase.__init__(
self, up=up, gain_scale_factor=gain_scale_factor, cutoff=cutoff, **kwargs
)
RfuncBase.__init__(self, cutoff=cutoff, **kwargs)
self.nparam = 4
self.quad = quad

Expand Down Expand Up @@ -1385,14 +1366,10 @@ class DoubleExponential(RfuncBase):

def __init__(
self,
up: bool = True,
gain_scale_factor: float = 1.0,
cutoff: float = 0.999,
**kwargs,
) -> None:
RfuncBase.__init__(
self, up=up, gain_scale_factor=gain_scale_factor, cutoff=cutoff, **kwargs
)
RfuncBase.__init__(self, cutoff=cutoff, **kwargs)
self.nparam = 4

def get_init_parameters(self, name: str) -> DataFrame:
Expand Down Expand Up @@ -1489,14 +1466,10 @@ class Edelman(RfuncBase):

def __init__(
self,
up: bool = True,
gain_scale_factor: float = 1.0,
cutoff: float = 0.999,
**kwargs,
) -> None:
RfuncBase.__init__(
self, up=up, gain_scale_factor=gain_scale_factor, cutoff=cutoff, **kwargs
)
RfuncBase.__init__(self, cutoff=cutoff, **kwargs)
self.nparam = 1

def get_init_parameters(self, name: str) -> DataFrame:
Expand Down Expand Up @@ -1578,15 +1551,11 @@ class Kraijenhoff(RfuncBase):

def __init__(
self,
up: bool = True,
gain_scale_factor: float = 1.0,
cutoff: float = 0.999,
n_terms: int = 10,
**kwargs,
) -> None:
RfuncBase.__init__(
self, up=up, gain_scale_factor=gain_scale_factor, cutoff=cutoff, **kwargs
)
RfuncBase.__init__(self, cutoff=cutoff, **kwargs)
self.nparam = 3
self.n_terms = n_terms

Expand Down Expand Up @@ -1723,16 +1692,12 @@ class Spline(RfuncBase):

def __init__(
self,
up: bool = True,
gain_scale_factor: float = 1.0,
cutoff: float = 0.999,
kind: str = "quadratic",
t: Optional[list] = None,
**kwargs,
) -> None:
RfuncBase.__init__(
self, up=up, gain_scale_factor=gain_scale_factor, cutoff=cutoff, **kwargs
)
RfuncBase.__init__(self, cutoff=cutoff, **kwargs)
self.kind = kind
if t is None:
t = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
Expand Down
6 changes: 3 additions & 3 deletions pastas/stressmodels.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ def __init__(
self.freq = None

if rfunc is not None:
rfunc._update_rfunc_settings(up=up, gain_scale_factor=gain_scale_factor)
rfunc.update_rfunc_settings(up=up, gain_scale_factor=gain_scale_factor)
self.rfunc = rfunc

self.parameters = DataFrame(columns=["initial", "pmin", "pmax", "vary", "name"])
Expand Down Expand Up @@ -1604,10 +1604,10 @@ def __init__(
tmax=stress.series.index.max(),
)

rfunc1._update_rfunc_settings(up=up)
rfunc1.update_rfunc_settings(up=up)
self.rfunc1 = rfunc1

rfunc2._update_rfunc_settings(up=up)
rfunc2.update_rfunc_settings(up=up)
self.rfunc2 = rfunc2
self.tchange = Timestamp(tchange)

Expand Down
3 changes: 3 additions & 0 deletions tests/test_rfuncs.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ def test_to_dict_rfuncs(rfunc_name) -> None:
# Create the exact same instance using to_dict
data = rfunc1.to_dict()
rfunc_class = data.pop("class") # Determine response class
rfunc_up = data.pop("up", None)
rfunc_gsf = data.pop("gain_scale_factor", None)
rfunc2 = getattr(ps.rfunc, rfunc_class)(**data)
rfunc2.update_rfunc_settings(up=rfunc_up, gain_scale_factor=rfunc_gsf)

if rfunc_name == "HantushWellModel":
rfunc1.set_distances(100.0)
Expand Down