Skip to content

Commit 2867e43

Browse files
committed
Generator: specify tracked/untracked variables.
1 parent a8fc3dc commit 2867e43

File tree

4 files changed

+95
-6
lines changed

4 files changed

+95
-6
lines changed

src/api/libcellml/generator.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,28 @@ class LIBCELLML_EXPORT Generator
6767
*/
6868
void setProfile(const GeneratorProfilePtr &profile);
6969

70+
/**
71+
* @brief Test if the given @p variable is tracked.
72+
*
73+
* Test if the given @p variable is tracked.
74+
*
75+
* @param variable The pointer to the @ref AnalyserVariable to test.
76+
*
77+
* @return @c true if the variable is tracked, @c false otherwise.
78+
*/
79+
bool isTrackedVariable(const AnalyserVariablePtr &variable);
80+
81+
/**
82+
* @brief Test if the given @p variable is untracked.
83+
*
84+
* Test if the given @p variable is untracked.
85+
*
86+
* @param variable The pointer to the @ref AnalyserVariable to test.
87+
*
88+
* @return @c true if the variable is untracked, @c false otherwise.
89+
*/
90+
bool isUntrackedVariable(const AnalyserVariablePtr &variable);
91+
7092
/**
7193
* @brief Track the given @p variable.
7294
*

src/generator.cpp

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,37 @@ void Generator::GeneratorImpl::reset()
4343
mCode = {};
4444
}
4545

46+
bool Generator::GeneratorImpl::doIsTrackedVariable(const AnalyserVariablePtr &variable, bool tracked)
47+
{
48+
if (variable == nullptr) {
49+
return false;
50+
}
51+
52+
auto model = variable->model();
53+
54+
for (const auto &modelVariable : variables(model, false)) {
55+
if (model->areEquivalentVariables(modelVariable->variable(), variable->variable())) {
56+
if (mTrackedVariables[model].find(modelVariable) == mTrackedVariables[model].end()) {
57+
mTrackedVariables[model][modelVariable] = true;
58+
}
59+
60+
return mTrackedVariables[model][modelVariable] == tracked;
61+
}
62+
}
63+
64+
return false;
65+
}
66+
67+
bool Generator::GeneratorImpl::isTrackedVariable(const AnalyserVariablePtr &variable)
68+
{
69+
return doIsTrackedVariable(variable, true);
70+
}
71+
72+
bool Generator::GeneratorImpl::isUntrackedVariable(const AnalyserVariablePtr &variable)
73+
{
74+
return doIsTrackedVariable(variable, false);
75+
}
76+
4677
bool Generator::GeneratorImpl::doTrackVariable(const AnalyserVariablePtr &variable, bool tracked)
4778
{
4879
if (variable == nullptr) {
@@ -51,9 +82,9 @@ bool Generator::GeneratorImpl::doTrackVariable(const AnalyserVariablePtr &variab
5182

5283
auto model = variable->model();
5384

54-
for (const auto &untrackableVariable : variables(model, false)) {
55-
if (model->areEquivalentVariables(variable->variable(), untrackableVariable->variable())) {
56-
mTrackedVariables[variable->model()][variable] = tracked;
85+
for (const auto &modelVariable : variables(model, false)) {
86+
if (model->areEquivalentVariables(modelVariable->variable(), variable->variable())) {
87+
mTrackedVariables[modelVariable->model()][modelVariable] = tracked;
5788

5889
return true;
5990
}
@@ -2261,6 +2292,16 @@ void Generator::setProfile(const GeneratorProfilePtr &profile)
22612292
mPimpl->mProfile = profile;
22622293
}
22632294

2295+
bool Generator::isTrackedVariable(const AnalyserVariablePtr &variable)
2296+
{
2297+
return mPimpl->isTrackedVariable(variable);
2298+
}
2299+
2300+
bool Generator::isUntrackedVariable(const AnalyserVariablePtr &variable)
2301+
{
2302+
return mPimpl->isUntrackedVariable(variable);
2303+
}
2304+
22642305
bool Generator::trackVariable(const AnalyserVariablePtr &variable)
22652306
{
22662307
return mPimpl->trackVariable(variable);

src/generator_p.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ struct Generator::GeneratorImpl
4141

4242
void reset();
4343

44+
bool doIsTrackedVariable(const AnalyserVariablePtr &variable, bool tracked);
45+
46+
bool isTrackedVariable(const AnalyserVariablePtr &variable);
47+
bool isUntrackedVariable(const AnalyserVariablePtr &variable);
48+
4449
bool doTrackVariable(const AnalyserVariablePtr &variable, bool tracked);
4550

4651
bool trackVariable(const AnalyserVariablePtr &variable);

tests/generator/generatortrackedvariables.cpp

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,17 @@ TEST(GeneratorTrackedVariables, noModelOrVariable)
3131
auto analyserModel = analyser->model();
3232
auto generator = libcellml::Generator::create();
3333

34-
EXPECT_EQ(size_t(0), generator->trackedVariableCount(nullptr));
35-
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(nullptr));
34+
EXPECT_FALSE(generator->isTrackedVariable(nullptr));
35+
EXPECT_FALSE(generator->isUntrackedVariable(nullptr));
3636

3737
EXPECT_FALSE(generator->trackVariable(nullptr));
3838
EXPECT_FALSE(generator->untrackVariable(nullptr));
3939

4040
EXPECT_FALSE(generator->trackAllVariables(nullptr));
4141
EXPECT_FALSE(generator->untrackAllVariables(nullptr));
42+
43+
EXPECT_EQ(size_t(0), generator->trackedVariableCount(nullptr));
44+
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(nullptr));
4245
}
4346

4447
TEST(GeneratorTrackedVariables, tracAndkUntrackVariableOfIntegration)
@@ -54,10 +57,13 @@ TEST(GeneratorTrackedVariables, tracAndkUntrackVariableOfIntegration)
5457

5558
auto variable = model->component("environment")->variable("time");
5659

60+
EXPECT_FALSE(generator->isTrackedVariable(analyserModel->variable(variable)));
61+
5762
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
5863
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
5964

6065
EXPECT_FALSE(generator->untrackVariable(analyserModel->variable(variable)));
66+
EXPECT_FALSE(generator->isTrackedVariable(analyserModel->variable(variable)));
6167

6268
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
6369
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
@@ -81,10 +87,13 @@ TEST(GeneratorTrackedVariables, trackAndUntrackStateVariable)
8187

8288
auto variable = model->component("membrane")->variable("V");
8389

90+
EXPECT_FALSE(generator->isTrackedVariable(analyserModel->variable(variable)));
91+
8492
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
8593
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
8694

8795
EXPECT_FALSE(generator->untrackVariable(analyserModel->variable(variable)));
96+
EXPECT_FALSE(generator->isTrackedVariable(analyserModel->variable(variable)));
8897

8998
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
9099
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
@@ -108,10 +117,13 @@ TEST(GeneratorTrackedVariables, trackAndUntrackConstant)
108117

109118
auto variable = model->component("membrane")->variable("Cm");
110119

120+
EXPECT_TRUE(generator->isTrackedVariable(analyserModel->variable(variable)));
121+
111122
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
112123
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
113124

114125
EXPECT_TRUE(generator->untrackVariable(analyserModel->variable(variable)));
126+
EXPECT_FALSE(generator->isTrackedVariable(analyserModel->variable(variable)));
115127

116128
EXPECT_EQ(size_t(17), generator->trackedVariableCount(analyserModel));
117129
EXPECT_EQ(size_t(1), generator->untrackedVariableCount(analyserModel));
@@ -135,10 +147,13 @@ TEST(GeneratorTrackedVariables, trackAndUntrackComputedConstant)
135147

136148
auto variable = model->component("leakage_current")->variable("E_L");
137149

150+
EXPECT_TRUE(generator->isTrackedVariable(analyserModel->variable(variable)));
151+
138152
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
139153
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
140154

141155
EXPECT_TRUE(generator->untrackVariable(analyserModel->variable(variable)));
156+
EXPECT_FALSE(generator->isTrackedVariable(analyserModel->variable(variable)));
142157

143158
EXPECT_EQ(size_t(17), generator->trackedVariableCount(analyserModel));
144159
EXPECT_EQ(size_t(1), generator->untrackedVariableCount(analyserModel));
@@ -162,10 +177,13 @@ TEST(GeneratorTrackedVariables, trackAndUntrackAlgebraicVariable)
162177

163178
auto variable = model->component("membrane")->variable("i_Stim");
164179

180+
EXPECT_TRUE(generator->isTrackedVariable(analyserModel->variable(variable)));
181+
165182
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
166183
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
167184

168185
EXPECT_TRUE(generator->untrackVariable(analyserModel->variable(variable)));
186+
EXPECT_FALSE(generator->isTrackedVariable(analyserModel->variable(variable)));
169187

170188
EXPECT_EQ(size_t(17), generator->trackedVariableCount(analyserModel));
171189
EXPECT_EQ(size_t(1), generator->untrackedVariableCount(analyserModel));
@@ -191,10 +209,13 @@ TEST(GeneratorTrackedVariables, trackAndUntrackExternalVariable)
191209

192210
auto variable = model->component("membrane")->variable("V");
193211

212+
EXPECT_TRUE(generator->isTrackedVariable(analyserModel->variable(variable)));
213+
194214
EXPECT_EQ(size_t(19), generator->trackedVariableCount(analyserModel));
195215
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
196216

197217
EXPECT_TRUE(generator->untrackVariable(analyserModel->variable(variable)));
218+
EXPECT_FALSE(generator->isTrackedVariable(analyserModel->variable(variable)));
198219

199220
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
200221
EXPECT_EQ(size_t(1), generator->untrackedVariableCount(analyserModel));
@@ -219,8 +240,8 @@ TEST(GeneratorTrackedVariables, trackAndUntrackVariableFromOtherModel)
219240

220241
auto otherVariable = otherModel->component("membrane")->variable("Cm");
221242

222-
EXPECT_FALSE(generator->untrackVariable(analyserModel->variable(otherVariable)));
223243
EXPECT_FALSE(generator->trackVariable(analyserModel->variable(otherVariable)));
244+
EXPECT_FALSE(generator->untrackVariable(analyserModel->variable(otherVariable)));
224245
}
225246

226247
TEST(GeneratorTrackedVariables, trackAndUntrackAllConstants)

0 commit comments

Comments
 (0)