From aef5a5d590b7db02d4a137ca86e7036ae614000d Mon Sep 17 00:00:00 2001 From: Dario Coscia Date: Thu, 3 Oct 2024 21:55:16 +0200 Subject: [PATCH] sampling mode domain added --- pina/domain/cartesian.py | 1 + pina/domain/difference_domain.py | 2 +- pina/domain/domain_interface.py | 24 ++++++++++++++++++++++++ pina/domain/ellipsoid.py | 3 ++- pina/domain/exclusion_domain.py | 2 +- pina/domain/intersection_domain.py | 2 +- pina/domain/operation_interface.py | 5 ++++- pina/domain/simplex.py | 14 +++++++++----- pina/domain/union_domain.py | 3 +++ 9 files changed, 46 insertions(+), 10 deletions(-) diff --git a/pina/domain/cartesian.py b/pina/domain/cartesian.py index f1865e9..e2e066a 100644 --- a/pina/domain/cartesian.py +++ b/pina/domain/cartesian.py @@ -21,6 +21,7 @@ class CartesianDomain(DomainInterface): """ self.fixed_ = {} self.range_ = {} + self.sample_modes = ["random", "grid", "lh", "chebyshev", "latin"] for k, v in cartesian_dict.items(): if isinstance(v, (int, float)): diff --git a/pina/domain/difference_domain.py b/pina/domain/difference_domain.py index d2ba414..9554aaf 100644 --- a/pina/domain/difference_domain.py +++ b/pina/domain/difference_domain.py @@ -77,7 +77,7 @@ class Difference(OperationInterface): 5 """ - if mode != "random": + if mode != self.sample_modes: raise NotImplementedError( f"{mode} is not a valid mode for sampling." ) diff --git a/pina/domain/domain_interface.py b/pina/domain/domain_interface.py index 5906d28..208bfdf 100644 --- a/pina/domain/domain_interface.py +++ b/pina/domain/domain_interface.py @@ -9,6 +9,30 @@ class DomainInterface(metaclass=ABCMeta): Any geometry entity should inherit from this class. """ + __available_sampling_modes = ["random", "grid", "lh", "chebyshev", "latin"] + + @property + @abstractmethod + def sample_modes(self): + """ + Abstract method returing available samples modes for the Domain. + """ + pass + + @sample_modes.setter + def sample_modes(self, values): + """ + TODO + """ + if not isinstance(values, (list, tuple)): + values = [values] + for value in values: + if value not in DomainInterface.__available_sampling_modes: + raise TypeError(f"mode {value} not valid. Expected at least " + "one in " + f"{DomainInterface.__available_sampling_modes}." + ) + @abstractmethod def sample(self): """ diff --git a/pina/domain/ellipsoid.py b/pina/domain/ellipsoid.py index eda42d0..41a7348 100644 --- a/pina/domain/ellipsoid.py +++ b/pina/domain/ellipsoid.py @@ -39,6 +39,7 @@ class EllipsoidDomain(DomainInterface): self.range_ = {} self._centers = None self._axis = None + self.sample_modes = "random" # checking consistency check_consistency(sample_surface, bool) @@ -286,7 +287,7 @@ class EllipsoidDomain(DomainInterface): if variables == "all": variables = self.variables - if mode in ["random"]: + if mode in self.sample_modes: return _Nd_sampler(n, mode, variables).extract(variables) else: raise NotImplementedError(f"mode={mode} is not implemented.") diff --git a/pina/domain/exclusion_domain.py b/pina/domain/exclusion_domain.py index ed63db3..4fc582c 100644 --- a/pina/domain/exclusion_domain.py +++ b/pina/domain/exclusion_domain.py @@ -76,7 +76,7 @@ class Exclusion(OperationInterface): 5 """ - if mode != "random": + if mode != self.sample_modes: raise NotImplementedError( f"{mode} is not a valid mode for sampling." ) diff --git a/pina/domain/intersection_domain.py b/pina/domain/intersection_domain.py index b40d369..b580f21 100644 --- a/pina/domain/intersection_domain.py +++ b/pina/domain/intersection_domain.py @@ -78,7 +78,7 @@ class Intersection(OperationInterface): 5 """ - if mode != "random": + if mode != self.sample_modes: raise NotImplementedError( f"{mode} is not a valid mode for sampling." ) diff --git a/pina/domain/operation_interface.py b/pina/domain/operation_interface.py index acd4cf4..edf2d48 100644 --- a/pina/domain/operation_interface.py +++ b/pina/domain/operation_interface.py @@ -24,6 +24,9 @@ class OperationInterface(DomainInterface, metaclass=ABCMeta): # assign geometries self._geometries = geometries + # sampling mode, for now random is the only available + self.sample_modes = "random" + @property def geometries(self): """ @@ -65,4 +68,4 @@ class OperationInterface(DomainInterface, metaclass=ABCMeta): if geometry.variables != geometries[0].variables: raise NotImplementedError( f"The geometries need to have same dimensions and labels." - ) + ) \ No newline at end of file diff --git a/pina/domain/simplex.py b/pina/domain/simplex.py index 704a9cb..ff83dc4 100644 --- a/pina/domain/simplex.py +++ b/pina/domain/simplex.py @@ -74,6 +74,9 @@ class SimplexDomain(DomainInterface): # build cartesian_bound self._cartesian_bound = self._build_cartesian(self._vertices_matrix) + # sampling mode + self.sample_modes = "random" + @property def variables(self): return sorted(self._vertices_matrix.labels) @@ -231,12 +234,13 @@ class SimplexDomain(DomainInterface): in ``variables``. """ - if variables == "all": - variables = self.variables - elif isinstance(variables, (list, tuple)): - variables = sorted(variables) + # if variables == "all": # TODO: check if this is necessary (from 0.1) + # variables = self.variables + # elif isinstance(variables, (list, tuple)): + # variables = sorted(variables) - if mode in ["random"]: + # if mode in ["random"]: + if mode in self.sample_modes: if self._sample_surface: sample_pts = self._sample_boundary_randomly(n) else: diff --git a/pina/domain/union_domain.py b/pina/domain/union_domain.py index da2ead9..07a18f2 100644 --- a/pina/domain/union_domain.py +++ b/pina/domain/union_domain.py @@ -32,6 +32,9 @@ class Union(OperationInterface): """ super().__init__(geometries) + self.sample_modes = list( + set([geom.sample_modes for geom in geometries]) + ) def is_inside(self, point, check_border=False): """