Skip to content

Commit

Permalink
- restructure data for optimization (continuing)
Browse files Browse the repository at this point in the history
 - bounds


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19881 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Mar 31, 2014
1 parent cfb70f6 commit 5154bd7
Show file tree
Hide file tree
Showing 5 changed files with 81 additions and 73 deletions.
42 changes: 21 additions & 21 deletions SimulationRuntime/c/optimization/initialOptimizer/allocate_ipopt.c
Expand Up @@ -471,12 +471,12 @@ static int optimizer_bounds_setings(DATA *data, IPOPT_DATA_ *iData)
iData->scalVar[i] = 1.0 / iData->vnom[i];
iData->scalf[i] = iData->scalVar[i];

iData->xmin[i] = data->modelData.realVarsData[i].attribute.min*iData->scalVar[i];
iData->xmax[i] = data->modelData.realVarsData[i].attribute.max*iData->scalVar[i];
iData->bounds.xmin[i] = data->modelData.realVarsData[i].attribute.min*iData->scalVar[i];
iData->bounds.xmax[i] = data->modelData.realVarsData[i].attribute.max*iData->scalVar[i];
}

iData->data->callback->pickUpBoundsForInputsInOptimization(data,
iData->umin, iData->umax, &iData->vnom[dim->nx], tmp, tmpname, start,
iData->bounds.umin, iData->bounds.umax, &iData->vnom[dim->nx], tmp, tmpname, start,
&ttmp);
iData->dtime.startTimeOpt = ttmp;

Expand All @@ -488,14 +488,14 @@ static int optimizer_bounds_setings(DATA *data, IPOPT_DATA_ *iData)
printf("\n========================================================");
for(i=0; i<dim->nx; ++i){

if (iData->xmin[i] > -1e20)
if (iData->bounds.xmin[i] > -1e20)
sprintf(buffer, ", min = %g", data->modelData.realVarsData[i].attribute.min);
else
sprintf(buffer, ", min = -Inf");

printf("\nState[%i]:%s(start = %g, nominal = %g%s",i, iData->data->modelData.realVarsData[i].info.name, data->modelData.realVarsData[i].attribute.start, iData->vnom[i], buffer);

if (iData->xmax[i] < 1e20)
if (iData->bounds.xmax[i] < 1e20)
sprintf(buffer, ", max = %g", data->modelData.realVarsData[i].attribute.max);
else
sprintf(buffer, ", max = +Inf");
Expand All @@ -506,15 +506,15 @@ static int optimizer_bounds_setings(DATA *data, IPOPT_DATA_ *iData)

for(; i<dim->nv; ++i){
k = i-dim->nx;
if ((double)iData->umin[k] > -1e20)
sprintf(buffer, ", min = %g", iData->umin[k]);
if (iData->bounds.umin[k] > -1e20)
sprintf(buffer, ", min = %g", iData->bounds.umin[k]);
else
sprintf(buffer, ", min = -Inf");

printf("\nInput[%i]:%s(start = %g, nominal = %g%s",i, tmpname[k] ,start[k], iData->vnom[i], buffer);

if (iData->umax[k] < 1e20)
sprintf(buffer, ", max = %g", iData->umax[k]);
if (iData->bounds.umax[k] < 1e20)
sprintf(buffer, ", max = %g", iData->bounds.umax[k]);
else
sprintf(buffer, ", max = +Inf");

Expand All @@ -527,25 +527,25 @@ static int optimizer_bounds_setings(DATA *data, IPOPT_DATA_ *iData)
}

for(i =0,j = dim->nx;i<dim->nu;++i,++j){
check_nominal(iData, iData->umin[i], iData->umax[i], iData->vnom[j], tmp[i], j, fabs(start[i]));
check_nominal(iData, iData->bounds.umin[i], iData->bounds.umax[i], iData->vnom[j], tmp[i], j, fabs(start[i]));
iData->scalVar[j] = 1.0 / iData->vnom[j];
iData->umin[i] *= iData->scalVar[j];
iData->umax[i] *= iData->scalVar[j];
iData->start_u[i] = fmin(fmax(iData->start_u[i], iData->umin[i]), iData->umax[i]);
iData->bounds.umin[i] *= iData->scalVar[j];
iData->bounds.umax[i] *= iData->scalVar[j];
iData->start_u[i] = fmin(fmax(iData->start_u[i], iData->bounds.umin[i]), iData->bounds.umax[i]);
}

memcpy(iData->vmin, iData->xmin, sizeof(double)*dim->nx);
memcpy(iData->vmin + dim->nx, iData->umin, sizeof(double)*dim->nu);
memcpy(iData->bounds.vmin, iData->bounds.xmin, sizeof(double)*dim->nx);
memcpy(iData->bounds.vmin + dim->nx, iData->bounds.umin, sizeof(double)*dim->nu);

memcpy(iData->vmax, iData->xmax, sizeof(double)*dim->nx);
memcpy(iData->vmax + dim->nx, iData->umax, sizeof(double)*dim->nu);
memcpy(iData->bounds.vmax, iData->bounds.xmax, sizeof(double)*dim->nx);
memcpy(iData->bounds.vmax + dim->nx, iData->bounds.umax, sizeof(double)*dim->nu);

memcpy(iData->Vmin, iData->vmin, sizeof(double)*dim->nv);
memcpy(iData->Vmax, iData->vmax, sizeof(double)*dim->nv);
memcpy(iData->bounds.Vmin, iData->bounds.vmin, sizeof(double)*dim->nv);
memcpy(iData->bounds.Vmax, iData->bounds.vmax, sizeof(double)*dim->nv);

for(i = 0,j = dim->nv; i < dim->nsi*dim->deg;i++, j += dim->nv){
memcpy(iData->Vmin + j, iData->vmin, sizeof(double)*dim->nv);
memcpy(iData->Vmax + j, iData->vmax, sizeof(double)*dim->nv);
memcpy(iData->bounds.Vmin + j, iData->bounds.vmin, sizeof(double)*dim->nv);
memcpy(iData->bounds.Vmax + j, iData->bounds.vmax, sizeof(double)*dim->nv);
}

free(tmp);
Expand Down
Expand Up @@ -69,14 +69,15 @@ int allocateIpoptData(IPOPT_DATA_ *iData)
OPTIMIZER_DIM_VARS* dim = &iData->dim;
OPTIMIZER_MBASE *mbase = &iData->mbase;
OPTIMIZER_STUCTURE *sopt = &iData->sopt;
OPTIMIZER_BOUNDS *bounds = &iData->bounds;

ng = dim->NRes+dim->nc*dim->deg*dim->nsi;
deg1 = dim->deg + 1;
deg2 = deg1 + 1;

dim->nJ = dim->nc + dim->nx;
iData->gmin = (double*)calloc(ng,sizeof(double));
iData->gmax = (double*)calloc(ng,sizeof(double));
bounds->gmin = (double*)calloc(ng,sizeof(double));
bounds->gmax = (double*)calloc(ng,sizeof(double));
iData->mult_g = (double*)malloc(ng*sizeof(double));
iData->mult_x_L = (double*)malloc(dim->NV*sizeof(double));
iData->mult_x_U = (double*)malloc(dim->NV*sizeof(double));
Expand All @@ -86,17 +87,17 @@ int allocateIpoptData(IPOPT_DATA_ *iData)
for(i =0; i< dim->deg + 1; ++i)
mbase->dotx[i] = (double*)malloc(dim->nx*sizeof(double));

iData->xmin = (double*)malloc(dim->nx*sizeof(double));
iData->xmax = (double*)malloc(dim->nx*sizeof(double));
iData->umin = (double*)malloc(dim->nu*sizeof(double));
iData->umax = (double*)malloc(dim->nu*sizeof(double));
iData->vmin = (double*)malloc(dim->nv*sizeof(double));
iData->vmax = (double*)malloc(dim->nv*sizeof(double));
bounds->xmin = (double*)malloc(dim->nx*sizeof(double));
bounds->xmax = (double*)malloc(dim->nx*sizeof(double));
bounds->umin = (double*)malloc(dim->nu*sizeof(double));
bounds->umax = (double*)malloc(dim->nu*sizeof(double));
bounds->vmin = (double*)malloc(dim->nv*sizeof(double));
bounds->vmax = (double*)malloc(dim->nv*sizeof(double));
iData->vnom = (double*)malloc(dim->nv*sizeof(double));
iData->scalVar = (double*)malloc(dim->nv*sizeof(double));
iData->scalf = (double*)malloc(dim->nx*sizeof(double));
iData->Vmin = (double*)malloc(dim->NV*sizeof(double));
iData->Vmax = (double*)malloc(dim->NV*sizeof(double));
bounds->Vmin = (double*)malloc(dim->NV*sizeof(double));
bounds->Vmax = (double*)malloc(dim->NV*sizeof(double));
iData->v = (double*)malloc(dim->NV*sizeof(double));
iData->w = (double*)malloc((dim->nsi + 1)*(dim->nv)*sizeof(double));
iData->dtime.time = (long double*)malloc((dim->deg*dim->nsi +1) *sizeof(long double));
Expand Down Expand Up @@ -160,7 +161,7 @@ int allocateIpoptData(IPOPT_DATA_ *iData)
if(dim->nc > 0)
for(i = dim->nx; i<ng; i+=dim->nJ)
for(j=0;j<dim->nc;++j)
iData->gmin[i+j] = -1e21;
bounds->gmin[i+j] = -1e21;

return 0;
}
Expand All @@ -176,6 +177,7 @@ static int freeIpoptData(IPOPT_DATA_ *iData)
OPTIMIZER_MBASE *mbase = &iData->mbase;
OPTIMIZER_TIME *dtime = &iData->dtime;
OPTIMIZER_STUCTURE *sopt = &iData->sopt;
OPTIMIZER_BOUNDS *bounds = &iData->bounds;

for(i = 0; i < dim->nJ; i++){
free(iData->J[i]);
Expand Down Expand Up @@ -213,8 +215,8 @@ static int freeIpoptData(IPOPT_DATA_ *iData)
free(iData->gradF_);
free(iData->gradF0);
free(iData->gradF00);
free(iData->gmin);
free(iData->gmax);
free(bounds->gmin);
free(bounds->gmax);
free(iData->mult_g);
free(iData->mult_x_L);
free(iData->mult_x_U);
Expand All @@ -223,17 +225,17 @@ static int freeIpoptData(IPOPT_DATA_ *iData)
free(mbase->dotx[i]);


free(iData->xmin);
free(iData->xmax);
free(iData->umin);
free(iData->umax);
free(iData->vmin);
free(iData->vmax);
free(bounds->xmin);
free(bounds->xmax);
free(bounds->umin);
free(bounds->umax);
free(bounds->vmin);
free(bounds->vmax);
free(iData->vnom);
free(iData->scalVar);
free(iData->scalf);
free(iData->Vmin);
free(iData->Vmax);
free(bounds->Vmin);
free(bounds->Vmax);
free(iData->v);
free(dtime->time);
free(iData->w);
Expand Down
Expand Up @@ -133,7 +133,7 @@ static int initial_guess_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
v = iData->v;

for(ii=dim->nx,j=0; j < dim->nu; ++j, ++ii){
u0[j] = fmin(fmax(u0[j],iData->umin[j]),iData->umax[j]);
u0[j] = fmin(fmax(u0[j],iData->bounds.umin[j]),iData->bounds.umax[j]);
v[ii] = u0[j]*iData->scalVar[j + dim->nx];
}

Expand Down Expand Up @@ -181,9 +181,9 @@ static int initial_guess_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
if(id >=dim->nv)
id = 0;
if(id <dim->nx){
iData->v[i] =fmin(fmax(iData->vmin[id],iData->v[i]),iData->vmax[id]);
iData->v[i] =fmin(fmax(iData->bounds.vmin[id],iData->v[i]),iData->bounds.vmax[id]);
}else if(id< dim->nv){
iData->v[i] = fmin(fmax(iData->vmin[id],iData->v[i]),iData->vmax[id]);
iData->v[i] = fmin(fmax(iData->bounds.vmin[id],iData->v[i]),iData->bounds.vmax[id]);
}
}

Expand Down Expand Up @@ -230,12 +230,12 @@ static int pre_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
/*ToDo*/
for(i=0; i< iData->dim.nx; ++i)
{
iData->Vmin[i] = (*iData).Vmax[i] = iData->data->localData[1]->realVars[i]*iData->scalVar[i];
iData->v[i] = iData->Vmin[i];
iData->bounds.Vmin[i] = iData->bounds.Vmax[i] = iData->data->localData[1]->realVars[i]*iData->scalVar[i];
iData->v[i] = iData->bounds.Vmin[i];
}
for(j=0; i< iData->dim.nv; ++i,++j){
iData->Vmin[i] = iData->Vmax[i] = data->simulationInfo.inputVars[j]*iData->scalVar[i];
iData->v[i] = iData->Vmin[i];
iData->bounds.Vmin[i] = iData->bounds.Vmax[i] = data->simulationInfo.inputVars[j]*iData->scalVar[i];
iData->v[i] = iData->bounds.Vmin[i];
}
optimizer_time_setings_update(iData);

Expand Down
46 changes: 26 additions & 20 deletions SimulationRuntime/c/optimization/ipoptODEstruct.h
Expand Up @@ -90,10 +90,10 @@ typedef struct OPTIMIZER_MBASE{

long double invd1_4;

double *dotx[5];
double *dotx[7];

double *x[5];
double *u[5];
double *x[7];
double *u[7];

}OPTIMIZER_MBASE;

Expand Down Expand Up @@ -130,10 +130,25 @@ typedef struct OPTIMIZER_STUCTURE{

modelica_boolean preSim;


}OPTIMIZER_STUCTURE;


typedef struct OPTIMIZER_BOUNDS{

double * xmin;
double * xmax;
double * umin;
double * umax;
double * vmin;
double * vmax;
double * Vmin;
double * Vmax;

double *gmin;
double *gmax;

}OPTIMIZER_BOUNDS;


typedef struct IPOPT_DATA_
{
Expand All @@ -148,16 +163,10 @@ typedef struct IPOPT_DATA_

OPTIMIZER_STUCTURE sopt;

OPTIMIZER_BOUNDS bounds;

/* ODE */
double * x0;
double * xmin;
double * xmax;
double * umin;
double * umax;
double * vmin;
double * vmax;
double * Vmin;
double * Vmax;

double * vnom;
double * start_u;
Expand All @@ -175,10 +184,7 @@ typedef struct IPOPT_DATA_
double *w;
double *cv;

double *gmin;
double *gmax;

long int endN;
int endN;
double **J0;
double **J;
double ** gradFomc;
Expand All @@ -199,12 +205,12 @@ typedef struct IPOPT_DATA_
double *mult_x_L;
double *mult_x_U;

long int current_var;
long int current_time;
int current_var;
int current_time;
double pmayer;
double plagrange;
int mayer_index;
int lagrange_index;
short mayer_index;
short lagrange_index;
DATA * data;

double *vsave;
Expand Down
8 changes: 4 additions & 4 deletions SimulationRuntime/c/optimization/mainOptimizer/ipoptODE.c
Expand Up @@ -87,8 +87,8 @@ int startIpopt(DATA* data, SOLVER_INFO* solverInfo, int flag)
/*ToDo*/
for(i=0; i<iData->dim.nx; i++)
{
iData->Vmin[i] = iData->Vmax[i] = iData->x0[i]*iData->scalVar[i];
iData->v[i] = iData->Vmin[i];
iData->bounds.Vmin[i] = iData->bounds.Vmax[i] = iData->x0[i]*iData->scalVar[i];
iData->v[i] = iData->bounds.Vmin[i];
}

initial_guess_ipopt(iData,solverInfo);
Expand All @@ -98,8 +98,8 @@ int startIpopt(DATA* data, SOLVER_INFO* solverInfo, int flag)
if(flag == 5){
int tmp_dim = iData->dim.NRes +iData->dim.nc*iData->dim.deg*iData->dim.nsi;

nlp = CreateIpoptProblem(iData->dim.NV, iData->Vmin, iData->Vmax,
tmp_dim, iData->gmin, iData->gmax, iData->dim.njac, iData->dim.nhess, 0, &evalfF,
nlp = CreateIpoptProblem(iData->dim.NV, iData->bounds.Vmin, iData->bounds.Vmax,
tmp_dim, iData->bounds.gmin, iData->bounds.gmax, iData->dim.njac, iData->dim.nhess, 0, &evalfF,
&evalfG, &evalfDiffF, &evalfDiffG, &ipopt_h);

AddIpoptNumOption(nlp, "tol", 1e-8);
Expand Down

0 comments on commit 5154bd7

Please sign in to comment.