Distinguish between overlap edge types

By providing different edge types for record overlap and asset overlap.
This commit is contained in:
Oliver Hamlet
2023-01-06 22:20:35 +00:00
parent 92c71cd352
commit 43ee1549d2
4 changed files with 41 additions and 17 deletions
+2 -1
View File
@@ -43,7 +43,8 @@ enum struct EdgeType : unsigned int {
userLoadAfter,
masterlistGroup,
userGroup,
overlap,
recordOverlap,
assetOverlap,
tieBreak,
};
}
+24 -3
View File
@@ -215,8 +215,10 @@ std::string describeEdgeType(EdgeType edgeType) {
return "Masterlist Group";
case EdgeType::userGroup:
return "User Group";
case EdgeType::overlap:
return "Overlap";
case EdgeType::recordOverlap:
return "Record Overlap";
case EdgeType::assetOverlap:
return "Asset Overlap";
case EdgeType::tieBreak:
return "Tie Break";
default:
@@ -549,6 +551,16 @@ std::optional<std::vector<vertex_t>> PluginGraph::FindPath(
return visitor.GetPath();
}
std::optional<EdgeType> PluginGraph::GetEdgeType(const vertex_t& fromVertex,
const vertex_t& toVertex) {
const auto edge = boost::edge(fromVertex, toVertex, graph_);
if (!edge.second) {
return std::nullopt;
}
return graph_[edge.first];
}
void PluginGraph::AddEdge(const vertex_t& fromVertex,
const vertex_t& toVertex,
EdgeType edgeType) {
@@ -856,6 +868,7 @@ void PluginGraph::AddOverlapEdges() {
// record counts are equal.
auto thisPluginLoadsFirst = false;
EdgeType edgeType = EdgeType::recordOverlap;
const auto otherPluginRecordCount = otherPlugin.GetOverrideRecordCount();
@@ -872,6 +885,7 @@ void PluginGraph::AddOverlapEdges() {
continue;
} else {
thisPluginLoadsFirst = pluginAssetCount > otherPluginAssetCount;
edgeType = EdgeType::assetOverlap;
}
} else {
// Records overlap and override different numbers of records.
@@ -883,7 +897,14 @@ void PluginGraph::AddOverlapEdges() {
const auto toVertex = thisPluginLoadsFirst ? otherVertex : vertex;
if (!PathExists(toVertex, fromVertex)) {
AddEdge(fromVertex, toVertex, EdgeType::overlap);
AddEdge(fromVertex, toVertex, edgeType);
} else if (logger) {
logger->debug(
"Skipping {} edge from \"{}\" to \"{}\" as it would "
"create a cycle.",
describeEdgeType(edgeType),
GetPlugin(fromVertex).GetName(),
GetPlugin(toVertex).GetName());
}
}
}
+2
View File
@@ -84,6 +84,8 @@ public:
std::optional<std::vector<vertex_t>> FindPath(const vertex_t& fromVertex,
const vertex_t& toVertex);
std::optional<EdgeType> GetEdgeType(const vertex_t& fromVertex,
const vertex_t& toVertex);
void AddEdge(const vertex_t& fromVertex,
const vertex_t& toVertex,
@@ -207,7 +207,7 @@ TEST_F(
graph.AddOverlapEdges();
EXPECT_TRUE(graph.EdgeExists(v1, v2));
EXPECT_EQ(EdgeType::recordOverlap, graph.GetEdgeType(v1, v2).value());
EXPECT_FALSE(graph.EdgeExists(v2, v1));
}
@@ -301,7 +301,7 @@ TEST_F(
graph.AddOverlapEdges();
EXPECT_TRUE(graph.EdgeExists(v1, v2));
EXPECT_EQ(EdgeType::assetOverlap, graph.GetEdgeType(v1, v2).value());
EXPECT_FALSE(graph.EdgeExists(v2, v1));
}
@@ -326,7 +326,7 @@ TEST_F(
graph.AddOverlapEdges();
EXPECT_TRUE(graph.EdgeExists(v1, v2));
EXPECT_EQ(EdgeType::assetOverlap, graph.GetEdgeType(v1, v2).value());
EXPECT_FALSE(graph.EdgeExists(v2, v1));
}
@@ -352,7 +352,7 @@ TEST_F(
graph.AddOverlapEdges();
EXPECT_TRUE(graph.EdgeExists(v1, v2));
EXPECT_EQ(EdgeType::assetOverlap, graph.GetEdgeType(v1, v2).value());
EXPECT_FALSE(graph.EdgeExists(v2, v1));
}
@@ -378,7 +378,7 @@ TEST_F(PluginGraphTest,
graph.AddOverlapEdges();
EXPECT_TRUE(graph.EdgeExists(v1, v2));
EXPECT_EQ(EdgeType::recordOverlap, graph.GetEdgeType(v1, v2).value());
EXPECT_FALSE(graph.EdgeExists(v2, v1));
}
@@ -436,16 +436,16 @@ TEST_F(
vertex_t seven = graph.GetVertexByName("7.esp").value();
vertex_t eight = graph.GetVertexByName("8.esp").value();
graph.AddEdge(six, seven, EdgeType::overlap);
graph.AddEdge(seven, eight, EdgeType::overlap);
graph.AddEdge(eight, five, EdgeType::overlap);
graph.AddEdge(six, seven, EdgeType::recordOverlap);
graph.AddEdge(seven, eight, EdgeType::recordOverlap);
graph.AddEdge(eight, five, EdgeType::recordOverlap);
// Also add a path going from 6 to 3 and another from 8 to 4.
vertex_t three = graph.GetVertexByName("3.esp").value();
vertex_t four = graph.GetVertexByName("4.esp").value();
graph.AddEdge(six, three, EdgeType::overlap);
graph.AddEdge(eight, four, EdgeType::overlap);
graph.AddEdge(six, three, EdgeType::recordOverlap);
graph.AddEdge(eight, four, EdgeType::recordOverlap);
graph.AddTieBreakEdges();
const auto sorted = graph.TopologicalSort();
@@ -482,9 +482,9 @@ TEST_F(
vertex_t two = graph.GetVertexByName("2.esp").value();
vertex_t three = graph.GetVertexByName("3.esp").value();
graph.AddEdge(one, two, EdgeType::overlap);
graph.AddEdge(two, three, EdgeType::overlap);
graph.AddEdge(three, zero, EdgeType::overlap);
graph.AddEdge(one, two, EdgeType::recordOverlap);
graph.AddEdge(two, three, EdgeType::recordOverlap);
graph.AddEdge(three, zero, EdgeType::recordOverlap);
graph.AddTieBreakEdges();
const auto sorted = graph.TopologicalSort();