|
|
|
@@ -24,20 +24,26 @@ end
|
|
|
|
|
function parse_abc(filename::String, verbose::Bool = false)
|
|
|
|
|
file = open(filename, "r")
|
|
|
|
|
|
|
|
|
|
if (verbose) println("Opened file") end
|
|
|
|
|
if (verbose)
|
|
|
|
|
println("Opened file")
|
|
|
|
|
end
|
|
|
|
|
nodes_string = readline(file)
|
|
|
|
|
nodes = parse_nodes(nodes_string)
|
|
|
|
|
|
|
|
|
|
close(file)
|
|
|
|
|
if (verbose) println("Read file") end
|
|
|
|
|
if (verbose)
|
|
|
|
|
println("Read file")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
graph = DAG()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# estimate total number of nodes
|
|
|
|
|
# try to slightly overestimate so no resizing is necessary
|
|
|
|
|
# data nodes are not included in length(nodes) and there are a few more than compute nodes
|
|
|
|
|
estimate_no_nodes = round(Int, length(nodes) * 4)
|
|
|
|
|
if (verbose) println("Estimating ", estimate_no_nodes, " Nodes") end
|
|
|
|
|
if (verbose)
|
|
|
|
|
println("Estimating ", estimate_no_nodes, " Nodes")
|
|
|
|
|
end
|
|
|
|
|
sizehint!(graph.nodes, estimate_no_nodes)
|
|
|
|
|
|
|
|
|
|
sum_node = insert_node!(graph, make_node(ComputeTaskSum()), false, false)
|
|
|
|
@@ -47,43 +53,58 @@ function parse_abc(filename::String, verbose::Bool = false)
|
|
|
|
|
# remember the data out nodes for connection
|
|
|
|
|
dataOutNodes = Dict()
|
|
|
|
|
|
|
|
|
|
if (verbose) println("Building graph") end
|
|
|
|
|
if (verbose)
|
|
|
|
|
println("Building graph")
|
|
|
|
|
end
|
|
|
|
|
noNodes = 0
|
|
|
|
|
nodesToRead = length(nodes)
|
|
|
|
|
while !isempty(nodes)
|
|
|
|
|
node = popfirst!(nodes)
|
|
|
|
|
noNodes += 1
|
|
|
|
|
if (noNodes % 100 == 0)
|
|
|
|
|
if (verbose) @printf "\rReading Nodes... %.2f%%" (100. * noNodes / nodesToRead) end
|
|
|
|
|
if (verbose)
|
|
|
|
|
@printf "\rReading Nodes... %.2f%%" (
|
|
|
|
|
100.0 * noNodes / nodesToRead
|
|
|
|
|
)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if occursin(regex_a, node)
|
|
|
|
|
# add nodes and edges for the state reading to u(P(Particle))
|
|
|
|
|
data_in = insert_node!(graph, make_node(DataTask(4)), false, false) # read particle data node
|
|
|
|
|
compute_P = insert_node!(graph, make_node(ComputeTaskP()), false, false) # compute P node
|
|
|
|
|
compute_P =
|
|
|
|
|
insert_node!(graph, make_node(ComputeTaskP()), false, false) # compute P node
|
|
|
|
|
data_Pu = insert_node!(graph, make_node(DataTask(6)), false, false) # transfer data from P to u
|
|
|
|
|
compute_u = insert_node!(graph, make_node(ComputeTaskU()), false, false) # compute U node
|
|
|
|
|
compute_u =
|
|
|
|
|
insert_node!(graph, make_node(ComputeTaskU()), false, false) # compute U node
|
|
|
|
|
data_out = insert_node!(graph, make_node(DataTask(3)), false, false) # transfer data out from u
|
|
|
|
|
|
|
|
|
|
insert_edge!(graph, data_in, compute_P, false, false)
|
|
|
|
|
insert_edge!(graph, compute_P, data_Pu, false, false)
|
|
|
|
|
insert_edge!(graph, data_Pu, compute_u, false, false)
|
|
|
|
|
insert_edge!(graph, compute_u, data_out, false, false)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# remember the data_out node for future edges
|
|
|
|
|
dataOutNodes[node] = data_out
|
|
|
|
|
elseif occursin(regex_c, node)
|
|
|
|
|
capt = match(regex_c, node)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
in1 = capt.captures[1]
|
|
|
|
|
in2 = capt.captures[2]
|
|
|
|
|
|
|
|
|
|
compute_v = insert_node!(graph, make_node(ComputeTaskV()), false, false)
|
|
|
|
|
compute_v =
|
|
|
|
|
insert_node!(graph, make_node(ComputeTaskV()), false, false)
|
|
|
|
|
data_out = insert_node!(graph, make_node(DataTask(5)), false, false)
|
|
|
|
|
|
|
|
|
|
if (occursin(regex_c, in1))
|
|
|
|
|
# put an S node after this input
|
|
|
|
|
compute_S = insert_node!(graph, make_node(ComputeTaskS1()), false, false)
|
|
|
|
|
data_S_v = insert_node!(graph, make_node(DataTask(5)), false, false)
|
|
|
|
|
compute_S = insert_node!(
|
|
|
|
|
graph,
|
|
|
|
|
make_node(ComputeTaskS1()),
|
|
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
)
|
|
|
|
|
data_S_v =
|
|
|
|
|
insert_node!(graph, make_node(DataTask(5)), false, false)
|
|
|
|
|
|
|
|
|
|
insert_edge!(graph, dataOutNodes[in1], compute_S, false, false)
|
|
|
|
|
insert_edge!(graph, compute_S, data_S_v, false, false)
|
|
|
|
@@ -96,8 +117,14 @@ function parse_abc(filename::String, verbose::Bool = false)
|
|
|
|
|
if (occursin(regex_c, in2))
|
|
|
|
|
# i think the current generator only puts the combined particles in the first space, so this case might never be entered
|
|
|
|
|
# put an S node after this input
|
|
|
|
|
compute_S = insert_node!(graph, make_node(ComputeTaskS1()), false, false)
|
|
|
|
|
data_S_v = insert_node!(graph, make_node(DataTask(5)), false, false)
|
|
|
|
|
compute_S = insert_node!(
|
|
|
|
|
graph,
|
|
|
|
|
make_node(ComputeTaskS1()),
|
|
|
|
|
false,
|
|
|
|
|
false,
|
|
|
|
|
)
|
|
|
|
|
data_S_v =
|
|
|
|
|
insert_node!(graph, make_node(DataTask(5)), false, false)
|
|
|
|
|
|
|
|
|
|
insert_edge!(graph, dataOutNodes[in2], compute_S, false, false)
|
|
|
|
|
insert_edge!(graph, compute_S, data_S_v, false, false)
|
|
|
|
@@ -106,7 +133,7 @@ function parse_abc(filename::String, verbose::Bool = false)
|
|
|
|
|
else
|
|
|
|
|
insert_edge!(graph, dataOutNodes[in2], compute_v, false, false)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
insert_edge!(graph, compute_v, data_out, false, false)
|
|
|
|
|
dataOutNodes[node] = data_out
|
|
|
|
|
|
|
|
|
@@ -118,7 +145,8 @@ function parse_abc(filename::String, verbose::Bool = false)
|
|
|
|
|
in3 = capt.captures[3]
|
|
|
|
|
|
|
|
|
|
# in2 + in3 with a v
|
|
|
|
|
compute_v = insert_node!(graph, make_node(ComputeTaskV()), false, false)
|
|
|
|
|
compute_v =
|
|
|
|
|
insert_node!(graph, make_node(ComputeTaskV()), false, false)
|
|
|
|
|
data_v = insert_node!(graph, make_node(DataTask(5)), false, false)
|
|
|
|
|
|
|
|
|
|
insert_edge!(graph, dataOutNodes[in2], compute_v, false, false)
|
|
|
|
@@ -126,8 +154,10 @@ function parse_abc(filename::String, verbose::Bool = false)
|
|
|
|
|
insert_edge!(graph, compute_v, data_v, false, false)
|
|
|
|
|
|
|
|
|
|
# combine with the v of the combined other input
|
|
|
|
|
compute_S2 = insert_node!(graph, make_node(ComputeTaskS2()), false, false)
|
|
|
|
|
data_out = insert_node!(graph, make_node(DataTask(10)), false, false)
|
|
|
|
|
compute_S2 =
|
|
|
|
|
insert_node!(graph, make_node(ComputeTaskS2()), false, false)
|
|
|
|
|
data_out =
|
|
|
|
|
insert_node!(graph, make_node(DataTask(10)), false, false)
|
|
|
|
|
|
|
|
|
|
insert_edge!(graph, data_v, compute_S2, false, false)
|
|
|
|
|
insert_edge!(graph, dataOutNodes[in1], compute_S2, false, false)
|
|
|
|
@@ -136,11 +166,13 @@ function parse_abc(filename::String, verbose::Bool = false)
|
|
|
|
|
insert_edge!(graph, data_out, sum_node, false, false)
|
|
|
|
|
elseif occursin(regex_plus, node)
|
|
|
|
|
if (verbose)
|
|
|
|
|
println("\rReading Nodes Complete ")
|
|
|
|
|
println("\rReading Nodes Complete ")
|
|
|
|
|
println("Added ", length(graph.nodes), " nodes")
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
@assert false ("Unknown node '$node' while reading from file $filename")
|
|
|
|
|
@assert false (
|
|
|
|
|
"Unknown node '$node' while reading from file $filename"
|
|
|
|
|
)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|