@@ -152,6 +152,7 @@ def __setattr__(self, name: str, value: Set | Membership) -> None:
152
152
self ._sets [name ] = value
153
153
value .domain = self
154
154
value .name = name
155
+ value .array () # force the array to be calculated for caching
155
156
156
157
def __delattr__ (self , name : str ) -> None :
157
158
"""Delete a fuzzy set from the domain."""
@@ -223,7 +224,9 @@ def __init__(
223
224
self .func : Membership = func
224
225
self .domain : Domain | None = domain
225
226
self .name : str | None = name
226
- self .__center_of_gravity : float | None = None
227
+
228
+ self ._center_of_gravity : float | None = None
229
+ self ._cached_array : np .ndarray | None = None
227
230
228
231
@overload
229
232
def __call__ (self , x : float , / ) -> float : ...
@@ -385,11 +388,7 @@ def multiplied(self, n: float) -> Set:
385
388
def plot (self ) -> None :
386
389
"""Graph the set in the given domain."""
387
390
assert self .domain is not None , NO_DOMAIN
388
- R = self .domain .range
389
- V = [self .func (x ) for x in R ]
390
- if plt :
391
- plt .plot (R , V ) # type: ignore
392
- else :
391
+ if not plt :
393
392
raise ImportError (
394
393
"matplotlib not available. Please re-install with 'pip install fuzzylogic[plotting]'"
395
394
)
@@ -418,7 +417,9 @@ def plot(self) -> None:
418
417
def array (self ) -> Array :
419
418
"""Return an array of all values for this set within the given domain."""
420
419
assert self .domain is not None , NO_DOMAIN
421
- return np .fromiter ((self .func (x ) for x in self .domain .range ), float )
420
+ if self ._cached_array is None :
421
+ self ._cached_array = np .fromiter ((self .func (x ) for x in self .domain .range ), float )
422
+ return self ._cached_array
422
423
423
424
def range (self ) -> Array :
424
425
"""Return the range of the domain."""
@@ -427,14 +428,14 @@ def range(self) -> Array:
427
428
428
429
def center_of_gravity (self ) -> float :
429
430
"""Return the center of gravity for this distribution, within the given domain."""
430
- if self .__center_of_gravity is not None :
431
- return self .__center_of_gravity
431
+ if self ._center_of_gravity is not None :
432
+ return self ._center_of_gravity
432
433
assert self .domain is not None , NO_DOMAIN
433
434
weights = self .array ()
434
435
if sum (weights ) == 0 :
435
436
return 0
436
437
cog = float (np .average (self .domain .range , weights = weights ))
437
- self .__center_of_gravity = cog
438
+ self ._center_of_gravity = cog
438
439
return cog
439
440
440
441
def __repr__ (self ) -> str :
0 commit comments