Skip to content

Commit e8aa3c0

Browse files
committed
Create get_model() function to fetch the right model and optimizer.
1 parent 4f6027d commit e8aa3c0

3 files changed

Lines changed: 82 additions & 91 deletions

File tree

src/main/annealing.jl

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -102,35 +102,7 @@ function annealing(param, graph, I0; kwargs...)
102102
# TODO: set IO (kappa_ex)?
103103
else
104104
auxdata = create_auxdata(param, graph, edges, I0)
105-
optimizer = get(param, :optimizer, Ipopt.Optimizer)
106-
107-
if haskey(param, :model)
108-
model = param.model(optimizer, auxdata)
109-
if !haskey(param, :recover_allocation)
110-
error("The custom model does not have the recover_allocation function.")
111-
end
112-
recover_allocation = param.recover_allocation
113-
elseif param.mobility == 1 && param.cong
114-
model = model_mobility_cgc(optimizer, auxdata)
115-
recover_allocation = recover_allocation_mobility_cgc
116-
elseif param.mobility == 0.5 && param.cong
117-
model = model_partial_mobility_cgc(optimizer, auxdata)
118-
recover_allocation = recover_allocation_partial_mobility_cgc
119-
elseif param.mobility == 0 && param.cong
120-
model = model_fixed_cgc(optimizer, auxdata)
121-
recover_allocation = recover_allocation_fixed_cgc
122-
elseif param.mobility == 1 && !param.cong
123-
model = model_mobility(optimizer, auxdata)
124-
recover_allocation = recover_allocation_mobility
125-
elseif param.mobility == 0.5 && !param.cong
126-
model = model_partial_mobility(optimizer, auxdata)
127-
recover_allocation = recover_allocation_partial_mobility
128-
elseif param.mobility == 0 && !param.cong
129-
model = model_fixed(optimizer, auxdata)
130-
recover_allocation = recover_allocation_fixed
131-
else
132-
error("Usupported model configuration with labor_mobility = $(param.mobility) and cross_good_congestion = $(param.cong)")
133-
end
105+
model, recover_allocation = get_model(param, auxdata)
134106

135107
# --------------
136108
# CUSTOMIZATIONS

src/main/helper.jl

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,86 @@ function create_auxdata(param, graph, edges, I)
157157
return auxdata
158158
end
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+
160240
function all_variables_except_kappa_ex(model)
161241
all_vars = all_variables(model)
162242
return setdiff(all_vars, model[:kappa_ex])

src/main/optimal_network.jl

Lines changed: 1 addition & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -68,68 +68,7 @@ function optimal_network(param, graph; I0=nothing, Il=nothing, Iu=nothing, verbo
6868

6969
auxdata = create_auxdata(param, graph, edges, I0)
7070

71-
optimizer = get(param, :optimizer, Ipopt.Optimizer)
72-
73-
if haskey(param, :model)
74-
model = param.model(optimizer, auxdata)
75-
if !haskey(param, :recover_allocation)
76-
error("The custom model does not have the recover_allocation function.")
77-
end
78-
recover_allocation = param.recover_allocation
79-
elseif param.mobility == 1 && param.cong
80-
if all(sum(param.Zjn .> 0, dims = 2) .<= 1) # Armington case
81-
model = model_mobility_cgc_armington(optimizer, auxdata)
82-
recover_allocation = recover_allocation_mobility_cgc_armington
83-
else
84-
model = model_mobility_cgc(optimizer, auxdata)
85-
recover_allocation = recover_allocation_mobility_cgc
86-
end
87-
elseif param.mobility == 0.5 && param.cong
88-
if all(sum(param.Zjn .> 0, dims = 2) .<= 1) # Armington case
89-
model = model_partial_mobility_cgc_armington(optimizer, auxdata)
90-
recover_allocation = recover_allocation_partial_mobility_cgc_armington
91-
else
92-
model = model_partial_mobility_cgc(optimizer, auxdata)
93-
recover_allocation = recover_allocation_partial_mobility_cgc
94-
end
95-
elseif param.mobility == 0 && param.cong
96-
if all(sum(param.Zjn .> 0, dims = 2) .<= 1) # Armington case
97-
model = model_fixed_cgc_armington(optimizer, auxdata)
98-
recover_allocation = recover_allocation_fixed_cgc_armington
99-
else
100-
model = model_fixed_cgc(optimizer, auxdata)
101-
recover_allocation = recover_allocation_fixed_cgc
102-
end
103-
elseif param.mobility == 1 && !param.cong
104-
if all(sum(param.Zjn .> 0, dims = 2) .<= 1) # Armington case
105-
model = model_mobility_armington(optimizer, auxdata)
106-
recover_allocation = recover_allocation_mobility_armington
107-
else
108-
model = model_mobility(optimizer, auxdata)
109-
recover_allocation = recover_allocation_mobility
110-
end
111-
elseif param.mobility == 0.5 && !param.cong
112-
if all(sum(param.Zjn .> 0, dims = 2) .<= 1) # Armington case
113-
model = model_partial_mobility_armington(optimizer, auxdata)
114-
recover_allocation = recover_allocation_partial_mobility_armington
115-
else
116-
model = model_partial_mobility(optimizer, auxdata)
117-
recover_allocation = recover_allocation_partial_mobility
118-
end
119-
elseif param.mobility == 0 && !param.cong
120-
if all(sum(param.Zjn .> 0, dims = 2) .<= 1) # Armington case
121-
model = model_fixed_armington(optimizer, auxdata)
122-
recover_allocation = recover_allocation_fixed_armington
123-
elseif param.beta <= 1 && param.a < 1 && param.duality
124-
model = model_fixed_duality(optimizer, auxdata)
125-
recover_allocation = recover_allocation_fixed_duality
126-
else
127-
model = model_fixed(optimizer, auxdata)
128-
recover_allocation = recover_allocation_fixed
129-
end
130-
else
131-
error("Usupported model configuration with labor_mobility = $(param.mobility) and cross_good_congestion = $(param.cong)")
132-
end
71+
model, recover_allocation = get_model(param, auxdata)
13372

13473
# --------------
13574
# CUSTOMIZATIONS

0 commit comments

Comments
 (0)