Skip to content

Commit

Permalink
- split function
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19052 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Vitalij Ruge committed Feb 11, 2014
1 parent 25b970a commit 796667a
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 107 deletions.
173 changes: 99 additions & 74 deletions SimulationRuntime/c/optimization/initialOptimizer/initial_guess.c
Expand Up @@ -44,6 +44,9 @@

#ifdef WITH_IPOPT

static int initial_guess_ipopt_cflag(IPOPT_DATA_ *iData,char* cflags);
static int initial_guess_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo);

/*!
* create initial guess
* author: Vitalij Ruge
Expand All @@ -52,22 +55,48 @@ int initial_guess_ipopt(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
{
char *cflags;
cflags = (char*)omc_flagValue[FLAG_IPOPT_INIT];

if(cflags){
if(!strcmp(cflags,"const") || !strcmp(cflags,"CONST")){
int i, id;
for(i = 0, id=0; i<iData->NV;i++,++id){
if(id >=iData->nv)
id = 0;
if(id <iData->nx){
iData->v[i] = iData->data->modelData.realVarsData[id].attribute.start*iData->scalVar[id];
}else if(id< iData->nv){
iData->v[i] = iData->data->modelData.realVarsData[iData->index_u+id -iData->nx].attribute.start*iData->scalVar[id];
}
if(!initial_guess_ipopt_cflag(iData, cflags))
return 0;
}
initial_guess_ipopt_sim(iData, solverInfo);

return 0;
}
}
{

}

/*!
* create initial guess clfag option
* author: Vitalij Ruge
**/
static int initial_guess_ipopt_cflag(IPOPT_DATA_ *iData,char* cflags)
{
if(!strcmp(cflags,"const") || !strcmp(cflags,"CONST")){
int i, id;
for(i = 0, id=0; i<iData->NV;i++,++id){
if(id >=iData->nv)
id = 0;
if(id <iData->nx){
iData->v[i] = iData->data->modelData.realVarsData[id].attribute.start*iData->scalVar[id];
}else if(id< iData->nv){
iData->v[i] = iData->data->modelData.realVarsData[iData->index_u+id -iData->nx].attribute.start*iData->scalVar[id];
}
}
return 0;
}else if(!strcmp(cflags,"sim") || !strcmp(cflags,"SIM"))
return 1;

infoStreamPrint(LOG_STDOUT, 1, "ipopt_hesse | not found", cflags);
return 1;
}

/*!
* create initial guess dasslColorSymJac
* author: Vitalij Ruge
**/
static int initial_guess_ipopt_sim(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
{
double *u0, *u, *x, uu,tmp ,lhs, rhs;
int i,j,k,ii,jj,id;
int err;
Expand All @@ -79,69 +108,67 @@ int initial_guess_ipopt(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
SIMULATION_DATA *sData = (SIMULATION_DATA*)data->localData[0];
SIMULATION_INFO *sInfo = &(data->simulationInfo);

/* Initial DASSL solver */
DASSL_DATA* dasslData = (DASSL_DATA*) malloc(sizeof(DASSL_DATA));

tol = data->simulationInfo.tolerance;
data->simulationInfo.tolerance = fmin(fmax(tol,1e-8),1e-3);
infoStreamPrint(LOG_SOLVER, 0, "Initializing DASSL");
sInfo->solverMethod = "dasslColorSymJac";
solverInfo->solverMethod = S_DASSL;
dasrt_initial(iData->data, solverInfo, dasslData);
solverInfo->solverMethod = S_OPTIMIZATION;
solverInfo->solverData = dasslData;

u0 = data->localData[1]->realVars + iData->index_u;
u = data->localData[0]->realVars + iData->index_u;
x = data->localData[0]->realVars;
v = iData->v;

for(ii=iData->nx,j=0; j < iData->nu; ++j, ++ii){
u0[j] = data->modelData.realVarsData[iData->index_u+j].attribute.start;
u0[j] = fmin(fmax(u0[j],iData->umin[j]),iData->umax[j]);
u[j] = u0[j];
v[ii] = u0[j]*iData->scalVar[j + iData->nx];
}

printGuess = (short)(ACTIVE_STREAM(LOG_INIT) && !ACTIVE_STREAM(LOG_SOLVER));
if(printGuess){
printf("\n****initial guess****");
printf("\n #####done time[%i] = %f",0,iData->time[0]);
}

for(i=0, k=1, v=iData->v + iData->nv; i<iData->nsi; ++i){
for(jj=0; jj<iData->deg; ++jj, ++k){
solverInfo->currentStepSize = iData->time[k] - iData->time[k-1];
iData->data->localData[1]->timeValue = iData->time[k];

dasrt_step(data, solverInfo);

if(printGuess)
printf("\n #####done time[%i] = %f",k,iData->time[k]);

for(j=0; j< iData->nx; ++j){
v[j] = sData->realVars[j] * iData->scalVar[j];
}

for(ii=iData->index_u; j< iData->nv; ++j, ++ii){
v[j] = sData->realVars[ii] * iData->scalVar[j];
}

v += iData->nv;
/* updateContinuousSystem(iData->data); */
rotateRingBuffer(iData->data->simulationData, 1, (void**) iData->data->localData);
}
/* Initial DASSL solver */
DASSL_DATA* dasslData = (DASSL_DATA*) malloc(sizeof(DASSL_DATA));

tol = data->simulationInfo.tolerance;
data->simulationInfo.tolerance = fmin(fmax(tol,1e-8),1e-3);
infoStreamPrint(LOG_SOLVER, 0, "Initializing DASSL");
sInfo->solverMethod = "dasslColorSymJac";
solverInfo->solverMethod = S_DASSL;
dasrt_initial(iData->data, solverInfo, dasslData);
solverInfo->solverMethod = S_OPTIMIZATION;
solverInfo->solverData = dasslData;

u0 = data->localData[1]->realVars + iData->index_u;
u = data->localData[0]->realVars + iData->index_u;
x = data->localData[0]->realVars;
v = iData->v;

for(ii=iData->nx,j=0; j < iData->nu; ++j, ++ii){
u0[j] = data->modelData.realVarsData[iData->index_u+j].attribute.start;
u0[j] = fmin(fmax(u0[j],iData->umin[j]),iData->umax[j]);
u[j] = u0[j];
v[ii] = u0[j]*iData->scalVar[j + iData->nx];
}

printGuess = (short)(ACTIVE_STREAM(LOG_INIT) && !ACTIVE_STREAM(LOG_SOLVER));
if(printGuess){
printf("\n****initial guess****");
printf("\n #####done time[%i] = %f",0,iData->time[0]);
}

for(i=0, k=1, v=iData->v + iData->nv; i<iData->nsi; ++i){
for(jj=0; jj<iData->deg; ++jj, ++k){
solverInfo->currentStepSize = iData->time[k] - iData->time[k-1];
iData->data->localData[1]->timeValue = iData->time[k];

dasrt_step(data, solverInfo);

if(printGuess)
printf("\n #####done time[%i] = %f",k,iData->time[k]);

for(j=0; j< iData->nx; ++j)
v[j] = sData->realVars[j] * iData->scalVar[j];

for(ii=iData->index_u; j< iData->nv; ++j, ++ii)
v[j] = sData->realVars[ii] * iData->scalVar[j];

v += iData->nv;
/* updateContinuousSystem(iData->data); */
rotateRingBuffer(iData->data->simulationData, 1, (void**) iData->data->localData);
}
}

for(i = 0, id=0; i<iData->NV;i++,++id){
if(id >=iData->nv)
id = 0;
if(id <iData->nx){
iData->v[i] =fmin(fmax(iData->vmin[id],iData->v[i]),iData->vmax[id]);
}else if(id< iData->nv){
iData->v[i] = fmin(fmax(iData->vmin[id],iData->v[i]),iData->vmax[id]);
}
id = 0;

if(id <iData->nx){
iData->v[i] =fmin(fmax(iData->vmin[id],iData->v[i]),iData->vmax[id]);
}else if(id< iData->nv){
iData->v[i] = fmin(fmax(iData->vmin[id],iData->v[i]),iData->vmax[id]);
}
}

if(printGuess)
Expand All @@ -154,8 +181,6 @@ int initial_guess_ipopt(IPOPT_DATA_ *iData,SOLVER_INFO* solverInfo)
data->simulationInfo.tolerance = tol;

return 0;
}
return -1;
}

#endif
52 changes: 20 additions & 32 deletions SimulationRuntime/c/optimization/lagrangeFun/ipopt_hessian.c
Expand Up @@ -64,33 +64,28 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
int c,r,l,p;
r = 0;
c = 0;
for(i = 0; i<iData->nsi; ++i)
{
for(i = 0; i<iData->nsi; ++i){

if(i == 0)
{
if(i == 0){
/*0*/
for(p = 0;p <iData->deg+1;++p)
{
for(j=0;j< iData->nv;++j)
for(l = 0; l< j+1; ++l)
{
for(p = 0;p <iData->deg+1;++p){
for(j=0;j< iData->nv;++j){
for(l = 0; l< j+1; ++l){
iRow[k] = r + j;
iCol[k++] = c + l;
}
}
r += iData->nv;
c += iData->nv;
}
}
else{
for(p = 1;p <iData->deg+1;++p)
{
for(j=0;j< iData->nv;++j)
for(l = 0; l< j+1; ++l)
{
}else{
for(p = 1;p <iData->deg+1;++p){
for(j=0;j< iData->nv;++j){
for(l = 0; l< j+1; ++l){
iRow[k] = r + j;
iCol[k++] = c + l;
}
}
r += iData->nv;
c += iData->nv;
}
Expand All @@ -100,9 +95,7 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
for(i=0;i<nele_hess;++i)
printf("\nH(%i,%i) = 1;", iRow[i]+1, iCol[i]+1);
*/
}
else
{
}else{
double *x;
double *ll;
int ii;
Expand All @@ -116,11 +109,9 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
c = 0;
k = 0;

nJ = iData->nx + iData->nc;
for(ii = 0; ii <1; ++ii)
{
for(p = 0, x= v, ll = lambda;p <iData->deg+1;++p, x += iData->nv)
{
nJ = (int) iData->nJ;
for(ii = 0; ii <1; ++ii){
for(p = 0, x= v, ll = lambda;p <iData->deg+1;++p, x += iData->nv){
mayer_yes = iData->mayer && ii+1 == iData->nsi && p == iData->deg;

if(p){
Expand All @@ -143,8 +134,7 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam
}

for(i=0;i< iData->nv;++i)
for(j = 0; j< i+1; ++j)
{
for(j = 0; j< i+1; ++j){
sumLagrange(iData, &sum, ii, i, j, p, mayer_yes);
values[k++] = sum;
}
Expand All @@ -156,19 +146,17 @@ Bool ipopt_h(int n, double *v, Bool new_x, double obj_factor, int m, double *lam

}

for(; ii <iData->nsi; ++ii)
{
for(p = 1;p <iData->deg +1;++p,x += iData->nv)
{
for(; ii <iData->nsi; ++ii){
for(p = 1;p <iData->deg +1;++p,x += iData->nv){
mayer_yes = iData->mayer && ii+1 == iData->nsi && p == iData->deg;
num_hessian(x, iData->time[ii*iData->deg + p], iData,ll,iData->lagrange,mayer_yes,obj_factor);

for(i=0;i< iData->nv;++i)
for(j = 0; j< i+1; ++j)
{
for(j = 0; j< i+1; ++j){
sumLagrange(iData, &sum, ii, i, j, p, mayer_yes);
values[k++] = sum;
}

r += iData->nv;
c += iData->nv;
ll += nJ;
Expand Down
1 change: 0 additions & 1 deletion SimulationRuntime/c/optimization/localFunction.h
Expand Up @@ -77,7 +77,6 @@ int refreshSimData(double *x, double *u, double t, IPOPT_DATA_ *iData);

/*allocate*/
int loadDAEmodel(DATA* data, IPOPT_DATA_ *iData);
int get_moidel_info(DATA *data, IPOPT_DATA_ *iData);
int freeIpoptData(IPOPT_DATA_ *iData);

/*initial guess*/
Expand Down

0 comments on commit 796667a

Please sign in to comment.