102 lines
2.5 KiB
Julia
102 lines
2.5 KiB
Julia
using MetagraphOptimization
|
|
using Random
|
|
using Test
|
|
|
|
Random.seed!(0)
|
|
|
|
function test_known_graphs()
|
|
g_ABAB = import_txt(joinpath(@__DIR__, "..", "examples", "AB->AB.txt"))
|
|
props = graph_properties(g_ABAB)
|
|
|
|
@test length(g_ABAB.nodes) == 34
|
|
@test props.compute_effort == 185
|
|
@test props.data == 0x68
|
|
|
|
@test length(get_operations(g_ABAB).nodeFusions) == 10
|
|
|
|
test_node_fusion(g_ABAB)
|
|
test_random_walk(g_ABAB, 100)
|
|
|
|
|
|
g_ABAB3 = import_txt(joinpath(@__DIR__, "..", "examples", "AB->ABBB.txt"))
|
|
props = graph_properties(g_ABAB3)
|
|
|
|
@test length(g_ABAB3.nodes) == 280
|
|
@test props.compute_effort == 2007
|
|
@test props.data == 0x498
|
|
|
|
test_node_fusion(g_ABAB3)
|
|
test_random_walk(g_ABAB3, 1000)
|
|
end
|
|
|
|
function test_node_fusion(g::DAG)
|
|
props = graph_properties(g)
|
|
|
|
options = get_operations(g)
|
|
|
|
nodes_number = length(g.nodes)
|
|
data = props.data
|
|
compute_effort = props.compute_effort
|
|
|
|
while !isempty(options.nodeFusions)
|
|
fusion = pop!(options.nodeFusions)
|
|
|
|
@test typeof(fusion) <: NodeFusion
|
|
|
|
push_operation!(g, fusion)
|
|
|
|
props = graph_properties(g)
|
|
@test props.data < data
|
|
@test props.compute_effort == compute_effort
|
|
|
|
nodes_number = length(g.nodes)
|
|
data = props.data
|
|
compute_effort = props.compute_effort
|
|
|
|
options = get_operations(g)
|
|
end
|
|
end
|
|
|
|
function test_random_walk(g::DAG, n::Int64)
|
|
# the purpose here is to do "random" operations and reverse them again and validate that the graph stays the same and doesn't diverge
|
|
reset_graph!(g)
|
|
|
|
properties = graph_properties(g)
|
|
|
|
println("Random Walking... ")
|
|
|
|
for i = 1:n
|
|
print("\r", i)
|
|
# choose push or pop
|
|
if rand(Bool)
|
|
# push
|
|
opt = get_operations(g)
|
|
|
|
# choose one of fuse/split/reduce
|
|
option = rand(1:3)
|
|
if option == 1 && !isempty(opt.nodeFusions)
|
|
push_operation!(g, rand(collect(opt.nodeFusions)))
|
|
elseif option == 2 && !isempty(opt.nodeReductions)
|
|
push_operation!(g, rand(collect(opt.nodeReductions)))
|
|
elseif option == 3 && !isempty(opt.nodeSplits)
|
|
push_operation!(g, rand(collect(opt.nodeSplits)))
|
|
else
|
|
i = i-1
|
|
end
|
|
else
|
|
# pop
|
|
if (can_pop(g))
|
|
pop_operation!(g)
|
|
else
|
|
i = i-1
|
|
end
|
|
end
|
|
end
|
|
|
|
println("\rDone.")
|
|
|
|
reset_graph!(g)
|
|
|
|
@test properties == graph_properties(g)
|
|
end
|