4#include "../algorithm/partitioner.hpp"
31template <
typename C,
typename B>
52template <
typename C,
typename B1,
typename B2>
54requires(C c, B1 b1, B2 b2) {
73template <
typename C,
typename B,
typename O>
75requires(C c, B b, O o) {
95template <
typename C,
typename B1,
typename B2,
typename O>
97requires(C c, B1 b1, B2 b2, O o) {
143 template <StaticTaskLike C>
164 template <RuntimeTaskLike C>
189 template <SubflowTaskLike C>
222 template <ConditionTaskLike C>
256 template <MultiConditionTaskLike C>
283 template <
typename... C>
requires (
sizeof...(C) > 1)
284 auto emplace(C&&... callables);
371 template <GraphLike T>
425 template <GraphLike T>
499 void linearize(std::vector<Task>& tasks);
516 void linearize(std::initializer_list<Task> tasks);
555 template <InputIteratorLike B, InputIteratorLike E,
typename C, PartitionerLike P = DefaultPartitioner>
598 template <
typename B,
typename E,
typename S,
typename C, PartitionerLike P = DefaultPartitioner>
717 template <IndexRangesLike R,
typename C, PartitionerLike P = DefaultPartitioner>
762 std::decay_t<std::unwrap_ref_decay_t<B>>,
763 std::decay_t<std::unwrap_ref_decay_t<O>>
807 std::decay_t<std::unwrap_ref_decay_t<B1>>,
808 std::decay_t<std::unwrap_ref_decay_t<B2>>,
809 std::decay_t<std::unwrap_ref_decay_t<O>>
811 Task transform(B1 first1, E1 last1, B2 first2, O d_first, C c, P part = P());
850 template <InputIteratorLike B, InputIteratorLike E,
typename T,
typename O, PartitionerLike P = DefaultPartitioner>
907 template <IndexRanges1DLike R,
typename T,
typename L,
typename G, PartitionerLike P = DefaultPartitioner>
994 std::decay_t<std::unwrap_ref_decay_t<B1>>,
995 std::decay_t<std::unwrap_ref_decay_t<B2>>
998 B1 first1, E1 last1, B2 first2, T& init, BOP_R bop_r, BOP_T bop_t, P part = P()
1043 template <InputIteratorLike B, InputIteratorLike E,
typename D,
typename BOP>
1087 template <InputIteratorLike B, InputIteratorLike E,
typename D,
typename BOP,
typename T>
1130 template <InputIteratorLike B, InputIteratorLike E,
typename D,
typename T,
typename BOP>
1178 template <InputIteratorLike B, InputIteratorLike E,
typename D,
typename BOP,
typename UOP>
1225 template <InputIteratorLike B, InputIteratorLike E,
typename D,
typename BOP,
typename UOP,
typename T>
1271 template <InputIteratorLike B, InputIteratorLike E,
typename D,
typename T,
typename BOP,
typename UOP>
1323 template <InputIteratorLike B, InputIteratorLike E,
typename T,
typename UOP, PartitionerLike P = DefaultPartitioner>
1324 Task find_if(B first, E last, T &result, UOP predicate, P part = P());
1371 template <InputIteratorLike B, InputIteratorLike E,
typename T,
typename UOP, PartitionerLike P = DefaultPartitioner>
1423 template <InputIteratorLike B, InputIteratorLike E,
typename T,
typename C, PartitionerLike P>
1475 template <InputIteratorLike B, InputIteratorLike E,
typename T,
typename C, PartitionerLike P>
1501 template <InputIteratorLike B, InputIteratorLike E,
typename C>
1523 template <InputIteratorLike B, InputIteratorLike E>
1559 template <InputIteratorLike B1, InputIteratorLike E1, InputIteratorLike B2, InputIteratorLike E2,
typename O>
1560 Task merge(B1 first1, E1 last1, B2 first2, E2 last2, O d_first);
1599 typename O,
typename C>
1600 Task merge(B1 first1, E1 last1, B2 first2, E2 last2, O d_first, C cmp);
1627 template<InputIteratorLike B, InputIteratorLike E,
typename V, PartitionerLike P = DefaultPartitioner>
1655 template<InputIteratorLike B, std::
integral C,
typename V, PartitionerLike P = DefaultPartitioner>
1685 template <InputIteratorLike B, InputIteratorLike E,
typename G, PartitionerLike P= DefaultPartitioner>
1715 template <InputIteratorLike B, std::
integral C,
typename G, PartitionerLike P = DefaultPartitioner>
1727 template <
typename L>
1728 void _linearize(L&);
1737template <StaticTaskLike C>
1739 return Task(_graph._emplace_back(NSTATE::NONE, ESTATE::NONE,
DefaultTaskParams{},
nullptr,
nullptr, 0,
1740 std::in_place_type_t<Node::Static>{}, std::forward<C>(c)
1745template <RuntimeTaskLike C>
1747 if constexpr (std::is_invocable_v<C, tf::Runtime&>) {
1748 return Task(_graph._emplace_back(NSTATE::NONE, ESTATE::NONE,
DefaultTaskParams{},
nullptr,
nullptr, 0,
1749 std::in_place_type_t<Node::Runtime>{}, std::forward<C>(c)
1752 else if constexpr (std::is_invocable_v<C, tf::NonpreemptiveRuntime&>) {
1753 return Task(_graph._emplace_back(NSTATE::NONE, ESTATE::NONE, DefaultTaskParams{},
nullptr,
nullptr, 0,
1754 std::in_place_type_t<Node::NonpreemptiveRuntime>{}, std::forward<C>(c)
1758 static_assert(dependent_false_v<C>,
"invalid runtime task callable");
1763template <SubflowTaskLike C>
1765 return Task(_graph._emplace_back(NSTATE::NONE, ESTATE::NONE, DefaultTaskParams{},
nullptr,
nullptr, 0,
1766 std::in_place_type_t<Node::Subflow>{}, std::forward<C>(c)
1771template <ConditionTaskLike C>
1773 return Task(_graph._emplace_back(NSTATE::NONE, ESTATE::NONE, DefaultTaskParams{},
nullptr,
nullptr, 0,
1774 std::in_place_type_t<Node::Condition>{}, std::forward<C>(c)
1779template <MultiConditionTaskLike C>
1781 return Task(_graph._emplace_back(NSTATE::NONE, ESTATE::NONE, DefaultTaskParams{},
nullptr,
nullptr, 0,
1782 std::in_place_type_t<Node::MultiCondition>{}, std::forward<C>(c)
1787template <GraphLike T>
1789 return Task(_graph._emplace_back(NSTATE::NONE, ESTATE::NONE,
DefaultTaskParams{},
nullptr,
nullptr, 0,
1796 return Task(_graph._emplace_back(NSTATE::NONE, ESTATE::NONE,
DefaultTaskParams{},
nullptr,
nullptr, 0,
1797 std::in_place_type_t<Node::AdoptedModule>{}, std::move(graph)
1802template <GraphLike T>
1809 return adopt(std::move(graph));
1814 auto node = _graph._emplace_back(NSTATE::NONE, ESTATE::NONE,
DefaultTaskParams{},
nullptr,
nullptr, 0,
1815 std::in_place_type_t<Node::Placeholder>{}
1821template <
typename... C>
requires (
sizeof...(C) > 1)
1823 return std::make_tuple(emplace(std::forward<C>(cs))...);
1834 for(
size_t i=0; i<task._node->_num_successors; ++i) {
1835 task._node->_edges[i]->_remove_predecessors(task._node);
1839 for(
size_t i=task._node->_num_successors; i<task._node->_edges.size(); ++i) {
1840 task._node->_edges[i]->_remove_successors(task._node);
1843 _graph._erase(task._node);
1848template <
typename L>
1849void FlowBuilder::_linearize(L& keys) {
1851 auto itr = keys.begin();
1852 auto end = keys.end();
1860 for(++nxt; nxt != end; ++nxt, ++itr) {
1861 itr->_node->_precede(nxt->_node);
1973 void retain(
bool flag)
noexcept;
1998inline Subflow::Subflow(Executor& executor, Worker& worker, Node* node, Graph& graph) :
1999 FlowBuilder {graph},
2000 _executor {executor},
2005 _node->_nstate &= ~(NSTATE::JOINED_SUBFLOW | NSTATE::RETAIN_SUBFLOW);
2013 return !(_node->_nstate & NSTATE::JOINED_SUBFLOW);
2025 _node->_nstate |= NSTATE::RETAIN_SUBFLOW;
2028 _node->_nstate &= ~NSTATE::RETAIN_SUBFLOW;
2037 return _node->_nstate & NSTATE::RETAIN_SUBFLOW;
class to create an empty task parameter for compile-time optimization
Definition graph.hpp:191
class to create an executor
Definition executor.hpp:62
class to build a task dependency graph
Definition flow_builder.hpp:114
Task inclusive_scan(B first, E last, D d_first, BOP bop, T init)
creates an STL-styled parallel inclusive-scan task with an initial value
Task inclusive_scan(B first, E last, D d_first, BOP bop)
creates an STL-styled parallel inclusive-scan task
Task transform(B1 first1, E1 last1, B2 first2, O d_first, C c, P part=P())
constructs a parallel-transform task
Task merge(B1 first1, E1 last1, B2 first2, E2 last2, O d_first, C cmp)
merges two sorted ranges into a single sorted output using a custom comparator
Task for_each_by_index(R range, C callable, P part=P())
constructs a parallel-for task over a one- or multi-dimensional index range
Task sort(B first, E last, C cmp)
constructs a dynamic task to perform STL-styled parallel sort
Task adopt(Graph &&graph)
creates a module task from a graph by taking over its ownership
Definition flow_builder.hpp:1795
Task generate_n(B first, C count, G gen, P part=P())
generates N values into a range in parallel using a callable
Task for_each_index(B first, E last, S step, C callable, P part=P())
constructs an index-based parallel-for task
Task reduce_by_index(R range, T &init, L lop, G gop, P part=P())
constructs an index range-based parallel-reduction task
Task transform_reduce(B1 first1, E1 last1, B2 first2, T &init, BOP_R bop_r, BOP_T bop_t, P part=P())
constructs an STL-styled parallel transform-reduce task
Task find_if(B first, E last, T &result, UOP predicate, P part=P())
constructs a task to perform STL-styled find-if algorithm
Task transform_inclusive_scan(B first, E last, D d_first, BOP bop, UOP uop, T init)
creates an STL-styled parallel transform-inclusive scan task
Task emplace(C &&callable)
creates a static task
Definition flow_builder.hpp:1738
Task exclusive_scan(B first, E last, D d_first, T init, BOP bop)
creates an STL-styled parallel exclusive-scan task
Task transform_reduce(B first, E last, T &init, BOP bop, UOP uop, P part=P())
constructs an STL-styled parallel transform-reduce task
void erase(Task task)
removes a task from a taskflow
Definition flow_builder.hpp:1827
Task for_each(B first, E last, C callable, P part=P())
constructs an STL-styled parallel-for task
Task fill(B first, E last, V value, P part=P())
fills a range with a given value in parallel
FlowBuilder(Graph &graph)
constructs a flow builder with a graph
Definition flow_builder.hpp:1732
Task fill_n(B first, C count, V value, P part=P())
fills N elements with a given value in parallel
Task max_element(B first, E last, T &result, C comp, P part)
constructs a task to perform STL-styled max-element algorithm
Task min_element(B first, E last, T &result, C comp, P part)
constructs a task to perform STL-styled min-element algorithm
Task generate(B first, E last, G gen, P part=P())
generates values into a range in parallel using a callable
Task sort(B first, E last)
constructs a dynamic task to perform STL-styled parallel sort using the std::less<T> comparator,...
Task transform_inclusive_scan(B first, E last, D d_first, BOP bop, UOP uop)
creates an STL-styled parallel transform-inclusive scan task
Task transform_exclusive_scan(B first, E last, D d_first, T init, BOP bop, UOP uop)
creates an STL-styled parallel transform-exclusive scan task
void linearize(std::vector< Task > &tasks)
adds adjacent dependency links to a linear list of tasks
Definition flow_builder.hpp:1866
Task find_if_not(B first, E last, T &result, UOP predicate, P part=P())
constructs a task to perform STL-styled find-if-not algorithm
Task transform(B first1, E last1, O d_first, C c, P part=P())
constructs a parallel-transform task
Task composed_of(T &object)
creates a module task for the target object
Definition flow_builder.hpp:1788
Task placeholder()
creates a placeholder task
Definition flow_builder.hpp:1813
Task merge(B1 first1, E1 last1, B2 first2, E2 last2, O d_first)
merges two sorted ranges into a single sorted output using the std::less comparator
Task reduce(B first, E last, T &init, O bop, P part=P())
constructs an STL-styled parallel-reduction task
class to create a graph object
Definition graph.hpp:47
void clear()
clears the graph
Definition graph.hpp:929
class to create a guided partitioner for scheduling parallel algorithms
Definition partitioner.hpp:417
class to construct a subflow graph from the execution of a dynamic task
Definition flow_builder.hpp:1913
Executor & executor() noexcept
acquires the associated executor
Definition flow_builder.hpp:2017
Graph & graph()
acquires the associated graph
Definition flow_builder.hpp:1962
void join()
enables the subflow to join its parent task
bool joinable() const noexcept
queries if the subflow is joinable
Definition flow_builder.hpp:2012
bool retain() const
queries if the subflow will be retained after it is joined
Definition flow_builder.hpp:2036
class to create a task handle over a taskflow node
Definition task.hpp:569
class to create a worker in an executor
Definition worker.hpp:55
concept to check if a binary operation is valid
Definition flow_builder.hpp:53
determines if a type is a partitioner
Definition partitioner.hpp:906
concept to check if a unary operation is valid
Definition flow_builder.hpp:32
taskflow namespace
Definition small_vector.hpp:20
Graph & retrieve_graph(T &target)
retrieves a reference to the underlying tf::Graph from an object
Definition graph.hpp:1067