Skip to content

Commit

Permalink
- restructure data for optimization (continuing)
Browse files Browse the repository at this point in the history
 - derivations
- fixed small bug in sparse structure for hessian



git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19887 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Mar 31, 2014
1 parent 7eb7b66 commit 8db0752
Show file tree
Hide file tree
Showing 7 changed files with 122 additions and 116 deletions.
51 changes: 26 additions & 25 deletions SimulationRuntime/c/optimization/constraints/evalfDiffG.c
Expand Up @@ -42,14 +42,14 @@
#ifdef WITH_IPOPT

/* static int jac_struc(Index *iRow, Index *iCol, long int nx, long int nv, int nsi); */
static int radauJac1(long double *a, double *J, double dt, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData);
static int lobattoJac1(long double *a, double *J, double *J0, double dt, double * values, int nv, int *k, int j, long double tmp,IPOPT_DATA_ *iData);
static int radauJac2(long double *a, double *J, double dt, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData);
static int lobattoJac2(long double *a, double *J, double *J0, double dt, double * values, int nv, int *k, int j, long double tmp,IPOPT_DATA_ *iData);
static int radauJac3(long double *a, double *J, double dt, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData);
static int lobattoJac3(long double *a, double *J, double *J0, double dt, double * values, int nv, int *k, int j, long double tmp,IPOPT_DATA_ *iData);
static int radauJac1(long double *a, long double *J, long double dt, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData);
static int lobattoJac1(long double *a, long double *J, long double *J0, long double dt, double * values, int nv, int *k, int j, long double tmp,IPOPT_DATA_ *iData);
static int radauJac2(long double *a, long double *J, long double dt, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData);
static int lobattoJac2(long double *a, long double *J, long double *J0, long double dt, double * values, int nv, int *k, int j, long double tmp,IPOPT_DATA_ *iData);
static int radauJac3(long double *a, long double *J, long double dt, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData);
static int lobattoJac3(long double *a, long double *J, long double *J0, long double dt, double * values, int nv, int *k, int j, long double tmp,IPOPT_DATA_ *iData);
static int jac_struc(IPOPT_DATA_ *iData,int *iRow, int *iCol);
static int conJac(double *J, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData);
static int conJac(long double *J, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData);


/*!
Expand Down Expand Up @@ -110,6 +110,7 @@ Bool evalfDiffG(Index n, double * x, Bool new_x, Index m, Index njac, Index *iRo
int nng = dim->nJ;
OPTIMIZER_MBASE *mbase = &iData->mbase;
OPTIMIZER_TIME *dtime = &iData->dtime;
OPTIMIZER_DF *df = &iData->df;

ipoptDebuge(iData,x);

Expand All @@ -118,50 +119,50 @@ Bool evalfDiffG(Index n, double * x, Bool new_x, Index m, Index njac, Index *iRo
tmp[1] = dtime->dt[0]*mbase->d[1][4];
tmp[2] = dtime->dt[0]*mbase->d[2][4];

diff_functionODE(x, dtime->t0 , iData, iData->J0);
diff_functionODE(x, dtime->t0 , iData, df->J0);

for(i = 0, id = dim->nv, k = 0; i<1; ++i){
tmp_index = i*dim->deg;
for(l=0; l<dim->deg; ++l, id += dim->nv){
diff_functionODE(x+id , dtime->time[tmp_index + l] , iData, iData->J);
diff_functionODE(x+id , dtime->time[tmp_index + l] , iData, iData->df.J);
for(j=0; j<dim->nx; ++j){
switch(l){
case 0:
lobattoJac1(mbase->d[l], iData->J[j], iData->J0[j], dtime->dt[i], values, dim->nv, &k, j, tmp[l], iData);
lobattoJac1(mbase->d[l], df->J[j], df->J0[j], dtime->dt[i], values, dim->nv, &k, j, tmp[l], iData);
break;
case 1:
lobattoJac2(mbase->d[l], iData->J[j], iData->J0[j], dtime->dt[i], values, dim->nv, &k, j, tmp[l], iData);
lobattoJac2(mbase->d[l], df->J[j], df->J0[j], dtime->dt[i], values, dim->nv, &k, j, tmp[l], iData);
break;
case 2:
lobattoJac3(mbase->d[l], iData->J[j], iData->J0[j], dtime->dt[i], values, dim->nv, &k, j, tmp[l], iData);
lobattoJac3(mbase->d[l], df->J[j], df->J0[j], dtime->dt[i], values, dim->nv, &k, j, tmp[l], iData);
break;
}
}
for(;j<nng; ++j){
conJac(iData->J[j], values, dim->nv, &k, j, iData);
conJac(df->J[j], values, dim->nv, &k, j, iData);
}
}
}

for(; i<dim->nsi; ++i){
tmp_index = i*iData->dim.deg;
for(l=0; l<dim->deg; ++l, id += dim->nv){
diff_functionODE(x+id, dtime->time[tmp_index + l], iData, iData->J);
diff_functionODE(x+id, dtime->time[tmp_index + l], iData, df->J);
for(j=0; j<dim->nx; ++j){
switch(l){
case 0:
radauJac1(mbase->a[l], iData->J[j], dtime->dt[i], values, dim->nv, &k, j, iData);
radauJac1(mbase->a[l], df->J[j], dtime->dt[i], values, dim->nv, &k, j, iData);
break;
case 1:
radauJac2(mbase->a[l], iData->J[j], dtime->dt[i], values, dim->nv, &k, j, iData);
radauJac2(mbase->a[l], df->J[j], dtime->dt[i], values, dim->nv, &k, j, iData);
break;
case 2:
radauJac3(mbase->a[l], iData->J[j], dtime->dt[i], values, dim->nv, &k, j, iData);
radauJac3(mbase->a[l], df->J[j], dtime->dt[i], values, dim->nv, &k, j, iData);
break;
}
}
for(;j<nng; ++j)
conJac(iData->J[j], values, dim->nv, &k, j, iData);
conJac(df->J[j], values, dim->nv, &k, j, iData);
}
}
/*assert(k == njac);*/
Expand All @@ -175,7 +176,7 @@ Bool evalfDiffG(Index n, double * x, Bool new_x, Index m, Index njac, Index *iRo
* special jacobian struct
* author: Vitalij Ruge
**/
static int radauJac1(long double *a, double *J, double dt, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData)
static int radauJac1(long double *a, long double *J, long double dt, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData)
{
int l;
values[(*k)++] = a[0];
Expand All @@ -198,7 +199,7 @@ static int radauJac1(long double *a, double *J, double dt, double * values, int
* special jacobian struct
* author: Vitalij Ruge
**/
static int lobattoJac1(long double *a, double *J, double *J0, double dt, double * values, int nv, int *k, int j, long double tmp,IPOPT_DATA_ *iData)
static int lobattoJac1(long double *a, long double *J, long double *J0, long double dt, double * values, int nv, int *k, int j, long double tmp,IPOPT_DATA_ *iData)
{
int l;
/*0*/
Expand Down Expand Up @@ -228,7 +229,7 @@ static int lobattoJac1(long double *a, double *J, double *J0, double dt, double
* special jacobian struct
* author: Vitalij Ruge
**/
static int radauJac2(long double *a, double *J, double dt, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData)
static int radauJac2(long double *a, long double *J, long double dt, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData)
{
int l;
/*0*/
Expand All @@ -253,7 +254,7 @@ static int radauJac2(long double *a, double *J, double dt, double * values, int
* special jacobian struct
* author: Vitalij Ruge
**/
static int lobattoJac2(long double *a, double *J, double *J0, double dt, double * values, int nv, int *k, int j, long double tmp,IPOPT_DATA_ *iData)
static int lobattoJac2(long double *a, long double *J, long double *J0, long double dt, double * values, int nv, int *k, int j, long double tmp,IPOPT_DATA_ *iData)
{
int l;
/*0*/
Expand Down Expand Up @@ -282,7 +283,7 @@ static int lobattoJac2(long double *a, double *J, double *J0, double dt, double
* special jacobian struct
* author: Vitalij Ruge
**/
static int radauJac3(long double *a, double *J, double dt, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData)
static int radauJac3(long double *a, long double *J, long double dt, double * values, int nv, int *k, int j,IPOPT_DATA_ *iData)
{
int l;
/*0*/
Expand All @@ -304,7 +305,7 @@ static int radauJac3(long double *a, double *J, double dt, double * values, int
* special jacobian struct
* author: Vitalij Ruge
**/
static int lobattoJac3(long double *a, double *J, double *J0, double dt, double * values, int nv, int *k, int j, long double tmp,IPOPT_DATA_ *iData)
static int lobattoJac3(long double *a, long double *J, long double *J0, long double dt, double * values, int nv, int *k, int j, long double tmp,IPOPT_DATA_ *iData)
{
int l;
/*0*/
Expand All @@ -328,7 +329,7 @@ static int lobattoJac3(long double *a, double *J, double *J0, double dt, double
return 0;
}

static int conJac(double *J, double *values, int nv, int *k, int j,IPOPT_DATA_ *iData)
static int conJac(long double *J, double *values, int nv, int *k, int j,IPOPT_DATA_ *iData)
{
int l;
for(l=0; l<nv; ++l)
Expand Down
6 changes: 3 additions & 3 deletions SimulationRuntime/c/optimization/constraints/evalfG.c
Expand Up @@ -52,7 +52,7 @@ 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, double t, IPOPT_DATA_ *iData, double **J);
static int diff_symColoredODE(double *v, double t, IPOPT_DATA_ *iData, long double **J);
static int num_diff_symColoredODE(double *v, double t, 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 @@ -170,7 +170,7 @@ int functionODE_(double * x, double *u, double t, double * dotx, IPOPT_DATA_ *iD
* eval a part from the derivate of s.t.
* author: Vitalij Ruge
**/
int diff_functionODE(double* v, double t, IPOPT_DATA_ *iData, double **J)
int diff_functionODE(double* v, double t, IPOPT_DATA_ *iData, long double **J)
{
int i, j;

Expand Down Expand Up @@ -202,7 +202,7 @@ int diff_functionODE(double* v, double t, IPOPT_DATA_ *iData, double **J)
* function calculates a symbolic colored jacobian matrix by
* author: Willi Braun
*/
int diff_symColoredODE(double *v, double t, IPOPT_DATA_ *iData, double **J)
int diff_symColoredODE(double *v, double t, IPOPT_DATA_ *iData, long double **J)
{
DATA * data = iData->data;
const int index = 2;
Expand Down
28 changes: 12 additions & 16 deletions SimulationRuntime/c/optimization/goal/evalF.c
Expand Up @@ -40,12 +40,8 @@
#include "../localFunction.h"

#ifdef WITH_IPOPT
#define DF_STEP(x,s) ( (fmin(fmax(1e-4*fabs(s*x),1e-8),1e-1)))
static int eval_diff_mayer(IPOPT_DATA_ *iData, double* gradF, double *v);
static int eval_diff_lagrange1(IPOPT_DATA_ *iData, double *x, int *id_, double* gradF);
static int eval_diff_lagrange2(IPOPT_DATA_ *iData, double *x, int *id_, double* gradF);

int sym_diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it);
static int sym_diff_symColoredObject(IPOPT_DATA_ *iData, long double *dF, int this_it);

/*!
* eval object function
Expand Down Expand Up @@ -148,10 +144,10 @@ Bool evalfDiffF(Index n, double * v, Bool new_x, Number *gradF, void * useData)
refreshSimData(x,x+ iData->dim.nx,iData->dtime.time[i*iData->dim.deg+k],iData);
iData->cv = x;
/*iData->data->callback->functionAlgebraics(iData->data);*/
diff_symColoredObject(iData, iData->gradF,iData->lagrange_index);
diff_symColoredObject(iData, iData->df.gradF[0], iData->lagrange_index);
iData->scaling.scald = iData->dtime.dt[i]*mbase->b[0][k];
for(j=0; j<iData->dim.nv; ++j)
gradF[id++] = iData->scaling.scald*iData->gradF[j];
gradF[id++] = iData->scaling.scald*iData->df.gradF[0][j];
}
}

Expand All @@ -160,10 +156,10 @@ Bool evalfDiffF(Index n, double * v, Bool new_x, Number *gradF, void * useData)
refreshSimData(x,x+ iData->dim.nx,iData->dtime.time[i*iData->dim.deg+k+1],iData);
iData->cv = x;
/*iData->data->callback->functionAlgebraics(iData->data);*/
diff_symColoredObject(iData, iData->gradF, iData->lagrange_index);
diff_symColoredObject(iData, iData->df.gradF[0], iData->lagrange_index);
iData->scaling.scald = iData->dtime.dt[i]*mbase->b[1][k];
for(j = 0; j<iData->dim.nv; ++j)
gradF[id++] = iData->scaling.scald*iData->gradF[j];
gradF[id++] = iData->scaling.scald*iData->df.gradF[0][j];
}
}

Expand All @@ -178,13 +174,13 @@ Bool evalfDiffF(Index n, double * v, Bool new_x, Number *gradF, void * useData)
refreshSimData(x, x +iData->dim.nx, iData->dtime.tf, iData);
iData->cv = x;
/*iData->data->callback->functionAlgebraics(iData->data);*/
diff_symColoredObject(iData, iData->gradF, iData->mayer_index);
diff_symColoredObject(iData, iData->df.gradF[0], iData->mayer_index);
for(j=0; j<iData->dim.nv; ++j)
{
if(iData->sopt.lagrange){
gradF[iData->endN + j] += iData->gradF[j];
gradF[iData->endN + j] += iData->df.gradF[0][j];
} else {
gradF[iData->endN + j] = iData->gradF[j];
gradF[iData->endN + j] = iData->df.gradF[0][j];
}
}
}
Expand All @@ -196,7 +192,7 @@ Bool evalfDiffF(Index n, double * v, Bool new_x, Number *gradF, void * useData)
* function calculates a symbolic/num colored gradient "matrix"
* author: vitalij
*/
int diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
int diff_symColoredObject(IPOPT_DATA_ *iData, long double *dF, int this_it)
{
if(iData->sopt.useNumJac==0)
sym_diff_symColoredObject(iData,dF,this_it);
Expand All @@ -208,7 +204,7 @@ int diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
* function calculates a symbolic colored gradient "matrix"
* author: vitalij
*/
int sym_diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
int sym_diff_symColoredObject(IPOPT_DATA_ *iData, long double *dF, int this_it)
{
DATA * data = iData->data;
const int index = 3;
Expand Down Expand Up @@ -242,7 +238,7 @@ int sym_diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
for(; j<lindex[ii]; ++j)
{
l = data->simulationInfo.analyticJacobians[index].sparsePattern.index[j];
iData->gradFomc[l][ii] = data->simulationInfo.analyticJacobians[index].resultVars[l];
iData->df.gradFomc[l][ii] = data->simulationInfo.analyticJacobians[index].resultVars[l];
}
}
}
Expand All @@ -255,7 +251,7 @@ int sym_diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
}
}
}
memcpy(dF, iData->gradFomc[this_it], sizeof(double)*iData->dim.nv);
memcpy(dF, iData->df.gradFomc[this_it], sizeof(long double)*iData->dim.nv);
return 0;
}

Expand Down

0 comments on commit 8db0752

Please sign in to comment.