2023-08-23 12:51:25 +02:00
|
|
|
import MetagraphOptimization.insert_node!
|
|
|
|
import MetagraphOptimization.insert_edge!
|
|
|
|
import MetagraphOptimization.make_node
|
|
|
|
|
|
|
|
@testset "Unit Tests Node Reduction" begin
|
|
|
|
graph = MetagraphOptimization.DAG()
|
|
|
|
|
2023-10-12 17:51:03 +02:00
|
|
|
d_exit = insert_node!(graph, make_node(DataTask(10)), track = false)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
2023-10-12 17:51:03 +02:00
|
|
|
s0 = insert_node!(graph, make_node(ComputeTaskS2()), track = false)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
2023-10-12 17:51:03 +02:00
|
|
|
ED = insert_node!(graph, make_node(DataTask(3)), track = false)
|
|
|
|
FD = insert_node!(graph, make_node(DataTask(3)), track = false)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
2023-10-12 17:51:03 +02:00
|
|
|
EC = insert_node!(graph, make_node(ComputeTaskV()), track = false)
|
|
|
|
FC = insert_node!(graph, make_node(ComputeTaskV()), track = false)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
2023-10-12 17:51:03 +02:00
|
|
|
A1D = insert_node!(graph, make_node(DataTask(4)), track = false)
|
|
|
|
B1D_1 = insert_node!(graph, make_node(DataTask(4)), track = false)
|
|
|
|
B1D_2 = insert_node!(graph, make_node(DataTask(4)), track = false)
|
|
|
|
C1D = insert_node!(graph, make_node(DataTask(4)), track = false)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
2023-10-12 17:51:03 +02:00
|
|
|
A1C = insert_node!(graph, make_node(ComputeTaskU()), track = false)
|
|
|
|
B1C_1 = insert_node!(graph, make_node(ComputeTaskU()), track = false)
|
|
|
|
B1C_2 = insert_node!(graph, make_node(ComputeTaskU()), track = false)
|
|
|
|
C1C = insert_node!(graph, make_node(ComputeTaskU()), track = false)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
2023-10-12 17:51:03 +02:00
|
|
|
AD = insert_node!(graph, make_node(DataTask(5)), track = false)
|
|
|
|
BD = insert_node!(graph, make_node(DataTask(5)), track = false)
|
|
|
|
CD = insert_node!(graph, make_node(DataTask(5)), track = false)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
2023-10-12 17:51:03 +02:00
|
|
|
insert_edge!(graph, s0, d_exit, track = false)
|
|
|
|
insert_edge!(graph, ED, s0, track = false)
|
|
|
|
insert_edge!(graph, FD, s0, track = false)
|
|
|
|
insert_edge!(graph, EC, ED, track = false)
|
|
|
|
insert_edge!(graph, FC, FD, track = false)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
2023-10-12 17:51:03 +02:00
|
|
|
insert_edge!(graph, A1D, EC, track = false)
|
|
|
|
insert_edge!(graph, B1D_1, EC, track = false)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
2023-10-12 17:51:03 +02:00
|
|
|
insert_edge!(graph, B1D_2, FC, track = false)
|
|
|
|
insert_edge!(graph, C1D, FC, track = false)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
2023-10-12 17:51:03 +02:00
|
|
|
insert_edge!(graph, A1C, A1D, track = false)
|
|
|
|
insert_edge!(graph, B1C_1, B1D_1, track = false)
|
|
|
|
insert_edge!(graph, B1C_2, B1D_2, track = false)
|
|
|
|
insert_edge!(graph, C1C, C1D, track = false)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
2023-10-12 17:51:03 +02:00
|
|
|
insert_edge!(graph, AD, A1C, track = false)
|
|
|
|
insert_edge!(graph, BD, B1C_1, track = false)
|
|
|
|
insert_edge!(graph, BD, B1C_2, track = false)
|
|
|
|
insert_edge!(graph, CD, C1C, track = false)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
2023-08-24 14:44:21 +02:00
|
|
|
@test is_valid(graph)
|
|
|
|
|
2023-08-23 12:51:25 +02:00
|
|
|
@test is_exit_node(d_exit)
|
|
|
|
@test is_entry_node(AD)
|
|
|
|
@test is_entry_node(BD)
|
|
|
|
@test is_entry_node(CD)
|
|
|
|
|
|
|
|
opt = get_operations(graph)
|
|
|
|
|
|
|
|
@test length(opt) == (nodeFusions = 6, nodeReductions = 1, nodeSplits = 1)
|
|
|
|
|
2023-08-23 13:38:02 +02:00
|
|
|
#println("Initial State:\n", opt)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
|
|
|
nr = first(opt.nodeReductions)
|
|
|
|
@test Set(nr.input) == Set([B1C_1, B1C_2])
|
|
|
|
push_operation!(graph, nr)
|
|
|
|
opt = get_operations(graph)
|
|
|
|
|
|
|
|
@test length(opt) == (nodeFusions = 4, nodeReductions = 1, nodeSplits = 1)
|
2023-08-23 13:38:02 +02:00
|
|
|
#println("After 1 Node Reduction:\n", opt)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
|
|
|
nr = first(opt.nodeReductions)
|
|
|
|
@test Set(nr.input) == Set([B1D_1, B1D_2])
|
|
|
|
push_operation!(graph, nr)
|
|
|
|
opt = get_operations(graph)
|
2023-08-25 10:48:22 +02:00
|
|
|
|
2023-08-24 14:44:21 +02:00
|
|
|
@test is_valid(graph)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
|
|
|
@test length(opt) == (nodeFusions = 4, nodeReductions = 0, nodeSplits = 1)
|
2023-08-23 13:38:02 +02:00
|
|
|
#println("After 2 Node Reductions:\n", opt)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
|
|
|
pop_operation!(graph)
|
|
|
|
|
|
|
|
opt = get_operations(graph)
|
|
|
|
@test length(opt) == (nodeFusions = 4, nodeReductions = 1, nodeSplits = 1)
|
2023-08-23 13:38:02 +02:00
|
|
|
#println("After reverting the second Node Reduction:\n", opt)
|
2023-08-23 12:51:25 +02:00
|
|
|
|
|
|
|
reset_graph!(graph)
|
|
|
|
|
|
|
|
opt = get_operations(graph)
|
|
|
|
@test length(opt) == (nodeFusions = 6, nodeReductions = 1, nodeSplits = 1)
|
2023-08-23 13:38:02 +02:00
|
|
|
#println("After reverting to the initial state:\n", opt)
|
2023-08-24 14:44:21 +02:00
|
|
|
|
|
|
|
@test is_valid(graph)
|
2023-08-23 12:51:25 +02:00
|
|
|
end
|
|
|
|
println("Node Reduction Unit Tests Complete!")
|