Skip to content

Commit 9df5d4e

Browse files
committed
Generator: specify tracked/untracked variables.
1 parent 61122e8 commit 9df5d4e

File tree

8 files changed

+72
-72
lines changed

8 files changed

+72
-72
lines changed

src/analyser.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1049,7 +1049,7 @@ void Analyser::AnalyserImpl::analyseEquationAst(const AnalyserEquationAstPtr &as
10491049
mModel->mPimpl->mVoi = AnalyserVariable::AnalyserVariableImpl::create();
10501050

10511051
mModel->mPimpl->mVoi->mPimpl->populate(AnalyserVariable::Type::VARIABLE_OF_INTEGRATION,
1052-
0, nullptr, voi, {});
1052+
0, nullptr, voi, mModel, {});
10531053
}
10541054
}
10551055
} while (voi == nullptr);
@@ -2945,8 +2945,7 @@ void Analyser::AnalyserImpl::analyseModel(const ModelPtr &model)
29452945
(variableType == AnalyserVariable::Type::EXTERNAL) ?
29462946
nullptr :
29472947
internalVariable->mInitialisingVariable,
2948-
internalVariable->mVariable,
2949-
equations);
2948+
internalVariable->mVariable, mModel, equations);
29502949

29512950
aiv2avMappings.emplace(internalVariable, variable);
29522951
v2avMappings.emplace(internalVariable->mVariable, variable);

src/analyservariable.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,14 @@ void AnalyserVariable::AnalyserVariableImpl::populate(AnalyserVariable::Type typ
3434
size_t index,
3535
const VariablePtr &initialisingVariable,
3636
const VariablePtr &variable,
37+
const AnalyserModelPtr &model,
3738
const std::vector<AnalyserEquationPtr> &equations)
3839
{
3940
mType = type;
4041
mIndex = index;
4142
mInitialisingVariable = initialisingVariable;
4243
mVariable = variable;
43-
mComponent = owningComponent(mVariable);
44+
mModel = model;
4445

4546
std::copy(equations.begin(), equations.end(), back_inserter(mEquations));
4647
}
@@ -88,6 +89,11 @@ VariablePtr AnalyserVariable::variable() const
8889
return mPimpl->mVariable;
8990
}
9091

92+
AnalyserModelPtr AnalyserVariable::model() const
93+
{
94+
return mPimpl->mModel.lock();
95+
}
96+
9197
size_t AnalyserVariable::equationCount() const
9298
{
9399
return mPimpl->mEquations.size();

src/analyservariable_p.h

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ limitations under the License.
2222

2323
namespace libcellml {
2424

25+
using AnalyserModelWeakPtr = std::weak_ptr<AnalyserModel>;
26+
2527
/**
2628
* @brief The AnalyserVariable::AnalyserVariableImpl struct.
2729
*
@@ -33,14 +35,13 @@ struct AnalyserVariable::AnalyserVariableImpl
3335
size_t mIndex = 0;
3436
VariablePtr mInitialisingVariable;
3537
VariablePtr mVariable;
36-
ComponentPtr mComponent;
38+
AnalyserModelWeakPtr mModel;
3739
std::vector<AnalyserEquationWeakPtr> mEquations;
3840

3941
static AnalyserVariablePtr create();
4042

41-
void populate(AnalyserVariable::Type type, size_t index,
42-
const VariablePtr &initialisingVariable,
43-
const VariablePtr &variable,
43+
void populate(AnalyserVariable::Type type, size_t index, const VariablePtr &initialisingVariable,
44+
const VariablePtr &variable, const AnalyserModelPtr &model,
4445
const std::vector<AnalyserEquationPtr> &equations);
4546
};
4647

src/api/libcellml/analyservariable.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,15 @@ class LIBCELLML_EXPORT AnalyserVariable
119119
*/
120120
VariablePtr variable() const;
121121

122+
/**
123+
* @brief Get the @ref AnalyserModel for this @ref AnalyserVariable.
124+
*
125+
* Return the @ref AnalyserModel for this @ref AnalyserVariable.
126+
*
127+
* @return The @ref AnalyserModel.
128+
*/
129+
AnalyserModelPtr model() const;
130+
122131
/**
123132
* @brief Get the number of equations used to compute this @ref AnalyserVariable.
124133
*

src/api/libcellml/generator.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,24 +72,22 @@ class LIBCELLML_EXPORT Generator
7272
*
7373
* Track the given @p variable. This will add the variable to the list of tracked variables.
7474
*
75-
* @param model The pointer to the @ref AnalyserModel containing the variable to track.
76-
* @param variable The pointer to the @ref Variable to track.
75+
* @param variable The pointer to the @ref AnalyserVariable to track.
7776
*
7877
* @return @c true if the variable was tracked, @c false otherwise.
7978
*/
80-
bool trackVariable(const AnalyserModelPtr &model, const VariablePtr &variable);
79+
bool trackVariable(const AnalyserVariablePtr &variable);
8180

8281
/**
8382
* @brief Untrack the given @p variable.
8483
*
8584
* Untrack the given @p variable. This will remove the variable from the list of tracked variables.
8685
*
87-
* @param model The pointer to the @ref AnalyserModel containing the variable to untrack.
88-
* @param variable The pointer to the @ref Variable to untrack.
86+
* @param variable The pointer to the @ref AnalyserVariable to untrack.
8987
*
9088
* @return @c true if the variable was untracked, @c false otherwise.
9189
*/
92-
bool untrackVariable(const AnalyserModelPtr &model, const VariablePtr &variable);
90+
bool untrackVariable(const AnalyserVariablePtr &variable);
9391

9492
/**
9593
* @brief Track all the variables in the given @p model.

src/generator.cpp

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -43,42 +43,33 @@ void Generator::GeneratorImpl::reset()
4343
mCode = {};
4444
}
4545

46-
bool Generator::GeneratorImpl::doTrackVariable(const ModelPtr &model, const VariablePtr &variable, bool tracked)
46+
bool Generator::GeneratorImpl::doTrackVariable(const AnalyserVariablePtr &variable, bool tracked)
4747
{
48-
mTrackedVariables[model][variable] = tracked;
49-
50-
return true;
51-
}
52-
53-
bool Generator::GeneratorImpl::doTrackVariable(const AnalyserModelPtr &model, const VariablePtr &variable, bool tracked)
54-
{
55-
if ((model == nullptr) || (variable == nullptr)) {
48+
if (variable == nullptr) {
5649
return false;
5750
}
5851

59-
auto owningModel = libcellml::owningModel(variable);
60-
61-
if (owningModel == nullptr) {
62-
return false;
63-
}
52+
auto model = variable->model();
6453

6554
for (const auto &untrackableVariable : variables(model, false)) {
66-
if (model->areEquivalentVariables(variable, untrackableVariable->variable())) {
67-
return doTrackVariable(owningModel, variable, tracked);
55+
if (model->areEquivalentVariables(variable->variable(), untrackableVariable->variable())) {
56+
mTrackedVariables[variable->model()][variable] = tracked;
57+
58+
return true;
6859
}
6960
}
7061

7162
return false;
7263
}
7364

74-
bool Generator::GeneratorImpl::trackVariable(const AnalyserModelPtr &model, const VariablePtr &variable)
65+
bool Generator::GeneratorImpl::trackVariable(const AnalyserVariablePtr &variable)
7566
{
76-
return doTrackVariable(model, variable, true);
67+
return doTrackVariable(variable, true);
7768
}
7869

79-
bool Generator::GeneratorImpl::untrackVariable(const AnalyserModelPtr &model, const VariablePtr &variable)
70+
bool Generator::GeneratorImpl::untrackVariable(const AnalyserVariablePtr &variable)
8071
{
81-
return doTrackVariable(model, variable, false);
72+
return doTrackVariable(variable, false);
8273
}
8374

8475
bool Generator::GeneratorImpl::doTrackAllVariables(const AnalyserModelPtr &model, bool tracked)
@@ -88,7 +79,7 @@ bool Generator::GeneratorImpl::doTrackAllVariables(const AnalyserModelPtr &model
8879
}
8980

9081
for (const auto &variable : variables(model, false)) {
91-
doTrackVariable(model->mPimpl->mModel, variable->variable(), tracked);
82+
doTrackVariable(variable, tracked);
9283
}
9384

9485
return true;
@@ -113,11 +104,11 @@ size_t Generator::GeneratorImpl::doTrackedVariableCount(const AnalyserModelPtr &
113104
size_t res = 0;
114105

115106
for (const auto &variable : variables(model, false)) {
116-
if (mTrackedVariables[model->mPimpl->mModel].find(variable->variable()) == mTrackedVariables[model->mPimpl->mModel].end()) {
117-
mTrackedVariables[model->mPimpl->mModel][variable->variable()] = true;
107+
if (mTrackedVariables[model].find(variable) == mTrackedVariables[model].end()) {
108+
mTrackedVariables[model][variable] = true;
118109
}
119110

120-
if (mTrackedVariables[model->mPimpl->mModel][variable->variable()] == tracked) {
111+
if (mTrackedVariables[model][variable] == tracked) {
121112
++res;
122113
}
123114
}
@@ -2115,14 +2106,14 @@ void Generator::setProfile(const GeneratorProfilePtr &profile)
21152106
mPimpl->mProfile = profile;
21162107
}
21172108

2118-
bool Generator::trackVariable(const AnalyserModelPtr &model, const VariablePtr &variable)
2109+
bool Generator::trackVariable(const AnalyserVariablePtr &variable)
21192110
{
2120-
return mPimpl->trackVariable(model, variable);
2111+
return mPimpl->trackVariable(variable);
21212112
}
21222113

2123-
bool Generator::untrackVariable(const AnalyserModelPtr &model, const VariablePtr &variable)
2114+
bool Generator::untrackVariable(const AnalyserVariablePtr &variable)
21242115
{
2125-
return mPimpl->untrackVariable(model, variable);
2116+
return mPimpl->untrackVariable(variable);
21262117
}
21272118

21282119
bool Generator::trackAllVariables(const AnalyserModelPtr &model)

src/generator_p.h

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,14 @@ struct Generator::GeneratorImpl
3737

3838
GeneratorProfilePtr mProfile = GeneratorProfile::create();
3939

40-
std::map<ModelPtr, std::map<VariablePtr, bool>> mTrackedVariables;
40+
std::map<AnalyserModelPtr, std::map<AnalyserVariablePtr, bool>> mTrackedVariables;
4141

4242
void reset();
4343

44-
bool doTrackVariable(const ModelPtr &model, const VariablePtr &variable, bool tracked);
45-
bool doTrackVariable(const AnalyserModelPtr &model, const VariablePtr &variable, bool tracked);
44+
bool doTrackVariable(const AnalyserVariablePtr &variable, bool tracked);
4645

47-
bool trackVariable(const AnalyserModelPtr &model, const VariablePtr &variable);
48-
bool untrackVariable(const AnalyserModelPtr &model, const VariablePtr &variable);
46+
bool trackVariable(const AnalyserVariablePtr &variable);
47+
bool untrackVariable(const AnalyserVariablePtr &variable);
4948

5049
bool doTrackAllVariables(const AnalyserModelPtr &model, bool tracked);
5150

tests/generator/generatortrackedvariables.cpp

Lines changed: 22 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ limitations under the License.
2020

2121
#include <libcellml>
2222

23-
TEST(GeneratorTrackedVariables, noModelAndOrVariable)
23+
TEST(GeneratorTrackedVariables, noModelOrVariable)
2424
{
2525
auto parser = libcellml::Parser::create();
2626
auto model = parser->parseModel(fileContents("generator/hodgkin_huxley_squid_axon_model_1952/model.cellml"));
@@ -34,17 +34,14 @@ TEST(GeneratorTrackedVariables, noModelAndOrVariable)
3434
EXPECT_EQ(size_t(0), generator->trackedVariableCount(nullptr));
3535
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(nullptr));
3636

37-
EXPECT_FALSE(generator->trackVariable(nullptr, nullptr));
38-
EXPECT_FALSE(generator->untrackVariable(nullptr, nullptr));
39-
40-
EXPECT_FALSE(generator->trackVariable(analyserModel, nullptr));
41-
EXPECT_FALSE(generator->untrackVariable(analyserModel, nullptr));
37+
EXPECT_FALSE(generator->trackVariable(nullptr));
38+
EXPECT_FALSE(generator->untrackVariable(nullptr));
4239

4340
EXPECT_FALSE(generator->trackAllVariables(nullptr));
4441
EXPECT_FALSE(generator->untrackAllVariables(nullptr));
4542
}
4643

47-
TEST(GeneratorTrackedVariables, trackUntrackAllVariables)
44+
TEST(GeneratorTrackedVariables, trackAndUntrackAllVariables)
4845
{
4946
auto parser = libcellml::Parser::create();
5047
auto model = parser->parseModel(fileContents("generator/hodgkin_huxley_squid_axon_model_1952/model.cellml"));
@@ -69,7 +66,7 @@ TEST(GeneratorTrackedVariables, trackUntrackAllVariables)
6966
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
7067
}
7168

72-
TEST(GeneratorTrackedVariables, trackUntrackVariableOfIntegration)
69+
TEST(GeneratorTrackedVariables, tracAndkUntrackVariableOfIntegration)
7370
{
7471
auto parser = libcellml::Parser::create();
7572
auto model = parser->parseModel(fileContents("generator/hodgkin_huxley_squid_axon_model_1952/model.cellml"));
@@ -85,18 +82,18 @@ TEST(GeneratorTrackedVariables, trackUntrackVariableOfIntegration)
8582
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
8683
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
8784

88-
EXPECT_FALSE(generator->untrackVariable(analyserModel, variable));
85+
EXPECT_FALSE(generator->untrackVariable(analyserModel->variable(variable)));
8986

9087
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
9188
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
9289

93-
EXPECT_FALSE(generator->trackVariable(analyserModel, variable));
90+
EXPECT_FALSE(generator->trackVariable(analyserModel->variable(variable)));
9491

9592
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
9693
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
9794
}
9895

99-
TEST(GeneratorTrackedVariables, trackUntrackStateVariable)
96+
TEST(GeneratorTrackedVariables, trackAndUntrackStateVariable)
10097
{
10198
auto parser = libcellml::Parser::create();
10299
auto model = parser->parseModel(fileContents("generator/hodgkin_huxley_squid_axon_model_1952/model.cellml"));
@@ -112,18 +109,18 @@ TEST(GeneratorTrackedVariables, trackUntrackStateVariable)
112109
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
113110
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
114111

115-
EXPECT_FALSE(generator->untrackVariable(analyserModel, variable));
112+
EXPECT_FALSE(generator->untrackVariable(analyserModel->variable(variable)));
116113

117114
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
118115
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
119116

120-
EXPECT_FALSE(generator->trackVariable(analyserModel, variable));
117+
EXPECT_FALSE(generator->trackVariable(analyserModel->variable(variable)));
121118

122119
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
123120
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
124121
}
125122

126-
TEST(GeneratorTrackedVariables, trackUntrackConstant)
123+
TEST(GeneratorTrackedVariables, trackAndUntrackConstant)
127124
{
128125
auto parser = libcellml::Parser::create();
129126
auto model = parser->parseModel(fileContents("generator/hodgkin_huxley_squid_axon_model_1952/model.cellml"));
@@ -139,18 +136,18 @@ TEST(GeneratorTrackedVariables, trackUntrackConstant)
139136
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
140137
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
141138

142-
EXPECT_TRUE(generator->untrackVariable(analyserModel, variable));
139+
EXPECT_TRUE(generator->untrackVariable(analyserModel->variable(variable)));
143140

144141
EXPECT_EQ(size_t(17), generator->trackedVariableCount(analyserModel));
145142
EXPECT_EQ(size_t(1), generator->untrackedVariableCount(analyserModel));
146143

147-
EXPECT_TRUE(generator->trackVariable(analyserModel, variable));
144+
EXPECT_TRUE(generator->trackVariable(analyserModel->variable(variable)));
148145

149146
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
150147
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
151148
}
152149

153-
TEST(GeneratorTrackedVariables, trackUntrackComputedConstant)
150+
TEST(GeneratorTrackedVariables, trackAndUntrackComputedConstant)
154151
{
155152
auto parser = libcellml::Parser::create();
156153
auto model = parser->parseModel(fileContents("generator/hodgkin_huxley_squid_axon_model_1952/model.cellml"));
@@ -166,18 +163,18 @@ TEST(GeneratorTrackedVariables, trackUntrackComputedConstant)
166163
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
167164
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
168165

169-
EXPECT_TRUE(generator->untrackVariable(analyserModel, variable));
166+
EXPECT_TRUE(generator->untrackVariable(analyserModel->variable(variable)));
170167

171168
EXPECT_EQ(size_t(17), generator->trackedVariableCount(analyserModel));
172169
EXPECT_EQ(size_t(1), generator->untrackedVariableCount(analyserModel));
173170

174-
EXPECT_TRUE(generator->trackVariable(analyserModel, variable));
171+
EXPECT_TRUE(generator->trackVariable(analyserModel->variable(variable)));
175172

176173
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
177174
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
178175
}
179176

180-
TEST(GeneratorTrackedVariables, trackUntrackAlgebraicVariable)
177+
TEST(GeneratorTrackedVariables, trackAndUntrackAlgebraicVariable)
181178
{
182179
auto parser = libcellml::Parser::create();
183180
auto model = parser->parseModel(fileContents("generator/hodgkin_huxley_squid_axon_model_1952/model.cellml"));
@@ -193,18 +190,18 @@ TEST(GeneratorTrackedVariables, trackUntrackAlgebraicVariable)
193190
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
194191
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
195192

196-
EXPECT_TRUE(generator->untrackVariable(analyserModel, variable));
193+
EXPECT_TRUE(generator->untrackVariable(analyserModel->variable(variable)));
197194

198195
EXPECT_EQ(size_t(17), generator->trackedVariableCount(analyserModel));
199196
EXPECT_EQ(size_t(1), generator->untrackedVariableCount(analyserModel));
200197

201-
EXPECT_TRUE(generator->trackVariable(analyserModel, variable));
198+
EXPECT_TRUE(generator->trackVariable(analyserModel->variable(variable)));
202199

203200
EXPECT_EQ(size_t(18), generator->trackedVariableCount(analyserModel));
204201
EXPECT_EQ(size_t(0), generator->untrackedVariableCount(analyserModel));
205202
}
206203

207-
TEST(GeneratorTrackedVariables, trackUntrackNonMatchingModelAndVariable)
204+
TEST(GeneratorTrackedVariables, trackAndUntrackVariableFromOtherModel)
208205
{
209206
auto parser = libcellml::Parser::create();
210207
auto model = parser->parseModel(fileContents("generator/hodgkin_huxley_squid_axon_model_1952/model.cellml"));
@@ -218,6 +215,6 @@ TEST(GeneratorTrackedVariables, trackUntrackNonMatchingModelAndVariable)
218215

219216
auto otherVariable = otherModel->component("membrane")->variable("Cm");
220217

221-
EXPECT_FALSE(generator->untrackVariable(analyserModel, otherVariable));
222-
EXPECT_FALSE(generator->trackVariable(analyserModel, otherVariable));
218+
EXPECT_FALSE(generator->untrackVariable(analyserModel->variable(otherVariable)));
219+
EXPECT_FALSE(generator->trackVariable(analyserModel->variable(otherVariable)));
223220
}

0 commit comments

Comments
 (0)