Skip to content

Commit

Permalink
- restructure data for optimization
Browse files Browse the repository at this point in the history
- fixed indices for nonlinear constraints



git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@20014 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Apr 7, 2014
1 parent b2e8146 commit 00541ba
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 27 deletions.
27 changes: 12 additions & 15 deletions SimulationRuntime/c/optimization/constraints/evalfDiffG.c
Expand Up @@ -104,7 +104,7 @@ Bool evalfDiffG(Index n, double * x, Bool new_x, Index m, Index njac, Index *iRo

}else{
int i,j,k,l,ii;
long double tmp[3];
long double *tmp;
int id;
int tmp_index;
OPTIMIZER_DIM_VARS* dim = &iData->dim;
Expand All @@ -115,55 +115,52 @@ Bool evalfDiffG(Index n, double * x, Bool new_x, Index m, Index njac, Index *iRo

ipoptDebuge(iData,x);

/*ToDo */
tmp[0] = dtime->dt[0]*mbase->d[0][4];
tmp[1] = dtime->dt[0]*mbase->d[1][4];
tmp[2] = dtime->dt[0]*mbase->d[2][4];
tmp = &iData->helper.tmp;

diff_functionODE(x, 0 , iData, df->J[0]);

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 , tmp_index + l , iData, iData->df.J[i+1]);
diff_functionODE(x+id , tmp_index + l , iData, iData->df.J[i+1+l]);
for(j=0; j<dim->nx; ++j){
switch(l){
case 0:
lobattoJac1(mbase->d[l], df->J[i+1][j], df->J[0][j], dtime->dt[i], values, dim->nv, &k, j, tmp[l], iData);
lobattoJac1(mbase->d[l], df->J[i+1+l][j], df->J[i][j], dtime->dt[i], values, dim->nv, &k, j, tmp[l], iData);
break;
case 1:
lobattoJac2(mbase->d[l], df->J[i+1][j], df->J[0][j], dtime->dt[i], values, dim->nv, &k, j, tmp[l], iData);
lobattoJac2(mbase->d[l], df->J[i+1+l][j], df->J[i][j], dtime->dt[i], values, dim->nv, &k, j, tmp[l], iData);
break;
case 2:
lobattoJac3(mbase->d[l], df->J[i+1][j], df->J[0][j], dtime->dt[i], values, dim->nv, &k, j, tmp[l], iData);
lobattoJac3(mbase->d[l], df->J[i+1+l][j], df->J[i][j], dtime->dt[i], values, dim->nv, &k, j, tmp[l], iData);
break;
}
}
for(;j<nng; ++j){
conJac(df->J[i][j], values, dim->nv, &k, j, iData);
conJac(df->J[i+1+l][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, tmp_index + l, iData, df->J[i+1]);
diff_functionODE(x+id, tmp_index + l, iData, df->J[i+1+l]);
for(j=0; j<dim->nx; ++j){
switch(l){
case 0:
radauJac1(mbase->a[l], df->J[i+1][j], dtime->dt[i], values, dim->nv, &k, j, iData);
radauJac1(mbase->a[l], df->J[i+1+l][j], dtime->dt[i], values, dim->nv, &k, j, iData);
break;
case 1:
radauJac2(mbase->a[l], df->J[i+1][j], dtime->dt[i], values, dim->nv, &k, j, iData);
radauJac2(mbase->a[l], df->J[i+1+l][j], dtime->dt[i], values, dim->nv, &k, j, iData);
break;
case 2:
radauJac3(mbase->a[l], df->J[i+1][j], dtime->dt[i], values, dim->nv, &k, j, iData);
radauJac3(mbase->a[l], df->J[i+1+l][j], dtime->dt[i], values, dim->nv, &k, j, iData);
break;
}
}
for(;j<nng; ++j)
conJac(df->J[i][j], values, dim->nv, &k, j, iData);
conJac(df->J[i+1+l][j], values, dim->nv, &k, j, iData);
}
}
/*assert(k == njac);*/
Expand Down
Expand Up @@ -66,7 +66,7 @@ static int move_grid(IPOPT_DATA_ *iData);
**/
int loadDAEmodel(DATA *data, IPOPT_DATA_ *iData)
{
int id, nH;
int id, nH, i;
double *c;
OPTIMIZER_DIM_VARS *dim = &iData->dim;
dim->deg = 3;
Expand Down Expand Up @@ -106,7 +106,7 @@ int loadDAEmodel(DATA *data, IPOPT_DATA_ *iData)
dim->njac = dim->deg*(dim->nlocalJac-dim->nx+dim->nsi*dim->nlocalJac+dim->deg*dim->nsi*dim->nx)-dim->deg*id;
dim->nhess = dim->nH*(1+dim->deg*dim->nsi);
/***********************/
iData->x0 = iData->data->localData[1]->realVars;
iData->helper.x0 = iData->data->localData[1]->realVars;
optimizer_bounds_setings(data, iData);
optimizer_time_setings(iData);

Expand All @@ -117,6 +117,9 @@ int loadDAEmodel(DATA *data, IPOPT_DATA_ *iData)
if(ACTIVE_STREAM(LOG_IPOPT_JAC) || ACTIVE_STREAM(LOG_IPOPT_HESSE))
local_jac_struct_print(iData);

for(i =0; i <iData->dim.deg; ++i)
iData->helper.tmp[i] = iData->dtime.dt[0]*iData->mbase.d[i][4];

return 0;
}

Expand Down Expand Up @@ -465,11 +468,11 @@ static int optimizer_bounds_setings(DATA *data, IPOPT_DATA_ *iData)
modelica_boolean *tmp = (modelica_boolean*)malloc(dim->nv*sizeof(modelica_boolean));
char **tmpname = iData->input_name;

double *start = iData->start_u;
double *start = iData->helper.start_u;
double ttmp;

for(i =0; i<dim->nx; ++i){
check_nominal(iData, data->modelData.realVarsData[i].attribute.min, data->modelData.realVarsData[i].attribute.max, data->modelData.realVarsData[i].attribute.nominal, data->modelData.realVarsData[i].attribute.useNominal, i, fabs(iData->x0[i]));
check_nominal(iData, data->modelData.realVarsData[i].attribute.min, data->modelData.realVarsData[i].attribute.max, data->modelData.realVarsData[i].attribute.nominal, data->modelData.realVarsData[i].attribute.useNominal, i, fabs(iData->helper.x0[i]));
iData->scaling.scalVar[i] = 1.0 / iData->scaling.vnom[i];
iData->scaling.scalf[i] = iData->scaling.scalVar[i];
iData->bounds.xmin[i] = data->modelData.realVarsData[i].attribute.min*iData->scaling.scalVar[i];
Expand Down Expand Up @@ -536,7 +539,7 @@ static int optimizer_bounds_setings(DATA *data, IPOPT_DATA_ *iData)
iData->scaling.scalVar[j] = 1.0 / iData->scaling.vnom[j];
iData->bounds.umin[i] *= iData->scaling.scalVar[j];
iData->bounds.umax[i] *= iData->scaling.scalVar[j];
iData->start_u[i] = fmin(fmax(iData->start_u[i], iData->bounds.umin[i]), iData->bounds.umax[i]);
iData->helper.start_u[i] = fmin(fmax(iData->helper.start_u[i], iData->bounds.umin[i]), iData->bounds.umax[i]);
}

memcpy(iData->bounds.vmin, iData->bounds.xmin, sizeof(double)*dim->nx);
Expand Down
Expand Up @@ -98,7 +98,7 @@ int allocateIpoptData(IPOPT_DATA_ *iData)
bounds->Vmax = (double*)malloc(dim->NV*sizeof(double));
iData->v = (double*)malloc(dim->NV*sizeof(double));
iData->dtime.time = (long double*)malloc(dim->nt *sizeof(long double));
iData->start_u = (double*)malloc(dim->nv*sizeof(double));
iData->helper.start_u = (double*)malloc(dim->nv*sizeof(double));

df->J = (long double***) malloc(dim->nt * sizeof(long double**));
for(j = 0; j < dim->nt; ++j){
Expand Down Expand Up @@ -280,7 +280,7 @@ static int freeIpoptData(IPOPT_DATA_ *iData)
free(dtime->dt);
free(iData->sv);
free(iData->sh);
free(iData->start_u);
free(iData->helper.start_u);

for(i = 0; i<3;++i) {
if(iData->data->simulationInfo.analyticJacobians[i].seedVars){
Expand Down
Expand Up @@ -86,7 +86,7 @@ static int initial_guess_ipopt_cflag(IPOPT_DATA_ *iData,char* cflags)
if(id <iData->dim.nx){
iData->v[i] = iData->data->modelData.realVarsData[id].attribute.start*iData->scaling.scalVar[id];
}else if(id< iData->dim.nv){
iData->v[i] = iData->start_u[id-iData->dim.nx]*iData->scaling.scalVar[id];
iData->v[i] = iData->helper.start_u[id-iData->dim.nx]*iData->scaling.scalVar[id];
}
}
return 0;
Expand Down Expand Up @@ -129,7 +129,7 @@ static int initial_guess_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
solverInfo->solverMethod = S_OPTIMIZATION;
solverInfo->solverData = dasslData;

u0 = iData->start_u;
u0 = iData->helper.start_u;
/*x = data->localData[0]->realVars;*/
v = iData->v;

Expand Down
14 changes: 12 additions & 2 deletions SimulationRuntime/c/optimization/ipoptODEstruct.h
Expand Up @@ -192,6 +192,17 @@ typedef struct OPTIMIZER_EVALF{

}OPTIMIZER_EVALF;

typedef struct OPTIMIZER_HELPER{

double * x0;
double * start_u;

long double tmp[3];

}OPTIMIZER_HELPER;




typedef struct IPOPT_DATA_
{
Expand All @@ -214,8 +225,7 @@ typedef struct IPOPT_DATA_
OPTIMIZER_EVALF evalf;

/* helper */
double * x0;
double * start_u;
OPTIMIZER_HELPER helper;

double *sh;
double *sv;
Expand Down
2 changes: 1 addition & 1 deletion SimulationRuntime/c/optimization/mainOptimizer/ipoptODE.c
Expand Up @@ -87,7 +87,7 @@ int startIpopt(DATA* data, SOLVER_INFO* solverInfo, int flag)
/*ToDo*/
for(i=0; i<iData->dim.nx; i++)
{
iData->bounds.Vmin[i] = iData->bounds.Vmax[i] = iData->x0[i]*iData->scaling.scalVar[i];
iData->bounds.Vmin[i] = iData->bounds.Vmax[i] = iData->helper.x0[i]*iData->scaling.scalVar[i];
iData->v[i] = iData->bounds.Vmin[i];
}

Expand Down

0 comments on commit 00541ba

Please sign in to comment.