1150 lines
78 KiB
HTML
1150 lines
78 KiB
HTML
|
<!DOCTYPE html>
|
||
|
<html lang="en">
|
||
|
<head>
|
||
|
<meta charset="UTF-8" />
|
||
|
<title>Learning from Examples » Graph Traversal | Taskflow QuickStart</title>
|
||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400i,600,600i%7CSource+Code+Pro:400,400i,600" />
|
||
|
<link rel="stylesheet" href="m-dark+documentation.compiled.css" />
|
||
|
<link rel="icon" href="favicon.ico" type="image/vnd.microsoft.icon" />
|
||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||
|
<meta name="theme-color" content="#22272e" />
|
||
|
</head>
|
||
|
<body>
|
||
|
<header><nav id="navigation">
|
||
|
<div class="m-container">
|
||
|
<div class="m-row">
|
||
|
<span id="m-navbar-brand" class="m-col-t-8 m-col-m-none m-left-m">
|
||
|
<a href="https://taskflow.github.io"><img src="taskflow_logo.png" alt="" />Taskflow</a> <span class="m-breadcrumb">|</span> <a href="index.html" class="m-thin">QuickStart</a>
|
||
|
</span>
|
||
|
<div class="m-col-t-4 m-hide-m m-text-right m-nopadr">
|
||
|
<a href="#search" class="m-doc-search-icon" title="Search" onclick="return showSearch()"><svg style="height: 0.9rem;" viewBox="0 0 16 16">
|
||
|
<path id="m-doc-search-icon-path" d="m6 0c-3.31 0-6 2.69-6 6 0 3.31 2.69 6 6 6 1.49 0 2.85-0.541 3.89-1.44-0.0164 0.338 0.147 0.759 0.5 1.15l3.22 3.79c0.552 0.614 1.45 0.665 2 0.115 0.55-0.55 0.499-1.45-0.115-2l-3.79-3.22c-0.392-0.353-0.812-0.515-1.15-0.5 0.895-1.05 1.44-2.41 1.44-3.89 0-3.31-2.69-6-6-6zm0 1.56a4.44 4.44 0 0 1 4.44 4.44 4.44 4.44 0 0 1-4.44 4.44 4.44 4.44 0 0 1-4.44-4.44 4.44 4.44 0 0 1 4.44-4.44z"/>
|
||
|
</svg></a>
|
||
|
<a id="m-navbar-show" href="#navigation" title="Show navigation"></a>
|
||
|
<a id="m-navbar-hide" href="#" title="Hide navigation"></a>
|
||
|
</div>
|
||
|
<div id="m-navbar-collapse" class="m-col-t-12 m-show-m m-col-m-none m-right-m">
|
||
|
<div class="m-row">
|
||
|
<ol class="m-col-t-6 m-col-m-none">
|
||
|
<li><a href="pages.html">Handbook</a></li>
|
||
|
<li><a href="namespaces.html">Namespaces</a></li>
|
||
|
</ol>
|
||
|
<ol class="m-col-t-6 m-col-m-none" start="3">
|
||
|
<li><a href="annotated.html">Classes</a></li>
|
||
|
<li><a href="files.html">Files</a></li>
|
||
|
<li class="m-show-m"><a href="#search" class="m-doc-search-icon" title="Search" onclick="return showSearch()"><svg style="height: 0.9rem;" viewBox="0 0 16 16">
|
||
|
<use href="#m-doc-search-icon-path" />
|
||
|
</svg></a></li>
|
||
|
</ol>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</nav></header>
|
||
|
<main><article>
|
||
|
<div class="m-container m-container-inflatable">
|
||
|
<div class="m-row">
|
||
|
<div class="m-col-l-10 m-push-l-1">
|
||
|
<h1>
|
||
|
<span class="m-breadcrumb"><a href="Examples.html">Learning from Examples</a> »</span>
|
||
|
Graph Traversal
|
||
|
</h1>
|
||
|
<nav class="m-block m-default">
|
||
|
<h3>Contents</h3>
|
||
|
<ul>
|
||
|
<li><a href="#GraphTraversalProblemFormulation">Problem Formulation</a></li>
|
||
|
<li><a href="#GraphTraversalGraphRepresentation">Graph Representation</a></li>
|
||
|
<li><a href="#GraphTraversalStaticTraversal">Static Traversal</a></li>
|
||
|
<li><a href="#GraphTraversalDynamicTraversal">Dynamic Traversal</a></li>
|
||
|
</ul>
|
||
|
</nav>
|
||
|
<p>We study the graph traversal problem by visiting each vertex in parallel following their edge dependencies. Traversing a graph is a fundamental building block of many graph applications especially for large-scale graph analytics.</p><section id="GraphTraversalProblemFormulation"><h2><a href="#GraphTraversalProblemFormulation">Problem Formulation</a></h2><p>Given a directed acyclic graph (DAG), i.e., a graph that has no cycles, we would like to traverse each vertex in order without breaking dependency constraints defined by edges. The following figure shows a graph of six vertices and seven edges. Each vertex represents a particular task and each edge represents a task dependency between two tasks.</p><div class="m-graph"><svg style="width: 18.900rem; height: 26.000rem;" viewBox="0.00 0.00 189.00 260.00">
|
||
|
<g transform="scale(1 1) rotate(0) translate(4 256)">
|
||
|
<title>Taskflow</title>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>Task1</title>
|
||
|
<ellipse cx="99" cy="-234" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="99" y="-231.5" font-family="Helvetica,sans-Serif" font-size="10.00">Task1</text>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>Task2</title>
|
||
|
<ellipse cx="27" cy="-162" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="27" y="-159.5" font-family="Helvetica,sans-Serif" font-size="10.00">Task2</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>Task1->Task2</title>
|
||
|
<path d="M84.43,-218.83C74.25,-208.94 60.48,-195.55 48.97,-184.36"/>
|
||
|
<polygon points="51.41,-181.85 41.8,-177.38 46.53,-186.87 51.41,-181.85"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>Task3</title>
|
||
|
<ellipse cx="99" cy="-162" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="99" y="-159.5" font-family="Helvetica,sans-Serif" font-size="10.00">Task3</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>Task1->Task3</title>
|
||
|
<path d="M99,-215.7C99,-207.98 99,-198.71 99,-190.11"/>
|
||
|
<polygon points="102.5,-190.1 99,-180.1 95.5,-190.1 102.5,-190.1"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>Task4</title>
|
||
|
<ellipse cx="154" cy="-90" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="154" y="-87.5" font-family="Helvetica,sans-Serif" font-size="10.00">Task4</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>Task1->Task4</title>
|
||
|
<path d="M111.75,-217.7C119.56,-207.59 129.15,-193.71 135,-180 143.46,-160.17 148.3,-136.2 150.98,-118.13"/>
|
||
|
<polygon points="154.48,-118.37 152.34,-107.99 147.54,-117.43 154.48,-118.37"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>Task5</title>
|
||
|
<ellipse cx="82" cy="-90" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="82" y="-87.5" font-family="Helvetica,sans-Serif" font-size="10.00">Task5</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>Task2->Task5</title>
|
||
|
<path d="M38.93,-145.81C46.21,-136.55 55.66,-124.52 63.85,-114.09"/>
|
||
|
<polygon points="66.66,-116.18 70.09,-106.16 61.16,-111.86 66.66,-116.18"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>Task3->Task5</title>
|
||
|
<path d="M94.88,-144.05C92.99,-136.26 90.7,-126.82 88.58,-118.08"/>
|
||
|
<polygon points="91.96,-117.17 86.2,-108.28 85.15,-118.82 91.96,-117.17"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>Task6</title>
|
||
|
<ellipse cx="118" cy="-18" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="118" y="-15.5" font-family="Helvetica,sans-Serif" font-size="10.00">Task6</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>Task4->Task6</title>
|
||
|
<path d="M145.65,-72.76C141.29,-64.28 135.85,-53.71 130.96,-44.2"/>
|
||
|
<polygon points="133.99,-42.44 126.3,-35.15 127.77,-45.64 133.99,-42.44"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>Task5->Task6</title>
|
||
|
<path d="M90.35,-72.76C94.71,-64.28 100.15,-53.71 105.04,-44.2"/>
|
||
|
<polygon points="108.23,-45.64 109.7,-35.15 102.01,-42.44 108.23,-45.64"/>
|
||
|
</g>
|
||
|
</g>
|
||
|
</svg>
|
||
|
</div><p>Traversing the above graph in parallel, the maximum parallelism we can acquire is three. When Task1 finishes, we can run Task2, Task3, and Task4 in parallel.</p></section><section id="GraphTraversalGraphRepresentation"><h2><a href="#GraphTraversalGraphRepresentation">Graph Representation</a></h2><p>We define the data structure of our graph. The graph is represented by an array of nodes of the following structure:</p><pre class="m-code"><span class="k">struct</span><span class="w"> </span><span class="nc">Node</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="w"> </span><span class="n">name</span><span class="p">;</span>
|
||
|
<span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">idx</span><span class="p">;</span><span class="w"> </span><span class="c1">// index of the node in a array</span>
|
||
|
<span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">visited</span><span class="w"> </span><span class="p">{</span><span class="nb">false</span><span class="p">};</span>
|
||
|
|
||
|
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">atomic</span><span class="o"><</span><span class="kt">size_t</span><span class="o">></span><span class="w"> </span><span class="n">dependents</span><span class="w"> </span><span class="p">{</span><span class="mi">0</span><span class="p">};</span><span class="w"> </span><span class="c1">// number of incoming edges</span>
|
||
|
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">Node</span><span class="o">*></span><span class="w"> </span><span class="n">successors</span><span class="p">;</span><span class="w"> </span><span class="c1">// number of outgoing edges</span>
|
||
|
|
||
|
<span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">precede</span><span class="p">(</span><span class="n">Node</span><span class="o">&</span><span class="w"> </span><span class="n">n</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="n">successors</span><span class="p">.</span><span class="n">emplace_back</span><span class="p">(</span><span class="o">&</span><span class="n">n</span><span class="p">);</span>
|
||
|
<span class="w"> </span><span class="n">n</span><span class="p">.</span><span class="n">dependents</span><span class="w"> </span><span class="o">++</span><span class="p">;</span>
|
||
|
<span class="w"> </span><span class="p">}</span>
|
||
|
<span class="p">};</span></pre><p>Based on the data structure, we randomly generate a DAG using ordered edges.</p><pre class="m-code"><span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">Node</span><span class="p">[]</span><span class="o">></span><span class="w"> </span><span class="n">make_dag</span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">num_nodes</span><span class="p">,</span><span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">max_degree</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span>
|
||
|
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">Node</span><span class="p">[]</span><span class="o">></span><span class="w"> </span><span class="n">nodes</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">Node</span><span class="p">[</span><span class="n">num_nodes</span><span class="p">]);</span>
|
||
|
<span class="w"> </span>
|
||
|
<span class="w"> </span><span class="c1">// Make sure nodes are in clean state</span>
|
||
|
<span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="n">num_nodes</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">idx</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i</span><span class="p">;</span>
|
||
|
<span class="w"> </span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">to_string</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
|
||
|
<span class="w"> </span><span class="p">}</span>
|
||
|
|
||
|
<span class="w"> </span><span class="c1">// Create a DAG by randomly insert ordered edges</span>
|
||
|
<span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="n">num_nodes</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">degree</span><span class="w"> </span><span class="p">{</span><span class="mi">0</span><span class="p">};</span>
|
||
|
<span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">j</span><span class="o">=</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="n">j</span><span class="o"><</span><span class="n">num_nodes</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">degree</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">max_degree</span><span class="p">;</span><span class="w"> </span><span class="n">j</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">rand</span><span class="p">()</span><span class="w"> </span><span class="o">%</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">precede</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">j</span><span class="p">]);</span>
|
||
|
<span class="w"> </span><span class="n">degree</span><span class="w"> </span><span class="o">++</span><span class="p">;</span>
|
||
|
<span class="w"> </span><span class="p">}</span>
|
||
|
<span class="w"> </span><span class="p">}</span>
|
||
|
<span class="w"> </span><span class="p">}</span>
|
||
|
|
||
|
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">nodes</span><span class="p">;</span>
|
||
|
<span class="p">}</span></pre><p>The function, <code>make_dag</code>, accepts two arguments, <code>num_nodes</code> and <code>max_degree</code>, to restrict the number of nodes in the graph and the maximum number of outgoing edges of every node.</p></section><section id="GraphTraversalStaticTraversal"><h2><a href="#GraphTraversalStaticTraversal">Static Traversal</a></h2><p>We create a taskflow to traverse the graph using static tasks (see <a href="StaticTasking.html" class="m-doc">Static Tasking</a>). Each task does nothing but marks <code>visited</code> to <code>true</code> and subtracts <code>dependents</code> from one, both of which are used for validation after the graph is traversed. In practice, this computation may be replaced with a heavy function.</p><pre class="m-code"><span class="n">tf</span><span class="o">::</span><span class="n">Taskflow</span><span class="w"> </span><span class="n">taskflow</span><span class="p">;</span>
|
||
|
<span class="n">tf</span><span class="o">::</span><span class="n">Executor</span><span class="w"> </span><span class="n">executor</span><span class="p">;</span>
|
||
|
|
||
|
<span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">Node</span><span class="p">[]</span><span class="o">></span><span class="w"> </span><span class="n">nodes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">make_dag</span><span class="p">(</span><span class="mi">100000</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">);</span>
|
||
|
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">tf</span><span class="o">::</span><span class="n">Task</span><span class="o">></span><span class="w"> </span><span class="n">tasks</span><span class="p">;</span>
|
||
|
|
||
|
<span class="c1">// create the traversal task for each node</span>
|
||
|
<span class="k">for</span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="n">num_nodes</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="n">tf</span><span class="o">::</span><span class="n">Task</span><span class="w"> </span><span class="n">task</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">taskflow</span><span class="p">.</span><span class="n">emplace</span><span class="p">([</span><span class="n">v</span><span class="o">=&</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">])](){</span>
|
||
|
<span class="w"> </span><span class="n">v</span><span class="o">-></span><span class="n">visited</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span><span class="p">;</span>
|
||
|
<span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">j</span><span class="o"><</span><span class="n">v</span><span class="o">-></span><span class="n">successors</span><span class="p">.</span><span class="n">size</span><span class="p">();</span><span class="w"> </span><span class="o">++</span><span class="n">j</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="n">v</span><span class="o">-></span><span class="n">successors</span><span class="p">[</span><span class="n">j</span><span class="p">]</span><span class="o">-></span><span class="n">dependents</span><span class="p">.</span><span class="n">fetch_sub</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
|
||
|
<span class="w"> </span><span class="p">}</span>
|
||
|
<span class="w"> </span><span class="p">}).</span><span class="n">name</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">name</span><span class="p">);</span>
|
||
|
|
||
|
<span class="w"> </span><span class="n">tasks</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">task</span><span class="p">);</span>
|
||
|
<span class="p">}</span>
|
||
|
|
||
|
<span class="c1">// create the dependency between nodes on top of the graph structure</span>
|
||
|
<span class="k">for</span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="n">num_nodes</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">j</span><span class="o"><</span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">successors</span><span class="p">.</span><span class="n">size</span><span class="p">();</span><span class="w"> </span><span class="o">++</span><span class="n">j</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="n">tasks</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">precede</span><span class="p">(</span><span class="n">tasks</span><span class="p">[</span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">successors</span><span class="p">[</span><span class="n">j</span><span class="p">]</span><span class="o">-></span><span class="n">idx</span><span class="p">]);</span>
|
||
|
<span class="w"> </span><span class="p">}</span>
|
||
|
<span class="p">}</span>
|
||
|
|
||
|
<span class="n">executor</span><span class="p">.</span><span class="n">run</span><span class="p">(</span><span class="n">taskflow</span><span class="p">).</span><span class="n">wait</span><span class="p">();</span>
|
||
|
|
||
|
<span class="c1">// after the graph is traversed, all nodes must be visited with no dependents</span>
|
||
|
<span class="k">for</span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="n">num_nodes</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">visited</span><span class="p">);</span>
|
||
|
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">dependents</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
|
||
|
<span class="p">}</span></pre><p>The code above has two parts to construct the parallel graph traversal. First, it iterates each node and constructs a traversal task for that node. Second, it iterates each outgoing edge of a node and creates a dependency between the node and the other end (successor) of that edge. The resulting taskflow structure is topologically equivalent to the given graph.</p><div class="m-graph"><svg style="width: 159.200rem; height: 63.200rem;" viewBox="0.00 0.00 1592.00 632.00">
|
||
|
<g transform="scale(1 1) rotate(0) translate(4 628)">
|
||
|
<title>Taskflow</title>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780b0d0</title>
|
||
|
<ellipse cx="27" cy="-138" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="27" y="-135.5" font-family="Helvetica,sans-Serif" font-size="10.00">0</text>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780ac50</title>
|
||
|
<ellipse cx="117" cy="-258" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="117" y="-255.5" font-family="Helvetica,sans-Serif" font-size="10.00">4</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780b0d0->p0x7f95e780ac50</title>
|
||
|
<path d="M39.87,-154.18C54.91,-174.7 80.97,-210.23 98.35,-233.93"/>
|
||
|
<polygon points="95.58,-236.08 104.32,-242.07 101.23,-231.94 95.58,-236.08"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780ab30</title>
|
||
|
<ellipse cx="117" cy="-312" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="117" y="-309.5" font-family="Helvetica,sans-Serif" font-size="10.00">5</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780b0d0->p0x7f95e780ab30</title>
|
||
|
<path d="M36.83,-155C42.06,-165.31 48.68,-178.79 54,-191 71.87,-232.01 66,-247.24 90,-285 91.07,-286.69 92.26,-288.36 93.53,-290"/>
|
||
|
<polygon points="91.07,-292.51 100.26,-297.78 96.36,-287.93 91.07,-292.51"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780a8f0</title>
|
||
|
<ellipse cx="207" cy="-174" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="207" y="-171.5" font-family="Helvetica,sans-Serif" font-size="10.00">7</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780b0d0->p0x7f95e780a8f0</title>
|
||
|
<path d="M50.47,-128.71C74.35,-120.25 112.86,-110.67 144,-122 160.09,-127.85 174.91,-139.92 186.03,-150.96"/>
|
||
|
<polygon points="183.66,-153.54 193.1,-158.34 188.71,-148.7 183.66,-153.54"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780a7d0</title>
|
||
|
<ellipse cx="297" cy="-182" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="297" y="-179.5" font-family="Helvetica,sans-Serif" font-size="10.00">8</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780b0d0->p0x7f95e780a7d0</title>
|
||
|
<path d="M52.1,-131.27C91.54,-121.51 171.74,-106.95 234,-130 250.06,-135.94 264.88,-148.01 276,-159.03"/>
|
||
|
<polygon points="273.63,-161.61 283.08,-166.4 278.68,-156.76 273.63,-161.61"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ac50->p0x7f95e780a8f0</title>
|
||
|
<path d="M133.33,-243.37C147.21,-230.12 167.83,-210.43 183.57,-195.41"/>
|
||
|
<polygon points="186.03,-197.9 190.85,-188.46 181.2,-192.84 186.03,-197.9"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ac50->p0x7f95e780a7d0</title>
|
||
|
<path d="M140.18,-248.53C171.45,-235.18 228.63,-210.76 264.35,-195.51"/>
|
||
|
<polygon points="265.99,-198.62 273.82,-191.47 263.25,-192.18 265.99,-198.62"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780aa10</title>
|
||
|
<ellipse cx="207" cy="-388" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="207" y="-385.5" font-family="Helvetica,sans-Serif" font-size="10.00">6</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ac50->p0x7f95e780aa10</title>
|
||
|
<path d="M133.21,-272.6C136.92,-276.47 140.75,-280.77 144,-285 162.92,-309.67 180.81,-340.5 192.47,-361.98"/>
|
||
|
<polygon points="189.41,-363.68 197.22,-370.84 195.58,-360.37 189.41,-363.68"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780a6b0</title>
|
||
|
<ellipse cx="297" cy="-334" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="297" y="-331.5" font-family="Helvetica,sans-Serif" font-size="10.00">9</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ac50->p0x7f95e780a6b0</title>
|
||
|
<path d="M140.18,-267.47C171.45,-280.82 228.63,-305.24 264.35,-320.49"/>
|
||
|
<polygon points="263.25,-323.82 273.82,-324.53 265.99,-317.38 263.25,-323.82"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ab30->p0x7f95e780a8f0</title>
|
||
|
<path d="M133.3,-297.48C137.01,-293.6 140.82,-289.29 144,-285 164.01,-258 182.15,-223.86 193.57,-200.61"/>
|
||
|
<polygon points="196.83,-201.9 198.03,-191.37 190.53,-198.85 196.83,-201.9"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ab30->p0x7f95e780a6b0</title>
|
||
|
<path d="M143.88,-315.2C174.55,-318.99 225.83,-325.33 260.27,-329.58"/>
|
||
|
<polygon points="260.02,-333.08 270.37,-330.83 260.88,-326.13 260.02,-333.08"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780a470</title>
|
||
|
<ellipse cx="387" cy="-236" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="387" y="-233.5" font-family="Helvetica,sans-Serif" font-size="10.00">11</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ab30->p0x7f95e780a470</title>
|
||
|
<path d="M142.26,-305.12C190.19,-291.53 297.15,-261.2 352.06,-245.63"/>
|
||
|
<polygon points="353.33,-248.9 361.99,-242.81 351.42,-242.17 353.33,-248.9"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780a110</title>
|
||
|
<ellipse cx="657" cy="-342" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="657" y="-339.5" font-family="Helvetica,sans-Serif" font-size="10.00">14</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ab30->p0x7f95e780a110</title>
|
||
|
<path d="M124.03,-329.57C141.89,-378.03 199.39,-510 296,-510 296,-510 296,-510 478,-510 535.64,-510 552.24,-491.73 594,-452 618.57,-428.62 636.08,-393.33 646.1,-369.06"/>
|
||
|
<polygon points="649.37,-370.31 649.81,-359.72 642.86,-367.72 649.37,-370.31"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a8f0->p0x7f95e780a7d0</title>
|
||
|
<path d="M233.93,-176.36C242.09,-177.1 251.26,-177.93 259.99,-178.73"/>
|
||
|
<polygon points="259.68,-182.21 269.95,-179.63 260.31,-175.24 259.68,-182.21"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a8f0->p0x7f95e780a6b0</title>
|
||
|
<path d="M217.25,-190.82C232.59,-218.72 263.41,-274.75 281.61,-307.84"/>
|
||
|
<polygon points="278.72,-309.85 286.61,-316.92 284.86,-306.47 278.72,-309.85"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780a590</title>
|
||
|
<ellipse cx="297" cy="-125" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="297" y="-122.5" font-family="Helvetica,sans-Serif" font-size="10.00">10</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a8f0->p0x7f95e780a590</title>
|
||
|
<path d="M228.41,-162.64C239.85,-156.27 254.31,-148.21 266.92,-141.19"/>
|
||
|
<polygon points="268.67,-144.23 275.7,-136.3 265.26,-138.11 268.67,-144.23"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780a230</title>
|
||
|
<ellipse cx="567" cy="-152" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="567" y="-149.5" font-family="Helvetica,sans-Serif" font-size="10.00">13</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a8f0->p0x7f95e780a230</title>
|
||
|
<path d="M216.13,-156.92C225.98,-138.48 244.47,-110.12 270,-98 360.59,-54.99 481.77,-106.85 536.72,-135.49"/>
|
||
|
<polygon points="535.4,-138.75 545.88,-140.37 538.7,-132.57 535.4,-138.75"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a7d0->p0x7f95e780a470</title>
|
||
|
<path d="M317.53,-193.98C329.38,-201.26 344.7,-210.66 357.84,-218.72"/>
|
||
|
<polygon points="356.17,-221.8 366.52,-224.05 359.83,-215.84 356.17,-221.8"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a7d0->p0x7f95e780a110</title>
|
||
|
<path d="M323.51,-185.79C347.44,-189.84 383.94,-197.31 414,-209 473.91,-232.3 483.65,-249.07 540,-280 569.21,-296.03 602.8,-313.93 626.29,-326.36"/>
|
||
|
<polygon points="624.91,-329.59 635.39,-331.16 628.18,-323.4 624.91,-329.59"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780a350</title>
|
||
|
<ellipse cx="477" cy="-388" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="477" y="-385.5" font-family="Helvetica,sans-Serif" font-size="10.00">12</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a7d0->p0x7f95e780a350</title>
|
||
|
<path d="M309.68,-198.18C321.83,-214.79 341.62,-241.21 360,-263 391.35,-300.17 430.21,-341.09 454.05,-365.65"/>
|
||
|
<polygon points="451.75,-368.31 461.23,-373.03 456.76,-363.42 451.75,-368.31"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a7d0->p0x7f95e780a230</title>
|
||
|
<path d="M323.7,-179.12C371.7,-173.75 475.08,-162.18 530,-156.03"/>
|
||
|
<polygon points="530.44,-159.5 539.99,-154.91 529.66,-152.55 530.44,-159.5"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780afb0</title>
|
||
|
<ellipse cx="27" cy="-386" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="27" y="-383.5" font-family="Helvetica,sans-Serif" font-size="10.00">1</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780afb0->p0x7f95e780ab30</title>
|
||
|
<path d="M44.55,-372.08C57.83,-360.92 76.65,-345.09 91.65,-332.48"/>
|
||
|
<polygon points="94.12,-334.97 99.52,-325.86 89.62,-329.61 94.12,-334.97"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780afb0->p0x7f95e780a8f0</title>
|
||
|
<path d="M34.19,-368.52C47.85,-330.26 80.15,-241.63 90,-231 102.09,-217.95 143.71,-199.2 173.64,-186.81"/>
|
||
|
<polygon points="175.35,-189.9 183.28,-182.87 172.7,-183.42 175.35,-189.9"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780afb0->p0x7f95e780aa10</title>
|
||
|
<path d="M49.23,-396.47C60.94,-401.66 75.93,-407.37 90,-410 113.59,-414.41 120.35,-414.07 144,-410 154.19,-408.25 164.93,-404.98 174.55,-401.49"/>
|
||
|
<polygon points="176.02,-404.68 184.11,-397.83 173.52,-398.14 176.02,-404.68"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780afb0->p0x7f95e780a6b0</title>
|
||
|
<path d="M44.37,-399.92C56.2,-409.03 73.02,-420.1 90,-425 151.64,-442.78 178.14,-446.55 234,-415 256.03,-402.56 272.78,-378.78 283.28,-360.19"/>
|
||
|
<polygon points="286.41,-361.76 288.07,-351.29 280.25,-358.44 286.41,-361.76"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780aa10->p0x7f95e780a6b0</title>
|
||
|
<path d="M227.53,-376.02C239.38,-368.74 254.7,-359.34 267.84,-351.28"/>
|
||
|
<polygon points="269.83,-354.16 276.52,-345.95 266.17,-348.2 269.83,-354.16"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780aa10->p0x7f95e780a110</title>
|
||
|
<path d="M224.45,-401.87C254.47,-425.73 321.08,-472 386,-472 386,-472 386,-472 478,-472 534.68,-472 549.25,-453.79 594,-419 612.52,-404.6 628.94,-383.63 640.22,-367.2"/>
|
||
|
<polygon points="643.31,-368.88 645.94,-358.62 637.48,-365 643.31,-368.88"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780aa10->p0x7f95e780a590</title>
|
||
|
<path d="M209.98,-370.05C215.02,-329.58 230.82,-228.98 270,-155 271.36,-152.43 272.98,-149.89 274.73,-147.45"/>
|
||
|
<polygon points="277.52,-149.56 281.04,-139.57 272.06,-145.19 277.52,-149.56"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780aa10->p0x7f95e780a350</title>
|
||
|
<path d="M234.18,-388C282.22,-388 384.51,-388 439.39,-388"/>
|
||
|
<polygon points="439.71,-391.5 449.71,-388 439.71,-384.5 439.71,-391.5"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a6b0->p0x7f95e780a470</title>
|
||
|
<path d="M311.75,-318.69C326.09,-302.72 348.73,-277.51 365.24,-259.12"/>
|
||
|
<polygon points="368.27,-260.98 372.35,-251.2 363.06,-256.31 368.27,-260.98"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a6b0->p0x7f95e780a110</title>
|
||
|
<path d="M315.41,-347.56C342.4,-367.53 396.76,-403.7 450,-415 513.27,-428.43 536.15,-422.92 594,-394 608.76,-386.62 623.03,-375.06 634.15,-364.71"/>
|
||
|
<polygon points="636.89,-366.94 641.66,-357.47 632.03,-361.9 636.89,-366.94"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a6b0->p0x7f95e780a350</title>
|
||
|
<path d="M322.01,-341.28C353.01,-350.69 407.16,-367.12 442.29,-377.77"/>
|
||
|
<polygon points="441.51,-381.19 452.09,-380.75 443.54,-374.49 441.51,-381.19"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a6b0->p0x7f95e780a230</title>
|
||
|
<path d="M318.69,-323.03C356.76,-302.48 439.86,-255.93 504,-208 517.78,-197.7 532.1,-184.92 543.51,-174.17"/>
|
||
|
<polygon points="546.08,-176.55 550.89,-167.11 541.25,-171.49 546.08,-176.55"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780ae90</title>
|
||
|
<ellipse cx="27" cy="-218" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="27" y="-215.5" font-family="Helvetica,sans-Serif" font-size="10.00">2</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ae90->p0x7f95e780ab30</title>
|
||
|
<path d="M41.95,-233.25C54.46,-246.88 73.36,-267.37 90,-285 91.37,-286.46 92.79,-287.95 94.23,-289.45"/>
|
||
|
<polygon points="91.93,-292.11 101.37,-296.91 96.98,-287.27 91.93,-292.11"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ae90->p0x7f95e780a8f0</title>
|
||
|
<path d="M39.41,-201.96C50.5,-187.88 68.75,-168.39 90,-160 116.91,-149.38 149.84,-154.93 173.73,-161.94"/>
|
||
|
<polygon points="172.78,-165.31 183.37,-164.99 174.89,-158.64 172.78,-165.31"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ae90->p0x7f95e780a7d0</title>
|
||
|
<path d="M37.63,-201.31C48.14,-184.9 66.65,-160.78 90,-150 148.12,-123.17 172.09,-130.73 234,-147 246.48,-150.28 259.1,-156.71 269.66,-163.17"/>
|
||
|
<polygon points="268.06,-166.3 278.36,-168.78 271.85,-160.42 268.06,-166.3"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ae90->p0x7f95e780aa10</title>
|
||
|
<path d="M39.48,-234.38C44.24,-241.48 49.65,-249.99 54,-258 72.79,-292.62 61.89,-311.4 90,-339 112.21,-360.81 145.6,-373.51 170.86,-380.5"/>
|
||
|
<polygon points="170.23,-383.95 180.79,-383.07 171.98,-377.17 170.23,-383.95"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e780ad70</title>
|
||
|
<ellipse cx="27" cy="-285" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="27" y="-282.5" font-family="Helvetica,sans-Serif" font-size="10.00">3</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ad70->p0x7f95e780ac50</title>
|
||
|
<path d="M52.05,-277.62C61.44,-274.74 72.36,-271.39 82.5,-268.28"/>
|
||
|
<polygon points="83.75,-271.55 92.29,-265.28 81.7,-264.86 83.75,-271.55"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ad70->p0x7f95e780ab30</title>
|
||
|
<path d="M52.05,-292.38C61.44,-295.26 72.36,-298.61 82.5,-301.72"/>
|
||
|
<polygon points="81.7,-305.14 92.29,-304.72 83.75,-298.45 81.7,-305.14"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ad70->p0x7f95e780a8f0</title>
|
||
|
<path d="M38.77,-268.55C54.58,-244.64 82.93,-202.61 90,-198 113.71,-182.54 145.45,-176.77 169.74,-174.73"/>
|
||
|
<polygon points="170.24,-178.21 179.98,-174.06 169.77,-171.22 170.24,-178.21"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780ad70->p0x7f95e780aa10</title>
|
||
|
<path d="M35.16,-302.33C44.54,-322.66 63.03,-355.67 90,-372 113.94,-386.49 145.66,-390.02 169.89,-390.19"/>
|
||
|
<polygon points="170.14,-393.69 180.1,-390.07 170.06,-386.69 170.14,-393.69"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a470->p0x7f95e780a110</title>
|
||
|
<path d="M404.94,-249.66C408.12,-252.58 411.29,-255.77 414,-259 433.72,-282.55 424.13,-301.44 450,-318 501.97,-351.27 576.67,-350.75 620.38,-346.77"/>
|
||
|
<polygon points="620.94,-350.23 630.53,-345.74 620.23,-343.27 620.94,-350.23"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a470->p0x7f95e780a350</title>
|
||
|
<path d="M401.93,-251.27C406.15,-256.36 410.57,-262.21 414,-268 435.56,-304.35 428.44,-319.65 450,-356 451.72,-358.89 453.68,-361.8 455.74,-364.63"/>
|
||
|
<polygon points="453.15,-367 462.07,-372.73 458.67,-362.69 453.15,-367"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a470->p0x7f95e780a230</title>
|
||
|
<path d="M409.47,-225.87C440.88,-211.05 499.5,-183.38 535.41,-166.44"/>
|
||
|
<polygon points="536.9,-169.6 544.45,-162.17 533.92,-163.27 536.9,-169.6"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e7809ed0</title>
|
||
|
<ellipse cx="747" cy="-198" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="747" y="-195.5" font-family="Helvetica,sans-Serif" font-size="10.00">16</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a470->p0x7f95e7809ed0</title>
|
||
|
<path d="M413.75,-233.27C476.55,-226.6 637.75,-209.49 710.01,-201.82"/>
|
||
|
<polygon points="710.43,-205.3 720.01,-200.76 709.69,-198.33 710.43,-205.3"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a110->p0x7f95e7809ed0</title>
|
||
|
<path d="M667.51,-325.1C672.49,-316.18 678.64,-305.04 684,-295 700.47,-264.13 699.65,-253.46 720,-225 721.16,-223.37 722.42,-221.75 723.74,-220.14"/>
|
||
|
<polygon points="726.56,-222.24 730.6,-212.45 721.33,-217.59 726.56,-222.24"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e7809db0</title>
|
||
|
<ellipse cx="837" cy="-75" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="837" y="-72.5" font-family="Helvetica,sans-Serif" font-size="10.00">17</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a110->p0x7f95e7809db0</title>
|
||
|
<path d="M668.32,-325.48C673.52,-316.67 679.63,-305.51 684,-295 706.03,-242.01 688.05,-218.67 720,-171 737.08,-145.51 750.34,-147.53 774,-128 786.66,-117.56 800.56,-105.71 811.98,-95.87"/>
|
||
|
<polygon points="814.53,-98.29 819.81,-89.1 809.96,-92.99 814.53,-98.29"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e7809810</title>
|
||
|
<ellipse cx="1107" cy="-381" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="1107" y="-378.5" font-family="Helvetica,sans-Serif" font-size="10.00">22</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a110->p0x7f95e7809810</title>
|
||
|
<path d="M678.93,-352.81C707.6,-366.95 761.11,-390.99 810,-400 903.25,-417.19 1015.49,-399.82 1071.16,-388.71"/>
|
||
|
<polygon points="1072.11,-392.09 1081.2,-386.66 1070.7,-385.24 1072.11,-392.09"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e7809930</title>
|
||
|
<ellipse cx="1107" cy="-549" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="1107" y="-546.5" font-family="Helvetica,sans-Serif" font-size="10.00">21</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a110->p0x7f95e7809930</title>
|
||
|
<path d="M673.65,-356.44C718.54,-396.75 853.36,-509.92 990,-547 1016.13,-554.09 1046.8,-554.29 1070.04,-552.87"/>
|
||
|
<polygon points="1070.43,-556.35 1080.15,-552.13 1069.92,-549.37 1070.43,-556.35"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a590->p0x7f95e780a470</title>
|
||
|
<path d="M311.68,-140.42C315.71,-145.06 320.08,-150.19 324,-155 339.2,-173.65 355.72,-195.31 367.89,-211.54"/>
|
||
|
<polygon points="365.38,-214.03 374.16,-219.95 370.98,-209.84 365.38,-214.03"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a590->p0x7f95e780a110</title>
|
||
|
<path d="M320.98,-133.35C373.31,-153.1 503.77,-206.61 594,-280 608.63,-291.9 623.62,-306.8 635.19,-319.01"/>
|
||
|
<polygon points="632.88,-321.66 642.27,-326.59 638,-316.89 632.88,-321.66"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a590->p0x7f95e7809ed0</title>
|
||
|
<path d="M314.36,-110.63C344.25,-85.92 410.65,-38 476,-38 476,-38 476,-38 568,-38 647.14,-38 707.04,-126.56 732.53,-171.9"/>
|
||
|
<polygon points="729.57,-173.79 737.44,-180.88 735.71,-170.42 729.57,-173.79"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a590->p0x7f95e7809db0</title>
|
||
|
<path d="M307.39,-108.35C318.09,-90.72 337.09,-63.11 360,-46 404.44,-12.81 420.54,0 476,0 476,0 476,0 658,0 715.87,0 776.61,-34.08 810.05,-56.3"/>
|
||
|
<polygon points="808.1,-59.21 818.34,-61.94 812.04,-53.42 808.1,-59.21"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a350->p0x7f95e780a230</title>
|
||
|
<path d="M484.47,-370.65C499.66,-329.9 537.71,-227.87 555.94,-178.97"/>
|
||
|
<polygon points="559.31,-179.97 559.52,-169.38 552.75,-177.53 559.31,-179.97"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a350->p0x7f95e7809db0</title>
|
||
|
<path d="M489.36,-371.92C521.23,-327.78 615.97,-203.04 720,-128 734.16,-117.79 774.88,-100.05 804.07,-87.93"/>
|
||
|
<polygon points="805.57,-91.1 813.48,-84.05 802.9,-84.63 805.57,-91.1"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e7809a50</title>
|
||
|
<ellipse cx="1017" cy="-465" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="1017" y="-462.5" font-family="Helvetica,sans-Serif" font-size="10.00">20</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a350->p0x7f95e7809a50</title>
|
||
|
<path d="M480.08,-405.91C484.88,-440.02 499.6,-515.11 540,-562 578.15,-606.29 597.54,-624 656,-624 656,-624 656,-624 838,-624 896.46,-624 911.09,-601.7 954,-562 975.76,-541.87 993.11,-512.52 1003.86,-491.38"/>
|
||
|
<polygon points="1007.05,-492.82 1008.33,-482.3 1000.77,-489.73 1007.05,-492.82"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a350->p0x7f95e7809810</title>
|
||
|
<path d="M486.56,-405.12C508.53,-446.4 571.23,-548 656,-548 656,-548 656,-548 838,-548 921.39,-548 918.54,-480.99 990,-438 1017.55,-421.43 1050.59,-405.55 1074.35,-394.79"/>
|
||
|
<polygon points="1075.91,-397.92 1083.6,-390.64 1073.05,-391.53 1075.91,-397.92"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a230->p0x7f95e780a110</title>
|
||
|
<path d="M575.96,-169.2C591.41,-202.54 625.52,-276.19 643.82,-315.71"/>
|
||
|
<polygon points="640.74,-317.38 648.12,-324.98 647.09,-314.43 640.74,-317.38"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a230->p0x7f95e7809ed0</title>
|
||
|
<path d="M593.58,-156.25C617.25,-160.43 653.3,-167.42 684,-176 693.8,-178.74 704.28,-182.23 713.79,-185.63"/>
|
||
|
<polygon points="712.68,-188.95 723.27,-189.09 715.08,-182.37 712.68,-188.95"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a230->p0x7f95e7809db0</title>
|
||
|
<path d="M590.66,-143.31C620.13,-132.23 673.38,-112.95 720,-100 746.68,-92.59 777.32,-86.07 800.41,-81.55"/>
|
||
|
<polygon points="801.29,-84.94 810.45,-79.61 799.96,-78.07 801.29,-84.94"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e7809c90</title>
|
||
|
<ellipse cx="837" cy="-373" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="837" y="-370.5" font-family="Helvetica,sans-Serif" font-size="10.00">18</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e780a230->p0x7f95e7809c90</title>
|
||
|
<path d="M584.35,-165.8C612.13,-189.21 670.34,-238.14 720,-279 751.2,-304.67 787.4,-333.93 810.96,-352.89"/>
|
||
|
<polygon points="809.04,-355.84 819.03,-359.38 813.43,-350.38 809.04,-355.84"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809ed0->p0x7f95e7809db0</title>
|
||
|
<path d="M761.39,-182.38C765.58,-177.27 770.12,-171.5 774,-166 791.73,-140.91 792.27,-132.09 810,-107 811.94,-104.25 814.05,-101.43 816.19,-98.67"/>
|
||
|
<polygon points="819.11,-100.62 822.61,-90.62 813.63,-96.26 819.11,-100.62"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809ed0->p0x7f95e7809810</title>
|
||
|
<path d="M771.99,-190.94C811.96,-180.56 893.76,-165.34 954,-194 1024.45,-227.52 1072.91,-311.43 1094.04,-354.53"/>
|
||
|
<polygon points="1091.01,-356.3 1098.48,-363.82 1097.33,-353.29 1091.01,-356.3"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e7809b70</title>
|
||
|
<ellipse cx="927" cy="-221" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="927" y="-218.5" font-family="Helvetica,sans-Serif" font-size="10.00">19</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809ed0->p0x7f95e7809b70</title>
|
||
|
<path d="M773.88,-201.34C804.55,-205.31 855.83,-211.93 890.27,-216.38"/>
|
||
|
<polygon points="890.01,-219.88 900.37,-217.69 890.91,-212.94 890.01,-219.88"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e78096f0</title>
|
||
|
<ellipse cx="1197" cy="-221" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="1197" y="-218.5" font-family="Helvetica,sans-Serif" font-size="10.00">23</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809ed0->p0x7f95e78096f0</title>
|
||
|
<path d="M768.9,-187.23C780.64,-181.79 795.76,-175.76 810,-173 833.56,-168.43 840,-172.73 864,-173 904.01,-173.44 914.2,-170.94 954,-175 1034.91,-183.26 1054.19,-192.32 1134,-208 1142.76,-209.72 1152.21,-211.66 1161.02,-213.5"/>
|
||
|
<polygon points="1160.48,-216.97 1170.99,-215.61 1161.93,-210.12 1160.48,-216.97"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809db0->p0x7f95e7809a50</title>
|
||
|
<path d="M843.34,-92.52C853.17,-124.13 875.42,-192.59 900,-248 931.67,-319.4 977.28,-399.5 1000.75,-439.46"/>
|
||
|
<polygon points="997.86,-441.43 1005.96,-448.27 1003.89,-437.88 997.86,-441.43"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809db0->p0x7f95e7809b70</title>
|
||
|
<path d="M847.92,-91.46C863.24,-116.88 892.75,-165.84 910.78,-195.75"/>
|
||
|
<polygon points="907.82,-197.61 915.98,-204.37 913.81,-194 907.82,-197.61"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809db0->p0x7f95e78096f0</title>
|
||
|
<path d="M863.22,-69.71C917.83,-59.75 1048.96,-43.96 1134,-101 1165.74,-122.29 1182.2,-165.11 1189.96,-193.42"/>
|
||
|
<polygon points="1186.58,-194.3 1192.44,-203.12 1193.36,-192.57 1186.58,-194.3"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e7809150</title>
|
||
|
<ellipse cx="1467" cy="-273" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="1467" y="-270.5" font-family="Helvetica,sans-Serif" font-size="10.00">28</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809db0->p0x7f95e7809150</title>
|
||
|
<path d="M861.33,-66.93C872.85,-63.18 887.04,-58.92 900,-56 950.83,-44.56 963.89,-39 1016,-39 1016,-39 1016,-39 1288,-39 1390.53,-39 1441.75,-183.08 1459.06,-245.13"/>
|
||
|
<polygon points="1455.74,-246.28 1461.72,-255.03 1462.5,-244.46 1455.74,-246.28"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809a50->p0x7f95e7809810</title>
|
||
|
<path d="M1033.33,-450.37C1047.21,-437.12 1067.83,-417.43 1083.57,-402.41"/>
|
||
|
<polygon points="1086.03,-404.9 1090.85,-395.46 1081.2,-399.84 1086.03,-404.9"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809a50->p0x7f95e7809930</title>
|
||
|
<path d="M1033.33,-479.63C1047.21,-492.88 1067.83,-512.57 1083.57,-527.59"/>
|
||
|
<polygon points="1081.2,-530.16 1090.85,-534.54 1086.03,-525.1 1081.2,-530.16"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809a50->p0x7f95e78096f0</title>
|
||
|
<path d="M1040.85,-456.24C1070.78,-444.36 1120.99,-422.93 1134,-408 1174.25,-361.83 1188.53,-288.75 1193.47,-249"/>
|
||
|
<polygon points="1196.96,-249.28 1194.61,-238.95 1190.01,-248.49 1196.96,-249.28"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e78095d0</title>
|
||
|
<ellipse cx="1197" cy="-427" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="1197" y="-424.5" font-family="Helvetica,sans-Serif" font-size="10.00">24</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809a50->p0x7f95e78095d0</title>
|
||
|
<path d="M1043.37,-459.89C1066.89,-455.12 1102.84,-447.74 1134,-441 1142.84,-439.09 1152.37,-436.97 1161.25,-434.96"/>
|
||
|
<polygon points="1162.3,-438.31 1171.28,-432.69 1160.76,-431.49 1162.3,-438.31"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809810->p0x7f95e78096f0</title>
|
||
|
<path d="M1117.25,-364.18C1132.59,-336.28 1163.41,-280.25 1181.61,-247.16"/>
|
||
|
<polygon points="1184.86,-248.53 1186.61,-238.08 1178.72,-245.15 1184.86,-248.53"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809810->p0x7f95e7809150</title>
|
||
|
<path d="M1133.79,-377.71C1186.26,-370.42 1308.56,-350.35 1404,-311 1416.31,-305.92 1429,-298.58 1439.67,-291.7"/>
|
||
|
<polygon points="1441.71,-294.54 1448.1,-286.09 1437.84,-288.72 1441.71,-294.54"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809810->p0x7f95e78095d0</title>
|
||
|
<path d="M1128.85,-391.9C1140.03,-397.74 1154,-405.04 1166.29,-411.47"/>
|
||
|
<polygon points="1164.81,-414.65 1175.29,-416.18 1168.05,-408.44 1164.81,-414.65"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e7809390</title>
|
||
|
<ellipse cx="1287" cy="-385" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="1287" y="-382.5" font-family="Helvetica,sans-Serif" font-size="10.00">26</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809810->p0x7f95e7809390</title>
|
||
|
<path d="M1134.26,-381.59C1164.85,-382.28 1215.55,-383.42 1249.84,-384.19"/>
|
||
|
<polygon points="1249.84,-387.69 1259.92,-384.41 1250,-380.69 1249.84,-387.69"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809c90->p0x7f95e7809930</title>
|
||
|
<path d="M849.22,-389.38C871.85,-421.06 926.28,-490.63 990,-525 1014.6,-538.27 1045.77,-544.21 1069.6,-546.87"/>
|
||
|
<polygon points="1069.36,-550.36 1079.65,-547.85 1070.04,-543.4 1069.36,-550.36"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809c90->p0x7f95e7809b70</title>
|
||
|
<path d="M845.57,-355.69C856.33,-331.8 877.27,-287.73 900,-253 901.84,-250.19 903.89,-247.33 905.99,-244.53"/>
|
||
|
<polygon points="908.91,-246.48 912.37,-236.46 903.42,-242.14 908.91,-246.48"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809c90->p0x7f95e78096f0</title>
|
||
|
<path d="M860.12,-363.61C921.28,-337.64 1092.77,-264.83 1164.18,-234.51"/>
|
||
|
<polygon points="1165.73,-237.66 1173.57,-230.53 1162.99,-231.21 1165.73,-237.66"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809c90->p0x7f95e78095d0</title>
|
||
|
<path d="M859.11,-383.71C883.52,-396.69 924.15,-420.18 954,-447 973.05,-464.12 966.92,-480.9 990,-492 1052.06,-521.83 1131.07,-475.43 1170.79,-446.81"/>
|
||
|
<polygon points="1173.14,-449.42 1179.1,-440.66 1168.98,-443.79 1173.14,-449.42"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809930->p0x7f95e78095d0</title>
|
||
|
<path d="M1121.37,-533.36C1125.55,-528.25 1130.1,-522.48 1134,-517 1151.6,-492.29 1152.4,-483.71 1170,-459 1171.95,-456.26 1174.06,-453.45 1176.21,-450.68"/>
|
||
|
<polygon points="1179.13,-452.64 1182.63,-442.64 1173.66,-448.27 1179.13,-452.64"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809930->p0x7f95e7809390</title>
|
||
|
<path d="M1124.48,-534.98C1136.92,-524.45 1154.44,-509.71 1170,-497 1193.76,-477.59 1201.67,-475.04 1224,-454 1239.19,-439.69 1254.88,-422.19 1266.68,-408.39"/>
|
||
|
<polygon points="1269.36,-410.65 1273.15,-400.75 1264.02,-406.13 1269.36,-410.65"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e78094b0</title>
|
||
|
<ellipse cx="1377" cy="-192" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="1377" y="-189.5" font-family="Helvetica,sans-Serif" font-size="10.00">25</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809930->p0x7f95e78094b0</title>
|
||
|
<path d="M1131.47,-541.07C1175.74,-524.74 1270.98,-482.86 1314,-412 1350.7,-351.55 1328.81,-324.47 1350,-257 1354.03,-244.18 1359.43,-230.3 1364.26,-218.67"/>
|
||
|
<polygon points="1367.63,-219.69 1368.32,-209.12 1361.19,-216.96 1367.63,-219.69"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e7809030</title>
|
||
|
<ellipse cx="1557" cy="-273" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="1557" y="-270.5" font-family="Helvetica,sans-Serif" font-size="10.00">29</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809930->p0x7f95e7809030</title>
|
||
|
<path d="M1134.24,-549C1168.96,-549 1232.07,-549 1286,-549 1286,-549 1286,-549 1378,-549 1495.14,-549 1538.91,-371.23 1551.62,-301.03"/>
|
||
|
<polygon points="1555.08,-301.56 1553.34,-291.11 1548.19,-300.37 1555.08,-301.56"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e7809ff0</title>
|
||
|
<ellipse cx="747" cy="-252" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="747" y="-249.5" font-family="Helvetica,sans-Serif" font-size="10.00">15</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809ff0->p0x7f95e7809db0</title>
|
||
|
<path d="M763.66,-237.73C767.36,-233.84 771.08,-229.47 774,-225 799.78,-185.59 818.32,-133.72 828.09,-102.44"/>
|
||
|
<polygon points="831.5,-103.26 831.06,-92.67 824.8,-101.22 831.5,-103.26"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809ff0->p0x7f95e7809810</title>
|
||
|
<path d="M771.21,-260.36C833.07,-282.65 1002.01,-343.53 1073.43,-369.26"/>
|
||
|
<polygon points="1072.24,-372.56 1082.84,-372.65 1074.62,-365.97 1072.24,-372.56"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809ff0->p0x7f95e7809c90</title>
|
||
|
<path d="M761.34,-267.66C765.53,-272.77 770.07,-278.53 774,-284 791.48,-308.34 792.52,-316.66 810,-341 811.96,-343.73 814.08,-346.54 816.23,-349.3"/>
|
||
|
<polygon points="813.68,-351.72 822.66,-357.34 819.15,-347.34 813.68,-351.72"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809ff0->p0x7f95e7809b70</title>
|
||
|
<path d="M773.5,-247.56C804.17,-242.22 855.82,-233.22 890.4,-227.2"/>
|
||
|
<polygon points="891.29,-230.6 900.54,-225.43 890.09,-223.7 891.29,-230.6"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809b70->p0x7f95e7809a50</title>
|
||
|
<path d="M934.58,-238.52C939.88,-252.67 947.48,-273.09 954,-291 972.78,-342.62 994.19,-403.05 1006.29,-437.4"/>
|
||
|
<polygon points="1003.12,-438.92 1009.74,-447.19 1009.72,-436.59 1003.12,-438.92"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809b70->p0x7f95e78096f0</title>
|
||
|
<path d="M953.9,-217.93C965,-216.76 978.12,-215.57 990,-215 1053.93,-211.91 1070.07,-211.91 1134,-215 1142.45,-215.41 1151.52,-216.13 1160.05,-216.93"/>
|
||
|
<polygon points="1159.8,-220.42 1170.1,-217.93 1160.49,-213.46 1159.8,-220.42"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809b70->p0x7f95e7809390</title>
|
||
|
<path d="M949.59,-230.89C1010.52,-258.8 1183.99,-338.27 1255.06,-370.83"/>
|
||
|
<polygon points="1253.83,-374.11 1264.38,-375.1 1256.75,-367.75 1253.83,-374.11"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7f95e7809270</title>
|
||
|
<ellipse cx="1377" cy="-284" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="1377" y="-281.5" font-family="Helvetica,sans-Serif" font-size="10.00">27</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809b70->p0x7f95e7809270</title>
|
||
|
<path d="M953.7,-224.61C1029.63,-235.29 1253.12,-266.72 1340.45,-279"/>
|
||
|
<polygon points="1340.02,-282.47 1350.41,-280.4 1340.99,-275.54 1340.02,-282.47"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e78096f0->p0x7f95e7809150</title>
|
||
|
<path d="M1223.5,-224.79C1262.54,-230.74 1339.41,-243.05 1404,-257 1413.08,-258.96 1422.84,-261.35 1431.86,-263.67"/>
|
||
|
<polygon points="1431.1,-267.09 1441.67,-266.24 1432.88,-260.32 1431.1,-267.09"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e78096f0->p0x7f95e7809390</title>
|
||
|
<path d="M1207.09,-237.93C1222.5,-266.66 1253.87,-325.12 1272.07,-359.04"/>
|
||
|
<polygon points="1269.02,-360.76 1276.83,-367.91 1275.19,-357.45 1269.02,-360.76"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e78096f0->p0x7f95e78094b0</title>
|
||
|
<path d="M1223.5,-216.85C1254.17,-211.85 1305.82,-203.43 1340.4,-197.8"/>
|
||
|
<polygon points="1341.24,-201.21 1350.54,-196.15 1340.11,-194.3 1341.24,-201.21"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809150->p0x7f95e7809030</title>
|
||
|
<path d="M1494.4,-273C1502.39,-273 1511.31,-273 1519.82,-273"/>
|
||
|
<polygon points="1519.92,-276.5 1529.92,-273 1519.92,-269.5 1519.92,-276.5"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e78095d0->p0x7f95e7809390</title>
|
||
|
<path d="M1219.3,-416.83C1230.14,-411.66 1243.51,-405.28 1255.42,-399.59"/>
|
||
|
<polygon points="1257.07,-402.69 1264.59,-395.22 1254.06,-396.37 1257.07,-402.69"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809390->p0x7f95e7809150</title>
|
||
|
<path d="M1313.93,-382.6C1338.82,-379.26 1376.58,-371.37 1404,-353 1424.51,-339.26 1441.18,-316.5 1452.05,-298.76"/>
|
||
|
<polygon points="1455.14,-300.42 1457.2,-290.02 1449.11,-296.87 1455.14,-300.42"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809390->p0x7f95e7809270</title>
|
||
|
<path d="M1301.37,-369.66C1315.84,-353.05 1339.09,-326.36 1355.79,-307.19"/>
|
||
|
<polygon points="1358.58,-309.32 1362.51,-299.48 1353.3,-304.72 1358.58,-309.32"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e7809270->p0x7f95e7809150</title>
|
||
|
<path d="M1403.93,-280.76C1412.16,-279.73 1421.42,-278.57 1430.22,-277.47"/>
|
||
|
<polygon points="1430.77,-280.93 1440.26,-276.22 1429.9,-273.99 1430.77,-280.93"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e78094b0->p0x7f95e7809150</title>
|
||
|
<path d="M1393.73,-206.48C1407.37,-219.04 1427.3,-237.38 1442.77,-251.62"/>
|
||
|
<polygon points="1440.68,-254.45 1450.4,-258.64 1445.42,-249.3 1440.68,-254.45"/>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7f95e78094b0->p0x7f95e7809030</title>
|
||
|
<path d="M1399.83,-201.93C1431.14,-216.18 1488.97,-242.5 1524.79,-258.8"/>
|
||
|
<polygon points="1523.72,-262.16 1534.27,-263.11 1526.62,-255.79 1523.72,-262.16"/>
|
||
|
</g>
|
||
|
</g>
|
||
|
</svg>
|
||
|
</div><p>With task parallelism, we flow computation naturally with the graph structure. The runtime autonomously distributes tasks across processor cores to obtain maximum task parallelism. You do not need to worry about details of scheduling.</p></section><section id="GraphTraversalDynamicTraversal"><h2><a href="#GraphTraversalDynamicTraversal">Dynamic Traversal</a></h2><p>We can traverse the graph dynamically using <a href="classtf_1_1Subflow.html" class="m-doc">tf::<wbr />Subflow</a> (see <a href="SubflowTasking.html" class="m-doc">Subflow Tasking</a>). We start from the source nodes of zero incoming edges and recursively spawn subflows whenever the dependency of a node is meet. Since we are creating tasks from the execution context of another task, we need to store the task callable in advance.</p><pre class="m-code"><span class="n">tf</span><span class="o">::</span><span class="n">Taskflow</span><span class="w"> </span><span class="n">taskflow</span><span class="p">;</span>
|
||
|
<span class="n">tf</span><span class="o">::</span><span class="n">Executor</span><span class="w"> </span><span class="n">executor</span><span class="p">;</span>
|
||
|
|
||
|
<span class="c1">// task callable of traversing a node using subflow</span>
|
||
|
<span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o"><</span><span class="kt">void</span><span class="p">(</span><span class="n">Node</span><span class="o">*</span><span class="p">,</span><span class="w"> </span><span class="n">tf</span><span class="o">::</span><span class="n">Subflow</span><span class="o">&</span><span class="p">)</span><span class="o">></span><span class="w"> </span><span class="n">traverse</span><span class="p">;</span>
|
||
|
|
||
|
<span class="n">traverse</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="o">&</span><span class="p">]</span><span class="w"> </span><span class="p">(</span><span class="n">Node</span><span class="o">*</span><span class="w"> </span><span class="n">n</span><span class="p">,</span><span class="w"> </span><span class="n">tf</span><span class="o">::</span><span class="n">Subflow</span><span class="o">&</span><span class="w"> </span><span class="n">subflow</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="o">!</span><span class="n">n</span><span class="o">-></span><span class="n">visited</span><span class="p">);</span>
|
||
|
<span class="w"> </span><span class="n">n</span><span class="o">-></span><span class="n">visited</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span><span class="p">;</span>
|
||
|
<span class="w"> </span><span class="k">for</span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="n">n</span><span class="o">-></span><span class="n">successors</span><span class="p">.</span><span class="n">size</span><span class="p">();</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">n</span><span class="o">-></span><span class="n">successors</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-></span><span class="n">dependents</span><span class="p">.</span><span class="n">fetch_sub</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="n">subflow</span><span class="p">.</span><span class="n">emplace</span><span class="p">([</span><span class="n">s</span><span class="o">=</span><span class="n">n</span><span class="o">-></span><span class="n">successors</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="w"> </span><span class="o">&</span><span class="n">traverse</span><span class="p">](</span><span class="n">tf</span><span class="o">::</span><span class="n">Subflow</span><span class="w"> </span><span class="o">&</span><span class="n">subflow</span><span class="p">){</span><span class="w"> </span>
|
||
|
<span class="w"> </span><span class="n">traverse</span><span class="p">(</span><span class="n">s</span><span class="p">,</span><span class="w"> </span><span class="n">subflow</span><span class="p">);</span><span class="w"> </span>
|
||
|
<span class="w"> </span><span class="p">}).</span><span class="n">name</span><span class="p">(</span><span class="n">n</span><span class="o">-></span><span class="n">name</span><span class="p">);</span>
|
||
|
<span class="w"> </span><span class="p">}</span>
|
||
|
<span class="w"> </span><span class="p">}</span>
|
||
|
<span class="p">};</span>
|
||
|
|
||
|
<span class="c1">// create a graph</span>
|
||
|
<span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">Node</span><span class="p">[]</span><span class="o">></span><span class="w"> </span><span class="n">nodes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">make_dag</span><span class="p">(</span><span class="mi">100000</span><span class="p">,</span><span class="w"> </span><span class="mi">4</span><span class="p">);</span>
|
||
|
|
||
|
<span class="c1">// find the source nodes (no incoming edges)</span>
|
||
|
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">Node</span><span class="o">*></span><span class="w"> </span><span class="n">src</span><span class="p">;</span>
|
||
|
<span class="k">for</span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="n">num_nodes</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">dependents</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span>
|
||
|
<span class="w"> </span><span class="n">src</span><span class="p">.</span><span class="n">emplace_back</span><span class="p">(</span><span class="o">&</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">]));</span>
|
||
|
<span class="w"> </span><span class="p">}</span>
|
||
|
<span class="p">}</span>
|
||
|
|
||
|
<span class="c1">// create only tasks for source nodes</span>
|
||
|
<span class="k">for</span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="n">src</span><span class="p">.</span><span class="n">size</span><span class="p">();</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="n">taskflow</span><span class="p">.</span><span class="n">emplace</span><span class="p">([</span><span class="n">s</span><span class="o">=</span><span class="n">src</span><span class="p">[</span><span class="n">i</span><span class="p">],</span><span class="w"> </span><span class="o">&</span><span class="n">traverse</span><span class="p">](</span><span class="n">tf</span><span class="o">::</span><span class="n">Subflow</span><span class="o">&</span><span class="w"> </span><span class="n">subflow</span><span class="p">){</span><span class="w"> </span>
|
||
|
<span class="w"> </span><span class="n">traverse</span><span class="p">(</span><span class="n">s</span><span class="p">,</span><span class="w"> </span><span class="n">subflow</span><span class="p">);</span><span class="w"> </span>
|
||
|
<span class="w"> </span><span class="p">}).</span><span class="n">name</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">name</span><span class="p">);</span>
|
||
|
<span class="p">}</span>
|
||
|
|
||
|
<span class="n">executor</span><span class="p">.</span><span class="n">run</span><span class="p">(</span><span class="n">taskflow</span><span class="p">).</span><span class="n">wait</span><span class="p">();</span>
|
||
|
|
||
|
<span class="c1">// after the graph is traversed, all nodes must be visited with no dependents</span>
|
||
|
<span class="k">for</span><span class="p">(</span><span class="kt">size_t</span><span class="w"> </span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o"><</span><span class="n">num_nodes</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
|
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">visited</span><span class="p">);</span>
|
||
|
<span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">nodes</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">dependents</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>
|
||
|
<span class="p">}</span></pre><p>A partial graph is shown as follows:</p><div class="m-graph"><svg style="width: 87.000rem; height: 68.700rem;" viewBox="0.00 0.00 870.00 687.00">
|
||
|
<g transform="scale(1 1) rotate(0) translate(4 683)">
|
||
|
<title>Taskflow</title>
|
||
|
<g class="m-cluster">
|
||
|
<title>cluster_p0x7fd36b804d90</title>
|
||
|
<polygon points="8,-152 8,-635 854,-635 854,-152 8,-152"/>
|
||
|
<text text-anchor="middle" x="431" y="-623" font-family="Helvetica,sans-Serif" font-size="10.00">Subflow: 3</text>
|
||
|
</g>
|
||
|
<g class="m-cluster">
|
||
|
<title>cluster_p0x7fd36c005e90</title>
|
||
|
<polygon points="16,-204 16,-608 764,-608 764,-204 16,-204"/>
|
||
|
<text text-anchor="middle" x="390" y="-596" font-family="Helvetica,sans-Serif" font-size="10.00">Subflow: 3</text>
|
||
|
</g>
|
||
|
<g class="m-cluster">
|
||
|
<title>cluster_p0x7fd36c005c50</title>
|
||
|
<polygon points="24,-291 24,-581 674,-581 674,-291 24,-291"/>
|
||
|
<text text-anchor="middle" x="349" y="-569" font-family="Helvetica,sans-Serif" font-size="10.00">Subflow: 4</text>
|
||
|
</g>
|
||
|
<g class="m-cluster">
|
||
|
<title>cluster_p0x7fd36c005a10</title>
|
||
|
<polygon points="32,-343 32,-554 584,-554 584,-343 32,-343"/>
|
||
|
<text text-anchor="middle" x="308" y="-542" font-family="Helvetica,sans-Serif" font-size="10.00">Subflow: 6</text>
|
||
|
</g>
|
||
|
<g class="m-cluster">
|
||
|
<title>cluster_p0x7fd36c005470</title>
|
||
|
<polygon points="40,-351 40,-527 494,-527 494,-351 40,-351"/>
|
||
|
<text text-anchor="middle" x="267" y="-515" font-family="Helvetica,sans-Serif" font-size="10.00">Subflow: 9</text>
|
||
|
</g>
|
||
|
<g class="m-cluster">
|
||
|
<title>cluster_p0x7fd36c005590</title>
|
||
|
<polygon points="48,-359 48,-500 404,-500 404,-359 48,-359"/>
|
||
|
<text text-anchor="middle" x="226" y="-488" font-family="Helvetica,sans-Serif" font-size="10.00">Subflow: 11</text>
|
||
|
</g>
|
||
|
<g class="m-cluster">
|
||
|
<title>cluster_p0x7fd36c0057d0</title>
|
||
|
<polygon points="56,-367 56,-473 314,-473 314,-367 56,-367"/>
|
||
|
<text text-anchor="middle" x="185" y="-461" font-family="Helvetica,sans-Serif" font-size="10.00">Subflow: 12</text>
|
||
|
</g>
|
||
|
<g class="m-cluster">
|
||
|
<title>cluster_p0x7fd36c005350</title>
|
||
|
<polygon points="64,-375 64,-446 224,-446 224,-375 64,-375"/>
|
||
|
<text text-anchor="middle" x="144" y="-434" font-family="Helvetica,sans-Serif" font-size="10.00">Subflow: 13</text>
|
||
|
</g>
|
||
|
<g class="m-cluster">
|
||
|
<title>cluster_p0x7fd36c005b30</title>
|
||
|
<polygon points="514,-212 514,-283 674,-283 674,-212 514,-212"/>
|
||
|
<text text-anchor="middle" x="594" y="-271" font-family="Helvetica,sans-Serif" font-size="10.00">Subflow: 4</text>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36b804c70</title>
|
||
|
<ellipse cx="99" cy="-18" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="99" y="-15.5" font-family="Helvetica,sans-Serif" font-size="10.00">0</text>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36b804a30</title>
|
||
|
<ellipse cx="99" cy="-72" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="99" y="-69.5" font-family="Helvetica,sans-Serif" font-size="10.00">1</text>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36b804b50</title>
|
||
|
<ellipse cx="99" cy="-126" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="99" y="-123.5" font-family="Helvetica,sans-Serif" font-size="10.00">2</text>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36b804d90</title>
|
||
|
<ellipse cx="819" cy="-208" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="819" y="-205.5" font-family="Helvetica,sans-Serif" font-size="10.00">3</text>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36c005e90</title>
|
||
|
<ellipse cx="729" cy="-238" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="729" y="-235.5" font-family="Helvetica,sans-Serif" font-size="10.00">3</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7fd36c005e90->p0x7fd36b804d90</title>
|
||
|
<path d="M753.58,-229.96C763.23,-226.67 774.56,-222.81 785,-219.25"/>
|
||
|
<polygon points="786.32,-222.5 794.66,-215.96 784.06,-215.87 786.32,-222.5"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36c005c50</title>
|
||
|
<ellipse cx="639" cy="-317" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="639" y="-314.5" font-family="Helvetica,sans-Serif" font-size="10.00">4</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7fd36c005c50->p0x7fd36c005e90</title>
|
||
|
<path d="M656.3,-302.7C661.92,-297.75 668.25,-292.14 674,-287 684.02,-278.03 695.03,-268.07 704.47,-259.48"/>
|
||
|
<polygon points="706.95,-261.96 711.99,-252.64 702.23,-256.78 706.95,-261.96"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36c005a10</title>
|
||
|
<ellipse cx="549" cy="-374" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="549" y="-371.5" font-family="Helvetica,sans-Serif" font-size="10.00">6</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7fd36c005a10->p0x7fd36c005c50</title>
|
||
|
<path d="M569.06,-361.67C573.93,-358.52 579.16,-355.13 584,-352 592.63,-346.41 602.03,-340.32 610.54,-334.8"/>
|
||
|
<polygon points="612.52,-337.69 619.01,-329.31 608.71,-331.82 612.52,-337.69"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36c005470</title>
|
||
|
<ellipse cx="459" cy="-381" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="459" y="-378.5" font-family="Helvetica,sans-Serif" font-size="10.00">9</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7fd36c005470->p0x7fd36c005a10</title>
|
||
|
<path d="M485.93,-378.94C494,-378.3 503.06,-377.57 511.7,-376.89"/>
|
||
|
<polygon points="512.26,-380.35 521.95,-376.07 511.71,-373.38 512.26,-380.35"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36c005590</title>
|
||
|
<ellipse cx="369" cy="-389" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="369" y="-386.5" font-family="Helvetica,sans-Serif" font-size="10.00">11</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7fd36c005590->p0x7fd36c005470</title>
|
||
|
<path d="M395.93,-386.64C404.09,-385.9 413.26,-385.07 421.99,-384.27"/>
|
||
|
<polygon points="422.31,-387.76 431.95,-383.37 421.68,-380.79 422.31,-387.76"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36c0057d0</title>
|
||
|
<ellipse cx="279" cy="-397" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="279" y="-394.5" font-family="Helvetica,sans-Serif" font-size="10.00">12</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7fd36c0057d0->p0x7fd36c005590</title>
|
||
|
<path d="M305.93,-394.64C314.09,-393.9 323.26,-393.07 331.99,-392.27"/>
|
||
|
<polygon points="332.31,-395.76 341.95,-391.37 331.68,-388.79 332.31,-395.76"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36c005350</title>
|
||
|
<ellipse cx="189" cy="-401" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="189" y="-398.5" font-family="Helvetica,sans-Serif" font-size="10.00">13</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7fd36c005350->p0x7fd36c0057d0</title>
|
||
|
<path d="M216.4,-399.8C224.39,-399.44 233.31,-399.03 241.82,-398.64"/>
|
||
|
<polygon points="242.09,-402.14 251.92,-398.19 241.77,-395.14 242.09,-402.14"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36c005230</title>
|
||
|
<ellipse cx="99" cy="-401" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="99" y="-398.5" font-family="Helvetica,sans-Serif" font-size="10.00">14</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7fd36c005230->p0x7fd36c005350</title>
|
||
|
<path d="M126.4,-401C134.39,-401 143.31,-401 151.82,-401"/>
|
||
|
<polygon points="151.92,-404.5 161.92,-401 151.92,-397.5 151.92,-404.5"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36c0058f0</title>
|
||
|
<ellipse cx="549" cy="-317" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="549" y="-314.5" font-family="Helvetica,sans-Serif" font-size="10.00">6</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7fd36c0058f0->p0x7fd36c005c50</title>
|
||
|
<path d="M576.4,-317C584.39,-317 593.31,-317 601.82,-317"/>
|
||
|
<polygon points="601.92,-320.5 611.92,-317 601.92,-313.5 601.92,-320.5"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36c005b30</title>
|
||
|
<ellipse cx="639" cy="-238" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="639" y="-235.5" font-family="Helvetica,sans-Serif" font-size="10.00">4</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7fd36c005b30->p0x7fd36c005e90</title>
|
||
|
<path d="M666.4,-238C674.39,-238 683.31,-238 691.82,-238"/>
|
||
|
<polygon points="691.92,-241.5 701.92,-238 691.92,-234.5 691.92,-241.5"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36c0056b0</title>
|
||
|
<ellipse cx="549" cy="-238" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="549" y="-235.5" font-family="Helvetica,sans-Serif" font-size="10.00">7</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7fd36c0056b0->p0x7fd36c005b30</title>
|
||
|
<path d="M576.4,-238C584.39,-238 593.31,-238 601.82,-238"/>
|
||
|
<polygon points="601.92,-241.5 611.92,-238 601.92,-234.5 601.92,-241.5"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36c005d70</title>
|
||
|
<ellipse cx="729" cy="-178" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="729" y="-175.5" font-family="Helvetica,sans-Serif" font-size="10.00">3</text>
|
||
|
</g>
|
||
|
<g class="m-edge">
|
||
|
<title>p0x7fd36c005d70->p0x7fd36b804d90</title>
|
||
|
<path d="M753.58,-186.04C763.23,-189.33 774.56,-193.19 785,-196.75"/>
|
||
|
<polygon points="784.06,-200.13 794.66,-200.04 786.32,-193.5 784.06,-200.13"/>
|
||
|
</g>
|
||
|
<g class="m-node m-flat">
|
||
|
<title>p0x7fd36b804eb0</title>
|
||
|
<ellipse cx="99" cy="-661" rx="27" ry="18"/>
|
||
|
<text text-anchor="middle" x="99" y="-658.5" font-family="Helvetica,sans-Serif" font-size="10.00">4</text>
|
||
|
</g>
|
||
|
</g>
|
||
|
</svg>
|
||
|
</div><p>In general, the dynamic version of graph traversal is slower than the static version due to the overhead incurred by spawning subflows. However, it may be useful for the situation where the graph structure is unknown at once but being partially explored during the traversal.</p></section>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</article></main>
|
||
|
<div class="m-doc-search" id="search">
|
||
|
<a href="#!" onclick="return hideSearch()"></a>
|
||
|
<div class="m-container">
|
||
|
<div class="m-row">
|
||
|
<div class="m-col-m-8 m-push-m-2">
|
||
|
<div class="m-doc-search-header m-text m-small">
|
||
|
<div><span class="m-label m-default">Tab</span> / <span class="m-label m-default">T</span> to search, <span class="m-label m-default">Esc</span> to close</div>
|
||
|
<div id="search-symbolcount">…</div>
|
||
|
</div>
|
||
|
<div class="m-doc-search-content">
|
||
|
<form>
|
||
|
<input type="search" name="q" id="search-input" placeholder="Loading …" disabled="disabled" autofocus="autofocus" autocomplete="off" spellcheck="false" />
|
||
|
</form>
|
||
|
<noscript class="m-text m-danger m-text-center">Unlike everything else in the docs, the search functionality <em>requires</em> JavaScript.</noscript>
|
||
|
<div id="search-help" class="m-text m-dim m-text-center">
|
||
|
<p class="m-noindent">Search for symbols, directories, files, pages or
|
||
|
modules. You can omit any prefix from the symbol or file path; adding a
|
||
|
<code>:</code> or <code>/</code> suffix lists all members of given symbol or
|
||
|
directory.</p>
|
||
|
<p class="m-noindent">Use <span class="m-label m-dim">↓</span>
|
||
|
/ <span class="m-label m-dim">↑</span> to navigate through the list,
|
||
|
<span class="m-label m-dim">Enter</span> to go.
|
||
|
<span class="m-label m-dim">Tab</span> autocompletes common prefix, you can
|
||
|
copy a link to the result using <span class="m-label m-dim">⌘</span>
|
||
|
<span class="m-label m-dim">L</span> while <span class="m-label m-dim">⌘</span>
|
||
|
<span class="m-label m-dim">M</span> produces a Markdown link.</p>
|
||
|
</div>
|
||
|
<div id="search-notfound" class="m-text m-warning m-text-center">Sorry, nothing was found.</div>
|
||
|
<ul id="search-results"></ul>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
<script src="search-v2.js"></script>
|
||
|
<script src="searchdata-v2.js" async="async"></script>
|
||
|
<footer><nav>
|
||
|
<div class="m-container">
|
||
|
<div class="m-row">
|
||
|
<div class="m-col-l-10 m-push-l-1">
|
||
|
<p>Taskflow handbook is part of the <a href="https://taskflow.github.io">Taskflow project</a>, copyright © <a href="https://tsung-wei-huang.github.io/">Dr. Tsung-Wei Huang</a>, 2018–2024.<br />Generated by <a href="https://doxygen.org/">Doxygen</a> 1.9.1 and <a href="https://mcss.mosra.cz/">m.css</a>.</p>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</nav></footer>
|
||
|
</body>
|
||
|
</html>
|