Skip to content

Commit

Permalink
fixed some issues with optimization:
Browse files Browse the repository at this point in the history
- jac handling
- memory 
- output
 


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@21783 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Aug 6, 2014
1 parent 2278f0b commit c461bf7
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 14 deletions.
1 change: 1 addition & 0 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -3533,6 +3533,7 @@ case _ then
data->simulationInfo.analyticJacobians[index].sizeCols = <%index_%>;
data->simulationInfo.analyticJacobians[index].sizeRows = <%indexColumn%>;
data->simulationInfo.analyticJacobians[index].sizeTmpVars = <%tmpvarsSize%>;
data->simulationInfo.analyticJacobians[index].seedVars = (modelica_real*) calloc(<%index_%>,sizeof(modelica_real));
data->simulationInfo.analyticJacobians[index].resultVars = (modelica_real*) calloc(<%indexColumn%>,sizeof(modelica_real));
data->simulationInfo.analyticJacobians[index].tmpVars = (modelica_real*) calloc(<%tmpvarsSize%>,sizeof(modelica_real));
Expand Down
33 changes: 31 additions & 2 deletions SimulationRuntime/c/optimization/DataManagement/DerStructure.c
Expand Up @@ -40,6 +40,7 @@ static inline void print_local_jac_struct(DATA * data, OptDataDim * dim, OptData
static inline void local_hessian_struct(DATA * data, OptDataDim * dim, OptDataStructure *s);
static inline void print_local_hessian_struct(DATA * data, OptDataDim * dim, OptDataStructure *s);
static inline void update_local_jac_struct(OptDataDim * dim, OptDataStructure *s);
static inline void copy_JacVars(OptData *optData);

/* pick up jac struct
* author: Vitalij Ruge
Expand All @@ -52,7 +53,7 @@ inline void allocate_der_struct(OptDataStructure *s, OptDataDim * dim, DATA* dat
const int nJ2 = dim->nJ2;
int i, j, k;
char * cflags;

const int indexBC[2] = {data->callback->INDEX_JAC_B, optData->data->callback->INDEX_JAC_C};
cflags = (char*)omc_flagValue[FLAG_UP_HESSIAN];
if(cflags)
{
Expand Down Expand Up @@ -93,6 +94,7 @@ inline void allocate_der_struct(OptDataStructure *s, OptDataDim * dim, DATA* dat
s->plagrange = NULL;

local_jac_struct(data, dim, s, optData->bounds.vnom);
copy_JacVars(optData);

if(ACTIVE_STREAM(LOG_IPOPT_JAC) || ACTIVE_STREAM(LOG_IPOPT_HESSE))
print_local_jac_struct(data, dim, s);
Expand Down Expand Up @@ -164,7 +166,6 @@ inline void allocate_der_struct(OptDataStructure *s, OptDataDim * dim, DATA* dat
}

optData->dim.iter_updateHessian = optData->dim.updateHessian-1;

}


Expand Down Expand Up @@ -286,9 +287,37 @@ static inline void local_jac_struct(DATA * data, OptDataDim * dim, OptDataStruct
s->indexJ3[i] = j++;
}
}

}
}

/*
* copy analytic jacobians vars for each subintervall
* author: Vitalij Ruge
*/
static inline void copy_JacVars(OptData *optData){
int i,j,l;

DATA* data = optData->data;
const int indexBC[2] = {data->callback->INDEX_JAC_B, data->callback->INDEX_JAC_C};
OptDataDim * dim = &optData->dim;
const int np = dim->np;
const int nsi = dim->nsi;

dim->analyticJacobians_tmpVars = (modelica_real ****) malloc(2*sizeof(modelica_real***));
for(l = 0; l < 2 ; ++l){
dim->dim_tmpVars[l] = data->simulationInfo.analyticJacobians[indexBC[l]].sizeTmpVars;
dim->analyticJacobians_tmpVars[l] = (modelica_real ***) malloc(nsi*sizeof(modelica_real**));
for(i = 0; i< nsi; ++i){
dim->analyticJacobians_tmpVars[l][i] = (modelica_real **) malloc(np*sizeof(modelica_real*));
for(j = 0; j< np; ++j){
dim->analyticJacobians_tmpVars[l][i][j] = (modelica_real *) malloc(dim->dim_tmpVars[l]*sizeof(modelica_real));
memcpy(dim->analyticJacobians_tmpVars[l][i][j],data->simulationInfo.analyticJacobians[indexBC[l]].tmpVars,dim->dim_tmpVars[l]*sizeof(modelica_real));
}
}
}
}

/*
* print the jacobian matrix struct
* author: Vitalij Ruge
Expand Down
Expand Up @@ -141,9 +141,9 @@ static inline void initial_guess_ipopt_sim(OptData *optData, SOLVER_INFO* solver
while(t < optData->time.t0){
externalInputUpdate(data);
smallIntSolverStep(data, solverInfo, fmin(t += optData->time.dt[0], optData->time.t0));
printf("\ndone: time[%i] = %g",0,(double)solverInfo->currentTime);
printf("\ndone: time[%i] = %g",0,(double)data->localData[0]->timeValue);
sim_result.emit(&sim_result,data);
fprintf(pFile, "%lf ",(double)t);
fprintf(pFile, "%lf ",(double)data->localData[0]->timeValue);
for(i = 0; i < nu; ++i){
fprintf(pFile, "%lf ", (float)data->simulationInfo.inputVars[i]);
}
Expand Down Expand Up @@ -173,7 +173,6 @@ static inline void initial_guess_ipopt_sim(OptData *optData, SOLVER_INFO* solver
printf("\ndone: time[%i] = %g", k, (double)optData->time.t[i][j]);

memcpy(v[i][j], data->localData[0]->realVars, nReal*sizeof(double));

for(l = 0; l < nx; ++l){

if( ((double) v[i][j][l] < (double)optData->bounds.vmin[l]*optData->bounds.vnom[l])
Expand Down
15 changes: 15 additions & 0 deletions SimulationRuntime/c/optimization/DataManagement/MoveData.c
Expand Up @@ -511,21 +511,31 @@ void optData2ModelData(OptData *optData, double *vopt, const int index){

const modelica_real * vnom = optData->bounds.vnom;


modelica_real * realVars[3];
modelica_real * tmpVars[2];

int i, j, k, shift, l;
DATA * data = optData->data;
const int indexBC[2] = {data->callback->INDEX_JAC_B, data->callback->INDEX_JAC_C};
OptDataDim * dim = &optData->dim;

for(l = 0; l < 3; ++l)
realVars[l] = data->localData[l]->realVars;

for(l = 0; l< 2; ++l){
tmpVars[l] = data->simulationInfo.analyticJacobians[indexBC[l]].tmpVars;
}

for(i = 0, shift = 0; i < nsi-1; ++i){
for(j = 0; j < np; ++j, shift += nv){

for(l = 0; l < 3; ++l){
data->localData[l]->realVars = optData->v[i][j];
data->localData[l]->timeValue = (modelica_real) optData->time.t[i][j];
}
for(l = 0; l < 2; ++l)
data->simulationInfo.analyticJacobians[indexBC[l]].tmpVars = dim->analyticJacobians_tmpVars[l][i][j];

for(k = 0; k < nx; ++k)
data->localData[0]->realVars[k] = vopt[shift + k]*vnom[k];
Expand Down Expand Up @@ -554,6 +564,8 @@ void optData2ModelData(OptData *optData, double *vopt, const int index){

for(k = 0; k < nx; ++k)
data->localData[0]->realVars[k] = vopt[shift + k]*vnom[k];
for(l = 0; l < 2; ++l)
data->simulationInfo.analyticJacobians[indexBC[l]].tmpVars = dim->analyticJacobians_tmpVars[l][i][j];

for(; k <nv; ++k){
data->simulationInfo.inputVars[k-nx] = (modelica_real) vopt[shift + k]*vnom[k];
Expand All @@ -570,6 +582,9 @@ void optData2ModelData(OptData *optData, double *vopt, const int index){
for(l = 0; l < 3; ++l)
data->localData[l]->realVars = realVars[l];

for(l = 0; l< 2; ++l)
data->simulationInfo.analyticJacobians[indexBC[l]].tmpVars = tmpVars[l];

}

/*
Expand Down
4 changes: 4 additions & 0 deletions SimulationRuntime/c/optimization/OptimizerData.h
Expand Up @@ -74,6 +74,10 @@ typedef struct OptDataDim{
int updateHessian;
int iter_updateHessian;

modelica_real **** analyticJacobians_tmpVars;

int dim_tmpVars[2];

}OptDataDim;

typedef struct OptDataTime{
Expand Down
27 changes: 18 additions & 9 deletions SimulationRuntime/c/optimization/optimizer_main.c
Expand Up @@ -239,15 +239,6 @@ static inline void freeOptimizerData(OptData*optData){
free(optData->s.Hg[j]);
}
free(optData->s.Hg);
/* ToDo
for(i=2; i < 5; ++i){
free(optData->s.lindex[i]);
j = optData->data->simulationInfo.analyticJacobians[i].sizeCols;
for(k = 0; k < j; ++k)
free(optData->s.seedVec[i][k]);
free(optData->s.seedVec[k]);
}
*/
free(optData->s.lindex);
free(optData->s.seedVec);
free(optData->s.indexCon2);
Expand Down Expand Up @@ -292,4 +283,22 @@ static inline void freeOptimizerData(OptData*optData){
if(optData->dim.updateHessian > 0)
free(optData->oldH);

free(optData->dim.inputName);

for(k = 0; k < 2; ++k){
for(i = 0; i< nsi; ++i){
for(j = 0; j< np; ++j){
free(optData->dim.analyticJacobians_tmpVars[k][i][j]);
}
free(optData->dim.analyticJacobians_tmpVars[k][i]);
}
free(optData->dim.analyticJacobians_tmpVars[k]);
}
free(optData->dim.analyticJacobians_tmpVars);

for(i = 0; i< optData->dim.nJ; ++i)
free(optData->s.JderCon[i]);
free(optData->s.JderCon);
free(optData->s.gradM);
free(optData->s.gradL);
}
1 change: 1 addition & 0 deletions SimulationRuntime/c/simulation_data.h
Expand Up @@ -149,6 +149,7 @@ typedef struct ANALYTIC_JACOBIAN
{
unsigned int sizeCols;
unsigned int sizeRows;
unsigned int sizeTmpVars;
SPARSE_PATTERN sparsePattern;
modelica_real* seedVars;
modelica_real* tmpVars;
Expand Down

0 comments on commit c461bf7

Please sign in to comment.