@@ -203,13 +203,18 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
203203static int sumLagrange (IPOPT_DATA_ * iData , double * erg ,int ii , int i , int j , int p , modelica_boolean mayer_yes )
204204{
205205 long double sum ;
206+ int l ;
207+
206208 OPTIMIZER_DIM_VARS * dim = & iData -> dim ;
207209 OPTIMIZER_MBASE * mbase = & iData -> mbase ;
208- int l ;
210+
209211 int nJ = (p ) ? dim -> nJ : dim -> nx ;
212+
210213 sum = 0.0 ;
214+
211215 for (l = 0 ; l < dim -> nx ; ++ l )
212- sum += iData -> df .H [l ][i ][j ];
216+ if (iData -> sopt .knowedJ [l ][j ] + iData -> sopt .knowedJ [l ][i ] >= 2 )
217+ sum += iData -> df .H [l ][i ][j ];
213218
214219 if (iData -> sopt .lagrange &&
215220 iData -> sopt .gradFs [iData -> lagrange_index ][i ]* iData -> sopt .gradFs [iData -> lagrange_index ][j ])
@@ -222,8 +227,9 @@ static int sumLagrange(IPOPT_DATA_ *iData, double * erg,int ii, int i, int j, in
222227
223228 sum = iData -> dtime .dt [ii ]* sum ;
224229
225- for (l = dim -> nx ; l < nJ ; ++ l )
226- sum += iData -> df .H [l ][i ][j ];
230+ for (l = dim -> nx ; l < nJ ; ++ l )
231+ if (iData -> sopt .knowedJ [l ][j ] + iData -> sopt .knowedJ [l ][i ] >= 2 )
232+ sum += iData -> df .H [l ][i ][j ];
227233
228234 if (mayer_yes && iData -> sopt .gradFs [iData -> mayer_index ][i ]* iData -> sopt .gradFs [iData -> mayer_index ][j ])
229235 sum += iData -> df .mH [i ][j ];
@@ -266,7 +272,7 @@ static int num_hessian(double *v, double t, IPOPT_DATA_ *iData, double *lambda,
266272 if (iData -> sopt .Hg [i ][j ]){
267273 for (l = 0 ; l < nJ ; ++ l ){
268274 if (iData -> sopt .knowedJ [l ][j ] + iData -> sopt .knowedJ [l ][i ] >= 2 && lambda [l ] != 0.0 )
269- iData -> df .H [l ][i ][j ] = (long double )lambda [ l ] * (iData -> df .J [l ][j ] - iData -> df .J0 [l ][j ])/h ;
275+ iData -> df .H [l ][i ][j ] = (long double )(iData -> df .J [l ][j ] - iData -> df .J0 [l ][j ])* lambda [ l ] /h ;
270276 else
271277 iData -> df .H [l ][i ][j ] = (long double ) 0.0 ;
272278 iData -> df .H [l ][j ][i ] = iData -> df .H [l ][i ][j ];
@@ -276,8 +282,8 @@ static int num_hessian(double *v, double t, IPOPT_DATA_ *iData, double *lambda,
276282 h = obj_factor /h ;
277283 if (lagrange_yes ){
278284 for (j = i ; j < dim -> nv ; ++ j ){
279- if (iData -> sopt .gradFs [iData -> lagrange_index ][i ]* iData -> sopt .gradFs [iData -> lagrange_index ][j ])
280- iData -> df .oH [i ][j ] = (long double ) h * iData -> scaling . vnom [ j ] * (iData -> df .gradF [0 ][j ] - iData -> df .gradF [2 ][j ]);
285+ if (iData -> sopt .gradFs [iData -> lagrange_index ][i ]* iData -> sopt .gradFs [iData -> lagrange_index ][j ] && obj_factor != 0 )
286+ iData -> df .oH [i ][j ] = (long double ) (iData -> df .gradF [0 ][j ] - iData -> df .gradF [2 ][j ])* h * iData -> scaling . vnom [ j ] ;
281287 else
282288 iData -> df .oH [i ][j ] = 0.0 ;
283289 iData -> df .oH [j ][i ] = iData -> df .oH [i ][j ] ;
@@ -286,8 +292,8 @@ static int num_hessian(double *v, double t, IPOPT_DATA_ *iData, double *lambda,
286292
287293 if (mayer_yes ){
288294 for (j = i ; j < dim -> nv ; ++ j ){
289- if (iData -> sopt .gradFs [iData -> mayer_index ][i ]* iData -> sopt .gradFs [iData -> mayer_index ][j ])
290- iData -> df .mH [i ][j ] = (long double ) h * iData -> scaling . vnom [ j ] * (iData -> df .gradF [1 ][j ] - iData -> df .gradF [3 ][j ]);
295+ if (iData -> sopt .gradFs [iData -> mayer_index ][i ]* iData -> sopt .gradFs [iData -> mayer_index ][j ] && obj_factor != 0 )
296+ iData -> df .mH [i ][j ] = (long double ) (iData -> df .gradF [1 ][j ] - iData -> df .gradF [3 ][j ])* h * iData -> scaling . vnom [ j ] ;
291297 else
292298 iData -> df .mH [i ][j ] = 0.0 ;
293299 iData -> df .mH [j ][i ] = iData -> df .mH [i ][j ] ;
0 commit comments