@@ -157,6 +157,86 @@ function create_auxdata(param, graph, edges, I)
157157 return auxdata
158158end
159159
160+ """
161+ get_model(param, auxdata)
162+
163+ Construct the appropriate model based on the parameters and auxiliary data.
164+
165+ # Arguments
166+ - `param`: A named tuple containing the model parameters.
167+ - `auxdata`: Auxiliary data required for constructing the model.
168+
169+ # Returns
170+ - `model`: The constructed model.
171+ - `recover_allocation`: A function to recover the allocation from the model solution.
172+ """
173+ function get_model (param, auxdata)
174+ optimizer = get (param, :optimizer , Ipopt. Optimizer)
175+ param = dict_to_namedtuple (param)
176+
177+ if haskey (param, :model )
178+ model = param. model (optimizer, auxdata)
179+ if ! haskey (param, :recover_allocation )
180+ error (" The custom model does not have the recover_allocation function." )
181+ end
182+ recover_allocation = param. recover_allocation
183+ elseif param. mobility == 1 && param. cong
184+ if all (sum (param. Zjn .> 0 , dims = 2 ) .<= 1 ) # Armington case
185+ model = model_mobility_cgc_armington (optimizer, auxdata)
186+ recover_allocation = recover_allocation_mobility_cgc_armington
187+ else
188+ model = model_mobility_cgc (optimizer, auxdata)
189+ recover_allocation = recover_allocation_mobility_cgc
190+ end
191+ elseif param. mobility == 0.5 && param. cong
192+ if all (sum (param. Zjn .> 0 , dims = 2 ) .<= 1 ) # Armington case
193+ model = model_partial_mobility_cgc_armington (optimizer, auxdata)
194+ recover_allocation = recover_allocation_partial_mobility_cgc_armington
195+ else
196+ model = model_partial_mobility_cgc (optimizer, auxdata)
197+ recover_allocation = recover_allocation_partial_mobility_cgc
198+ end
199+ elseif param. mobility == 0 && param. cong
200+ if all (sum (param. Zjn .> 0 , dims = 2 ) .<= 1 ) # Armington case
201+ model = model_fixed_cgc_armington (optimizer, auxdata)
202+ recover_allocation = recover_allocation_fixed_cgc_armington
203+ else
204+ model = model_fixed_cgc (optimizer, auxdata)
205+ recover_allocation = recover_allocation_fixed_cgc
206+ end
207+ elseif param. mobility == 1 && ! param. cong
208+ if all (sum (param. Zjn .> 0 , dims = 2 ) .<= 1 ) # Armington case
209+ model = model_mobility_armington (optimizer, auxdata)
210+ recover_allocation = recover_allocation_mobility_armington
211+ else
212+ model = model_mobility (optimizer, auxdata)
213+ recover_allocation = recover_allocation_mobility
214+ end
215+ elseif param. mobility == 0.5 && ! param. cong
216+ if all (sum (param. Zjn .> 0 , dims = 2 ) .<= 1 ) # Armington case
217+ model = model_partial_mobility_armington (optimizer, auxdata)
218+ recover_allocation = recover_allocation_partial_mobility_armington
219+ else
220+ model = model_partial_mobility (optimizer, auxdata)
221+ recover_allocation = recover_allocation_partial_mobility
222+ end
223+ elseif param. mobility == 0 && ! param. cong
224+ if all (sum (param. Zjn .> 0 , dims = 2 ) .<= 1 ) # Armington case
225+ model = model_fixed_armington (optimizer, auxdata)
226+ recover_allocation = recover_allocation_fixed_armington
227+ elseif param. beta <= 1 && param. a < 1 && param. duality
228+ model = model_fixed_duality (optimizer, auxdata)
229+ recover_allocation = recover_allocation_fixed_duality
230+ else
231+ model = model_fixed (optimizer, auxdata)
232+ recover_allocation = recover_allocation_fixed
233+ end
234+ else
235+ error (" Usupported model configuration with labor_mobility = $(param. mobility) and cross_good_congestion = $(param. cong) " )
236+ end
237+ return model, recover_allocation
238+ end
239+
160240function all_variables_except_kappa_ex (model)
161241 all_vars = all_variables (model)
162242 return setdiff (all_vars, model[:kappa_ex ])
0 commit comments