Skip to content

Commit 98e92e9

Browse files
committed
More checks.
1 parent 883a9e9 commit 98e92e9

1 file changed

Lines changed: 36 additions & 15 deletions

File tree

src/models/solve_allocation_by_duality_cgc.jl

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ function solve_allocation_by_duality_cgc(x0, auxdata, verbose=true)
5353

5454
# Set Ipopt options
5555
Ipopt.AddIpoptStrOption(prob, "hessian_approximation", "exact")
56-
Ipopt.AddIpoptIntOption(prob, "max_iter", 200)
56+
Ipopt.AddIpoptIntOption(prob, "max_iter", 1000)
5757
Ipopt.AddIpoptIntOption(prob, "print_level", verbose ? 5 : 0)
5858

5959
if haskey(param, :optimizer_attr)
@@ -196,41 +196,62 @@ function hessian_duality_cgc(
196196
diff = Pjn[k, n] - Pjn[j, n]
197197
if diff >= 0 # Flows in the direction of k
198198
tmp = Qjkn[j, k, n]
199-
T = Qjk[j, k]^(1+beta) / kappa[j, k]
199+
T = Qjk[j, k]^(1 + beta) / kappa[j, k]
200200
PK0 = PCj[j] * (1 + beta) / kappa[j, k]
201-
KPABprimemQjkn = cons * ((Pjn[k, nd] - Pjn[j, nd])/m[nd])^n1dnum1 * (PK0 * Qjk[j, k]^beta)^(-nu*n1dnum1)
201+
diffnd = Pjn[k, nd] - Pjn[j, nd]
202+
if diffnd > 0
203+
KPABprimemQjkn = cons * (diffnd/m[nd])^n1dnum1 * (PK0 * Qjk[j, k]^beta)^(-nu*n1dnum1)
204+
if !isfinite(KPABprimemQjkn)
205+
KPABprimemQjkn = 0
206+
end
207+
end
202208
if jd == j
203209
KPprimeABmQjkn = m1dbeta * Pjn[j, nd]^(-sigma) * PCj[j]^(sigma-1)
204210
term += tmp * KPprimeABmQjkn # KP'AB
205-
if nd == n
211+
if nd == n && diff > 0
206212
term -= tmp * n1dnum1 / diff # KPA'B
207213
end
208-
term += tmp * KPABprimemQjkn # KPAB'
209-
term += T * ((1+beta)*KPprimeABmQjkn + cons2 * KPABprimemQjkn) * G # T'G
214+
if diffnd > 0
215+
term += tmp * KPABprimemQjkn # KPAB'
216+
term += T * cons2 * KPABprimemQjkn * G # T'G: second part
217+
end
218+
term += T * (1+beta) * KPprimeABmQjkn * G # T'G: first part
210219
term += T * Gprime # TG'
211220
elseif jd == k
212-
if nd == n
221+
if nd == n && diff > 0
213222
term += tmp * n1dnum1 / diff # KPA'B [A'(k) has opposite sign]
214223
end
215-
term -= tmp * KPABprimemQjkn # KPAB' [B'(k) has opposite sign]
216-
term -= T * cons2 * KPABprimemQjkn * G # T'G [B'(k) has opposite sign]
224+
if diffnd > 0
225+
term -= tmp * KPABprimemQjkn # KPAB' [B'(k) has opposite sign]
226+
term -= T * cons2 * KPABprimemQjkn * G # T'G: second part [B'(k) has opposite sign]
227+
end
217228
end
218229
else # Flows in the direction of j
219230
tmp = Qjkn[k, j, n]
220231
PK0 = PCj[k] * (1 + beta) / kappa[k, j]
221-
KPABprimemQjkn = cons * ((Pjn[j, nd] - Pjn[k, nd])/m[nd])^n1dnum1 * (PK0 * Qjk[k, j]^beta)^(-nu*n1dnum1)
232+
diffnd = Pjn[j, nd] - Pjn[k, nd]
233+
if diffnd > 0
234+
KPABprimemQjkn = cons * (diffnd/m[nd])^n1dnum1 * (PK0 * Qjk[k, j]^beta)^(-nu*n1dnum1)
235+
if !isfinite(KPABprimemQjkn)
236+
KPABprimemQjkn = 0
237+
end
238+
end
222239
if jd == k
223240
KPprimeABmQjkn = m1dbeta * Pjn[k, nd]^(-sigma) * PCj[k]^(sigma-1)
224241
term -= tmp * KPprimeABmQjkn # KP'AB
225-
if nd == n
242+
if nd == n && diff < 0
226243
term += tmp * n1dnum1 / abs(diff) # KPA'B
227244
end
228-
term -= tmp * KPABprimemQjkn # KPAB'
245+
if diffnd > 0
246+
term -= tmp * KPABprimemQjkn # KPAB'
247+
end
229248
elseif jd == j
230-
if nd == n
249+
if nd == n && diff < 0
231250
term -= tmp * n1dnum1 / abs(diff) # KPA'B [Akj'(j) has opposite sign]
232251
end
233-
term += tmp * KPABprimemQjkn # KPAB' [Bkj'(j) has opposite sign]
252+
if diffnd > 0
253+
term += tmp * KPABprimemQjkn # KPAB' [Bkj'(j) has opposite sign]
254+
end
234255
end
235256
end
236257
end # End of k loop
@@ -300,7 +321,7 @@ function recover_allocation_duality_cgc(x, auxdata)
300321
# Calculate the flows Qjkn
301322
Qjkn = zeros(graph.J, graph.J, param.N)
302323
temp = kappa ./ ((1 + beta) * PCj .* Qjk .^ (1+beta-nu))
303-
temp[nadj .| isinf.(temp)] .= 0 # Because of the max() clause, Qjk may be zero
324+
temp[nadj .| .!isfinite.(temp)] .= 0 # Because of the max() clause, Qjk may be zero
304325
for n in 1:param.N
305326
Lambda = repeat(Pjn[:, n], 1, graph.J)
306327
LL = max.(Lambda' - Lambda, 0) # P^n_k - P^n_j (non-negative flows)

0 commit comments

Comments
 (0)