Skip to content

Commit

Permalink
- added numerical gradient for objective function
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19094 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Feb 13, 2014
1 parent 9e973d7 commit 57424fb
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 40 deletions.
4 changes: 1 addition & 3 deletions SimulationRuntime/c/optimization/constraints/evalfG.c
Expand Up @@ -144,7 +144,7 @@ int diff_functionODE(double* v, double t, IPOPT_DATA_ *iData, double **J)
x = v;
u = v + iData->nx;

if(iData->useNumJac){
if(iData->useNumJac>0){

num_diff_symColoredODE(v,t,iData,J);
for(i = 0;i<iData->nv;++i)
Expand Down Expand Up @@ -197,7 +197,6 @@ int num_diff_symColoredODE(double *v, double t, IPOPT_DATA_ *iData, double **J)
cC = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.colorCols;
lindex = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex;

memcpy(iData->lhs, sData->realVars + iData->nx, sizeof(double)*iData->nx);
memcpy(iData->vsave, v, sizeof(double)*nx);

for(ii = 0; ii<nx; ++ii){
Expand Down Expand Up @@ -242,7 +241,6 @@ int num_diff_symColoredODE(double *v, double t, IPOPT_DATA_ *iData, double **J)
}
}


return 0;
}

Expand Down
147 changes: 110 additions & 37 deletions SimulationRuntime/c/optimization/goal/evalF.c
Expand Up @@ -46,6 +46,8 @@ static int eval_diff_mayer(IPOPT_DATA_ *iData, double* gradF, double *v);
static int eval_diff_lagrange1(IPOPT_DATA_ *iData, double *x, int *id_, double* gradF);
static int eval_diff_lagrange2(IPOPT_DATA_ *iData, double *x, int *id_, double* gradF);

int sym_diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it);
int num_diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it);

/*!
* eval object function
Expand Down Expand Up @@ -174,6 +176,7 @@ Bool evalfDiffF(Index n, double * v, Bool new_x, Number *gradF, void * useData)
x = v + iData->endN;

refreshSimData(x, x +iData->nx, iData->tf, iData);
iData->cv = x;
/*iData->data->callback->functionAlgebraics(iData->data);*/
diff_symColoredObject(iData, iData->gradF, iData->mayer_index);
for(j=0; j<iData->nv; ++j)
Expand All @@ -190,59 +193,129 @@ Bool evalfDiffF(Index n, double * v, Bool new_x, Number *gradF, void * useData)


/*
* function calculates a symbolic colored gradient "matrix"
* function calculates a symbolic/num colored gradient "matrix"
* author: vitalij
*/
int diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
{
if(iData->useNumJac==0)
sym_diff_symColoredObject(iData,dF,this_it);
else
num_diff_symColoredObject(iData,dF,this_it);
return 0;

}

/*
* function calculates a symbolic colored gradient "matrix"
* author: vitalij
*/
int sym_diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
{
DATA * data = iData->data;
const int index = 3;
int i,j,l,ii,nx;
int *cC,*lindex;

/*ToDo*/
nx = data->simulationInfo.analyticJacobians[index].sizeCols;


cC = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.colorCols;
lindex = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex;

for(i = 1; i < data->simulationInfo.analyticJacobians[index].sparsePattern.maxColors + 1; ++i)
{
for(ii = 0; ii<nx; ++ii)
{
if(cC[ii] == i)
{
data->simulationInfo.analyticJacobians[index].seedVars[ii] = 1.0;
}
}

data->callback->functionJacC_column(data);

for(ii = 0; ii < nx; ++ii)
{
if(cC[ii] == i)
{
if(ii == 0) j = 0;
else j = lindex[ii-1];

for(; j<lindex[ii]; ++j)
{
l = data->simulationInfo.analyticJacobians[index].sparsePattern.index[j];
iData->gradFomc[l][ii] = data->simulationInfo.analyticJacobians[index].resultVars[l];
}
}
}

for(ii = 0; ii<nx; ++ii)
{
if(cC[ii] == i)
{
data->simulationInfo.analyticJacobians[index].seedVars[ii] = 0.0;
}
}
}
memcpy(dF, iData->gradFomc[this_it], sizeof(double)*iData->nv);
return 0;
}

/*
* function calculates a num colored gradient "matrix"
* author: vitalij
*/
int num_diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
{
DATA * data = iData->data;
const int index = 3;
int i,j,l,ii,nx;
const int index = 2;
double*x,*u;
SIMULATION_DATA *sData = (SIMULATION_DATA*)iData->data->localData[0];
int i,j,l,ii,nx,k;
int *cC,*lindex;
double lhs, rhs;
double *v;
double t = (double)sData->timeValue;

/*ToDo*/
nx = data->simulationInfo.analyticJacobians[index].sizeCols;
v = iData->cv;
x = v;
u = x + iData->nx;


nx = iData->nv;
cC = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.colorCols;
lindex = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex;
memcpy(iData->vsave, v, sizeof(double)*iData->nv);

for(i = 1; i < data->simulationInfo.analyticJacobians[index].sparsePattern.maxColors + 1; ++i)
{
for(ii = 0; ii<nx; ++ii)
{
if(cC[ii] == i)
{
data->simulationInfo.analyticJacobians[index].seedVars[ii] = 1.0;
}
}
for(ii = 0; ii<nx; ++ii){
iData->eps[ii] = DF_STEP(v[ii], iData->vnom[ii]);
}

data->callback->functionJacC_column(data);
for(i = 1; i < data->simulationInfo.analyticJacobians[index].sparsePattern.maxColors + 1; ++i){
for(ii = 0; ii<nx; ++ii){

for(ii = 0; ii < nx; ++ii)
{
if(cC[ii] == i)
{
if(ii == 0) j = 0;
else j = lindex[ii-1];

for(; j<lindex[ii]; ++j)
{
l = data->simulationInfo.analyticJacobians[index].sparsePattern.index[j];
iData->gradFomc[l][ii] = data->simulationInfo.analyticJacobians[index].resultVars[l];
}
}
}
v[ii] = iData->vsave[ii] + iData->eps[ii];

for(ii = 0; ii<nx; ++ii)
{
if(cC[ii] == i)
{
data->simulationInfo.analyticJacobians[index].seedVars[ii] = 0.0;
}
if((int)iData->mayer_index == (int)this_it)
goal_func_mayer(v, &lhs, iData);
else
goal_func_lagrange(v, &lhs, t, iData);


v[ii] = iData->vsave[ii] - iData->eps[ii];
//printf("\nrv[%i] = %g\t eps[%i] = %g",ii,v[ii], ii,iData->eps[ii]);

if( (int)iData->mayer_index == (int) this_it)
goal_func_mayer(v, &rhs, iData);
else
goal_func_lagrange(v, &rhs, t, iData);

v[ii] = iData->vsave[ii];
dF[ii] = (lhs - rhs)/(2.0*iData->eps[ii]);
dF[ii] /= iData->vnom[ii];
}
}
memcpy(dF, iData->gradFomc[this_it], sizeof(double)*iData->nv);
return 0;
}
#endif
1 change: 1 addition & 0 deletions SimulationRuntime/c/optimization/ipoptODEstruct.h
Expand Up @@ -103,6 +103,7 @@ typedef struct IPOPT_DATA_
double *sv;
double *v;
double *w;
double *cv;
double *dotx0;
double *dotx1;
double *dotx2;
Expand Down

0 comments on commit 57424fb

Please sign in to comment.