Skip to content

Commit

Permalink
- improve num hessian
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19912 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Apr 1, 2014
1 parent 866f0a0 commit 970ddec
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 85 deletions.
69 changes: 69 additions & 0 deletions SimulationRuntime/c/optimization/constraints/evalfDiffG.c
Expand Up @@ -51,6 +51,7 @@ static int lobattoJac3(long double *a, long double *J, long double *J0, long do
static int jac_struc(IPOPT_DATA_ *iData,int *iRow, int *iCol);
static int conJac(long double *J, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData);

static int diff_functionODE(double *v, int k, IPOPT_DATA_ *iData, long double **J);

/*!
* eval derivation of s.t.
Expand Down Expand Up @@ -603,5 +604,73 @@ static int jac_struc(IPOPT_DATA_ *iData, int *iRow, int *iCol)
return 0;
}

/*!
* eval a part from the derivate of s.t.
* author: Vitalij Ruge
**/
static int diff_functionODE(double* v, int k, IPOPT_DATA_ *iData, long double **J)
{
int i, j;
double *x, *u;
x = v;
u = v + iData->dim.nx;

refreshSimData(x,u,k,iData);
diff_symColoredODE(v,k,iData,J);

return 0;
}

/*
* function calculates a symbolic colored jacobian matrix by
* author: Willi Braun
*/
int diff_symColoredODE(double *v, int k, IPOPT_DATA_ *iData, long double **J)
{
DATA * data = iData->data;
const int index = 2;

int i,j,l,ii,nx;
int *cC,*lindex;

nx = data->simulationInfo.analyticJacobians[index].sizeCols;
cC = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.colorCols;
lindex = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex;

for(i = 1; i < data->simulationInfo.analyticJacobians[index].sparsePattern.maxColors + 1; ++i){
for(ii = 0; ii<nx; ++ii){
if(cC[ii] == i){
data->simulationInfo.analyticJacobians[index].seedVars[ii] = iData->scaling.vnom[ii];
}
}

data->callback->functionJacB_column(data);

for(ii = 0; ii < nx; ii++){
if(cC[ii] == i){
if(ii == 0) j = 0;
else j = lindex[ii-1];

for(; j<lindex[ii]; ++j){
l = data->simulationInfo.analyticJacobians[index].sparsePattern.index[j];
if(l < iData->dim.nx)
J[l][ii] = data->simulationInfo.analyticJacobians[index].resultVars[l]*iData->scaling.scalf[l];
else
J[l][ii] = data->simulationInfo.analyticJacobians[index].resultVars[l];
}
}
}

for(ii = 0; ii<nx; ++ii){
if(cC[ii] == i){
data->simulationInfo.analyticJacobians[index].seedVars[ii] = 0.0;
}
}
}


return 0;
}


#endif
82 changes: 0 additions & 82 deletions SimulationRuntime/c/optimization/constraints/evalfG.c
Expand Up @@ -52,8 +52,6 @@ static inline void evalG13(Number *g, IPOPT_DATA_ *iData, int i);
static inline void evalG21(Number *g, IPOPT_DATA_ *iData, int i);
static inline void evalG22(Number *g, IPOPT_DATA_ *iData, int i);
static inline void evalG23(Number *g, IPOPT_DATA_ *iData, int i);
static int diff_symColoredODE(double *v, int k, IPOPT_DATA_ *iData, long double **J);
static int num_diff_symColoredODE(double *v, int k, IPOPT_DATA_ *iData, double **J);
static void printMaxError(IPOPT_DATA_ *iData, double *g,double time, double * max_err , double * tt, int *xi);

/*!
Expand Down Expand Up @@ -166,86 +164,6 @@ int functionODE_(double * x, double *u, int k, double * dotx, IPOPT_DATA_ *iData
return 0;
}

/*!
* eval a part from the derivate of s.t.
* author: Vitalij Ruge
**/
int diff_functionODE(double* v, int k, IPOPT_DATA_ *iData, long double **J)
{
int i, j;
double *x, *u;
x = v;
u = v + iData->dim.nx;

refreshSimData(x,u,k,iData);
diff_symColoredODE(v,k,iData,J);

/*
#ifdef JAC_ADOLC
for(j = 0; j<iData->nv;++j)
iData->sv[j] = v[j]*iData->vnom[j];
jacobian(0, iData->nx, iData->nv, iData->sv, iData->J);
for(i = 0;i<iData->nv;++i)
for(j = 0; j <iData->nx; ++j)
J[j][i] *= iData->scalf[j]*iData->vnom[i];
#endif
*/

return 0;
}

/*
* function calculates a symbolic colored jacobian matrix by
* author: Willi Braun
*/
int diff_symColoredODE(double *v, int k, IPOPT_DATA_ *iData, long double **J)
{
DATA * data = iData->data;
const int index = 2;

int i,j,l,ii,nx;
int *cC,*lindex;

nx = data->simulationInfo.analyticJacobians[index].sizeCols;
cC = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.colorCols;
lindex = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex;

for(i = 1; i < data->simulationInfo.analyticJacobians[index].sparsePattern.maxColors + 1; ++i){
for(ii = 0; ii<nx; ++ii){
if(cC[ii] == i){
data->simulationInfo.analyticJacobians[index].seedVars[ii] = iData->scaling.vnom[ii];
}
}

data->callback->functionJacB_column(data);

for(ii = 0; ii < nx; ii++){
if(cC[ii] == i){
if(ii == 0) j = 0;
else j = lindex[ii-1];

for(; j<lindex[ii]; ++j){
l = data->simulationInfo.analyticJacobians[index].sparsePattern.index[j];
if(l < iData->dim.nx)
J[l][ii] = data->simulationInfo.analyticJacobians[index].resultVars[l]*iData->scaling.scalf[l];
else
J[l][ii] = data->simulationInfo.analyticJacobians[index].resultVars[l];
}
}
}

for(ii = 0; ii<nx; ++ii){
if(cC[ii] == i){
data->simulationInfo.analyticJacobians[index].seedVars[ii] = 0.0;
}
}
}


return 0;
}


/*!
* helper evalfG
Expand Down
45 changes: 43 additions & 2 deletions SimulationRuntime/c/optimization/lagrangeFun/ipopt_hessian.c
Expand Up @@ -45,6 +45,7 @@
static int num_hessian(double *v, int k, IPOPT_DATA_ *iData, double *lambda, modelica_boolean lagrange_yes, modelica_boolean mayer_yes, double obj_factor);
static int updateCost(double *v, int k, IPOPT_DATA_ *iData, modelica_boolean lagrange_yes, modelica_boolean mayer_yes,long double *F1, long double *F2);
static int sumLagrange(IPOPT_DATA_ *iData, double * erg,int ii, int i, int j, int p, modelica_boolean mayer_yes);
static int diff_functionODE_con(double *v, int k, IPOPT_DATA_ *iData, long double **J);

/*!
* calc hessian
Expand Down Expand Up @@ -250,7 +251,7 @@ static int num_hessian(double *v, int k, IPOPT_DATA_ *iData, double *lambda, mod
OPTIMIZER_DIM_VARS *dim = &iData->dim;
int nJ = (k>0) ? dim->nJ : dim->nx;

diff_functionODE(v, k , iData, iData->df.Jh[0]);
diff_functionODE_con(v, k , iData, iData->df.Jh[0]);
upCost = (lagrange_yes || mayer_yes) && (obj_factor!=0);

if(upCost)
Expand All @@ -260,7 +261,7 @@ static int num_hessian(double *v, int k, IPOPT_DATA_ *iData, double *lambda, mod
v_save = (long double)v[i];
h = (long double)DF_STEP(v_save, iData->scaling.vnom[i]);
v[i] += h;
diff_functionODE(v, k , iData, iData->df.Jh[1]);
diff_functionODE_con(v, k , iData, iData->df.Jh[1]);

if(upCost)
updateCost(v,k,iData,lagrange_yes,mayer_yes, iData->df.gradFh[0], iData->df.gradFh[1]);
Expand Down Expand Up @@ -321,5 +322,45 @@ static int updateCost(double *v, int k, IPOPT_DATA_ *iData, modelica_boolean lag
return 0;
}

/*!
* eval a part from the derivate of s.t.
* author: Vitalij Ruge
**/
static int diff_functionODE_con(double* v, int k, IPOPT_DATA_ *iData, long double **J)
{
int i, j;
double *x, *u;
x = v;
u = v + iData->dim.nx;

{
DATA* data = iData->data;
SIMULATION_DATA *sData = (SIMULATION_DATA*)data->localData[0];
OPTIMIZER_EVALF *evalf = &iData->evalf;
long double t = iData->dtime.time[k];

memcpy(data->localData[0]->realVars, evalf->v[k], sizeof(double)*iData->dim.nReal);
memcpy(data->localData[1]->realVars, evalf->v[k], sizeof(double)*iData->dim.nReal);
memcpy(data->localData[2]->realVars, evalf->v[k], sizeof(double)*iData->dim.nReal);

for(j = 0; j<iData->dim.nx;++j){
sData->realVars[j] = x[j]*iData->scaling.vnom[j];
}

for(i = 0; i<iData->dim.nu;++i,++j){
data->simulationInfo.inputVars[i] = u[i]*iData->scaling.vnom[j];
}

data->callback->input_function(data);
sData->timeValue = (double) t;

data->callback->functionODE(data);
data->callback->functionAlgebraics(data);
}
diff_symColoredODE(v,k,iData,J);

return 0;
}

#undef DF_STEP
#endif
2 changes: 1 addition & 1 deletion SimulationRuntime/c/optimization/localFunction.h
Expand Up @@ -69,7 +69,7 @@ Bool ipopt_h(int n, double *x, Bool new_x, double obj_factor, int m, double *lam

/*sym JAC*/
int diff_symColoredObject(IPOPT_DATA_ *iData, long double *gradF, int this_it);
int diff_functionODE(double *v, int k, IPOPT_DATA_ *iData, long double **J);
int diff_symColoredODE(double *v, int k, IPOPT_DATA_ *iData, long double **J);

/*model*/
int functionODE_(double * x, double *u, int k, double * dotx, IPOPT_DATA_ *iData);
Expand Down

0 comments on commit 970ddec

Please sign in to comment.