Skip to content

Commit 06590ab

Browse files
author
Vitalij Ruge
committed
- reduced evalution for numerical hess
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@18147 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent 8c322d6 commit 06590ab

File tree

3 files changed

+90
-81
lines changed

3 files changed

+90
-81
lines changed

SimulationRuntime/c/optimization/initialOptimizer/allocate_ipopt.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ int allocateIpoptData(IPOPT_DATA_ *iData)
9090
iData->J[i] = (double*) calloc(iData->nv, sizeof(double));
9191

9292
iData->gradF = (double*) calloc(iData->nv, sizeof(double));
93+
iData->gradF_ = (double*) calloc(iData->nv, sizeof(double));
9394
iData->gradF0 = (double*) calloc(iData->nv, sizeof(double));
95+
iData->gradF00 = (double*) calloc(iData->nv, sizeof(double));
9496

9597
iData->a1_ = (double**) malloc(deg1 * sizeof(double*));
9698
iData->a2_ = (double**) malloc(deg1 * sizeof(double*));
@@ -167,7 +169,9 @@ int freeIpoptData(IPOPT_DATA_ *iData)
167169
free(iData->H);
168170

169171
free(iData->gradF);
172+
free(iData->gradF_);
170173
free(iData->gradF0);
174+
free(iData->gradF00);
171175
free(iData->gmin);
172176
free(iData->gmax);
173177
free(iData->mult_g);

SimulationRuntime/c/optimization/ipoptODEstruct.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,9 @@ typedef struct IPOPT_DATA_
156156
double **J0;
157157
double **J;
158158
double * gradF;
159+
double * gradF_;
159160
double * gradF0;
161+
double * gradF00;
160162
int **knowedJ;
161163
double **numJ;
162164
long double ***H;

SimulationRuntime/c/optimization/lagrangeFun/ipopt_hessian.c

Lines changed: 84 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,8 @@
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

Comments
 (0)