@@ -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