21
21
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
22
# SOFTWARE.
23
23
# ~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
24
+
24
25
import re
26
+ import warnings
25
27
from typing import Generic
26
28
from typing import List
27
29
from typing import Optional
30
+ from typing import Tuple
28
31
from typing import TypeVar
29
-
30
- import numpy as np
32
+ from typing import Union
31
33
32
34
33
35
# ========================================================================= #
34
36
# Members #
35
37
# ========================================================================= #
38
+ import numpy as np
36
39
37
40
38
41
class MemberIsNotEvaluatedError (Exception ):
@@ -44,14 +47,15 @@ class MemberAlreadyEvaluatedError(Exception):
44
47
45
48
46
49
T = TypeVar ('T' )
50
+ Fitness = Union [float , Tuple [float , ...]]
47
51
48
52
49
53
_RE_WHITESPACE = re .compile (r'\s\s+' )
50
54
51
55
52
56
class Member (Generic [T ]):
53
57
54
- def __init__ (self , value : T , fitness : float = None ):
58
+ def __init__ (self , value : T , fitness : Fitness = None ):
55
59
self ._value = value
56
60
self ._fitness = None
57
61
# set fitness
@@ -63,26 +67,36 @@ def value(self) -> T:
63
67
return self ._value
64
68
65
69
@property
66
- def fitness_unsafe (self ) -> Optional [float ]:
70
+ def fitness_unsafe (self ) -> Optional [Fitness ]:
67
71
return self ._fitness
68
72
73
+ @fitness_unsafe .setter
74
+ def fitness_unsafe (self , fitness : Fitness ):
75
+ if self .is_evaluated :
76
+ raise MemberAlreadyEvaluatedError ('The member has already been evaluated, the fitness can only ever be set once. Create a new member instead!' )
77
+ if fitness is None :
78
+ raise ValueError ('cannot set the fitness value to None' )
79
+ # set the value
80
+ self ._fitness = fitness
81
+
69
82
@property
70
- def fitness (self ) -> float :
83
+ def fitness (self ) -> Fitness :
71
84
if not self .is_evaluated :
72
85
raise MemberIsNotEvaluatedError ('The member has not been evaluated, the fitness has not yet been set.' )
73
86
return self ._fitness
74
87
75
88
@fitness .setter
76
- def fitness (self , fitness : float ):
77
- if self .is_evaluated :
78
- raise MemberAlreadyEvaluatedError ('The member has already been evaluated, the fitness can only ever be set once. Create a new member instead!' )
79
- if np .isnan (fitness ):
80
- raise ValueError ('fitness values cannot be NaN, this is an error!' )
81
- self ._fitness = float (fitness )
82
-
83
- def set_fitness (self , fitness : float ) -> 'Member[T]' :
84
- self .fitness = fitness
85
- return self
89
+ def fitness (self , fitness : Fitness ):
90
+ # check values
91
+ if isinstance (fitness , (float , int )):
92
+ pass
93
+ elif isinstance (fitness , tuple ):
94
+ if not all (isinstance (f , (float , int )) for f in fitness ):
95
+ warnings .warn ('multivariate fitness value does not consist of floats, this is probably an error!' )
96
+ else :
97
+ warnings .warn (f'fitness value is not a float or tuple of floats, this is probably an error! Got type: { type (fitness )} ' )
98
+ # set the value
99
+ self .fitness_unsafe = fitness
86
100
87
101
@property
88
102
def is_evaluated (self ) -> bool :
0 commit comments