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