Skip to content

Commit

Permalink
- improved optimization
Browse files Browse the repository at this point in the history
 - sorting


git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@21237 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Jun 22, 2014
1 parent 66700f8 commit a984893
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 78 deletions.
23 changes: 23 additions & 0 deletions SimulationRuntime/c/optimization/DataManagement/DerStructure.c
Expand Up @@ -286,6 +286,29 @@ static inline void local_jac_struct(DATA * data, OptDataDim * dim, OptDataStruct
s->gradM[j] = (modelica_boolean)1;
}

s->indexJ2 = (int *) malloc((dim->nJ+1)* sizeof(int));
s->indexJ3 = (int *) malloc(dim->nJ2* sizeof(int));

j = 0;
for(i = 0; i < dim->nJ +1 ; ++i){
if(i == s->derIndex[1]){
s->indexJ2[i] = dim->nJ;
}else{
s->indexJ2[i] = j++;
}
}

j = 0;
for(i = 0; i < dim->nJ2 ; ++i){
if(i == s->derIndex[2]){
s->indexJ3[i] = dim->nJ;
}else if(i == s->derIndex[0]){
s->indexJ3[i] = dim->nJ + 1;
}else{
s->indexJ3[i] = j++;
}
}

}

/*
Expand Down
24 changes: 14 additions & 10 deletions SimulationRuntime/c/optimization/DataManagement/MoveData.c
Expand Up @@ -589,7 +589,7 @@ 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;
int i,j,l,ii, ll;


const long double * scaldt = optData->bounds.scaldt[m];
Expand All @@ -607,6 +607,8 @@ void diffSynColoredOptimizerSystem(OptData *optData, modelica_real **J, const in
long double scalb = optData->bounds.scalb[m][n];

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

for(i = 1; i < Cmax; ++i){
data->simulationInfo.analyticJacobians[index].seedVars = optData->s.seedVec[index][i];
Expand All @@ -617,22 +619,24 @@ void diffSynColoredOptimizerSystem(OptData *optData, modelica_real **J, const in
data->callback->functionJacC_column(data);
}else
assert(0);
/*ToDo: shift index */

for(ii = 0; ii < nx; ++ii){
if(cC[ii] == i){
for(j = lindex[ii]; j < lindex[ii + 1]; ++j){
l = sPindex[j];
ll = sPindex[j];
l = index_J[ll];
if(l < dnx){
J[l][ii] = (modelica_real) resultVars[l] * scaldt[l];
}else if(l == index_d_la){
J[l][ii] = (modelica_real) resultVars[l] * scalb;
}else if(index == 3 && l == index_ma){
J[l][ii] = (modelica_real) resultVars[l];
}else{
J[l][ii] = (modelica_real) resultVars[l];
J[l][ii] = (modelica_real) resultVars[ll] * scaldt[l];
}else if(l < dnxnc){
J[l][ii] = (modelica_real) resultVars[ll];
}else if(l == optData->dim.nJ && optData->s.lagrange){
J[l][ii] = (modelica_real) resultVars[ll]* scalb;
}else if(l == nJ1 && optData->s.mayer){
J[l][ii] = (modelica_real) resultVars[ll];
}
}
}

}
}
}
Expand Down
2 changes: 2 additions & 0 deletions SimulationRuntime/c/optimization/OptimizerData.h
Expand Up @@ -132,6 +132,8 @@ typedef struct OptDataStructure{
modelica_boolean * gradL;
int * indexCon2;
int * indexCon3;
int * indexJ2;
int * indexJ3;
}OptDataStructure;


Expand Down
10 changes: 5 additions & 5 deletions SimulationRuntime/c/optimization/eval_all/EvalF.c
Expand Up @@ -110,6 +110,8 @@ Bool evalfDiffF(Index n, double * vopt, Bool new_x, Number *gradF, void * useDat
const int nv = optData->dim.nv;
const int nsi = optData->dim.nsi;
const int np = optData->dim.np;
const int nJ = optData->dim.nJ;
const int nJ1 = optData->dim.nJ + 1;

const modelica_boolean la = optData->s.lagrange;
const modelica_boolean ma = optData->s.mayer;
Expand All @@ -119,19 +121,18 @@ Bool evalfDiffF(Index n, double * vopt, Bool new_x, Number *gradF, void * useDat

if(la){

const int k = optData->s.derIndex[1];
int i, j, ii;
modelica_real * gradL;

for(i = 0, ii = 0; i < nsi - 1; ++i){
for(j = 0; j < np; ++j, ii += nv){
gradL = optData->J[i][j][k];
gradL = optData->J[i][j][nJ];
memcpy(gradF + ii, gradL, nv*sizeof(modelica_real));
}
}

for(j = 0; j < np; ++j, ii += nv){
gradL = (j + 1 == np) ? optData->J[i][j][optData->s.derIndex[2]] : optData->J[i][j][k];
gradL = optData->J[i][j][nJ];;
memcpy(gradF + ii, gradL, nv*sizeof(modelica_real));
}

Expand All @@ -140,8 +141,7 @@ Bool evalfDiffF(Index n, double * vopt, Bool new_x, Number *gradF, void * useDat
}

if(ma){
const int k = optData->s.derIndex[0];
modelica_real * gradM = optData->J[nsi - 1][np -1][k];
modelica_real * gradM = optData->J[nsi - 1][np -1][nJ1];
if(la){
int i;
for(i = 0; i < nv; ++i)
Expand Down
44 changes: 5 additions & 39 deletions SimulationRuntime/c/optimization/eval_all/EvalG.c
Expand Up @@ -218,8 +218,7 @@ Bool evalfDiffG(Index n, double * vopt, Bool new_x, Index m, Index njac, Index *
}
}
for(; l< nJ; ++l){
cindex = optData->s.indexCon2[l-nx];
structJacC(optData->J[0][j][cindex], values, nv, &k, J[l]);
structJacC(optData->J[0][j][l], values, nv, &k, J[l]);
}
}

Expand All @@ -243,11 +242,7 @@ Bool evalfDiffG(Index n, double * vopt, Bool new_x, Index m, Index njac, Index *
}
}
for(; l< nJ; ++l){
if(i + 1 == nsi && j + 1 == np)
cindex = optData->s.indexCon3[l-nx];
else
cindex = optData->s.indexCon2[l-nx];
structJacC(optData->J[i][j][cindex], values, nv, &k, J[l]);
structJacC(optData->J[i][j][l], values, nv, &k, J[l]);
}
}
}
Expand All @@ -257,48 +252,19 @@ Bool evalfDiffG(Index n, double * vopt, Bool new_x, Index m, Index njac, Index *
for(l = 0; l < nJ; ++l){
for(ii = 0; ii < nv; ++ii)
if(J[l][ii]){
if(l < nx){
values[k++] = (modelica_real)((ii == l) ? optData->J[0][j][l][ii] - 1.0 : optData->J[0][j][l][ii]);
}else{
cindex = optData->s.indexCon2[l-nx];
values[k++] = optData->J[0][j][cindex][ii];
}
values[k++] = (modelica_real)((ii == l && l < nx) ? optData->J[0][j][l][ii] - 1.0 : optData->J[0][j][l][ii]);
}
}
}
/*****************************/
for(i = 1; i < nsi-1; ++i){
for(i = 1; i < nsi; ++i){
for(j = 0; j < np; ++j){
for(l = 0; l < nJ; ++l){
if(l < nx)
values[k++] = 1.0;

for(ii = 0; ii < nv; ++ii){
if(J[l][ii]){
if(l < nx){
values[k++] = (modelica_real)((ii == l) ? optData->J[i][j][l][ii] - 1.0 : optData->J[i][j][l][ii]);
}else{
cindex = optData->s.indexCon2[l-nx];
values[k++] = optData->J[i][j][cindex][ii];
}
}
}
}
}
}
/*****************************/
for(j = 0; j < np; ++j){
for(l = 0; l < nJ; ++l){
if(l < nx)
values[k++] = 1.0;

for(ii = 0; ii < nv; ++ii){
if(J[l][ii]){
if(l < nx){
values[k++] = (modelica_real)((ii == l) ? optData->J[i][j][l][ii] - 1.0 : optData->J[i][j][l][ii]);
}else{
cindex = (j + 1 == np)? optData->s.indexCon3[l-nx] : optData->s.indexCon2[l-nx];
values[k++] = optData->J[i][j][cindex][ii];
values[k++] = (modelica_real)((ii == l && l < nx) ? optData->J[i][j][l][ii] - 1.0 : optData->J[i][j][l][ii]);
}
}
}
Expand Down
30 changes: 6 additions & 24 deletions SimulationRuntime/c/optimization/eval_all/EvalL.c
Expand Up @@ -196,7 +196,6 @@ static inline void num_hessian0(double * v, const double * const lambda,

int ii,jj, l;
long double v_save, h;
int * cindex = optData->s.indexCon2;
modelica_real * realV[3];


Expand Down Expand Up @@ -230,24 +229,18 @@ static inline void num_hessian0(double * v, const double * const lambda,
/********************/
for(jj = 0; jj <ii+1; ++jj){
if(optData->s.H0[ii][jj]){
for(l = 0; l < nx; ++l){
for(l = 0; l < nJ; ++l){
if(optData->s.Hg[l][ii][jj] && lambda[l] != 0)
optData->H[l][ii][jj] = (long double)(optData->tmpJ[l][jj] - optData->J[i][j][l][jj])*lambda[l]/h;
}
for(; l < nJ; ++l){
if(optData->s.Hg[l][ii][jj] && lambda[l] != 0){
optData->H[l][ii][jj] = (long double)(optData->tmpJ[cindex[l-nx]][jj] - optData->J[i][j][cindex[l-nx]][jj])*lambda[l]/h;
}
}
}
}
/********************/
if(upCost){
const int index_la = optData->s.derIndex[1];
h = objFactor/h;
for(jj = 0; jj <ii+1; ++jj){
if(optData->s.Hl[ii][jj]){
optData->Hl[ii][jj] = (long double)(optData->tmpJ[index_la][jj] - optData->J[i][j][index_la][jj])*h;
optData->Hl[ii][jj] = (long double)(optData->tmpJ[nJ][jj] - optData->J[i][j][nJ][jj])*h;
}else{
optData->Hl[ii][jj] = 0.0;
}
Expand All @@ -274,18 +267,17 @@ static inline void num_hessian1(double * v, const double * const lambda,
const modelica_boolean la = optData->s.lagrange;
const modelica_boolean ma = optData->s.mayer;
const modelica_boolean upCost = la && objFactor != 0;
const int index_la = optData->s.derIndex[1];

const int nv = optData->dim.nv;
const int nx = optData->dim.nx;
const int np = optData->dim.np;
const int nJ = optData->dim.nJ;
const int nJ1 = optData->dim.nJ + 1;
const int nsi = optData->dim.nsi;
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) ? 3 : 2;
int * cindex = (upCost2) ? optData->s.indexCon3:optData->s.indexCon2;
int ii,jj, l,k;
long double v_save, h;
DATA * data = optData->data;
Expand Down Expand Up @@ -323,39 +315,29 @@ static inline void num_hessian1(double * v, const double * const lambda,
/********************/
for(jj = 0; jj <ii+1; ++jj){
if(optData->s.H0[ii][jj]){
for(l = 0; l < nx; ++l){
for(l = 0; l < nJ; ++l){
if(optData->s.Hg[l][ii][jj])
optData->H[l][ii][jj] = (long double)(optData->tmpJ[l][jj] - optData->J[i][j][l][jj])*lambda[l]/h;
}
for(; l < nJ; ++l){
if(optData->s.Hg[l][ii][jj])
optData->H[l][ii][jj] = (long double)(optData->tmpJ[cindex[l-nx]][jj] - optData->J[i][j][cindex[l-nx]][jj])*lambda[l]/h;
}
}
}
/********************/
if(upCost){
int index_la;
long double hh;
if(np == j + 1 && nsi == i +1)
index_la = optData->s.derIndex[2];
else
index_la = optData->s.derIndex[1];
hh = objFactor/h;
for(jj = 0; jj <ii+1; ++jj){
if(optData->s.Hl[ii][jj]){
optData->Hl[ii][jj] = (long double)(optData->tmpJ[index_la][jj] - optData->J[i][j][index_la][jj])*hh;
optData->Hl[ii][jj] = (long double)(optData->tmpJ[nJ][jj] - optData->J[i][j][nJ][jj])*hh;
}
}
}
/********************/
if(upCost2){
const int index_ma = optData->s.derIndex[0];
long double hh;
hh = objFactor/h;
for(jj = 0; jj <ii+1; ++jj){
if(optData->s.Hm[ii][jj]){
optData->Hm[ii][jj] = (long double)(optData->tmpJ[index_ma][jj] - optData->J[i][j][index_ma][jj])*hh;
optData->Hm[ii][jj] = (long double)(optData->tmpJ[nJ1][jj] - optData->J[i][j][nJ1][jj])*hh;
}
}
}
Expand Down
5 changes: 5 additions & 0 deletions SimulationRuntime/c/optimization/optimizer_main.c
Expand Up @@ -250,6 +250,11 @@ static inline void freeOptimizerData(OptData*optData){
*/
free(optData->s.lindex);
free(optData->s.seedVec);
free(optData->s.indexCon2);
free(optData->s.indexCon3);
free(optData->s.indexJ2);
free(optData->s.indexJ3);

/*************************/
for(i = 0; i < nsi; ++i){
for(j = 0; j < np; ++j){
Expand Down

0 comments on commit a984893

Please sign in to comment.