Skip to content

Commit 6242b5d

Browse files
author
Vitalij Ruge
committed
- update calculation of gradient for optimization
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@18359 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
1 parent a71c721 commit 6242b5d

File tree

9 files changed

+215
-214
lines changed

9 files changed

+215
-214
lines changed

Compiler/BackEnd/BackendDAEOptimize.mo

Lines changed: 79 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ protected import BaseHashTable;
5959
protected import Ceval;
6060
protected import CheckModel;
6161
protected import ClassInf;
62+
protected import Config;
6263
protected import ComponentReference;
6364
protected import DAEUtil;
6465
protected import Debug;
@@ -3072,7 +3073,7 @@ protected
30723073
algorithm
30733074
System.realtimeTick(GlobalScript.RT_CLOCK_EXECSTAT_JACOBIANS);
30743075
BackendDAE.DAE(eqs=eqs,shared=shared) := inBackendDAE;
3075-
(linearModelMatrixes, funcs) := createLinearModelMatrixes(inBackendDAE);
3076+
(linearModelMatrixes, funcs) := createLinearModelMatrixes(inBackendDAE, Config.acceptOptimicaGrammar());
30763077
shared := BackendDAEUtil.addBackendDAESharedJacobians(linearModelMatrixes, shared);
30773078
functionTree := BackendDAEUtil.getFunctions(shared);
30783079
functionTree := DAEUtil.joinAvlTrees(functionTree, funcs);
@@ -3094,7 +3095,7 @@ protected function createSymbolicJacobianforStates
30943095
output DAE.FunctionTree outFunctionTree;
30953096
algorithm
30963097
(outJacobian, outSparsePattern, outSparseColoring, outFunctionTree) :=
3097-
matchcontinue (inBackendDAE)
3098+
match (inBackendDAE)
30983099
local
30993100
BackendDAE.BackendDAE backendDAE, backendDAE2;
31003101

@@ -3147,25 +3148,29 @@ algorithm
31473148
Error.addMessage(Error.INTERNAL_ERROR, {"Generation of symbolic Jacobian Matrix code failed. Function: BackendDAEOpimize.createSymcolicaJacobianforStates"});
31483149
then
31493150
fail();
3150-
end matchcontinue;
3151+
end match;
31513152
end createSymbolicJacobianforStates;
31523153

31533154
protected function createLinearModelMatrixes
31543155
"fuction creates the linear model matrices column-wise
31553156
author: wbraun"
31563157
input BackendDAE.BackendDAE inBackendDAE;
3158+
input Boolean UseOtimica;
31573159
output BackendDAE.SymbolicJacobians outJacobianMatrixes;
31583160
output DAE.FunctionTree outFunctionTree;
3161+
31593162
algorithm
31603163
(outJacobianMatrixes, outFunctionTree) :=
3161-
matchcontinue (inBackendDAE)
3164+
match (inBackendDAE,UseOtimica)
31623165
local
31633166
BackendDAE.BackendDAE backendDAE,backendDAE2;
31643167

3165-
list<BackendDAE.Var> varlst, knvarlst, states, inputvars, inputvars2, outputvars, paramvars;
3168+
list<BackendDAE.Var> varlst, knvarlst, states, inputvars, inputvars2, outputvars, paramvars, states_inputs;
3169+
BackendDAE.Var mayer, lagrange;
31663170
list<DAE.ComponentRef> comref_states, comref_inputvars, comref_outputvars, comref_vars, comref_knvars;
3171+
DAE.ComponentRef leftcref;
31673172

3168-
BackendDAE.Variables v,kv,statesarr,inputvarsarr,paramvarsarr,outputvarsarr;
3173+
BackendDAE.Variables v,kv,statesarr,inputvarsarr,paramvarsarr,outputvarsarr, object;
31693174
BackendDAE.EquationArray e;
31703175

31713176
BackendDAE.SymbolicJacobians linearModelMatrices;
@@ -3176,8 +3181,8 @@ algorithm
31763181

31773182
DAE.FunctionTree funcs, functionTree;
31783183
list<DAE.Function> funcLst;
3179-
3180-
case (backendDAE)
3184+
3185+
case (backendDAE, false)
31813186
equation
31823187
backendDAE2 = BackendDAEUtil.copyBackendDAE(backendDAE);
31833188
backendDAE2 = collapseIndependentBlocks(backendDAE2);
@@ -3222,6 +3227,71 @@ algorithm
32223227
Debug.fcall(Flags.JAC_DUMP2, print, "analytical Jacobians -> generated system for matrix C time: " +& realString(clock()) +& "\n");
32233228

32243229

3230+
// Differentiate the System w.r.t inputs for matrices D
3231+
(linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2,inputvars2,statesarr,inputvarsarr,paramvarsarr,outputvarsarr,varlst,"D");
3232+
functionTree = DAEUtil.joinAvlTrees(functionTree, funcs);
3233+
linearModelMatrices = listAppend(linearModelMatrices,{(SOME(linearModelMatrix),sparsePattern,sparseColoring)});
3234+
Debug.fcall(Flags.JAC_DUMP2, print, "analytical Jacobians -> generated system for matrix D time: " +& realString(clock()) +& "\n");
3235+
3236+
then
3237+
(linearModelMatrices, functionTree);
3238+
3239+
case (backendDAE, true) // created linear model (matrixes) fir for optimize
3240+
equation
3241+
backendDAE2 = BackendDAEUtil.copyBackendDAE(backendDAE);
3242+
backendDAE2 = collapseIndependentBlocks(backendDAE2);
3243+
backendDAE2 = BackendDAEUtil.transformBackendDAE(backendDAE2,SOME((BackendDAE.NO_INDEX_REDUCTION(),BackendDAE.EXACT())),NONE(),NONE());
3244+
BackendDAE.DAE({BackendDAE.EQSYSTEM(orderedVars = v, orderedEqs = e)}, BackendDAE.SHARED(knownVars = kv)) = backendDAE2;
3245+
3246+
// Prepare all needed variables
3247+
varlst = BackendVariable.varList(v);
3248+
comref_vars = List.map(varlst,BackendVariable.varCref);
3249+
knvarlst = BackendVariable.varList(kv);
3250+
comref_knvars = List.map(knvarlst,BackendVariable.varCref);
3251+
states = BackendVariable.getAllStateVarFromVariables(v);
3252+
inputvars = List.select(knvarlst,BackendVariable.isInput);
3253+
paramvars = List.select(knvarlst, BackendVariable.isParam);
3254+
inputvars2 = List.select(knvarlst,BackendVariable.isVarOnTopLevelAndInput);
3255+
outputvars = List.select(varlst, BackendVariable.isVarOnTopLevelAndOutput);
3256+
states_inputs = listAppend(states, inputvars2);
3257+
3258+
comref_states = List.map(states,BackendVariable.varCref);
3259+
comref_inputvars = List.map(inputvars2,BackendVariable.varCref);
3260+
comref_outputvars = List.map(outputvars,BackendVariable.varCref);
3261+
3262+
statesarr = BackendVariable.listVar1(states);
3263+
inputvarsarr = BackendVariable.listVar1(inputvars);
3264+
paramvarsarr = BackendVariable.listVar1(paramvars);
3265+
outputvarsarr = BackendVariable.listVar1(outputvars);
3266+
3267+
leftcref = ComponentReference.makeCrefIdent("$TMP_mayerTerm", DAE.T_REAL_DEFAULT, {});
3268+
mayer = BackendDAE.VAR(DAE.CREF_IDENT("$TMP_mayerTerm", DAE.T_REAL_DEFAULT, {}), BackendDAE.VARIABLE(), DAE.BIDIR(), DAE.NON_PARALLEL(), DAE.T_REAL_DEFAULT, NONE(), NONE(), {}, DAE.emptyElementSource, NONE(), NONE(), DAE.NON_CONNECTOR());
3269+
mayer = BackendVariable.setVarDirection(mayer, DAE.OUTPUT());
3270+
3271+
leftcref = ComponentReference.makeCrefIdent("$TMP_lagrangeTerm", DAE.T_REAL_DEFAULT, {});
3272+
lagrange = BackendDAE.VAR(DAE.CREF_IDENT("$TMP_lagrangeTerm", DAE.T_REAL_DEFAULT, {}), BackendDAE.VARIABLE(), DAE.BIDIR(), DAE.NON_PARALLEL(), DAE.T_REAL_DEFAULT, NONE(), NONE(), {}, DAE.emptyElementSource, NONE(), NONE(), DAE.NON_CONNECTOR());
3273+
lagrange = BackendVariable.setVarDirection(lagrange, DAE.OUTPUT());
3274+
3275+
object = BackendVariable.listVar1({mayer,lagrange});
3276+
3277+
// Differentiate the System w.r.t states for matrices A
3278+
(linearModelMatrix, sparsePattern, sparseColoring, functionTree) = createJacobian(backendDAE2,states,statesarr,inputvarsarr,paramvarsarr,statesarr,varlst,"A");
3279+
linearModelMatrices = {(SOME(linearModelMatrix),sparsePattern,sparseColoring)};
3280+
Debug.fcall(Flags.JAC_DUMP2, print, "analytical Jacobians -> generated system for matrix A time: " +& realString(clock()) +& "\n");
3281+
3282+
3283+
// Differentiate the System w.r.t states&inputs for matrices B
3284+
(linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2,states_inputs,statesarr,inputvarsarr,paramvarsarr,statesarr,varlst,"B");
3285+
functionTree = DAEUtil.joinAvlTrees(functionTree, funcs);
3286+
linearModelMatrices = listAppend(linearModelMatrices,{(SOME(linearModelMatrix),sparsePattern,sparseColoring)});
3287+
Debug.fcall(Flags.JAC_DUMP2, print, "analytical Jacobians -> generated system for matrix B time: " +& realString(clock()) +& "\n");
3288+
3289+
// Differentiate the System w.r.t states for matrices C
3290+
(linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2,states_inputs,statesarr,inputvarsarr,paramvarsarr,object,varlst,"C");
3291+
linearModelMatrices = listAppend(linearModelMatrices,{(SOME(linearModelMatrix),sparsePattern,sparseColoring)});
3292+
Debug.fcall(Flags.JAC_DUMP2, print, "analytical Jacobians -> generated system for matrix C time: " +& realString(clock()) +& "\n");
3293+
3294+
32253295
// Differentiate the System w.r.t inputs for matrices D
32263296
(linearModelMatrix, sparsePattern, sparseColoring, funcs) = createJacobian(backendDAE2,inputvars2,statesarr,inputvarsarr,paramvarsarr,outputvarsarr,varlst,"D");
32273297
functionTree = DAEUtil.joinAvlTrees(functionTree, funcs);
@@ -3235,7 +3305,7 @@ algorithm
32353305
Error.addMessage(Error.INTERNAL_ERROR, {"Generation of LinearModel Matrices failed. Function: BackendDAEOpimize.createLinearModelMatrixes"});
32363306
then
32373307
fail();
3238-
end matchcontinue;
3308+
end match;
32393309
end createLinearModelMatrixes;
32403310

32413311
public function createJacobian "author: wbraun

Compiler/Template/CodegenC.tpl

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10373,48 +10373,22 @@ template optimizationComponents1(ClassAttributes classAttribute, SimCode simCode
1037310373
let objectiveFunction = match objetiveE
1037410374
case SOME(exp) then
1037510375
<<
10376-
if(i == 0)
1037710376
*res = $P$TMP_mayerTerm;
10378-
else if(i == 1)
10379-
#ifdef $P$TMP_mayerTerm$pDERC$PdummyVarC
10380-
*res = $P$TMP_mayerTerm$pDERC$PdummyVarC;
10381-
#else
10382-
*res = 0.0;
10383-
#endif
10384-
else if(i == 2)
10385-
#ifdef $P$TMP_mayerTerm$pDERC$PdummyVarD
10386-
*res = $P$TMP_mayerTerm$pDERC$PdummyVarD;
10387-
#else
10388-
*res = 0.0;
10389-
#endif
10390-
return 0;
10377+
return 0;
1039110378
>>
1039210379

1039310380
let objectiveIntegrand = match objectiveIntegrandE case SOME(exp) then
1039410381
<<
10395-
if(i == 0)
10396-
*res = $P$TMP_lagrangeTerm;
10397-
else if(i == 1)
10398-
#ifdef $P$TMP_lagrangeTerm$pDERC$PdummyVarC
10399-
*res = $P$TMP_lagrangeTerm$pDERC$PdummyVarC;
10400-
#else
10401-
*res = 0.0;
10402-
#endif
10403-
else if(i == 2)
10404-
#ifdef $P$TMP_lagrangeTerm$pDERD$PdummyVarD
10405-
*res = $P$TMP_lagrangeTerm$pDERD$PdummyVarD;
10406-
#else
10407-
*res = 0.0;
10408-
#endif
10409-
return 0;
10382+
*res = $P$TMP_lagrangeTerm;
10383+
return 0;
1041010384
>>
1041110385
let listConstraintsLength = match simCode case SIMCODE(modelInfo = MODELINFO(__)) then listLength(constraints)
1041210386

1041310387
let constraints = match simCode case SIMCODE(modelInfo = MODELINFO(__)) then pathConstraints(constraints)
1041410388
<<
1041510389
/* objectiveFunction */
1041610390

10417-
int mayer(DATA* data, modelica_real* res, int i)
10391+
int mayer(DATA* data, modelica_real* res)
1041810392
{
1041910393
<%varDecls%>
1042010394
<%preExp%>
@@ -10423,7 +10397,7 @@ template optimizationComponents1(ClassAttributes classAttribute, SimCode simCode
1042310397
}
1042410398

1042510399
/* objectiveIntegrand */
10426-
int lagrange(DATA* data, modelica_real* res, int i)
10400+
int lagrange(DATA* data, modelica_real* res)
1042710401
{
1042810402
<%varDecls1%>
1042910403
<%preExp1%>

SimulationRuntime/c/optimization/constraints/evalfG.c

Lines changed: 29 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@
4545

4646
#ifdef WITH_IPOPT
4747

48-
static int functionJacASym_ode(IPOPT_DATA_* data, double** jac);
49-
static int functionJacBSym_ode(IPOPT_DATA_* data, double** jac);
5048
int diff_functionODE_debug(double* v, double t, IPOPT_DATA_ *iData);
5149

5250
/*!
@@ -205,66 +203,59 @@ int diff_functionODE0(double* v, double t, IPOPT_DATA_ *iData)
205203
int diff_symColoredODE(double *v, double t, IPOPT_DATA_ *iData, double **J)
206204
{
207205
DATA * data = iData->data;
208-
const int index1 = 1;
209-
const int index2 = 2;
210-
int index;
206+
const int index = 2;
211207
double*x,*u;
212208

213-
int i,j,l,ii,nx,k;
209+
int i,j,l,ii,nx;
214210
int *cC,*lindex;
215211

216212
x = v;
217213
u = x + iData->nx;
218214

219-
for(index=index1; index<index2+1; ++index)
220-
{
221-
nx = data->simulationInfo.analyticJacobians[index].sizeCols;
222-
cC = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.colorCols;
223-
lindex = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex;
224215

225-
k = (index == index1) ? 0 : iData->nx;
216+
nx = data->simulationInfo.analyticJacobians[index].sizeCols;
217+
cC = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.colorCols;
218+
lindex = (int*)data->simulationInfo.analyticJacobians[index].sparsePattern.leadindex;
226219

227-
for(i = 1; i < data->simulationInfo.analyticJacobians[index].sparsePattern.maxColors + 1; ++i)
220+
for(i = 1; i < data->simulationInfo.analyticJacobians[index].sparsePattern.maxColors + 1; ++i)
221+
{
222+
for(ii = 0; ii<nx; ++ii)
228223
{
229-
for(ii = 0; ii<nx; ++ii)
224+
if(cC[ii] == i)
230225
{
231-
if(cC[ii] == i)
232-
{
233-
data->simulationInfo.analyticJacobians[index].seedVars[ii] = 1.0;
234-
}
226+
data->simulationInfo.analyticJacobians[index].seedVars[ii] = 1.0;
235227
}
228+
}
236229

237-
if(index == index1)
238-
data->callback->functionJacA_column(data);
239-
else
240-
data->callback->functionJacB_column(data);
230+
data->callback->functionJacB_column(data);
241231

242-
for(ii = 0; ii < nx; ii++)
232+
for(ii = 0; ii < nx; ii++)
233+
{
234+
if(cC[ii] == i)
243235
{
244-
if(cC[ii] == i)
236+
if(ii == 0)
237+
j = 0;
238+
else
239+
j = lindex[ii-1];
240+
241+
for(; j<lindex[ii]; ++j)
245242
{
246-
if(ii == 0)
247-
j = 0;
248-
else j = lindex[ii-1];
249-
250-
for(; j<lindex[ii]; ++j)
251-
{
252-
l = data->simulationInfo.analyticJacobians[index].sparsePattern.index[j];
253-
J[l][ii + k] = data->simulationInfo.analyticJacobians[index].resultVars[l];
254-
}
243+
l = data->simulationInfo.analyticJacobians[index].sparsePattern.index[j];
244+
J[l][ii] = data->simulationInfo.analyticJacobians[index].resultVars[l];
255245
}
256246
}
247+
}
257248

258-
for(ii = 0; ii<nx; ++ii)
249+
for(ii = 0; ii<nx; ++ii)
250+
{
251+
if(cC[ii] == i)
259252
{
260-
if(cC[ii] == i)
261-
{
262-
data->simulationInfo.analyticJacobians[index].seedVars[ii] = 0.0;
263-
}
253+
data->simulationInfo.analyticJacobians[index].seedVars[ii] = 0.0;
264254
}
265255
}
266256
}
267257

258+
268259
return 0;
269260
}
270261

0 commit comments

Comments
 (0)