<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8" /><title>Learning from Examples » Nondeterministic Control Flow | 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>Nondeterministic Control Flow</h1><nav class="m-block m-default"><h3>Contents</h3><ul><li><a href="#CoinFlippingProblemFormulation">Problem Formulation</a></li><li><a href="#CoinFlippingProbabilistic">Implementation using Conditional Tasking</a></li><li><a href="#CoinFlippingTernaryCoins">Ternary Coins</a></li></ul></nav><p>This page demonstrates how <a href="classtf_1_1Taskflow.html" class="m-doc">Taskflow</a> models <em>nondeterministic control flow</em> using conditional tasking. Nondeterministic control flow is a fundamental abstraction in many optimization, search, and simulation algorithms that rely on randomness, probabilistic pruning, or stochastic convergence. We use a chain of coin-flipping tasks as a concrete example to illustrate how conditional tasks dynamically alter execution paths at runtime.</p><section id="CoinFlippingProblemFormulation"><h2><a href="#CoinFlippingProblemFormulation">Problem Formulation</a></h2><p>Consider a fair binary coin. We repeatedly toss the coin until we observe five consecutive heads. Apparently, the probability of obtaining five heads in a row is 1/32:</p><div class="m-graph"><svg style="width: 54.800rem; height: 4.400rem;" viewBox="0.00 0.00 547.58 44.00"><g transform="scale(1 1) rotate(0) translate(4 40)"><title>G</title><g class="m-node m-flat"><title>a</title><ellipse cx="29.43" cy="-18" rx="29.37" ry="18"/><text text-anchor="middle" x="29.43" y="-15.5" font-family="Helvetica,sans-Serif" font-size="10.00">1/2 (H)</text></g><g class="m-node m-flat"><title>b</title><ellipse cx="128.42" cy="-18" rx="33.61" ry="18"/><text text-anchor="middle" x="128.42" y="-15.5" font-family="Helvetica,sans-Serif" font-size="10.00">1/4 (HH)</text></g><g class="m-edge"><title>a->b</title><path d="M59.01,-18C66.95,-18 75.76,-18 84.34,-18"/><polygon points="84.62,-21.5 94.62,-18 84.62,-14.5 84.62,-21.5"/></g><g class="m-node m-flat"><title>c</title><ellipse cx="236.24" cy="-18" rx="38.03" ry="18"/><text text-anchor="middle" x="236.24" y="-15.5" font-family="Helvetica,sans-Serif" font-size="10.00">1/8 (HHH)</text></g><g class="m-edge"><title>b->c</title><path d="M162.03,-18C170.15,-18 179.02,-18 187.7,-18"/><polygon points="187.73,-21.5 197.73,-18 187.73,-14.5 187.73,-21.5"/></g><g class="m-node m-flat"><title>d</title><ellipse cx="356.42" cy="-18" rx="45.83" ry="18"/><text text-anchor="middle" x="356.42" y="-15.5" font-family="Helvetica,sans-Serif" font-size="10.00">1/16 (HHHH)</text></g><g class="m-edge"><title>c->d</title><path d="M274.63,-18C282.79,-18 291.6,-18 300.29,-18"/><polygon points="300.4,-21.5 310.4,-18 300.4,-14.5 300.4,-21.5"/></g><g class="m-node m-flat"><title>e</title><ellipse cx="488.96" cy="-18" rx="50.75" ry="18"/><text text-anchor="middle" x="488.96" y="-15.5" font-family="Helvetica,sans-Serif" font-size="10.00">1/32 (HHHHH)</text></g><g class="m-edge"><title>d->e</title><path d="M402.34,-18C410.61,-18 419.36,-18 427.99,-18"/><polygon points="428.03,-21.5 438.03,-18 428.03,-14.5 428.03,-21.5"/></g></g></svg></div><p>Equivalently, the expected number of tosses required to observe five consecutive heads is 32. Our goal is to model this stochastic process using Taskflow and verify that the observed execution behavior matches the theoretical expectation.</p></section><section id="CoinFlippingProbabilistic"><h2><a href="#CoinFlippingProbabilistic">Implementation using Conditional Tasking</a></h2><p>We use condition tasks to simulate the five coin tosses. We create five condition tasks each returning a random binary number. If the return is zero (head toss), the execution moves to the next condition task; or it (tail toss) goes back to the first condition task to restart the simulation. This structure naturally expresses nondeterministic control flow without explicit loops or synchronization:</p><pre class="m-code"><span class="cp">#include</span><span class="w"> </span><span class="cpf"><taskflow/taskflow.hpp></span><span class="kt">int</span><span class="w"> </span><span class="nf">main</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">Taskflow</span><span class="w"> </span><span class="n">taskflow</span><span class="p">;</span><span class="w"> </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="w"> </span><span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">rounds</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">10000</span><span class="p">;</span><span class="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">tosses</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="w"> </span><span class="kt">size_t</span><span class="w"> </span><span class="n">total_tosses</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="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">average_tosses</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">0.0</span><span class="p">;</span><span class="w"> </span><span class="w"> </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">A</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="o">&</span><span class="p">](){</span><span class="w"> </span><span class="n">tosses</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="p">.</span><span class="n">name</span><span class="p">(</span><span class="s">"init"</span><span class="p">);</span><span class="w"> </span><span class="w"> </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">B</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="o">&</span><span class="p">](){</span><span class="w"> </span><span class="o">++</span><span class="n">tosses</span><span class="p">;</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">2</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="s">"flip-coin-1"</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">C</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="o">&</span><span class="p">](){</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">2</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="s">"flip-coin-2"</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">D</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="o">&</span><span class="p">](){</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">2</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="s">"flip-coin-3"</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">E</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="o">&</span><span class="p">](){</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">2</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="s">"flip-coin-4"</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">F</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="o">&</span><span class="p">](){</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">2</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="s">"flip-coin-5"</span><span class="p">);</span><span class="w"> </span><span class="w"> </span><span class="c1">// reach the target; record the number of tosses </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">G</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="o">&</span><span class="p">](){</span><span class="w"> </span><span class="n">total_tosses</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">tosses</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="s">"stop"</span><span class="p">);</span><span class="w"> </span><span class="w"> </span><span class="n">A</span><span class="p">.</span><span class="n">precede</span><span class="p">(</span><span class="n">B</span><span class="p">);</span><span class="w"> </span><span class="w"> </span><span class="c1">// five probabilistic conditions</span><span class="w"> </span><span class="n">B</span><span class="p">.</span><span class="n">precede</span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">);</span><span class="w"> </span><span class="n">C</span><span class="p">.</span><span class="n">precede</span><span class="p">(</span><span class="n">D</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">);</span><span class="w"> </span><span class="n">D</span><span class="p">.</span><span class="n">precede</span><span class="p">(</span><span class="n">E</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">);</span><span class="w"> </span><span class="n">E</span><span class="p">.</span><span class="n">precede</span><span class="p">(</span><span class="n">F</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">);</span><span class="w"> </span><span class="n">F</span><span class="p">.</span><span class="n">precede</span><span class="p">(</span><span class="n">G</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">);</span><span class="w"> </span><span class="w"> </span><span class="c1">// repeat the flip-coin simulation by rounds times</span><span class="w"> </span><span class="n">executor</span><span class="p">.</span><span class="n">run_n</span><span class="p">(</span><span class="n">taskflow</span><span class="p">,</span><span class="w"> </span><span class="n">rounds</span><span class="p">).</span><span class="n">wait</span><span class="p">();</span><span class="w"> </span><span class="w"> </span><span class="c1">// calculate the expected number of tosses</span><span class="w"> </span><span class="n">average_tosses</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">total_tosses</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">rounds</span><span class="p">;</span><span class="w"> </span><span class="w"> </span><span class="n">assert</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">fabs</span><span class="p">(</span><span class="n">average_tosses</span><span class="mf">-32.0</span><span class="p">)</span><span class="o"><</span><span class="mf">1.0</span><span class="p">);</span><span class="w"> </span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="p">}</span></pre><p>Running the taskflow by a fair number of times, the average tosses we have is close to 32. The corresponding taskflow diagram is shown below:</p><div class="m-graph"><svg style="width: 24.600rem; height: 53.200rem;" viewBox="0.00 0.00 246.22 532.00"><g transform="scale(1 1) rotate(0) translate(4 528)"><title>Taskflow</title><g class="m-node m-flat"><title>p0x7fa9a4803e30</title><ellipse cx="144.11" cy="-506" rx="27" ry="18"/><text text-anchor="middle" x="144.11" y="-503.5" font-family="Helvetica,sans-Serif" font-size="10.00">init</text></g><g class="m-node"><title>p0x7fa9a4803f50</title><polygon points="144.11,-451 89.89,-433 144.11,-415 198.34,-433 144.11,-451"/><text text-anchor="middle" x="144.11" y="-430.5" font-family="Helvetica,sans-Serif" font-size="10.00">flip-coin-1</text></g><g class="m-edge"><title>p0x7fa9a4803e30->p0x7fa9a4803f50</title><path d="M144.11,-487.81C144.11,-479.79 144.11,-470.05 144.11,-461.07"/><polygon points="147.61,-461.03 144.11,-451.03 140.61,-461.03 147.61,-461.03"/></g><g class="m-edge"><title>p0x7fa9a4803f50->p0x7fa9a4803f50</title><path stroke-dasharray="5,2" d="M178.99,-439.43C198.37,-440.63 216.22,-438.48 216.22,-433 216.22,-428.5 204.21,-426.25 189.19,-426.25"/><polygon points="188.87,-422.76 178.99,-426.57 189.09,-429.75 188.87,-422.76"/><text text-anchor="middle" x="219.72" y="-430.5" font-family="Helvetica,sans-Serif" font-size="10.00">1</text></g><g class="m-node"><title>p0x7fa9a4804070</title><polygon points="54.11,-368 -0.11,-350 54.11,-332 108.34,-350 54.11,-368"/><text text-anchor="middle" x="54.11" y="-347.5" font-family="Helvetica,sans-Serif" font-size="10.00">flip-coin-2</text></g><g class="m-edge"><title>p0x7fa9a4803f50->p0x7fa9a4804070</title><path stroke-dasharray="5,2" d="M121.93,-422.19C109.83,-416.12 95.12,-407.47 84.11,-397 77.36,-390.58 71.39,-382.35 66.59,-374.64"/><polygon points="69.58,-372.82 61.52,-365.96 63.54,-376.35 69.58,-372.82"/><text text-anchor="middle" x="87.61" y="-389" font-family="Helvetica,sans-Serif" font-size="10.00">0</text></g><g class="m-edge"><title>p0x7fa9a4804070->p0x7fa9a4803f50</title><path stroke-dasharray="5,2" d="M68.08,-363.57C82.57,-376.61 105.43,-397.19 122.31,-412.38"/><polygon points="120.28,-415.26 130.05,-419.34 124.96,-410.05 120.28,-415.26"/><text text-anchor="middle" x="107.61" y="-389" font-family="Helvetica,sans-Serif" font-size="10.00">1</text></g><g class="m-node"><title>p0x7fa9a4804190</title><polygon points="97.11,-285 42.89,-267 97.11,-249 151.34,-267 97.11,-285"/><text text-anchor="middle" x="97.11" y="-264.5" font-family="Helvetica,sans-Serif" font-size="10.00">flip-coin-3</text></g><g class="m-edge"><title>p0x7fa9a4804070->p0x7fa9a4804190</title><path stroke-dasharray="5,2" d="M61.8,-334.52C68.12,-322.61 77.2,-305.51 84.57,-291.62"/><polygon points="87.75,-293.1 89.35,-282.63 81.57,-289.82 87.75,-293.1"/><text text-anchor="middle" x="81.61" y="-306" font-family="Helvetica,sans-Serif" font-size="10.00">0</text></g><g class="m-edge"><title>p0x7fa9a4804190->p0x7fa9a4803f50</title><path stroke-dasharray="5,2" d="M102.13,-283.47C106.28,-296.4 112.26,-315.35 117.11,-332 124.43,-357.14 132.16,-386.04 137.46,-406.28"/><polygon points="134.09,-407.22 140,-416.01 140.87,-405.45 134.09,-407.22"/><text text-anchor="middle" x="129.61" y="-347.5" font-family="Helvetica,sans-Serif" font-size="10.00">1</text></g><g class="m-node"><title>p0x7fa9a48042b0</title><polygon points="143.11,-202 88.89,-184 143.11,-166 197.34,-184 143.11,-202"/><text text-anchor="middle" x="143.11" y="-181.5" font-family="Helvetica,sans-Serif" font-size="10.00">flip-coin-4</text></g><g class="m-edge"><title>p0x7fa9a4804190->p0x7fa9a48042b0</title><path stroke-dasharray="5,2" d="M105.34,-251.52C112.14,-239.54 121.93,-222.29 129.84,-208.36"/><polygon points="133.06,-209.78 134.96,-199.36 126.98,-206.32 133.06,-209.78"/><text text-anchor="middle" x="125.61" y="-223" font-family="Helvetica,sans-Serif" font-size="10.00">0</text></g><g class="m-edge"><title>p0x7fa9a48042b0->p0x7fa9a4803f50</title><path stroke-dasharray="5,2" d="M148.38,-200.29C152.5,-213.12 157.89,-232.01 160.11,-249 167.37,-304.6 157.11,-370.14 149.97,-405.75"/><polygon points="146.5,-405.29 147.88,-415.79 153.35,-406.72 146.5,-405.29"/><text text-anchor="middle" x="165.61" y="-306" font-family="Helvetica,sans-Serif" font-size="10.00">1</text></g><g class="m-node"><title>p0x7fa9a48043d0</title><polygon points="184.11,-119 129.89,-101 184.11,-83 238.34,-101 184.11,-119"/><text text-anchor="middle" x="184.11" y="-98.5" font-family="Helvetica,sans-Serif" font-size="10.00">flip-coin-5</text></g><g class="m-edge"><title>p0x7fa9a48042b0->p0x7fa9a48043d0</title><path stroke-dasharray="5,2" d="M150.63,-168.14C156.59,-156.38 165.02,-139.72 171.93,-126.06"/><polygon points="175.25,-127.27 176.64,-116.76 169,-124.1 175.25,-127.27"/><text text-anchor="middle" x="168.61" y="-140" font-family="Helvetica,sans-Serif" font-size="10.00">0</text></g><g class="m-edge"><title>p0x7fa9a48043d0->p0x7fa9a4803f50</title><path stroke-dasharray="5,2" d="M195.75,-115.29C207.87,-130.55 225.11,-156.84 225.11,-183 225.11,-351 225.11,-351 225.11,-351 225.11,-380.67 197.6,-403.27 174.64,-416.96"/><polygon points="172.81,-413.98 165.82,-421.94 176.25,-420.07 172.81,-413.98"/><text text-anchor="middle" x="228.61" y="-264.5" font-family="Helvetica,sans-Serif" font-size="10.00">1</text></g><g class="m-node m-flat"><title>p0x7fa9a48044f0</title><ellipse cx="184.11" cy="-18" rx="27" ry="18"/><text text-anchor="middle" x="184.11" y="-15.5" font-family="Helvetica,sans-Serif" font-size="10.00">stop</text></g><g class="m-edge"><title>p0x7fa9a48043d0->p0x7fa9a48044f0</title><path stroke-dasharray="5,2" d="M184.11,-82.82C184.11,-72.19 184.11,-58.31 184.11,-46.2"/><polygon points="187.61,-46.15 184.11,-36.15 180.61,-46.15 187.61,-46.15"/><text text-anchor="middle" x="187.61" y="-57" font-family="Helvetica,sans-Serif" font-size="10.00">0</text></g></g></svg></div><p>Although the execution of this taskflow is non-deterministic, its control flow can expand to a tree of tasks based on our scheduling rule for conditional tasking (see <a href="ConditionalTasking.html" class="m-doc">Conditional Tasking</a>). Each path from the root to a leaf represents a result of five heads, and none of them can overlap at the same time (no task race). You must follow the same rule when creating a probabilistic framework using conditional tasking.</p></section><section id="CoinFlippingTernaryCoins"><h2><a href="#CoinFlippingTernaryCoins">Ternary Coins</a></h2><p>We can extend the binary coin example to a ternary case. Each condition task has one successor going back to the beginning and two successors moving to the next task. The expected number of tosses to reach five identical results is 3*3*3*3*3 = 243.</p><pre class="m-code"><span class="n">tf</span><span class="o">::</span><span class="n">Task</span><span class="w"> </span><span class="n">A</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="w"> </span><span class="p">[</span><span class="o">&</span><span class="p">](){</span><span class="w"> </span><span class="n">tosses</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="p">)</span><span class="w"> </span><span class="p">.</span><span class="n">name</span><span class="p">(</span><span class="s">"init"</span><span class="p">);</span><span class="w"> </span><span class="c1">// start over the flip again</span><span class="n">tf</span><span class="o">::</span><span class="n">Task</span><span class="w"> </span><span class="n">B</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="o">&</span><span class="p">](){</span><span class="w"> </span><span class="o">++</span><span class="n">tosses</span><span class="p">;</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">3</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="s">"flip-coin-1"</span><span class="p">);</span><span class="n">tf</span><span class="o">::</span><span class="n">Task</span><span class="w"> </span><span class="n">C</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="o">&</span><span class="p">](){</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">3</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="s">"flip-coin-2"</span><span class="p">);</span><span class="n">tf</span><span class="o">::</span><span class="n">Task</span><span class="w"> </span><span class="n">D</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="o">&</span><span class="p">](){</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">3</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="s">"flip-coin-3"</span><span class="p">);</span><span class="n">tf</span><span class="o">::</span><span class="n">Task</span><span class="w"> </span><span class="n">E</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="o">&</span><span class="p">](){</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">3</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="s">"flip-coin-4"</span><span class="p">);</span><span class="n">tf</span><span class="o">::</span><span class="n">Task</span><span class="w"> </span><span class="n">F</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="o">&</span><span class="p">](){</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">rand</span><span class="p">()</span><span class="o">%</span><span class="mi">3</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="s">"flip-coin-5"</span><span class="p">);</span><span class="c1">// reach the target; record the number of tosses </span><span class="n">tf</span><span class="o">::</span><span class="n">Task</span><span class="w"> </span><span class="n">G</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="o">&</span><span class="p">](){</span><span class="w"> </span><span class="n">total_tosses</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">tosses</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="s">"stop"</span><span class="p">);</span><span class="n">A</span><span class="p">.</span><span class="n">precede</span><span class="p">(</span><span class="n">B</span><span class="p">);</span><span class="c1">// five probabilistic conditions</span><span class="n">B</span><span class="p">.</span><span class="n">precede</span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">);</span><span class="n">C</span><span class="p">.</span><span class="n">precede</span><span class="p">(</span><span class="n">D</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">);</span><span class="n">D</span><span class="p">.</span><span class="n">precede</span><span class="p">(</span><span class="n">E</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">);</span><span class="n">E</span><span class="p">.</span><span class="n">precede</span><span class="p">(</span><span class="n">F</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">);</span><span class="n">F</span><span class="p">.</span><span class="n">precede</span><span class="p">(</span><span class="n">G</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">,</span><span class="w"> </span><span class="n">B</span><span class="p">);</span><span class="c1">// repeat the flip-coin simulation by rounds times</span><span class="n">executor</span><span class="p">.</span><span class="n">run_n</span><span class="p">(</span><span class="n">taskflow</span><span class="p">,</span><span class="w"> </span><span class="n">rounds</span><span class="p">).</span><span class="n">wait</span><span class="p">();</span><span class="c1">// calculate the expected number of tosses</span><span class="n">average_tosses</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">total_tosses</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">rounds</span><span class="p">;</span><span class="n">assert</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">fabs</span><span class="p">(</span><span class="n">average_tosses</span><span class="mf">-243.0</span><span class="p">)</span><span class="o"><</span><span class="mf">1.0</span><span class="p">);</span></pre><div class="m-graph"><svg style="width: 36.800rem; height: 53.200rem;" viewBox="0.00 0.00 368.22 532.00"><g transform="scale(1 1) rotate(0) translate(4 528)"><title>Taskflow</title><g class="m-node m-flat"><title>p0x7fca00803e30</title><ellipse cx="187.11" cy="-506" rx="27" ry="18"/><text text-anchor="middle" x="187.11" y="-503.5" font-family="Helvetica,sans-Serif" font-size="10.00">init</text></g><g class="m-node"><title>p0x7fca00803f50</title><polygon points="187.11,-451 132.89,-433 187.11,-415 241.34,-433 187.11,-451"/><text text-anchor="middle" x="187.11" y="-430.5" font-family="Helvetica,sans-Serif" font-size="10.00">flip-coin-1</text></g><g class="m-edge"><title>p0x7fca00803e30->p0x7fca00803f50</title><path d="M187.11,-487.81C187.11,-479.79 187.11,-470.05 187.11,-461.07"/><polygon points="190.61,-461.03 187.11,-451.03 183.61,-461.03 190.61,-461.03"/></g><g class="m-edge"><title>p0x7fca00803f50->p0x7fca00803f50</title><path stroke-dasharray="5,2" d="M231.48,-436.37C246.83,-436.41 259.22,-435.29 259.22,-433 259.22,-431.25 251.96,-430.18 241.66,-429.79"/><polygon points="241.53,-426.29 231.48,-429.63 241.42,-433.29 241.53,-426.29"/><text text-anchor="middle" x="262.72" y="-430.5" font-family="Helvetica,sans-Serif" font-size="10.00">1</text></g><g class="m-edge"><title>p0x7fca00803f50->p0x7fca00803f50</title><path stroke-dasharray="5,2" d="M223.67,-438.99C250.42,-441.01 277.22,-439.01 277.22,-433 277.22,-427.76 256.89,-425.57 233.96,-426.43"/><polygon points="233.45,-422.95 223.67,-427.01 233.85,-429.94 233.45,-422.95"/><text text-anchor="middle" x="280.72" y="-430.5" font-family="Helvetica,sans-Serif" font-size="10.00">2</text></g><g class="m-node"><title>p0x7fca00804070</title><polygon points="54.11,-368 -0.11,-350 54.11,-332 108.34,-350 54.11,-368"/><text text-anchor="middle" x="54.11" y="-347.5" font-family="Helvetica,sans-Serif" font-size="10.00">flip-coin-2</text></g><g class="m-edge"><title>p0x7fca00803f50->p0x7fca00804070</title><path stroke-dasharray="5,2" d="M138.34,-431.1C111.32,-427.91 79.4,-419.18 60.11,-397 55.6,-391.82 53.43,-384.98 52.54,-378.16"/><polygon points="56.02,-377.54 52.05,-367.72 49.03,-377.87 56.02,-377.54"/><text text-anchor="middle" x="63.61" y="-389" font-family="Helvetica,sans-Serif" font-size="10.00">0</text></g><g class="m-edge"><title>p0x7fca00804070->p0x7fca00803f50</title><path stroke-dasharray="5,2" d="M62.87,-365.18C69.73,-375.27 80.11,-388.49 92.11,-397 108.29,-408.47 128.67,-416.63 146.4,-422.17"/><polygon points="145.9,-425.67 156.48,-425.13 147.87,-418.95 145.9,-425.67"/><text text-anchor="middle" x="95.61" y="-389" font-family="Helvetica,sans-Serif" font-size="10.00">1</text></g><g class="m-edge"><title>p0x7fca00804070->p0x7fca00803f50</title><path stroke-dasharray="5,2" d="M70.86,-362.51C84.9,-372.04 105.58,-385.78 124.11,-397 135.12,-403.66 147.46,-410.62 158.27,-416.57"/><polygon points="156.86,-419.78 167.32,-421.49 160.21,-413.63 156.86,-419.78"/><text text-anchor="middle" x="127.61" y="-389" font-family="Helvetica,sans-Serif" font-size="10.00">2</text></g><g class="m-node"><title>p0x7fca00804190</title><polygon points="140.11,-285 85.89,-267 140.11,-249 194.34,-267 140.11,-285"/><text text-anchor="middle" x="140.11" y="-264.5" font-family="Helvetica,sans-Serif" font-size="10.00">flip-coin-3</text></g><g class="m-edge"><title>p0x7fca00804070->p0x7fca00804190</title><path stroke-dasharray="5,2" d="M67.55,-336.34C81.35,-323.34 103.03,-302.92 119.11,-287.79"/><polygon points="121.61,-290.24 126.49,-280.83 116.81,-285.14 121.61,-290.24"/><text text-anchor="middle" x="105.61" y="-306" font-family="Helvetica,sans-Serif" font-size="10.00">0</text></g><g class="m-edge"><title>p0x7fca00804190->p0x7fca00803f50</title><path stroke-dasharray="5,2" d="M141.82,-284.58C144.19,-304.66 149.2,-339.37 158.11,-368 162.39,-381.74 168.88,-396.41 174.64,-408.23"/><polygon points="171.63,-410.04 179.24,-417.41 177.89,-406.9 171.63,-410.04"/><text text-anchor="middle" x="161.61" y="-347.5" font-family="Helvetica,sans-Serif" font-size="10.00">1</text></g><g class="m-edge"><title>p0x7fca00804190->p0x7fca00803f50</title><path stroke-dasharray="5,2" d="M148.44,-282.29C151.8,-288.5 155.49,-295.95 158.11,-303 170.91,-337.42 179.03,-379.19 183.33,-405.69"/><polygon points="179.9,-406.37 184.89,-415.71 186.81,-405.29 179.9,-406.37"/><text text-anchor="middle" x="178.61" y="-347.5" font-family="Helvetica,sans-Serif" font-size="10.00">2</text></g><g class="m-node"><title>p0x7fca008042b0</title><polygon points="223.11,-202 168.89,-184 223.11,-166 277.34,-184 223.11,-202"/><text text-anchor="middle" x="223.11" y="-181.5" font-family="Helvetica,sans-Serif" font-size="10.00">flip-coin-4</text></g><g class="m-edge"><title>p0x7fca00804190->p0x7fca008042b0</title><path stroke-dasharray="5,2" d="M153.45,-252.99C166.72,-240.04 187.25,-219.99 202.6,-205.02"/><polygon points="205.37,-207.2 210.08,-197.71 200.48,-202.19 205.37,-207.2"/><text text-anchor="middle" x="189.61" y="-223" font-family="Helvetica,sans-Serif" font-size="10.00">0</text></g><g class="m-edge"><title>p0x7fca008042b0->p0x7fca00803f50</title><path stroke-dasharray="5,2" d="M221.2,-201.55C216.99,-237.31 206.31,-324.47 194.11,-397 193.62,-399.92 193.07,-402.97 192.5,-406"/><polygon points="189.02,-405.52 190.53,-416.01 195.89,-406.87 189.02,-405.52"/><text text-anchor="middle" x="211.61" y="-306" font-family="Helvetica,sans-Serif" font-size="10.00">1</text></g><g class="m-edge"><title>p0x7fca008042b0->p0x7fca00803f50</title><path stroke-dasharray="5,2" d="M228,-200.52C229.65,-206.54 231.29,-213.53 232.11,-220 232.73,-224.85 232.38,-226.12 232.11,-231 228.72,-292.26 226.36,-307.68 215.11,-368 212.68,-381.03 213.14,-384.73 208.11,-397 206.45,-401.06 204.37,-405.2 202.16,-409.15"/><polygon points="199.07,-407.49 196.93,-417.87 205.07,-411.09 199.07,-407.49"/><text text-anchor="middle" x="228.61" y="-306" font-family="Helvetica,sans-Serif" font-size="10.00">2</text></g><g class="m-node"><title>p0x7fca008043d0</title><polygon points="306.11,-119 251.89,-101 306.11,-83 360.34,-101 306.11,-119"/><text text-anchor="middle" x="306.11" y="-98.5" font-family="Helvetica,sans-Serif" font-size="10.00">flip-coin-5</text></g><g class="m-edge"><title>p0x7fca008042b0->p0x7fca008043d0</title><path stroke-dasharray="5,2" d="M236.45,-169.99C249.72,-157.04 270.25,-136.99 285.6,-122.02"/><polygon points="288.37,-124.2 293.08,-114.71 283.48,-119.19 288.37,-124.2"/><text text-anchor="middle" x="272.61" y="-140" font-family="Helvetica,sans-Serif" font-size="10.00">0</text></g><g class="m-edge"><title>p0x7fca008043d0->p0x7fca00803f50</title><path stroke-dasharray="5,2" d="M306.11,-119.07C306.11,-135.46 306.11,-160.92 306.11,-183 306.11,-351 306.11,-351 306.11,-351 306.11,-389.78 262.39,-411.31 227.94,-422.25"/><polygon points="226.65,-418.98 218.07,-425.19 228.65,-425.69 226.65,-418.98"/><text text-anchor="middle" x="309.61" y="-264.5" font-family="Helvetica,sans-Serif" font-size="10.00">1</text></g><g class="m-edge"><title>p0x7fca008043d0->p0x7fca00803f50</title><path stroke-dasharray="5,2" d="M318.32,-115.2C331.03,-130.36 349.11,-156.57 349.11,-183 349.11,-351 349.11,-351 349.11,-351 349.11,-400.95 286.74,-420.1 239.4,-427.44"/><polygon points="238.67,-424.01 229.25,-428.87 239.64,-430.94 238.67,-424.01"/><text text-anchor="middle" x="352.61" y="-264.5" font-family="Helvetica,sans-Serif" font-size="10.00">2</text></g><g class="m-node m-flat"><title>p0x7fca008044f0</title><ellipse cx="306.11" cy="-18" rx="27" ry="18"/><text text-anchor="middle" x="306.11" y="-15.5" font-family="Helvetica,sans-Serif" font-size="10.00">stop</text></g><g class="m-edge"><title>p0x7fca008043d0->p0x7fca008044f0</title><path stroke-dasharray="5,2" d="M306.11,-82.82C306.11,-72.19 306.11,-58.31 306.11,-46.2"/><polygon points="309.61,-46.15 306.11,-36.15 302.61,-46.15 309.61,-46.15"/><text text-anchor="middle" x="309.61" y="-57" font-family="Helvetica,sans-Serif" font-size="10.00">0</text></g></g></svg></div><p>This pattern extends naturally to probabilistic conditions of any degree, making conditional tasking a powerful tool for expressing nondeterministic control flow in stochastic algorithms.</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 ormodules. 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 ordirectory.</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 cancopy 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–2026.<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>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。