@@ -215,6 +215,40 @@ function _format_infinite_info(
215215 )
216216end
217217
218+ # Helper function for transcribing infinite variables/derivatives
219+ function _transcribe_infinite_variable (backend, vref, base_name, info)
220+ param_nums = InfiniteOpt. _parameter_numbers (vref)
221+ group_idxs = InfiniteOpt. parameter_group_int_indices (vref)
222+ prefs = InfiniteOpt. raw_parameter_refs (vref)
223+ # prepare for iterating over its supports
224+ supp_indices = support_index_iterator (backend, group_idxs)
225+ dims = size (supp_indices)[group_idxs]
226+ vrefs = Array {JuMP.VariableRef, length(dims)} (undef, dims... )
227+ supp_type = typeof (Tuple (ones (length (prefs)), prefs))
228+ supps = Array {supp_type, length(dims)} (undef, dims... )
229+ lookup_dict = sizehint! (Dict {Vector{Float64}, JuMP.VariableRef} (), length (vrefs))
230+ # create a variable for each support
231+ for i in supp_indices
232+ supp = index_to_support (backend, i)[param_nums]
233+ new_info = _format_infinite_info (info, supp)
234+ var_idx = i. I[group_idxs]
235+ tuple_supp = Tuple (supp, prefs)
236+ name = _make_var_name (base_name, param_nums, tuple_supp, var_idx)
237+ var = JuMP. ScalarVariable (new_info)
238+ jump_vref = JuMP. add_variable (backend. model, var, name)
239+ @inbounds vrefs[var_idx... ] = jump_vref
240+ lookup_dict[supp] = jump_vref
241+ @inbounds supps[var_idx... ] = tuple_supp
242+ end
243+ # save the transcription information
244+ data = transcription_data (backend)
245+ gvref = InfiniteOpt. GeneralVariableRef (vref)
246+ data. infvar_lookup[gvref] = lookup_dict
247+ data. infvar_mappings[gvref] = vrefs
248+ data. infvar_supports[gvref] = supps
249+ return
250+ end
251+
218252"""
219253 transcribe_infinite_variables!(
220254 backend::TranscriptionBackend,
@@ -234,75 +268,14 @@ function transcribe_infinite_variables!(
234268 model:: InfiniteOpt.InfiniteModel
235269 )
236270 for (idx, object) in InfiniteOpt. _data_dictionary (model, InfiniteOpt. InfiniteVariable)
237- # get the basic variable information
238- var = object. variable
271+ info = object. variable. info
239272 base_name = object. name
240- param_nums = var. parameter_nums
241- group_idxs = var. group_int_idxs
242- prefs = var. parameter_refs
243- # prepare for iterating over its supports
244- supp_indices = support_index_iterator (backend, group_idxs)
245- dims = size (supp_indices)[group_idxs]
246- vrefs = Array {JuMP.VariableRef, length(dims)} (undef, dims... )
247- supp_type = typeof (Tuple (ones (length (prefs)), prefs))
248- supps = Array {supp_type, length(dims)} (undef, dims... )
249- lookup_dict = sizehint! (Dict {Vector{Float64}, JuMP.VariableRef} (), length (vrefs))
250- # create a variable for each support
251- for i in supp_indices
252- supp = index_to_support (backend, i)[param_nums]
253- info = _format_infinite_info (var. info, supp)
254- var_idx = i. I[group_idxs]
255- tuple_supp = Tuple (supp, prefs)
256- v_name = _make_var_name (base_name, param_nums, tuple_supp, var_idx)
257- v = JuMP. ScalarVariable (info)
258- jump_vref = JuMP. add_variable (backend. model, v, v_name)
259- @inbounds vrefs[var_idx... ] = jump_vref
260- lookup_dict[supp] = jump_vref
261- @inbounds supps[var_idx... ] = tuple_supp
262- end
263- # save the transcription information
264- ivref = InfiniteOpt. GeneralVariableRef (model, idx)
265- data = transcription_data (backend)
266- data. infvar_lookup[ivref] = lookup_dict
267- data. infvar_mappings[ivref] = vrefs
268- data. infvar_supports[ivref] = supps
273+ vref = InfiniteOpt. InfiniteVariableRef (model, idx)
274+ _transcribe_infinite_variable (backend, vref, base_name, info)
269275 end
270276 return
271277end
272278
273- function _transcribe_derivative_variable (dref, d, backend)
274- base_name = InfiniteOpt. variable_string (MIME (" text/plain" ), dispatch_variable_ref (dref))
275- param_nums = InfiniteOpt. _parameter_numbers (d. variable_ref)
276- group_idxs = InfiniteOpt. parameter_group_int_indices (d. variable_ref)
277- prefs = InfiniteOpt. raw_parameter_refs (dref)
278- # prepare for iterating over its supports
279- supp_indices = support_index_iterator (backend, group_idxs)
280- dims = size (supp_indices)[group_idxs]
281- vrefs = Array {JuMP.VariableRef, length(dims)} (undef, dims... )
282- supp_type = typeof (Tuple (ones (length (prefs)), prefs))
283- supps = Array {supp_type, length(dims)} (undef, dims... )
284- lookup_dict = sizehint! (Dict {Vector{Float64}, JuMP.VariableRef} (), length (vrefs))
285- # create a variable for each support
286- for i in supp_indices
287- supp = index_to_support (backend, i)[param_nums]
288- info = _format_infinite_info (d. info, supp)
289- var_idx = i. I[group_idxs]
290- tuple_supp = Tuple (supp, prefs)
291- d_name = _make_var_name (base_name, param_nums, tuple_supp, var_idx)
292- d_var = JuMP. ScalarVariable (info)
293- jump_vref = JuMP. add_variable (backend. model, d_var, d_name)
294- @inbounds vrefs[var_idx... ] = jump_vref
295- lookup_dict[supp] = jump_vref
296- @inbounds supps[var_idx... ] = tuple_supp
297- end
298- # save the transcription information
299- data = transcription_data (backend)
300- data. infvar_lookup[dref] = lookup_dict
301- data. infvar_mappings[dref] = vrefs
302- data. infvar_supports[dref] = supps
303- return
304- end
305-
306279"""
307280 transcribe_derivative_variables!(
308281 backend::TranscriptionBackend,
@@ -323,24 +296,16 @@ function transcribe_derivative_variables!(
323296 backend:: TranscriptionBackend ,
324297 model:: InfiniteOpt.InfiniteModel
325298 )
299+ # convert any high order derivatives into 1st order ones if required by method
300+ # TODO find way of doing this without modifying `model`
301+ InfiniteOpt. reformulate_high_order_derivatives! (model)
302+ # transcribe all the derivatives
326303 for (idx, object) in InfiniteOpt. _data_dictionary (model, InfiniteOpt. Derivative)
327304 # get the basic derivative information
328- dref = InfiniteOpt. GeneralVariableRef (model, idx)
329- d = object. variable
330- method = InfiniteOpt. derivative_method (dref)
331- # if needed process lower order derivatives
332- if ! InfiniteOpt. allows_high_order_derivatives (method) && d. order > 1
333- for o in d. order- 1 : - 1 : 1
334- if ! haskey (model. deriv_lookup, (d. variable_ref, d. parameter_ref, o))
335- info = InfiniteOpt. _DefaultDerivativeInfo
336- new_d = InfiniteOpt. Derivative (info, d. variable_ref, d. parameter_ref, o)
337- new_dref = InfiniteOpt. add_derivative (model, new_d)
338- _transcribe_derivative_variable (new_dref, d, backend)
339- end
340- end
341- end
342- # process the derivative
343- _transcribe_derivative_variable (dref, d, backend)
305+ dref = InfiniteOpt. DerivativeRef (model, idx)
306+ base_name = InfiniteOpt. variable_string (MIME (" text/plain" ), dref)
307+ info = object. variable. info
308+ _transcribe_infinite_variable (backend, dref, base_name, info)
344309 end
345310 return
346311end
@@ -927,10 +892,6 @@ function transcribe_derivative_evaluations!(
927892 if ! InfiniteOpt. has_derivative_constraints (dref)
928893 # generate the evaluation expressions
929894 vref = object. variable. variable_ref
930- if ! InfiniteOpt. allows_high_order_derivatives (method) && order > 1
931- d_idx = model. deriv_lookup[vref, object. variable. parameter_ref, order - 1 ]
932- vref = InfiniteOpt. GeneralVariableRef (model, d_idx)
933- end
934895 exprs = InfiniteOpt. evaluate_derivative (dref, vref, method, backend)
935896 # prepare the iteration helpers
936897 param_group_int_idx = InfiniteOpt. parameter_group_int_index (pref)
0 commit comments