@@ -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" , 1000 )
56+ Ipopt. AddIpoptIntOption (prob, " max_iter" , 3000 )
5757 Ipopt. AddIpoptIntOption (prob, " print_level" , verbose ? 5 : 0 )
5858
5959 if haskey (param, :optimizer_attr )
@@ -193,65 +193,29 @@ function hessian_duality_cgc(
193193
194194 # Now terms sum_k(Q^n_{jk} - Q^n_{kj}) as well as T'G + TG'
195195 for k in neighbors
196- diff = Pjn[k, n] - Pjn[j, n]
197- if diff >= 0 # Flows in the direction of k
198- tmp = Qjkn[j, k, n]
196+ if Qjkn[j, k, n] > 0 # Flows in the direction of k
199197 T = Qjk[j, k]^ (1 + beta) / kappa[j, k]
200198 PK0 = PCj[j] * (1 + beta) / kappa[j, k]
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
199+ KPABprime1 = cons * ((Pjn[k, nd] - Pjn[j, nd])/ m[nd])^ n1dnum1 * (PK0 * Qjk[j, k]^ beta)^ (- nu* n1dnum1)
200+ KPAprimeB1 = nd == n ? n1dnum1 / (Pjn[k, n] - Pjn[j, n]) : 0.0
208201 if jd == j
209- KPprimeABmQjkn = m1dbeta * Pjn[j, nd]^ (- sigma) * PCj[j]^ (sigma- 1 )
210- term += tmp * KPprimeABmQjkn # KP'AB
211- if nd == n && diff > 0
212- term -= tmp * n1dnum1 / diff # KPA'B
213- end
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
219- term += T * Gprime # TG'
202+ KPprimeAB1 = m1dbeta * Pjn[j, nd]^ (- sigma) * PCj[j]^ (sigma- 1 )
203+ term += Qjkn[j, k, n] * (KPprimeAB1 - KPAprimeB1 + KPABprime1) # Derivative of Qjkn
204+ term += T * (((1 + beta) * KPprimeAB1 + cons2 * KPABprime1) * G + Gprime) # T'G + TG'
220205 elseif jd == k
221- if nd == n && diff > 0
222- term += tmp * n1dnum1 / diff # KPA'B [A'(k) has opposite sign]
223- end
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
206+ term += Qjkn[j, k, n] * (KPAprimeB1 - KPABprime1) # Derivative of Qjkn
207+ term -= T * cons2 * KPABprime1 * G # Old T'G: second part [B'(k) has opposite sign]
228208 end
229- else # Flows in the direction of j
230- tmp = Qjkn[k, j, n]
209+ end
210+ if Qjkn[k, j, n] > 0 # Flows in the direction of j
231211 PK0 = PCj[k] * (1 + beta) / kappa[k, j]
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
212+ KPABprime1 = cons * ((Pjn[j, nd] - Pjn[k, nd])/ m[nd])^ n1dnum1 * (PK0 * Qjk[k, j]^ beta)^ (- nu* n1dnum1)
213+ KPAprimeB1 = nd == n ? n1dnum1 / (Pjn[j, n] - Pjn[k, n]) : 0.0
239214 if jd == k
240- KPprimeABmQjkn = m1dbeta * Pjn[k, nd]^ (- sigma) * PCj[k]^ (sigma- 1 )
241- term -= tmp * KPprimeABmQjkn # KP'AB
242- if nd == n && diff < 0
243- term += tmp * n1dnum1 / abs (diff) # KPA'B
244- end
245- if diffnd > 0
246- term -= tmp * KPABprimemQjkn # KPAB'
247- end
215+ KPprimeAB1 = m1dbeta * Pjn[k, nd]^ (- sigma) * PCj[k]^ (sigma- 1 )
216+ term -= Qjkn[k, j, n] * (KPprimeAB1 - KPAprimeB1 + KPABprime1) # Derivative of Qjkn
248217 elseif jd == j
249- if nd == n && diff < 0
250- term -= tmp * n1dnum1 / abs (diff) # KPA'B [Akj'(j) has opposite sign]
251- end
252- if diffnd > 0
253- term += tmp * KPABprimemQjkn # KPAB' [Bkj'(j) has opposite sign]
254- end
218+ term -= Qjkn[k, j, n] * (KPAprimeB1 - KPABprime1) # Derivative of Qjkn
255219 end
256220 end
257221 end # End of k loop
0 commit comments