Skip to content

Commit

Permalink
- better evalution (object function) for numerical hess
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@18149 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Nov 15, 2013
1 parent 06590ab commit 65ca2bf
Showing 1 changed file with 59 additions and 42 deletions.
101 changes: 59 additions & 42 deletions SimulationRuntime/c/optimization/lagrangeFun/ipopt_hessian.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@

static int num_hessian(double *v, double t, IPOPT_DATA_ *iData, double *lambda, short lagrange_yes, short mayer_yes, double obj_factor);
static int diff_symColoredObject_hess(double *v, double t, IPOPT_DATA_ *iData, double *dF, int this_it);
static int updateCost(double *v, double t, IPOPT_DATA_ *iData, short lagrange_yes, short mayer_yes,double *F1, double *F2);
static int sumLagrange(IPOPT_DATA_ *iData, double * erg,int ii, int i, int j, int p, short mayer_yes);

/*!
* calc hessian
Expand Down Expand Up @@ -107,7 +109,7 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
int ii;
int c,r,p,id,l;
double t;
long double sum;
double sum;
long double mayer_term;
short mayer_yes;
r = 0;
Expand All @@ -123,22 +125,14 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
iData->sh[j] = iData->d1[4]*(ll[j] - ll[j + iData->nx]) + ll[j + 2*iData->nx];
num_hessian(x, iData->time[p], iData,iData->sh,iData->lagrange,0,obj_factor);
}else{
num_hessian(x, iData->time[p], iData, ll, iData->lagrange, 0, obj_factor);
num_hessian(x, iData->time[p], iData, ll,iData->lagrange,0,obj_factor);
}

for(i=0;i< iData->nv;++i)
for(j = 0; j< i+1; ++j)
{
sum = 0.0;
for(l = 0; l<iData->nx; ++l)
sum += iData->H[l][i][j];

if(iData->lagrange)
sum += iData->bl[p]*iData->oH[i][j];

sum = iData->dt[ii]*sum;

values[k++] = (double) sum;
sumLagrange(iData, &sum, ii, i, j, p, mayer_yes);
values[k++] = sum;
}
r += iData->nv;
c += iData->nv;
Expand All @@ -160,18 +154,8 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
for(i=0;i< iData->nv;++i)
for(j = 0; j< i+1; ++j)
{
sum = 0.0;
for(l = 0; l<iData->nx; ++l)
sum += iData->H[l][i][j];

if(iData->lagrange)
sum += iData->br[p-1]*iData->oH[i][j];

sum = iData->dt[ii]*sum;
if(mayer_yes)
sum += iData->mH[i][j];

values[k++] = (double)sum;
sumLagrange(iData, &sum, ii, i, j, p, mayer_yes);
values[k++] = sum;
}
r += iData->nv;
c += iData->nv;
Expand All @@ -187,24 +171,45 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
}

/*!
* cal hessian (mayer part)
* cal lamda^\top \cdot H + sigma*((?)dd_lagrange + (?)dd_mayer)
* autor: Vitalij Ruge
**/
static int sumLagrange(IPOPT_DATA_ *iData, double * erg,int ii, int i, int j, int p, short mayer_yes)
{
long double sum;
int l;

sum = 0.0;
for(l = 0; l<iData->nx; ++l)
sum += iData->H[l][i][j];

if(iData->lagrange)
sum += iData->br[p-1]*iData->oH[i][j];

sum = iData->dt[ii]*sum;
if(mayer_yes)
sum += iData->mH[i][j];

*erg = (double) sum;

}

/*!
* cal numerical hessian
* autor: Vitalij Ruge
**/
static int num_hessian(double *v, double t, IPOPT_DATA_ *iData, double *lambda, short lagrange_yes, short mayer_yes, double obj_factor)
{
long double v_save;
long double h;
int i, j, l;
short upCost;

diff_functionODE(v, t , iData, iData->J0);
if(lagrange_yes || mayer_yes)
functionAlgebraics(iData->data);

if(lagrange_yes)
diff_symColoredObject_hess(v, t, iData, iData->gradF0, iData->lagrange_index);
upCost = (lagrange_yes || mayer_yes) && (obj_factor!=0);

if(mayer_yes)
diff_symColoredObject_hess(v, t, iData, iData->gradF00, iData->mayer_index);
if(upCost)
updateCost(v,t,iData,lagrange_yes,mayer_yes, iData->gradF0, iData->gradF00);

for(i = 0; i<iData->nv; ++i)
{
Expand All @@ -213,14 +218,8 @@ static int num_hessian(double *v, double t, IPOPT_DATA_ *iData, double *lambda,
v[i] += h;
diff_functionODE(v, t , iData, iData->J);

if(lagrange_yes || mayer_yes)
functionAlgebraics(iData->data);

if(lagrange_yes)
diff_symColoredObject_hess(v, t, iData, iData->gradF, iData->lagrange_index);

if(mayer_yes)
diff_symColoredObject_hess(v, t, iData, iData->gradF_, iData->mayer_index);
if(upCost)
updateCost(v,t,iData,lagrange_yes,mayer_yes, iData->gradF, iData->gradF_);

v[i] = v_save;
for(l = 0; l< iData->nx; ++l)
Expand All @@ -234,24 +233,44 @@ static int num_hessian(double *v, double t, IPOPT_DATA_ *iData, double *lambda,
iData->H[l][j][i] = iData->H[l][i][j];
}
}

if(lagrange_yes){
for(j = i; j < iData->nv; ++j)
{
iData->oH[i][j] = (long double) obj_factor/h* (iData->gradF[j] - iData->gradF0[j]);
iData->oH[j][i] = iData->oH[i][j] ;
}
}

if(mayer_yes){
for(j = i; j < iData->nv; ++j)
{
iData->mH[i][j] = (long double) obj_factor/h* (iData->gradF_[j] - iData->gradF00[j]);
iData->mH[j][i] = iData->mH[i][j] ;
}
}

}
}



/*
* function update goal function
* author: vitalij
*/
static int updateCost(double *v, double t, IPOPT_DATA_ *iData, short lagrange_yes, short mayer_yes, double *F1, double *F2)
{
functionAlgebraics(iData->data);
if(lagrange_yes)
diff_symColoredObject_hess(v, t, iData, F1, iData->lagrange_index);

if(mayer_yes)
diff_symColoredObject_hess(v, t, iData, F2, iData->mayer_index);

return 0;
}

/*
* function calculates a symbolic colored gradient "matrix" only for hess
* author: vitalij
Expand Down Expand Up @@ -280,7 +299,6 @@ int diff_symColoredObject_hess(double *v, double t, IPOPT_DATA_ *iData, double *
else
lagrange(iData->data, &dF[k],1);

/*printf("\tdF[%i] = %g\t",k,dF[k]);*/
}
}
if(iData->matrixD ==0){
Expand All @@ -293,7 +311,6 @@ int diff_symColoredObject_hess(double *v, double t, IPOPT_DATA_ *iData, double *
mayer(iData->data, &dF[k],2);
else
lagrange(iData->data, &dF[k],2);
/*printf("dF[%i] = %g\t",k,dF[k]);*/
}
}

Expand Down

0 comments on commit 65ca2bf

Please sign in to comment.