Skip to content

Commit 58a5c63

Browse files
author
Vitalij Ruge
committed
- fixed: coloring for gradient| Thanks Willi
- mv Willi's solution from (newadol-c)branch to the trunk - acktivated: coloring for gradient git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@18455 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent a3798cb commit 58a5c63

File tree

5 files changed

+55
-23
lines changed

5 files changed

+55
-23
lines changed

Compiler/BackEnd/SimCodeUtil.mo

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5331,7 +5331,7 @@ algorithm
53315331
Debug.fcall(Flags.JAC_DUMP2, print, "analytical Jacobians -> create all SimCode vars for Matrix " +& name +& " time: " +& realString(clock()) +& "\n");
53325332

53335333
(_, (_, seedVars)) = traveseSimVars(simvars, findSimVars, (diffCompRefs, {}));
5334-
(_, (_, indexVars)) = traveseSimVars(simvars, findSimVars, (diffedCompRefs, {}));
5334+
(_, (_, indexVars)) = traveseSimVars(simvars, findSimVarsCompare, (diffedCompRefs, {}));
53355335
maxColor = listLength(colsColors);
53365336
s = intString(listLength(diffedVars));
53375337

@@ -5368,6 +5368,42 @@ algorithm
53685368
end matchcontinue;
53695369
end findSimVars;
53705370

5371+
protected function findSimVarsCompare
5372+
input tuple<SimCode.SimVar, tuple<list<DAE.ComponentRef>, list<SimCode.SimVar>>> inTuple;
5373+
output tuple<SimCode.SimVar, tuple<list<DAE.ComponentRef>, list<SimCode.SimVar>>> outTuple;
5374+
algorithm
5375+
outTuple := matchcontinue(inTuple)
5376+
local
5377+
DAE.ComponentRef cref;
5378+
list<DAE.ComponentRef> crefs;
5379+
list<SimCode.SimVar> simvars;
5380+
SimCode.SimVar var;
5381+
case((var as (SimCode.SIMVAR(name=cref)), (crefs, simvars)))
5382+
equation
5383+
true = listMember(cref, crefs);
5384+
true = not List.isMemberOnTrue(var, simvars, compareSimVarName);
5385+
then ((var, (crefs, listAppend(simvars, {var}))));
5386+
case(_) then inTuple;
5387+
end matchcontinue;
5388+
end findSimVarsCompare;
5389+
5390+
protected function compareSimVarName
5391+
input SimCode.SimVar var;
5392+
input SimCode.SimVar var1;
5393+
output Boolean b;
5394+
algorithm
5395+
b := matchcontinue(var, var1)
5396+
local
5397+
DAE.ComponentRef name, name1;
5398+
case (SimCode.SIMVAR(name = name), SimCode.SIMVAR(name = name1))
5399+
equation
5400+
true = ComponentReference.crefEqual(name, name1);
5401+
then true;
5402+
5403+
else false;
5404+
end matchcontinue;
5405+
end compareSimVarName;
5406+
53715407
protected function creatallDiffedVars
53725408
// function: help function for creatallDiffedVars
53735409
// author: wbraun

SimulationRuntime/c/optimization/constraints/evalfG.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,10 +233,8 @@ int diff_symColoredODE(double *v, double t, IPOPT_DATA_ *iData, double **J)
233233
{
234234
if(cC[ii] == i)
235235
{
236-
if(ii == 0)
237-
j = 0;
238-
else
239-
j = lindex[ii-1];
236+
if(ii == 0)j = 0;
237+
else j = lindex[ii-1];
240238

241239
for(; j<lindex[ii]; ++j)
242240
{

SimulationRuntime/c/optimization/goal/evalF.c

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -208,19 +208,10 @@ int diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
208208
int i,j,l,ii,nx;
209209
int *cC,*lindex;
210210

211-
#if 1
212-
for(i = 0; i<iData->nv; ++i)
213-
{
214-
data->simulationInfo.analyticJacobians[index].seedVars[i] = 1.0;
215-
data->callback->functionJacC_column(data);
216-
data->simulationInfo.analyticJacobians[index].seedVars[i] = 0.0;
217-
dF[i] = data->simulationInfo.analyticJacobians[index].resultVars[this_it];
218-
}
219-
220-
#else
221-
222211
/*ToDo*/
223212
nx = data->simulationInfo.analyticJacobians[index].sizeCols;
213+
214+
224215
cC = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.colorCols;
225216
lindex = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex;
226217

@@ -236,14 +227,18 @@ int diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
236227

237228
data->callback->functionJacC_column(data);
238229

239-
for(ii = 0; ii < nx; ii++)
230+
for(ii = 0; ii < nx; ++ii)
240231
{
241232
if(cC[ii] == i)
242233
{
243234
if(ii == 0) j = 0;
244235
else j = lindex[ii-1];
245-
if(j<lindex[ii])
246-
dF[ii] = data->simulationInfo.analyticJacobians[index].resultVars[this_it];
236+
237+
for(; j<lindex[ii]; ++j)
238+
{
239+
l = data->simulationInfo.analyticJacobians[index].sparsePattern.index[j];
240+
iData->gradFomc[l][ii] = data->simulationInfo.analyticJacobians[index].resultVars[l];
241+
}
247242
}
248243
}
249244

@@ -255,7 +250,8 @@ int diff_symColoredObject(IPOPT_DATA_ *iData, double *dF, int this_it)
255250
}
256251
}
257252
}
258-
#endif
253+
for(i =0; i<=nx; ++i)
254+
dF[i] = iData->gradFomc[this_it][i];
259255
return 0;
260256
}
261257
#endif

SimulationRuntime/c/optimization/initialOptimizer/allocate_ipopt.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,8 +125,8 @@ int allocateIpoptData(IPOPT_DATA_ *iData)
125125
for(i = 0; i < iData->nx; i++)
126126
iData->J0[i] = (double*) calloc(iData->nv, sizeof(double));
127127

128-
iData->gradFomc = (double**) malloc((iData->nx+2) * sizeof(double*));
129-
for(i = 0; i < iData->nx; i++)
128+
iData->gradFomc = (double**) malloc((2) * sizeof(double*));
129+
for(i = 0; i < 2; i++)
130130
iData->gradFomc[i] = (double*) calloc(iData->nv, sizeof(double));
131131

132132
iData->numJ = (double**) malloc(iData->nx * sizeof(double*));

SimulationRuntime/c/optimization/mainOptimizer/ipoptODE.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,10 @@ int startIpopt(DATA* data, SOLVER_INFO* solverInfo, int flag)
129129

130130
AddIpoptStrOption(nlp,"nlp_scaling_method","gradient-based");
131131
AddIpoptNumOption(nlp,"mu_init",1e-6);
132-
if(ACTIVE_STREAM(LOG_JAC))
132+
if(ACTIVE_STREAM(LOG_JAC)){
133+
AddIpoptIntOption(nlp, "print_level", 4);
133134
AddIpoptStrOption(nlp, "derivative_test", "second-order");
135+
}
134136
/*AddIpoptStrOption(nlp, "derivative_test_print_all", "yes");*/
135137
/* AddIpoptNumOption(nlp,"derivative_test_perturbation",1e-6); */
136138
AddIpoptIntOption(nlp, "max_iter", 5000);

0 commit comments

Comments
 (0)