Skip to content

Commit

Permalink
fixed jacobian index handling in optimization
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@21842 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Aug 11, 2014
1 parent cdc1875 commit 7a00d6a
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 37 deletions.
45 changes: 25 additions & 20 deletions SimulationRuntime/c/optimization/DataManagement/DerStructure.c
Expand Up @@ -67,7 +67,11 @@ inline void allocate_der_struct(OptDataStructure *s, OptDataDim * dim, DATA* dat
optData->dim.updateHessian = 0;
}


s->indexABCD[0] = -1;
s->indexABCD[1] = data->callback->INDEX_JAC_A;
s->indexABCD[2] = data->callback->INDEX_JAC_B;
s->indexABCD[3] = data->callback->INDEX_JAC_C;
s->indexABCD[4] = data->callback->INDEX_JAC_D;
s->matrix[1] = (modelica_boolean)(data->callback->initialAnalyticJacobianA((void*) data) == 0);
s->matrix[2] = (modelica_boolean)(data->callback->initialAnalyticJacobianB((void*) data) == 0);
s->matrix[3] = (modelica_boolean)(data->callback->initialAnalyticJacobianC((void*) data) == 0);
Expand Down Expand Up @@ -176,12 +180,11 @@ inline void allocate_der_struct(OptDataStructure *s, OptDataDim * dim, DATA* dat
static inline void local_jac_struct(DATA * data, OptDataDim * dim, OptDataStructure *s, const modelica_real * const vnom){
int sizeCols;
int maxColors;
int i, ii, j, jj, l, index, tmpnJ;
int i,ii, j, l, index, tmp_index, tmpnJ, h_index;
unsigned int* lindex, *cC, *pindex;
const int indexBC[2] = {data->callback->INDEX_JAC_B, data->callback->INDEX_JAC_C};

s->lindex = (unsigned int**)malloc(2*sizeof(unsigned int*));
s->seedVec = (modelica_real ***)malloc(2*sizeof(modelica_real**));
s->lindex = (unsigned int**)malloc(5*sizeof(unsigned int*));
s->seedVec = (modelica_real ***)malloc(5*sizeof(modelica_real**));

s->JderCon = (modelica_boolean **)malloc(dim->nJ*sizeof(modelica_boolean*));
for(i = 0; i < dim->nJ; ++i)
Expand All @@ -192,21 +195,23 @@ static inline void local_jac_struct(DATA * data, OptDataDim * dim, OptDataStruct
s->indexCon2 = (int *)malloc(dim->nc* sizeof(int));
s->indexCon3 = (int *)malloc(dim->nc* sizeof(int));

for(index = 0; index < 2; ++index){
jj = indexBC[index];
if(s->matrix[index + 2]){
for(index = 2; index < 4; ++index){

if(s->matrix[index]){
tmp_index = index-2;
h_index = s->indexABCD[index];
/******************************/
sizeCols = data->simulationInfo.analyticJacobians[jj].sizeCols;
maxColors = data->simulationInfo.analyticJacobians[jj].sparsePattern.maxColors + 1;
cC = (unsigned int*) data->simulationInfo.analyticJacobians[jj].sparsePattern.colorCols;
lindex = (unsigned int*) data->simulationInfo.analyticJacobians[jj].sparsePattern.leadindex;
pindex = data->simulationInfo.analyticJacobians[jj].sparsePattern.index;
sizeCols = data->simulationInfo.analyticJacobians[h_index].sizeCols;
maxColors = data->simulationInfo.analyticJacobians[h_index].sparsePattern.maxColors + 1;
cC = (unsigned int*) data->simulationInfo.analyticJacobians[h_index].sparsePattern.colorCols;
lindex = (unsigned int*) data->simulationInfo.analyticJacobians[h_index].sparsePattern.leadindex;
pindex = data->simulationInfo.analyticJacobians[h_index].sparsePattern.index;

s->lindex[index] = (unsigned int*)calloc((sizeCols+1), sizeof(unsigned int));
memcpy(&s->lindex[index][1], lindex, sizeCols*sizeof(unsigned int));
lindex = s->lindex[index];
s->seedVec[index] = (modelica_real **)malloc((maxColors)*sizeof(modelica_real*));
free(data->simulationInfo.analyticJacobians[jj].sparsePattern.leadindex);
free(data->simulationInfo.analyticJacobians[h_index].sparsePattern.leadindex);
/**********************/
if(sizeCols > 0){
for(ii = 1; ii < maxColors; ++ii){
Expand All @@ -216,24 +221,26 @@ static inline void local_jac_struct(DATA * data, OptDataDim * dim, OptDataStruct
s->seedVec[index][ii][i] = vnom[i];
for(j = lindex[i]; j < lindex[i + 1]; ++j){
l = pindex[j];
s->J[index][l][i] = (modelica_boolean)1;
s->J[tmp_index][l][i] = (modelica_boolean)1;
}
}
}
}

tmpnJ = dim->nJ;
if(s->lagrange) ++tmpnJ;
if(s->mayer && index) ++tmpnJ;
if(s->mayer && index == 3) ++tmpnJ;

for(ii = dim->nx, j= 0; ii < tmpnJ; ++ii){
if(!index && ii != s->derIndex[1])
if(index == 2 && ii != s->derIndex[1])
s->indexCon2[j++] = ii;
else if(index && ii != s->derIndex[2] && ii != s->derIndex[0])
else if(index == 3 && ii != s->derIndex[2] && ii != s->derIndex[0])
s->indexCon3[j++] = ii;
}
}
/**********************/
free(data->simulationInfo.analyticJacobians[h_index].seedVars);
}
}


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

}
}

/*
* copy analytic jacobians vars for each subintervall
Expand Down
33 changes: 18 additions & 15 deletions SimulationRuntime/c/optimization/DataManagement/MoveData.c
Expand Up @@ -548,7 +548,7 @@ void optData2ModelData(OptData *optData, double *vopt, const int index){
data->callback->functionDAE(data);

if(index){
diffSynColoredOptimizerSystem(optData, optData->J[i][j], i,j,0);
diffSynColoredOptimizerSystem(optData, optData->J[i][j], i,j,2);
}

}
Expand All @@ -575,7 +575,7 @@ void optData2ModelData(OptData *optData, double *vopt, const int index){
data->callback->functionDAE(data);

if(index){
diffSynColoredOptimizerSystem(optData, optData->J[i][j], i,j, (j+1 == np)? 1 : 0);
diffSynColoredOptimizerSystem(optData, optData->J[i][j], i,j, (j+1 == np)? 3 : 2);
}
}

Expand All @@ -594,30 +594,33 @@ void optData2ModelData(OptData *optData, double *vopt, const int index){
void diffSynColoredOptimizerSystem(OptData *optData, modelica_real **J, const int m, const int n, const int index){
DATA * data = optData->data;
int i,j,l,ii, ll;
const int indexBC[2] = {data->callback->INDEX_JAC_B, data->callback->INDEX_JAC_C};
const int jj = indexBC[index];

const h_index = optData->s.indexABCD[index];
const long double * scaldt = optData->bounds.scaldt[m];
const unsigned int * const cC = data->simulationInfo.analyticJacobians[jj].sparsePattern.colorCols;
const unsigned int * const cC = data->simulationInfo.analyticJacobians[h_index].sparsePattern.colorCols;
const unsigned int * const lindex = optData->s.lindex[index];
const int nx = data->simulationInfo.analyticJacobians[jj].sizeCols;
const int Cmax = data->simulationInfo.analyticJacobians[jj].sparsePattern.maxColors + 1;
const int nx = data->simulationInfo.analyticJacobians[h_index].sizeCols;
const int Cmax = data->simulationInfo.analyticJacobians[h_index].sparsePattern.maxColors + 1;
const int dnx = optData->dim.nx;
const int dnxnc = optData->dim.nJ;
const modelica_real * const resultVars = data->simulationInfo.analyticJacobians[jj].resultVars;
const unsigned int * const sPindex = data->simulationInfo.analyticJacobians[jj].sparsePattern.index;
const modelica_real * const resultVars = data->simulationInfo.analyticJacobians[h_index].resultVars;
const unsigned int * const sPindex = data->simulationInfo.analyticJacobians[h_index].sparsePattern.index;
long double scalb = optData->bounds.scalb[m][n];

const int * index_J = (index)? optData->s.indexJ3 : optData->s.indexJ2;
const int * index_J = (index == 3)? optData->s.indexJ3 : optData->s.indexJ2;
const int nJ1 = optData->dim.nJ + 1;

modelica_real **sV = optData->s.seedVec[index];

for(i = 1; i < Cmax; ++i){
data->simulationInfo.analyticJacobians[jj].seedVars = optData->s.seedVec[index][i];
data->simulationInfo.analyticJacobians[h_index].seedVars = sV[i];

if(index){
data->callback->functionJacC_column(data);
}else{
if(index == 2){
data->callback->functionJacB_column(data);
}
}else if(index == 3){
data->callback->functionJacC_column(data);
}else
assert(0);

for(ii = 0; ii < nx; ++ii){
if(cC[ii] == i){
Expand Down
1 change: 1 addition & 0 deletions SimulationRuntime/c/optimization/OptimizerData.h
Expand Up @@ -139,6 +139,7 @@ typedef struct OptDataStructure{
int * indexCon3;
int * indexJ2;
int * indexJ3;
int indexABCD[5];
}OptDataStructure;


Expand Down
4 changes: 2 additions & 2 deletions SimulationRuntime/c/optimization/eval_all/EvalL.c
Expand Up @@ -223,7 +223,7 @@ static inline void num_hessian0(double * v, const double * const lambda,
data->callback->input_function(data);
data->callback->functionDAE(data);
/********************/
diffSynColoredOptimizerSystem(optData, optData->tmpJ, i,j,0);
diffSynColoredOptimizerSystem(optData, optData->tmpJ, i,j,2);
/********************/
v[ii] = (double)v_save;
/********************/
Expand Down Expand Up @@ -277,7 +277,7 @@ static inline void num_hessian1(double * v, const double * const lambda,
const modelica_real * const vmax = optData->bounds.vmax;
const modelica_real * const vnom = optData->bounds.vnom;
const modelica_boolean upCost2 = objFactor != 0 && ma && np == j + 1 && nsi == i +1;
const short indexJ = (upCost2) ? 1 : 0;
const short indexJ = (upCost2) ? 3 : 2;
int ii,jj, l,k;
long double v_save, h;
DATA * data = optData->data;
Expand Down

0 comments on commit 7a00d6a

Please sign in to comment.