4141
4242#ifdef WITH_IPOPT
4343
44- static int hessian_ode (double * v , double t , IPOPT_DATA_ * iData , double * lambda );
45- static int hessian_lagrange (double * v , double t , IPOPT_DATA_ * iData , double obj_factor );
46- static int hessian_mayer (double * v , double t , IPOPT_DATA_ * iData , double obj_factor );
47-
44+ static int num_hessian (double * v , double t , IPOPT_DATA_ * iData , double * lambda , short lagrange_yes , short mayer_yes , double obj_factor );
45+ static int diff_symColoredObject_hess (double * v , double t , IPOPT_DATA_ * iData , double * dF , int this_it );
4846
4947/*!
5048 * calc hessian
@@ -123,14 +121,11 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
123121 {
124122 for (j = 0 ; j < iData -> nx ; ++ j )
125123 iData -> sh [j ] = iData -> d1 [4 ]* (ll [j ] - ll [j + iData -> nx ]) + ll [j + 2 * iData -> nx ];
126- hessian_ode (x , iData -> time [p ], iData ,iData -> sh );
124+ num_hessian (x , iData -> time [p ], iData ,iData -> sh , iData -> lagrange , 0 , obj_factor );
127125 }else {
128- hessian_ode (x , iData -> time [p ], iData ,ll );
126+ num_hessian (x , iData -> time [p ], iData , ll , iData -> lagrange , 0 , obj_factor );
129127 }
130128
131- if (iData -> lagrange )
132- hessian_lagrange (x , iData -> time [p ], iData ,obj_factor );
133-
134129 for (i = 0 ;i < iData -> nv ;++ i )
135130 for (j = 0 ; j < i + 1 ; ++ j )
136131 {
@@ -159,13 +154,8 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
159154 {
160155 for (p = 1 ;p < iData -> deg + 1 ;++ p ,x += iData -> nv )
161156 {
162- hessian_ode (x , iData -> time [ii * iData -> deg + p ], iData ,ll );
163-
164- if (iData -> lagrange )
165- hessian_lagrange (x , iData -> time [ii * iData -> deg + p ], iData , obj_factor );
166157 mayer_yes = iData -> mayer && ii + 1 == iData -> nsi && p == iData -> deg ;
167- if (mayer_yes )
168- hessian_mayer (x , iData -> time [ii * iData -> deg + p ], iData ,obj_factor );
158+ num_hessian (x , iData -> time [p ], iData ,ll ,iData -> lagrange ,mayer_yes ,obj_factor );
169159
170160 for (i = 0 ;i < iData -> nv ;++ i )
171161 for (j = 0 ; j < i + 1 ; ++ j )
@@ -196,81 +186,42 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
196186 return TRUE;
197187}
198188
199-
200189/*!
201190 * cal hessian (mayer part)
202191 * autor: Vitalij Ruge
203192 **/
204- static int hessian_mayer (double * v , double t , IPOPT_DATA_ * iData , double obj_factor )
193+ static int num_hessian (double * v , double t , IPOPT_DATA_ * iData , double * lambda , short lagrange_yes , short mayer_yes , double obj_factor )
205194{
206195 long double v_save ;
207196 long double h ;
208- long int i , j , l ;
209- diff_symColoredObject (v , t , iData , iData -> gradF0 , iData -> mayer_index );
210- for (i = 0 ; i < iData -> nv ; ++ i )
211- {
212- v_save = (long double )v [i ];
213- h = (long double )DF_STEP (v_save , iData -> vnom [i ]);
214- v [i ] += h ;
215- diff_symColoredObject (v , t , iData , iData -> gradF , iData -> mayer_index );
216- v [i ] = v_save ;
197+ int i , j , l ;
217198
218- for (j = i ; j < iData -> nv ; ++ j )
219- {
220- iData -> mH [i ][j ] = (long double ) obj_factor /h * (iData -> gradF [j ] - iData -> gradF0 [j ]);
221- iData -> mH [j ][i ] = iData -> mH [i ][j ] ;
222- }
223- }
199+ diff_functionODE (v , t , iData , iData -> J0 );
200+ if (lagrange_yes || mayer_yes )
201+ functionAlgebraics (iData -> data );
224202
225- return 0 ;
203+ if (lagrange_yes )
204+ diff_symColoredObject_hess (v , t , iData , iData -> gradF0 , iData -> lagrange_index );
226205
227- }
206+ if (mayer_yes )
207+ diff_symColoredObject_hess (v , t , iData , iData -> gradF00 , iData -> mayer_index );
228208
229- /*!
230- * cal hessian (lagrange part)
231- * autor: Vitalij Ruge
232- **/
233- static int hessian_lagrange (double * v , double t , IPOPT_DATA_ * iData , double obj_factor )
234- {
235- long double v_save ;
236- long double h ;
237- long int i , j , l ;
238- diff_symColoredObject (v , t , iData , iData -> gradF0 , iData -> lagrange_index );
239209 for (i = 0 ; i < iData -> nv ; ++ i )
240210 {
241211 v_save = (long double )v [i ];
242212 h = (long double )DF_STEP (v_save , iData -> vnom [i ]);
243213 v [i ] += h ;
244- diff_symColoredObject (v , t , iData , iData -> gradF , iData -> lagrange_index );
245- v [i ] = v_save ;
214+ diff_functionODE (v , t , iData , iData -> J );
246215
247- for (j = i ; j < iData -> nv ; ++ j )
248- {
249- iData -> oH [i ][j ] = (long double ) obj_factor /h * (iData -> gradF [j ] - iData -> gradF0 [j ]);
250- iData -> oH [j ][i ] = iData -> oH [i ][j ] ;
251- }
252- }
216+ if (lagrange_yes || mayer_yes )
217+ functionAlgebraics (iData -> data );
253218
254- return 0 ;
255- }
219+ if ( lagrange_yes )
220+ diff_symColoredObject_hess ( v , t , iData , iData -> gradF , iData -> lagrange_index );
256221
257- /*!
258- * cal hessian (mayer part)
259- * autor: Vitalij Ruge
260- **/
261- static int hessian_ode (double * v , double t , IPOPT_DATA_ * iData , double * lambda )
262- {
263- long double v_save ;
264- long double h ;
265- int i , j , l ;
222+ if (mayer_yes )
223+ diff_symColoredObject_hess (v , t , iData , iData -> gradF_ , iData -> mayer_index );
266224
267- diff_functionODE (v , t , iData , iData -> J0 );
268- for (i = 0 ; i < iData -> nv ; ++ i )
269- {
270- v_save = (long double )v [i ];
271- h = (long double )DF_STEP (v_save , iData -> vnom [i ]);
272- v [i ] += h ;
273- diff_functionODE (v , t , iData , iData -> J );
274225 v [i ] = v_save ;
275226 for (l = 0 ; l < iData -> nx ; ++ l )
276227 {
@@ -281,21 +232,73 @@ static int hessian_ode(double *v, double t, IPOPT_DATA_ *iData, double *lambda)
281232 else
282233 iData -> H [l ][i ][j ] = (long double ) 0.0 ;
283234 iData -> H [l ][j ][i ] = iData -> H [l ][i ][j ];
284- /*
285- tmp = (double) iData->H[l][j][i];
286- printf("H[%i][%i][%i] = %g \tindex = %i \t",l,j,i,(double)tmp, (int)(iData->knowedJ[l][j] + iData->knowedJ[l][i]));
287- printf("h = %g", (double) h);
288- printf("lambda[%i] = %g", l,(double) lambda[l]);
289- printf("\tv_save = %g\n", (double)v_save);
290- printf("\tlhs = %g\n", iData->J[l][j]);
291- printf("\trhs = %g\n", iData->J0[l][j]);
292- tmp = lambda[l]*(iData->J[l][j] - iData->J0[l][j])/h;
293- printf("\tlhs - rhs = %g\n", (double) tmp);
294- */
235+ }
236+ }
237+ if (lagrange_yes ){
238+ for (j = i ; j < iData -> nv ; ++ j )
239+ {
240+ iData -> oH [i ][j ] = (long double ) obj_factor /h * (iData -> gradF [j ] - iData -> gradF0 [j ]);
241+ iData -> oH [j ][i ] = iData -> oH [i ][j ] ;
242+ }
243+ }
244+ if (mayer_yes ){
245+ for (j = i ; j < iData -> nv ; ++ j )
246+ {
247+ iData -> mH [i ][j ] = (long double ) obj_factor /h * (iData -> gradF_ [j ] - iData -> gradF00 [j ]);
248+ iData -> mH [j ][i ] = iData -> mH [i ][j ] ;
295249 }
296250 }
297251 }
298252}
299253
300254
255+ /*
256+ * function calculates a symbolic colored gradient "matrix" only for hess
257+ * author: vitalij
258+ */
259+ int diff_symColoredObject_hess (double * v , double t , IPOPT_DATA_ * iData , double * dF , int this_it )
260+ {
261+ DATA * data = iData -> data ;
262+ const int index1 = 3 ;
263+ const int index2 = 4 ;
264+ double * x ,* u ;
265+
266+ int i ,k ;
267+
268+ x = v ;
269+ u = x + iData -> nx ;
270+
271+
272+ if (iData -> matrixC == 0 ){
273+ for (i = 0 , k = 0 ; i < iData -> nx ; ++ i , ++ k )
274+ {
275+ data -> simulationInfo .analyticJacobians [index1 ].seedVars [i ] = 1.0 ;
276+ functionJacC_column (data );
277+ data -> simulationInfo .analyticJacobians [index1 ].seedVars [i ] = 0.0 ;
278+ if (this_it == 0 )
279+ mayer (iData -> data , & dF [k ],1 );
280+ else
281+ lagrange (iData -> data , & dF [k ],1 );
282+
283+ /*printf("\tdF[%i] = %g\t",k,dF[k]);*/
284+ }
285+ }
286+ if (iData -> matrixD == 0 ){
287+ for (k = iData -> nx , i = 0 ; i < iData -> nu ; ++ i , ++ k )
288+ {
289+ data -> simulationInfo .analyticJacobians [index2 ].seedVars [i ] = 1.0 ;
290+ functionJacD_column (data );
291+ data -> simulationInfo .analyticJacobians [index2 ].seedVars [i ] = 0.0 ;
292+ if (this_it == 0 )
293+ mayer (iData -> data , & dF [k ],2 );
294+ else
295+ lagrange (iData -> data , & dF [k ],2 );
296+ /*printf("dF[%i] = %g\t",k,dF[k]);*/
297+ }
298+ }
299+
300+ return 0 ;
301+ }
302+
303+
301304#endif
0 commit comments