Skip to content

Commit ebf177a

Browse files
author
Tristan Youngs
committed
Flag updates / vector invalidation on edge removal.
1 parent 999f20f commit ebf177a

2 files changed

Lines changed: 40 additions & 0 deletions

File tree

src/nodes/graph.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,16 @@ bool Graph::removeEdge(Edge *edgeToRemove)
192192
std::find_if(edges_.begin(), edges_.end(), [edgeToRemove](const auto &edge) { return edge.get() == edgeToRemove; });
193193
if (it == edges_.end())
194194
return Messenger::error("Edge pointer doesn't exist, so can't remove it.\n");
195+
196+
// Need to flag the node containing the connected input that it is now out-of-date
197+
auto &input = it->get()->targetInput();
198+
input.setParentUpdateRequired();
199+
if (input.isVector())
200+
input.invalidateVector();
201+
202+
// Can now erase it
195203
edges_.erase(it);
204+
196205
return true;
197206
}
198207

tests/nodes/parameters.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,37 @@ TEST(ParametersTest, VectorInputOutput)
155155
EXPECT_EQ(numbersA->get<std::vector<Number>>(), (std::vector<Number>{{1.0}, {6.0}, {2.0}}));
156156
EXPECT_EQ(numbersB->get<std::vector<Number>>().size(), 3);
157157
EXPECT_EQ(numbersA->get<std::vector<Number>>(), numbersB->get<std::vector<Number>>());
158+
159+
// Remove a single edge - this should flag TestA and TestB as being out of date
160+
EXPECT_TRUE(root_.removeEdge({"Number1", "A", "TestA", "NumberVector"}));
161+
EXPECT_TRUE(a->inputsAreValid());
162+
EXPECT_TRUE(b->inputsAreValid());
163+
EXPECT_FALSE(a->isUpToDate());
164+
EXPECT_FALSE(b->isUpToDate());
165+
166+
// Run again and check the result
167+
EXPECT_EQ(b->run(), NodeConstants::ProcessResult::Success);
168+
EXPECT_EQ(b->versionIndex(), 2);
169+
EXPECT_EQ(numbersA->get<std::vector<Number>>().size(), 2);
170+
EXPECT_EQ(numbersA->get<std::vector<Number>>(), (std::vector<Number>{{6.0}, {2.0}}));
171+
EXPECT_EQ(numbersB->get<std::vector<Number>>().size(), 2);
172+
EXPECT_EQ(numbersA->get<std::vector<Number>>(), numbersB->get<std::vector<Number>>());
173+
174+
// Remove both of the other edges
175+
EXPECT_TRUE(root_.removeEdge({"Number3", "A", "TestA", "NumberVector"}));
176+
EXPECT_TRUE(root_.removeEdge({"Number2", "A", "TestA", "NumberVector"}));
177+
EXPECT_TRUE(a->inputsAreValid());
178+
EXPECT_TRUE(b->inputsAreValid());
179+
EXPECT_FALSE(a->isUpToDate());
180+
EXPECT_FALSE(b->isUpToDate());
181+
182+
// Run again and check the result
183+
EXPECT_EQ(b->run(), NodeConstants::ProcessResult::Success);
184+
EXPECT_EQ(b->versionIndex(), 3);
185+
EXPECT_EQ(numbersA->get<std::vector<Number>>().size(), 0);
186+
EXPECT_EQ(numbersA->get<std::vector<Number>>(), std::vector<Number>());
187+
EXPECT_EQ(numbersB->get<std::vector<Number>>().size(), 0);
188+
EXPECT_EQ(numbersA->get<std::vector<Number>>(), numbersB->get<std::vector<Number>>());
158189
}
159190

160191
} // namespace UnitTest

0 commit comments

Comments
 (0)