@@ -20,12 +20,18 @@ class PiecewiseLinearTendency(BaseTendency):
2020 )
2121
2222 def __init__ (self , user_time = None , user_value = None , ** kwargs ):
23- user_start , user_end = self ._handle_user_time (user_time )
24- annotations = self ._remove_user_time_params (kwargs )
25-
26- super ().__init__ (user_start = user_start , user_end = user_end , ** kwargs )
27- self .annotations .add_annotations (annotations )
28- self ._validate_time_value (user_time , user_value )
23+ self .pre_check_annotations = Annotations ()
24+ self .line_number = kwargs .get ("line_number" , 0 )
25+ time , value = self ._validate_time_value (user_time , user_value )
26+ self ._remove_user_time_params (kwargs )
27+ super ().__init__ (
28+ user_start = time [0 ],
29+ user_end = time [- 1 ],
30+ time = time ,
31+ value = value ,
32+ ** kwargs ,
33+ )
34+ self .annotations .add_annotations (self .pre_check_annotations )
2935
3036 self .start_value_set = True
3137 self .param .update (values_changed = True )
@@ -76,37 +82,42 @@ def _validate_time_value(self, time, value):
7682 Args:
7783 time: List of time values.
7884 value: List of values defined on each time step.
85+
86+ Returns:
87+ Tuple containing the validated time and value arrays. If any errors are
88+ encountered during the validation, the self.time and self.value defaults are
89+ returned instead.
7990 """
8091 if time is None or value is None :
8192 error_msg = "Both the `time` and `value` arrays must be specified.\n "
82- self .annotations .add (self .line_number , error_msg )
93+ self .pre_check_annotations .add (self .line_number , error_msg )
8394 elif len (time ) != len (value ):
8495 error_msg = (
8596 "The provided time and value arrays are not of the same length.\n "
8697 )
87- self .annotations .add (self .line_number , error_msg )
98+ self .pre_check_annotations .add (self .line_number , error_msg )
8899 elif len (time ) < 2 :
89100 error_msg = (
90101 "The provided time and value arrays should have a length "
91102 "of at least 2.\n "
92103 )
104+ self .pre_check_annotations .add (self .line_number , error_msg )
93105
94- self .annotations .add (self .line_number , error_msg )
95- else :
106+ try :
107+ time = np .asarray_chkfinite (time , dtype = float )
108+ value = np .asarray_chkfinite (value , dtype = float )
96109 is_monotonic = np .all (np .diff (time ) > 0 )
97110 if not is_monotonic :
98111 error_msg = "The provided time array is not monotonically increasing.\n "
99- self .annotations .add (self .line_number , error_msg )
100-
101- try :
102- time = np .asarray (time , dtype = float )
103- value = np .asarray (value , dtype = float )
112+ self .pre_check_annotations .add (self .line_number , error_msg )
104113 except Exception as error :
105- self .annotations .add (self .line_number , str (error ))
106- # Only update the time and value arrays if there are no errors
107- if not self .annotations :
108- self .time = np .array (time )
109- self .value = np .array (value )
114+ self .pre_check_annotations .add (self .line_number , str (error ))
115+
116+ # If there are any errors, use the default values instead
117+ if not self .pre_check_annotations :
118+ return time , value
119+ else :
120+ return self .time , self .value
110121
111122 def _remove_user_time_params (self , kwargs ):
112123 """Remove user_start, user_duration, and user_end if they are passed as kwargs,
@@ -115,37 +126,13 @@ def _remove_user_time_params(self, kwargs):
115126
116127 Args:
117128 kwargs: the keyword arguments.
118-
119- Returns:
120- annotations containing the errors, or an empty annotations object.
121129 """
122130 line_number = kwargs .get ("user_line_number" , 0 )
123- annotations = Annotations ()
124131
125- error_msg = "is not allowed in a piecewise tendency\n It will be ignored. \ n "
132+ error_msg = "is not allowed in a piecewise tendency\n "
126133 for key in ["user_start" , "user_duration" , "user_end" ]:
127134 if key in kwargs :
128135 kwargs .pop (key )
129- annotations .add (
136+ self . pre_check_annotations .add (
130137 line_number , f"'{ key .replace ('user_' , '' )} ' { error_msg } "
131138 )
132-
133- return annotations
134-
135- def _handle_user_time (self , user_time ):
136- """Get the start and end of the time array.
137-
138- Args:
139- user_time: Time array provided by the user.
140- """
141- if (
142- user_time is not None
143- and len (user_time ) > 1
144- and (user_time [- 1 ] - user_time [0 ]) > 0
145- ):
146- user_start = user_time [0 ]
147- user_end = user_time [- 1 ]
148- else :
149- user_start = self .time [0 ]
150- user_end = self .time [- 1 ]
151- return user_start , user_end
0 commit comments