@@ -160,7 +160,7 @@ def _get_row(row_name__: str) -> list[Any]:
160160 return ret
161161
162162
163- def validate_read_parameters (model : Model ):
163+ def validate_read_parameters (model : Model ) -> None :
164164 def _inv_msg (param_name : str , invalid_value : Any , supported_description : str ) -> str :
165165 return (
166166 f'Invalid { param_name } ({ invalid_value } ) for '
@@ -193,28 +193,46 @@ def _inv_msg(param_name: str, invalid_value: Any, supported_description: str) ->
193193
194194 econ = model .economics
195195
196- construction_years = model .surfaceplant .construction_years .value
197- capex_schedule = econ .construction_capex_schedule .value
198- capex_schedule_len = len (capex_schedule )
199- if capex_schedule_len != construction_years :
200- econ .construction_capex_schedule .value = adjust_phased_schedule_to_new_length (
201- econ .construction_capex_schedule .value , construction_years
202- )
203- msg = (
204- f'{ econ .construction_capex_schedule .Name } ({ econ .construction_capex_schedule } ) '
205- f'length ({ capex_schedule_len } ) '
206- f'does not match construction years ({ construction_years } ). '
207- f'It has been adjusted to: { econ .construction_capex_schedule .value } '
208- )
209- model .logger .warning (msg )
196+ econ .construction_capex_schedule .value = _validate_construction_capex_schedule (
197+ econ .construction_capex_schedule ,
198+ model .surfaceplant .construction_years .value ,
199+ model .logger ,
200+ )
210201
202+ construction_years = model .surfaceplant .construction_years .value
211203 if abs (econ .bond_financing_start_year .value ) >= construction_years :
212204 raise ValueError (
213205 f'{ econ .bond_financing_start_year .Name } ({ econ .bond_financing_start_year .value } ) may not be earlier than '
214206 f'first { model .surfaceplant .construction_years .Name [:- 1 ]} ({ - 1 * (construction_years - 1 )} ). '
215207 )
216208
217209
210+ def _validate_construction_capex_schedule (
211+ econ_capex_schedule : listParameter , construction_years : int , model_logger
212+ ) -> list [float ]:
213+ capex_schedule : list [float ] = econ_capex_schedule .value .copy ()
214+
215+ adjust_schedule_reasons : list [str ] = []
216+ if sum (capex_schedule ) != 1.0 :
217+ adjust_schedule_reasons .append (f'does not sum to 1.0 (sums to { sum (capex_schedule )} )' )
218+
219+ capex_schedule_len = len (capex_schedule )
220+ if capex_schedule_len != construction_years :
221+ adjust_schedule_reasons .append (
222+ f'length ({ capex_schedule_len } ) does not match ' f'construction years ({ construction_years } )'
223+ )
224+
225+ if len (adjust_schedule_reasons ) > 0 :
226+ capex_schedule = adjust_phased_schedule_to_new_length (econ_capex_schedule .value , construction_years )
227+ msg = f'{ econ_capex_schedule .Name } ({ econ_capex_schedule } ) '
228+ msg += ' and ' .join (adjust_schedule_reasons )
229+ msg += f'. It has been adjusted to: { capex_schedule } '
230+
231+ model_logger .warning (msg )
232+
233+ return capex_schedule
234+
235+
218236@lru_cache (maxsize = 12 )
219237def calculate_sam_economics (model : Model ) -> SamEconomicsCalculations :
220238 custom_gen = CustomGeneration .new ()
0 commit comments