Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit 4548444

Browse files
lochelOpenModelica-Hudson
authored andcommitted
Don't generate unnecessary start value equations
1 parent e36b947 commit 4548444

File tree

3 files changed

+48
-44
lines changed

3 files changed

+48
-44
lines changed

Compiler/BackEnd/BackendVariable.mo

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2056,6 +2056,32 @@ public function emptyVarsSized
20562056
output BackendDAE.Variables outVariables = emptyVars(size);
20572057
end emptyVarsSized;
20582058

2059+
public function isCrefInVarList "O(n)"
2060+
input DAE.ComponentRef inCref;
2061+
input list<BackendDAE.Var> inVars;
2062+
output Boolean isInList = false;
2063+
algorithm
2064+
for v in inVars loop
2065+
if ComponentReference.crefEqual(BackendVariable.varCref(v), inCref) then
2066+
isInList := true;
2067+
return;
2068+
end if;
2069+
end for;
2070+
end isCrefInVarList;
2071+
2072+
public function areAllCrefsInVarList "O(n^2)"
2073+
input list<DAE.ComponentRef> inCrefs;
2074+
input list<BackendDAE.Var> inVars;
2075+
output Boolean isInList = true;
2076+
algorithm
2077+
for cref in inCrefs loop
2078+
if not isCrefInVarList(cref, inVars) then
2079+
isInList := false;
2080+
return;
2081+
end if;
2082+
end for;
2083+
end areAllCrefsInVarList;
2084+
20592085
public function varList
20602086
"Takes a BackendDAE.Variables and returns a list of all variables in it,
20612087
useful for e.g. dumping.

Compiler/BackEnd/Initialization.mo

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2022,32 +2022,6 @@ algorithm
20222022
end match;
20232023
end collectInitialVarsEqnsSystem;
20242024

2025-
protected function isCrefPrimaryParameter
2026-
input DAE.ComponentRef inCref;
2027-
input list<BackendDAE.Var> inAllPrimaryParameters;
2028-
output Boolean isPrimary = false;
2029-
algorithm
2030-
for v in inAllPrimaryParameters loop
2031-
if ComponentReference.crefEqual(BackendVariable.varCref(v), inCref) then
2032-
isPrimary := true;
2033-
return;
2034-
end if;
2035-
end for;
2036-
end isCrefPrimaryParameter;
2037-
2038-
protected function areCrefsPrimaryParameters
2039-
input list<DAE.ComponentRef> inCrefs;
2040-
input list<BackendDAE.Var> inAllPrimaryParameters;
2041-
output Boolean isPrimary = true;
2042-
algorithm
2043-
for cref in inCrefs loop
2044-
if not isCrefPrimaryParameter(cref, inAllPrimaryParameters) then
2045-
isPrimary := false;
2046-
return;
2047-
end if;
2048-
end for;
2049-
end areCrefsPrimaryParameters;
2050-
20512025
protected function collectInitialVars "author: lochel
20522026
This function collects all the vars for the initial system.
20532027
TODO: return additional equations for pre-variables"
@@ -2095,7 +2069,7 @@ algorithm
20952069
startExp = BackendVariable.varStartValue(var);
20962070
parameters = Expression.getAllCrefs(startExp);
20972071

2098-
if not areCrefsPrimaryParameters(parameters, allPrimaryParameters) then
2072+
if not BackendVariable.areAllCrefsInVarList(parameters, allPrimaryParameters) then
20992073
eqn = BackendDAE.EQUATION(Expression.crefExp(startCR), startExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
21002074
eqns = BackendEquation.addEquation(eqn, eqns);
21012075

@@ -2286,7 +2260,7 @@ algorithm
22862260
startExp = BackendVariable.varStartValue(var);
22872261
parameters = Expression.getAllCrefs(startExp);
22882262

2289-
if not areCrefsPrimaryParameters(parameters, allPrimaryParameters) then
2263+
if not BackendVariable.areAllCrefsInVarList(parameters, allPrimaryParameters) then
22902264
eqn = BackendDAE.EQUATION(Expression.crefExp(startCR), startExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
22912265
eqns = BackendEquation.addEquation(eqn, eqns);
22922266

@@ -2332,7 +2306,7 @@ algorithm
23322306
startExp = BackendVariable.varStartValue(var);
23332307
parameters = Expression.getAllCrefs(startExp);
23342308

2335-
if not areCrefsPrimaryParameters(parameters, allPrimaryParameters) then
2309+
if not BackendVariable.areAllCrefsInVarList(parameters, allPrimaryParameters) then
23362310
eqn = BackendDAE.EQUATION(Expression.crefExp(startCR), startExp, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_INITIAL);
23372311
eqns = BackendEquation.addEquation(eqn, eqns);
23382312

Compiler/SimCode/SimCodeUtil.mo

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ algorithm
330330

331331
// Assertions and crap
332332
// create parameter equations
333-
((uniqueEqIndex, startValueEquations)) := BackendDAEUtil.foldEqSystem(dlow, createStartValueEquations, (uniqueEqIndex, {}));
333+
((uniqueEqIndex, startValueEquations, _)) := BackendDAEUtil.foldEqSystem(dlow, createStartValueEquations, (uniqueEqIndex, {}, inAllPrimaryParameters));
334334
if debug then execStat("simCode: createStartValueEquations"); end if;
335335
((uniqueEqIndex, nominalValueEquations)) := BackendDAEUtil.foldEqSystem(dlow, createNominalValueEquations, (uniqueEqIndex, {}));
336336
if debug then execStat("simCode: createNominalValueEquations"); end if;
@@ -6333,28 +6333,28 @@ end createVarNominalAssertFromVars;
63336333
protected function createStartValueEquations
63346334
input BackendDAE.EqSystem syst;
63356335
input BackendDAE.Shared shared;
6336-
input tuple<Integer, list<SimCode.SimEqSystem>> acc;
6337-
output tuple<Integer, list<SimCode.SimEqSystem>> startValueEquations;
6336+
input tuple<Integer, list<SimCode.SimEqSystem>, list<BackendDAE.Var>> acc;
6337+
output tuple<Integer, list<SimCode.SimEqSystem>, list<BackendDAE.Var>> startValueEquations;
63386338
algorithm
63396339
startValueEquations := matchcontinue (syst, shared, acc)
63406340
local
63416341
BackendDAE.Variables vars, av;
63426342
list<BackendDAE.Equation> startValueEquationsTmp2;
63436343
list<SimCode.SimEqSystem> simeqns, simeqns1;
63446344
Integer uniqueEqIndex;
6345+
list<BackendDAE.Var> allPrimaryParameters;
63456346

6346-
// this is the old version if the new fails
6347-
case (BackendDAE.EQSYSTEM(orderedVars=vars), BackendDAE.SHARED(aliasVars=av), (uniqueEqIndex, simeqns)) equation
6347+
case (BackendDAE.EQSYSTEM(orderedVars=vars), BackendDAE.SHARED(aliasVars=av), (uniqueEqIndex, simeqns, allPrimaryParameters)) equation
63486348
// vars
6349-
((startValueEquationsTmp2, _)) = BackendVariable.traverseBackendDAEVars(vars, createInitialAssignmentsFromStart, ({}, av));
6349+
((startValueEquationsTmp2, _, _)) = BackendVariable.traverseBackendDAEVars(vars, createInitialAssignmentsFromStart, ({}, av, allPrimaryParameters));
63506350
startValueEquationsTmp2 = listReverse(startValueEquationsTmp2);
63516351
// kvars
63526352
// ((startValueEquationsTmp, _)) = BackendVariable.traverseBackendDAEVars(globalKnownVars, createInitialAssignmentsFromStart, ({}, av));
63536353
// startValueEquationsTmp = listReverse(startValueEquationsTmp);
63546354
// startValueEquationsTmp2 = listAppend(startValueEquationsTmp2, startValueEquationsTmp);
63556355

63566356
(simeqns1, uniqueEqIndex) = List.mapFold(startValueEquationsTmp2, dlowEqToSimEqSystem, uniqueEqIndex);
6357-
then ((uniqueEqIndex, listAppend(simeqns1, simeqns)));
6357+
then ((uniqueEqIndex, listAppend(simeqns1, simeqns), allPrimaryParameters));
63586358

63596359
else equation
63606360
Error.addInternalError("function createStartValueEquations failed", sourceInfo());
@@ -6506,31 +6506,35 @@ end createParameterEquations;
65066506

65076507
protected function createInitialAssignmentsFromStart
65086508
input BackendDAE.Var inVar;
6509-
input tuple<list<BackendDAE.Equation>, BackendDAE.Variables> inTpl;
6509+
input tuple<list<BackendDAE.Equation>, BackendDAE.Variables, list<BackendDAE.Var>> inTpl;
65106510
output BackendDAE.Var outVar;
6511-
output tuple<list<BackendDAE.Equation>, BackendDAE.Variables> outTpl;
6511+
output tuple<list<BackendDAE.Equation>, BackendDAE.Variables, list<BackendDAE.Var>> outTpl;
65126512
algorithm
65136513
(outVar,outTpl) := matchcontinue (inVar,inTpl)
65146514
local
65156515
BackendDAE.Var var;
65166516
BackendDAE.Equation initialEquation;
65176517
list<BackendDAE.Equation> eqns;
65186518
DAE.ComponentRef name;
6519-
DAE.Exp startv;
6519+
DAE.Exp startExp;
65206520
DAE.ElementSource source;
65216521
BackendDAE.Variables av;
6522+
list<BackendDAE.Var> allPrimaryParameters;
6523+
list<DAE.ComponentRef> parameters;
65226524

65236525
// also add an assignment for variables that have non-constant
65246526
// expressions, e.g. parameter values, as start. NOTE: such start
65256527
// attributes can then not be changed in the text file, since the initial
65266528
// calc. will override those entries!
6527-
case (var as BackendDAE.VAR(varName=name, source=source), (eqns, av))
6529+
case (var as BackendDAE.VAR(varName=name, source=source), (eqns, av, allPrimaryParameters))
65286530
equation
6529-
startv = BackendVariable.varStartValueFail(var);
6530-
false = Expression.isConst(startv);
6531+
startExp = BackendVariable.varStartValueFail(var);
6532+
parameters = Expression.getAllCrefs(startExp);
6533+
true = BackendVariable.areAllCrefsInVarList(parameters, allPrimaryParameters) "add equations if the start value depends only on primary parameters";
6534+
false = Expression.isConst(startExp) "don't add equations for constant start values";
65316535
SimCodeVar.NOALIAS() = getAliasVar(var, SOME(av));
6532-
initialEquation = BackendDAE.SOLVED_EQUATION(name, startv, source, BackendDAE.EQ_ATTR_DEFAULT_UNKNOWN);
6533-
then (var, (initialEquation :: eqns, av));
6536+
initialEquation = BackendDAE.SOLVED_EQUATION(name, startExp, source, BackendDAE.EQ_ATTR_DEFAULT_UNKNOWN);
6537+
then (var, (initialEquation :: eqns, av, allPrimaryParameters));
65346538

65356539
else (inVar,inTpl);
65366540
end matchcontinue;

0 commit comments

Comments
 (0)