From 418c5844f3ee4d72b9dc057c60f7e0d7283ffd55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20M=C3=BCller?= Date: Wed, 19 Oct 2022 12:14:49 +0200 Subject: [PATCH 1/4] ignore cov.xml --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 872d3f40b..1be5ae0c4 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ nosetests.xml coverage.xml *.cover .hypothesis/ +cov.xml # Translations *.mo From 27545a85740c6d6405ee7b691b8f2c231de7b9f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20M=C3=BCller?= Date: Wed, 19 Oct 2022 12:15:22 +0200 Subject: [PATCH 2/4] seed: use Ellipsis to indicate keeping the seed --- src/gstools/field/cond_srf.py | 8 +++++--- src/gstools/field/generator.py | 36 +++++++++++++++++----------------- src/gstools/field/srf.py | 8 +++++--- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/gstools/field/cond_srf.py b/src/gstools/field/cond_srf.py index 385216ba1..9a27ec670 100644 --- a/src/gstools/field/cond_srf.py +++ b/src/gstools/field/cond_srf.py @@ -64,7 +64,7 @@ def __init__(self, krige, generator="RandMeth", **generator_kwargs): def __call__( self, pos=None, - seed=np.nan, + seed=..., mesh_type="unstructured", post_process=True, store=True, @@ -80,8 +80,10 @@ def __call__( pos : :class:`list`, optional the position tuple, containing main direction and transversal directions - seed : :class:`int`, optional - seed for RNG for resetting. Default: keep seed from generator + seed : :class:`int` or :any:`None` or :any:`Ellipsis`, optional + the seed of the random number generator. + If :any:`None`, a random seed is used. If :any:`Ellipsis`, + the actual seed will be kept. Default: :any:`Ellipsis` mesh_type : :class:`str` 'structured' / 'unstructured' post_process : :class:`bool`, optional diff --git a/src/gstools/field/generator.py b/src/gstools/field/generator.py index 7780ec726..e48cfdef0 100644 --- a/src/gstools/field/generator.py +++ b/src/gstools/field/generator.py @@ -52,7 +52,7 @@ def __init__(self, model, **kwargs): pass @abstractmethod - def update(self, model=None, seed=np.nan): + def update(self, model=None, seed=...): """Update the model and the seed. If model and seed are not different, nothing will be done. @@ -61,10 +61,10 @@ def update(self, model=None, seed=np.nan): ---------- model : :any:`CovModel` or :any:`None`, optional covariance model. Default: :any:`None` - seed : :class:`int` or :any:`None` or :any:`numpy.nan`, optional + seed : :class:`int` or :any:`None` or :any:`Ellipsis`, optional the seed of the random number generator. - If :any:`None`, a random seed is used. If :any:`numpy.nan`, - the actual seed will be kept. Default: :any:`numpy.nan` + If :any:`None`, a random seed is used. If :any:`Ellipsis`, + the actual seed will be kept. Default: :any:`Ellipsis` """ @abstractmethod @@ -235,7 +235,7 @@ def get_nugget(self, shape): nugget = 0.0 return nugget - def update(self, model=None, seed=np.nan): + def update(self, model=None, seed=...): """Update the model and the seed. If model and seed are not different, nothing will be done. @@ -244,24 +244,24 @@ def update(self, model=None, seed=np.nan): ---------- model : :any:`CovModel` or :any:`None`, optional covariance model. Default: :any:`None` - seed : :class:`int` or :any:`None` or :any:`numpy.nan`, optional + seed : :class:`int` or :any:`None` or :any:`Ellipsis`, optional the seed of the random number generator. - If :any:`None`, a random seed is used. If :any:`numpy.nan`, - the actual seed will be kept. Default: :any:`numpy.nan` + If :any:`None`, a random seed is used. If :any:`Ellipsis`, + the actual seed will be kept. Default: :any:`Ellipsis` """ # check if a new model is given if isinstance(model, CovModel): if self.model != model: self._model = dcp(model) - if seed is None or not np.isnan(seed): + if seed is None or seed is not Ellipsis: self.reset_seed(seed) else: self.reset_seed(self._seed) # just update the seed, if its a new one - elif seed is None or not np.isnan(seed): + elif seed is None or seed is not Ellipsis: self.seed = seed # or just update the seed, when no model is given - elif model is None and (seed is None or not np.isnan(seed)): + elif model is None and (seed is None or seed is not Ellipsis): if isinstance(self._model, CovModel): self.seed = seed else: @@ -269,8 +269,8 @@ def update(self, model=None, seed=np.nan): "gstools.field.generator.RandMeth: no 'model' given" ) # if the user tries to trick us, we beat him! - elif model is None and np.isnan(seed): - if not ( + elif model is None and seed is Ellipsis: + if ( isinstance(self._model, CovModel) and self._z_1 is not None and self._z_2 is not None @@ -287,22 +287,22 @@ def update(self, model=None, seed=np.nan): "instance of 'gstools.CovModel'" ) - def reset_seed(self, seed=np.nan): + def reset_seed(self, seed=...): """ Recalculate the random amplitudes and wave numbers with the given seed. Parameters ---------- - seed : :class:`int` or :any:`None` or :any:`numpy.nan`, optional + seed : :class:`int` or :any:`None` or :any:`Ellipsis`, optional the seed of the random number generator. - If :any:`None`, a random seed is used. If :any:`numpy.nan`, - the actual seed will be kept. Default: :any:`numpy.nan` + If :any:`None`, a random seed is used. If :any:`Ellipsis`, + the actual seed will be kept. Default: :any:`Ellipsis` Notes ----- Even if the given seed is the present one, modes will be recalculated. """ - if seed is None or not np.isnan(seed): + if seed is None or seed is not Ellipsis: self._seed = seed self._rng = RNG(self._seed) # normal distributed samples for randmeth diff --git a/src/gstools/field/srf.py b/src/gstools/field/srf.py index a8a1e575f..39a056d08 100644 --- a/src/gstools/field/srf.py +++ b/src/gstools/field/srf.py @@ -103,7 +103,7 @@ def __init__( def __call__( self, pos=None, - seed=np.nan, + seed=..., point_volumes=0.0, mesh_type="unstructured", post_process=True, @@ -118,8 +118,10 @@ def __call__( pos : :class:`list`, optional the position tuple, containing main direction and transversal directions - seed : :class:`int`, optional - seed for RNG for resetting. Default: keep seed from generator + seed : :class:`int` or :any:`None` or :any:`Ellipsis`, optional + the seed of the random number generator. + If :any:`None`, a random seed is used. If :any:`Ellipsis`, + the actual seed will be kept. Default: :any:`Ellipsis` point_volumes : :class:`float` or :class:`numpy.ndarray` If your evaluation points for the field are coming from a mesh, they are probably representing a certain element volume. From db96b571432dd6e4e4eb88ca38f641bc2b6ef82d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20M=C3=BCller?= Date: Wed, 19 Oct 2022 12:41:13 +0200 Subject: [PATCH 3/4] typo: correct false friend --- src/gstools/krige/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gstools/krige/base.py b/src/gstools/krige/base.py index 336f4cc0e..e4c225e92 100755 --- a/src/gstools/krige/base.py +++ b/src/gstools/krige/base.py @@ -257,7 +257,7 @@ def __call__( ext_drift = self._pre_ext_drift(pnt_cnt, ext_drift) # iterate chunks for i in range(chunk_no): - # get chunk slice for actual chunk + # get chunk slice for current chunk chunk_slice = ( i * chunk_size, min(pnt_cnt, (i + 1) * chunk_size), From bae13af45d1c38e5d44d0158de68395b15725ece Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20M=C3=BCller?= Date: Wed, 19 Oct 2022 13:03:07 +0200 Subject: [PATCH 4/4] seed: simplify logic; typo fix --- src/gstools/field/cond_srf.py | 2 +- src/gstools/field/generator.py | 19 ++++++++----------- src/gstools/field/srf.py | 2 +- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/gstools/field/cond_srf.py b/src/gstools/field/cond_srf.py index 9a27ec670..406c3e01a 100644 --- a/src/gstools/field/cond_srf.py +++ b/src/gstools/field/cond_srf.py @@ -83,7 +83,7 @@ def __call__( seed : :class:`int` or :any:`None` or :any:`Ellipsis`, optional the seed of the random number generator. If :any:`None`, a random seed is used. If :any:`Ellipsis`, - the actual seed will be kept. Default: :any:`Ellipsis` + the current seed will be kept. Default: :any:`Ellipsis` mesh_type : :class:`str` 'structured' / 'unstructured' post_process : :class:`bool`, optional diff --git a/src/gstools/field/generator.py b/src/gstools/field/generator.py index e48cfdef0..b25b8d8ad 100644 --- a/src/gstools/field/generator.py +++ b/src/gstools/field/generator.py @@ -64,7 +64,7 @@ def update(self, model=None, seed=...): seed : :class:`int` or :any:`None` or :any:`Ellipsis`, optional the seed of the random number generator. If :any:`None`, a random seed is used. If :any:`Ellipsis`, - the actual seed will be kept. Default: :any:`Ellipsis` + the current seed will be kept. Default: :any:`Ellipsis` """ @abstractmethod @@ -247,21 +247,18 @@ def update(self, model=None, seed=...): seed : :class:`int` or :any:`None` or :any:`Ellipsis`, optional the seed of the random number generator. If :any:`None`, a random seed is used. If :any:`Ellipsis`, - the actual seed will be kept. Default: :any:`Ellipsis` + the current seed will be kept. Default: :any:`Ellipsis` """ # check if a new model is given if isinstance(model, CovModel): if self.model != model: self._model = dcp(model) - if seed is None or seed is not Ellipsis: - self.reset_seed(seed) - else: - self.reset_seed(self._seed) + self.reset_seed(self._seed if seed is Ellipsis else seed) # just update the seed, if its a new one - elif seed is None or seed is not Ellipsis: + elif seed is not Ellipsis: self.seed = seed # or just update the seed, when no model is given - elif model is None and (seed is None or seed is not Ellipsis): + elif model is None and seed is not Ellipsis: if isinstance(self._model, CovModel): self.seed = seed else: @@ -296,13 +293,13 @@ def reset_seed(self, seed=...): seed : :class:`int` or :any:`None` or :any:`Ellipsis`, optional the seed of the random number generator. If :any:`None`, a random seed is used. If :any:`Ellipsis`, - the actual seed will be kept. Default: :any:`Ellipsis` + the current seed will be kept. Default: :any:`Ellipsis` Notes ----- Even if the given seed is the present one, modes will be recalculated. """ - if seed is None or seed is not Ellipsis: + if seed is not Ellipsis: self._seed = seed self._rng = RNG(self._seed) # normal distributed samples for randmeth @@ -351,7 +348,7 @@ def seed(self): @seed.setter def seed(self, new_seed): - if new_seed is not self._seed: + if new_seed != self._seed: self.reset_seed(new_seed) @property diff --git a/src/gstools/field/srf.py b/src/gstools/field/srf.py index 39a056d08..15d95f267 100644 --- a/src/gstools/field/srf.py +++ b/src/gstools/field/srf.py @@ -121,7 +121,7 @@ def __call__( seed : :class:`int` or :any:`None` or :any:`Ellipsis`, optional the seed of the random number generator. If :any:`None`, a random seed is used. If :any:`Ellipsis`, - the actual seed will be kept. Default: :any:`Ellipsis` + the current seed will be kept. Default: :any:`Ellipsis` point_volumes : :class:`float` or :class:`numpy.ndarray` If your evaluation points for the field are coming from a mesh, they are probably representing a certain element volume.