Skip to content

Commit 179ea91

Browse files
committed
Analyser: track the constant, computed constant, and algebraic indexes.
1 parent c2504d7 commit 179ea91

File tree

68 files changed

+3454
-3438
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+3454
-3438
lines changed

src/analyser.cpp

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,8 @@ struct AnalyserInternalEquation
208208
bool variableOnRhs(const AnalyserInternalVariablePtr &variable);
209209
bool variableOnLhsOrRhs(const AnalyserInternalVariablePtr &variable);
210210

211-
bool check(const AnalyserModelPtr &model, size_t &stateIndex, size_t &variableIndex, bool checkNlaSystems);
211+
bool check(const AnalyserModelPtr &model, size_t &stateIndex, size_t &constantIndex,
212+
size_t &computedConstantIndex, size_t &algebraicIndex, bool checkNlaSystems);
212213
};
213214

214215
AnalyserInternalEquationPtr AnalyserInternalEquation::create(const ComponentPtr &component)
@@ -321,7 +322,8 @@ bool AnalyserInternalEquation::variableOnLhsOrRhs(const AnalyserInternalVariable
321322
}
322323

323324
bool AnalyserInternalEquation::check(const AnalyserModelPtr &model,
324-
size_t &stateIndex, size_t &variableIndex,
325+
size_t &stateIndex, size_t &constantIndex,
326+
size_t &computedConstantIndex, size_t &algebraicIndex,
325327
bool checkNlaSystems)
326328
{
327329
// Nothing to check if the equation has a known type.
@@ -437,7 +439,12 @@ bool AnalyserInternalEquation::check(const AnalyserModelPtr &model,
437439
case AnalyserInternalVariable::Type::ALGEBRAIC:
438440
variable->mIndex = (variable->mType == AnalyserInternalVariable::Type::STATE) ?
439441
++stateIndex :
440-
++variableIndex;
442+
(variable->mType == AnalyserInternalVariable::Type::CONSTANT) ?
443+
++constantIndex :
444+
((variable->mType == AnalyserInternalVariable::Type::COMPUTED_TRUE_CONSTANT)
445+
|| (variable->mType == AnalyserInternalVariable::Type::COMPUTED_VARIABLE_BASED_CONSTANT)) ?
446+
++computedConstantIndex :
447+
++algebraicIndex;
441448

442449
mUnknownVariables.push_back(variable);
443450

@@ -2748,7 +2755,9 @@ void Analyser::AnalyserImpl::analyseModel(const ModelPtr &model)
27482755
// model valid).
27492756

27502757
auto stateIndex = MAX_SIZE_T;
2751-
auto variableIndex = MAX_SIZE_T;
2758+
auto constantIndex = MAX_SIZE_T;
2759+
auto computedConstantIndex = MAX_SIZE_T;
2760+
auto algebraicIndex = MAX_SIZE_T;
27522761
auto loopNumber = 1;
27532762
bool relevantCheck;
27542763
auto checkNlaSystems = false;
@@ -2757,7 +2766,8 @@ void Analyser::AnalyserImpl::analyseModel(const ModelPtr &model)
27572766
relevantCheck = false;
27582767

27592768
for (const auto &internalEquation : mInternalEquations) {
2760-
relevantCheck = internalEquation->check(mModel, stateIndex, variableIndex, checkNlaSystems)
2769+
relevantCheck = internalEquation->check(mModel, stateIndex, constantIndex, computedConstantIndex,
2770+
algebraicIndex, checkNlaSystems)
27612771
|| relevantCheck;
27622772
}
27632773

@@ -2802,7 +2812,7 @@ void Analyser::AnalyserImpl::analyseModel(const ModelPtr &model)
28022812
case AnalyserInternalVariable::Type::INITIALISED:
28032813
// The variable is (still) initialised so it has to be a constant.
28042814

2805-
internalVariable->makeConstant(variableIndex);
2815+
internalVariable->makeConstant(constantIndex);
28062816

28072817
break;
28082818
case AnalyserInternalVariable::Type::OVERCONSTRAINED:
@@ -3058,7 +3068,9 @@ void Analyser::AnalyserImpl::analyseModel(const ModelPtr &model)
30583068
std::map<VariablePtr, AnalyserVariablePtr> v2avMappings;
30593069

30603070
stateIndex = MAX_SIZE_T;
3061-
variableIndex = MAX_SIZE_T;
3071+
constantIndex = MAX_SIZE_T;
3072+
computedConstantIndex = MAX_SIZE_T;
3073+
algebraicIndex = MAX_SIZE_T;
30623074

30633075
for (const auto &internalVariable : mInternalVariables) {
30643076
// Determine the type of the variable.
@@ -3108,7 +3120,11 @@ void Analyser::AnalyserImpl::analyseModel(const ModelPtr &model)
31083120
variable->mPimpl->populate(type,
31093121
(type == AnalyserVariable::Type::STATE) ?
31103122
++stateIndex :
3111-
++variableIndex,
3123+
(type == AnalyserVariable::Type::CONSTANT) ?
3124+
++constantIndex :
3125+
(type == AnalyserVariable::Type::COMPUTED_CONSTANT) ?
3126+
++computedConstantIndex :
3127+
++algebraicIndex,
31123128
(type == AnalyserVariable::Type::EXTERNAL) ?
31133129
nullptr :
31143130
internalVariable->mInitialisingVariable,

0 commit comments

Comments
 (0)