2023-08-28 13:32:22 +02:00
|
|
|
|
2023-10-12 17:51:03 +02:00
|
|
|
DataTaskNode(t::AbstractDataTask, name = "") =
|
|
|
|
DataTaskNode(t, Vector{Node}(), Vector{Node}(), UUIDs.uuid1(rng[threadid()]), missing, missing, missing, name)
|
2023-08-28 13:32:22 +02:00
|
|
|
ComputeTaskNode(t::AbstractComputeTask) = ComputeTaskNode(
|
2023-10-12 17:51:03 +02:00
|
|
|
t, # task
|
|
|
|
Vector{Node}(), # parents
|
|
|
|
Vector{Node}(), # children
|
|
|
|
UUIDs.uuid1(rng[threadid()]), # id
|
|
|
|
missing, # node reduction
|
|
|
|
missing, # node split
|
|
|
|
Vector{NodeFusion}(), # node fusions
|
|
|
|
missing, # device
|
2023-08-28 13:32:22 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
copy(m::Missing) = missing
|
2023-11-21 01:48:59 +01:00
|
|
|
copy(n::ComputeTaskNode) = ComputeTaskNode(copy(task(n)))
|
|
|
|
copy(n::DataTaskNode) = DataTaskNode(copy(task(n)), n.name)
|
2023-08-28 13:32:22 +02:00
|
|
|
|
2023-08-29 12:57:46 +02:00
|
|
|
"""
|
|
|
|
make_node(t::AbstractTask)
|
|
|
|
|
|
|
|
Fallback implementation of `make_node` for an [`AbstractTask`](@ref), throwing an error.
|
|
|
|
"""
|
2023-08-24 15:11:54 +02:00
|
|
|
function make_node(t::AbstractTask)
|
2023-08-25 10:48:22 +02:00
|
|
|
return error("Cannot make a node from this task type")
|
2023-08-24 15:11:54 +02:00
|
|
|
end
|
|
|
|
|
2023-08-29 12:57:46 +02:00
|
|
|
"""
|
|
|
|
make_node(t::AbstractDataTask)
|
|
|
|
|
|
|
|
Construct and return a new [`DataTaskNode`](@ref) with the given task.
|
|
|
|
"""
|
2023-09-07 15:15:21 +02:00
|
|
|
function make_node(t::AbstractDataTask, name::String = "")
|
|
|
|
return DataTaskNode(t, name)
|
2023-08-24 15:11:54 +02:00
|
|
|
end
|
|
|
|
|
2023-08-29 12:57:46 +02:00
|
|
|
"""
|
|
|
|
make_node(t::AbstractComputeTask)
|
|
|
|
|
|
|
|
Construct and return a new [`ComputeTaskNode`](@ref) with the given task.
|
|
|
|
"""
|
2023-08-24 15:11:54 +02:00
|
|
|
function make_node(t::AbstractComputeTask)
|
2023-08-25 10:48:22 +02:00
|
|
|
return ComputeTaskNode(t)
|
2023-08-24 15:11:54 +02:00
|
|
|
end
|
|
|
|
|
2023-08-29 12:57:46 +02:00
|
|
|
"""
|
|
|
|
make_edge(n1::Node, n2::Node)
|
|
|
|
|
|
|
|
Fallback implementation of `make_edge` throwing an error. If you got this error it likely means you tried to construct an edge between two nodes of the same type.
|
|
|
|
"""
|
2023-08-24 15:11:54 +02:00
|
|
|
function make_edge(n1::Node, n2::Node)
|
2023-08-25 10:48:22 +02:00
|
|
|
return error("Can only create edges from compute to data node or reverse")
|
2023-08-24 15:11:54 +02:00
|
|
|
end
|
|
|
|
|
2023-08-29 12:57:46 +02:00
|
|
|
"""
|
|
|
|
make_edge(n1::ComputeTaskNode, n2::DataTaskNode)
|
|
|
|
|
|
|
|
Construct and return a new [`Edge`](@ref) pointing from `n1` (child) to `n2` (parent).
|
|
|
|
"""
|
2023-08-24 15:11:54 +02:00
|
|
|
function make_edge(n1::ComputeTaskNode, n2::DataTaskNode)
|
2023-08-25 10:48:22 +02:00
|
|
|
return Edge((n1, n2))
|
2023-08-24 15:11:54 +02:00
|
|
|
end
|
|
|
|
|
2023-08-29 12:57:46 +02:00
|
|
|
"""
|
|
|
|
make_edge(n1::DataTaskNode, n2::ComputeTaskNode)
|
|
|
|
|
|
|
|
Construct and return a new [`Edge`](@ref) pointing from `n1` (child) to `n2` (parent).
|
|
|
|
"""
|
2023-08-24 15:11:54 +02:00
|
|
|
function make_edge(n1::DataTaskNode, n2::ComputeTaskNode)
|
2023-08-25 10:48:22 +02:00
|
|
|
return Edge((n1, n2))
|
2023-08-24 15:11:54 +02:00
|
|
|
end
|