#include "../lib/Conversion/PDLToPDLInterp/RootOrdering.h"
#include "mlir/Dialect/Arith/IR/Arith.h"
#include "mlir/IR/Builders.h"
#include "mlir/IR/MLIRContext.h"
#include "gtest/gtest.h"
using namespace mlir;
using namespace mlir::arith;
using namespace mlir::pdl_to_pdl_interp;
namespace {
class RootOrderingTest : public ::testing::Test {
protected:
RootOrderingTest() {
context.loadDialect<ArithDialect>();
createValues();
}
void createValues() {
OpBuilder builder(&context);
builder.setInsertionPointToStart(&block);
for (int i = 0; i < 4; ++i)
v[i] = builder.create<ConstantIntOp>(builder.getUnknownLoc(), i, 32);
}
void check(unsigned cost, const OptimalBranching::EdgeList &edges) {
OptimalBranching opt(graph, v[0]);
EXPECT_EQ(opt.solve(), cost);
EXPECT_EQ(opt.preOrderTraversal({v, v + edges.size()}), edges);
for (std::pair<Value, Value> edge : edges)
EXPECT_EQ(opt.getRootOrderingParents().lookup(edge.first), edge.second);
}
protected:
MLIRContext context;
Block block;
Value v[4];
RootOrderingGraph graph;
};
TEST_F(RootOrderingTest, simpleA) {
graph[v[1]][v[0]].cost = {1, 10};
graph[v[2]][v[0]].cost = {1, 11};
graph[v[1]][v[2]].cost = {2, 12};
graph[v[2]][v[1]].cost = {2, 13};
check(2, {{v[0], {}}, {v[1], v[0]}, {v[2], v[0]}});
}
TEST_F(RootOrderingTest, simpleB) {
graph[v[1]][v[0]].cost = {1, 10};
graph[v[2]][v[0]].cost = {2, 11};
graph[v[1]][v[2]].cost = {1, 12};
graph[v[2]][v[1]].cost = {1, 13};
check(2, {{v[0], {}}, {v[1], v[0]}, {v[2], v[1]}});
}
TEST_F(RootOrderingTest, simpleC) {
graph[v[1]][v[0]].cost = {2, 10};
graph[v[2]][v[0]].cost = {2, 11};
graph[v[1]][v[2]].cost = {1, 12};
graph[v[2]][v[1]].cost = {1, 13};
check(3, {{v[0], {}}, {v[1], v[0]}, {v[2], v[1]}});
}
TEST_F(RootOrderingTest, contraction) {
graph[v[1]][v[0]].cost = {10, 0};
graph[v[2]][v[0]].cost = {5, 0};
graph[v[2]][v[1]].cost = {1, 0};
graph[v[3]][v[2]].cost = {2, 0};
graph[v[1]][v[3]].cost = {3, 0};
check(10, {{v[0], {}}, {v[2], v[0]}, {v[3], v[2]}, {v[1], v[3]}});
}
}