<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>The Bear&#39;s Toes</title>
<link>https://bear-toes.pages.dev/</link>
<atom:link href="https://bear-toes.pages.dev/index.xml" rel="self" type="application/rss+xml"/>
<description></description>
<generator>quarto-1.9.38</generator>
<lastBuildDate>Sun, 13 Apr 2025 23:00:00 GMT</lastBuildDate>
<item>
  <title>Distributed Training with DistributedDataParallel</title>
  <link>https://bear-toes.pages.dev/posts/torch-distributed-explained/</link>
  <description><![CDATA[ 





<section id="what-is-distributeddataparallel-ddp" class="level2">
<h2 class="anchored" data-anchor-id="what-is-distributeddataparallel-ddp"># What is DistributedDataParallel (DDP)?</h2>
<p><code>DistributedDataParallel</code> is a way to parallelize training across multiple GPUs or nodes. It is an extension of <code>DataParallel</code> that provides more flexibility and scalability. <code>DataParallel</code> (DP) is an older approach to data parallelism. DP is trivially simple (with just one extra line of code) but it is less performant. DDP improves upon the architecture in a few ways:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 63%">
<col style="width: 36%">
</colgroup>
<thead>
<tr class="header">
<th><code>DataParallel</code></th>
<th><code>DistributedDataParallel</code></th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Simpler to use</td>
<td>More involved changes to use</td>
</tr>
<tr class="even">
<td>More overhead; model is replicated and destroyed at each forward pass</td>
<td>Model is replicated only once at the start</td>
</tr>
<tr class="odd">
<td>Only supports single-node parallelism</td>
<td>Supports single-node and multi-node parallelism</td>
</tr>
<tr class="even">
<td>Slower; uses multithreading on a single process and runs into Global Interpreter Lock (GIL) contention</td>
<td>Faster (no GIL contention) because it uses multiprocessing</td>
</tr>
</tbody>
</table>
</section>
<section id="multi-gpu-training-with-ddp" class="level2">
<h2 class="anchored" data-anchor-id="multi-gpu-training-with-ddp"># Multi-GPU Training with DDP</h2>
<p>DDP uses multiprocessing to copy the model to each GPU (<code>rank</code>). This allows the model (and code) to only be copied to each process once at the start of the script. Multiprocessing pickles Python objects to serialize across processes. This means <em>all</em> objects must be <a href="https://docs.python.org/3/library/pickle.html">pickleable</a>.</p>
<div class="callout callout-style-default callout-important callout-titled" title="All objects sent to each process must be pickleable">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Important</span>All objects sent to each process must be pickleable
</div>
</div>
<div class="callout-body-container callout-body">
<p><a href="https://docs.python.org/3/library/pickle.html#what-can-be-pickled-and-unpickled">What can be pickled and unpickled?</a></p>
<p><strong>Some objects that can’t be pickled:</strong></p>
<ul>
<li>Generators</li>
<li>Database connections</li>
<li>Sockets</li>
<li>File descriptors</li>
<li>Lambdas</li>
</ul>
</div>
</div>
<p>The basic outline of DDP training is:</p>
<ol type="1">
<li>Setup the communications by setting the host and port</li>
<li>Spawn a training process for each GPU with <code>torch.multiprocessing.spawn</code></li>
<li>Initialize the process group using <code>init_process_group</code>:
<ul>
<li>GPU - <code>"nccl"</code></li>
<li>CPU - <code>"gloo"</code></li>
</ul></li>
<li>Wrap the model with <code>DistributedDataParallel</code></li>
<li>Create a <code>DistributedSampler</code> and <code>DataLoader</code> for the dataset</li>
<li>Train the model and update sampler with the epoch</li>
<li>Destroy the process group using <code>destroy_process_group</code></li>
</ol>
<div id="multi-gpu" class="cell" data-execution_count="1">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> torch.utils.data.distributed <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> DistributedSampler</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> torch.distributed <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> init_process_group, destroy_process_group</span>
<span id="cb1-3"></span>
<span id="cb1-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> main(</span>
<span id="cb1-5">    rank: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>, <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># rank is the GPU number</span></span>
<span id="cb1-6">    world_size: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>, <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># world_size is the number of processes, typically set to the number of GPUs</span></span>
<span id="cb1-7">    train_path: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>,</span>
<span id="cb1-8">    random_state: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>,</span>
<span id="cb1-9">    lr: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>,</span>
<span id="cb1-10">    epochs: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>,</span>
<span id="cb1-11">    num_workers: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>,</span>
<span id="cb1-12">    batch_size: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>,</span>
<span id="cb1-13">) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>:</span>
<span id="cb1-14">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... Other setup</span></span>
<span id="cb1-15"></span>
<span id="cb1-16">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># initialize the process group for distributed training</span></span>
<span id="cb1-17">    init_process_group(</span>
<span id="cb1-18">        backend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nccl"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> torch.cuda.is_available() <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gloo"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># CPU only works on gloo backend</span></span>
<span id="cb1-19">        rank<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>rank,</span>
<span id="cb1-20">        world_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>world_size,</span>
<span id="cb1-21">    )</span>
<span id="cb1-22"></span>
<span id="cb1-23">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># we need to divide the workers and batch across the different processes used in distributed training</span></span>
<span id="cb1-24">    num_workers_per_proc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> num_workers <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> world_size <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># avoids CPU contentionn</span></span>
<span id="cb1-25">    batch_size_per_proc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> batch_size <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> world_size   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># avoids OOM</span></span>
<span id="cb1-26"></span>
<span id="cb1-27">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># DistributedSampler ensures that training data is chunked across GPUs without overlapping samples</span></span>
<span id="cb1-28">    train_sampler <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> DistributedSampler(train_dataset)</span>
<span id="cb1-29">    val_sampler <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> DistributedSampler(</span>
<span id="cb1-30">        val_dataset,</span>
<span id="cb1-31">        shuffle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># don't shuffle the validation dataset</span></span>
<span id="cb1-32">        drop_last<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># DistributedSampler will append additional samples to fill an incomplete batch.  We don't want that for the validation dataset.</span></span>
<span id="cb1-33">    )</span>
<span id="cb1-34"></span>
<span id="cb1-35">    train_dataloader <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> DataLoader(</span>
<span id="cb1-36">        train_dataset,</span>
<span id="cb1-37">        shuffle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># don't shuffle if using DistributedSampler as that's done within the sampler</span></span>
<span id="cb1-38">        sampler<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>train_sampler,</span>
<span id="cb1-39">        num_workers<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>num_workers_per_proc,</span>
<span id="cb1-40">        batch_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>batch_size_per_proc,</span>
<span id="cb1-41">        pin_memory<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>,</span>
<span id="cb1-42">        collate_fn<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>collate_rowgroups,</span>
<span id="cb1-43">    )</span>
<span id="cb1-44">    val_dataloader <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> DataLoader(</span>
<span id="cb1-45">        val_dataset,</span>
<span id="cb1-46">        shuffle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>,</span>
<span id="cb1-47">        sampler<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>val_sampler,</span>
<span id="cb1-48">        num_workers<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>num_workers_per_proc,</span>
<span id="cb1-49">        batch_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>batch_size_per_proc,</span>
<span id="cb1-50">        pin_memory<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>,</span>
<span id="cb1-51">        collate_fn<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>collate_rowgroups,</span>
<span id="cb1-52">    )</span>
<span id="cb1-53"></span>
<span id="cb1-54">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># set up the NN model as normal and then wrap with DDP</span></span>
<span id="cb1-55">    model.to(rank)</span>
<span id="cb1-56">    model <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> nn.parallel.DistributedDataParallel(model, device_ids<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[rank])</span>
<span id="cb1-57"></span>
<span id="cb1-58">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> epch <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, epochs):</span>
<span id="cb1-59">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># need to call `set_epoch()` at the beginning of each epoch before creating the</span></span>
<span id="cb1-60">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># `DataLoader` iterator to make shuffling work properly across multiple epochs</span></span>
<span id="cb1-61">        train_sampler.set_epoch(epch)</span>
<span id="cb1-62"></span>
<span id="cb1-63">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... training loop</span></span>
<span id="cb1-64"></span>
<span id="cb1-65">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... diagnostics</span></span>
<span id="cb1-66"></span>
<span id="cb1-67">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># cleanly shutdown distributed processes</span></span>
<span id="cb1-68">    torch.distributed.destroy_process_group()</span>
<span id="cb1-69"></span>
<span id="cb1-70"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">__name__</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"__main__"</span>:</span>
<span id="cb1-71">    <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os</span>
<span id="cb1-72">    <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb1-73"></span>
<span id="cb1-74">    os.environ[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MASTER_ADDR"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"localhost"</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># for single node on local compute</span></span>
<span id="cb1-75">    os.environ[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MASTER_PORT"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"12345"</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># any free port</span></span>
<span id="cb1-76"></span>
<span id="cb1-77">    world_size <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.cuda.device_count()  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># number of GPUs</span></span>
<span id="cb1-78"></span>
<span id="cb1-79">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... CLI args parsing</span></span>
<span id="cb1-80"></span>
<span id="cb1-81">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># spawn multiple processes equal to world_size first argument passed in will be the rank</span></span>
<span id="cb1-82">    torch.multiprocessing.spawn(</span>
<span id="cb1-83">        main,</span>
<span id="cb1-84">        args<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(</span>
<span id="cb1-85">            world_size,</span>
<span id="cb1-86">            args.train_path,</span>
<span id="cb1-87">            args.random_state,</span>
<span id="cb1-88">            args.lr,</span>
<span id="cb1-89">            args.epochs,</span>
<span id="cb1-90">            args.num_workers,</span>
<span id="cb1-91">            args.batch_size,</span>
<span id="cb1-92">        ),</span>
<span id="cb1-93">        nprocs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>world_size,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># this is used to set the `rank` parameter.  It is passed as the first argument</span></span>
<span id="cb1-94">    )</span></code></pre></div></div>
</details>
</div>
<section id="communication-host-and-port" class="level3">
<h3 class="anchored" data-anchor-id="communication-host-and-port">1. Communication: host and port</h3>
<p>Setting up distributed training on a single (local) node is as simple as setting the host and port as below. To setup multi-node see <a href="https://pytorch.org/tutorials/intermediate/ddp_series_multinode.html">torchrun</a>.</p>
<div id="host-and-port" class="cell" data-execution_count="2">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os</span>
<span id="cb2-2">os.environ[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MASTER_ADDR"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"localhost"</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># for single node on local compute</span></span>
<span id="cb2-3">os.environ[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MASTER_PORT"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"12345"</span> <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># any free port</span></span></code></pre></div></div>
</details>
</div>
</section>
<section id="spawn-a-process-on-each-rank-gpu" class="level3">
<h3 class="anchored" data-anchor-id="spawn-a-process-on-each-rank-gpu">2. Spawn a process on each rank (GPU)</h3>
<p>Since <code>torch.multiprocessing</code> follows the same API as <code>multiprocessing</code>. To spawn a new process we pass the function to run, the arguments as a tuple, and specify the number of processes (usually the number of GPUs).</p>
<div id="spawn-process-on-each-rank" class="cell" data-execution_count="3">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb3-2"></span>
<span id="cb3-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># spawn multiple processes equal to world_size first argument passed in will be the rank</span></span>
<span id="cb3-4">torch.multiprocessing.spawn(</span>
<span id="cb3-5">    main,</span>
<span id="cb3-6">    args<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(</span>
<span id="cb3-7">        world_size,</span>
<span id="cb3-8">        args.train_path,</span>
<span id="cb3-9">        args.random_state,</span>
<span id="cb3-10">        args.lr,</span>
<span id="cb3-11">        args.epochs,</span>
<span id="cb3-12">        args.num_workers,</span>
<span id="cb3-13">        args.batch_size,</span>
<span id="cb3-14">    ),</span>
<span id="cb3-15">    nprocs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>world_size,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># this is used to set the `rank` parameter.  It is passed as the first argument</span></span>
<span id="cb3-16">)</span></code></pre></div></div>
</details>
</div>
</section>
<section id="constructing-the-process-group" class="level3">
<h3 class="anchored" data-anchor-id="constructing-the-process-group">3. Constructing the process group</h3>
<ul>
<li>First, before initializing the group process, call <a href="https://pytorch.org/docs/stable/generated/torch.cuda.set_device.html?highlight=set_device#torch.cuda.set_device">set_device</a>, which sets the default GPU for each process. This is important to prevent hangs or excessive memory utilization on GPU:0</li>
<li>The process group can be initialized by TCP (default) or from a shared file-system. Read more on <a href="https://pytorch.org/docs/stable/distributed.html#tcp-initialization">process group initialization</a>.</li>
<li><a href="https://pytorch.org/docs/stable/distributed.html?highlight=init_process_group#torch.distributed.init_process_group">init_process_group</a> initializes the distributed process group.</li>
<li>Read more about <a href="https://pytorch.org/docs/stable/distributed.html#which-backend-to-use">choosing a DDP backend</a>.</li>
</ul>
<div id="initializing-process-group" class="cell" data-execution_count="4">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> torch.distributed <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> init_process_group</span>
<span id="cb4-2"></span>
<span id="cb4-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># initialize the process group for distributed training</span></span>
<span id="cb4-4">init_process_group(</span>
<span id="cb4-5">    backend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nccl"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> torch.cuda.is_available() <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gloo"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># CPU only works on gloo backend</span></span>
<span id="cb4-6">    rank<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>rank,</span>
<span id="cb4-7">    world_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>world_size,</span>
<span id="cb4-8">)</span></code></pre></div></div>
</details>
</div>
</section>
<section id="constructing-the-ddp-model" class="level3">
<h3 class="anchored" data-anchor-id="constructing-the-ddp-model">5. Constructing the DDP model</h3>
<ul>
<li><code>device_ids</code> - 1) For single-device modules, device_ids can contain exactly one device id, which represents the only CUDA device where the input module corresponding to this process resides. Alternatively, device_ids can also be None. 2) For multi-device modules and CPU modules, device_ids must be None. (From the <a href="https://pytorch.org/docs/stable/generated/torch.nn.parallel.DistributedDataParallel.html">DDP docs</a>)</li>
</ul>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1">model.to(rank)</span>
<span id="cb5-2">model <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> nn.parallel.DistributedDataParallel(model, device_ids<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[rank])</span></code></pre></div></div>
</section>
<section id="distributing-the-data-with-distributedsampler" class="level3">
<h3 class="anchored" data-anchor-id="distributing-the-data-with-distributedsampler">4. Distributing the data with <code>DistributedSampler</code></h3>
<section id="dividing-the-workload" class="level4">
<h4 class="anchored" data-anchor-id="dividing-the-workload">Dividing the workload</h4>
<ul>
<li><a href="https://pytorch.org/docs/stable/data.html?highlight=distributedsampler#torch.utils.data.distributed.DistributedSampler"><code>DistributedSampler</code></a> chunks the input data across all distributed processes, without overlap. If we have 4 GPUs then each process will only load 1/4 of the training dataset.</li>
<li>The <code>batch_size</code> needs to be divided among the processes (GPUs). Each process will receive an input batch of <code>batch_size_per_proc</code>; the effective batch size is <code>batch_size_per_proc</code> * <code>world_size</code>, if the <code>batch_size</code> is 64 and <code>world_size</code> is 4 GPUs, then the effective batch size is still 64 in total.</li>
<li>The <code>num_workers</code> also needs to be divided among the processes (GPUs). Each proces will receive <code>num_workers_per_proc</code>.</li>
</ul>
<div class="callout callout-style-default callout-caution callout-titled" title="`batch_size` and OOM">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Caution</span><code>batch_size</code> and OOM
</div>
</div>
<div class="callout-body-container callout-body">
<p>If the batch_size isn’t divided among the processes then then each process gets a full batch and the effective batch size is now x<code>world_size</code> larger and we are likely to run out of CPU or GPU memory if not careful.</p>
</div>
</div>
<div id="distributing-workload-across-workers" class="cell" data-execution_count="5">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># we need to divide the workers and batch across the different processes used in distributed training</span></span>
<span id="cb6-2">num_workers_per_proc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> num_workers <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> world_size <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># avoids CPU contention</span></span>
<span id="cb6-3">batch_size_per_proc <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> batch_size <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">//</span> world_size   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># avoids OOM</span></span></code></pre></div></div>
</details>
</div>
</section>
<section id="setting-up-the-distributedsampler" class="level4">
<h4 class="anchored" data-anchor-id="setting-up-the-distributedsampler">Setting Up the DistributedSampler</h4>
<ul>
<li><code>shuffle</code> - by default, the <code>DistributedSampler</code> will shuffle the dataset. We don’t want to shuffle the validation dataset.</li>
<li><code>drop_last</code> - by default, the <code>DistributedSampler</code> will append additional samples to fill an incomplete batch (e.g.&nbsp;there’s 100 training samples with <code>batch_size=64</code> there would be one batch of 36 samples). We don’t want to repeat samples for the validation dataset as that would change the metrics.</li>
<li><code>pin_memory</code> - For large datasets that are loaded into the CPU in the <code>Dataset</code>, pinning the memory can speed up the host to device transfer (see this <a href="https://developer.nvidia.com/blog/how-optimize-data-transfers-cuda-cc/#pinned_host_memory">NVIDIA blog</a> for more details).</li>
</ul>
<div id="distributed-sampler" class="cell" data-execution_count="6">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb7-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># DistributedSampler ensures that training data is chunked across GPUs without overlapping samples</span></span>
<span id="cb7-2">train_sampler <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> DistributedSampler(train_dataset)</span>
<span id="cb7-3">val_sampler <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> DistributedSampler(</span>
<span id="cb7-4">    val_dataset,</span>
<span id="cb7-5">    shuffle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># don't shuffle the validation dataset</span></span>
<span id="cb7-6">    drop_last<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>, <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># DistributedSampler will append additional samples to fill an incomplete batch.  We don't want that for the validation dataset.</span></span>
<span id="cb7-7">)</span>
<span id="cb7-8"></span>
<span id="cb7-9">train_dataloader <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> DataLoader(</span>
<span id="cb7-10">    train_dataset,</span>
<span id="cb7-11">    shuffle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># don't shuffle if using DistributedSampler as that's done within the sampler</span></span>
<span id="cb7-12">    sampler<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>train_sampler,</span>
<span id="cb7-13">    num_workers<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>num_workers_per_proc,</span>
<span id="cb7-14">    batch_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>batch_size_per_proc,</span>
<span id="cb7-15">    pin_memory<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>,</span>
<span id="cb7-16">    collate_fn<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>collate_rowgroups,</span>
<span id="cb7-17">)</span>
<span id="cb7-18">val_dataloader <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> DataLoader(</span>
<span id="cb7-19">    val_dataset,</span>
<span id="cb7-20">    shuffle<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>,</span>
<span id="cb7-21">    sampler<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>val_sampler,</span>
<span id="cb7-22">    num_workers<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>num_workers_per_proc,</span>
<span id="cb7-23">    batch_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>batch_size_per_proc,</span>
<span id="cb7-24">    pin_memory<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>,</span>
<span id="cb7-25">    collate_fn<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>collate_rowgroups,</span>
<span id="cb7-26">)</span></code></pre></div></div>
</details>
</div>
</section>
<section id="shuffling-across-epochs" class="level4">
<h4 class="anchored" data-anchor-id="shuffling-across-epochs">7. Shuffling across epochs</h4>
<ul>
<li>Calling the <code>set_epoch()</code> method on the <code>DistributedSampler</code> at the beginning of each epoch is necessary to make shuffling work properly across multiple epochs. Otherwise, the same ordering will be used in each epoch.</li>
</ul>
<div id="shuffling-across-epochs" class="cell" data-execution_count="7">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb8-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... Neural Network setup</span></span>
<span id="cb8-2"></span>
<span id="cb8-3"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> epch <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, epochs):</span>
<span id="cb8-4">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># need to call `set_epoch()` at the beginning of each epoch before creating the</span></span>
<span id="cb8-5">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># `DataLoader` iterator to make shuffling work properly across multiple epochs</span></span>
<span id="cb8-6">    train_sampler.set_epoch(epch)</span>
<span id="cb8-7"></span>
<span id="cb8-8">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... training loop</span></span></code></pre></div></div>
</details>
</div>
</section>
</section>
<section id="running-the-distributed-training-job" class="level3">
<h3 class="anchored" data-anchor-id="running-the-distributed-training-job">6. Running the distributed training job</h3>
<ul>
<li><code>rank</code> is auto-allocated by DDP when calling <a href="https://pytorch.org/docs/stable/multiprocessing.html#spawning-subprocesses"><code>torch.multiprocessing.spawn</code></a>.</li>
<li><code>world_size</code> is the number of processes across the training job. For GPU training, this corresponds to the number of GPUs in use, and each process works on a dedicated GPU.</li>
<li>Both <code>rank</code> and <code>world_size</code> are new parameters to <code>main()</code>. Because of how spawning processes works, <code>rank</code> <em>needs</em> to be the first parameter to the calling function, <code>main(rank, ...)</code>.</li>
</ul>
<div class="callout callout-style-default callout-tip callout-titled" title="PyTorch Multiprocessing">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>PyTorch Multiprocessing
</div>
</div>
<div class="callout-body-container callout-body">
<p><a href="https://pytorch.org/docs/stable/multiprocessing.html">PyTorch’s <code>torch.multiprocessing</code> package</a> is a wrapper around the native <code>multiprocessing</code> module and the API is 100% compatible.</p>
</div>
</div>
<div id="mean-and-variance" class="cell" data-execution_count="8">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb9-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb9-2"></span>
<span id="cb9-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ... CLI args parsing</span></span>
<span id="cb9-4"></span>
<span id="cb9-5">world_size <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.cuda.device_count()  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># number of GPUs</span></span>
<span id="cb9-6"></span>
<span id="cb9-7">torch.multiprocessing.spawn(</span>
<span id="cb9-8">    main,</span>
<span id="cb9-9">    args<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(</span>
<span id="cb9-10">        world_size,</span>
<span id="cb9-11">        args.train_path,</span>
<span id="cb9-12">        args.random_state,</span>
<span id="cb9-13">        args.lr,</span>
<span id="cb9-14">        args.epochs,</span>
<span id="cb9-15">        args.num_workers,</span>
<span id="cb9-16">        args.batch_size,</span>
<span id="cb9-17">    ),</span>
<span id="cb9-18">    nprocs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>world_size,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># this is used to set the `rank` parameter.  It is passed as the first argument</span></span>
<span id="cb9-19">)</span></code></pre></div></div>
</details>
</div>
</section>
<section id="mlflow-logging" class="level3">
<h3 class="anchored" data-anchor-id="mlflow-logging">MLFlow logging</h3>
<p>Since there are now multiple processes runnning the same code, the same logging will happen on each process. MLFlow doesn’t know how to distinguish that there are different processes logging the same metric. We can guard against this by only logging on the main process (GPU0):</p>
<div id="mlflow-and-torch.distributed" class="cell" data-execution_count="9">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb10-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> mlflow</span>
<span id="cb10-2"></span>
<span id="cb10-3"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> rank <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>:</span>
<span id="cb10-4">    mlflow.log_metrics(</span>
<span id="cb10-5">        {</span>
<span id="cb10-6">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"train loss"</span>: train_loss,</span>
<span id="cb10-7">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"train accuracy"</span>: train_accuracy,</span>
<span id="cb10-8">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"val loss"</span>: val_loss,</span>
<span id="cb10-9">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"val accuracy"</span>: val_accuracy,</span>
<span id="cb10-10">        },</span>
<span id="cb10-11">        step<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>epoch,</span>
<span id="cb10-12">    )</span></code></pre></div></div>
</details>
</div>
</section>
</section>
<section id="gradients-losses-and-metrics" class="level2">
<h2 class="anchored" data-anchor-id="gradients-losses-and-metrics"># Gradients, Losses, and Metrics</h2>
<p>Under the hood, DDP synchronizes and gathers the gradients across all processes. However, any other ad-hoc value calculated in your code is not; e.g.&nbsp;losses and metrics.</p>
<div class="callout callout-style-default callout-note callout-titled" title="Gradients are synchronized">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Note</span>Gradients are synchronized
</div>
</div>
<div class="callout-body-container callout-body">
<p>Model gradients are synchronized across processes during the backward pass. This means that the model in each process is the same! <a href="https://pytorch.org/docs/master/notes/ddp.html#internal-design">See DDP: Internal Design</a>.</p>
</div>
</div>
<div class="callout callout-style-default callout-caution callout-titled" title="Losses are not synchronized">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Caution</span>Losses are not synchronized
</div>
</div>
<div class="callout-body-container callout-body">
<p>Even though the model is the same in each process, the loss is calculated on only the portion of the batch that each process sees. The losses don’t need to be synchronized for training but we may want to synchronize the losses for logging or definitelty when calculating metrics on the hold-out (validation) dataset.</p>
<p>We could avoid this by <em>not</em> using a <code>DistributedSampler</code> for the validation set, but then only 1 process would be used to calculate the loss for the whole validation set each epoch, which will be <em>slow</em>.</p>
</div>
</div>
<p>So if each process is calculating and accumulating losses and metrics separately, how do we log those and report as if there were a single process? Well, those values will need to be gathered and then accumulated. Say we have 4 processes, one for each GPU, and each is processing 1/4 of the training dataset. We want to report the loss for each epoch. If we log the loss in each process, we will have 4 different losses. We can gather and combine them in a few ways. Since the loss is just a number value we can use <a href="https://pytorch.org/docs/stable/distributed.html#torch.distributed.reduce"><code>torch.distributed.reduce</code></a> or <a href="https://pytorch.org/docs/stable/distributed.html#torch.distributed.all_reduce"><code>torch.distributed.all_reduce</code></a>:</p>
<section id="example-torch.distributed.reduce" class="level3">
<h3 class="anchored" data-anchor-id="example-torch.distributed.reduce">Example: <code>torch.distributed.reduce</code></h3>
<p>In this example, we gather and combine using summation with the <code>dist.ReduceOp.SUM</code>, all the <code>loss_tensor</code>s into the process <code>0</code> tensor (<code>dst=0</code>). Each tensor in each process must be the same shape. Since we are assigning the values in each processes’s <code>loss_tensor</code> to it’s rank, we expect the final gathered values to be <code>0 + 1 + 2 + 3 = 6</code> in the main process <code>loss_tensor</code>.</p>
<div id="example-torch.distributed.reduce" class="cell" data-execution_count="10">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb11-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os</span>
<span id="cb11-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb11-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch.distributed <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> dist</span>
<span id="cb11-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch.multiprocessing <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> mp</span>
<span id="cb11-5"></span>
<span id="cb11-6"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> torch.distributed <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> init_process_group</span>
<span id="cb11-7"></span>
<span id="cb11-8"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> reduce_tensor(rank: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>, world_size: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>:</span>
<span id="cb11-9">    init_process_group(</span>
<span id="cb11-10">        backend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nccl"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> torch.cuda.is_available() <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gloo"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># CPU only works on gloo backend</span></span>
<span id="cb11-11">        rank<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>rank,</span>
<span id="cb11-12">        world_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>world_size,</span>
<span id="cb11-13">    )</span>
<span id="cb11-14">    torch.cuda.set_device(rank) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># tell each device (GPU) which one it is.</span></span>
<span id="cb11-15"></span>
<span id="cb11-16">    loss_tensor <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.tensor([rank, rank]).cuda()</span>
<span id="cb11-17">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(loss_tensor)</span>
<span id="cb11-18"></span>
<span id="cb11-19">    dist.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">reduce</span>(loss_tensor, op<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>dist.ReduceOp.SUM, dst<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, async_op<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb11-20">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(loss_tensor)</span>
<span id="cb11-21"></span>
<span id="cb11-22">    torch.distributed.destroy_process_group()</span>
<span id="cb11-23"></span>
<span id="cb11-24"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">__name__</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"__main__"</span>:</span>
<span id="cb11-25">    os.environ[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MASTER_ADDR"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"localhost"</span></span>
<span id="cb11-26">    os.environ[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MASTER_PORT"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"12345"</span></span>
<span id="cb11-27"></span>
<span id="cb11-28">    num_gpu <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.cuda.device_count()</span>
<span id="cb11-29">    mp.spawn(reduce_tensor, nprocs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>num_gpu, args<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(num_gpu,))</span></code></pre></div></div>
</details>
</div>
<pre class="{text}"><code>tensor([1, 1], device='cuda:1')
tensor([3, 3], device='cuda:3')
tensor([2, 2], device='cuda:2')
tensor([0, 0], device='cuda:0')

tensor([6, 6], device='cuda:0')
tensor([1, 1], device='cuda:1')
tensor([2, 2], device='cuda:2')
tensor([3, 3], device='cuda:3')</code></pre>
</section>
<section id="example-torch.distributed.all_reduce" class="level3">
<h3 class="anchored" data-anchor-id="example-torch.distributed.all_reduce">Example: <code>torch.distributed.all_reduce</code></h3>
<p>In this example, we gather and combine using summation with the <code>dist.ReduceOp.SUM</code>, all the <code>loss_tensor</code>s into all the processes. Each tensor in each process must be the same shape. Since we are assigning the values in each processes’s <code>loss_tensor</code> to it’s rank, we expect the final gathered values to be <code>0 + 1 + 2 + 3 = 6</code> in the all the processes’s <code>loss_tensor</code>.</p>
<div id="example-torch.distributed.all_reduce" class="cell" data-execution_count="11">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb13" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb13-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os</span>
<span id="cb13-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb13-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch.distributed <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> dist</span>
<span id="cb13-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch.multiprocessing <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> mp</span>
<span id="cb13-5"></span>
<span id="cb13-6"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> torch.distributed <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> init_process_group</span>
<span id="cb13-7"></span>
<span id="cb13-8"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> all_reduce_tensor(rank: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>, world_size: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>:</span>
<span id="cb13-9">    init_process_group(</span>
<span id="cb13-10">        backend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nccl"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> torch.cuda.is_available() <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gloo"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># CPU only works on gloo backend</span></span>
<span id="cb13-11">        rank<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>rank,</span>
<span id="cb13-12">        world_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>world_size,</span>
<span id="cb13-13">    )</span>
<span id="cb13-14">    torch.cuda.set_device(rank) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># tell each device (GPU) which one it is.</span></span>
<span id="cb13-15"></span>
<span id="cb13-16">    loss_tensor <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.tensor([rank, rank]).cuda()</span>
<span id="cb13-17">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(loss_tensor)</span>
<span id="cb13-18"></span>
<span id="cb13-19">    dist.all_reduce(loss_tensor, op<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>dist.ReduceOp.SUM, dst<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, async_op<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb13-20">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(loss_tensor)</span>
<span id="cb13-21"></span>
<span id="cb13-22">    torch.distributed.destroy_process_group()</span>
<span id="cb13-23"></span>
<span id="cb13-24"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">__name__</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"__main__"</span>:</span>
<span id="cb13-25">    os.environ[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MASTER_ADDR"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"localhost"</span></span>
<span id="cb13-26">    os.environ[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MASTER_PORT"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"12345"</span></span>
<span id="cb13-27"></span>
<span id="cb13-28">    num_gpu <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.cuda.device_count()</span>
<span id="cb13-29">    mp.spawn(all_reduce_tensor, nprocs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>num_gpu, args<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(num_gpu,))</span></code></pre></div></div>
</details>
</div>
<pre class="{text}"><code>tensor([2, 2], device='cuda:2')
tensor([3, 3], device='cuda:3')
tensor([1, 1], device='cuda:1')
tensor([0, 0], device='cuda:0')

tensor([6, 6], device='cuda:2')
tensor([6, 6], device='cuda:3')
tensor([6, 6], device='cuda:1')
tensor([6, 6], device='cuda:0')</code></pre>
</section>
<section id="example-torch.distributed.gather_object" class="level3">
<h3 class="anchored" data-anchor-id="example-torch.distributed.gather_object">Example: <code>torch.distributed.gather_object</code></h3>
<p>Syncing across processing is simple enough for tensors, but if we have a number of values to gather (say a bunch of metrics for example) it would be easier to only need to gather once and store those values in an appropriate data structure. Most of the distributed gathering function only work on tensors, but we can use <a href="https://pytorch.org/docs/stable/distributed.html#torch.distributed.gather_object"><code>torch.distributed.gather_object</code></a> and / or <a href="https://pytorch.org/docs/stable/distributed.html#torch.distributed.all_gather_object"><code>torch.distributed.all_gather_object</code></a> to pass pickleable Python objects between ranks.</p>
<p>In this example, we want to track the losses and number of samples in a <code>Counter</code> so that we can combine and calculate the mean loss after gathering. We gather each loss counter to rank 0. Each counter is placed into the <code>gather_list</code>, which must have all elements set to <code>None</code> initially. When calling, <code>dist.gather_object</code>, the <code>gather_list</code> must only exist in the rank being gathered to (<code>dst=0</code> or rank 0 in this case). Then we use <code>functools.reduce</code> to sum all the Counters gathered in the <code>gather_list</code>.</p>
<div id="example-torch.distributed.gather_object" class="cell" data-execution_count="12">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb15-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os</span>
<span id="cb15-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> operator</span>
<span id="cb15-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> collections <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Counter</span>
<span id="cb15-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb15-5"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch.distributed <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> dist</span>
<span id="cb15-6"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch.multiprocessing <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> mp</span>
<span id="cb15-7"></span>
<span id="cb15-8"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> torch.distributed <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> init_process_group</span>
<span id="cb15-9"></span>
<span id="cb15-10"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> gather_object(rank: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>, world_size: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>:</span>
<span id="cb15-11">    init_process_group(</span>
<span id="cb15-12">        backend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nccl"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> torch.cuda.is_available() <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gloo"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># CPU only works on gloo backend</span></span>
<span id="cb15-13">        rank<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>rank,</span>
<span id="cb15-14">        world_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>world_size,</span>
<span id="cb15-15">    )</span>
<span id="cb15-16">    torch.cuda.set_device(rank) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># tell each device (GPU) which one it is.</span></span>
<span id="cb15-17"></span>
<span id="cb15-18">    losses <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> Counter(</span>
<span id="cb15-19">        {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"loss"</span>: <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.01</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"num_samples"</span>: rank}</span>
<span id="cb15-20">    )</span>
<span id="cb15-21">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(losses)</span>
<span id="cb15-22"></span>
<span id="cb15-23">    gather_list <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> _ <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(world_size)]</span>
<span id="cb15-24"></span>
<span id="cb15-25">    dist.gather_object(losses, gather_list <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> rank <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>, dst<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)</span>
<span id="cb15-26">    losses <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> functools.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">reduce</span>(operator.add, gather_list)</span>
<span id="cb15-27"></span>
<span id="cb15-28">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(losses)</span>
<span id="cb15-29">    torch.distributed.destroy_process_group()</span>
<span id="cb15-30"></span>
<span id="cb15-31"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">__name__</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"__main__"</span>:</span>
<span id="cb15-32">    os.environ[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MASTER_ADDR"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"localhost"</span></span>
<span id="cb15-33">    os.environ[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MASTER_PORT"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"12345"</span></span>
<span id="cb15-34"></span>
<span id="cb15-35">    num_gpu <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.cuda.device_count()</span>
<span id="cb15-36">    mp.spawn(gather_object, nprocs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>num_gpu, args<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(num_gpu,))</span></code></pre></div></div>
</details>
</div>
<pre class="{text}"><code>Counter({'num_samples': 1, 'loss': 0.01})
Counter({'num_samples': 2, 'loss': 0.01})
Counter({'num_samples': 4, 'loss': 0.01})
Counter({'num_samples': 3, 'loss': 0.01})

Counter({'num_samples': 10, 'loss': 0.04})
Counter({'num_samples': 4, 'loss': 0.01})
Counter({'num_samples': 3, 'loss': 0.01})
Counter({'num_samples': 2, 'loss': 0.01})</code></pre>
</section>
<section id="example-torch.distributed.all_gather_object" class="level3">
<h3 class="anchored" data-anchor-id="example-torch.distributed.all_gather_object">Example: <code>torch.distributed.all_gather_object</code></h3>
<p>In this example, we want to track the losses and number of samples in a <code>Counter</code> so that we can combine and calculate the mean loss after gathering. We gather each loss counter to each rank. Each counter is placed into the <code>gather_list</code>, which must have all elements set to <code>None</code> initially. Then we use <code>functools.reduce</code> to sum all the Counters gathered in the <code>gather_list</code>.</p>
<div id="example-torch.distributed.all_gather_object" class="cell" data-execution_count="13">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb17" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb17-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> os</span>
<span id="cb17-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> operator</span>
<span id="cb17-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> collections <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Counter</span>
<span id="cb17-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb17-5"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch.distributed <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> dist</span>
<span id="cb17-6"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch.multiprocessing <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> mp</span>
<span id="cb17-7"></span>
<span id="cb17-8"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> torch.distributed <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> init_process_group</span>
<span id="cb17-9"></span>
<span id="cb17-10"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> all_gather_object(rank: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>, world_size: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>:</span>
<span id="cb17-11">    init_process_group(</span>
<span id="cb17-12">        backend<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"nccl"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> torch.cuda.is_available() <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gloo"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># CPU only works on gloo backend</span></span>
<span id="cb17-13">        rank<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>rank,</span>
<span id="cb17-14">        world_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>world_size,</span>
<span id="cb17-15">    )</span>
<span id="cb17-16">    torch.cuda.set_device(rank) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># tell each device (GPU) which one it is.</span></span>
<span id="cb17-17"></span>
<span id="cb17-18">    losses <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> Counter(</span>
<span id="cb17-19">        {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"loss"</span>: <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.01</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"num_samples"</span>: rank}</span>
<span id="cb17-20">    )</span>
<span id="cb17-21">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(losses)</span>
<span id="cb17-22"></span>
<span id="cb17-23">    gather_list <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> _ <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(world_size)]</span>
<span id="cb17-24"></span>
<span id="cb17-25">    dist.all_gather_object(gather_list, losses)</span>
<span id="cb17-26">    losses <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> functools.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">reduce</span>(operator.add, gather_list)</span>
<span id="cb17-27"></span>
<span id="cb17-28">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(losses)</span>
<span id="cb17-29">    torch.distributed.destroy_process_group()</span>
<span id="cb17-30"></span>
<span id="cb17-31"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">__name__</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"__main__"</span>:</span>
<span id="cb17-32">    os.environ[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MASTER_ADDR"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"localhost"</span></span>
<span id="cb17-33">    os.environ[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"MASTER_PORT"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"12345"</span></span>
<span id="cb17-34"></span>
<span id="cb17-35">    num_gpu <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.cuda.device_count()</span>
<span id="cb17-36">    mp.spawn(all_gather_object, nprocs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>num_gpu, args<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(num_gpu,))</span></code></pre></div></div>
</details>
</div>
<pre class="{text}"><code>Counter({'num_samples': 1, 'loss': 0.01})
Counter({'num_samples': 4, 'loss': 0.01})
Counter({'num_samples': 2, 'loss': 0.01})
Counter({'num_samples': 3, 'loss': 0.01})

Counter({'num_samples': 10, 'loss': 0.04})
Counter({'num_samples': 10, 'loss': 0.04})
Counter({'num_samples': 10, 'loss': 0.04})
Counter({'num_samples': 10, 'loss': 0.04})</code></pre>
</section>
</section>
<section id="multi-node-training" class="level2">
<h2 class="anchored" data-anchor-id="multi-node-training"># Multi-Node Training</h2>
<p>Now that we’ve setup DDP, we have the option of running on multiple nodes. There are a few extra bits that need to be changed before we run <a href="https://pytorch.org/tutorials/intermediate/ddp_series_multinode.html">multinode training</a>:</p>
<ul>
<li>change a few lines to enable <a href="https://pytorch.org/docs/stable/elastic/run.html"><code>torchrun</code></a></li>
<li>install the project as a python package for <code>torchrun</code> to work properly</li>
<li>add <a href="https://pytorch.org/tutorials/beginner/ddp_series_fault_tolerance.html">fault tolerance</a></li>
</ul>
</section>
<section id="resources" class="level2">
<h2 class="anchored" data-anchor-id="resources"># Resources</h2>
<ol type="1">
<li><a href="https://pytorch.org/docs/stable/notes/ddp.html"><code>DistributedDataParallel</code></a> - Documentation for DDP.</li>
<li><a href="https://pytorch.org/tutorials/intermediate/ddp_tutorial.html">Getting Started with Distributed Data Parallel</a> - Good starting point to understand DDP and writing a training script using DDP for single-node and multi-node.</li>
<li><a href="https://pytorch.org/tutorials/intermediate/dist_tuto.html">Writing Distributed Applications with Pytorch</a> - In-depth article about writing distributed applications in PyTorch and how communication works under the hood.</li>
<li><a href="https://pytorch.org/docs/stable/data.html#torch.utils.data.distributed.DistributedSampler"><code>DistributedSampler</code></a> - Used in conjunction with a DataLoader, the DistributedSampler enables each process to only load the data it processes, rather than all the data to be processed.</li>
<li><a href="https://yangkky.github.io/2019/07/08/distributed-pytorch-tutorial.html">DistributedDataParallel training in PyTorch</a> - Explaination of how DDP works and how to use it.</li>
<li><a href="https://learn.microsoft.com/en-us/azure/machine-learning/how-to-train-distributed-gpu?view=azureml-api-2">(AML) Distributed GPU training guide (SDK v2)</a></li>
<li><a href="https://ochzhen.com/blog/pytorch-distributed-data-parallel-azure-ml">PyTorch DistributedDataParallel Example In Azure ML - Multi-Node Multi-GPU Distributed Training</a> - Example of DDP for AML.</li>
<li><a href="https://arxiv.org/pdf/2006.15704">PyTorch Distributed: Experiences on Accelerating Data Parallel Training</a> - Paper on how Facebook designed DDP to be faster for distributed training.</li>
</ol>


<!-- -->

</section>

 ]]></description>
  <category>deep learning</category>
  <category>pytorch</category>
  <category>distributed systems</category>
  <guid>https://bear-toes.pages.dev/posts/torch-distributed-explained/</guid>
  <pubDate>Sun, 13 Apr 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Statistics on Stream Data</title>
  <link>https://bear-toes.pages.dev/posts/stream-statistics/</link>
  <description><![CDATA[ 





<section id="statistics-on-stream-data" class="level2">
<h2 class="anchored" data-anchor-id="statistics-on-stream-data"># Statistics on Stream Data</h2>
<p>Simple statistics are common in a number of software and data domains because they are simple to calculate and simple to understand. Most common are the arithmetic mean and variance. For a given set of values, <img src="https://latex.codecogs.com/png.latex?X">, the mean, <img src="https://latex.codecogs.com/png.latex?%5Cmu">, is a measure of central tendency and locates a central value of the distribution. The variance, <img src="https://latex.codecogs.com/png.latex?%5Csigma%5E2">, provides a measure of the dispersion of the observed values of <img src="https://latex.codecogs.com/png.latex?x"> about the central value <img src="https://latex.codecogs.com/png.latex?%5Cmu"> <span class="citation" data-cites="schott2016">(Schott 2016, 20–25)</span>. <img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balignat*%7D%7B2%7D%0A%5Ctext%7BE%7D(X)%20%20%20&amp;=%20%5Cmu%20%20%20%20%20%20%20%20&amp;&amp;=%20%5Cfrac%7B1%7D%7BN%7D%20%5Csum%5EN_%7Bi=1%7D%20x_i%20%5Ctag%7Bmean%7D%20%5C%5C%0A%5Ctext%7BVar%7D(X)%20&amp;=%20%5Csigma%5E2%20%20%20&amp;&amp;=%20%5Cfrac%7B1%7D%7BN%7D%20%5Csum%5EN_%7Bi=1%7D%20(x_i%20-%20%5Cmu)%5E2%20%5Ctag%7Bpopulation%20variance%7D%0A%5Cend%7Balignat*%7D%0A"></p>
<p>Suppose we have a set of <img src="https://latex.codecogs.com/png.latex?N=6"> values, <img src="https://latex.codecogs.com/png.latex?X%20=%20%5B1,%202,%201,%202,%204,%205%5D">; then: <img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Baligned%7D%0A%5Cmu%20%20%20%20%20%20&amp;=%20%5Cfrac%7B1%20+%202%20+%201%20+%202%20+%204%20+%205%7D%7B6%7D%20%5C%5C%5B10pt%5D%0A%5Csigma%5E2%20&amp;=%20%5Cfrac%7B(1-2.5)%5E2%20+%20(2-2.5)%5E2%20+%20(1-2.5)%5E2%20+%20(2-2.5)%5E2%20+%20(4-2.5)%5E2%20+%20(5-2.5)%5E2%7D%7B6%7D%0A%5Cend%7Baligned%7D%0A"></p>
<div id="mean-and-variance" class="cell" data-execution_count="1">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb1-2"></span>
<span id="cb1-3">X <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.tensor([<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">4.0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5.0</span>])</span>
<span id="cb1-4"></span>
<span id="cb1-5"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"mean = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>X<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>mean()<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb1-6"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"var  = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>X<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>var(correction<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>)<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb1-7"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"sample_var = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>X<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">.</span>var()<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span></code></pre></div></div>
</details>
<div class="cell-output cell-output-stdout">
<pre><code>mean = 2.5
var  = 2.25
sample_var = 2.700000047683716</code></pre>
</div>
</div>
<p>This should be no surprise if you’ve worked with data before and in theory, the mean and variance are straightforward to calculate. But in practice, datasets nowadays have become very large in the age of “Big Data”. Not only are datasets now too big to fit into memory, datasets are ever growing and constantly being updated. How do we calculate these measures if the data is too large to process in memory? How can we update these measures when new data is added to the dataset? Do we have to reprocess every value? Storing large datasets can become costly but reprocessing large datasets just to recalculate a simple statistic can be prohibitive. Many datasets have a temporal component and simple statistics can be calculated on a moving or sliding window because the most important data is the most recent data. Many other datasets can’t just calculate over a lsiding window. For example, deep learning models are now being trained on very large datasets, i.e.&nbsp;the whole of the internet.Since the entire internet can’t fit into memory of even the largest compute instance, these models are trained in batches. Typically, the mean is computed over a batch (<a href="https://pytorch.org/docs/stable/generated/torch.nn.BatchNorm2d.html">BatchNorm</a>) but when evaluating the model on a hold-out dataset, we want to compute statistics over the whole of the hold-out dataset.</p>
<p>We could just keep a running sum of the numerator and running count of the denominator but there are some drawbacks. Calculating the numerator of the mean could result in an <a href="https://en.wikipedia.org/wiki/Integer_overflow">arithmetic overflow</a> when dealing with large numbers. Calculating the numerator of the variance involves recalculating the mean for each new batch of data and involves calculating the sums of squares, which can lead to <a href="https://en.wikipedia.org/wiki/Numerical_stability">numerical instability</a>.</p>
<p>Suppose our dataset arrives in batches of 2: <img src="https://latex.codecogs.com/png.latex?X%20=%20%5B%5B1,%202%5D,%20%5B1,%202%5D,%20%5B4,%205%5D%5D">. We can update the mean and sample variance as:</p>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>Use the sample variance
</div>
</div>
<div class="callout-body-container callout-body">
<p>Since most datasets don’t truely sample the whole population and because each batch is effectively a sample, we’ll want to compute the sample variance, <img src="https://latex.codecogs.com/png.latex?s%5E2">, rather than the population variance.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctext%7BVar%7D(X)%20=%20s%5E2%20=%20%5Cfrac%7B1%7D%7Bn-1%7D%20%5Csum%5EN_%7Bi=1%7D%20(x_i%20-%20%5Cmu)%5E2%20%5Ctag%7Bsample%20variance%7D%0A"></p>
</div>
</div>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cboxed%7B%0A%5Cbegin%7Balign%7D%0A%5Cmu%20&amp;=%20%5Cfrac%7Ba%7D%7Ba+b%7D%20%5Cmu_a%20+%20%5Cfrac%7Bb%7D%7Ba+b%7D%20%5Cmu_b%20%5C%5C%5B10pt%5D%0As%5E2%20&amp;=%20%5Cunderbrace%7B%5Cfrac%7B1%7D%7Ba+b-1%7D%7D_%7B%5Ctext%7BBessel's%20correction%7D%7D%20%5CBigg%5B%20%5Cunderbrace%7B%5Cfrac%7Ba-1%7D%7Ba+b%7D%20s_a%5E2%20+%20%5Cfrac%7Bb-1%7D%7Ba+b%7D%20s_b%5E2%7D_%7B%5Ctext%7Bwithin%20sample%20variance%7D%7D%20+%20%5Cunderbrace%7B%5Cfrac%7Bab%7D%7Ba+b%7D(%5Cmu_a%20-%20%5Cmu_b)%5E2%7D_%7B%5Ctext%7Bbetween%20sample%20variance%7D%7D%20%5CBigg%5D%0A%5Cend%7Balign%7D%0A%7D%0A"></p>
<p>where:</p>
<ul>
<li><img src="https://latex.codecogs.com/png.latex?a"> is the running count of all values seen so far</li>
<li><img src="https://latex.codecogs.com/png.latex?b"> is the count of the values in the new batch of data</li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cmu_a"> is the mean of all values seen so far</li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cmu_b"> is the mean of the new batch of data</li>
<li><img src="https://latex.codecogs.com/png.latex?s_a%5E2"> is the sample variance of all the values seen so far</li>
<li><img src="https://latex.codecogs.com/png.latex?s_b%5E2"> is the sample variance of the new batch of data</li>
</ul>
<p>The updated mean is a linear combination of the mean over the seen data and the mean over new data. The updated variance is a linear combination of the seen data variance and new data variance plus a correction by the means.</p>
<div id="batch-update-mean-and-variance" class="cell" data-execution_count="2">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb3-2"></span>
<span id="cb3-3"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> update_mean(a: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>, b: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>, mean_a: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, mean_b: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>:</span>
<span id="cb3-4">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> (a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> mean_a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> mean_b) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> (a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> b)</span>
<span id="cb3-5"></span>
<span id="cb3-6"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> update_variance(a: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>, b: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>, mean_a: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, mean_b: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, var_a: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, var_b: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>:</span>
<span id="cb3-7">    </span>
<span id="cb3-8">    within_sample_var <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> var_a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> var_b</span>
<span id="cb3-9">    between_sample_var <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>b) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> (a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span>b) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (mean_a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> mean_b)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb3-10">    </span>
<span id="cb3-11">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> (within_sample_var <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> between_sample_var) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> (a<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span>b<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb3-12"></span>
<span id="cb3-13">X <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.tensor([[<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.0</span>], [<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">2.0</span>], [<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">4.0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5.0</span>]])</span>
<span id="cb3-14"></span>
<span id="cb3-15"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># while not strictly correct, we can initialize </span></span>
<span id="cb3-16"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># the mean and variance to 0 rather than NaN</span></span>
<span id="cb3-17">count <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span></span>
<span id="cb3-18">mean <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.0</span></span>
<span id="cb3-19">var <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.0</span></span>
<span id="cb3-20"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> x <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> X:</span>
<span id="cb3-21">    mean_updated <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> update_mean(count, x.numel(), mean, x.mean())</span>
<span id="cb3-22">    var_updated <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> update_variance(count, x.numel(), mean, x.mean(), var, x.var())</span>
<span id="cb3-23">    </span>
<span id="cb3-24">    count <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+=</span> x.numel()</span>
<span id="cb3-25">    mean <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> mean_updated</span>
<span id="cb3-26">    var <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> var_updated</span>
<span id="cb3-27"></span>
<span id="cb3-28"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">assert</span> mean <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> X.mean()</span>
<span id="cb3-29"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">assert</span> var <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> X.var()</span>
<span id="cb3-30"></span>
<span id="cb3-31"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"mean = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>mean<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span>
<span id="cb3-32"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"var  = </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>var<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span></code></pre></div></div>
</details>
<div class="cell-output cell-output-stdout">
<pre><code>mean = 2.5
var  = 2.700000047683716</code></pre>
</div>
</div>
</section>
<section id="derivation" class="level2">
<h2 class="anchored" data-anchor-id="derivation">Derivation</h2>
<section id="batch-update-mean" class="level3">
<h3 class="anchored" data-anchor-id="batch-update-mean">Batch Update Mean</h3>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5Cmu%20=%20%5Cfrac%7B1%7D%7Bn%7D%20%5Csum_%7Bi=1%7D%5En%20x_i%20%5Ctag%7B1%7D%20%5C%5C%0An%20%5Cmu%20=%20%5Csum_%7Bi=1%7D%5En%20x_i%20%5Ctag%7B2%7D%0A%5Cend%7Balign%7D%0A"></p>
<p>We can think of the two batches we are combining as two ranges that are being combined. So if batch A is between <img src="https://latex.codecogs.com/png.latex?%5B1,%20a%5D"> and batch B is between <img src="https://latex.codecogs.com/png.latex?%5B1,%20b%5D"> and we are starting with batch A and adding batch B, the combined range is then <img src="https://latex.codecogs.com/png.latex?%5B1,%20a+b%5D">, where the total number of samples observed is <img src="https://latex.codecogs.com/png.latex?n=a+b">.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Csum_%7Bi=1%7D%5E%7Ba+b%7D%20=%20%5Csum_%7Bi=1%7D%5E%7Ba%7D%20+%20%5Csum_%7Bi=a+1%7D%5E%7Ba+b%7D%20%5Ctag%7B3%7D%0A"></p>
<p>Knowing this we can express the combined mean as:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5Cmu%20&amp;=%20%5Cfrac%7B1%7D%7Ba+b%7D%20%5Csum_%7Bi=1%7D%5E%7Ba+b%7D%20x_i%20%5C%5C%0A%20%20%20%20&amp;=%20%5Cfrac%7B1%7D%7Ba+b%7D%20%5Cleft(%20%5Csum_%7Bi=1%7D%5E%7Ba%7D%20x_i%20+%20%5Csum_%7Bi=a+1%7D%5E%7Ba+b%7D%20x_i%20%5Cright)%20%5Ctag*%7Bsplit%20the%20sum%20using%20eq%203%7D%20%5C%5C%0A%20%20%20%20&amp;=%20%5Cfrac%7B1%7D%7Ba+b%7D%20%5CBig(%20a%5Cmu_a%20+%20b%5Cmu_b%20%5CBig)%20%5Ctag*%7Bsubstitute%20with%20eq%202%7D%20%5C%5C%0A%5CAboxed%7B%0A%20%20%5Cmu%20&amp;=%20%5Cfrac%7Ba%7D%7Ba+b%7D%20%5Cmu_a%20+%20%5Cfrac%7Bb%7D%7Ba+b%7D%20%5Cmu_b%0A%7D%20%5Ctag%7B4%7D%0A%5Cend%7Balign%7D%0A"></p>
</section>
<section id="batch-update-variance" class="level3">
<h3 class="anchored" data-anchor-id="batch-update-variance">Batch Update Variance</h3>
<p>For the variance, we’ll first derive the population variance and then work out the sample variance.</p>
<p>Let’s start by simplifying the variance equation.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5Csigma%5E2%20&amp;=%20%5Cfrac%7B1%7D%7Bn%7D%20%5Csum_%7Bi=1%7D%5En%20(x_i%20-%20%5Cmu)%5E2%20%5C%5C%0A%20%20&amp;=%20%5Cfrac%7B1%7D%7Bn%7D%20%5Csum_%7Bi=1%7D%5En%20%5Cleft(%20x_i%5E2%20-%202%5Cmu%20x_i%20+%20%5Cmu%5E2%20%5Cright)%20%5Ctag*%7Bcomplete%20the%20square%7D%20%5C%5C%0A%20%20&amp;=%20%5Cfrac%7B1%7D%7Bn%7D%20%5Cleft%5B%20%5Csum_%7Bi=1%7D%5En%20x_i%5E2%20-%202%5Cmu%20%5Csum_%7Bi=1%7D%5En%20x_i%20%5Cmu%5E2%20%5Cright%5D%20%5Ctag*%7Bdistribute%20the%20sum%7D%20%5C%5C%0A%20%20&amp;=%20%5Cfrac%7B1%7D%7Bn%7D%20%5Csum_%7Bi=1%7D%5En%20x_i%5E2%20-%202%5Cmu%20%5Cfrac%7B1%7D%7Bn%7D%20%5Csum_%7Bi=1%7D%5En%20x_i%20+%20%5Cmu%5E2%20%20%5Ctag*%7Bsubstitute%20eq%201%7D%20%5C%5C%0A%20%20&amp;=%20%5Cfrac%7B1%7D%7Bn%7D%20%5Csum_%7Bi=1%7D%5En%20x_i%5E2%20-%202%5Cmu%5E2%20+%20%5Cmu%5E2%20%5Ctag*%7Bsimplify%7D%20%5C%5C%0A%5Csigma%5E2%20&amp;=%20%5Cfrac%7B1%7D%7Bn%7D%20%5Csum_%7Bi=1%7D%5En%20x_i%5E2%20%20-%20%5Cmu%5E2%20%5Ctag%7B5%7D%20%5C%5C%0A%5Csigma%5E2%20+%20%5Cmu%5E2%20&amp;=%20%5Cfrac%7B1%7D%7Bn%7D%20%5Csum_%7Bi=1%7D%5En%20x_i%5E2%20%5Ctag%7B6%7D%0A%5Cend%7Balign%7D%0A"></p>
<p>Now, we can follow a similar process as we did when working out the combined mean, starting from equation 5.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5Csigma%5E2%20&amp;=%20%5Cfrac%7B1%7D%7Ba+b%7D%20%5Csum_%7Bi=1%7D%5E%7Ba+b%7D%20x_i%5E2%20-%20%5Cmu%5E2%20%5Ctag%7Bsplit%20the%20sum%20using%20eq%203%7D%20%5C%5C%0A%20%20%20%20%20%20%20%20%20&amp;=%20%5Cfrac%7B1%7D%7Ba+b%7D%20%5Cleft(%20%5Csum_%7Bi=1%7D%5E%7Ba%7D%20x_i%5E2%20+%20%5Csum_%7Bi=a+1%7D%5E%7Ba+b%7D%20x_i%5E2%20%5Cright)%20-%20%5Cmu%5E2%20%5Ctag%7Bdistribute%7D%20%5C%5C%0A%20%20%20%20%20%20%20%20%20&amp;=%20%5Cfrac%7B1%7D%7Ba+b%7D%20%5Csum_%7Bi=1%7D%5E%7Ba%7D%20x_i%5E2%20+%20%5Cfrac%7B1%7D%7Ba+b%7D%20%5Csum_%7Bi=a+1%7D%5E%7Ba+b%7D%20x_i%5E2%20-%20%5Cmu%5E2%20%5Ctag%7Bmultiply%20by%20one%7D%20%5C%5C%0A%20%20%20%20%20%20%20%20%20&amp;=%20%5Cfrac%7B1%7D%7Ba+b%7D%20%5Cfrac%7Ba%7D%7B1%7D%20%5Cunderbrace%7B%5Cfrac%7B1%7D%7Ba%7D%20%5Csum_%7Bi=1%7D%5E%7Ba%7D%20x_i%5E2%7D_%7B%5Csigma_a%5E2%20+%20%5Cmu_a%5E2%7D%20+%20%5Cfrac%7B1%7D%7Ba+b%7D%20%5Cfrac%7Bb%7D%7B1%7D%20%5Cunderbrace%7B%5Cfrac%7B1%7D%7Bb%7D%20%5Csum_%7Bi=a+1%7D%5E%7Ba+b%7D%20x_i%5E2%7D_%7B%5Csigma_b%5E2%20+%20%5Cmu_b%5E2%7D%20-%20%5Cmu%5E2%20%5Ctag%7Bsubstitute%20using%20eq%206%7D%20%5C%5C%0A%20%20%20%20%20%20%20%20%20&amp;=%20%5Cfrac%7Ba%7D%7Ba+b%7D%20%5Cleft(%20%5Csigma_a%5E2%20+%20%5Cmu_a%5E2%20%5Cright)%20+%20%5Cfrac%7Bb%7D%7Ba+b%7D%20%5Cleft(%20%5Csigma_b%5E2%20+%20%5Cmu_b%5E2%20%5Cright)%20-%20%5Cmu%5E2%20%5Ctag%7Bsubstitute%20with%20eq%204%7D%20%5C%5C%0A%20%20%20%20%20%20%20%20%20&amp;=%20%5Cfrac%7Ba%7D%7Ba+b%7D%20%5Cleft(%20%5Csigma_a%5E2%20+%20%5Cmu_a%5E2%20%5Cright)%20+%20%5Cfrac%7Bb%7D%7Ba+b%7D%20%5Cleft(%20%5Csigma_b%5E2%20+%20%5Cmu_b%5E2%20%5Cright)%20-%20%5Cleft(%20%5Cfrac%7Ba%7D%7Ba+b%7D%20%5Cmu_a%20+%20%5Cfrac%7Bb%7D%7Ba+b%7D%20%5Cmu_b%20%5Cright)%20%5Ctag%7Bsimplify%7D%20%5C%5C%0A%5CAboxed%7B%0A%20%20%5Csigma%5E2%20%20%20%20%20%20%20%20&amp;=%20%5Cunderbrace%7B%5Cfrac%7Ba%7D%7Ba+b%7D%20%5Csigma_a%5E2%20+%20%5Cfrac%7Bb%7D%7Ba+b%7D%20%5Csigma_b%5E2%7D_%7B%5Ctext%7Bwithin%20group%20variance%7D%7D%20+%20%5Cunderbrace%7B%5Cfrac%7Bab%7D%7B(a+b)%5E2%7D%20%5Cbig(%20%5Cmu_a%20-%20%5Cmu_b%20%5Cbig)%5E2%7D_%7B%5Ctext%7Bbetween%20group%20variance%7D%7D%0A%7D%0A%5Cend%7Balign%7D%0A"></p>
<p>Now, to find the sample variance, <img src="https://latex.codecogs.com/png.latex?s%5E2">, we can use <a href="https://en.wikipedia.org/wiki/Bessel%27s_correction">Bessel’s correction</a>, <img src="https://latex.codecogs.com/png.latex?%5Cfrac%7Bn%7D%7Bn-1%7D">:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0As%5E2%20&amp;=%20%5Cfrac%7Bn%7D%7Bn-1%7D%5Csigma%5E2%20%5C%5C%0A%5Cfrac%7Bn-1%7D%7Bn%7D%20s%5E2%20&amp;=%20%5Csigma%5E2%20%5Ctag%7B7%7D%0A%5Cend%7Balign%7D%0A"></p>
<p>then we have:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5Csigma%5E2%20=%20%5Cfrac%7Ba+b-1%7D%7Ba+b%7D%20s%5E2%20%5C%5C%0A%5Csigma_a%5E2%20=%20%5Cfrac%7Ba-1%7D%7Ba%7D%20s_a%5E2%20%5C%5C%0A%5Csigma_b%5E2%20=%20%5Cfrac%7Bb-1%7D%7Bb%7D%20s_b%5E2%0A%5Cend%7Balign%7D%0A"></p>
<p>we can then substitute these in to find the sample variance,</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5Csigma%5E2%20&amp;=%20%5Cfrac%7Ba%7D%7Ba+b%7D%20%5Csigma_a%5E2%20+%20%5Cfrac%7Bb%7D%7Ba+b%7D%20%5Csigma_b%5E2%20+%20%5Cfrac%7Bab%7D%7B(a+b)%5E2%7D%20%5Cbig(%20%5Cmu_a%20-%20%5Cmu_b%20%5Cbig)%5E2%20%5Ctag%7Bfactor%20out%7D%20%5C%5C%0A%20%20%20%20%20%20%20%20%20&amp;=%20%5Cfrac%7B1%7D%7Ba+b%7D%20%5Cleft%5B%20a%5Csigma_a%5E2%20+%20b%20%5Csigma_b%5E2%20+%20%5Cfrac%7Bab%7D%7B(a+b)%7D%20%5Cbig(%20%5Cmu_a%20-%20%5Cmu_b%20%5Cbig)%5E2%20%5Cright%5D%20%5Ctag%7Bsubstitute%7D%20%5C%5C%0A%5Cfrac%7Ba+b-1%7D%7Ba+b%7D%5Csigma%5E2%20&amp;=%20%5Cfrac%7B1%7D%7Ba+b%7D%20%5Cleft%5B%20a%20%5Cleft(%5Cfrac%7Ba-1%7D%7Ba%7D%5Csigma_a%5E2%20%5Cright)%20+%20b%20%5Cleft(%20%5Cfrac%7Bb-1%7D%7Bb%7D%20%5Csigma_b%5E2%20%5Cright)%20+%20%5Cfrac%7Bab%7D%7B(a+b)%7D%20%5Cbig(%20%5Cmu_a%20-%20%5Cmu_b%20%5Cbig)%5E2%20%5Cright%5D%20%5Ctag%7Bsimplify%7D%20%5C%5C%0A%5CAboxed%7B%0A%20%20s%5E2%20&amp;=%20%5Cfrac%7B1%7D%7Ba+b-1%7D%20%5Cleft%5B%20(a-1)%20s_a%5E2%20+%20(b-1)%20s_b%5E2%20+%20%5Cfrac%7Bab%7D%7B(a+b)%7D%20%5Cbig(%20%5Cmu_a%20-%20%5Cmu_b%20%5Cbig)%5E2%20%5Cright%5D%0A%7D%0A%5Cend%7Balign%7D%0A"></p>
</section>
</section>
<section id="excersises-left-up-to-the-reader" class="level2">
<h2 class="anchored" data-anchor-id="excersises-left-up-to-the-reader">Excersises Left Up to the Reader</h2>
<p>Now that you know how to derive batch updates for the mean and variance, you should be well-equiped to derive the covariance, <img src="https://latex.codecogs.com/png.latex?%5Ctext%7BCov%7D">, and pearson correlation, <img src="https://latex.codecogs.com/png.latex?r">:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5Ctext%7BCov%7D(X,%20Y)%20&amp;=%20%5Cfrac%7B1%7D%7Bn%7D%20%5Csum_%7Bi=1%7D%5En%20(x_i%20-%20%5Cbar%7Bx%7D)(y_i%20-%20%5Cbar%7By%7D)%20%5C%5C%5B10pt%5D%0A%5Crho(X)%20&amp;=%20%5Cfrac%7B%5Csum_%7Bi=1%7D%5En%20(x_i%20-%20%5Cbar%7Bx%7D)(y_i%20-%20%5Cbar%7By%7D)%7D%20%7B%5Csqrt%7B%20%5Csum_%7Bi=1%7D%5En%20(x_i%20-%20%5Cbar%7Bx%7D)%5E2%20%5Csum_%7Bi=1%7D%5En%20(y_i%20-%20%5Cbar%7By%7D)%5E2%20%7D%7D%20%5C%5C%5B10pt%5D%0A%5Crho(X,%20Y)%20&amp;=%20%5Cfrac%7B%5Ctext%7BCov%7D(X,%20Y)%7D%7B%5Csqrt%7B%5Ctext%7BVar%7D(X)%20%5Ctext%7BVar%7D(Y)%7D%7D%0A%5Cend%7Balign%7D%0A"></p>
</section>
<section id="further-reading" class="level2">
<h2 class="anchored" data-anchor-id="further-reading">Further Reading</h2>
<ul>
<li>See this <a href="https://leetcode.com/problems/find-median-from-data-stream/description/">leetcode problem</a> about calculating the median from a data stream.</li>
</ul>


<!-- -->


</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-bibliography"><h2 class="anchored quarto-appendix-heading">References</h2><div id="refs" class="references csl-bib-body hanging-indent">
<div id="ref-schott2016" class="csl-entry">
Schott, James R. 2016. <em>Matrix Analysis for Statistics</em>. 3rd ed. Wiley.
</div>
</div></section></div> ]]></description>
  <category>probability</category>
  <category>machine learning</category>
  <category>streaming</category>
  <guid>https://bear-toes.pages.dev/posts/stream-statistics/</guid>
  <pubDate>Sat, 12 Apr 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Creating Memory Leaks with Parquet Metadata</title>
  <link>https://bear-toes.pages.dev/posts/parquet_metadata/</link>
  <description><![CDATA[ 





<section id="the-setup" class="level2">
<h2 class="anchored" data-anchor-id="the-setup"># The Setup</h2>
<p>In my day job, I develop computer vision models to detect methane emissions in satellite images. We have a training dataset of a few million chips (a subset of the full image from the satellite) that is about 2.5TB on disk stored in a couple thousand parquet files. Now, there’s not a lot of real labelled data for us to use, so a big part of my work is how to generate synthetic methane data.</p>
<p>Recently, our training jobs started running out of CPU memory. Each training epoch takes about 30 minutes, so we try to saturate the GPUs with large batches to train faster. The main bottleneck is data loading and keeping the GPUs saturated with data. To saturate the GPUs, we have multiple workers prefetching batches so the GPUs have high utilization. This means that the CPU needs to hold many extra batches in memory ready and waiting. Suffice to say, our training jobs run with fairly high memory usage; a small change to our training script can OOM (Out of Memory) the whole job.</p>
</section>
<section id="the-situation" class="level2">
<h2 class="anchored" data-anchor-id="the-situation"># The Situation</h2>
<p>Recently, our training jobs started OOMing in the first epoch, running out of CPU memory. We tried adjusting the obvious levers: batch size, the number of workers, and prefetching but the jobs were still running out of memory.</p>
<p>O.K. so what changed? Our training data had changed in two ways: 1. We started tracking additional metadata about our generated training dataset, going from ~15 columns to ~150 columns. The additional columns were mostly float64 data type with a few string or list of string columns. 2. The row group size in the parquet files decreased from 10 to 1, meaning, each row group has a single row.</p>
<p>The new columns aren’t loaded during the training loop, so this couldn’t be the cause of the memory explosion.</p>
<p>We decreased the row group size to 1 so that random sampling of training examples could be truly random. For performance reasons, we were randomly sampling row groups because Parquet does not support partial row group reads. It’s much faster to use the whole row group as a “sample” rather than an individual row because it avoids additional IO from loading the same row group multiple times. With row groups of 10 rows, we used all 10 rows, but then the model always saw those 10 rows together. This is actually even worse because due to how the data is generated, all the samples in a file are from the same MGRS tile. So the rows in a row group are correlated. With row groups of 1, we can still sample by row groups but now batches are composed of truly random samples.</p>
<p>We had benchmarked data loading with row groups of 10 and row groups of 1 and found them comparable. So why not switch and have better randomization?</p>
</section>
<section id="finding-the-source" class="level2">
<h2 class="anchored" data-anchor-id="finding-the-source"># Finding the Source</h2>
</section>
<section id="experimenting" class="level2">
<h2 class="anchored" data-anchor-id="experimenting"># Experimenting</h2>
<p>Let’s inspect the metadata for a file of 200 rows, 15 columns, and row group size of 10.</p>
<div id="dataset-15-columns-row-group-size-10" class="cell" data-execution_count="1">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> numpy <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> np</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb1-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pyarrow <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pa</span>
<span id="cb1-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pyarrow.parquet <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pq</span>
<span id="cb1-5"></span>
<span id="cb1-6">num_cols <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">15</span></span>
<span id="cb1-7">num_rows <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1_000</span></span>
<span id="cb1-8">data <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>x<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>: np.random.rand(num_rows) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> x <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(num_cols)}</span>
<span id="cb1-9">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame(data)</span>
<span id="cb1-10">df.head()</span>
<span id="cb1-11"></span>
<span id="cb1-12">file_path <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data.parquet"</span></span>
<span id="cb1-13">df.to_parquet(</span>
<span id="cb1-14">    file_path,</span>
<span id="cb1-15">    compression<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"zstd"</span>,</span>
<span id="cb1-16">    compression_level<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>,</span>
<span id="cb1-17">    row_group_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>,</span>
<span id="cb1-18">)</span>
<span id="cb1-19"></span>
<span id="cb1-20"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pq.ParquetFile(file_path)</span>
<span id="cb1-21"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span>.metadata)</span></code></pre></div></div>
</details>
<div class="cell-output cell-output-stdout">
<pre><code>&lt;pyarrow._parquet.FileMetaData object at 0x103c73ec0&gt;
  created_by: parquet-cpp-arrow version 23.0.1
  num_columns: 15
  num_rows: 1000
  num_row_groups: 100
  format_version: 2.6
  serialized_size: 163754</code></pre>
</div>
</div>
<p><br>
The metadata for this parquet file is 14,895 bytes or ~0.14 MB. Now let’s see a file of 150 columns with row group size of 1.</p>
<div id="dataset-150-columns-row-group-size-1" class="cell" data-execution_count="2">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1">num_cols <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">150</span></span>
<span id="cb3-2">num_rows <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1_000</span></span>
<span id="cb3-3">data <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>x<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>: np.random.rand(num_rows) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> x <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(num_cols)}</span>
<span id="cb3-4">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame(data)</span>
<span id="cb3-5">df.head()</span>
<span id="cb3-6"></span>
<span id="cb3-7">file_path <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data.parquet"</span></span>
<span id="cb3-8">df.to_parquet(</span>
<span id="cb3-9">    file_path,</span>
<span id="cb3-10">    compression<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"zstd"</span>,</span>
<span id="cb3-11">    compression_level<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>,</span>
<span id="cb3-12">    row_group_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,</span>
<span id="cb3-13">)</span>
<span id="cb3-14"></span>
<span id="cb3-15"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pq.ParquetFile(file_path)</span>
<span id="cb3-16"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span>.metadata)</span></code></pre></div></div>
</details>
<div class="cell-output cell-output-stdout">
<pre><code>&lt;pyarrow._parquet.FileMetaData object at 0x1088eeb10&gt;
  created_by: parquet-cpp-arrow version 23.0.1
  num_columns: 150
  num_rows: 1000
  num_row_groups: 1000
  format_version: 2.6
  serialized_size: 16139711</code></pre>
</div>
</div>
<p><br>
The metadata for this parquet file is 14,642,267 or 14MB, that’s <em>massive</em> for just metadata!</p>
<p>O.K. we’ve discovered that the metadata of our Parquet files had increased, but that should only be held in memory when reading from the file. To randomly sample from our dataset, we create an mapping of the index to the file and row group and then randomly sample the index. Each time a <code>ParquetFile</code> is initialized, it reads the file metadata into memory. This is expensive to do each time we read from the file, so we cache the object.</p>
<div id="caching-parquet-metadata" class="cell" data-execution_count="3">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> functools</span>
<span id="cb5-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> dataclasses <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> dataclass</span>
<span id="cb5-3"></span>
<span id="cb5-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> torch.utils.data <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Dataset</span>
<span id="cb5-5"></span>
<span id="cb5-6"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">@dataclass</span></span>
<span id="cb5-7"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">class</span> Partition:</span>
<span id="cb5-8">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Store information about the partition for faster retrieval."""</span></span>
<span id="cb5-9"></span>
<span id="cb5-10">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span>: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span></span>
<span id="cb5-11">    row_group: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span></span>
<span id="cb5-12"></span>
<span id="cb5-13"></span>
<span id="cb5-14"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">@functools.cache</span></span>
<span id="cb5-15"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> create_parquet_file(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span>: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> pq.ParquetFile:</span>
<span id="cb5-16">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Caches the creation of the ParquetFile."""</span></span>
<span id="cb5-17">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> pq.ParquetFile(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span>)</span>
<span id="cb5-18"></span>
<span id="cb5-19"></span>
<span id="cb5-20"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">class</span> ArrowDataset(Dataset):</span>
<span id="cb5-21"></span>
<span id="cb5-22">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">__init__</span>(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>, dataset: ds.FileSystemDataset) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>:</span>
<span id="cb5-23">    <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.dataset <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> dataset</span>
<span id="cb5-24">        <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.partitions: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>[Partition] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.create_partition_mapping(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.dataset)</span>
<span id="cb5-25"></span>
<span id="cb5-26">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> create_partition_mapping(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>, dataset: ds.Dataset) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">list</span>[Partition]:</span>
<span id="cb5-27">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Create a mapping of partition number to the file and row_group."""</span></span>
<span id="cb5-28">        partitions <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb5-29"></span>
<span id="cb5-30">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> dataset.files:</span>
<span id="cb5-31">            parquet_file <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> create_parquet_file(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span>)</span>
<span id="cb5-32"></span>
<span id="cb5-33">            <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> row_group <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(parquet_file.num_row_groups):</span>
<span id="cb5-34">                partitions.append(Partition(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span>, row_group))</span>
<span id="cb5-35"></span>
<span id="cb5-36">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> partitions</span>
<span id="cb5-37"></span>
<span id="cb5-38"></span>
<span id="cb5-39">    <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">__len__</span>(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">int</span>:</span>
<span id="cb5-40">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""Return the number of row_groups in the dataset.  This should correspond to RecordBatches."""</span></span>
<span id="cb5-41">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.partitions)</span></code></pre></div></div>
</details>
</div>
<p><br>
Our training data is roughly 2,000 files with 1,000 rows per file. At 14MB per file, that’s 27GB of memory just for metadata! But it gets worse! Since we train with 4 GPUs and have 2 workers per GPU and each of those workers has its own process, that means we’re holding roughly 27GB * 4 * 2 = 216GB of metadata in memory! That’s atrocious!</p>
<p>As it turns out, there are three variables that contribute to most of the metadata size (the number of rows being constant): the row group size, the number of columns, and the column name length.</p>
<div id="batch-update-mean-and-variance" class="cell" data-execution_count="4">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> pathlib <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Path</span>
<span id="cb6-2"></span>
<span id="cb6-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> altair <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> alt</span>
<span id="cb6-4"></span>
<span id="cb6-5">num_rows <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1_000</span></span>
<span id="cb6-6">num_columns <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb6-7">num_rg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb6-8">col_name_lengths <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb6-9">metadata_size <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb6-10"></span>
<span id="cb6-11"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> num_cols <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">150</span>]:</span>
<span id="cb6-12">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> name_length <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">50</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>]:</span>
<span id="cb6-13">        col_name <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span>  name_length</span>
<span id="cb6-14">        data <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>x<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}{</span>col_name<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>: np.random.rand(num_rows) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> x <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(num_cols)}</span>
<span id="cb6-15">        df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame(data)</span>
<span id="cb6-16"></span>
<span id="cb6-17">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> row_group_size <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> [<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1_000</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]:</span>
<span id="cb6-18">            path <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"file_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>num_cols<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">cols_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>row_group_size<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">rgsize_</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>name_length<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">namelen.parquet"</span></span>
<span id="cb6-19">            df.to_parquet(</span>
<span id="cb6-20">                path,</span>
<span id="cb6-21">                compression<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"zstd"</span>,</span>
<span id="cb6-22">                compression_level<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>,</span>
<span id="cb6-23">                row_group_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>row_group_size,</span>
<span id="cb6-24">            )</span>
<span id="cb6-25">            <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pq.ParquetFile(path)</span>
<span id="cb6-26"></span>
<span id="cb6-27">            num_columns.append(num_cols)</span>
<span id="cb6-28">            num_rg.append(row_group_size)</span>
<span id="cb6-29">            metadata_size.append(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span>.metadata.serialized_size)</span>
<span id="cb6-30">            col_name_lengths.append(name_length)</span>
<span id="cb6-31"></span>
<span id="cb6-32">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame({</span>
<span id="cb6-33">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"num_cols"</span>: num_columns,</span>
<span id="cb6-34">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"row_group_size"</span>: num_rg,</span>
<span id="cb6-35">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"col_name_lengths"</span>: col_name_lengths,</span>
<span id="cb6-36">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"metadata_size_b"</span>: metadata_size,</span>
<span id="cb6-37">}).assign(</span>
<span id="cb6-38">    metadata_size_mb<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">lambda</span> df: df.metadata_size_b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">/</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1024</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>,</span>
<span id="cb6-39">)</span></code></pre></div></div>
</details>
</div>
<div id="8aa77e63" class="cell" data-execution_count="5">
<div class="cell-output cell-output-display" data-execution_count="3">

<style>
  #altair-viz-d3d174c43d534f91a278e0eead5ef919.vega-embed {
    width: 100%;
    display: flex;
  }

  #altair-viz-d3d174c43d534f91a278e0eead5ef919.vega-embed details,
  #altair-viz-d3d174c43d534f91a278e0eead5ef919.vega-embed details summary {
    position: relative;
  }
</style>
<div id="altair-viz-d3d174c43d534f91a278e0eead5ef919"></div>
<script type="text/javascript">
  var VEGA_DEBUG = (typeof VEGA_DEBUG == "undefined") ? {} : VEGA_DEBUG;
  (function(spec, embedOpt){
    let outputDiv = document.currentScript.previousElementSibling;
    if (outputDiv.id !== "altair-viz-d3d174c43d534f91a278e0eead5ef919") {
      outputDiv = document.getElementById("altair-viz-d3d174c43d534f91a278e0eead5ef919");
    }

    const paths = {
      "vega": "https://cdn.jsdelivr.net/npm/vega@6?noext",
      "vega-lib": "https://cdn.jsdelivr.net/npm/vega-lib?noext",
      "vega-lite": "https://cdn.jsdelivr.net/npm/vega-lite@6.1.0?noext",
      "vega-embed": "https://cdn.jsdelivr.net/npm/vega-embed@7?noext",
    };

    function maybeLoadScript(lib, version) {
      var key = `${lib.replace("-", "")}_version`;
      return (VEGA_DEBUG[key] == version) ?
        Promise.resolve(paths[lib]) :
        new Promise(function(resolve, reject) {
          var s = document.createElement('script');
          document.getElementsByTagName("head")[0].appendChild(s);
          s.async = true;
          s.onload = () => {
            VEGA_DEBUG[key] = version;
            return resolve(paths[lib]);
          };
          s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
          s.src = paths[lib];
        });
    }

    function showError(err) {
      outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
      throw err;
    }

    function displayChart(vegaEmbed) {
      vegaEmbed(outputDiv, spec, embedOpt)
        .catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
    }

    if(typeof define === "function" && define.amd) {
      requirejs.config({paths});
      let deps = ["vega-embed"];
      require(deps, displayChart, err => showError(`Error loading script: ${err.message}`));
    } else {
      maybeLoadScript("vega", "6")
        .then(() => maybeLoadScript("vega-lite", "6.1.0"))
        .then(() => maybeLoadScript("vega-embed", "7"))
        .catch(showError)
        .then(() => displayChart(vegaEmbed));
    }
  })({"config": {"view": {"continuousWidth": 300, "continuousHeight": 300}, "background": "#f8f9fa"}, "data": {"name": "data-b415568c2642fc3edcb2afddce2c466c"}, "mark": {"type": "line", "point": true, "size": 2}, "encoding": {"color": {"field": "row_group_size", "scale": {"range": ["#368BC1", "#F2BB18", "#BB4430", "#8A9A67", "#CC771F", "#8B5260"]}, "title": "Row Group Size", "type": "nominal"}, "opacity": {"value": 1.0}, "strokeDash": {"field": "col_name_lengths", "title": "Column Name Length (chars)", "type": "nominal"}, "x": {"field": "num_cols", "title": "Number of Columns", "type": "quantitative"}, "y": {"field": "metadata_size_mb", "scale": {"type": "log"}, "title": "Metadata Size (MB)", "type": "quantitative"}}, "padding": 10, "title": {"text": ["Parquet metadata sizes for a single file of float columns"], "subtitle": [""]}, "width": 650, "$schema": "https://vega.github.io/schema/vega-lite/v6.1.0.json", "datasets": {"data-b415568c2642fc3edcb2afddce2c466c": [{"num_cols": 1, "row_group_size": 1000, "col_name_lengths": 1, "metadata_size_b": 1459, "file_size_b": 10365, "metadata_size_mb": 0.0013914108276367188, "file_size_mb": 0.009884834289550781}, {"num_cols": 1, "row_group_size": 100, "col_name_lengths": 1, "metadata_size_b": 2458, "file_size_b": 12470, "metadata_size_mb": 0.0023441314697265625, "file_size_mb": 0.011892318725585938}, {"num_cols": 1, "row_group_size": 10, "col_name_lengths": 1, "metadata_size_b": 12452, "file_size_b": 31564, "metadata_size_mb": 0.011875152587890625, "file_size_mb": 0.030101776123046875}, {"num_cols": 1, "row_group_size": 1, "col_name_lengths": 1, "metadata_size_b": 114056, "file_size_b": 224068, "metadata_size_mb": 0.10877227783203125, "file_size_mb": 0.21368789672851562}, {"num_cols": 1, "row_group_size": 1000, "col_name_lengths": 10, "metadata_size_b": 1539, "file_size_b": 10452, "metadata_size_mb": 0.0014677047729492188, "file_size_mb": 0.009967803955078125}, {"num_cols": 1, "row_group_size": 100, "col_name_lengths": 10, "metadata_size_b": 2619, "file_size_b": 12631, "metadata_size_mb": 0.0024976730346679688, "file_size_mb": 0.012045860290527344}, {"num_cols": 1, "row_group_size": 10, "col_name_lengths": 10, "metadata_size_b": 13423, "file_size_b": 32535, "metadata_size_mb": 0.012801170349121094, "file_size_mb": 0.031027793884277344}, {"num_cols": 1, "row_group_size": 1, "col_name_lengths": 10, "metadata_size_b": 123127, "file_size_b": 233139, "metadata_size_mb": 0.11742305755615234, "file_size_mb": 0.22233867645263672}, {"num_cols": 1, "row_group_size": 1000, "col_name_lengths": 50, "metadata_size_b": 1859, "file_size_b": 10774, "metadata_size_mb": 0.0017728805541992188, "file_size_mb": 0.010274887084960938}, {"num_cols": 1, "row_group_size": 100, "col_name_lengths": 50, "metadata_size_b": 3299, "file_size_b": 13311, "metadata_size_mb": 0.0031461715698242188, "file_size_mb": 0.012694358825683594}, {"num_cols": 1, "row_group_size": 10, "col_name_lengths": 50, "metadata_size_b": 17703, "file_size_b": 36815, "metadata_size_mb": 0.016882896423339844, "file_size_mb": 0.035109519958496094}, {"num_cols": 1, "row_group_size": 1, "col_name_lengths": 50, "metadata_size_b": 163407, "file_size_b": 273419, "metadata_size_mb": 0.1558370590209961, "file_size_mb": 0.26075267791748047}, {"num_cols": 1, "row_group_size": 1000, "col_name_lengths": 100, "metadata_size_b": 2251, "file_size_b": 11170, "metadata_size_mb": 0.0021467208862304688, "file_size_mb": 0.010652542114257812}, {"num_cols": 1, "row_group_size": 100, "col_name_lengths": 100, "metadata_size_b": 4141, "file_size_b": 14153, "metadata_size_mb": 0.003949165344238281, "file_size_mb": 0.013497352600097656}, {"num_cols": 1, "row_group_size": 10, "col_name_lengths": 100, "metadata_size_b": 23045, "file_size_b": 42157, "metadata_size_mb": 0.02197742462158203, "file_size_mb": 0.04020404815673828}, {"num_cols": 1, "row_group_size": 1, "col_name_lengths": 100, "metadata_size_b": 213749, "file_size_b": 323761, "metadata_size_mb": 0.20384693145751953, "file_size_mb": 0.3087625503540039}, {"num_cols": 10, "row_group_size": 1000, "col_name_lengths": 1, "metadata_size_b": 5186, "file_size_b": 94210, "metadata_size_mb": 0.0049457550048828125, "file_size_mb": 0.08984565734863281}, {"num_cols": 10, "row_group_size": 100, "col_name_lengths": 1, "metadata_size_b": 13971, "file_size_b": 113983, "metadata_size_mb": 0.013323783874511719, "file_size_mb": 0.1087026596069336}, {"num_cols": 10, "row_group_size": 10, "col_name_lengths": 1, "metadata_size_b": 100835, "file_size_b": 291847, "metadata_size_mb": 0.09616374969482422, "file_size_mb": 0.27832698822021484}, {"num_cols": 10, "row_group_size": 1, "col_name_lengths": 1, "metadata_size_b": 972948, "file_size_b": 2072960, "metadata_size_mb": 0.9278755187988281, "file_size_mb": 1.9769287109375}, {"num_cols": 10, "row_group_size": 1000, "col_name_lengths": 10, "metadata_size_b": 5898, "file_size_b": 94901, "metadata_size_mb": 0.0056247711181640625, "file_size_mb": 0.09050464630126953}, {"num_cols": 10, "row_group_size": 100, "col_name_lengths": 10, "metadata_size_b": 15493, "file_size_b": 115505, "metadata_size_mb": 0.014775276184082031, "file_size_mb": 0.1101541519165039}, {"num_cols": 10, "row_group_size": 10, "col_name_lengths": 10, "metadata_size_b": 110457, "file_size_b": 301469, "metadata_size_mb": 0.10534000396728516, "file_size_mb": 0.2875032424926758}, {"num_cols": 10, "row_group_size": 1, "col_name_lengths": 10, "metadata_size_b": 1063570, "file_size_b": 2163582, "metadata_size_mb": 1.0142993927001953, "file_size_mb": 2.063352584838867}, {"num_cols": 10, "row_group_size": 1000, "col_name_lengths": 50, "metadata_size_b": 9098, "file_size_b": 98115, "metadata_size_mb": 0.008676528930664062, "file_size_mb": 0.09356975555419922}, {"num_cols": 10, "row_group_size": 100, "col_name_lengths": 50, "metadata_size_b": 22293, "file_size_b": 122305, "metadata_size_mb": 0.02126026153564453, "file_size_mb": 0.1166391372680664}, {"num_cols": 10, "row_group_size": 10, "col_name_lengths": 50, "metadata_size_b": 153257, "file_size_b": 344269, "metadata_size_mb": 0.14615726470947266, "file_size_mb": 0.3283205032348633}, {"num_cols": 10, "row_group_size": 1, "col_name_lengths": 50, "metadata_size_b": 1466370, "file_size_b": 2566382, "metadata_size_mb": 1.3984394073486328, "file_size_mb": 2.4474925994873047}, {"num_cols": 10, "row_group_size": 1000, "col_name_lengths": 100, "metadata_size_b": 13114, "file_size_b": 102139, "metadata_size_mb": 0.012506484985351562, "file_size_mb": 0.09740734100341797}, {"num_cols": 10, "row_group_size": 100, "col_name_lengths": 100, "metadata_size_b": 30809, "file_size_b": 130821, "metadata_size_mb": 0.029381752014160156, "file_size_mb": 0.12476062774658203}, {"num_cols": 10, "row_group_size": 10, "col_name_lengths": 100, "metadata_size_b": 206773, "file_size_b": 397785, "metadata_size_mb": 0.19719409942626953, "file_size_mb": 0.37935733795166016}, {"num_cols": 10, "row_group_size": 1, "col_name_lengths": 100, "metadata_size_b": 1969886, "file_size_b": 3069898, "metadata_size_mb": 1.8786296844482422, "file_size_mb": 2.927682876586914}, {"num_cols": 50, "row_group_size": 1000, "col_name_lengths": 1, "metadata_size_b": 22001, "file_size_b": 467035, "metadata_size_mb": 0.020981788635253906, "file_size_mb": 0.44539928436279297}, {"num_cols": 50, "row_group_size": 100, "col_name_lengths": 1, "metadata_size_b": 65635, "file_size_b": 565647, "metadata_size_mb": 0.06259441375732422, "file_size_mb": 0.5394430160522461}, {"num_cols": 50, "row_group_size": 10, "col_name_lengths": 1, "metadata_size_b": 497993, "file_size_b": 1453005, "metadata_size_mb": 0.47492313385009766, "file_size_mb": 1.3856935501098633}, {"num_cols": 50, "row_group_size": 1, "col_name_lengths": 1, "metadata_size_b": 4907571, "file_size_b": 10407583, "metadata_size_mb": 4.680224418640137, "file_size_mb": 9.925444602966309}, {"num_cols": 50, "row_group_size": 1000, "col_name_lengths": 10, "metadata_size_b": 25753, "file_size_b": 470837, "metadata_size_mb": 0.024559974670410156, "file_size_mb": 0.44902515411376953}, {"num_cols": 50, "row_group_size": 100, "col_name_lengths": 10, "metadata_size_b": 73437, "file_size_b": 573449, "metadata_size_mb": 0.07003498077392578, "file_size_mb": 0.5468835830688477}, {"num_cols": 50, "row_group_size": 10, "col_name_lengths": 10, "metadata_size_b": 546295, "file_size_b": 1501307, "metadata_size_mb": 0.5209875106811523, "file_size_mb": 1.431757926940918}, {"num_cols": 50, "row_group_size": 1, "col_name_lengths": 10, "metadata_size_b": 5360873, "file_size_b": 10860885, "metadata_size_mb": 5.112526893615723, "file_size_mb": 10.357747077941895}, {"num_cols": 50, "row_group_size": 1000, "col_name_lengths": 50, "metadata_size_b": 41754, "file_size_b": 486716, "metadata_size_mb": 0.03981971740722656, "file_size_mb": 0.4641685485839844}, {"num_cols": 50, "row_group_size": 100, "col_name_lengths": 50, "metadata_size_b": 107438, "file_size_b": 607450, "metadata_size_mb": 0.10246086120605469, "file_size_mb": 0.5793094635009766}, {"num_cols": 50, "row_group_size": 10, "col_name_lengths": 50, "metadata_size_b": 760296, "file_size_b": 1715308, "metadata_size_mb": 0.7250747680664062, "file_size_mb": 1.6358451843261719}, {"num_cols": 50, "row_group_size": 1, "col_name_lengths": 50, "metadata_size_b": 7374874, "file_size_b": 12874886, "metadata_size_mb": 7.033227920532227, "file_size_mb": 12.278448104858398}, {"num_cols": 50, "row_group_size": 1000, "col_name_lengths": 100, "metadata_size_b": 61666, "file_size_b": 506703, "metadata_size_mb": 0.05880928039550781, "file_size_mb": 0.4832296371459961}, {"num_cols": 50, "row_group_size": 100, "col_name_lengths": 100, "metadata_size_b": 149850, "file_size_b": 649862, "metadata_size_mb": 0.14290809631347656, "file_size_mb": 0.6197566986083984}, {"num_cols": 50, "row_group_size": 10, "col_name_lengths": 100, "metadata_size_b": 1027708, "file_size_b": 1982720, "metadata_size_mb": 0.9800987243652344, "file_size_mb": 1.890869140625}, {"num_cols": 50, "row_group_size": 1, "col_name_lengths": 100, "metadata_size_b": 9892286, "file_size_b": 15392298, "metadata_size_mb": 9.434019088745117, "file_size_mb": 14.679239273071289}, {"num_cols": 100, "row_group_size": 1000, "col_name_lengths": 1, "metadata_size_b": 43025, "file_size_b": 933152, "metadata_size_mb": 0.041031837463378906, "file_size_mb": 0.889923095703125}, {"num_cols": 100, "row_group_size": 100, "col_name_lengths": 1, "metadata_size_b": 130209, "file_size_b": 1130221, "metadata_size_mb": 0.1241769790649414, "file_size_mb": 1.0778627395629883}, {"num_cols": 100, "row_group_size": 10, "col_name_lengths": 1, "metadata_size_b": 1003132, "file_size_b": 2913144, "metadata_size_mb": 0.9566612243652344, "file_size_mb": 2.7781906127929688}, {"num_cols": 100, "row_group_size": 1, "col_name_lengths": 1, "metadata_size_b": 9825741, "file_size_b": 20825753, "metadata_size_mb": 9.370556831359863, "file_size_mb": 19.86098575592041}, {"num_cols": 100, "row_group_size": 1000, "col_name_lengths": 10, "metadata_size_b": 50569, "file_size_b": 940604, "metadata_size_mb": 0.048226356506347656, "file_size_mb": 0.8970298767089844}, {"num_cols": 100, "row_group_size": 100, "col_name_lengths": 10, "metadata_size_b": 145853, "file_size_b": 1145865, "metadata_size_mb": 0.13909626007080078, "file_size_mb": 1.0927820205688477}, {"num_cols": 100, "row_group_size": 10, "col_name_lengths": 10, "metadata_size_b": 1099776, "file_size_b": 3009788, "metadata_size_mb": 1.048828125, "file_size_mb": 2.8703575134277344}, {"num_cols": 100, "row_group_size": 1, "col_name_lengths": 10, "metadata_size_b": 10732385, "file_size_b": 21732397, "metadata_size_mb": 10.235199928283691, "file_size_mb": 20.72562885284424}, {"num_cols": 100, "row_group_size": 1000, "col_name_lengths": 50, "metadata_size_b": 82570, "file_size_b": 972621, "metadata_size_mb": 0.07874488830566406, "file_size_mb": 0.9275636672973633}, {"num_cols": 100, "row_group_size": 100, "col_name_lengths": 50, "metadata_size_b": 213854, "file_size_b": 1213866, "metadata_size_mb": 0.2039470672607422, "file_size_mb": 1.157632827758789}, {"num_cols": 100, "row_group_size": 10, "col_name_lengths": 50, "metadata_size_b": 1527777, "file_size_b": 3437789, "metadata_size_mb": 1.4570016860961914, "file_size_mb": 3.278531074523926}, {"num_cols": 100, "row_group_size": 1, "col_name_lengths": 50, "metadata_size_b": 14760386, "file_size_b": 25760398, "metadata_size_mb": 14.076601028442383, "file_size_mb": 24.56702995300293}, {"num_cols": 100, "row_group_size": 1000, "col_name_lengths": 100, "metadata_size_b": 122346, "file_size_b": 1012382, "metadata_size_mb": 0.11667823791503906, "file_size_mb": 0.9654827117919922}, {"num_cols": 100, "row_group_size": 100, "col_name_lengths": 100, "metadata_size_b": 298630, "file_size_b": 1298642, "metadata_size_mb": 0.28479576110839844, "file_size_mb": 1.2384815216064453}, {"num_cols": 100, "row_group_size": 10, "col_name_lengths": 100, "metadata_size_b": 2062553, "file_size_b": 3972565, "metadata_size_mb": 1.9670038223266602, "file_size_mb": 3.7885332107543945}, {"num_cols": 100, "row_group_size": 1, "col_name_lengths": 100, "metadata_size_b": 19795162, "file_size_b": 30795174, "metadata_size_mb": 18.878137588500977, "file_size_mb": 29.368566513061523}, {"num_cols": 150, "row_group_size": 1000, "col_name_lengths": 1, "metadata_size_b": 64710, "file_size_b": 1399708, "metadata_size_mb": 0.06171226501464844, "file_size_mb": 1.3348655700683594}, {"num_cols": 150, "row_group_size": 100, "col_name_lengths": 1, "metadata_size_b": 196742, "file_size_b": 1696754, "metadata_size_mb": 0.18762779235839844, "file_size_mb": 1.6181507110595703}, {"num_cols": 150, "row_group_size": 10, "col_name_lengths": 1, "metadata_size_b": 1514867, "file_size_b": 4379879, "metadata_size_mb": 1.4446897506713867, "file_size_mb": 4.17697811126709}, {"num_cols": 150, "row_group_size": 1, "col_name_lengths": 1, "metadata_size_b": 14793390, "file_size_b": 31293402, "metadata_size_mb": 14.108076095581055, "file_size_mb": 29.843713760375977}, {"num_cols": 150, "row_group_size": 1000, "col_name_lengths": 10, "metadata_size_b": 75794, "file_size_b": 1410805, "metadata_size_mb": 0.07228279113769531, "file_size_mb": 1.3454484939575195}, {"num_cols": 150, "row_group_size": 100, "col_name_lengths": 10, "metadata_size_b": 219976, "file_size_b": 1719988, "metadata_size_mb": 0.20978546142578125, "file_size_mb": 1.6403083801269531}, {"num_cols": 150, "row_group_size": 10, "col_name_lengths": 10, "metadata_size_b": 1659601, "file_size_b": 4524613, "metadata_size_mb": 1.582718849182129, "file_size_mb": 4.315007209777832}, {"num_cols": 150, "row_group_size": 1, "col_name_lengths": 10, "metadata_size_b": 16153124, "file_size_b": 32653136, "metadata_size_mb": 15.40481948852539, "file_size_mb": 31.140457153320312}, {"num_cols": 150, "row_group_size": 1000, "col_name_lengths": 50, "metadata_size_b": 123794, "file_size_b": 1458769, "metadata_size_mb": 0.11805915832519531, "file_size_mb": 1.391190528869629}, {"num_cols": 150, "row_group_size": 100, "col_name_lengths": 50, "metadata_size_b": 321976, "file_size_b": 1821988, "metadata_size_mb": 0.30706024169921875, "file_size_mb": 1.7375831604003906}, {"num_cols": 150, "row_group_size": 10, "col_name_lengths": 50, "metadata_size_b": 2301601, "file_size_b": 5166613, "metadata_size_mb": 2.1949777603149414, "file_size_mb": 4.9272661209106445}, {"num_cols": 150, "row_group_size": 1, "col_name_lengths": 50, "metadata_size_b": 22195124, "file_size_b": 38695136, "metadata_size_mb": 21.166919708251953, "file_size_mb": 36.902557373046875}, {"num_cols": 150, "row_group_size": 1000, "col_name_lengths": 100, "metadata_size_b": 183438, "file_size_b": 1518519, "metadata_size_mb": 0.1749401092529297, "file_size_mb": 1.4481725692749023}, {"num_cols": 150, "row_group_size": 100, "col_name_lengths": 100, "metadata_size_b": 449120, "file_size_b": 1949132, "metadata_size_mb": 0.428314208984375, "file_size_mb": 1.8588371276855469}, {"num_cols": 150, "row_group_size": 10, "col_name_lengths": 100, "metadata_size_b": 3103745, "file_size_b": 5968757, "metadata_size_mb": 2.9599618911743164, "file_size_mb": 5.6922502517700195}, {"num_cols": 150, "row_group_size": 1, "col_name_lengths": 100, "metadata_size_b": 29747268, "file_size_b": 46247280, "metadata_size_mb": 28.369205474853516, "file_size_mb": 44.10484313964844}]}}, {"mode": "vega-lite"});
</script>
</div>
</div>
<p><br>
When adding the new columns to our dataset, we used long descriptive names which turns out to also be a contributing factor.</p>
<p>TODO: talk about chart</p>
</section>
<section id="removing-the-memory-landmines" class="level2">
<h2 class="anchored" data-anchor-id="removing-the-memory-landmines"># Removing the Memory Landmines</h2>
<p>Since statistics are calculated for each row group, increasing the number of row groups also increases the amount of statistics calculated and stored in the metadata. The statistics are used during predicate push down to check if the row group matches the predicate and if not, the row group can be skipped. Smaller row groups reduces the utility of the statistics, and storing statistics for a single row is just silly. So we can remove the statistics for our purposes.</p>
<p>Row groups are also encoded (actually the column chunks in a row group are encoded). Encoding small row groups doesn’t allow for great compression and for our use case, encoding the row groups increased the size of the metadata. So we can remove the encoding.</p>
<p>Parquet files created with Pandas or PyArrow, by default, include the Arrow schema as well. The Arrow schema <a href="https://arrow.apache.org/docs/python/generated/pyarrow.parquet.write_table.html#pyarrow-parquet-write-table">includes additional information</a>. to faithfully recreate the original Arrow data. We aren’t using complex types that would benefit from this, so we can remove the extra schema.</p>
<p>Shrinking the size of the metadata boils down to three lines when writing the parquet files:</p>
<div id="dataset-150-columns-row-group-size-1-reduced-metadata" class="cell" data-execution_count="6">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb7-1">num_cols <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">150</span></span>
<span id="cb7-2">num_rows <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1_000</span></span>
<span id="cb7-3">data <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>x<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>: np.random.rand(num_rows) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> x <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(num_cols)}</span>
<span id="cb7-4">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame(data)</span>
<span id="cb7-5">df.head()</span>
<span id="cb7-6"></span>
<span id="cb7-7">file_path <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"data.parquet"</span></span>
<span id="cb7-8">df.to_parquet(</span>
<span id="cb7-9">    file_path,</span>
<span id="cb7-10">    compression<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"zstd"</span>,</span>
<span id="cb7-11">    compression_level<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">9</span>,</span>
<span id="cb7-12">    row_group_size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>,</span>
<span id="cb7-13">    write_statistics<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>,</span>
<span id="cb7-14">    store_schema<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>,</span>
<span id="cb7-15">    use_dictionary<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span></span>
<span id="cb7-16">)</span>
<span id="cb7-17"></span>
<span id="cb7-18"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pq.ParquetFile(file_path)</span>
<span id="cb7-19"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">file</span>.metadata)</span></code></pre></div></div>
</details>
<div class="cell-output cell-output-stdout">
<pre><code>&lt;pyarrow._parquet.FileMetaData object at 0x108d7d170&gt;
  created_by: parquet-cpp-arrow version 23.0.1
  num_columns: 150
  num_rows: 1000
  num_row_groups: 1000
  format_version: 2.6
  serialized_size: 6934573</code></pre>
</div>
</div>
<p><br>
The size of the metadata is now 5,737,509 bytes or 5.4MB, that’s 40% of the initial 14MB.</p>
<p>And we can rerun the experiment with the new parameters.</p>
<div id="14c736e5" class="cell" data-execution_count="7">
<div class="cell-output cell-output-display" data-execution_count="5">

<style>
  #altair-viz-3ea597dff7b847b39aeb1d19ff821b92.vega-embed {
    width: 100%;
    display: flex;
  }

  #altair-viz-3ea597dff7b847b39aeb1d19ff821b92.vega-embed details,
  #altair-viz-3ea597dff7b847b39aeb1d19ff821b92.vega-embed details summary {
    position: relative;
  }
</style>
<div id="altair-viz-3ea597dff7b847b39aeb1d19ff821b92"></div>
<script type="text/javascript">
  var VEGA_DEBUG = (typeof VEGA_DEBUG == "undefined") ? {} : VEGA_DEBUG;
  (function(spec, embedOpt){
    let outputDiv = document.currentScript.previousElementSibling;
    if (outputDiv.id !== "altair-viz-3ea597dff7b847b39aeb1d19ff821b92") {
      outputDiv = document.getElementById("altair-viz-3ea597dff7b847b39aeb1d19ff821b92");
    }

    const paths = {
      "vega": "https://cdn.jsdelivr.net/npm/vega@6?noext",
      "vega-lib": "https://cdn.jsdelivr.net/npm/vega-lib?noext",
      "vega-lite": "https://cdn.jsdelivr.net/npm/vega-lite@6.1.0?noext",
      "vega-embed": "https://cdn.jsdelivr.net/npm/vega-embed@7?noext",
    };

    function maybeLoadScript(lib, version) {
      var key = `${lib.replace("-", "")}_version`;
      return (VEGA_DEBUG[key] == version) ?
        Promise.resolve(paths[lib]) :
        new Promise(function(resolve, reject) {
          var s = document.createElement('script');
          document.getElementsByTagName("head")[0].appendChild(s);
          s.async = true;
          s.onload = () => {
            VEGA_DEBUG[key] = version;
            return resolve(paths[lib]);
          };
          s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
          s.src = paths[lib];
        });
    }

    function showError(err) {
      outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
      throw err;
    }

    function displayChart(vegaEmbed) {
      vegaEmbed(outputDiv, spec, embedOpt)
        .catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
    }

    if(typeof define === "function" && define.amd) {
      requirejs.config({paths});
      let deps = ["vega-embed"];
      require(deps, displayChart, err => showError(`Error loading script: ${err.message}`));
    } else {
      maybeLoadScript("vega", "6")
        .then(() => maybeLoadScript("vega-lite", "6.1.0"))
        .then(() => maybeLoadScript("vega-embed", "7"))
        .catch(showError)
        .then(() => displayChart(vegaEmbed));
    }
  })({"config": {"view": {"continuousWidth": 300, "continuousHeight": 300}, "background": "#f8f9fa"}, "data": {"name": "data-891122cc7a5b0893104b30be992b1019"}, "mark": {"type": "line", "point": true, "size": 2}, "encoding": {"color": {"field": "row_group_size", "scale": {"range": ["#368BC1", "#F2BB18", "#BB4430", "#8A9A67", "#CC771F", "#8B5260"]}, "title": "Row Group Size", "type": "nominal"}, "opacity": {"value": 1.0}, "strokeDash": {"field": "col_name_lengths", "title": "Column Name Length (chars)", "type": "nominal"}, "x": {"field": "num_cols", "title": "Number of Columns", "type": "quantitative"}, "y": {"field": "metadata_size_mb", "scale": {"type": "log"}, "title": "Metadata Size (MB)", "type": "quantitative"}}, "padding": 10, "title": {"text": ["Parquet metadata sizes for a single file of float columns"], "subtitle": ["No statistics, no dictionary encoding, no arrow schema"]}, "width": 650, "$schema": "https://vega.github.io/schema/vega-lite/v6.1.0.json", "datasets": {"data-891122cc7a5b0893104b30be992b1019": [{"num_cols": 1, "row_group_size": 1000, "col_name_lengths": 1, "metadata_size_b": 125, "file_size_b": 10365, "metadata_size_mb": 0.00011920928955078125, "file_size_mb": 0.009884834289550781}, {"num_cols": 1, "row_group_size": 100, "col_name_lengths": 1, "metadata_size_b": 629, "file_size_b": 12470, "metadata_size_mb": 0.0005998611450195312, "file_size_mb": 0.011892318725585938}, {"num_cols": 1, "row_group_size": 10, "col_name_lengths": 1, "metadata_size_b": 5564, "file_size_b": 31564, "metadata_size_mb": 0.005306243896484375, "file_size_mb": 0.030101776123046875}, {"num_cols": 1, "row_group_size": 1, "col_name_lengths": 1, "metadata_size_b": 52615, "file_size_b": 224068, "metadata_size_mb": 0.050177574157714844, "file_size_mb": 0.21368789672851562}, {"num_cols": 1, "row_group_size": 1000, "col_name_lengths": 10, "metadata_size_b": 143, "file_size_b": 10452, "metadata_size_mb": 0.00013637542724609375, "file_size_mb": 0.009967803955078125}, {"num_cols": 1, "row_group_size": 100, "col_name_lengths": 10, "metadata_size_b": 728, "file_size_b": 12631, "metadata_size_mb": 0.00069427490234375, "file_size_mb": 0.012045860290527344}, {"num_cols": 1, "row_group_size": 10, "col_name_lengths": 10, "metadata_size_b": 6473, "file_size_b": 32535, "metadata_size_mb": 0.006173133850097656, "file_size_mb": 0.031027793884277344}, {"num_cols": 1, "row_group_size": 1, "col_name_lengths": 10, "metadata_size_b": 61624, "file_size_b": 233139, "metadata_size_mb": 0.05876922607421875, "file_size_mb": 0.22233867645263672}, {"num_cols": 1, "row_group_size": 1000, "col_name_lengths": 50, "metadata_size_b": 223, "file_size_b": 10774, "metadata_size_mb": 0.00021266937255859375, "file_size_mb": 0.010274887084960938}, {"num_cols": 1, "row_group_size": 100, "col_name_lengths": 50, "metadata_size_b": 1168, "file_size_b": 13311, "metadata_size_mb": 0.0011138916015625, "file_size_mb": 0.012694358825683594}, {"num_cols": 1, "row_group_size": 10, "col_name_lengths": 50, "metadata_size_b": 10513, "file_size_b": 36815, "metadata_size_mb": 0.010025978088378906, "file_size_mb": 0.035109519958496094}, {"num_cols": 1, "row_group_size": 1, "col_name_lengths": 50, "metadata_size_b": 101664, "file_size_b": 273419, "metadata_size_mb": 0.096954345703125, "file_size_mb": 0.26075267791748047}, {"num_cols": 1, "row_group_size": 1000, "col_name_lengths": 100, "metadata_size_b": 323, "file_size_b": 11170, "metadata_size_mb": 0.00030803680419921875, "file_size_mb": 0.010652542114257812}, {"num_cols": 1, "row_group_size": 100, "col_name_lengths": 100, "metadata_size_b": 1718, "file_size_b": 14153, "metadata_size_mb": 0.0016384124755859375, "file_size_mb": 0.013497352600097656}, {"num_cols": 1, "row_group_size": 10, "col_name_lengths": 100, "metadata_size_b": 15563, "file_size_b": 42157, "metadata_size_mb": 0.014842033386230469, "file_size_mb": 0.04020404815673828}, {"num_cols": 1, "row_group_size": 1, "col_name_lengths": 100, "metadata_size_b": 151714, "file_size_b": 323761, "metadata_size_mb": 0.1446857452392578, "file_size_mb": 0.3087625503540039}, {"num_cols": 10, "row_group_size": 1000, "col_name_lengths": 1, "metadata_size_b": 594, "file_size_b": 94210, "metadata_size_mb": 0.0005664825439453125, "file_size_mb": 0.08984565734863281}, {"num_cols": 10, "row_group_size": 100, "col_name_lengths": 1, "metadata_size_b": 4366, "file_size_b": 113983, "metadata_size_mb": 0.0041637420654296875, "file_size_mb": 0.1087026596069336}, {"num_cols": 10, "row_group_size": 10, "col_name_lengths": 1, "metadata_size_b": 40835, "file_size_b": 291847, "metadata_size_mb": 0.03894329071044922, "file_size_mb": 0.27832698822021484}, {"num_cols": 10, "row_group_size": 1, "col_name_lengths": 1, "metadata_size_b": 387899, "file_size_b": 2072960, "metadata_size_mb": 0.36992931365966797, "file_size_mb": 1.9769287109375}, {"num_cols": 10, "row_group_size": 1000, "col_name_lengths": 10, "metadata_size_b": 774, "file_size_b": 94901, "metadata_size_mb": 0.0007381439208984375, "file_size_mb": 0.09050464630126953}, {"num_cols": 10, "row_group_size": 100, "col_name_lengths": 10, "metadata_size_b": 5356, "file_size_b": 115505, "metadata_size_mb": 0.005107879638671875, "file_size_mb": 0.1101541519165039}, {"num_cols": 10, "row_group_size": 10, "col_name_lengths": 10, "metadata_size_b": 49925, "file_size_b": 301469, "metadata_size_mb": 0.04761219024658203, "file_size_mb": 0.2875032424926758}, {"num_cols": 10, "row_group_size": 1, "col_name_lengths": 10, "metadata_size_b": 477989, "file_size_b": 2163582, "metadata_size_mb": 0.45584583282470703, "file_size_mb": 2.063352584838867}, {"num_cols": 10, "row_group_size": 1000, "col_name_lengths": 50, "metadata_size_b": 1574, "file_size_b": 98115, "metadata_size_mb": 0.0015010833740234375, "file_size_mb": 0.09356975555419922}, {"num_cols": 10, "row_group_size": 100, "col_name_lengths": 50, "metadata_size_b": 9756, "file_size_b": 122305, "metadata_size_mb": 0.009304046630859375, "file_size_mb": 0.1166391372680664}, {"num_cols": 10, "row_group_size": 10, "col_name_lengths": 50, "metadata_size_b": 90325, "file_size_b": 344269, "metadata_size_mb": 0.08614063262939453, "file_size_mb": 0.3283205032348633}, {"num_cols": 10, "row_group_size": 1, "col_name_lengths": 50, "metadata_size_b": 878389, "file_size_b": 2566382, "metadata_size_mb": 0.8376970291137695, "file_size_mb": 2.4474925994873047}, {"num_cols": 10, "row_group_size": 1000, "col_name_lengths": 100, "metadata_size_b": 2574, "file_size_b": 102139, "metadata_size_mb": 0.0024547576904296875, "file_size_mb": 0.09740734100341797}, {"num_cols": 10, "row_group_size": 100, "col_name_lengths": 100, "metadata_size_b": 15256, "file_size_b": 130821, "metadata_size_mb": 0.01454925537109375, "file_size_mb": 0.12476062774658203}, {"num_cols": 10, "row_group_size": 10, "col_name_lengths": 100, "metadata_size_b": 140825, "file_size_b": 397785, "metadata_size_mb": 0.13430118560791016, "file_size_mb": 0.37935733795166016}, {"num_cols": 10, "row_group_size": 1, "col_name_lengths": 100, "metadata_size_b": 1378889, "file_size_b": 3069898, "metadata_size_mb": 1.3150110244750977, "file_size_mb": 2.927682876586914}, {"num_cols": 50, "row_group_size": 1000, "col_name_lengths": 1, "metadata_size_b": 2757, "file_size_b": 467035, "metadata_size_mb": 0.0026292800903320312, "file_size_mb": 0.44539928436279297}, {"num_cols": 50, "row_group_size": 100, "col_name_lengths": 1, "metadata_size_b": 21298, "file_size_b": 565647, "metadata_size_mb": 0.020311355590820312, "file_size_mb": 0.5394430160522461}, {"num_cols": 50, "row_group_size": 10, "col_name_lengths": 1, "metadata_size_b": 201463, "file_size_b": 1453005, "metadata_size_mb": 0.19213008880615234, "file_size_mb": 1.3856935501098633}, {"num_cols": 50, "row_group_size": 1, "col_name_lengths": 1, "metadata_size_b": 1934971, "file_size_b": 10407583, "metadata_size_mb": 1.845332145690918, "file_size_mb": 9.925444602966309}, {"num_cols": 50, "row_group_size": 1000, "col_name_lengths": 10, "metadata_size_b": 3657, "file_size_b": 470837, "metadata_size_mb": 0.0034875869750976562, "file_size_mb": 0.44902515411376953}, {"num_cols": 50, "row_group_size": 100, "col_name_lengths": 10, "metadata_size_b": 26248, "file_size_b": 573449, "metadata_size_mb": 0.02503204345703125, "file_size_mb": 0.5468835830688477}, {"num_cols": 50, "row_group_size": 10, "col_name_lengths": 10, "metadata_size_b": 246913, "file_size_b": 1501307, "metadata_size_mb": 0.2354745864868164, "file_size_mb": 1.431757926940918}, {"num_cols": 50, "row_group_size": 1, "col_name_lengths": 10, "metadata_size_b": 2385421, "file_size_b": 10860885, "metadata_size_mb": 2.2749147415161133, "file_size_mb": 10.357747077941895}, {"num_cols": 50, "row_group_size": 1000, "col_name_lengths": 50, "metadata_size_b": 7657, "file_size_b": 486716, "metadata_size_mb": 0.007302284240722656, "file_size_mb": 0.4641685485839844}, {"num_cols": 50, "row_group_size": 100, "col_name_lengths": 50, "metadata_size_b": 48248, "file_size_b": 607450, "metadata_size_mb": 0.04601287841796875, "file_size_mb": 0.5793094635009766}, {"num_cols": 50, "row_group_size": 10, "col_name_lengths": 50, "metadata_size_b": 448913, "file_size_b": 1715308, "metadata_size_mb": 0.4281167984008789, "file_size_mb": 1.6358451843261719}, {"num_cols": 50, "row_group_size": 1, "col_name_lengths": 50, "metadata_size_b": 4387421, "file_size_b": 12874886, "metadata_size_mb": 4.184170722961426, "file_size_mb": 12.278448104858398}, {"num_cols": 50, "row_group_size": 1000, "col_name_lengths": 100, "metadata_size_b": 12657, "file_size_b": 506703, "metadata_size_mb": 0.012070655822753906, "file_size_mb": 0.4832296371459961}, {"num_cols": 50, "row_group_size": 100, "col_name_lengths": 100, "metadata_size_b": 75748, "file_size_b": 649862, "metadata_size_mb": 0.07223892211914062, "file_size_mb": 0.6197566986083984}, {"num_cols": 50, "row_group_size": 10, "col_name_lengths": 100, "metadata_size_b": 701413, "file_size_b": 1982720, "metadata_size_mb": 0.668919563293457, "file_size_mb": 1.890869140625}, {"num_cols": 50, "row_group_size": 1, "col_name_lengths": 100, "metadata_size_b": 6889921, "file_size_b": 15392298, "metadata_size_mb": 6.570740699768066, "file_size_mb": 14.679239273071289}, {"num_cols": 100, "row_group_size": 1000, "col_name_lengths": 1, "metadata_size_b": 5458, "file_size_b": 933152, "metadata_size_mb": 0.0052051544189453125, "file_size_mb": 0.889923095703125}, {"num_cols": 100, "row_group_size": 100, "col_name_lengths": 1, "metadata_size_b": 42449, "file_size_b": 1130221, "metadata_size_mb": 0.040482521057128906, "file_size_mb": 1.0778627395629883}, {"num_cols": 100, "row_group_size": 10, "col_name_lengths": 1, "metadata_size_b": 403284, "file_size_b": 2913144, "metadata_size_mb": 0.3846015930175781, "file_size_mb": 2.7781906127929688}, {"num_cols": 100, "row_group_size": 1, "col_name_lengths": 1, "metadata_size_b": 3885874, "file_size_b": 20825753, "metadata_size_mb": 3.7058582305908203, "file_size_mb": 19.86098575592041}, {"num_cols": 100, "row_group_size": 1000, "col_name_lengths": 10, "metadata_size_b": 7258, "file_size_b": 940604, "metadata_size_mb": 0.0069217681884765625, "file_size_mb": 0.8970298767089844}, {"num_cols": 100, "row_group_size": 100, "col_name_lengths": 10, "metadata_size_b": 52349, "file_size_b": 1145865, "metadata_size_mb": 0.04992389678955078, "file_size_mb": 1.0927820205688477}, {"num_cols": 100, "row_group_size": 10, "col_name_lengths": 10, "metadata_size_b": 494184, "file_size_b": 3009788, "metadata_size_mb": 0.47129058837890625, "file_size_mb": 2.8703575134277344}, {"num_cols": 100, "row_group_size": 1, "col_name_lengths": 10, "metadata_size_b": 4786774, "file_size_b": 21732397, "metadata_size_mb": 4.565023422241211, "file_size_mb": 20.72562885284424}, {"num_cols": 100, "row_group_size": 1000, "col_name_lengths": 50, "metadata_size_b": 15258, "file_size_b": 972621, "metadata_size_mb": 0.014551162719726562, "file_size_mb": 0.9275636672973633}, {"num_cols": 100, "row_group_size": 100, "col_name_lengths": 50, "metadata_size_b": 96349, "file_size_b": 1213866, "metadata_size_mb": 0.09188556671142578, "file_size_mb": 1.157632827758789}, {"num_cols": 100, "row_group_size": 10, "col_name_lengths": 50, "metadata_size_b": 898184, "file_size_b": 3437789, "metadata_size_mb": 0.8565750122070312, "file_size_mb": 3.278531074523926}, {"num_cols": 100, "row_group_size": 1, "col_name_lengths": 50, "metadata_size_b": 8790774, "file_size_b": 25760398, "metadata_size_mb": 8.383535385131836, "file_size_mb": 24.56702995300293}, {"num_cols": 100, "row_group_size": 1000, "col_name_lengths": 100, "metadata_size_b": 25258, "file_size_b": 1012382, "metadata_size_mb": 0.024087905883789062, "file_size_mb": 0.9654827117919922}, {"num_cols": 100, "row_group_size": 100, "col_name_lengths": 100, "metadata_size_b": 151349, "file_size_b": 1298642, "metadata_size_mb": 0.14433765411376953, "file_size_mb": 1.2384815216064453}, {"num_cols": 100, "row_group_size": 10, "col_name_lengths": 100, "metadata_size_b": 1403184, "file_size_b": 3972565, "metadata_size_mb": 1.3381805419921875, "file_size_mb": 3.7885332107543945}, {"num_cols": 100, "row_group_size": 1, "col_name_lengths": 100, "metadata_size_b": 13795774, "file_size_b": 30795174, "metadata_size_mb": 13.156675338745117, "file_size_mb": 29.368566513061523}, {"num_cols": 150, "row_group_size": 1000, "col_name_lengths": 1, "metadata_size_b": 8274, "file_size_b": 1399708, "metadata_size_mb": 0.007890701293945312, "file_size_mb": 1.3348655700683594}, {"num_cols": 150, "row_group_size": 100, "col_name_lengths": 1, "metadata_size_b": 64412, "file_size_b": 1696754, "metadata_size_mb": 0.061428070068359375, "file_size_mb": 1.6181507110595703}, {"num_cols": 150, "row_group_size": 10, "col_name_lengths": 1, "metadata_size_b": 614116, "file_size_b": 4379879, "metadata_size_mb": 0.5856666564941406, "file_size_mb": 4.17697811126709}, {"num_cols": 150, "row_group_size": 1, "col_name_lengths": 1, "metadata_size_b": 5887659, "file_size_b": 31293402, "metadata_size_mb": 5.6149091720581055, "file_size_mb": 29.843713760375977}, {"num_cols": 150, "row_group_size": 1000, "col_name_lengths": 10, "metadata_size_b": 10974, "file_size_b": 1410805, "metadata_size_mb": 0.010465621948242188, "file_size_mb": 1.3454484939575195}, {"num_cols": 150, "row_group_size": 100, "col_name_lengths": 10, "metadata_size_b": 79262, "file_size_b": 1719988, "metadata_size_mb": 0.07559013366699219, "file_size_mb": 1.6403083801269531}, {"num_cols": 150, "row_group_size": 10, "col_name_lengths": 10, "metadata_size_b": 750466, "file_size_b": 4524613, "metadata_size_mb": 0.7157001495361328, "file_size_mb": 4.315007209777832}, {"num_cols": 150, "row_group_size": 1, "col_name_lengths": 10, "metadata_size_b": 7239009, "file_size_b": 32653136, "metadata_size_mb": 6.903656959533691, "file_size_mb": 31.140457153320312}, {"num_cols": 150, "row_group_size": 1000, "col_name_lengths": 50, "metadata_size_b": 22974, "file_size_b": 1458769, "metadata_size_mb": 0.021909713745117188, "file_size_mb": 1.391190528869629}, {"num_cols": 150, "row_group_size": 100, "col_name_lengths": 50, "metadata_size_b": 145262, "file_size_b": 1821988, "metadata_size_mb": 0.1385326385498047, "file_size_mb": 1.7375831604003906}, {"num_cols": 150, "row_group_size": 10, "col_name_lengths": 50, "metadata_size_b": 1356466, "file_size_b": 5166613, "metadata_size_mb": 1.2936267852783203, "file_size_mb": 4.9272661209106445}, {"num_cols": 150, "row_group_size": 1, "col_name_lengths": 50, "metadata_size_b": 13245009, "file_size_b": 38695136, "metadata_size_mb": 12.631424903869629, "file_size_mb": 36.902557373046875}, {"num_cols": 150, "row_group_size": 1000, "col_name_lengths": 100, "metadata_size_b": 37974, "file_size_b": 1518519, "metadata_size_mb": 0.03621482849121094, "file_size_mb": 1.4481725692749023}, {"num_cols": 150, "row_group_size": 100, "col_name_lengths": 100, "metadata_size_b": 227762, "file_size_b": 1949132, "metadata_size_mb": 0.2172107696533203, "file_size_mb": 1.8588371276855469}, {"num_cols": 150, "row_group_size": 10, "col_name_lengths": 100, "metadata_size_b": 2113966, "file_size_b": 5968757, "metadata_size_mb": 2.0160350799560547, "file_size_mb": 5.6922502517700195}, {"num_cols": 150, "row_group_size": 1, "col_name_lengths": 100, "metadata_size_b": 20752509, "file_size_b": 46247280, "metadata_size_mb": 19.79113483428955, "file_size_mb": 44.10484313964844}]}}, {"mode": "vega-lite"});
</script>
</div>
</div>
<p><br>
So we were able to reduce the metadata size by 60% just by changing some parameters when writing the file. From the chart, we can see that by reducing the average column name length from 50 characters to 20 characters, we can shave off another few MB per file. That’s simple enough.</p>
<p>We can shave another another few MB off by reducing the number of columns. That’s not so simple. We want to store that extra data with our training data, it’s useful for analysis and debugging. Parquet isn’t great for storing wide data (lots of columns) but 150 columns doesn’t seem <em>that</em> wide. We don’t want to separate the extra data into separate files because that requires tracking two datasets and joining them; it’s doable but it’s extra work. We could also reduce the extra columns by grouping them all into a single column of JSON or pyarrow structs. This works really well for reducing the size of the metadata but it necessitates knowing exactly which columns to group together and this is variable as our generated training data is updated regularly and has a few configurations. So that would also be a bit of a headache.</p>
</section>
<section id="youre-holding-it-wrong" class="level2">
<h2 class="anchored" data-anchor-id="youre-holding-it-wrong"># You’re Holding it Wrong</h2>
<p>Now, you might be thinking, “Parquet isn’t intended for these workloads, why not use a more appropriate file format?” And to that I say, yes it isn’t a typical workload but I challenge you to find a better file format that is efficient for random access patterns and still support projection pushdowns. Our use case should be fairly common for training machine learning models. There is already a <a href="https://github.com/apache/arrow/issues/39676">Pull Request in the Arrow project</a> to make Parquet metadata reading faster for random access patterns.</p>
<p>The solution we’re now using, Parquet files without metadata nor encoding isn’t all that different from the Arrow format (A.K.A. Feather A.K.A. Arrow I.P.C.). We might consider storing our training data in Arrow format as PyArrow can directly read the bytes on disk without any additional processing. In theory, this could be faster than Parquet for our workloads but our initial benchmarks indicated that storing in Arrow format was no faster than storing in Parquet format.</p>
<p>We also tried selecting rows directly with <a href="https://arrow.apache.org/docs/python/generated/pyarrow.dataset.Dataset.html#pyarrow.dataset.Dataset.take"><code>pa.dataset.take()</code></a> as that API is a bit cleaner and seems like the preferred way to select rows from a dataset. However, this was roughly 30% slower than rolling our solution.</p>
</section>
<section id="resources" class="level2">
<h2 class="anchored" data-anchor-id="resources"># Resources</h2>
<ul>
<li><a href="https://arrow.apache.org/docs/python/generated/pyarrow.parquet.ParquetFile.html">Arrow Documentation</a></li>
<li><a href="https://github.com/apache/arrow/issues/39676">Arrow - Faster Parquet Metadata Reading PR</a></li>
</ul>


<!-- -->

</section>

 ]]></description>
  <category>parquet</category>
  <guid>https://bear-toes.pages.dev/posts/parquet_metadata/</guid>
  <pubDate>Sat, 01 Mar 2025 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Career Tips Learned the Hard Way</title>
  <link>https://bear-toes.pages.dev/posts/career_tips/</link>
  <description><![CDATA[ 





<section id="introduction" class="level1">
<h1># Introduction</h1>
<ul>
<li>Getting a Job
<ul>
<li>Resume Tips</li>
<li>Networking</li>
<li>Cover Letter / Cold Outreach</li>
<li>Always Be Interviewing</li>
<li>Interviewing</li>
</ul></li>
<li>At your job
<ul>
<li>Brag Doc</li>
<li>Glue Work</li>
<li>Managing U</li>
</ul></li>
</ul>
</section>
<section id="cover-letter-cold-outreach" class="level1">
<h1># Cover Letter / Cold Outreach</h1>
<p>I typically don’t subscribe to cover letters. More often than not no one is going to read them and at best won’t make a difference in the decision and at worst will leave a less than great impression. If a company asks for a cover letter I would either skip if it’s optional or don’t apply. It’s not worth your time investment.</p>
<p>However, if the company is small and / or you can reach out to the hiring manager directly, a short “cover letter” in the guise of an email can be a great way to get noticed and show your interest.</p>
<blockquote class="blockquote">
<p>Dear {hiring manager},</p>
<p>I’m excited to submit my application for {job title} at {company}. I found this job posting online and after comparing the responsibilities {x}, {x}, {z} to my own skills and interests {a}, {b}, {c}, I jumped at the chance to apply. I believe my {x} years experience in {industry} have allowed me to develop the critical skills necessary to suscceed in this role. Keep it short. No one wants to read a long email from a stranger and you don’t want to spend a good chunk of your time writing something that will be skimmed.</p>
</blockquote>
</section>
<section id="interviewing" class="level1">
<h1># Interviewing</h1>
<section id="be-a-story-teller" class="level2">
<h2 class="anchored" data-anchor-id="be-a-story-teller">Be a Story-Teller</h2>
<p>There are four stories you have to be able to tell. These stories will answer almost every behavior-based question. - STAR method - Beginning, middle end</p>
<section id="your-most-successful-project-or-best-accomplishment" class="level5">
<h5 class="anchored" data-anchor-id="your-most-successful-project-or-best-accomplishment">Your most successful project or best accomplishment</h5>
<p>Knowing this will answer a great success or when you succeeded. It will also answer a time when you hit a tight deadline or tight budget.</p>
</section>
<section id="least-successful-story-or-time-your-failed" class="level5">
<h5 class="anchored" data-anchor-id="least-successful-story-or-time-your-failed">Least successful story or time your failed</h5>
<p>It will answer questions about time you dealt with difficulties on a project. {} ##### Story about a difficult stakeholder Might be more than one, supervisor, stakeholder, customer, co-worker.</p>
</section>
<section id="a-passion-project-youve-worked-on" class="level5">
<h5 class="anchored" data-anchor-id="a-passion-project-youve-worked-on">A passion project you’ve worked on</h5>
<p>Something you’ve worked on in the past or something you’d like to work on. What gets you up in the morning? What drives you? Where you want to go with your career?</p>
</section>
</section>
<section id="how-to-ask-about-the-culture" class="level2">
<h2 class="anchored" data-anchor-id="how-to-ask-about-the-culture">How to ask about the culture</h2>
<p>Just as in a behavioral interview, the company is seeing how you behave through experiences, you can ask specific questions to learn how the company behaves in different situations. For example: - How does the company encourage learning an growth? - Tel me about a mistake someone on the team made and how was it handled? - Tell me about a suggestion an employee made that was implemented by the company / team? - What’s a recent projec that excited you?</p>
</section>
<section id="how-to-answer-tell-me-about-yourself" class="level2">
<h2 class="anchored" data-anchor-id="how-to-answer-tell-me-about-yourself">How to answer ‘tell me about yourself’</h2>
<p>Don’t run them through everything in your resume. They already have your resume and ends up being dry. Instead you want to make sure you hit the following four components: your background, your passion, 3 relevant skills or strengths that you’ve built, and what you hope to achieve or get from your next role. You can also share some personal details if appropriate.</p>
<blockquote class="blockquote">
<p>Hi I’m {name}, I’ve been a {role} for the past {X} years and I have a background in {domain} and {domain}. One of the things I really love about this job path is {what have you loved about your career path}. The last few roles I’ve had have really helped me hone my skills in {skill 1}, {skill 2}, {skill 3}. And I’m here today because I really want to take my skillset and apply it in the {company domain}. Outside of work I love {hobby 1} and am really into {hobby 2}.</p>
</blockquote>
<blockquote class="blockquote">
<p>Hi I’m Robert, I’ve been a Data Scientist &amp; Machine Learning Engineer for the past 5 years and have a background in Machine Learning, Distributed Systems, and Geospatial. One of the things I really love about this job path is that there’s never a dull day; there’s always something new to explore in the data or some pipeline to get stuck into and optimize. The last few roles have helped me develop my skills in stakeholder management, technical writing, and cross-team collaboration. I’ve excelled at smaller startups and have developed a wide range of skillsets and I’m here today because I want to go deep in Machine Learning and training on big datasets. Outside of work I love to go climbing and backpacking and am really into cooking at home.</p>
</blockquote>


<!-- -->

</section>
</section>

 ]]></description>
  <category>career advice</category>
  <guid>https://bear-toes.pages.dev/posts/career_tips/</guid>
  <pubDate>Fri, 31 May 2024 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Deep Learning Notes</title>
  <link>https://bear-toes.pages.dev/posts/deep-learning-notes/</link>
  <description><![CDATA[ 





<section id="intuition-about-deep-representation" class="level2">
<h2 class="anchored" data-anchor-id="intuition-about-deep-representation"># Intuition about deep representation</h2>
<ul>
<li>shallower nueral networks need exponentially more (<img src="https://latex.codecogs.com/png.latex?2%5E%7Bn-1%7D">) more hidden units vs.&nbsp;a “small” L-layer deep neural network to compute the same function.</li>
</ul>
</section>
<section id="forward-and-backward-functions" class="level2">
<h2 class="anchored" data-anchor-id="forward-and-backward-functions">Forward and Backward Functions</h2>
<p>Given the following generic deep neural network,</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://bear-toes.pages.dev/posts/deep-learning-notes/assets/generic-deep-neural-network.jpg" class="img-fluid figure-img" alt="Generic Deep Neural Network"></p>
<figcaption>A Generic Deep Neural Network</figcaption>
</figure>
</div>
<p>For each layer <img src="https://latex.codecogs.com/png.latex?l">: <img src="https://latex.codecogs.com/png.latex?W%5E%7B%5Bl%5D%7D">, <img src="https://latex.codecogs.com/png.latex?b%5E%7B%5Bl%5D%7D"></p>
<p><strong>Forward Pass</strong>:</p>
<ul>
<li>Input: <img src="https://latex.codecogs.com/png.latex?A%5E%7B%5Bl-1%5D%7D"></li>
<li>Output: <img src="https://latex.codecogs.com/png.latex?A%5E%7B%5Bl%5D%7D">, where:
<ul>
<li><img src="https://latex.codecogs.com/png.latex?Z%5E%7B%5Bl%5D%7D%20=%20W%5E%7B%5Bl%5D%7DA%5E%7B%5Bl-1%5D%7D%20+%20b%5E%7B%5Bl%5D%7D"> (cache for backward pass)</li>
<li><img src="https://latex.codecogs.com/png.latex?A%5E%7B%5Bl%5D%7D%20=%20g%5E%7B%5Bl%5D%7D(Z%5E%7B%5Bl%5D%7D)"></li>
</ul></li>
</ul>
<p><strong>Backward Pass</strong>:</p>
<ul>
<li>Input: <img src="https://latex.codecogs.com/png.latex?dA%5E%7B%5Bl%5D%7D"></li>
<li>Output: <img src="https://latex.codecogs.com/png.latex?dA%5E%7B%5Bl-1%5D%7D">, <img src="https://latex.codecogs.com/png.latex?dW%5E%7B%5Bl%5D%7D">, <img src="https://latex.codecogs.com/png.latex?db%5E%7B%5Bl%5D%7D">, where:
<ul>
<li><img src="https://latex.codecogs.com/png.latex?dZ%5E%7B%5Bl%5D%7D%20=%20A%5E%7B%5Bl%5D%7D%20-%20Y"></li>
<li><img src="https://latex.codecogs.com/png.latex?dW%5E%7B%5Bl%5D%7D%20=%20%5Cfrac%7B1%7D%7Bm%7D%20dZ%5E%7B%5Bl%5D%7D%20A%5E%7B%5Bl-1%5D%20%5Ctop%7D"></li>
<li><img src="https://latex.codecogs.com/png.latex?db%5E%7B%5Bl%5D%7D%20=%20%5Cfrac%7B1%7D%7Bm%7D%20%5Csum%5Em%20dZ%5E%7B%5Bl%5D%7D"></li>
<li><img src="https://latex.codecogs.com/png.latex?dA%5E%7B%5Bl-1%5D%7D%20=%20W%5E%7B%5Bl%5D%5Ctop%7D%20%20dZ%5E%7B%5Bl%5D%7D"></li>
<li><img src="https://latex.codecogs.com/png.latex?dZ%5E%7B%5Bl-1%5D%7D%20=%20dA%5E%7B%5Bl-1%5D%7D%20*%20g%5E%7B%5Cprime%20%5Bl-1%5D%7D%20(Z%5E%7B%5Bl-1%5D%7D)%20=%20W%5E%7B%5Bl%5D%5Ctop%7D%20%20dZ%5E%7B%5Bl%5D%7D%20*%20g%5E%7B%5Cprime%20%5Bl-1%5D%7D%20(Z%5E%7B%5Bl-1%5D%7D)"></li>
</ul></li>
</ul>
<section id="feed-forward-neural-networks-derivations" class="level3">
<h3 class="anchored" data-anchor-id="feed-forward-neural-networks-derivations">Feed Forward Neural Networks Derivations</h3>
<ul>
<li><a href="https://jonaslalin.com/2021/12/10/feedforward-neural-networks-part-1/">(1) Forward and Backward Propagations</a></li>
<li><a href="https://jonaslalin.com/2021/12/21/feedforward-neural-networks-part-2/">(2) Activation Functions</a></li>
<li><a href="https://jonaslalin.com/2021/12/22/feedforward-neural-networks-part-3/">(3) Cost Functions</a></li>
</ul>
</section>
</section>
<section id="parameters-hyperparameters" class="level2">
<h2 class="anchored" data-anchor-id="parameters-hyperparameters">Parameters &amp; Hyperparameters</h2>
<p><strong>Parameters</strong>:</p>
<ul>
<li><img src="https://latex.codecogs.com/png.latex?W%5E%7B%5Bl%5D%7D"></li>
<li><img src="https://latex.codecogs.com/png.latex?b%5E%7B%5Bl%5D%7D"></li>
</ul>
<p><strong>Hyperparameters</strong>: the parameters that control the Parameters <img src="https://latex.codecogs.com/png.latex?W"> and <img src="https://latex.codecogs.com/png.latex?b"></p>
<ul>
<li><img src="https://latex.codecogs.com/png.latex?%5Calpha"> - learning rate</li>
<li>learning rate decay</li>
<li>num iterations</li>
<li><img src="https://latex.codecogs.com/png.latex?L"> - num hidden layers</li>
<li><img src="https://latex.codecogs.com/png.latex?n%5E%7B%5Bl%5D%7D"> - num hidden units</li>
<li><img src="https://latex.codecogs.com/png.latex?g%5E%7B%5Bl%5D%7D"> - activation functions</li>
<li>Momentum</li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cmathcal%7BB%7D"> - minibatch size</li>
<li>regularization</li>
</ul>
<section id="how-to-learn-hyperparamters" class="level3">
<h3 class="anchored" data-anchor-id="how-to-learn-hyperparamters">How to learn hyperparamters?</h3>
<p>In deep learning, there can be many hyperparameters. With a small amount of hyperparameters, a grid search can be conducted. In deep learning, there can be many hyperparameters, and a grid search becomes untenable. Instead, sampling at random, more unique values are able to be searched.</p>
<p>When searching hyperparamters, a common technique is to first conduct a coarse search over a larger range of values. Then a fine search can be conducted on a smaller region.</p>
</section>
</section>
<section id="regularization" class="level2">
<h2 class="anchored" data-anchor-id="regularization">Regularization</h2>
<section id="bias-vs.-variance-tradeoff" class="level3">
<h3 class="anchored" data-anchor-id="bias-vs.-variance-tradeoff">Bias vs.&nbsp;Variance Tradeoff</h3>
<p>Intro to regularization. - Why regularization - What is regularization?</p>
</section>
<section id="l1-regularization" class="level3">
<h3 class="anchored" data-anchor-id="l1-regularization">L1 Regularization</h3>
<p>{Visualization} {Pytorch Example}</p>
<p><strong>Summary</strong></p>
</section>
<section id="l2-regularization" class="level3">
<h3 class="anchored" data-anchor-id="l2-regularization">L2 Regularization</h3>
<p>{Visualization} {Pytorch Example}</p>
<p><strong>Summary</strong></p>
</section>
<section id="elastic-net-regularization" class="level3">
<h3 class="anchored" data-anchor-id="elastic-net-regularization">Elastic Net Regularization</h3>
<p>{Visualization} {Pytorch Example}</p>
<p><strong>Summary</strong></p>
</section>
<section id="dropout" class="level3">
<h3 class="anchored" data-anchor-id="dropout">Dropout</h3>
<p>Dropout is where, during training, some % of neurons in each layer are zeroed out or “dropped”. The neurons dropped change each batch. Dropout prevents units from co-adapting too much to the data and acts as a sampling strategy since we drop a different set of neurons each time. It effectively forces the net to learn the data without cheating.</p>
<p>{Visualization} {Pytorch Example}</p>
<p><strong>Summary</strong></p>
<ul>
<li>only used during training</li>
</ul>
</section>
<section id="batch-normalization" class="level3">
<h3 class="anchored" data-anchor-id="batch-normalization">Batch Normalization</h3>
<p>{Visualization} {Pytorch Example}</p>
<p><strong>Summary</strong> - check notes from NN Zero to Heroon this</p>
</section>
<section id="other" class="level3">
<h3 class="anchored" data-anchor-id="other">Other?</h3>
</section>
</section>
<section id="activation-functions" class="level2">
<h2 class="anchored" data-anchor-id="activation-functions">Activation Functions</h2>
<section id="sigmoid" class="level3">
<h3 class="anchored" data-anchor-id="sigmoid">Sigmoid</h3>
</section>
<section id="relu" class="level3">
<h3 class="anchored" data-anchor-id="relu">ReLU</h3>
</section>
<section id="argmax" class="level3">
<h3 class="anchored" data-anchor-id="argmax">Argmax</h3>
</section>
<section id="softmax" class="level3">
<h3 class="anchored" data-anchor-id="softmax">Softmax</h3>
<p>Softmax regression generalizes logistic regression to <img src="https://latex.codecogs.com/png.latex?C"> classes. If <img src="https://latex.codecogs.com/png.latex?C=2">, the softmax reduces to logisitc regression. Softmax is named from the contrast to “Hardmax” or Argmax function.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Ctext%7BSoftmax%7D(x_i)%20=%20%5Cfrac%7B%5Ctext%7Bexp%7D(x_i)%7D%7B%5Csum_j%20%5Ctext%7Bexp%7D(x_j)%7D%0A"></p>
<ul>
<li>used for multiclass classification</li>
<li>normalizes outputs to sum to 1</li>
<li>output can be interpreted as probabilities</li>
</ul>
<p><strong>Loss Function</strong></p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%5Cmathcal%7BL%7D(%5Chat%7By%7D,%20y)%20&amp;=%20-%20%5Csum%5En_%7Bj=1%7D%20y_j%20%5Ctext%7Blog%7D%20%5Chat%7By%7D_j%20%5C%0A&amp;=%20-y_%7Bj=c%7D%20%5Ctext%7Blog%7D%20%5Chat%7By_%7Bj=c%7D%7D%20%5C%0A&amp;=%20-%20%5Ctext%7Blog%7D%5Chat%7By%7D_%7Bj=c%7D%0A%5Cend%7Balign%7D%0A"></p>
<p>Where: - <img src="https://latex.codecogs.com/png.latex?j=c"> is the true label of the class - the summation goes away because all other class outputs are <img src="https://latex.codecogs.com/png.latex?0"></p>
<p><strong>Cost Function</strong> <img src="https://latex.codecogs.com/png.latex?%0A%5Cmathcal%7BJ%7D(W%5E%7B%5Bl%5D%7D,%20b%5E%7B%5Bl%5D%7D,%20...)%20=%20%5Cfrac%7B1%7D%7Bm%7D%20%5Csum%5Em_%7Bi=1%7D%20%5Cmathcal%7BL%7D%20(%5Chat%7By%7D%5Ei,%20y%5Ei)%0A"></p>
</section>
</section>
<section id="optimizers" class="level2">
<h2 class="anchored" data-anchor-id="optimizers">Optimizers</h2>
<section id="gradient-descent" class="level3">
<h3 class="anchored" data-anchor-id="gradient-descent">Gradient Descent</h3>
</section>
<section id="stochastic-gradient-descent" class="level3">
<h3 class="anchored" data-anchor-id="stochastic-gradient-descent">Stochastic Gradient Descent</h3>
</section>
<section id="adam" class="level3">
<h3 class="anchored" data-anchor-id="adam">ADAM</h3>


<!-- -->

</section>
</section>

 ]]></description>
  <category>deep learning</category>
  <guid>https://bear-toes.pages.dev/posts/deep-learning-notes/</guid>
  <pubDate>Sun, 31 Mar 2024 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Pub Quiz: Summing Two Random Variables</title>
  <link>https://bear-toes.pages.dev/posts/summing_random_variables/</link>
  <description><![CDATA[ 





<section id="pub-quiz" class="level2">
<h2 class="anchored" data-anchor-id="pub-quiz"># Pub Quiz</h2>
<p>Last week, my company held a pub quiz. This was no ordinary pub quiz, it was designed in a way for teams to learn about other teams. One person from each team submitted four questions about their team. We ended up wtih about 60 questions from all across the company. And when I say “all” I mean <em>all</em>. We had questions about Data Science, Commercial, Operations, Engineering, Product, Marketing, Leadership, Human Resources, you name it. As someone who is fairly familiar with all aspects of our products and engineering teams (but by no means an expert in all these areas) by having been here over four years and written my share of documentation, I came into the pub quiz <em>with confidence</em>. Much of that confidence due to expecting to not need to know British pop culture back through the 70s as is standard in an actual pub quiz.</p>
<p>That confidence was quickly smashed with questions like:</p>
<ul>
<li><em>What was the 2023 Coca Cola Christmas commercial slogan?</em></li>
<li><em>What is the collective age of the Customer Support team?</em></li>
<li><em>What month was repo XXX created?</em></li>
</ul>
<p>The Data Science round was the trickiest of them all, in no small part because reading the question took up almost all of the response time! After the quiz, my teammate who wrote the Data Science questions shared one that didn’t quite make the cut.</p>
<p>I share the question with the reader here, with only some minor rewording. My answer follows.<br>
</p>
</section>
<section id="question" class="level2 page-columns page-full">
<h2 class="anchored" data-anchor-id="question"># Question</h2>
<section id="the-preamble" class="level3 page-columns page-full">
<h3 class="anchored" data-anchor-id="the-preamble">## The preamble</h3>
<p>You fit the following univariate regression model using Ordinary Least Squares (OLS)</p>

<div class="no-row-height column-margin column-container"><div class="">
<p>In the original question, the OLS abbreviation was given without the unabbreviated form. Not sure it would have made the question any easier.</p>
</div></div><p><img src="https://latex.codecogs.com/png.latex?%0Ay%20=%20%5Calpha%20+%20%5Cbeta%20x%20+%20%5Cepsilon%0A"></p>
<p>Where the residual, <img src="https://latex.codecogs.com/png.latex?%5Cepsilon">, is Normally distributed with mean 0 and standard deviation 1, that is:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cepsilon%20%5Csim%20%7BN%7D(0,%201)%0A"></p>
<p>From OLS, you determine:</p>
<ul>
<li><img src="https://latex.codecogs.com/png.latex?%5Calpha=3"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cbeta=2"></li>
</ul>
<hr>
<p>The next month, your colleague reruns the experiment and collects the same size dataset. They forgot to check the callibration of the machine used to collect the data and as a result the dataset now has a measurement error, <img src="https://latex.codecogs.com/png.latex?u">. That is,</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cdisplaylines%7B%0A%20%20%20%20%5Cbegin%7Balign%7D%0A%20%20%20%20y%5E*%20&amp;%5Cequiv%20y%20+%20u%20%5C%5C%0A%20%20%20%20y%5E*%20&amp;=%20%5Calpha%5E*%20+%20%5Cbeta%5E*x%20+%20%5Cepsilon%5E*%0A%20%20%20%20%5Cend%7Balign%7D%0A%7D%0A"></p>
<p>The measurement error has mean 2 and standard deviation 2.<br>
<img src="https://latex.codecogs.com/png.latex?%0Au%20%5Csim%20N(2,2)%0A"></p>
<p>The residuals in the new sample dataset are also normally distributed.<br>
<img src="https://latex.codecogs.com/png.latex?%0A%5Cepsilon%5E*%20%5Csim%20%7BN%7D(%5Cmu%5E*,%20%5Csigma%5E*)%0A"><br>
</p>
</section>
<section id="and-finally-the-question" class="level3">
<h3 class="anchored" data-anchor-id="and-finally-the-question">## And finally the question</h3>
<p>What values does your colleague find when running a regression with OLS? (Try solving with a pen and paper):</p>
<ul>
<li><img src="https://latex.codecogs.com/png.latex?%5Calpha%5E*%20=%20%5Ctext%7B%20??%7D"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cbeta%5E*%20=%20%5Ctext%7B%20??%7D"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cmu%5E*%20=%20%5Ctext%7B%20??%7D"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Csigma%5E*%20=%20%5Ctext%7B%20??%7D"><br>
</li>
</ul>
</section>
</section>
<section id="analytical-solution" class="level2 page-columns page-full">
<h2 class="anchored" data-anchor-id="analytical-solution"># Analytical solution</h2>
<p>There’s a few things to immediately note:</p>
<ol type="1">
<li>The <em>hell</em> this is a pub quiz question!<br>
</li>
<li>We assume <img src="https://latex.codecogs.com/png.latex?y%5E*">, <img src="https://latex.codecogs.com/png.latex?%5Cepsilon">, <img src="https://latex.codecogs.com/png.latex?u">, and <img src="https://latex.codecogs.com/png.latex?%5Cepsilon%5E*"> are independent random variables. If they weren’t, this would be a wee bit trickier (we would need to have information about the joint distributions, i.e.&nbsp;covariances).</li>
<li>We recognize that the new residuals are going to include the previous residuals as well as the new measurement error, <img src="https://latex.codecogs.com/png.latex?%5Cepsilon%5E*%20=%20%5Cepsilon%20+%20u">.</li>
<li>Whether it was a typo or meant to be tricky, the question states the standard deviation rather than the variance for the Normal distribution. Typically, the notation is uses the variance, <img src="https://latex.codecogs.com/png.latex?N(%5Cmu,%20%5Csigma%5E2)">. Rewriting into the standard notation:</li>
</ol>

<div class="no-row-height column-margin column-container"><div class="">
<p>I’ve highly probably in all likelihood had the same question on a Probability exam during my Statistics postgrad.</p>
</div></div><p><img src="https://latex.codecogs.com/png.latex?%0A%5Cdisplaylines%7B%0A%20%20%20%20%5Cbegin%7Balignat*%7D%7B2%7D%0A%20%20%20%20%5Cepsilon%20&amp;%5Csim%20N(0,%201)%20&amp;&amp;%20%5Crightarrow%20N(0,%201)%20%5C%5C%0A%20%20%20%20u%20&amp;%5Csim%20N(2,%202)%20&amp;&amp;%20%5Crightarrow%20N(2,%20%5Csqrt%7B2%7D)%20%5C%5C%0A%20%20%20%20%5Cepsilon%5E*%20&amp;%5Csim%20N(%5Cmu%5E*,%20%5Csigma%5E%7B*%7D)%20&amp;&amp;%20%5Crightarrow%20N(%5Cmu%5E*,%20%5Csigma%5E%7B*2%7D)%0A%20%20%20%20%5Cend%7Balignat*%7D%0A%7D%0A"><br>
</p>
<p>The problem boils down to realizing that we have a summation of two independent Normally distributed random variables, <img src="https://latex.codecogs.com/png.latex?y"> and <img src="https://latex.codecogs.com/png.latex?u">. How do independent Normally distributed random variables sum? If you don’t remember, don’t worry, neither did I. After some revision we know that <span class="citation" data-cites="ross2010">(Ross 2010)</span>:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cdisplaylines%7B%0A%20%20%20%20%5Cbegin%7Balign%7D%0A%20%20%20%20%5Ctext%7BE%7D%5BX%20+%20Y%5D%20%20%20&amp;=%20%5Ctext%7BE%7D%5BX%5D%20+%20%5Ctext%7BE%7D%5BY%5D%20%5C%5C%0A%20%20%20%20%5Ctext%7BVar%7D%5BX%20+%20Y%5D%20&amp;=%20%5Ctext%7BVar%7D%5BX%5D%20+%20%5Ctext%7BVar%7D%5BY%5D%20+%202%5Ctext%7BCov%7D%5BX,Y%5D%0A%20%20%20%20%5Cend%7Balign%7D%0A%7D%0A"></p>
<p>The assumption that the random variables are independent means the covariance is zero, <img src="https://latex.codecogs.com/png.latex?2%5Ctext%7BCov%7D%5BX,Y%5D%20=%200">. We can simply add the means and variances <span class="citation" data-cites="ross2010">(Ross 2010, 256–57)</span> giving:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cdisplaylines%7B%0A%20%20%20%20%5Cbegin%7Balignat*%7D%7B2%7D%0A%20%20%20%20y%5E*%20&amp;=%20y%20&amp;&amp;+%20u%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%20%5Calpha%20+%20%5Cbeta%20x%20&amp;&amp;+%20%5Cepsilon%20+%20u%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%20%5Calpha%20+%20%5Cbeta%20x%20&amp;&amp;+%20%5Cepsilon%5E*%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%20%5Calpha%20+%20%5Cbeta%20x%20&amp;&amp;+%20%5CBig(%20N(%5Cmu_%7B%5Cepsilon%7D,%20%5Csigma_%7B%5Cepsilon%7D%5E2)%20+%20N(%5Cmu_u,%20%5Csigma_u%5E2)%20%5CBig)%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%20%5Calpha%20+%20%5Cbeta%20x%20&amp;&amp;+%20%5CBig(%20N(%5Cmu_%7B%5Cepsilon%7D%20+%20%5Cmu_u,%20%5Csigma_%7B%5Cepsilon%7D%5E2%20+%20%5Csigma_u%5E2)%20%5CBig)%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%20%5Calpha%20+%20%5Cbeta%20x%20&amp;&amp;+%20N(0%20+%202,%201%20+%204)%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%20%5Calpha%20+%20%5Cbeta%20x%20&amp;&amp;+%20N(2,%205)%20%5C%5C%0A%20%20%20%20%5Cend%7Balignat*%7D%0A%7D%0A"></p>
<p>where,</p>
<div class="columns">
<div class="column" style="width:20%;">
<!-- empty column to create gap -->
</div><div class="column" style="width:30%;">
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cdisplaylines%7B%0A%20%20%20%20%5Cbegin%7Balignat*%7D%7B2%7D%0A%20%20%20%20%5Cmu_%7B%5Cepsilon%5E*%7D%20&amp;=%20%5Cmu_%7B%5Cepsilon%7D%20&amp;&amp;+%20%5Cmu_u%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%200%20&amp;&amp;+%202%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%202%0A%20%20%20%20%5Cend%7Balignat*%7D%0A%7D%0A"></p>
</div><div class="column" style="width:30%;">
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cdisplaylines%7B%0A%20%20%20%20%5Cbegin%7Balignat*%7D%7B2%7D%0A%20%20%20%20%5Csigma_%7B%5Cepsilon%5E*%7D%5E2%20&amp;=%20%5Csigma_%7B%5Cepsilon%7D%5E2%20&amp;&amp;+%20%5Csigma_u%5E2%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%201%20&amp;&amp;+%204%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%205%0A%20%20%20%20%5Cend%7Balignat*%7D%0A%7D%0A"></p>
</div><div class="column" style="width:20%;">
<!-- empty column to create gap -->
</div>
</div>
<p>Plugging in the values for <img src="https://latex.codecogs.com/png.latex?%5Calpha"> and <img src="https://latex.codecogs.com/png.latex?%5Cbeta">, we find the following solution: <img src="https://latex.codecogs.com/png.latex?%0Ay%5E*%20=%203%20+%202x%20+%20N(2,%205)%0A"></p>
<ul>
<li><img src="https://latex.codecogs.com/png.latex?%5Calpha%5E*%20=%203"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cbeta%5E*%20=%202"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cmu%5E*%20=%202"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Csigma%5E*%20=%20%5Csqrt%7B5%7D"><br>
</li>
</ul>

<div class="no-row-height column-margin column-container"><div class="">
<p>Remember, we were asked for <img src="https://latex.codecogs.com/png.latex?%5Csigma%5E*"> not <img src="https://latex.codecogs.com/png.latex?%5Csigma%5E%7B*2%7D">:</p>
</div></div><p>We can arguably simplify this a bit further by noting that the bias, <img src="https://latex.codecogs.com/png.latex?%5Calpha">, and the mean of the residuals, <img src="https://latex.codecogs.com/png.latex?%5Cmu_%7B%5Cepsilon%5E*%7D">, are both constants that shift the intercept and can be grouped. Subtracting the mean of the error from the bias…</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cdisplaylines%7B%0A%20%20%20%20%5Cbegin%7Balignat*%7D%7B3%7D%0A%20%20%20%20y%5E*%20&amp;=%20%5Calpha%20&amp;&amp;+%20%5Cbeta%20x%20&amp;&amp;&amp;+%20N(2,%205)%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%203%20%20%20%20%20%20&amp;&amp;+%202x%20%20%20%20%20%20&amp;&amp;&amp;+%20N(2,%205)%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%20(3+2)%20%20&amp;&amp;+%202x%20%20%20%20%20%20&amp;&amp;&amp;+%20N(0,%205)%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%205%20%20%20%20%20%20&amp;&amp;+%202x%20%20%20%20%20%20&amp;&amp;&amp;+%20N(0,5)%0A%20%20%20%20%5Cend%7Balignat*%7D%0A%7D%0A"></p>
<p>And rewritting using the standard deviation rather than the variance (like in the original question) we arrive at:</p>
<p><img src="https://latex.codecogs.com/png.latex?%0Ay%20=%205%20+%202x%20+%20N(0,%5Csqrt%7B5%7D)%0A"></p>
<ul>
<li><img src="https://latex.codecogs.com/png.latex?%5Calpha%5E*%20=%205"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cbeta%5E*%20=%202"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cmu%5E*%20=%202"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Csigma%5E*%20=%20%5Csqrt%7B5%7D"></li>
</ul>

<div class="no-row-height column-margin column-container"><div class="">
<p>If instead we took 2 as the var in <img src="https://latex.codecogs.com/png.latex?u%20%5Csim%20N(2,2)">:</p>
<ul>
<li><img src="https://latex.codecogs.com/png.latex?%5Calpha%5E*%20=%205"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cbeta%5E*%20=%202"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cmu%5E*%20=%202"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Csigma%5E*%20=%20%5Csqrt%7B3%7D"></li>
</ul>
</div></div><p><br>
</p>
</section>
<section id="computational-verification" class="level2 page-columns page-full">
<h2 class="anchored" data-anchor-id="computational-verification"># Computational verification</h2>
<p>Let’s check our analytical solution through computational methods. First let’s check that we can indeed simply add the means and variances of independent random variables.</p>
<div id="cell-normal-rv-sum-verification" class="cell" data-execution_count="1">
<details open="" class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> altair <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> alt</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb1-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb1-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> sklearn.neighbors <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> KernelDensity</span>
<span id="cb1-5"></span>
<span id="cb1-6">n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">100_000</span></span>
<span id="cb1-7"></span>
<span id="cb1-8">err <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.normal(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>, size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(n,))</span>
<span id="cb1-9">u <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.normal(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(n,))</span>
<span id="cb1-10"></span>
<span id="cb1-11">err_computational <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> err <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> u</span>
<span id="cb1-12">err_analytical <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.normal(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> (<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>), size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(n,))</span>
<span id="cb1-13"></span>
<span id="cb1-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># torch.histogram returns the endpoints of each bin, we want the middle value</span></span>
<span id="cb1-15"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># so we find the mean of each bin range</span></span>
<span id="cb1-16">y, x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.histogram(err, density<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb1-17">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.tensor([x[i : i <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>].mean() <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)])</span>
<span id="cb1-18">df0 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame(</span>
<span id="cb1-19">    {</span>
<span id="cb1-20">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span>: x,</span>
<span id="cb1-21">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"density"</span>: y,</span>
<span id="cb1-22">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"series"</span>: [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"err"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x),</span>
<span id="cb1-23">    }</span>
<span id="cb1-24">)</span>
<span id="cb1-25"></span>
<span id="cb1-26">y, x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.histogram(u, density<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb1-27">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.tensor([x[i : i <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>].mean() <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)])</span>
<span id="cb1-28">df1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame(</span>
<span id="cb1-29">    {</span>
<span id="cb1-30">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span>: x,</span>
<span id="cb1-31">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"density"</span>: y,</span>
<span id="cb1-32">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"series"</span>: [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"u"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x),</span>
<span id="cb1-33">    }</span>
<span id="cb1-34">)</span>
<span id="cb1-35"></span>
<span id="cb1-36">y, x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.histogram(err_computational, density<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb1-37">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.tensor([x[i : i <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>].mean() <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)])</span>
<span id="cb1-38">df2 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame(</span>
<span id="cb1-39">    {</span>
<span id="cb1-40">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span>: x,</span>
<span id="cb1-41">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"density"</span>: y,</span>
<span id="cb1-42">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"series"</span>: [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"err* (computational)"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x),</span>
<span id="cb1-43">    }</span>
<span id="cb1-44">)</span>
<span id="cb1-45"></span>
<span id="cb1-46">y, x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.histogram(err_analytical, density<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb1-47">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.tensor([x[i : i <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>].mean() <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)])</span>
<span id="cb1-48">df3 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame(</span>
<span id="cb1-49">    {</span>
<span id="cb1-50">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span>: x,</span>
<span id="cb1-51">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"density"</span>: y,</span>
<span id="cb1-52">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"series"</span>: [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"err* (analytical)"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x),</span>
<span id="cb1-53">    }</span>
<span id="cb1-54">)</span>
<span id="cb1-55">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat([df0, df1, df2, df3])</span>
<span id="cb1-56"></span>
<span id="cb1-57"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Plot</span></span>
<span id="cb1-58">colorscheme <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [</span>
<span id="cb1-59">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#368BC1"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># blue</span></span>
<span id="cb1-60">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#F2BB18"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># yellow</span></span>
<span id="cb1-61">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#BB4430"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># red</span></span>
<span id="cb1-62">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#8A9A67"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># green</span></span>
<span id="cb1-63">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#CC771F"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># orange</span></span>
<span id="cb1-64">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#8B5260"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># purple</span></span>
<span id="cb1-65">]</span>
<span id="cb1-66">selection <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> alt.selection_point(fields<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"series"</span>], bind<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"legend"</span>)</span>
<span id="cb1-67"></span>
<span id="cb1-68">chart <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (</span>
<span id="cb1-69">    alt.Chart(df)</span>
<span id="cb1-70">    .mark_line()</span>
<span id="cb1-71">    .encode(</span>
<span id="cb1-72">        x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x:Q"</span>,</span>
<span id="cb1-73">        y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"density:Q"</span>,</span>
<span id="cb1-74">        color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Color(</span>
<span id="cb1-75">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"series:N"</span>, title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Random Variable"</span>, scale<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Scale(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>colorscheme)</span>
<span id="cb1-76">        ).legend(orient<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"top-right"</span>),</span>
<span id="cb1-77">        opacity<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.condition(selection, alt.value(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.75</span>), alt.value(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span>)),</span>
<span id="cb1-78">    )</span>
<span id="cb1-79">    .configure(background<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#f8f9fa"</span>)</span>
<span id="cb1-80">    .properties(</span>
<span id="cb1-81">        width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">650</span>,</span>
<span id="cb1-82">        padding<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>,</span>
<span id="cb1-83">        title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>{</span>
<span id="cb1-84">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"text"</span>: <span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Summing Two Independent Random Variables (n=</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>n<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> samples)"</span>,</span>
<span id="cb1-85">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"subtitle"</span>: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"err + u = err*"</span>,</span>
<span id="cb1-86">        },</span>
<span id="cb1-87">    )</span>
<span id="cb1-88">    .add_params(selection)</span>
<span id="cb1-89">)</span>
<span id="cb1-90">chart.display()</span>
<span id="cb1-91"></span>
<span id="cb1-92">stats_df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame(</span>
<span id="cb1-93">    {</span>
<span id="cb1-94">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"mean"</span>: [</span>
<span id="cb1-95">            err.mean().item(),</span>
<span id="cb1-96">            u.mean().item(),</span>
<span id="cb1-97">            err_computational.mean().item(),</span>
<span id="cb1-98">            err_analytical.mean().item(),</span>
<span id="cb1-99">        ],</span>
<span id="cb1-100">        <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"var"</span>: [</span>
<span id="cb1-101">            err.var().item(),</span>
<span id="cb1-102">            u.var().item(),</span>
<span id="cb1-103">            err_computational.var().item(),</span>
<span id="cb1-104">            err_analytical.var().item(),</span>
<span id="cb1-105">        ],</span>
<span id="cb1-106">    },</span>
<span id="cb1-107">    index<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ϵ"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"u"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ϵ* (computational)"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ϵ* (analytical)"</span>],</span>
<span id="cb1-108">)</span>
<span id="cb1-109"></span>
<span id="cb1-110"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(stats_df)</span></code></pre></div></div>
</details>
<div id="normal-rv-sum-verification" class="cell-output cell-output-display">

<style>
  #altair-viz-4cc94de262b24653a3ef742430cbd851.vega-embed {
    width: 100%;
    display: flex;
  }

  #altair-viz-4cc94de262b24653a3ef742430cbd851.vega-embed details,
  #altair-viz-4cc94de262b24653a3ef742430cbd851.vega-embed details summary {
    position: relative;
  }
</style>
<div id="altair-viz-4cc94de262b24653a3ef742430cbd851"></div>
<script type="text/javascript">
  var VEGA_DEBUG = (typeof VEGA_DEBUG == "undefined") ? {} : VEGA_DEBUG;
  (function(spec, embedOpt){
    let outputDiv = document.currentScript.previousElementSibling;
    if (outputDiv.id !== "altair-viz-4cc94de262b24653a3ef742430cbd851") {
      outputDiv = document.getElementById("altair-viz-4cc94de262b24653a3ef742430cbd851");
    }
    const paths = {
      "vega": "https://cdn.jsdelivr.net/npm/vega@5?noext",
      "vega-lib": "https://cdn.jsdelivr.net/npm/vega-lib?noext",
      "vega-lite": "https://cdn.jsdelivr.net/npm/vega-lite@5.16.3?noext",
      "vega-embed": "https://cdn.jsdelivr.net/npm/vega-embed@6?noext",
    };

    function maybeLoadScript(lib, version) {
      var key = `${lib.replace("-", "")}_version`;
      return (VEGA_DEBUG[key] == version) ?
        Promise.resolve(paths[lib]) :
        new Promise(function(resolve, reject) {
          var s = document.createElement('script');
          document.getElementsByTagName("head")[0].appendChild(s);
          s.async = true;
          s.onload = () => {
            VEGA_DEBUG[key] = version;
            return resolve(paths[lib]);
          };
          s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
          s.src = paths[lib];
        });
    }

    function showError(err) {
      outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
      throw err;
    }

    function displayChart(vegaEmbed) {
      vegaEmbed(outputDiv, spec, embedOpt)
        .catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
    }

    if(typeof define === "function" && define.amd) {
      requirejs.config({paths});
      require(["vega-embed"], displayChart, err => showError(`Error loading script: ${err.message}`));
    } else {
      maybeLoadScript("vega", "5")
        .then(() => maybeLoadScript("vega-lite", "5.16.3"))
        .then(() => maybeLoadScript("vega-embed", "6"))
        .catch(showError)
        .then(() => displayChart(vegaEmbed));
    }
  })({"config": {"view": {"continuousWidth": 300, "continuousHeight": 300}, "background": "#f8f9fa"}, "data": {"name": "data-481af2a8a3b15eded8d42d54d85e7af0"}, "mark": {"type": "line"}, "encoding": {"color": {"field": "series", "legend": {"orient": "top-right"}, "scale": {"range": ["#368BC1", "#F2BB18", "#BB4430", "#8A9A67", "#CC771F", "#8B5260"]}, "title": "Random Variable", "type": "nominal"}, "opacity": {"condition": {"param": "param_1", "value": 0.75}, "value": 0.2}, "x": {"field": "x", "type": "quantitative"}, "y": {"field": "density", "type": "quantitative"}}, "padding": 10, "params": [{"name": "param_1", "select": {"type": "point", "fields": ["series"]}, "bind": "legend"}], "title": {"text": "Summing Two Independent Random Variables (n=100000 samples)", "subtitle": "err + u = err*"}, "width": 650, "$schema": "https://vega.github.io/schema/vega-lite/v5.16.3.json", "datasets": {"data-481af2a8a3b15eded8d42d54d85e7af0": [{"x": -5.038115501403809, "density": 0.00010996722267009318, "series": "err"}, {"x": -4.947178840637207, "density": 0.0, "series": "err"}, {"x": -4.8562421798706055, "density": 0.0, "series": "err"}, {"x": -4.765305995941162, "density": 0.0, "series": "err"}, {"x": -4.674369812011719, "density": 0.0, "series": "err"}, {"x": -4.583433151245117, "density": 0.0, "series": "err"}, {"x": -4.492496490478516, "density": 0.0, "series": "err"}, {"x": -4.4015607833862305, "density": 0.0, "series": "err"}, {"x": -4.310624122619629, "density": 0.0, "series": "err"}, {"x": -4.219687461853027, "density": 0.0, "series": "err"}, {"x": -4.128751754760742, "density": 0.0, "series": "err"}, {"x": -4.037815093994141, "density": 0.00010996664786944166, "series": "err"}, {"x": -3.946878671646118, "density": 0.0004398688906803727, "series": "err"}, {"x": -3.8559422492980957, "density": 0.00021993329573888332, "series": "err"}, {"x": -3.7650058269500732, "density": 0.00021993444534018636, "series": "err"}, {"x": -3.674069404602051, "density": 0.0004398677556309849, "series": "err"}, {"x": -3.5831332206726074, "density": 0.00032990079489536583, "series": "err"}, {"x": -3.492196798324585, "density": 0.0014295739820227027, "series": "err"}, {"x": -3.4012603759765625, "density": 0.0013195998035371304, "series": "err"}, {"x": -3.31032395362854, "density": 0.0020893774926662445, "series": "err"}, {"x": -3.2193875312805176, "density": 0.002529239747673273, "series": "err"}, {"x": -3.128451347351074, "density": 0.0027491736691445112, "series": "err"}, {"x": -3.0375146865844727, "density": 0.00472857803106308, "series": "err"}, {"x": -2.9465785026550293, "density": 0.005168446339666843, "series": "err"}, {"x": -2.855642080307007, "density": 0.006817968096584082, "series": "err"}, {"x": -2.7647056579589844, "density": 0.006927917245775461, "series": "err"}, {"x": -2.673769474029541, "density": 0.010886726900935173, "series": "err"}, {"x": -2.5828328132629395, "density": 0.016824942082166672, "series": "err"}, {"x": -2.491896629333496, "density": 0.017594709992408752, "series": "err"}, {"x": -2.4009602069854736, "density": 0.022873183712363243, "series": "err"}, {"x": -2.310023784637451, "density": 0.027381768450140953, "series": "err"}, {"x": -2.219087600708008, "density": 0.03804856166243553, "series": "err"}, {"x": -2.1281509399414062, "density": 0.04211733862757683, "series": "err"}, {"x": -2.037214756011963, "density": 0.04882531985640526, "series": "err"}, {"x": -1.9462783336639404, "density": 0.06521056592464447, "series": "err"}, {"x": -1.8553420305252075, "density": 0.07114861160516739, "series": "err"}, {"x": -1.764405608177185, "density": 0.08137553185224533, "series": "err"}, {"x": -1.6734691858291626, "density": 0.09710080176591873, "series": "err"}, {"x": -1.5825327634811401, "density": 0.12459254264831543, "series": "err"}, {"x": -1.4915964603424072, "density": 0.128441721200943, "series": "err"}, {"x": -1.4006601572036743, "density": 0.149994894862175, "series": "err"}, {"x": -1.3097237348556519, "density": 0.16769959032535553, "series": "err"}, {"x": -1.2187873125076294, "density": 0.18969295918941498, "series": "err"}, {"x": -1.127850890159607, "density": 0.21399566531181335, "series": "err"}, {"x": -1.036914587020874, "density": 0.23631957173347473, "series": "err"}, {"x": -0.9459781646728516, "density": 0.25699207186698914, "series": "err"}, {"x": -0.8550417423248291, "density": 0.279756635427475, "series": "err"}, {"x": -0.7641053199768066, "density": 0.2997690737247467, "series": "err"}, {"x": -0.6731688976287842, "density": 0.31516605615615845, "series": "err"}, {"x": -0.5822327136993408, "density": 0.33342063426971436, "series": "err"}, {"x": -0.49129652976989746, "density": 0.34837615489959717, "series": "err"}, {"x": -0.4003603458404541, "density": 0.3799367845058441, "series": "err"}, {"x": -0.30942392349243164, "density": 0.3733367919921875, "series": "err"}, {"x": -0.21848750114440918, "density": 0.3896138668060303, "series": "err"}, {"x": -0.12755107879638672, "density": 0.3780653476715088, "series": "err"}, {"x": -0.03661465644836426, "density": 0.39346274733543396, "series": "err"}, {"x": 0.05432164669036865, "density": 0.40236902236938477, "series": "err"}, {"x": 0.1452580690383911, "density": 0.3856540322303772, "series": "err"}, {"x": 0.23619449138641357, "density": 0.38235506415367126, "series": "err"}, {"x": 0.32713091373443604, "density": 0.3780663311481476, "series": "err"}, {"x": 0.41806721687316895, "density": 0.37421849370002747, "series": "err"}, {"x": 0.5090035200119019, "density": 0.35189422965049744, "series": "err"}, {"x": 0.5999399423599243, "density": 0.3374885320663452, "series": "err"}, {"x": 0.6908763647079468, "density": 0.3064778447151184, "series": "err"}, {"x": 0.7818127870559692, "density": 0.29713067412376404, "series": "err"}, {"x": 0.8727490901947021, "density": 0.2778871953487396, "series": "err"}, {"x": 0.9636853933334351, "density": 0.24522626399993896, "series": "err"}, {"x": 1.0546218156814575, "density": 0.23258008062839508, "series": "err"}, {"x": 1.14555823802948, "density": 0.20684781670570374, "series": "err"}, {"x": 1.2364946603775024, "density": 0.17968598008155823, "series": "err"}, {"x": 1.3274309635162354, "density": 0.16330133378505707, "series": "err"}, {"x": 1.4183672666549683, "density": 0.14735569059848785, "series": "err"}, {"x": 1.5093036890029907, "density": 0.1298709511756897, "series": "err"}, {"x": 1.6002401113510132, "density": 0.10710779577493668, "series": "err"}, {"x": 1.6911765336990356, "density": 0.09567123651504517, "series": "err"}, {"x": 1.7821128368377686, "density": 0.08236545324325562, "series": "err"}, {"x": 1.8730491399765015, "density": 0.06444062292575836, "series": "err"}, {"x": 1.963985562324524, "density": 0.06411072611808777, "series": "err"}, {"x": 2.054922103881836, "density": 0.048165518790483475, "series": "err"}, {"x": 2.1458582878112793, "density": 0.04101766645908356, "series": "err"}, {"x": 2.2367947101593018, "density": 0.03496957942843437, "series": "err"}, {"x": 2.327731132507324, "density": 0.025622230023145676, "series": "err"}, {"x": 2.4186675548553467, "density": 0.02265325002372265, "series": "err"}, {"x": 2.509603977203369, "density": 0.01847444474697113, "series": "err"}, {"x": 2.6005401611328125, "density": 0.013635900802910328, "series": "err"}, {"x": 2.691476583480835, "density": 0.011216657236218452, "series": "err"}, {"x": 2.7824130058288574, "density": 0.008357465267181396, "series": "err"}, {"x": 2.87334942817688, "density": 0.005718295928090811, "series": "err"}, {"x": 2.9642858505249023, "density": 0.004838545341044664, "series": "err"}, {"x": 3.0552220344543457, "density": 0.0032990083564072847, "series": "err"}, {"x": 3.1461586952209473, "density": 0.002969107124954462, "series": "err"}, {"x": 3.2370948791503906, "density": 0.0038488428108394146, "series": "err"}, {"x": 3.328031301498413, "density": 0.0021993445698171854, "series": "err"}, {"x": 3.4189677238464355, "density": 0.000989702413789928, "series": "err"}, {"x": 3.509903907775879, "density": 0.001209636335261166, "series": "err"}, {"x": 3.6008405685424805, "density": 0.00021993387781549245, "series": "err"}, {"x": 3.691776752471924, "density": 0.00021993387781549245, "series": "err"}, {"x": 3.7827131748199463, "density": 0.0006598033360205591, "series": "err"}, {"x": 3.8736495971679688, "density": 0.0005498346872627735, "series": "err"}, {"x": 3.964585781097412, "density": 0.00010996693890774623, "series": "err"}, {"x": -6.6488542556762695, "density": 5.762213913840242e-05, "series": "u"}, {"x": -6.475309371948242, "density": 0.0, "series": "u"}, {"x": -6.301764488220215, "density": 0.0, "series": "u"}, {"x": -6.128220081329346, "density": 0.00017286594083998352, "series": "u"}, {"x": -5.954675674438477, "density": 5.762213913840242e-05, "series": "u"}, {"x": -5.781130790710449, "density": 0.0, "series": "u"}, {"x": -5.60758638381958, "density": 0.00011524395813466981, "series": "u"}, {"x": -5.434041976928711, "density": 0.0, "series": "u"}, {"x": -5.260497093200684, "density": 5.762213913840242e-05, "series": "u"}, {"x": -5.0869526863098145, "density": 0.00028810990625061095, "series": "u"}, {"x": -4.913408279418945, "density": 0.00040335499215871096, "series": "u"}, {"x": -4.739863395690918, "density": 0.00040335499215871096, "series": "u"}, {"x": -4.566318988800049, "density": 0.0010371956741437316, "series": "u"}, {"x": -4.39277458190918, "density": 0.0010371984681114554, "series": "u"}, {"x": -4.219229698181152, "density": 0.0018439084524288774, "series": "u"}, {"x": -4.045685291290283, "density": 0.0015557934530079365, "series": "u"}, {"x": -3.872140407562256, "density": 0.0028234808705747128, "series": "u"}, {"x": -3.6985960006713867, "density": 0.003572567831724882, "series": "u"}, {"x": -3.5250513553619385, "density": 0.004148793872445822, "series": "u"}, {"x": -3.3515067100524902, "density": 0.004955497104674578, "series": "u"}, {"x": -3.177962303161621, "density": 0.007606112398207188, "series": "u"}, {"x": -3.004417657852173, "density": 0.008758565410971642, "series": "u"}, {"x": -2.8308730125427246, "density": 0.011178679764270782, "series": "u"}, {"x": -2.6573286056518555, "density": 0.011812522076070309, "series": "u"}, {"x": -2.4837839603424072, "density": 0.015903711318969727, "series": "u"}, {"x": -2.310239315032959, "density": 0.01930336281657219, "series": "u"}, {"x": -2.1366946697235107, "density": 0.024086054414510727, "series": "u"}, {"x": -1.9631502628326416, "density": 0.02737051621079445, "series": "u"}, {"x": -1.7896056175231934, "density": 0.03324788436293602, "series": "u"}, {"x": -1.6160609722137451, "density": 0.03952878713607788, "series": "u"}, {"x": -1.4425163269042969, "density": 0.047653380781412125, "series": "u"}, {"x": -1.2689716815948486, "density": 0.05007363483309746, "series": "u"}, {"x": -1.0954272747039795, "density": 0.06298099458217621, "series": "u"}, {"x": -0.9218826293945312, "density": 0.06718723475933075, "series": "u"}, {"x": -0.748337984085083, "density": 0.0780203714966774, "series": "u"}, {"x": -0.5747933387756348, "density": 0.0868939459323883, "series": "u"}, {"x": -0.4012486934661865, "density": 0.09726617485284805, "series": "u"}, {"x": -0.22770428657531738, "density": 0.10688906162977219, "series": "u"}, {"x": -0.05415964126586914, "density": 0.11731835454702377, "series": "u"}, {"x": 0.1193850040435791, "density": 0.12820926308631897, "series": "u"}, {"x": 0.29292941093444824, "density": 0.1391574740409851, "series": "u"}, {"x": 0.4664740562438965, "density": 0.14774276316165924, "series": "u"}, {"x": 0.6400187015533447, "density": 0.1598438173532486, "series": "u"}, {"x": 0.8135631084442139, "density": 0.16543316841125488, "series": "u"}, {"x": 0.9871077537536621, "density": 0.1761503964662552, "series": "u"}, {"x": 1.1606523990631104, "density": 0.17983870208263397, "series": "u"}, {"x": 1.3341968059539795, "density": 0.18773292005062103, "series": "u"}, {"x": 1.5077414512634277, "density": 0.19314886629581451, "series": "u"}, {"x": 1.681286334991455, "density": 0.1925150454044342, "series": "u"}, {"x": 1.8548307418823242, "density": 0.19873930513858795, "series": "u"}, {"x": 2.028374671936035, "density": 0.20000700652599335, "series": "u"}, {"x": 2.2019190788269043, "density": 0.20484612882137299, "series": "u"}, {"x": 2.3754639625549316, "density": 0.1936674863100052, "series": "u"}, {"x": 2.54900860786438, "density": 0.18998019397258759, "series": "u"}, {"x": 2.722553014755249, "density": 0.1863500028848648, "series": "u"}, {"x": 2.8960976600646973, "density": 0.17712996900081635, "series": "u"}, {"x": 3.0696423053741455, "density": 0.1756899058818817, "series": "u"}, {"x": 3.2431867122650146, "density": 0.16139960289001465, "series": "u"}, {"x": 3.416731357574463, "density": 0.1586909294128418, "series": "u"}, {"x": 3.590276002883911, "density": 0.1453230381011963, "series": "u"}, {"x": 3.7638204097747803, "density": 0.13644921779632568, "series": "u"}, {"x": 3.9373650550842285, "density": 0.127402201294899, "series": "u"}, {"x": 4.110909461975098, "density": 0.11161408573389053, "series": "u"}, {"x": 4.284454345703125, "density": 0.1051027774810791, "series": "u"}, {"x": 4.457998752593994, "density": 0.09334760904312134, "series": "u"}, {"x": 4.631543159484863, "density": 0.08614509552717209, "series": "u"}, {"x": 4.805088043212891, "density": 0.07704059034585953, "series": "u"}, {"x": 4.978632926940918, "density": 0.06851272284984589, "series": "u"}, {"x": 5.152176856994629, "density": 0.057564519345760345, "series": "u"}, {"x": 5.325721740722656, "density": 0.04880581796169281, "series": "u"}, {"x": 5.499266624450684, "density": 0.04229465126991272, "series": "u"}, {"x": 5.672811031341553, "density": 0.03682044893503189, "series": "u"}, {"x": 5.846355438232422, "density": 0.03428517282009125, "series": "u"}, {"x": 6.019900321960449, "density": 0.02719764970242977, "series": "u"}, {"x": 6.193444728851318, "density": 0.020859157666563988, "series": "u"}, {"x": 6.3669891357421875, "density": 0.018611950799822807, "series": "u"}, {"x": 6.540534019470215, "density": 0.015154622495174408, "series": "u"}, {"x": 6.714078426361084, "density": 0.011985371820628643, "series": "u"}, {"x": 6.887622833251953, "density": 0.01019911840558052, "series": "u"}, {"x": 7.0611677169799805, "density": 0.007721366360783577, "series": "u"}, {"x": 7.23471212387085, "density": 0.005819820333272219, "series": "u"}, {"x": 7.408256530761719, "density": 0.004897881764918566, "series": "u"}, {"x": 7.581801414489746, "density": 0.0038606831803917885, "series": "u"}, {"x": 7.755345821380615, "density": 0.0036301850341260433, "series": "u"}, {"x": 7.928890705108643, "density": 0.0023625013418495655, "series": "u"}, {"x": 8.102435111999512, "density": 0.0019015358993783593, "series": "u"}, {"x": 8.275979995727539, "density": 0.0012100616004317999, "series": "u"}, {"x": 8.44952392578125, "density": 0.0012100616004317999, "series": "u"}, {"x": 8.623068809509277, "density": 0.000921956729143858, "series": "u"}, {"x": 8.796613693237305, "density": 0.00046097583253867924, "series": "u"}, {"x": 8.970157623291016, "density": 0.0005185978370718658, "series": "u"}, {"x": 9.143702507019043, "density": 0.0002304891822859645, "series": "u"}, {"x": 9.31724739074707, "density": 0.00034573188167996705, "series": "u"}, {"x": 9.490791320800781, "density": 0.00017286594083998352, "series": "u"}, {"x": 9.664337158203125, "density": 0.0, "series": "u"}, {"x": 9.837881088256836, "density": 5.762229557149112e-05, "series": "u"}, {"x": 10.011425018310547, "density": 0.00011524395813466981, "series": "u"}, {"x": 10.18497085571289, "density": 0.0, "series": "u"}, {"x": 10.358514785766602, "density": 5.762229557149112e-05, "series": "u"}, {"x": 10.532058715820312, "density": 0.00011524395813466981, "series": "u"}, {"x": -7.462464332580566, "density": 0.00015924309263937175, "series": "err* (computational)"}, {"x": -7.274073123931885, "density": 0.0, "series": "err* (computational)"}, {"x": -7.085681915283203, "density": 0.0, "series": "err* (computational)"}, {"x": -6.89729118347168, "density": 0.0, "series": "err* (computational)"}, {"x": -6.708900451660156, "density": 0.00010616206418490037, "series": "err* (computational)"}, {"x": -6.520508766174316, "density": 0.00015924309263937175, "series": "err* (computational)"}, {"x": -6.332118034362793, "density": 5.308116669766605e-05, "series": "err* (computational)"}, {"x": -6.1437273025512695, "density": 0.0002123246667906642, "series": "err* (computational)"}, {"x": -5.955336570739746, "density": 0.00026540516410022974, "series": "err* (computational)"}, {"x": -5.766944885253906, "density": 0.00021232412836980075, "series": "err* (computational)"}, {"x": -5.578554153442383, "density": 0.0005308116669766605, "series": "err* (computational)"}, {"x": -5.390163421630859, "density": 0.0005308103282004595, "series": "err* (computational)"}, {"x": -5.2017717361450195, "density": 0.001061620656400919, "series": "err* (computational)"}, {"x": -5.013381004333496, "density": 0.001061623333953321, "series": "err* (computational)"}, {"x": -4.824990272521973, "density": 0.0012739480007439852, "series": "err* (computational)"}, {"x": -4.636599540710449, "density": 0.0018578361487016082, "series": "err* (computational)"}, {"x": -4.448207855224609, "density": 0.0020170793868601322, "series": "err* (computational)"}, {"x": -4.259817123413086, "density": 0.0031317889224737883, "series": "err* (computational)"}, {"x": -4.0714263916015625, "density": 0.003874920541420579, "series": "err* (computational)"}, {"x": -3.883035182952881, "density": 0.005467353388667107, "series": "err* (computational)"}, {"x": -3.6946442127227783, "density": 0.007219020277261734, "series": "err* (computational)"}, {"x": -3.506253242492676, "density": 0.009129960089921951, "series": "err* (computational)"}, {"x": -3.3178622722625732, "density": 0.01146550290286541, "series": "err* (computational)"}, {"x": -3.1294710636138916, "density": 0.013323339633643627, "series": "err* (computational)"}, {"x": -2.941080093383789, "density": 0.016720566898584366, "series": "err* (computational)"}, {"x": -2.7526891231536865, "density": 0.01863144151866436, "series": "err* (computational)"}, {"x": -2.564298152923584, "density": 0.022771820425987244, "series": "err* (computational)"}, {"x": -2.3759071826934814, "density": 0.02765521965920925, "series": "err* (computational)"}, {"x": -2.187516212463379, "density": 0.030468590557575226, "series": "err* (computational)"}, {"x": -1.9991252422332764, "density": 0.035670455545186996, "series": "err* (computational)"}, {"x": -1.8107342720031738, "density": 0.04336731508374214, "series": "err* (computational)"}, {"x": -1.6223433017730713, "density": 0.04559660702943802, "series": "err* (computational)"}, {"x": -1.4339520931243896, "density": 0.056902866810560226, "series": "err* (computational)"}, {"x": -1.245561122894287, "density": 0.060565609484910965, "series": "err* (computational)"}, {"x": -1.0571701526641846, "density": 0.06889918446540833, "series": "err* (computational)"}, {"x": -0.868779182434082, "density": 0.07521601766347885, "series": "err* (computational)"}, {"x": -0.6803882122039795, "density": 0.08795527368783951, "series": "err* (computational)"}, {"x": -0.49199724197387695, "density": 0.09490913152694702, "series": "err* (computational)"}, {"x": -0.3036062717437744, "density": 0.10541892796754837, "series": "err* (computational)"}, {"x": -0.11521530151367188, "density": 0.11677856743335724, "series": "err* (computational)"}, {"x": 0.07317566871643066, "density": 0.11980389058589935, "series": "err* (computational)"}, {"x": 0.2615668773651123, "density": 0.13578128814697266, "series": "err* (computational)"}, {"x": 0.44995784759521484, "density": 0.13832952082157135, "series": "err* (computational)"}, {"x": 0.6383485794067383, "density": 0.14820262789726257, "series": "err* (computational)"}, {"x": 0.8267397880554199, "density": 0.15573936700820923, "series": "err* (computational)"}, {"x": 1.0151309967041016, "density": 0.15648327767848969, "series": "err* (computational)"}, {"x": 1.203521728515625, "density": 0.16614405810832977, "series": "err* (computational)"}, {"x": 1.3919129371643066, "density": 0.17346838116645813, "series": "err* (computational)"}, {"x": 1.5803041458129883, "density": 0.1736815720796585, "series": "err* (computational)"}, {"x": 1.76869535446167, "density": 0.1772371232509613, "series": "err* (computational)"}, {"x": 1.9570865631103516, "density": 0.179042786359787, "series": "err* (computational)"}, {"x": 2.145477294921875, "density": 0.17973284423351288, "series": "err* (computational)"}, {"x": 2.3338685035705566, "density": 0.17601627111434937, "series": "err* (computational)"}, {"x": 2.5222597122192383, "density": 0.1779811531305313, "series": "err* (computational)"}, {"x": 2.7106504440307617, "density": 0.1697005033493042, "series": "err* (computational)"}, {"x": 2.8990416526794434, "density": 0.1651877611875534, "series": "err* (computational)"}, {"x": 3.087432861328125, "density": 0.15993356704711914, "series": "err* (computational)"}, {"x": 3.2758235931396484, "density": 0.15621787309646606, "series": "err* (computational)"}, {"x": 3.464214563369751, "density": 0.1419917643070221, "series": "err* (computational)"}, {"x": 3.6526057720184326, "density": 0.13185328245162964, "series": "err* (computational)"}, {"x": 3.840996742248535, "density": 0.12516538798809052, "series": "err* (computational)"}, {"x": 4.029387474060059, "density": 0.11672519147396088, "series": "err* (computational)"}, {"x": 4.21777868270874, "density": 0.11242591589689255, "series": "err* (computational)"}, {"x": 4.406169891357422, "density": 0.09883687645196915, "series": "err* (computational)"}, {"x": 4.594560623168945, "density": 0.09055647253990173, "series": "err* (computational)"}, {"x": 4.782951354980469, "density": 0.08259408921003342, "series": "err* (computational)"}, {"x": 4.97134256362915, "density": 0.07468520104885101, "series": "err* (computational)"}, {"x": 5.159733772277832, "density": 0.06534275412559509, "series": "err* (computational)"}, {"x": 5.3481245040893555, "density": 0.059875406324863434, "series": "err* (computational)"}, {"x": 5.536515712738037, "density": 0.052125707268714905, "series": "err* (computational)"}, {"x": 5.724906921386719, "density": 0.04549044370651245, "series": "err* (computational)"}, {"x": 5.913297653198242, "density": 0.039173901081085205, "series": "err* (computational)"}, {"x": 6.101688385009766, "density": 0.03190170228481293, "series": "err* (computational)"}, {"x": 6.290079593658447, "density": 0.02855766750872135, "series": "err* (computational)"}, {"x": 6.478470802307129, "density": 0.026222029700875282, "series": "err* (computational)"}, {"x": 6.666861534118652, "density": 0.021444791927933693, "series": "err* (computational)"}, {"x": 6.855252265930176, "density": 0.017039012163877487, "series": "err* (computational)"}, {"x": 7.043643951416016, "density": 0.014544202946126461, "series": "err* (computational)"}, {"x": 7.232034683227539, "density": 0.010403908789157867, "series": "err* (computational)"}, {"x": 7.4204254150390625, "density": 0.00833372212946415, "series": "err* (computational)"}, {"x": 7.608817100524902, "density": 0.0072721014730632305, "series": "err* (computational)"}, {"x": 7.797207832336426, "density": 0.005573522299528122, "series": "err* (computational)"}, {"x": 7.985598564147949, "density": 0.004352655727416277, "series": "err* (computational)"}, {"x": 8.173989295959473, "density": 0.003768762806430459, "series": "err* (computational)"}, {"x": 8.362380981445312, "density": 0.002760206814855337, "series": "err* (computational)"}, {"x": 8.550771713256836, "density": 0.002282490022480488, "series": "err* (computational)"}, {"x": 8.73916244506836, "density": 0.0019640030805021524, "series": "err* (computational)"}, {"x": 8.927553176879883, "density": 0.0013270225608721375, "series": "err* (computational)"}, {"x": 9.115944862365723, "density": 0.0012208669213578105, "series": "err* (computational)"}, {"x": 9.304335594177246, "density": 0.0007431363919749856, "series": "err* (computational)"}, {"x": 9.49272632598877, "density": 0.00026540583348833025, "series": "err* (computational)"}, {"x": 9.68111801147461, "density": 0.0005308089894242585, "series": "err* (computational)"}, {"x": 9.869508743286133, "density": 0.000583892862778157, "series": "err* (computational)"}, {"x": 10.057899475097656, "density": 0.00015924350009299815, "series": "err* (computational)"}, {"x": 10.24629020690918, "density": 0.0001592426997376606, "series": "err* (computational)"}, {"x": 10.43468189239502, "density": 0.0002123246667906642, "series": "err* (computational)"}, {"x": 10.623072624206543, "density": 0.0001061623333953321, "series": "err* (computational)"}, {"x": 10.811463356018066, "density": 5.308116669766605e-05, "series": "err* (computational)"}, {"x": 10.999855041503906, "density": 5.3080897487234324e-05, "series": "err* (computational)"}, {"x": 11.18824577331543, "density": 0.0001061623333953321, "series": "err* (computational)"}, {"x": -7.67799186706543, "density": 0.00010419698810437694, "series": "err* (analytical)"}, {"x": -7.486047744750977, "density": 5.2098363084951416e-05, "series": "err* (analytical)"}, {"x": -7.294103145599365, "density": 0.00015629548579454422, "series": "err* (analytical)"}, {"x": -7.102158546447754, "density": 0.0, "series": "err* (analytical)"}, {"x": -6.910214424133301, "density": 0.0, "series": "err* (analytical)"}, {"x": -6.718270301818848, "density": 0.00010419698810437694, "series": "err* (analytical)"}, {"x": -6.5263261795043945, "density": 5.2098363084951416e-05, "series": "err* (analytical)"}, {"x": -6.334381580352783, "density": 0.00015629548579454422, "series": "err* (analytical)"}, {"x": -6.142436981201172, "density": 0.00020839345233980566, "series": "err* (analytical)"}, {"x": -5.950492858886719, "density": 0.00031259097158908844, "series": "err* (analytical)"}, {"x": -5.758548736572266, "density": 0.0005209849332459271, "series": "err* (analytical)"}, {"x": -5.5666046142578125, "density": 0.0009377705864608288, "series": "err* (analytical)"}, {"x": -5.374659538269043, "density": 0.0006251803715713322, "series": "err* (analytical)"}, {"x": -5.18271541595459, "density": 0.0009898714488372207, "series": "err* (analytical)"}, {"x": -4.990771293640137, "density": 0.0011461669346317649, "series": "err* (analytical)"}, {"x": -4.798827171325684, "density": 0.001667151809670031, "series": "err* (analytical)"}, {"x": -4.6068830490112305, "density": 0.0018755411729216576, "series": "err* (analytical)"}, {"x": -4.414937973022461, "density": 0.003594787325710058, "series": "err* (analytical)"}, {"x": -4.222993850708008, "density": 0.0038031903095543385, "series": "err* (analytical)"}, {"x": -4.031049728393555, "density": 0.004428372252732515, "series": "err* (analytical)"}, {"x": -3.8391053676605225, "density": 0.006512295454740524, "series": "err* (analytical)"}, {"x": -3.6471610069274902, "density": 0.006720706354826689, "series": "err* (analytical)"}, {"x": -3.455216884613037, "density": 0.008335758931934834, "series": "err* (analytical)"}, {"x": -3.263272523880005, "density": 0.011305345222353935, "series": "err* (analytical)"}, {"x": -3.0713281631469727, "density": 0.012764131650328636, "series": "err* (analytical)"}, {"x": -2.8793838024139404, "density": 0.013910263776779175, "series": "err* (analytical)"}, {"x": -2.687439441680908, "density": 0.02016211673617363, "series": "err* (analytical)"}, {"x": -2.495495319366455, "density": 0.022662846371531487, "series": "err* (analytical)"}, {"x": -2.303550958633423, "density": 0.027143249288201332, "series": "err* (analytical)"}, {"x": -2.1116065979003906, "density": 0.032926250249147415, "series": "err* (analytical)"}, {"x": -1.9196622371673584, "density": 0.03969895467162132, "series": "err* (analytical)"}, {"x": -1.7277178764343262, "density": 0.04553408548235893, "series": "err* (analytical)"}, {"x": -1.535773754119873, "density": 0.04777432233095169, "series": "err* (analytical)"}, {"x": -1.3438293933868408, "density": 0.05861066281795502, "series": "err* (analytical)"}, {"x": -1.1518850326538086, "density": 0.06527941673994064, "series": "err* (analytical)"}, {"x": -0.9599406719207764, "density": 0.07575102150440216, "series": "err* (analytical)"}, {"x": -0.7679963111877441, "density": 0.08153414726257324, "series": "err* (analytical)"}, {"x": -0.576052188873291, "density": 0.08955731242895126, "series": "err* (analytical)"}, {"x": -0.3841078281402588, "density": 0.1000288650393486, "series": "err* (analytical)"}, {"x": -0.19216346740722656, "density": 0.113210029900074, "series": "err* (analytical)"}, {"x": -0.00021910667419433594, "density": 0.11373073607683182, "series": "err* (analytical)"}, {"x": 0.191725492477417, "density": 0.12951654195785522, "series": "err* (analytical)"}, {"x": 0.3836698532104492, "density": 0.13717533648014069, "series": "err* (analytical)"}, {"x": 0.5756139755249023, "density": 0.14936639368534088, "series": "err* (analytical)"}, {"x": 0.7675580978393555, "density": 0.15822313725948334, "series": "err* (analytical)"}, {"x": 0.9595022201538086, "density": 0.164995938539505, "series": "err* (analytical)"}, {"x": 1.15144681930542, "density": 0.1600457727909088, "series": "err* (analytical)"}, {"x": 1.3433914184570312, "density": 0.1711435616016388, "series": "err* (analytical)"}, {"x": 1.5353355407714844, "density": 0.17864574491977692, "series": "err* (analytical)"}, {"x": 1.7272796630859375, "density": 0.17682228982448578, "series": "err* (analytical)"}, {"x": 1.9192237854003906, "density": 0.17791636288166046, "series": "err* (analytical)"}, {"x": 2.1111679077148438, "density": 0.1752072274684906, "series": "err* (analytical)"}, {"x": 2.303112030029297, "density": 0.17598871886730194, "series": "err* (analytical)"}, {"x": 2.495056629180908, "density": 0.17692561447620392, "series": "err* (analytical)"}, {"x": 2.6870012283325195, "density": 0.17129985988140106, "series": "err* (analytical)"}, {"x": 2.8789453506469727, "density": 0.17119565606117249, "series": "err* (analytical)"}, {"x": 3.070889472961426, "density": 0.15520142018795013, "series": "err* (analytical)"}, {"x": 3.262833595275879, "density": 0.150356262922287, "series": "err* (analytical)"}, {"x": 3.454777956008911, "density": 0.14483346045017242, "series": "err* (analytical)"}, {"x": 3.6467225551605225, "density": 0.13660190999507904, "series": "err* (analytical)"}, {"x": 3.8386669158935547, "density": 0.12170208990573883, "series": "err* (analytical)"}, {"x": 4.030611038208008, "density": 0.11852378398180008, "series": "err* (analytical)"}, {"x": 4.222555637359619, "density": 0.11034461110830307, "series": "err* (analytical)"}, {"x": 4.414499759674072, "density": 0.09877873957157135, "series": "err* (analytical)"}, {"x": 4.606444358825684, "density": 0.09065116196870804, "series": "err* (analytical)"}, {"x": 4.798388481140137, "density": 0.08012748509645462, "series": "err* (analytical)"}, {"x": 4.99033260345459, "density": 0.0724688246846199, "series": "err* (analytical)"}, {"x": 5.182277202606201, "density": 0.06632138043642044, "series": "err* (analytical)"}, {"x": 5.374221324920654, "density": 0.05611007660627365, "series": "err* (analytical)"}, {"x": 5.566165924072266, "density": 0.049232956022024155, "series": "err* (analytical)"}, {"x": 5.758110046386719, "density": 0.04610716924071312, "series": "err* (analytical)"}, {"x": 5.950054168701172, "density": 0.03761501982808113, "series": "err* (analytical)"}, {"x": 6.141998767852783, "density": 0.03297834470868111, "series": "err* (analytical)"}, {"x": 6.333942890167236, "density": 0.02604924701154232, "series": "err* (analytical)"}, {"x": 6.525887489318848, "density": 0.02281908318400383, "series": "err* (analytical)"}, {"x": 6.717831611633301, "density": 0.019276443868875504, "series": "err* (analytical)"}, {"x": 6.909775733947754, "density": 0.016931969672441483, "series": "err* (analytical)"}, {"x": 7.101720333099365, "density": 0.012607836164534092, "series": "err* (analytical)"}, {"x": 7.293664455413818, "density": 0.012555737048387527, "series": "err* (analytical)"}, {"x": 7.48560905456543, "density": 0.009586099535226822, "series": "err* (analytical)"}, {"x": 7.677553176879883, "density": 0.0075542819686234, "series": "err* (analytical)"}, {"x": 7.869497299194336, "density": 0.006303918082267046, "series": "err* (analytical)"}, {"x": 8.061441421508789, "density": 0.004480470437556505, "series": "err* (analytical)"}, {"x": 8.253385543823242, "density": 0.0035947784781455994, "series": "err* (analytical)"}, {"x": 8.445330619812012, "density": 0.003073811298236251, "series": "err* (analytical)"}, {"x": 8.637274742126465, "density": 0.0025007277727127075, "series": "err* (analytical)"}, {"x": 8.829218864440918, "density": 0.0011461669346317649, "series": "err* (analytical)"}, {"x": 9.021163940429688, "density": 0.0015629471745342016, "series": "err* (analytical)"}, {"x": 9.21310806274414, "density": 0.0006772804190404713, "series": "err* (analytical)"}, {"x": 9.405052185058594, "density": 0.0006251819431781769, "series": "err* (analytical)"}, {"x": 9.596996307373047, "density": 0.0006251819431781769, "series": "err* (analytical)"}, {"x": 9.7889404296875, "density": 0.0005209849332459271, "series": "err* (analytical)"}, {"x": 9.980884552001953, "density": 0.00010419647151138633, "series": "err* (analytical)"}, {"x": 10.172829627990723, "density": 0.00010419698810437694, "series": "err* (analytical)"}, {"x": 10.364773750305176, "density": 0.00046888645738363266, "series": "err* (analytical)"}, {"x": 10.556717872619629, "density": 0.00010419698810437694, "series": "err* (analytical)"}, {"x": 10.748661994934082, "density": 0.00010419698810437694, "series": "err* (analytical)"}, {"x": 10.940607070922852, "density": 0.0, "series": "err* (analytical)"}, {"x": 11.132551193237305, "density": 0.00010419698810437694, "series": "err* (analytical)"}, {"x": 11.324495315551758, "density": 5.209849405218847e-05, "series": "err* (analytical)"}]}}, {"mode": "vega-lite"});
</script>
</div>
<div class="cell-output cell-output-stdout">
<pre><code>                        mean       var
ϵ                  -0.001720  1.009451
u                   2.005137  3.989215
ϵ* (computational)  2.003417  4.973287
ϵ* (analytical)     2.008872  4.990684</code></pre>
</div>
</div>
<p>In the chart, we can see <img src="https://latex.codecogs.com/png.latex?%5Cepsilon%20%5Csim%20N(0,1)"> is centered on 0 while <img src="https://latex.codecogs.com/png.latex?u%20%5Csim%20N(2,2)">, <img src="https://latex.codecogs.com/png.latex?%5Cepsilon%5E*_%7B%5Ctext%7Banalytical%7D%7D%20%5Csim%20N(2,%205)">, and <img src="https://latex.codecogs.com/png.latex?%5Cepsilon%5E*_%7B%5Ctext%7Bcomputational%7D%7D%20%5Csim%20N(0,%201)%20+%20%5Csim%20N(2,%205)"> are all centered on 2. Summing the means worked!</p>
<p>The variance is a bit more difficult to verify from the chart. We can see that <img src="https://latex.codecogs.com/png.latex?%5Cepsilon%5E*_%7B%5Ctext%7Banalytical%7D%7D"> and <img src="https://latex.codecogs.com/png.latex?%5Cepsilon%5E*_%7B%5Ctext%7Bcomputational%7D%7D"> have the same distribution, slightly wider than <img src="https://latex.codecogs.com/png.latex?u">. The tableThe error between the means and variances is small. If we increase the sample size these errors move closer towards 0.</p>
<p>Now that we’re confident in random variable arithmetic, let’s check the full analytical solution to a comutational one. Below we plot the first measured sample, <img src="https://latex.codecogs.com/png.latex?y_1">, with the original signal, <img src="https://latex.codecogs.com/png.latex?y_%7B%5Ctext%7Bsignal%7D%7D">, as a backdrop for reference:</p>
<div class="columns">
<div class="column" style="width:10%;">
<!-- empty column to create gap -->
</div><div class="column" style="width:40%;">
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cdisplaylines%7B%0A%20%20%20%20%5Cbegin%7Balignat*%7D%7B2%7D%0A%20%20%20%20y_%7B%5Ctext%7B%5Cscriptsize%7Bsignal%7D%7D%7D%20&amp;=%20%5Calpha%20&amp;&amp;+%20%5Cbeta%20x%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20&amp;=%203%20%20%20%20%20%20&amp;&amp;+%202%20x%0A%20%20%20%20%5Cend%7Balignat*%7D%0A%7D%0A"></p>
</div><div class="column" style="width:40%;">
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cdisplaylines%7B%0A%20%20%20%20%5Cbegin%7Balignat*%7D%7B3%7D%0A%20%20%20%20y_%7B%5Ctext%7B1%7D%7D%20&amp;=%20%5Calpha%20&amp;&amp;+%20%5Cbeta%20x%20+%20%5Cepsilon%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20&amp;=%203%20%20%20%20%20%20&amp;&amp;+%202%20x%20%20%20%20%20+%20N(%5Cmu,%20%5Csigma%5E2)%20%5C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20&amp;=%203%20%20%20%20%20%20&amp;&amp;+%202%20x%20%20%20%20%20+%20N(0,%201)%0A%20%20%20%20%5Cend%7Balignat*%7D%0A%7D%0A"></p>
</div><div class="column" style="width:10%;">
<!-- empty column to create gap -->
</div>
</div>
<div class="columns">
<div class="column" style="width:10%;">
<!-- empty column to create gap -->
</div><div class="column" style="width:40%;">
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cdisplaylines%7B%0A%20%20%20%20%5Cbegin%7Balignat*%7D%7B4%7D%0A%20%20%20%20y%5E*_%7B%5Ctext%7B%5Cscriptsize%7Banalytical%7D%7D%7D%20&amp;=%20y%20%20%20%20%20%20&amp;&amp;+%20u%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%20%5Calpha%20&amp;&amp;+%20%5Cbeta%20x%20+%20%5Cepsilon%5E*%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%201%20%20%20%20%20%20&amp;&amp;+%202%20x%20%20%20%20%20+%20N(%5Cmu%5E*,%20%5Csigma%5E%7B*2%7D)%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%205%20%20%20%20%20%20&amp;&amp;+%202%20x%20%20%20%20%20+%20N(0,%205)%20%5C%5C%0A%20%20%20%20%5Cend%7Balignat*%7D%0A%7D%0A"></p>
</div><div class="column" style="width:40%;">
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cdisplaylines%7B%0A%20%20%20%20%5Cbegin%7Balignat*%7D%7B4%7D%0A%20%20%20%20y%5E*_%7B%5Ctext%7B%5Cscriptsize%7Bcomputational%7D%7D%7D%20&amp;=%20y%20%20%20%20%20%20&amp;&amp;+%20u%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%20%5Calpha%20&amp;&amp;+%20%5Cbeta%20x%20+%20%5Cepsilon%20&amp;&amp;&amp;+%20u%20%5C%5C%0A%20%20%20%20%20%20%20%20&amp;=%203%20%20%20%20%20%20&amp;&amp;+%202%20x%20%20%20%20%20+%20N(0,%201)%20%20%20&amp;&amp;&amp;+%20N(2,%204)%0A%20%20%20%20%5Cend%7Balignat*%7D%0A%7D%0A"></p>
</div><div class="column" style="width:10%;">
<!-- empty column to create gap -->
</div>
</div>
<div id="cell-plotted-signal" class="cell" data-execution_count="2">
<details class="code-fold">
<summary>Code</summary>
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> altair <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> alt</span>
<span id="cb3-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pandas <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> pd</span>
<span id="cb3-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb3-4"></span>
<span id="cb3-5">alt.data_transformers.disable_max_rows()</span>
<span id="cb3-6"></span>
<span id="cb3-7">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.arange(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.01</span>)</span>
<span id="cb3-8"></span>
<span id="cb3-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Original Signal</span></span>
<span id="cb3-10">a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span></span>
<span id="cb3-11">b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb3-12">signal <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> x)</span>
<span id="cb3-13"></span>
<span id="cb3-14"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># y Our measured sample</span></span>
<span id="cb3-15">err_mean <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span></span>
<span id="cb3-16">err_std <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span></span>
<span id="cb3-17">err <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.normal(err_mean, err_std<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>, size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x),))</span>
<span id="cb3-18">y <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> x) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> err</span>
<span id="cb3-19"></span>
<span id="cb3-20"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># y* Analytical</span></span>
<span id="cb3-21">a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span></span>
<span id="cb3-22">b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb3-23">err_mean <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span></span>
<span id="cb3-24">err_std <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> (<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>)</span>
<span id="cb3-25">err_analytical <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.normal(err_mean, err_std, size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x),))</span>
<span id="cb3-26">y_analytical <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> x) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> err_analytical</span>
<span id="cb3-27"></span>
<span id="cb3-28"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># y* Computational</span></span>
<span id="cb3-29">a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">3</span></span>
<span id="cb3-30">b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb3-31">err_mean <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span></span>
<span id="cb3-32">err_std <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">5</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">**</span> (<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>)</span>
<span id="cb3-33">err_computational <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.normal(err_mean, err_std, size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x),))</span>
<span id="cb3-34">y_computational <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (b <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> x) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> (err <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> err_computational)</span>
<span id="cb3-35"></span>
<span id="cb3-36"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Data munging</span></span>
<span id="cb3-37">df0 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame({<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span>: x, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span>: signal, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dataset"</span>: [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"signal (original)"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x)})</span>
<span id="cb3-38">df1 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame({<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span>: x, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span>: y, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dataset"</span>: [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x)})</span>
<span id="cb3-39">df2 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame(</span>
<span id="cb3-40">    {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span>: x, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span>: y_computational, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dataset"</span>: [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y* (computational)"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x)}</span>
<span id="cb3-41">)</span>
<span id="cb3-42">df3 <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.DataFrame({<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span>: x, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span>: y_analytical, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dataset"</span>: [<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y* (analytical)"</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">len</span>(x)})</span>
<span id="cb3-43"></span>
<span id="cb3-44">df <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pd.concat([df0, df1, df2, df3])</span>
<span id="cb3-45"></span>
<span id="cb3-46"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Plot</span></span>
<span id="cb3-47">colorscheme <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [</span>
<span id="cb3-48">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#368BC1"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># blue</span></span>
<span id="cb3-49">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#F2BB18"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># yellow</span></span>
<span id="cb3-50">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#BB4430"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># red</span></span>
<span id="cb3-51">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#8A9A67"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># green</span></span>
<span id="cb3-52">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#CC771F"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># orange</span></span>
<span id="cb3-53">    <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#8B5260"</span>,  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># purple</span></span>
<span id="cb3-54">]</span>
<span id="cb3-55">selection <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> alt.selection_point(fields<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dataset"</span>], bind<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"legend"</span>)</span>
<span id="cb3-56">chart <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (</span>
<span id="cb3-57">    alt.Chart(</span>
<span id="cb3-58">        df,</span>
<span id="cb3-59">        title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Computational simulation of the problem matches the analytical solution"</span>,</span>
<span id="cb3-60">    )</span>
<span id="cb3-61">    .mark_circle(size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>)</span>
<span id="cb3-62">    .encode(</span>
<span id="cb3-63">        x<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x:Q"</span>,</span>
<span id="cb3-64">        y<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y:Q"</span>,</span>
<span id="cb3-65">        color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Color(</span>
<span id="cb3-66">            <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"dataset:N"</span>, title<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span>, scale<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.Scale(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>colorscheme)</span>
<span id="cb3-67">        ).legend(orient<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"top-left"</span>),</span>
<span id="cb3-68">        opacity<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>alt.condition(selection, alt.value(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.75</span>), alt.value(<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.2</span>)),</span>
<span id="cb3-69">    )</span>
<span id="cb3-70">    .configure(background<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#f8f9fa"</span>)</span>
<span id="cb3-71">    .properties(width<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">650</span>, padding<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>)</span>
<span id="cb3-72">    .add_params(selection)</span>
<span id="cb3-73">)</span>
<span id="cb3-74"></span>
<span id="cb3-75">chart.display()</span></code></pre></div></div>
</details>
<div id="plotted-signal" class="cell-output cell-output-display">

<style>
  #altair-viz-ba40146733e045cfb773523fb45158bc.vega-embed {
    width: 100%;
    display: flex;
  }

  #altair-viz-ba40146733e045cfb773523fb45158bc.vega-embed details,
  #altair-viz-ba40146733e045cfb773523fb45158bc.vega-embed details summary {
    position: relative;
  }
</style>
<div id="altair-viz-ba40146733e045cfb773523fb45158bc"></div>
<script type="text/javascript">
  var VEGA_DEBUG = (typeof VEGA_DEBUG == "undefined") ? {} : VEGA_DEBUG;
  (function(spec, embedOpt){
    let outputDiv = document.currentScript.previousElementSibling;
    if (outputDiv.id !== "altair-viz-ba40146733e045cfb773523fb45158bc") {
      outputDiv = document.getElementById("altair-viz-ba40146733e045cfb773523fb45158bc");
    }
    const paths = {
      "vega": "https://cdn.jsdelivr.net/npm/vega@5?noext",
      "vega-lib": "https://cdn.jsdelivr.net/npm/vega-lib?noext",
      "vega-lite": "https://cdn.jsdelivr.net/npm/vega-lite@5.16.3?noext",
      "vega-embed": "https://cdn.jsdelivr.net/npm/vega-embed@6?noext",
    };

    function maybeLoadScript(lib, version) {
      var key = `${lib.replace("-", "")}_version`;
      return (VEGA_DEBUG[key] == version) ?
        Promise.resolve(paths[lib]) :
        new Promise(function(resolve, reject) {
          var s = document.createElement('script');
          document.getElementsByTagName("head")[0].appendChild(s);
          s.async = true;
          s.onload = () => {
            VEGA_DEBUG[key] = version;
            return resolve(paths[lib]);
          };
          s.onerror = () => reject(`Error loading script: ${paths[lib]}`);
          s.src = paths[lib];
        });
    }

    function showError(err) {
      outputDiv.innerHTML = `<div class="error" style="color:red;">${err}</div>`;
      throw err;
    }

    function displayChart(vegaEmbed) {
      vegaEmbed(outputDiv, spec, embedOpt)
        .catch(err => showError(`Javascript Error: ${err.message}<br>This usually means there's a typo in your chart specification. See the javascript console for the full traceback.`));
    }

    if(typeof define === "function" && define.amd) {
      requirejs.config({paths});
      require(["vega-embed"], displayChart, err => showError(`Error loading script: ${err.message}`));
    } else {
      maybeLoadScript("vega", "5")
        .then(() => maybeLoadScript("vega-lite", "5.16.3"))
        .then(() => maybeLoadScript("vega-embed", "6"))
        .catch(showError)
        .then(() => displayChart(vegaEmbed));
    }
  })({"config": {"view": {"continuousWidth": 300, "continuousHeight": 300}, "background": "#f8f9fa"}, "data": {"name": "data-d19387c9230013a7a0e08f21fc84664d"}, "mark": {"type": "circle", "size": 10}, "encoding": {"color": {"field": "dataset", "legend": {"orient": "top-left"}, "scale": {"range": ["#368BC1", "#F2BB18", "#BB4430", "#8A9A67", "#CC771F", "#8B5260"]}, "title": null, "type": "nominal"}, "opacity": {"condition": {"param": "param_2", "value": 0.75}, "value": 0.2}, "x": {"field": "x", "type": "quantitative"}, "y": {"field": "y", "type": "quantitative"}}, "padding": 10, "params": [{"name": "param_2", "select": {"type": "point", "fields": ["dataset"]}, "bind": "legend"}], "title": "Computational simulation of the problem matches the analytical solution", "width": 650, "$schema": "https://vega.github.io/schema/vega-lite/v5.16.3.json", "datasets": {"data-d19387c9230013a7a0e08f21fc84664d": [{"x": 0.0, "y": 3.0, "dataset": "signal (original)"}, {"x": 0.009999999776482582, "y": 3.0199999809265137, "dataset": "signal (original)"}, {"x": 0.019999999552965164, "y": 3.0399999618530273, "dataset": "signal (original)"}, {"x": 0.029999999329447746, "y": 3.059999942779541, "dataset": "signal (original)"}, {"x": 0.03999999910593033, "y": 3.0799999237060547, "dataset": "signal (original)"}, {"x": 0.04999999701976776, "y": 3.0999999046325684, "dataset": "signal (original)"}, {"x": 0.05999999865889549, "y": 3.119999885559082, "dataset": "signal (original)"}, {"x": 0.07000000029802322, "y": 3.140000104904175, "dataset": "signal (original)"}, {"x": 0.07999999821186066, "y": 3.1600000858306885, "dataset": "signal (original)"}, {"x": 0.08999999612569809, "y": 3.180000066757202, "dataset": "signal (original)"}, {"x": 0.09999999403953552, "y": 3.200000047683716, "dataset": "signal (original)"}, {"x": 0.10999999940395355, "y": 3.2200000286102295, "dataset": "signal (original)"}, {"x": 0.11999999731779099, "y": 3.240000009536743, "dataset": "signal (original)"}, {"x": 0.12999999523162842, "y": 3.259999990463257, "dataset": "signal (original)"}, {"x": 0.14000000059604645, "y": 3.2799999713897705, "dataset": "signal (original)"}, {"x": 0.14999999105930328, "y": 3.299999952316284, "dataset": "signal (original)"}, {"x": 0.1599999964237213, "y": 3.319999933242798, "dataset": "signal (original)"}, {"x": 0.17000000178813934, "y": 3.3399999141693115, "dataset": "signal (original)"}, {"x": 0.17999999225139618, "y": 3.359999895095825, "dataset": "signal (original)"}, {"x": 0.1899999976158142, "y": 3.380000114440918, "dataset": "signal (original)"}, {"x": 0.19999998807907104, "y": 3.4000000953674316, "dataset": "signal (original)"}, {"x": 0.20999999344348907, "y": 3.4200000762939453, "dataset": "signal (original)"}, {"x": 0.2199999988079071, "y": 3.440000057220459, "dataset": "signal (original)"}, {"x": 0.22999998927116394, "y": 3.4600000381469727, "dataset": "signal (original)"}, {"x": 0.23999999463558197, "y": 3.4800000190734863, "dataset": "signal (original)"}, {"x": 0.25, "y": 3.5, "dataset": "signal (original)"}, {"x": 0.25999999046325684, "y": 3.5199999809265137, "dataset": "signal (original)"}, {"x": 0.26999998092651367, "y": 3.5399999618530273, "dataset": "signal (original)"}, {"x": 0.2800000011920929, "y": 3.559999942779541, "dataset": "signal (original)"}, {"x": 0.28999999165534973, "y": 3.5799999237060547, "dataset": "signal (original)"}, {"x": 0.29999998211860657, "y": 3.5999999046325684, "dataset": "signal (original)"}, {"x": 0.3100000023841858, "y": 3.619999885559082, "dataset": "signal (original)"}, {"x": 0.3199999928474426, "y": 3.6399998664855957, "dataset": "signal (original)"}, {"x": 0.32999998331069946, "y": 3.6599998474121094, "dataset": "signal (original)"}, {"x": 0.3400000035762787, "y": 3.680000066757202, "dataset": "signal (original)"}, {"x": 0.3499999940395355, "y": 3.700000047683716, "dataset": "signal (original)"}, {"x": 0.35999998450279236, "y": 3.7200000286102295, "dataset": "signal (original)"}, {"x": 0.3700000047683716, "y": 3.740000009536743, "dataset": "signal (original)"}, {"x": 0.3799999952316284, "y": 3.759999990463257, "dataset": "signal (original)"}, {"x": 0.38999998569488525, "y": 3.7799999713897705, "dataset": "signal (original)"}, {"x": 0.4000000059604645, "y": 3.799999952316284, "dataset": "signal (original)"}, {"x": 0.4099999964237213, "y": 3.819999933242798, "dataset": "signal (original)"}, {"x": 0.42000001668930054, "y": 3.8400001525878906, "dataset": "signal (original)"}, {"x": 0.4300000071525574, "y": 3.8600001335144043, "dataset": "signal (original)"}, {"x": 0.4399999976158142, "y": 3.880000114440918, "dataset": "signal (original)"}, {"x": 0.45000001788139343, "y": 3.9000000953674316, "dataset": "signal (original)"}, {"x": 0.46000000834465027, "y": 3.9200000762939453, "dataset": "signal (original)"}, {"x": 0.4699999988079071, "y": 3.940000057220459, "dataset": "signal (original)"}, {"x": 0.47999998927116394, "y": 3.9600000381469727, "dataset": "signal (original)"}, {"x": 0.4899999797344208, "y": 3.9800000190734863, "dataset": "signal (original)"}, {"x": 0.5, "y": 4.0, "dataset": "signal (original)"}, {"x": 0.5099999904632568, "y": 4.019999980926514, "dataset": "signal (original)"}, {"x": 0.5199999809265137, "y": 4.039999961853027, "dataset": "signal (original)"}, {"x": 0.5299999713897705, "y": 4.059999942779541, "dataset": "signal (original)"}, {"x": 0.5399999618530273, "y": 4.079999923706055, "dataset": "signal (original)"}, {"x": 0.550000011920929, "y": 4.099999904632568, "dataset": "signal (original)"}, {"x": 0.5600000023841858, "y": 4.119999885559082, "dataset": "signal (original)"}, {"x": 0.5699999928474426, "y": 4.139999866485596, "dataset": "signal (original)"}, {"x": 0.5799999833106995, "y": 4.159999847412109, "dataset": "signal (original)"}, {"x": 0.5899999737739563, "y": 4.179999828338623, "dataset": "signal (original)"}, {"x": 0.6000000238418579, "y": 4.199999809265137, "dataset": "signal (original)"}, {"x": 0.6100000143051147, "y": 4.220000267028809, "dataset": "signal (original)"}, {"x": 0.6200000047683716, "y": 4.239999771118164, "dataset": "signal (original)"}, {"x": 0.6299999952316284, "y": 4.260000228881836, "dataset": "signal (original)"}, {"x": 0.6399999856948853, "y": 4.279999732971191, "dataset": "signal (original)"}, {"x": 0.6499999761581421, "y": 4.300000190734863, "dataset": "signal (original)"}, {"x": 0.6599999666213989, "y": 4.319999694824219, "dataset": "signal (original)"}, {"x": 0.6699999570846558, "y": 4.340000152587891, "dataset": "signal (original)"}, {"x": 0.6800000071525574, "y": 4.360000133514404, "dataset": "signal (original)"}, {"x": 0.6899999976158142, "y": 4.380000114440918, "dataset": "signal (original)"}, {"x": 0.699999988079071, "y": 4.400000095367432, "dataset": "signal (original)"}, {"x": 0.7099999785423279, "y": 4.420000076293945, "dataset": "signal (original)"}, {"x": 0.7200000286102295, "y": 4.440000057220459, "dataset": "signal (original)"}, {"x": 0.7300000190734863, "y": 4.460000038146973, "dataset": "signal (original)"}, {"x": 0.7400000095367432, "y": 4.480000019073486, "dataset": "signal (original)"}, {"x": 0.75, "y": 4.5, "dataset": "signal (original)"}, {"x": 0.7600000500679016, "y": 4.519999980926514, "dataset": "signal (original)"}, {"x": 0.7700000405311584, "y": 4.539999961853027, "dataset": "signal (original)"}, {"x": 0.7800000309944153, "y": 4.559999942779541, "dataset": "signal (original)"}, {"x": 0.7900000214576721, "y": 4.579999923706055, "dataset": "signal (original)"}, {"x": 0.800000011920929, "y": 4.599999904632568, "dataset": "signal (original)"}, {"x": 0.8100000023841858, "y": 4.619999885559082, "dataset": "signal (original)"}, {"x": 0.8199999928474426, "y": 4.639999866485596, "dataset": "signal (original)"}, {"x": 0.8299999833106995, "y": 4.659999847412109, "dataset": "signal (original)"}, {"x": 0.8400000333786011, "y": 4.680000305175781, "dataset": "signal (original)"}, {"x": 0.8500000238418579, "y": 4.699999809265137, "dataset": "signal (original)"}, {"x": 0.8600000143051147, "y": 4.720000267028809, "dataset": "signal (original)"}, {"x": 0.8700000047683716, "y": 4.739999771118164, "dataset": "signal (original)"}, {"x": 0.8799999952316284, "y": 4.760000228881836, "dataset": "signal (original)"}, {"x": 0.8899999856948853, "y": 4.779999732971191, "dataset": "signal (original)"}, {"x": 0.8999999761581421, "y": 4.800000190734863, "dataset": "signal (original)"}, {"x": 0.9099999666213989, "y": 4.819999694824219, "dataset": "signal (original)"}, {"x": 0.9200000166893005, "y": 4.840000152587891, "dataset": "signal (original)"}, {"x": 0.9300000071525574, "y": 4.860000133514404, "dataset": "signal (original)"}, {"x": 0.9399999976158142, "y": 4.880000114440918, "dataset": "signal (original)"}, {"x": 0.949999988079071, "y": 4.900000095367432, "dataset": "signal (original)"}, {"x": 0.9599999785423279, "y": 4.920000076293945, "dataset": "signal (original)"}, {"x": 0.9699999690055847, "y": 4.940000057220459, "dataset": "signal (original)"}, {"x": 0.9799999594688416, "y": 4.960000038146973, "dataset": "signal (original)"}, {"x": 0.9899999499320984, "y": 4.980000019073486, "dataset": "signal (original)"}, {"x": 1.0, "y": 5.0, "dataset": "signal (original)"}, {"x": 1.0099999904632568, "y": 5.019999980926514, "dataset": "signal (original)"}, {"x": 1.0199999809265137, "y": 5.039999961853027, "dataset": "signal (original)"}, {"x": 1.0299999713897705, "y": 5.059999942779541, "dataset": "signal (original)"}, {"x": 1.0399999618530273, "y": 5.079999923706055, "dataset": "signal (original)"}, {"x": 1.0499999523162842, "y": 5.099999904632568, "dataset": "signal (original)"}, {"x": 1.059999942779541, "y": 5.119999885559082, "dataset": "signal (original)"}, {"x": 1.0699999332427979, "y": 5.139999866485596, "dataset": "signal (original)"}, {"x": 1.0799999237060547, "y": 5.159999847412109, "dataset": "signal (original)"}, {"x": 1.0899999141693115, "y": 5.179999828338623, "dataset": "signal (original)"}, {"x": 1.0999999046325684, "y": 5.199999809265137, "dataset": "signal (original)"}, {"x": 1.1100000143051147, "y": 5.220000267028809, "dataset": "signal (original)"}, {"x": 1.1200000047683716, "y": 5.239999771118164, "dataset": "signal (original)"}, {"x": 1.1299999952316284, "y": 5.260000228881836, "dataset": "signal (original)"}, {"x": 1.1399999856948853, "y": 5.279999732971191, "dataset": "signal (original)"}, {"x": 1.149999976158142, "y": 5.300000190734863, "dataset": "signal (original)"}, {"x": 1.159999966621399, "y": 5.319999694824219, "dataset": "signal (original)"}, {"x": 1.1699999570846558, "y": 5.340000152587891, "dataset": "signal (original)"}, {"x": 1.1799999475479126, "y": 5.359999656677246, "dataset": "signal (original)"}, {"x": 1.190000057220459, "y": 5.380000114440918, "dataset": "signal (original)"}, {"x": 1.2000000476837158, "y": 5.400000095367432, "dataset": "signal (original)"}, {"x": 1.2100000381469727, "y": 5.420000076293945, "dataset": "signal (original)"}, {"x": 1.2200000286102295, "y": 5.440000057220459, "dataset": "signal (original)"}, {"x": 1.2300000190734863, "y": 5.460000038146973, "dataset": "signal (original)"}, {"x": 1.2400000095367432, "y": 5.480000019073486, "dataset": "signal (original)"}, {"x": 1.25, "y": 5.5, "dataset": "signal (original)"}, {"x": 1.2599999904632568, "y": 5.519999980926514, "dataset": "signal (original)"}, {"x": 1.2700001001358032, "y": 5.539999961853027, "dataset": "signal (original)"}, {"x": 1.2799999713897705, "y": 5.559999942779541, "dataset": "signal (original)"}, {"x": 1.2899999618530273, "y": 5.579999923706055, "dataset": "signal (original)"}, {"x": 1.2999999523162842, "y": 5.599999904632568, "dataset": "signal (original)"}, {"x": 1.309999942779541, "y": 5.619999885559082, "dataset": "signal (original)"}, {"x": 1.3199999332427979, "y": 5.639999866485596, "dataset": "signal (original)"}, {"x": 1.3299999237060547, "y": 5.659999847412109, "dataset": "signal (original)"}, {"x": 1.3399999141693115, "y": 5.679999828338623, "dataset": "signal (original)"}, {"x": 1.350000023841858, "y": 5.699999809265137, "dataset": "signal (original)"}, {"x": 1.3600000143051147, "y": 5.720000267028809, "dataset": "signal (original)"}, {"x": 1.3700000047683716, "y": 5.739999771118164, "dataset": "signal (original)"}, {"x": 1.3799999952316284, "y": 5.760000228881836, "dataset": "signal (original)"}, {"x": 1.3899999856948853, "y": 5.779999732971191, "dataset": "signal (original)"}, {"x": 1.399999976158142, "y": 5.800000190734863, "dataset": "signal (original)"}, {"x": 1.409999966621399, "y": 5.819999694824219, "dataset": "signal (original)"}, {"x": 1.4199999570846558, "y": 5.840000152587891, "dataset": "signal (original)"}, {"x": 1.4300000667572021, "y": 5.860000133514404, "dataset": "signal (original)"}, {"x": 1.440000057220459, "y": 5.880000114440918, "dataset": "signal (original)"}, {"x": 1.4500000476837158, "y": 5.900000095367432, "dataset": "signal (original)"}, {"x": 1.4600000381469727, "y": 5.920000076293945, "dataset": "signal (original)"}, {"x": 1.4700000286102295, "y": 5.940000057220459, "dataset": "signal (original)"}, {"x": 1.4800000190734863, "y": 5.960000038146973, "dataset": "signal (original)"}, {"x": 1.4900000095367432, "y": 5.980000019073486, "dataset": "signal (original)"}, {"x": 1.5, "y": 6.0, "dataset": "signal (original)"}, {"x": 1.5100001096725464, "y": 6.020000457763672, "dataset": "signal (original)"}, {"x": 1.5199999809265137, "y": 6.039999961853027, "dataset": "signal (original)"}, {"x": 1.5299999713897705, "y": 6.059999942779541, "dataset": "signal (original)"}, {"x": 1.5399999618530273, "y": 6.079999923706055, "dataset": "signal (original)"}, {"x": 1.5499999523162842, "y": 6.099999904632568, "dataset": "signal (original)"}, {"x": 1.559999942779541, "y": 6.119999885559082, "dataset": "signal (original)"}, {"x": 1.5699999332427979, "y": 6.139999866485596, "dataset": "signal (original)"}, {"x": 1.5799999237060547, "y": 6.159999847412109, "dataset": "signal (original)"}, {"x": 1.590000033378601, "y": 6.180000305175781, "dataset": "signal (original)"}, {"x": 1.600000023841858, "y": 6.199999809265137, "dataset": "signal (original)"}, {"x": 1.6100000143051147, "y": 6.220000267028809, "dataset": "signal (original)"}, {"x": 1.6200000047683716, "y": 6.239999771118164, "dataset": "signal (original)"}, {"x": 1.6299999952316284, "y": 6.260000228881836, "dataset": "signal (original)"}, {"x": 1.6399999856948853, "y": 6.279999732971191, "dataset": "signal (original)"}, {"x": 1.649999976158142, "y": 6.300000190734863, "dataset": "signal (original)"}, {"x": 1.659999966621399, "y": 6.319999694824219, "dataset": "signal (original)"}, {"x": 1.6700000762939453, "y": 6.340000152587891, "dataset": "signal (original)"}, {"x": 1.6799999475479126, "y": 6.359999656677246, "dataset": "signal (original)"}, {"x": 1.6899999380111694, "y": 6.380000114440918, "dataset": "signal (original)"}, {"x": 1.6999999284744263, "y": 6.399999618530273, "dataset": "signal (original)"}, {"x": 1.709999918937683, "y": 6.420000076293945, "dataset": "signal (original)"}, {"x": 1.71999990940094, "y": 6.439999580383301, "dataset": "signal (original)"}, {"x": 1.7299998998641968, "y": 6.460000038146973, "dataset": "signal (original)"}, {"x": 1.7399998903274536, "y": 6.479999542236328, "dataset": "signal (original)"}, {"x": 1.75, "y": 6.5, "dataset": "signal (original)"}, {"x": 1.7599999904632568, "y": 6.519999980926514, "dataset": "signal (original)"}, {"x": 1.7699999809265137, "y": 6.539999961853027, "dataset": "signal (original)"}, {"x": 1.7799999713897705, "y": 6.559999942779541, "dataset": "signal (original)"}, {"x": 1.7899999618530273, "y": 6.579999923706055, "dataset": "signal (original)"}, {"x": 1.7999999523162842, "y": 6.599999904632568, "dataset": "signal (original)"}, {"x": 1.809999942779541, "y": 6.619999885559082, "dataset": "signal (original)"}, {"x": 1.8199999332427979, "y": 6.639999866485596, "dataset": "signal (original)"}, {"x": 1.8300000429153442, "y": 6.659999847412109, "dataset": "signal (original)"}, {"x": 1.840000033378601, "y": 6.680000305175781, "dataset": "signal (original)"}, {"x": 1.850000023841858, "y": 6.699999809265137, "dataset": "signal (original)"}, {"x": 1.8600000143051147, "y": 6.720000267028809, "dataset": "signal (original)"}, {"x": 1.8700000047683716, "y": 6.739999771118164, "dataset": "signal (original)"}, {"x": 1.8799999952316284, "y": 6.760000228881836, "dataset": "signal (original)"}, {"x": 1.8899999856948853, "y": 6.779999732971191, "dataset": "signal (original)"}, {"x": 1.899999976158142, "y": 6.800000190734863, "dataset": "signal (original)"}, {"x": 1.9100000858306885, "y": 6.820000171661377, "dataset": "signal (original)"}, {"x": 1.9199999570846558, "y": 6.840000152587891, "dataset": "signal (original)"}, {"x": 1.9299999475479126, "y": 6.859999656677246, "dataset": "signal (original)"}, {"x": 1.9399999380111694, "y": 6.880000114440918, "dataset": "signal (original)"}, {"x": 1.9499999284744263, "y": 6.899999618530273, "dataset": "signal (original)"}, {"x": 1.959999918937683, "y": 6.920000076293945, "dataset": "signal (original)"}, {"x": 1.96999990940094, "y": 6.939999580383301, "dataset": "signal (original)"}, {"x": 1.9799998998641968, "y": 6.960000038146973, "dataset": "signal (original)"}, {"x": 1.9900000095367432, "y": 6.980000019073486, "dataset": "signal (original)"}, {"x": 2.0, "y": 7.0, "dataset": "signal (original)"}, {"x": 2.009999990463257, "y": 7.019999980926514, "dataset": "signal (original)"}, {"x": 2.0199999809265137, "y": 7.039999961853027, "dataset": "signal (original)"}, {"x": 2.0299999713897705, "y": 7.059999942779541, "dataset": "signal (original)"}, {"x": 2.0399999618530273, "y": 7.079999923706055, "dataset": "signal (original)"}, {"x": 2.049999952316284, "y": 7.099999904632568, "dataset": "signal (original)"}, {"x": 2.059999942779541, "y": 7.119999885559082, "dataset": "signal (original)"}, {"x": 2.069999933242798, "y": 7.139999866485596, "dataset": "signal (original)"}, {"x": 2.0799999237060547, "y": 7.159999847412109, "dataset": "signal (original)"}, {"x": 2.0899999141693115, "y": 7.179999828338623, "dataset": "signal (original)"}, {"x": 2.0999999046325684, "y": 7.199999809265137, "dataset": "signal (original)"}, {"x": 2.109999895095825, "y": 7.21999979019165, "dataset": "signal (original)"}, {"x": 2.119999885559082, "y": 7.239999771118164, "dataset": "signal (original)"}, {"x": 2.129999876022339, "y": 7.259999752044678, "dataset": "signal (original)"}, {"x": 2.1399998664855957, "y": 7.279999732971191, "dataset": "signal (original)"}, {"x": 2.1499998569488525, "y": 7.299999713897705, "dataset": "signal (original)"}, {"x": 2.1600000858306885, "y": 7.320000171661377, "dataset": "signal (original)"}, {"x": 2.1700000762939453, "y": 7.340000152587891, "dataset": "signal (original)"}, {"x": 2.180000066757202, "y": 7.360000133514404, "dataset": "signal (original)"}, {"x": 2.190000057220459, "y": 7.380000114440918, "dataset": "signal (original)"}, {"x": 2.200000047683716, "y": 7.400000095367432, "dataset": "signal (original)"}, {"x": 2.2100000381469727, "y": 7.420000076293945, "dataset": "signal (original)"}, {"x": 2.2200000286102295, "y": 7.440000057220459, "dataset": "signal (original)"}, {"x": 2.2300000190734863, "y": 7.460000038146973, "dataset": "signal (original)"}, {"x": 2.240000009536743, "y": 7.480000019073486, "dataset": "signal (original)"}, {"x": 2.25, "y": 7.5, "dataset": "signal (original)"}, {"x": 2.259999990463257, "y": 7.519999980926514, "dataset": "signal (original)"}, {"x": 2.2699999809265137, "y": 7.539999961853027, "dataset": "signal (original)"}, {"x": 2.2799999713897705, "y": 7.559999942779541, "dataset": "signal (original)"}, {"x": 2.2899999618530273, "y": 7.579999923706055, "dataset": "signal (original)"}, {"x": 2.299999952316284, "y": 7.599999904632568, "dataset": "signal (original)"}, {"x": 2.309999942779541, "y": 7.619999885559082, "dataset": "signal (original)"}, {"x": 2.319999933242798, "y": 7.639999866485596, "dataset": "signal (original)"}, {"x": 2.3299999237060547, "y": 7.659999847412109, "dataset": "signal (original)"}, {"x": 2.3399999141693115, "y": 7.679999828338623, "dataset": "signal (original)"}, {"x": 2.3499999046325684, "y": 7.699999809265137, "dataset": "signal (original)"}, {"x": 2.359999895095825, "y": 7.71999979019165, "dataset": "signal (original)"}, {"x": 2.369999885559082, "y": 7.739999771118164, "dataset": "signal (original)"}, {"x": 2.379999876022339, "y": 7.759999752044678, "dataset": "signal (original)"}, {"x": 2.3899998664855957, "y": 7.779999732971191, "dataset": "signal (original)"}, {"x": 2.4000000953674316, "y": 7.800000190734863, "dataset": "signal (original)"}, {"x": 2.4100000858306885, "y": 7.820000171661377, "dataset": "signal (original)"}, {"x": 2.4200000762939453, "y": 7.840000152587891, "dataset": "signal (original)"}, {"x": 2.430000066757202, "y": 7.860000133514404, "dataset": "signal (original)"}, {"x": 2.440000057220459, "y": 7.880000114440918, "dataset": "signal (original)"}, {"x": 2.450000047683716, "y": 7.900000095367432, "dataset": "signal (original)"}, {"x": 2.4600000381469727, "y": 7.920000076293945, "dataset": "signal (original)"}, {"x": 2.4700000286102295, "y": 7.940000057220459, "dataset": "signal (original)"}, {"x": 2.4800000190734863, "y": 7.960000038146973, "dataset": "signal (original)"}, {"x": 2.490000009536743, "y": 7.980000019073486, "dataset": "signal (original)"}, {"x": 2.5, "y": 8.0, "dataset": "signal (original)"}, {"x": 2.509999990463257, "y": 8.020000457763672, "dataset": "signal (original)"}, {"x": 2.5199999809265137, "y": 8.039999961853027, "dataset": "signal (original)"}, {"x": 2.5299999713897705, "y": 8.059999465942383, "dataset": "signal (original)"}, {"x": 2.5399999618530273, "y": 8.079999923706055, "dataset": "signal (original)"}, {"x": 2.549999952316284, "y": 8.100000381469727, "dataset": "signal (original)"}, {"x": 2.559999942779541, "y": 8.119999885559082, "dataset": "signal (original)"}, {"x": 2.569999933242798, "y": 8.139999389648438, "dataset": "signal (original)"}, {"x": 2.5799999237060547, "y": 8.15999984741211, "dataset": "signal (original)"}, {"x": 2.5899999141693115, "y": 8.180000305175781, "dataset": "signal (original)"}, {"x": 2.5999999046325684, "y": 8.199999809265137, "dataset": "signal (original)"}, {"x": 2.609999895095825, "y": 8.219999313354492, "dataset": "signal (original)"}, {"x": 2.619999885559082, "y": 8.239999771118164, "dataset": "signal (original)"}, {"x": 2.629999876022339, "y": 8.260000228881836, "dataset": "signal (original)"}, {"x": 2.640000104904175, "y": 8.280000686645508, "dataset": "signal (original)"}, {"x": 2.6500000953674316, "y": 8.300000190734863, "dataset": "signal (original)"}, {"x": 2.6600000858306885, "y": 8.319999694824219, "dataset": "signal (original)"}, {"x": 2.6700000762939453, "y": 8.34000015258789, "dataset": "signal (original)"}, {"x": 2.680000066757202, "y": 8.360000610351562, "dataset": "signal (original)"}, {"x": 2.690000057220459, "y": 8.380000114440918, "dataset": "signal (original)"}, {"x": 2.700000047683716, "y": 8.399999618530273, "dataset": "signal (original)"}, {"x": 2.7100000381469727, "y": 8.420000076293945, "dataset": "signal (original)"}, {"x": 2.7200000286102295, "y": 8.440000534057617, "dataset": "signal (original)"}, {"x": 2.7300000190734863, "y": 8.460000038146973, "dataset": "signal (original)"}, {"x": 2.740000009536743, "y": 8.479999542236328, "dataset": "signal (original)"}, {"x": 2.75, "y": 8.5, "dataset": "signal (original)"}, {"x": 2.759999990463257, "y": 8.520000457763672, "dataset": "signal (original)"}, {"x": 2.7699999809265137, "y": 8.539999961853027, "dataset": "signal (original)"}, {"x": 2.7799999713897705, "y": 8.559999465942383, "dataset": "signal (original)"}, {"x": 2.7899999618530273, "y": 8.579999923706055, "dataset": "signal (original)"}, {"x": 2.799999952316284, "y": 8.600000381469727, "dataset": "signal (original)"}, {"x": 2.809999942779541, "y": 8.619999885559082, "dataset": "signal (original)"}, {"x": 2.819999933242798, "y": 8.639999389648438, "dataset": "signal (original)"}, {"x": 2.8299999237060547, "y": 8.65999984741211, "dataset": "signal (original)"}, {"x": 2.8399999141693115, "y": 8.680000305175781, "dataset": "signal (original)"}, {"x": 2.8499999046325684, "y": 8.699999809265137, "dataset": "signal (original)"}, {"x": 2.859999895095825, "y": 8.719999313354492, "dataset": "signal (original)"}, {"x": 2.869999885559082, "y": 8.739999771118164, "dataset": "signal (original)"}, {"x": 2.880000114440918, "y": 8.760000228881836, "dataset": "signal (original)"}, {"x": 2.890000104904175, "y": 8.780000686645508, "dataset": "signal (original)"}, {"x": 2.9000000953674316, "y": 8.800000190734863, "dataset": "signal (original)"}, {"x": 2.9100000858306885, "y": 8.819999694824219, "dataset": "signal (original)"}, {"x": 2.9200000762939453, "y": 8.84000015258789, "dataset": "signal (original)"}, {"x": 2.930000066757202, "y": 8.860000610351562, "dataset": "signal (original)"}, {"x": 2.940000057220459, "y": 8.880000114440918, "dataset": "signal (original)"}, {"x": 2.950000047683716, "y": 8.899999618530273, "dataset": "signal (original)"}, {"x": 2.9600000381469727, "y": 8.920000076293945, "dataset": "signal (original)"}, {"x": 2.9700000286102295, "y": 8.940000534057617, "dataset": "signal (original)"}, {"x": 2.9800000190734863, "y": 8.960000038146973, "dataset": "signal (original)"}, {"x": 2.990000009536743, "y": 8.979999542236328, "dataset": "signal (original)"}, {"x": 3.0, "y": 9.0, "dataset": "signal (original)"}, {"x": 3.009999990463257, "y": 9.020000457763672, "dataset": "signal (original)"}, {"x": 3.0199999809265137, "y": 9.039999961853027, "dataset": "signal (original)"}, {"x": 3.0299999713897705, "y": 9.059999465942383, "dataset": "signal (original)"}, {"x": 3.0399999618530273, "y": 9.079999923706055, "dataset": "signal (original)"}, {"x": 3.049999952316284, "y": 9.100000381469727, "dataset": "signal (original)"}, {"x": 3.059999942779541, "y": 9.119999885559082, "dataset": "signal (original)"}, {"x": 3.069999933242798, "y": 9.139999389648438, "dataset": "signal (original)"}, {"x": 3.0799999237060547, "y": 9.15999984741211, "dataset": "signal (original)"}, {"x": 3.0899999141693115, "y": 9.180000305175781, "dataset": "signal (original)"}, {"x": 3.0999999046325684, "y": 9.199999809265137, "dataset": "signal (original)"}, {"x": 3.109999895095825, "y": 9.219999313354492, "dataset": "signal (original)"}, {"x": 3.119999885559082, "y": 9.239999771118164, "dataset": "signal (original)"}, {"x": 3.129999876022339, "y": 9.260000228881836, "dataset": "signal (original)"}, {"x": 3.1399998664855957, "y": 9.279999732971191, "dataset": "signal (original)"}, {"x": 3.1499998569488525, "y": 9.299999237060547, "dataset": "signal (original)"}, {"x": 3.1599998474121094, "y": 9.319999694824219, "dataset": "signal (original)"}, {"x": 3.169999837875366, "y": 9.34000015258789, "dataset": "signal (original)"}, {"x": 3.179999828338623, "y": 9.359999656677246, "dataset": "signal (original)"}, {"x": 3.18999981880188, "y": 9.379999160766602, "dataset": "signal (original)"}, {"x": 3.200000047683716, "y": 9.399999618530273, "dataset": "signal (original)"}, {"x": 3.2100000381469727, "y": 9.420000076293945, "dataset": "signal (original)"}, {"x": 3.2200000286102295, "y": 9.440000534057617, "dataset": "signal (original)"}, {"x": 3.2300000190734863, "y": 9.460000038146973, "dataset": "signal (original)"}, {"x": 3.240000009536743, "y": 9.479999542236328, "dataset": "signal (original)"}, {"x": 3.25, "y": 9.5, "dataset": "signal (original)"}, {"x": 3.259999990463257, "y": 9.520000457763672, "dataset": "signal (original)"}, {"x": 3.2699999809265137, "y": 9.539999961853027, "dataset": "signal (original)"}, {"x": 3.2799999713897705, "y": 9.559999465942383, "dataset": "signal (original)"}, {"x": 3.2899999618530273, "y": 9.579999923706055, "dataset": "signal (original)"}, {"x": 3.299999952316284, "y": 9.600000381469727, "dataset": "signal (original)"}, {"x": 3.309999942779541, "y": 9.619999885559082, "dataset": "signal (original)"}, {"x": 3.319999933242798, "y": 9.639999389648438, "dataset": "signal (original)"}, {"x": 3.3299999237060547, "y": 9.65999984741211, "dataset": "signal (original)"}, {"x": 3.3399999141693115, "y": 9.680000305175781, "dataset": "signal (original)"}, {"x": 3.3499999046325684, "y": 9.699999809265137, "dataset": "signal (original)"}, {"x": 3.359999895095825, "y": 9.719999313354492, "dataset": "signal (original)"}, {"x": 3.369999885559082, "y": 9.739999771118164, "dataset": "signal (original)"}, {"x": 3.379999876022339, "y": 9.760000228881836, "dataset": "signal (original)"}, {"x": 3.3899998664855957, "y": 9.779999732971191, "dataset": "signal (original)"}, {"x": 3.3999998569488525, "y": 9.799999237060547, "dataset": "signal (original)"}, {"x": 3.4099998474121094, "y": 9.819999694824219, "dataset": "signal (original)"}, {"x": 3.419999837875366, "y": 9.84000015258789, "dataset": "signal (original)"}, {"x": 3.429999828338623, "y": 9.859999656677246, "dataset": "signal (original)"}, {"x": 3.440000057220459, "y": 9.880000114440918, "dataset": "signal (original)"}, {"x": 3.450000047683716, "y": 9.899999618530273, "dataset": "signal (original)"}, {"x": 3.4600000381469727, "y": 9.920000076293945, "dataset": "signal (original)"}, {"x": 3.4700000286102295, "y": 9.940000534057617, "dataset": "signal (original)"}, {"x": 3.4800000190734863, "y": 9.960000038146973, "dataset": "signal (original)"}, {"x": 3.490000009536743, "y": 9.979999542236328, "dataset": "signal (original)"}, {"x": 3.5, "y": 10.0, "dataset": "signal (original)"}, {"x": 3.509999990463257, "y": 10.020000457763672, "dataset": "signal (original)"}, {"x": 3.5199999809265137, "y": 10.039999961853027, "dataset": "signal (original)"}, {"x": 3.5299999713897705, "y": 10.059999465942383, "dataset": "signal (original)"}, {"x": 3.5399999618530273, "y": 10.079999923706055, "dataset": "signal (original)"}, {"x": 3.549999952316284, "y": 10.100000381469727, "dataset": "signal (original)"}, {"x": 3.559999942779541, "y": 10.119999885559082, "dataset": "signal (original)"}, {"x": 3.569999933242798, "y": 10.139999389648438, "dataset": "signal (original)"}, {"x": 3.5799999237060547, "y": 10.15999984741211, "dataset": "signal (original)"}, {"x": 3.5899999141693115, "y": 10.180000305175781, "dataset": "signal (original)"}, {"x": 3.5999999046325684, "y": 10.199999809265137, "dataset": "signal (original)"}, {"x": 3.609999895095825, "y": 10.219999313354492, "dataset": "signal (original)"}, {"x": 3.619999885559082, "y": 10.239999771118164, "dataset": "signal (original)"}, {"x": 3.629999876022339, "y": 10.260000228881836, "dataset": "signal (original)"}, {"x": 3.6399998664855957, "y": 10.279999732971191, "dataset": "signal (original)"}, {"x": 3.6499998569488525, "y": 10.299999237060547, "dataset": "signal (original)"}, {"x": 3.6599998474121094, "y": 10.319999694824219, "dataset": "signal (original)"}, {"x": 3.669999837875366, "y": 10.34000015258789, "dataset": "signal (original)"}, {"x": 3.680000066757202, "y": 10.360000610351562, "dataset": "signal (original)"}, {"x": 3.690000057220459, "y": 10.380000114440918, "dataset": "signal (original)"}, {"x": 3.700000047683716, "y": 10.399999618530273, "dataset": "signal (original)"}, {"x": 3.7100000381469727, "y": 10.420000076293945, "dataset": "signal (original)"}, {"x": 3.7200000286102295, "y": 10.440000534057617, "dataset": "signal (original)"}, {"x": 3.7300000190734863, "y": 10.460000038146973, "dataset": "signal (original)"}, {"x": 3.740000009536743, "y": 10.479999542236328, "dataset": "signal (original)"}, {"x": 3.75, "y": 10.5, "dataset": "signal (original)"}, {"x": 3.759999990463257, "y": 10.520000457763672, "dataset": "signal (original)"}, {"x": 3.7699999809265137, "y": 10.539999961853027, "dataset": "signal (original)"}, {"x": 3.7799999713897705, "y": 10.559999465942383, "dataset": "signal (original)"}, {"x": 3.7899999618530273, "y": 10.579999923706055, "dataset": "signal (original)"}, {"x": 3.799999952316284, "y": 10.600000381469727, "dataset": "signal (original)"}, {"x": 3.809999942779541, "y": 10.619999885559082, "dataset": "signal (original)"}, {"x": 3.819999933242798, "y": 10.639999389648438, "dataset": "signal (original)"}, {"x": 3.8299999237060547, "y": 10.65999984741211, "dataset": "signal (original)"}, {"x": 3.8399999141693115, "y": 10.680000305175781, "dataset": "signal (original)"}, {"x": 3.8499999046325684, "y": 10.699999809265137, "dataset": "signal (original)"}, {"x": 3.859999895095825, "y": 10.719999313354492, "dataset": "signal (original)"}, {"x": 3.869999885559082, "y": 10.739999771118164, "dataset": "signal (original)"}, {"x": 3.879999876022339, "y": 10.760000228881836, "dataset": "signal (original)"}, {"x": 3.8899998664855957, "y": 10.779999732971191, "dataset": "signal (original)"}, {"x": 3.8999998569488525, "y": 10.799999237060547, "dataset": "signal (original)"}, {"x": 3.9099998474121094, "y": 10.819999694824219, "dataset": "signal (original)"}, {"x": 3.9200000762939453, "y": 10.84000015258789, "dataset": "signal (original)"}, {"x": 3.930000066757202, "y": 10.860000610351562, "dataset": "signal (original)"}, {"x": 3.940000057220459, "y": 10.880000114440918, "dataset": "signal (original)"}, {"x": 3.950000047683716, "y": 10.899999618530273, "dataset": "signal (original)"}, {"x": 3.9600000381469727, "y": 10.920000076293945, "dataset": "signal (original)"}, {"x": 3.9700000286102295, "y": 10.940000534057617, "dataset": "signal (original)"}, {"x": 3.9800000190734863, "y": 10.960000038146973, "dataset": "signal (original)"}, {"x": 3.990000009536743, "y": 10.979999542236328, "dataset": "signal (original)"}, {"x": 4.0, "y": 11.0, "dataset": "signal (original)"}, {"x": 4.010000228881836, "y": 11.020000457763672, "dataset": "signal (original)"}, {"x": 4.019999980926514, "y": 11.039999961853027, "dataset": "signal (original)"}, {"x": 4.03000020980835, "y": 11.0600004196167, "dataset": "signal (original)"}, {"x": 4.039999961853027, "y": 11.079999923706055, "dataset": "signal (original)"}, {"x": 4.050000190734863, "y": 11.100000381469727, "dataset": "signal (original)"}, {"x": 4.059999942779541, "y": 11.119999885559082, "dataset": "signal (original)"}, {"x": 4.070000171661377, "y": 11.140000343322754, "dataset": "signal (original)"}, {"x": 4.079999923706055, "y": 11.15999984741211, "dataset": "signal (original)"}, {"x": 4.090000152587891, "y": 11.180000305175781, "dataset": "signal (original)"}, {"x": 4.099999904632568, "y": 11.199999809265137, "dataset": "signal (original)"}, {"x": 4.110000133514404, "y": 11.220000267028809, "dataset": "signal (original)"}, {"x": 4.119999885559082, "y": 11.239999771118164, "dataset": "signal (original)"}, {"x": 4.130000114440918, "y": 11.260000228881836, "dataset": "signal (original)"}, {"x": 4.139999866485596, "y": 11.279999732971191, "dataset": "signal (original)"}, {"x": 4.150000095367432, "y": 11.300000190734863, "dataset": "signal (original)"}, {"x": 4.159999847412109, "y": 11.319999694824219, "dataset": "signal (original)"}, {"x": 4.170000076293945, "y": 11.34000015258789, "dataset": "signal (original)"}, {"x": 4.179999828338623, "y": 11.359999656677246, "dataset": "signal (original)"}, {"x": 4.190000057220459, "y": 11.380000114440918, "dataset": "signal (original)"}, {"x": 4.199999809265137, "y": 11.399999618530273, "dataset": "signal (original)"}, {"x": 4.210000038146973, "y": 11.420000076293945, "dataset": "signal (original)"}, {"x": 4.21999979019165, "y": 11.4399995803833, "dataset": "signal (original)"}, {"x": 4.230000019073486, "y": 11.460000038146973, "dataset": "signal (original)"}, {"x": 4.239999771118164, "y": 11.479999542236328, "dataset": "signal (original)"}, {"x": 4.25, "y": 11.5, "dataset": "signal (original)"}, {"x": 4.259999752044678, "y": 11.519999504089355, "dataset": "signal (original)"}, {"x": 4.269999980926514, "y": 11.539999961853027, "dataset": "signal (original)"}, {"x": 4.279999732971191, "y": 11.559999465942383, "dataset": "signal (original)"}, {"x": 4.289999961853027, "y": 11.579999923706055, "dataset": "signal (original)"}, {"x": 4.299999713897705, "y": 11.59999942779541, "dataset": "signal (original)"}, {"x": 4.309999942779541, "y": 11.619999885559082, "dataset": "signal (original)"}, {"x": 4.320000171661377, "y": 11.640000343322754, "dataset": "signal (original)"}, {"x": 4.330000400543213, "y": 11.660000801086426, "dataset": "signal (original)"}, {"x": 4.340000152587891, "y": 11.680000305175781, "dataset": "signal (original)"}, {"x": 4.350000381469727, "y": 11.700000762939453, "dataset": "signal (original)"}, {"x": 4.360000133514404, "y": 11.720000267028809, "dataset": "signal (original)"}, {"x": 4.37000036239624, "y": 11.74000072479248, "dataset": "signal (original)"}, {"x": 4.380000114440918, "y": 11.760000228881836, "dataset": "signal (original)"}, {"x": 4.390000343322754, "y": 11.780000686645508, "dataset": "signal (original)"}, {"x": 4.400000095367432, "y": 11.800000190734863, "dataset": "signal (original)"}, {"x": 4.410000324249268, "y": 11.820000648498535, "dataset": "signal (original)"}, {"x": 4.420000076293945, "y": 11.84000015258789, "dataset": "signal (original)"}, {"x": 4.430000305175781, "y": 11.860000610351562, "dataset": "signal (original)"}, {"x": 4.440000057220459, "y": 11.880000114440918, "dataset": "signal (original)"}, {"x": 4.450000286102295, "y": 11.90000057220459, "dataset": "signal (original)"}, {"x": 4.460000038146973, "y": 11.920000076293945, "dataset": "signal (original)"}, {"x": 4.470000267028809, "y": 11.940000534057617, "dataset": "signal (original)"}, {"x": 4.480000019073486, "y": 11.960000038146973, "dataset": "signal (original)"}, {"x": 4.490000247955322, "y": 11.980000495910645, "dataset": "signal (original)"}, {"x": 4.5, "y": 12.0, "dataset": "signal (original)"}, {"x": 4.510000228881836, "y": 12.020000457763672, "dataset": "signal (original)"}, {"x": 4.519999980926514, "y": 12.039999961853027, "dataset": "signal (original)"}, {"x": 4.53000020980835, "y": 12.0600004196167, "dataset": "signal (original)"}, {"x": 4.539999961853027, "y": 12.079999923706055, "dataset": "signal (original)"}, {"x": 4.550000190734863, "y": 12.100000381469727, "dataset": "signal (original)"}, {"x": 4.559999942779541, "y": 12.119999885559082, "dataset": "signal (original)"}, {"x": 4.570000171661377, "y": 12.140000343322754, "dataset": "signal (original)"}, {"x": 4.579999923706055, "y": 12.15999984741211, "dataset": "signal (original)"}, {"x": 4.590000152587891, "y": 12.180000305175781, "dataset": "signal (original)"}, {"x": 4.599999904632568, "y": 12.199999809265137, "dataset": "signal (original)"}, {"x": 4.610000133514404, "y": 12.220000267028809, "dataset": "signal (original)"}, {"x": 4.619999885559082, "y": 12.239999771118164, "dataset": "signal (original)"}, {"x": 4.630000114440918, "y": 12.260000228881836, "dataset": "signal (original)"}, {"x": 4.639999866485596, "y": 12.279999732971191, "dataset": "signal (original)"}, {"x": 4.650000095367432, "y": 12.300000190734863, "dataset": "signal (original)"}, {"x": 4.659999847412109, "y": 12.319999694824219, "dataset": "signal (original)"}, {"x": 4.670000076293945, "y": 12.34000015258789, "dataset": "signal (original)"}, {"x": 4.679999828338623, "y": 12.359999656677246, "dataset": "signal (original)"}, {"x": 4.690000057220459, "y": 12.380000114440918, "dataset": "signal (original)"}, {"x": 4.699999809265137, "y": 12.399999618530273, "dataset": "signal (original)"}, {"x": 4.710000038146973, "y": 12.420000076293945, "dataset": "signal (original)"}, {"x": 4.71999979019165, "y": 12.4399995803833, "dataset": "signal (original)"}, {"x": 4.730000019073486, "y": 12.460000038146973, "dataset": "signal (original)"}, {"x": 4.739999771118164, "y": 12.479999542236328, "dataset": "signal (original)"}, {"x": 4.75, "y": 12.5, "dataset": "signal (original)"}, {"x": 4.759999752044678, "y": 12.519999504089355, "dataset": "signal (original)"}, {"x": 4.769999980926514, "y": 12.539999961853027, "dataset": "signal (original)"}, {"x": 4.779999732971191, "y": 12.559999465942383, "dataset": "signal (original)"}, {"x": 4.789999961853027, "y": 12.579999923706055, "dataset": "signal (original)"}, {"x": 4.800000190734863, "y": 12.600000381469727, "dataset": "signal (original)"}, {"x": 4.810000419616699, "y": 12.620000839233398, "dataset": "signal (original)"}, {"x": 4.820000171661377, "y": 12.640000343322754, "dataset": "signal (original)"}, {"x": 4.830000400543213, "y": 12.660000801086426, "dataset": "signal (original)"}, {"x": 4.840000152587891, "y": 12.680000305175781, "dataset": "signal (original)"}, {"x": 4.850000381469727, "y": 12.700000762939453, "dataset": "signal (original)"}, {"x": 4.860000133514404, "y": 12.720000267028809, "dataset": "signal (original)"}, {"x": 4.87000036239624, "y": 12.74000072479248, "dataset": "signal (original)"}, {"x": 4.880000114440918, "y": 12.760000228881836, "dataset": "signal (original)"}, {"x": 4.890000343322754, "y": 12.780000686645508, "dataset": "signal (original)"}, {"x": 4.900000095367432, "y": 12.800000190734863, "dataset": "signal (original)"}, {"x": 4.910000324249268, "y": 12.820000648498535, "dataset": "signal (original)"}, {"x": 4.920000076293945, "y": 12.84000015258789, "dataset": "signal (original)"}, {"x": 4.930000305175781, "y": 12.860000610351562, "dataset": "signal (original)"}, {"x": 4.940000057220459, "y": 12.880000114440918, "dataset": "signal (original)"}, {"x": 4.950000286102295, "y": 12.90000057220459, "dataset": "signal (original)"}, {"x": 4.960000038146973, "y": 12.920000076293945, "dataset": "signal (original)"}, {"x": 4.970000267028809, "y": 12.940000534057617, "dataset": "signal (original)"}, {"x": 4.980000019073486, "y": 12.960000038146973, "dataset": "signal (original)"}, {"x": 4.990000247955322, "y": 12.980000495910645, "dataset": "signal (original)"}, {"x": 5.0, "y": 13.0, "dataset": "signal (original)"}, {"x": 5.010000228881836, "y": 13.020000457763672, "dataset": "signal (original)"}, {"x": 5.019999980926514, "y": 13.039999961853027, "dataset": "signal (original)"}, {"x": 5.03000020980835, "y": 13.0600004196167, "dataset": "signal (original)"}, {"x": 5.039999961853027, "y": 13.079999923706055, "dataset": "signal (original)"}, {"x": 5.050000190734863, "y": 13.100000381469727, "dataset": "signal (original)"}, {"x": 5.059999942779541, "y": 13.119999885559082, "dataset": "signal (original)"}, {"x": 5.070000171661377, "y": 13.140000343322754, "dataset": "signal (original)"}, {"x": 5.079999923706055, "y": 13.15999984741211, "dataset": "signal (original)"}, {"x": 5.090000152587891, "y": 13.180000305175781, "dataset": "signal (original)"}, {"x": 5.099999904632568, "y": 13.199999809265137, "dataset": "signal (original)"}, {"x": 5.110000133514404, "y": 13.220000267028809, "dataset": "signal (original)"}, {"x": 5.119999885559082, "y": 13.239999771118164, "dataset": "signal (original)"}, {"x": 5.130000114440918, "y": 13.260000228881836, "dataset": "signal (original)"}, {"x": 5.139999866485596, "y": 13.279999732971191, "dataset": "signal (original)"}, {"x": 5.150000095367432, "y": 13.300000190734863, "dataset": "signal (original)"}, {"x": 5.159999847412109, "y": 13.319999694824219, "dataset": "signal (original)"}, {"x": 5.170000076293945, "y": 13.34000015258789, "dataset": "signal (original)"}, {"x": 5.179999828338623, "y": 13.359999656677246, "dataset": "signal (original)"}, {"x": 5.190000057220459, "y": 13.380000114440918, "dataset": "signal (original)"}, {"x": 5.199999809265137, "y": 13.399999618530273, "dataset": "signal (original)"}, {"x": 5.210000038146973, "y": 13.420000076293945, "dataset": "signal (original)"}, {"x": 5.21999979019165, "y": 13.4399995803833, "dataset": "signal (original)"}, {"x": 5.230000019073486, "y": 13.460000038146973, "dataset": "signal (original)"}, {"x": 5.239999771118164, "y": 13.479999542236328, "dataset": "signal (original)"}, {"x": 5.25, "y": 13.5, "dataset": "signal (original)"}, {"x": 5.259999752044678, "y": 13.519999504089355, "dataset": "signal (original)"}, {"x": 5.269999980926514, "y": 13.539999961853027, "dataset": "signal (original)"}, {"x": 5.28000020980835, "y": 13.5600004196167, "dataset": "signal (original)"}, {"x": 5.2900004386901855, "y": 13.580000877380371, "dataset": "signal (original)"}, {"x": 5.300000190734863, "y": 13.600000381469727, "dataset": "signal (original)"}, {"x": 5.310000419616699, "y": 13.620000839233398, "dataset": "signal (original)"}, {"x": 5.320000171661377, "y": 13.640000343322754, "dataset": "signal (original)"}, {"x": 5.330000400543213, "y": 13.660000801086426, "dataset": "signal (original)"}, {"x": 5.340000152587891, "y": 13.680000305175781, "dataset": "signal (original)"}, {"x": 5.350000381469727, "y": 13.700000762939453, "dataset": "signal (original)"}, {"x": 5.360000133514404, "y": 13.720000267028809, "dataset": "signal (original)"}, {"x": 5.37000036239624, "y": 13.74000072479248, "dataset": "signal (original)"}, {"x": 5.380000114440918, "y": 13.760000228881836, "dataset": "signal (original)"}, {"x": 5.390000343322754, "y": 13.780000686645508, "dataset": "signal (original)"}, {"x": 5.400000095367432, "y": 13.800000190734863, "dataset": "signal (original)"}, {"x": 5.410000324249268, "y": 13.820000648498535, "dataset": "signal (original)"}, {"x": 5.420000076293945, "y": 13.84000015258789, "dataset": "signal (original)"}, {"x": 5.430000305175781, "y": 13.860000610351562, "dataset": "signal (original)"}, {"x": 5.440000057220459, "y": 13.880000114440918, "dataset": "signal (original)"}, {"x": 5.450000286102295, "y": 13.90000057220459, "dataset": "signal (original)"}, {"x": 5.460000038146973, "y": 13.920000076293945, "dataset": "signal (original)"}, {"x": 5.470000267028809, "y": 13.940000534057617, "dataset": "signal (original)"}, {"x": 5.480000019073486, "y": 13.960000038146973, "dataset": "signal (original)"}, {"x": 5.490000247955322, "y": 13.980000495910645, "dataset": "signal (original)"}, {"x": 5.5, "y": 14.0, "dataset": "signal (original)"}, {"x": 5.510000228881836, "y": 14.020000457763672, "dataset": "signal (original)"}, {"x": 5.519999980926514, "y": 14.039999961853027, "dataset": "signal (original)"}, {"x": 5.53000020980835, "y": 14.0600004196167, "dataset": "signal (original)"}, {"x": 5.539999961853027, "y": 14.079999923706055, "dataset": "signal (original)"}, {"x": 5.550000190734863, "y": 14.100000381469727, "dataset": "signal (original)"}, {"x": 5.559999942779541, "y": 14.119999885559082, "dataset": "signal (original)"}, {"x": 5.570000171661377, "y": 14.140000343322754, "dataset": "signal (original)"}, {"x": 5.579999923706055, "y": 14.15999984741211, "dataset": "signal (original)"}, {"x": 5.590000152587891, "y": 14.180000305175781, "dataset": "signal (original)"}, {"x": 5.599999904632568, "y": 14.199999809265137, "dataset": "signal (original)"}, {"x": 5.610000133514404, "y": 14.220000267028809, "dataset": "signal (original)"}, {"x": 5.619999885559082, "y": 14.239999771118164, "dataset": "signal (original)"}, {"x": 5.630000114440918, "y": 14.260000228881836, "dataset": "signal (original)"}, {"x": 5.639999866485596, "y": 14.279999732971191, "dataset": "signal (original)"}, {"x": 5.650000095367432, "y": 14.300000190734863, "dataset": "signal (original)"}, {"x": 5.659999847412109, "y": 14.319999694824219, "dataset": "signal (original)"}, {"x": 5.670000076293945, "y": 14.34000015258789, "dataset": "signal (original)"}, {"x": 5.679999828338623, "y": 14.359999656677246, "dataset": "signal (original)"}, {"x": 5.690000057220459, "y": 14.380000114440918, "dataset": "signal (original)"}, {"x": 5.699999809265137, "y": 14.399999618530273, "dataset": "signal (original)"}, {"x": 5.710000038146973, "y": 14.420000076293945, "dataset": "signal (original)"}, {"x": 5.71999979019165, "y": 14.4399995803833, "dataset": "signal (original)"}, {"x": 5.730000019073486, "y": 14.460000038146973, "dataset": "signal (original)"}, {"x": 5.739999771118164, "y": 14.479999542236328, "dataset": "signal (original)"}, {"x": 5.75, "y": 14.5, "dataset": "signal (original)"}, {"x": 5.760000228881836, "y": 14.520000457763672, "dataset": "signal (original)"}, {"x": 5.770000457763672, "y": 14.540000915527344, "dataset": "signal (original)"}, {"x": 5.78000020980835, "y": 14.5600004196167, "dataset": "signal (original)"}, {"x": 5.7900004386901855, "y": 14.580000877380371, "dataset": "signal (original)"}, {"x": 5.800000190734863, "y": 14.600000381469727, "dataset": "signal (original)"}, {"x": 5.810000419616699, "y": 14.620000839233398, "dataset": "signal (original)"}, {"x": 5.820000171661377, "y": 14.640000343322754, "dataset": "signal (original)"}, {"x": 5.830000400543213, "y": 14.660000801086426, "dataset": "signal (original)"}, {"x": 5.840000152587891, "y": 14.680000305175781, "dataset": "signal (original)"}, {"x": 5.850000381469727, "y": 14.700000762939453, "dataset": "signal (original)"}, {"x": 5.860000133514404, "y": 14.720000267028809, "dataset": "signal (original)"}, {"x": 5.87000036239624, "y": 14.74000072479248, "dataset": "signal (original)"}, {"x": 5.880000114440918, "y": 14.760000228881836, "dataset": "signal (original)"}, {"x": 5.890000343322754, "y": 14.780000686645508, "dataset": "signal (original)"}, {"x": 5.900000095367432, "y": 14.800000190734863, "dataset": "signal (original)"}, {"x": 5.910000324249268, "y": 14.820000648498535, "dataset": "signal (original)"}, {"x": 5.920000076293945, "y": 14.84000015258789, "dataset": "signal (original)"}, {"x": 5.930000305175781, "y": 14.860000610351562, "dataset": "signal (original)"}, {"x": 5.940000057220459, "y": 14.880000114440918, "dataset": "signal (original)"}, {"x": 5.950000286102295, "y": 14.90000057220459, "dataset": "signal (original)"}, {"x": 5.960000038146973, "y": 14.920000076293945, "dataset": "signal (original)"}, {"x": 5.970000267028809, "y": 14.940000534057617, "dataset": "signal (original)"}, {"x": 5.980000019073486, "y": 14.960000038146973, "dataset": "signal (original)"}, {"x": 5.990000247955322, "y": 14.980000495910645, "dataset": "signal (original)"}, {"x": 6.0, "y": 15.0, "dataset": "signal (original)"}, {"x": 6.010000228881836, "y": 15.020000457763672, "dataset": "signal (original)"}, {"x": 6.019999980926514, "y": 15.039999961853027, "dataset": "signal (original)"}, {"x": 6.03000020980835, "y": 15.0600004196167, "dataset": "signal (original)"}, {"x": 6.039999961853027, "y": 15.079999923706055, "dataset": "signal (original)"}, {"x": 6.050000190734863, "y": 15.100000381469727, "dataset": "signal (original)"}, {"x": 6.059999942779541, "y": 15.119999885559082, "dataset": "signal (original)"}, {"x": 6.070000171661377, "y": 15.140000343322754, "dataset": "signal (original)"}, {"x": 6.079999923706055, "y": 15.15999984741211, "dataset": "signal (original)"}, {"x": 6.090000152587891, "y": 15.180000305175781, "dataset": "signal (original)"}, {"x": 6.099999904632568, "y": 15.199999809265137, "dataset": "signal (original)"}, {"x": 6.110000133514404, "y": 15.220000267028809, "dataset": "signal (original)"}, {"x": 6.119999885559082, "y": 15.239999771118164, "dataset": "signal (original)"}, {"x": 6.130000114440918, "y": 15.260000228881836, "dataset": "signal (original)"}, {"x": 6.139999866485596, "y": 15.279999732971191, "dataset": "signal (original)"}, {"x": 6.150000095367432, "y": 15.300000190734863, "dataset": "signal (original)"}, {"x": 6.159999847412109, "y": 15.319999694824219, "dataset": "signal (original)"}, {"x": 6.170000076293945, "y": 15.34000015258789, "dataset": "signal (original)"}, {"x": 6.179999828338623, "y": 15.359999656677246, "dataset": "signal (original)"}, {"x": 6.190000057220459, "y": 15.380000114440918, "dataset": "signal (original)"}, {"x": 6.199999809265137, "y": 15.399999618530273, "dataset": "signal (original)"}, {"x": 6.210000038146973, "y": 15.420000076293945, "dataset": "signal (original)"}, {"x": 6.21999979019165, "y": 15.4399995803833, "dataset": "signal (original)"}, {"x": 6.230000019073486, "y": 15.460000038146973, "dataset": "signal (original)"}, {"x": 6.239999771118164, "y": 15.479999542236328, "dataset": "signal (original)"}, {"x": 6.25, "y": 15.5, "dataset": "signal (original)"}, {"x": 6.259999752044678, "y": 15.519999504089355, "dataset": "signal (original)"}, {"x": 6.269999980926514, "y": 15.539999961853027, "dataset": "signal (original)"}, {"x": 6.279999732971191, "y": 15.559999465942383, "dataset": "signal (original)"}, {"x": 6.289999961853027, "y": 15.579999923706055, "dataset": "signal (original)"}, {"x": 6.299999713897705, "y": 15.59999942779541, "dataset": "signal (original)"}, {"x": 6.309999942779541, "y": 15.619999885559082, "dataset": "signal (original)"}, {"x": 6.320000171661377, "y": 15.640000343322754, "dataset": "signal (original)"}, {"x": 6.330000400543213, "y": 15.660000801086426, "dataset": "signal (original)"}, {"x": 6.340000152587891, "y": 15.680000305175781, "dataset": "signal (original)"}, {"x": 6.350000381469727, "y": 15.700000762939453, "dataset": "signal (original)"}, {"x": 6.360000133514404, "y": 15.720000267028809, "dataset": "signal (original)"}, {"x": 6.37000036239624, "y": 15.74000072479248, "dataset": "signal (original)"}, {"x": 6.380000114440918, "y": 15.760000228881836, "dataset": "signal (original)"}, {"x": 6.390000343322754, "y": 15.780000686645508, "dataset": "signal (original)"}, {"x": 6.400000095367432, "y": 15.800000190734863, "dataset": "signal (original)"}, {"x": 6.410000324249268, "y": 15.820000648498535, "dataset": "signal (original)"}, {"x": 6.420000076293945, "y": 15.84000015258789, "dataset": "signal (original)"}, {"x": 6.430000305175781, "y": 15.860000610351562, "dataset": "signal (original)"}, {"x": 6.440000057220459, "y": 15.880000114440918, "dataset": "signal (original)"}, {"x": 6.450000286102295, "y": 15.90000057220459, "dataset": "signal (original)"}, {"x": 6.460000038146973, "y": 15.920000076293945, "dataset": "signal (original)"}, {"x": 6.470000267028809, "y": 15.940000534057617, "dataset": "signal (original)"}, {"x": 6.480000019073486, "y": 15.960000038146973, "dataset": "signal (original)"}, {"x": 6.490000247955322, "y": 15.980000495910645, "dataset": "signal (original)"}, {"x": 6.5, "y": 16.0, "dataset": "signal (original)"}, {"x": 6.510000228881836, "y": 16.020000457763672, "dataset": "signal (original)"}, {"x": 6.519999980926514, "y": 16.040000915527344, "dataset": "signal (original)"}, {"x": 6.53000020980835, "y": 16.060001373291016, "dataset": "signal (original)"}, {"x": 6.539999961853027, "y": 16.079999923706055, "dataset": "signal (original)"}, {"x": 6.550000190734863, "y": 16.100000381469727, "dataset": "signal (original)"}, {"x": 6.559999942779541, "y": 16.119998931884766, "dataset": "signal (original)"}, {"x": 6.570000171661377, "y": 16.139999389648438, "dataset": "signal (original)"}, {"x": 6.579999923706055, "y": 16.15999984741211, "dataset": "signal (original)"}, {"x": 6.590000152587891, "y": 16.18000030517578, "dataset": "signal (original)"}, {"x": 6.599999904632568, "y": 16.200000762939453, "dataset": "signal (original)"}, {"x": 6.610000133514404, "y": 16.220001220703125, "dataset": "signal (original)"}, {"x": 6.619999885559082, "y": 16.239999771118164, "dataset": "signal (original)"}, {"x": 6.630000114440918, "y": 16.260000228881836, "dataset": "signal (original)"}, {"x": 6.639999866485596, "y": 16.279998779296875, "dataset": "signal (original)"}, {"x": 6.650000095367432, "y": 16.299999237060547, "dataset": "signal (original)"}, {"x": 6.659999847412109, "y": 16.31999969482422, "dataset": "signal (original)"}, {"x": 6.670000076293945, "y": 16.34000015258789, "dataset": "signal (original)"}, {"x": 6.679999828338623, "y": 16.360000610351562, "dataset": "signal (original)"}, {"x": 6.690000057220459, "y": 16.380001068115234, "dataset": "signal (original)"}, {"x": 6.699999809265137, "y": 16.399999618530273, "dataset": "signal (original)"}, {"x": 6.710000038146973, "y": 16.420000076293945, "dataset": "signal (original)"}, {"x": 6.71999979019165, "y": 16.439998626708984, "dataset": "signal (original)"}, {"x": 6.730000019073486, "y": 16.459999084472656, "dataset": "signal (original)"}, {"x": 6.739999771118164, "y": 16.479999542236328, "dataset": "signal (original)"}, {"x": 6.75, "y": 16.5, "dataset": "signal (original)"}, {"x": 6.759999752044678, "y": 16.520000457763672, "dataset": "signal (original)"}, {"x": 6.769999980926514, "y": 16.540000915527344, "dataset": "signal (original)"}, {"x": 6.779999732971191, "y": 16.559999465942383, "dataset": "signal (original)"}, {"x": 6.789999961853027, "y": 16.579999923706055, "dataset": "signal (original)"}, {"x": 6.800000190734863, "y": 16.600000381469727, "dataset": "signal (original)"}, {"x": 6.810000419616699, "y": 16.6200008392334, "dataset": "signal (original)"}, {"x": 6.820000171661377, "y": 16.639999389648438, "dataset": "signal (original)"}, {"x": 6.830000400543213, "y": 16.65999984741211, "dataset": "signal (original)"}, {"x": 6.840000152587891, "y": 16.68000030517578, "dataset": "signal (original)"}, {"x": 6.850000381469727, "y": 16.700000762939453, "dataset": "signal (original)"}, {"x": 6.860000133514404, "y": 16.720001220703125, "dataset": "signal (original)"}, {"x": 6.87000036239624, "y": 16.740001678466797, "dataset": "signal (original)"}, {"x": 6.880000114440918, "y": 16.760000228881836, "dataset": "signal (original)"}, {"x": 6.890000343322754, "y": 16.780000686645508, "dataset": "signal (original)"}, {"x": 6.900000095367432, "y": 16.799999237060547, "dataset": "signal (original)"}, {"x": 6.910000324249268, "y": 16.81999969482422, "dataset": "signal (original)"}, {"x": 6.920000076293945, "y": 16.84000015258789, "dataset": "signal (original)"}, {"x": 6.930000305175781, "y": 16.860000610351562, "dataset": "signal (original)"}, {"x": 6.940000057220459, "y": 16.880001068115234, "dataset": "signal (original)"}, {"x": 6.950000286102295, "y": 16.900001525878906, "dataset": "signal (original)"}, {"x": 6.960000038146973, "y": 16.920000076293945, "dataset": "signal (original)"}, {"x": 6.970000267028809, "y": 16.940000534057617, "dataset": "signal (original)"}, {"x": 6.980000019073486, "y": 16.959999084472656, "dataset": "signal (original)"}, {"x": 6.990000247955322, "y": 16.979999542236328, "dataset": "signal (original)"}, {"x": 7.0, "y": 17.0, "dataset": "signal (original)"}, {"x": 7.010000228881836, "y": 17.020000457763672, "dataset": "signal (original)"}, {"x": 7.019999980926514, "y": 17.040000915527344, "dataset": "signal (original)"}, {"x": 7.03000020980835, "y": 17.060001373291016, "dataset": "signal (original)"}, {"x": 7.039999961853027, "y": 17.079999923706055, "dataset": "signal (original)"}, {"x": 7.050000190734863, "y": 17.100000381469727, "dataset": "signal (original)"}, {"x": 7.059999942779541, "y": 17.119998931884766, "dataset": "signal (original)"}, {"x": 7.070000171661377, "y": 17.139999389648438, "dataset": "signal (original)"}, {"x": 7.079999923706055, "y": 17.15999984741211, "dataset": "signal (original)"}, {"x": 7.090000152587891, "y": 17.18000030517578, "dataset": "signal (original)"}, {"x": 7.099999904632568, "y": 17.200000762939453, "dataset": "signal (original)"}, {"x": 7.110000133514404, "y": 17.220001220703125, "dataset": "signal (original)"}, {"x": 7.119999885559082, "y": 17.239999771118164, "dataset": "signal (original)"}, {"x": 7.130000114440918, "y": 17.260000228881836, "dataset": "signal (original)"}, {"x": 7.139999866485596, "y": 17.279998779296875, "dataset": "signal (original)"}, {"x": 7.150000095367432, "y": 17.299999237060547, "dataset": "signal (original)"}, {"x": 7.159999847412109, "y": 17.31999969482422, "dataset": "signal (original)"}, {"x": 7.170000076293945, "y": 17.34000015258789, "dataset": "signal (original)"}, {"x": 7.179999828338623, "y": 17.360000610351562, "dataset": "signal (original)"}, {"x": 7.190000057220459, "y": 17.380001068115234, "dataset": "signal (original)"}, {"x": 7.199999809265137, "y": 17.399999618530273, "dataset": "signal (original)"}, {"x": 7.210000038146973, "y": 17.420000076293945, "dataset": "signal (original)"}, {"x": 7.21999979019165, "y": 17.439998626708984, "dataset": "signal (original)"}, {"x": 7.230000019073486, "y": 17.459999084472656, "dataset": "signal (original)"}, {"x": 7.239999771118164, "y": 17.479999542236328, "dataset": "signal (original)"}, {"x": 7.25, "y": 17.5, "dataset": "signal (original)"}, {"x": 7.259999752044678, "y": 17.520000457763672, "dataset": "signal (original)"}, {"x": 7.269999980926514, "y": 17.540000915527344, "dataset": "signal (original)"}, {"x": 7.28000020980835, "y": 17.560001373291016, "dataset": "signal (original)"}, {"x": 7.2900004386901855, "y": 17.580001831054688, "dataset": "signal (original)"}, {"x": 7.300000190734863, "y": 17.600000381469727, "dataset": "signal (original)"}, {"x": 7.310000419616699, "y": 17.6200008392334, "dataset": "signal (original)"}, {"x": 7.320000171661377, "y": 17.639999389648438, "dataset": "signal (original)"}, {"x": 7.330000400543213, "y": 17.65999984741211, "dataset": "signal (original)"}, {"x": 7.340000152587891, "y": 17.68000030517578, "dataset": "signal (original)"}, {"x": 7.350000381469727, "y": 17.700000762939453, "dataset": "signal (original)"}, {"x": 7.360000133514404, "y": 17.720001220703125, "dataset": "signal (original)"}, {"x": 7.37000036239624, "y": 17.740001678466797, "dataset": "signal (original)"}, {"x": 7.380000114440918, "y": 17.760000228881836, "dataset": "signal (original)"}, {"x": 7.390000343322754, "y": 17.780000686645508, "dataset": "signal (original)"}, {"x": 7.400000095367432, "y": 17.799999237060547, "dataset": "signal (original)"}, {"x": 7.410000324249268, "y": 17.81999969482422, "dataset": "signal (original)"}, {"x": 7.420000076293945, "y": 17.84000015258789, "dataset": "signal (original)"}, {"x": 7.430000305175781, "y": 17.860000610351562, "dataset": "signal (original)"}, {"x": 7.440000057220459, "y": 17.880001068115234, "dataset": "signal (original)"}, {"x": 7.450000286102295, "y": 17.900001525878906, "dataset": "signal (original)"}, {"x": 7.460000038146973, "y": 17.920000076293945, "dataset": "signal (original)"}, {"x": 7.470000267028809, "y": 17.940000534057617, "dataset": "signal (original)"}, {"x": 7.480000019073486, "y": 17.959999084472656, "dataset": "signal (original)"}, {"x": 7.490000247955322, "y": 17.979999542236328, "dataset": "signal (original)"}, {"x": 7.5, "y": 18.0, "dataset": "signal (original)"}, {"x": 7.510000228881836, "y": 18.020000457763672, "dataset": "signal (original)"}, {"x": 7.519999980926514, "y": 18.040000915527344, "dataset": "signal (original)"}, {"x": 7.53000020980835, "y": 18.060001373291016, "dataset": "signal (original)"}, {"x": 7.539999961853027, "y": 18.079999923706055, "dataset": "signal (original)"}, {"x": 7.550000190734863, "y": 18.100000381469727, "dataset": "signal (original)"}, {"x": 7.559999942779541, "y": 18.119998931884766, "dataset": "signal (original)"}, {"x": 7.570000171661377, "y": 18.139999389648438, "dataset": "signal (original)"}, {"x": 7.579999923706055, "y": 18.15999984741211, "dataset": "signal (original)"}, {"x": 7.590000152587891, "y": 18.18000030517578, "dataset": "signal (original)"}, {"x": 7.599999904632568, "y": 18.200000762939453, "dataset": "signal (original)"}, {"x": 7.610000133514404, "y": 18.220001220703125, "dataset": "signal (original)"}, {"x": 7.619999885559082, "y": 18.239999771118164, "dataset": "signal (original)"}, {"x": 7.630000114440918, "y": 18.260000228881836, "dataset": "signal (original)"}, {"x": 7.639999866485596, "y": 18.279998779296875, "dataset": "signal (original)"}, {"x": 7.650000095367432, "y": 18.299999237060547, "dataset": "signal (original)"}, {"x": 7.659999847412109, "y": 18.31999969482422, "dataset": "signal (original)"}, {"x": 7.670000076293945, "y": 18.34000015258789, "dataset": "signal (original)"}, {"x": 7.679999828338623, "y": 18.360000610351562, "dataset": "signal (original)"}, {"x": 7.690000057220459, "y": 18.380001068115234, "dataset": "signal (original)"}, {"x": 7.699999809265137, "y": 18.399999618530273, "dataset": "signal (original)"}, {"x": 7.710000038146973, "y": 18.420000076293945, "dataset": "signal (original)"}, {"x": 7.71999979019165, "y": 18.439998626708984, "dataset": "signal (original)"}, {"x": 7.730000019073486, "y": 18.459999084472656, "dataset": "signal (original)"}, {"x": 7.739999771118164, "y": 18.479999542236328, "dataset": "signal (original)"}, {"x": 7.75, "y": 18.5, "dataset": "signal (original)"}, {"x": 7.760000228881836, "y": 18.520000457763672, "dataset": "signal (original)"}, {"x": 7.770000457763672, "y": 18.540000915527344, "dataset": "signal (original)"}, {"x": 7.78000020980835, "y": 18.560001373291016, "dataset": "signal (original)"}, {"x": 7.7900004386901855, "y": 18.580001831054688, "dataset": "signal (original)"}, {"x": 7.800000190734863, "y": 18.600000381469727, "dataset": "signal (original)"}, {"x": 7.810000419616699, "y": 18.6200008392334, "dataset": "signal (original)"}, {"x": 7.820000171661377, "y": 18.639999389648438, "dataset": "signal (original)"}, {"x": 7.830000400543213, "y": 18.65999984741211, "dataset": "signal (original)"}, {"x": 7.840000152587891, "y": 18.68000030517578, "dataset": "signal (original)"}, {"x": 7.850000381469727, "y": 18.700000762939453, "dataset": "signal (original)"}, {"x": 7.860000133514404, "y": 18.720001220703125, "dataset": "signal (original)"}, {"x": 7.87000036239624, "y": 18.740001678466797, "dataset": "signal (original)"}, {"x": 7.880000114440918, "y": 18.760000228881836, "dataset": "signal (original)"}, {"x": 7.890000343322754, "y": 18.780000686645508, "dataset": "signal (original)"}, {"x": 7.900000095367432, "y": 18.799999237060547, "dataset": "signal (original)"}, {"x": 7.910000324249268, "y": 18.81999969482422, "dataset": "signal (original)"}, {"x": 7.920000076293945, "y": 18.84000015258789, "dataset": "signal (original)"}, {"x": 7.930000305175781, "y": 18.860000610351562, "dataset": "signal (original)"}, {"x": 7.940000057220459, "y": 18.880001068115234, "dataset": "signal (original)"}, {"x": 7.950000286102295, "y": 18.900001525878906, "dataset": "signal (original)"}, {"x": 7.960000038146973, "y": 18.920000076293945, "dataset": "signal (original)"}, {"x": 7.970000267028809, "y": 18.940000534057617, "dataset": "signal (original)"}, {"x": 7.980000019073486, "y": 18.959999084472656, "dataset": "signal (original)"}, {"x": 7.990000247955322, "y": 18.979999542236328, "dataset": "signal (original)"}, {"x": 8.0, "y": 19.0, "dataset": "signal (original)"}, {"x": 8.010000228881836, "y": 19.020000457763672, "dataset": "signal (original)"}, {"x": 8.020000457763672, "y": 19.040000915527344, "dataset": "signal (original)"}, {"x": 8.029999732971191, "y": 19.059999465942383, "dataset": "signal (original)"}, {"x": 8.039999961853027, "y": 19.079999923706055, "dataset": "signal (original)"}, {"x": 8.050000190734863, "y": 19.100000381469727, "dataset": "signal (original)"}, {"x": 8.0600004196167, "y": 19.1200008392334, "dataset": "signal (original)"}, {"x": 8.069999694824219, "y": 19.139999389648438, "dataset": "signal (original)"}, {"x": 8.079999923706055, "y": 19.15999984741211, "dataset": "signal (original)"}, {"x": 8.09000015258789, "y": 19.18000030517578, "dataset": "signal (original)"}, {"x": 8.100000381469727, "y": 19.200000762939453, "dataset": "signal (original)"}, {"x": 8.109999656677246, "y": 19.219999313354492, "dataset": "signal (original)"}, {"x": 8.119999885559082, "y": 19.239999771118164, "dataset": "signal (original)"}, {"x": 8.130000114440918, "y": 19.260000228881836, "dataset": "signal (original)"}, {"x": 8.140000343322754, "y": 19.280000686645508, "dataset": "signal (original)"}, {"x": 8.149999618530273, "y": 19.299999237060547, "dataset": "signal (original)"}, {"x": 8.15999984741211, "y": 19.31999969482422, "dataset": "signal (original)"}, {"x": 8.170000076293945, "y": 19.34000015258789, "dataset": "signal (original)"}, {"x": 8.180000305175781, "y": 19.360000610351562, "dataset": "signal (original)"}, {"x": 8.1899995803833, "y": 19.3799991607666, "dataset": "signal (original)"}, {"x": 8.199999809265137, "y": 19.399999618530273, "dataset": "signal (original)"}, {"x": 8.210000038146973, "y": 19.420000076293945, "dataset": "signal (original)"}, {"x": 8.220000267028809, "y": 19.440000534057617, "dataset": "signal (original)"}, {"x": 8.229999542236328, "y": 19.459999084472656, "dataset": "signal (original)"}, {"x": 8.239999771118164, "y": 19.479999542236328, "dataset": "signal (original)"}, {"x": 8.25, "y": 19.5, "dataset": "signal (original)"}, {"x": 8.260000228881836, "y": 19.520000457763672, "dataset": "signal (original)"}, {"x": 8.269999504089355, "y": 19.53999900817871, "dataset": "signal (original)"}, {"x": 8.279999732971191, "y": 19.559999465942383, "dataset": "signal (original)"}, {"x": 8.289999961853027, "y": 19.579999923706055, "dataset": "signal (original)"}, {"x": 8.300000190734863, "y": 19.600000381469727, "dataset": "signal (original)"}, {"x": 8.309999465942383, "y": 19.619998931884766, "dataset": "signal (original)"}, {"x": 8.319999694824219, "y": 19.639999389648438, "dataset": "signal (original)"}, {"x": 8.329999923706055, "y": 19.65999984741211, "dataset": "signal (original)"}, {"x": 8.34000015258789, "y": 19.68000030517578, "dataset": "signal (original)"}, {"x": 8.34999942779541, "y": 19.69999885559082, "dataset": "signal (original)"}, {"x": 8.359999656677246, "y": 19.719999313354492, "dataset": "signal (original)"}, {"x": 8.369999885559082, "y": 19.739999771118164, "dataset": "signal (original)"}, {"x": 8.380000114440918, "y": 19.760000228881836, "dataset": "signal (original)"}, {"x": 8.389999389648438, "y": 19.779998779296875, "dataset": "signal (original)"}, {"x": 8.399999618530273, "y": 19.799999237060547, "dataset": "signal (original)"}, {"x": 8.40999984741211, "y": 19.81999969482422, "dataset": "signal (original)"}, {"x": 8.420000076293945, "y": 19.84000015258789, "dataset": "signal (original)"}, {"x": 8.429999351501465, "y": 19.85999870300293, "dataset": "signal (original)"}, {"x": 8.4399995803833, "y": 19.8799991607666, "dataset": "signal (original)"}, {"x": 8.449999809265137, "y": 19.899999618530273, "dataset": "signal (original)"}, {"x": 8.460000038146973, "y": 19.920000076293945, "dataset": "signal (original)"}, {"x": 8.469999313354492, "y": 19.939998626708984, "dataset": "signal (original)"}, {"x": 8.479999542236328, "y": 19.959999084472656, "dataset": "signal (original)"}, {"x": 8.489999771118164, "y": 19.979999542236328, "dataset": "signal (original)"}, {"x": 8.5, "y": 20.0, "dataset": "signal (original)"}, {"x": 8.50999927520752, "y": 20.01999855041504, "dataset": "signal (original)"}, {"x": 8.519999504089355, "y": 20.03999900817871, "dataset": "signal (original)"}, {"x": 8.529999732971191, "y": 20.059999465942383, "dataset": "signal (original)"}, {"x": 8.539999961853027, "y": 20.079999923706055, "dataset": "signal (original)"}, {"x": 8.549999237060547, "y": 20.099998474121094, "dataset": "signal (original)"}, {"x": 8.5600004196167, "y": 20.1200008392334, "dataset": "signal (original)"}, {"x": 8.570000648498535, "y": 20.14000129699707, "dataset": "signal (original)"}, {"x": 8.580000877380371, "y": 20.160001754760742, "dataset": "signal (original)"}, {"x": 8.59000015258789, "y": 20.18000030517578, "dataset": "signal (original)"}, {"x": 8.600000381469727, "y": 20.200000762939453, "dataset": "signal (original)"}, {"x": 8.610000610351562, "y": 20.220001220703125, "dataset": "signal (original)"}, {"x": 8.620000839233398, "y": 20.240001678466797, "dataset": "signal (original)"}, {"x": 8.630000114440918, "y": 20.260000228881836, "dataset": "signal (original)"}, {"x": 8.640000343322754, "y": 20.280000686645508, "dataset": "signal (original)"}, {"x": 8.65000057220459, "y": 20.30000114440918, "dataset": "signal (original)"}, {"x": 8.660000801086426, "y": 20.32000160217285, "dataset": "signal (original)"}, {"x": 8.670000076293945, "y": 20.34000015258789, "dataset": "signal (original)"}, {"x": 8.680000305175781, "y": 20.360000610351562, "dataset": "signal (original)"}, {"x": 8.690000534057617, "y": 20.380001068115234, "dataset": "signal (original)"}, {"x": 8.700000762939453, "y": 20.400001525878906, "dataset": "signal (original)"}, {"x": 8.710000038146973, "y": 20.420000076293945, "dataset": "signal (original)"}, {"x": 8.720000267028809, "y": 20.440000534057617, "dataset": "signal (original)"}, {"x": 8.730000495910645, "y": 20.46000099182129, "dataset": "signal (original)"}, {"x": 8.74000072479248, "y": 20.48000144958496, "dataset": "signal (original)"}, {"x": 8.75, "y": 20.5, "dataset": "signal (original)"}, {"x": 8.760000228881836, "y": 20.520000457763672, "dataset": "signal (original)"}, {"x": 8.770000457763672, "y": 20.540000915527344, "dataset": "signal (original)"}, {"x": 8.780000686645508, "y": 20.560001373291016, "dataset": "signal (original)"}, {"x": 8.789999961853027, "y": 20.579999923706055, "dataset": "signal (original)"}, {"x": 8.800000190734863, "y": 20.600000381469727, "dataset": "signal (original)"}, {"x": 8.8100004196167, "y": 20.6200008392334, "dataset": "signal (original)"}, {"x": 8.820000648498535, "y": 20.64000129699707, "dataset": "signal (original)"}, {"x": 8.829999923706055, "y": 20.65999984741211, "dataset": "signal (original)"}, {"x": 8.84000015258789, "y": 20.68000030517578, "dataset": "signal (original)"}, {"x": 8.850000381469727, "y": 20.700000762939453, "dataset": "signal (original)"}, {"x": 8.860000610351562, "y": 20.720001220703125, "dataset": "signal (original)"}, {"x": 8.869999885559082, "y": 20.739999771118164, "dataset": "signal (original)"}, {"x": 8.880000114440918, "y": 20.760000228881836, "dataset": "signal (original)"}, {"x": 8.890000343322754, "y": 20.780000686645508, "dataset": "signal (original)"}, {"x": 8.90000057220459, "y": 20.80000114440918, "dataset": "signal (original)"}, {"x": 8.90999984741211, "y": 20.81999969482422, "dataset": "signal (original)"}, {"x": 8.920000076293945, "y": 20.84000015258789, "dataset": "signal (original)"}, {"x": 8.930000305175781, "y": 20.860000610351562, "dataset": "signal (original)"}, {"x": 8.940000534057617, "y": 20.880001068115234, "dataset": "signal (original)"}, {"x": 8.949999809265137, "y": 20.899999618530273, "dataset": "signal (original)"}, {"x": 8.960000038146973, "y": 20.920000076293945, "dataset": "signal (original)"}, {"x": 8.970000267028809, "y": 20.940000534057617, "dataset": "signal (original)"}, {"x": 8.980000495910645, "y": 20.96000099182129, "dataset": "signal (original)"}, {"x": 8.989999771118164, "y": 20.979999542236328, "dataset": "signal (original)"}, {"x": 9.0, "y": 21.0, "dataset": "signal (original)"}, {"x": 9.010000228881836, "y": 21.020000457763672, "dataset": "signal (original)"}, {"x": 9.020000457763672, "y": 21.040000915527344, "dataset": "signal (original)"}, {"x": 9.029999732971191, "y": 21.059999465942383, "dataset": "signal (original)"}, {"x": 9.039999961853027, "y": 21.079999923706055, "dataset": "signal (original)"}, {"x": 9.050000190734863, "y": 21.100000381469727, "dataset": "signal (original)"}, {"x": 9.0600004196167, "y": 21.1200008392334, "dataset": "signal (original)"}, {"x": 9.069999694824219, "y": 21.139999389648438, "dataset": "signal (original)"}, {"x": 9.079999923706055, "y": 21.15999984741211, "dataset": "signal (original)"}, {"x": 9.09000015258789, "y": 21.18000030517578, "dataset": "signal (original)"}, {"x": 9.100000381469727, "y": 21.200000762939453, "dataset": "signal (original)"}, {"x": 9.109999656677246, "y": 21.219999313354492, "dataset": "signal (original)"}, {"x": 9.119999885559082, "y": 21.239999771118164, "dataset": "signal (original)"}, {"x": 9.130000114440918, "y": 21.260000228881836, "dataset": "signal (original)"}, {"x": 9.140000343322754, "y": 21.280000686645508, "dataset": "signal (original)"}, {"x": 9.149999618530273, "y": 21.299999237060547, "dataset": "signal (original)"}, {"x": 9.15999984741211, "y": 21.31999969482422, "dataset": "signal (original)"}, {"x": 9.170000076293945, "y": 21.34000015258789, "dataset": "signal (original)"}, {"x": 9.180000305175781, "y": 21.360000610351562, "dataset": "signal (original)"}, {"x": 9.1899995803833, "y": 21.3799991607666, "dataset": "signal (original)"}, {"x": 9.199999809265137, "y": 21.399999618530273, "dataset": "signal (original)"}, {"x": 9.210000038146973, "y": 21.420000076293945, "dataset": "signal (original)"}, {"x": 9.220000267028809, "y": 21.440000534057617, "dataset": "signal (original)"}, {"x": 9.229999542236328, "y": 21.459999084472656, "dataset": "signal (original)"}, {"x": 9.239999771118164, "y": 21.479999542236328, "dataset": "signal (original)"}, {"x": 9.25, "y": 21.5, "dataset": "signal (original)"}, {"x": 9.260000228881836, "y": 21.520000457763672, "dataset": "signal (original)"}, {"x": 9.269999504089355, "y": 21.53999900817871, "dataset": "signal (original)"}, {"x": 9.279999732971191, "y": 21.559999465942383, "dataset": "signal (original)"}, {"x": 9.289999961853027, "y": 21.579999923706055, "dataset": "signal (original)"}, {"x": 9.300000190734863, "y": 21.600000381469727, "dataset": "signal (original)"}, {"x": 9.309999465942383, "y": 21.619998931884766, "dataset": "signal (original)"}, {"x": 9.319999694824219, "y": 21.639999389648438, "dataset": "signal (original)"}, {"x": 9.329999923706055, "y": 21.65999984741211, "dataset": "signal (original)"}, {"x": 9.34000015258789, "y": 21.68000030517578, "dataset": "signal (original)"}, {"x": 9.34999942779541, "y": 21.69999885559082, "dataset": "signal (original)"}, {"x": 9.359999656677246, "y": 21.719999313354492, "dataset": "signal (original)"}, {"x": 9.369999885559082, "y": 21.739999771118164, "dataset": "signal (original)"}, {"x": 9.380000114440918, "y": 21.760000228881836, "dataset": "signal (original)"}, {"x": 9.389999389648438, "y": 21.779998779296875, "dataset": "signal (original)"}, {"x": 9.399999618530273, "y": 21.799999237060547, "dataset": "signal (original)"}, {"x": 9.40999984741211, "y": 21.81999969482422, "dataset": "signal (original)"}, {"x": 9.420000076293945, "y": 21.84000015258789, "dataset": "signal (original)"}, {"x": 9.429999351501465, "y": 21.85999870300293, "dataset": "signal (original)"}, {"x": 9.4399995803833, "y": 21.8799991607666, "dataset": "signal (original)"}, {"x": 9.449999809265137, "y": 21.899999618530273, "dataset": "signal (original)"}, {"x": 9.460000038146973, "y": 21.920000076293945, "dataset": "signal (original)"}, {"x": 9.469999313354492, "y": 21.939998626708984, "dataset": "signal (original)"}, {"x": 9.479999542236328, "y": 21.959999084472656, "dataset": "signal (original)"}, {"x": 9.489999771118164, "y": 21.979999542236328, "dataset": "signal (original)"}, {"x": 9.5, "y": 22.0, "dataset": "signal (original)"}, {"x": 9.50999927520752, "y": 22.01999855041504, "dataset": "signal (original)"}, {"x": 9.520000457763672, "y": 22.040000915527344, "dataset": "signal (original)"}, {"x": 9.530000686645508, "y": 22.060001373291016, "dataset": "signal (original)"}, {"x": 9.540000915527344, "y": 22.080001831054688, "dataset": "signal (original)"}, {"x": 9.550000190734863, "y": 22.100000381469727, "dataset": "signal (original)"}, {"x": 9.5600004196167, "y": 22.1200008392334, "dataset": "signal (original)"}, {"x": 9.570000648498535, "y": 22.14000129699707, "dataset": "signal (original)"}, {"x": 9.580000877380371, "y": 22.160001754760742, "dataset": "signal (original)"}, {"x": 9.59000015258789, "y": 22.18000030517578, "dataset": "signal (original)"}, {"x": 9.600000381469727, "y": 22.200000762939453, "dataset": "signal (original)"}, {"x": 9.610000610351562, "y": 22.220001220703125, "dataset": "signal (original)"}, {"x": 9.620000839233398, "y": 22.240001678466797, "dataset": "signal (original)"}, {"x": 9.630000114440918, "y": 22.260000228881836, "dataset": "signal (original)"}, {"x": 9.640000343322754, "y": 22.280000686645508, "dataset": "signal (original)"}, {"x": 9.65000057220459, "y": 22.30000114440918, "dataset": "signal (original)"}, {"x": 9.660000801086426, "y": 22.32000160217285, "dataset": "signal (original)"}, {"x": 9.670000076293945, "y": 22.34000015258789, "dataset": "signal (original)"}, {"x": 9.680000305175781, "y": 22.360000610351562, "dataset": "signal (original)"}, {"x": 9.690000534057617, "y": 22.380001068115234, "dataset": "signal (original)"}, {"x": 9.700000762939453, "y": 22.400001525878906, "dataset": "signal (original)"}, {"x": 9.710000038146973, "y": 22.420000076293945, "dataset": "signal (original)"}, {"x": 9.720000267028809, "y": 22.440000534057617, "dataset": "signal (original)"}, {"x": 9.730000495910645, "y": 22.46000099182129, "dataset": "signal (original)"}, {"x": 9.74000072479248, "y": 22.48000144958496, "dataset": "signal (original)"}, {"x": 9.75, "y": 22.5, "dataset": "signal (original)"}, {"x": 9.760000228881836, "y": 22.520000457763672, "dataset": "signal (original)"}, {"x": 9.770000457763672, "y": 22.540000915527344, "dataset": "signal (original)"}, {"x": 9.780000686645508, "y": 22.560001373291016, "dataset": "signal (original)"}, {"x": 9.789999961853027, "y": 22.579999923706055, "dataset": "signal (original)"}, {"x": 9.800000190734863, "y": 22.600000381469727, "dataset": "signal (original)"}, {"x": 9.8100004196167, "y": 22.6200008392334, "dataset": "signal (original)"}, {"x": 9.820000648498535, "y": 22.64000129699707, "dataset": "signal (original)"}, {"x": 9.829999923706055, "y": 22.65999984741211, "dataset": "signal (original)"}, {"x": 9.84000015258789, "y": 22.68000030517578, "dataset": "signal (original)"}, {"x": 9.850000381469727, "y": 22.700000762939453, "dataset": "signal (original)"}, {"x": 9.860000610351562, "y": 22.720001220703125, "dataset": "signal (original)"}, {"x": 9.869999885559082, "y": 22.739999771118164, "dataset": "signal (original)"}, {"x": 9.880000114440918, "y": 22.760000228881836, "dataset": "signal (original)"}, {"x": 9.890000343322754, "y": 22.780000686645508, "dataset": "signal (original)"}, {"x": 9.90000057220459, "y": 22.80000114440918, "dataset": "signal (original)"}, {"x": 9.90999984741211, "y": 22.81999969482422, "dataset": "signal (original)"}, {"x": 9.920000076293945, "y": 22.84000015258789, "dataset": "signal (original)"}, {"x": 9.930000305175781, "y": 22.860000610351562, "dataset": "signal (original)"}, {"x": 9.9399995803833, "y": 22.8799991607666, "dataset": "signal (original)"}, {"x": 9.949999809265137, "y": 22.899999618530273, "dataset": "signal (original)"}, {"x": 9.960000038146973, "y": 22.920000076293945, "dataset": "signal (original)"}, {"x": 9.970000267028809, "y": 22.940000534057617, "dataset": "signal (original)"}, {"x": 9.979999542236328, "y": 22.959999084472656, "dataset": "signal (original)"}, {"x": 9.989999771118164, "y": 22.979999542236328, "dataset": "signal (original)"}, {"x": 0.0, "y": 2.3582053184509277, "dataset": "y"}, {"x": 0.009999999776482582, "y": 2.126399040222168, "dataset": "y"}, {"x": 0.019999999552965164, "y": 4.833797454833984, "dataset": "y"}, {"x": 0.029999999329447746, "y": 2.435218334197998, "dataset": "y"}, {"x": 0.03999999910593033, "y": 3.1051485538482666, "dataset": "y"}, {"x": 0.04999999701976776, "y": 3.5899462699890137, "dataset": "y"}, {"x": 0.05999999865889549, "y": 2.379991054534912, "dataset": "y"}, {"x": 0.07000000029802322, "y": 2.9007837772369385, "dataset": "y"}, {"x": 0.07999999821186066, "y": 1.8602104187011719, "dataset": "y"}, {"x": 0.08999999612569809, "y": 2.4931318759918213, "dataset": "y"}, {"x": 0.09999999403953552, "y": 4.269151210784912, "dataset": "y"}, {"x": 0.10999999940395355, "y": 4.13975715637207, "dataset": "y"}, {"x": 0.11999999731779099, "y": 1.9316859245300293, "dataset": "y"}, {"x": 0.12999999523162842, "y": 3.0963134765625, "dataset": "y"}, {"x": 0.14000000059604645, "y": 2.415133476257324, "dataset": "y"}, {"x": 0.14999999105930328, "y": 4.476778507232666, "dataset": "y"}, {"x": 0.1599999964237213, "y": 2.93165922164917, "dataset": "y"}, {"x": 0.17000000178813934, "y": 2.564279556274414, "dataset": "y"}, {"x": 0.17999999225139618, "y": 3.0372540950775146, "dataset": "y"}, {"x": 0.1899999976158142, "y": 3.149121046066284, "dataset": "y"}, {"x": 0.19999998807907104, "y": 3.005096435546875, "dataset": "y"}, {"x": 0.20999999344348907, "y": 5.053357124328613, "dataset": "y"}, {"x": 0.2199999988079071, "y": 3.3505935668945312, "dataset": "y"}, {"x": 0.22999998927116394, "y": 4.399357795715332, "dataset": "y"}, {"x": 0.23999999463558197, "y": 4.215701103210449, "dataset": "y"}, {"x": 0.25, "y": 4.125744819641113, "dataset": "y"}, {"x": 0.25999999046325684, "y": 3.8150861263275146, "dataset": "y"}, {"x": 0.26999998092651367, "y": 3.129537582397461, "dataset": "y"}, {"x": 0.2800000011920929, "y": 1.8341962099075317, "dataset": "y"}, {"x": 0.28999999165534973, "y": 3.327755928039551, "dataset": "y"}, {"x": 0.29999998211860657, "y": 4.129769325256348, "dataset": "y"}, {"x": 0.3100000023841858, "y": 3.966763734817505, "dataset": "y"}, {"x": 0.3199999928474426, "y": 2.949415922164917, "dataset": "y"}, {"x": 0.32999998331069946, "y": 5.2311835289001465, "dataset": "y"}, {"x": 0.3400000035762787, "y": 3.785811424255371, "dataset": "y"}, {"x": 0.3499999940395355, "y": 4.051944732666016, "dataset": "y"}, {"x": 0.35999998450279236, "y": 3.2939016819000244, "dataset": "y"}, {"x": 0.3700000047683716, "y": 2.18172550201416, "dataset": "y"}, {"x": 0.3799999952316284, "y": 3.774009943008423, "dataset": "y"}, {"x": 0.38999998569488525, "y": 4.648004531860352, "dataset": "y"}, {"x": 0.4000000059604645, "y": 4.121216773986816, "dataset": "y"}, {"x": 0.4099999964237213, "y": 5.212418079376221, "dataset": "y"}, {"x": 0.42000001668930054, "y": 3.207392692565918, "dataset": "y"}, {"x": 0.4300000071525574, "y": 3.2714595794677734, "dataset": "y"}, {"x": 0.4399999976158142, "y": 5.366969585418701, "dataset": "y"}, {"x": 0.45000001788139343, "y": 3.809403657913208, "dataset": "y"}, {"x": 0.46000000834465027, "y": 3.7957046031951904, "dataset": "y"}, {"x": 0.4699999988079071, "y": 4.369316101074219, "dataset": "y"}, {"x": 0.47999998927116394, "y": 3.3810229301452637, "dataset": "y"}, {"x": 0.4899999797344208, "y": 2.023557662963867, "dataset": "y"}, {"x": 0.5, "y": 6.388025283813477, "dataset": "y"}, {"x": 0.5099999904632568, "y": 2.9270339012145996, "dataset": "y"}, {"x": 0.5199999809265137, "y": 3.4783639907836914, "dataset": "y"}, {"x": 0.5299999713897705, "y": 4.341109752655029, "dataset": "y"}, {"x": 0.5399999618530273, "y": 3.4996132850646973, "dataset": "y"}, {"x": 0.550000011920929, "y": 4.940781593322754, "dataset": "y"}, {"x": 0.5600000023841858, "y": 3.8122570514678955, "dataset": "y"}, {"x": 0.5699999928474426, "y": 4.896683692932129, "dataset": "y"}, {"x": 0.5799999833106995, "y": 3.990549325942993, "dataset": "y"}, {"x": 0.5899999737739563, "y": 3.409188747406006, "dataset": "y"}, {"x": 0.6000000238418579, "y": 3.3809814453125, "dataset": "y"}, {"x": 0.6100000143051147, "y": 5.0215349197387695, "dataset": "y"}, {"x": 0.6200000047683716, "y": 4.067300319671631, "dataset": "y"}, {"x": 0.6299999952316284, "y": 4.690770626068115, "dataset": "y"}, {"x": 0.6399999856948853, "y": 3.193521499633789, "dataset": "y"}, {"x": 0.6499999761581421, "y": 3.54874849319458, "dataset": "y"}, {"x": 0.6599999666213989, "y": 5.75016975402832, "dataset": "y"}, {"x": 0.6699999570846558, "y": 4.897765636444092, "dataset": "y"}, {"x": 0.6800000071525574, "y": 3.5316667556762695, "dataset": "y"}, {"x": 0.6899999976158142, "y": 4.4810872077941895, "dataset": "y"}, {"x": 0.699999988079071, "y": 4.051520347595215, "dataset": "y"}, {"x": 0.7099999785423279, "y": 4.988503456115723, "dataset": "y"}, {"x": 0.7200000286102295, "y": 4.432309627532959, "dataset": "y"}, {"x": 0.7300000190734863, "y": 5.204319953918457, "dataset": "y"}, {"x": 0.7400000095367432, "y": 4.768320083618164, "dataset": "y"}, {"x": 0.75, "y": 3.321847438812256, "dataset": "y"}, {"x": 0.7600000500679016, "y": 4.4383392333984375, "dataset": "y"}, {"x": 0.7700000405311584, "y": 2.348461389541626, "dataset": "y"}, {"x": 0.7800000309944153, "y": 4.7172112464904785, "dataset": "y"}, {"x": 0.7900000214576721, "y": 5.161652565002441, "dataset": "y"}, {"x": 0.800000011920929, "y": 5.407167434692383, "dataset": "y"}, {"x": 0.8100000023841858, "y": 4.450127601623535, "dataset": "y"}, {"x": 0.8199999928474426, "y": 3.749988317489624, "dataset": "y"}, {"x": 0.8299999833106995, "y": 4.973912239074707, "dataset": "y"}, {"x": 0.8400000333786011, "y": 5.5894694328308105, "dataset": "y"}, {"x": 0.8500000238418579, "y": 5.294144630432129, "dataset": "y"}, {"x": 0.8600000143051147, "y": 5.366301536560059, "dataset": "y"}, {"x": 0.8700000047683716, "y": 6.001091003417969, "dataset": "y"}, {"x": 0.8799999952316284, "y": 5.9070143699646, "dataset": "y"}, {"x": 0.8899999856948853, "y": 5.322600841522217, "dataset": "y"}, {"x": 0.8999999761581421, "y": 1.5124907493591309, "dataset": "y"}, {"x": 0.9099999666213989, "y": 4.202919006347656, "dataset": "y"}, {"x": 0.9200000166893005, "y": 3.191021203994751, "dataset": "y"}, {"x": 0.9300000071525574, "y": 4.726576805114746, "dataset": "y"}, {"x": 0.9399999976158142, "y": 4.4999003410339355, "dataset": "y"}, {"x": 0.949999988079071, "y": 4.395288467407227, "dataset": "y"}, {"x": 0.9599999785423279, "y": 7.075857162475586, "dataset": "y"}, {"x": 0.9699999690055847, "y": 4.112889289855957, "dataset": "y"}, {"x": 0.9799999594688416, "y": 7.349596977233887, "dataset": "y"}, {"x": 0.9899999499320984, "y": 5.741270065307617, "dataset": "y"}, {"x": 1.0, "y": 5.089393615722656, "dataset": "y"}, {"x": 1.0099999904632568, "y": 6.034008979797363, "dataset": "y"}, {"x": 1.0199999809265137, "y": 5.681155204772949, "dataset": "y"}, {"x": 1.0299999713897705, "y": 4.136131286621094, "dataset": "y"}, {"x": 1.0399999618530273, "y": 5.253346920013428, "dataset": "y"}, {"x": 1.0499999523162842, "y": 5.750492095947266, "dataset": "y"}, {"x": 1.059999942779541, "y": 6.096412658691406, "dataset": "y"}, {"x": 1.0699999332427979, "y": 5.993020534515381, "dataset": "y"}, {"x": 1.0799999237060547, "y": 6.490128517150879, "dataset": "y"}, {"x": 1.0899999141693115, "y": 4.962357997894287, "dataset": "y"}, {"x": 1.0999999046325684, "y": 6.193634986877441, "dataset": "y"}, {"x": 1.1100000143051147, "y": 4.795998573303223, "dataset": "y"}, {"x": 1.1200000047683716, "y": 6.637198448181152, "dataset": "y"}, {"x": 1.1299999952316284, "y": 6.27440071105957, "dataset": "y"}, {"x": 1.1399999856948853, "y": 4.4921159744262695, "dataset": "y"}, {"x": 1.149999976158142, "y": 5.317478179931641, "dataset": "y"}, {"x": 1.159999966621399, "y": 6.531158447265625, "dataset": "y"}, {"x": 1.1699999570846558, "y": 6.983823299407959, "dataset": "y"}, {"x": 1.1799999475479126, "y": 4.185163974761963, "dataset": "y"}, {"x": 1.190000057220459, "y": 4.297511100769043, "dataset": "y"}, {"x": 1.2000000476837158, "y": 6.911679267883301, "dataset": "y"}, {"x": 1.2100000381469727, "y": 4.983678817749023, "dataset": "y"}, {"x": 1.2200000286102295, "y": 5.71397066116333, "dataset": "y"}, {"x": 1.2300000190734863, "y": 4.667133331298828, "dataset": "y"}, {"x": 1.2400000095367432, "y": 5.816473960876465, "dataset": "y"}, {"x": 1.25, "y": 5.792862892150879, "dataset": "y"}, {"x": 1.2599999904632568, "y": 5.192689418792725, "dataset": "y"}, {"x": 1.2700001001358032, "y": 7.400081157684326, "dataset": "y"}, {"x": 1.2799999713897705, "y": 4.297930717468262, "dataset": "y"}, {"x": 1.2899999618530273, "y": 6.534689426422119, "dataset": "y"}, {"x": 1.2999999523162842, "y": 6.631129264831543, "dataset": "y"}, {"x": 1.309999942779541, "y": 5.267358779907227, "dataset": "y"}, {"x": 1.3199999332427979, "y": 7.046431541442871, "dataset": "y"}, {"x": 1.3299999237060547, "y": 6.605049133300781, "dataset": "y"}, {"x": 1.3399999141693115, "y": 6.218865394592285, "dataset": "y"}, {"x": 1.350000023841858, "y": 6.041877269744873, "dataset": "y"}, {"x": 1.3600000143051147, "y": 5.427108287811279, "dataset": "y"}, {"x": 1.3700000047683716, "y": 5.418354511260986, "dataset": "y"}, {"x": 1.3799999952316284, "y": 5.143607139587402, "dataset": "y"}, {"x": 1.3899999856948853, "y": 6.332070350646973, "dataset": "y"}, {"x": 1.399999976158142, "y": 3.849987030029297, "dataset": "y"}, {"x": 1.409999966621399, "y": 5.348568916320801, "dataset": "y"}, {"x": 1.4199999570846558, "y": 6.195980072021484, "dataset": "y"}, {"x": 1.4300000667572021, "y": 4.8288679122924805, "dataset": "y"}, {"x": 1.440000057220459, "y": 5.323450565338135, "dataset": "y"}, {"x": 1.4500000476837158, "y": 5.791903018951416, "dataset": "y"}, {"x": 1.4600000381469727, "y": 4.855067253112793, "dataset": "y"}, {"x": 1.4700000286102295, "y": 6.002915382385254, "dataset": "y"}, {"x": 1.4800000190734863, "y": 4.968117713928223, "dataset": "y"}, {"x": 1.4900000095367432, "y": 6.81784200668335, "dataset": "y"}, {"x": 1.5, "y": 6.616700172424316, "dataset": "y"}, {"x": 1.5100001096725464, "y": 6.941412925720215, "dataset": "y"}, {"x": 1.5199999809265137, "y": 5.934927463531494, "dataset": "y"}, {"x": 1.5299999713897705, "y": 5.6485981941223145, "dataset": "y"}, {"x": 1.5399999618530273, "y": 5.83467960357666, "dataset": "y"}, {"x": 1.5499999523162842, "y": 8.783896446228027, "dataset": "y"}, {"x": 1.559999942779541, "y": 5.833178997039795, "dataset": "y"}, {"x": 1.5699999332427979, "y": 4.791476249694824, "dataset": "y"}, {"x": 1.5799999237060547, "y": 5.070619583129883, "dataset": "y"}, {"x": 1.590000033378601, "y": 4.711065769195557, "dataset": "y"}, {"x": 1.600000023841858, "y": 5.046838760375977, "dataset": "y"}, {"x": 1.6100000143051147, "y": 6.915853023529053, "dataset": "y"}, {"x": 1.6200000047683716, "y": 5.865191459655762, "dataset": "y"}, {"x": 1.6299999952316284, "y": 6.272634983062744, "dataset": "y"}, {"x": 1.6399999856948853, "y": 6.871954441070557, "dataset": "y"}, {"x": 1.649999976158142, "y": 6.695345401763916, "dataset": "y"}, {"x": 1.659999966621399, "y": 6.920654296875, "dataset": "y"}, {"x": 1.6700000762939453, "y": 6.50698184967041, "dataset": "y"}, {"x": 1.6799999475479126, "y": 6.454530239105225, "dataset": "y"}, {"x": 1.6899999380111694, "y": 8.250088691711426, "dataset": "y"}, {"x": 1.6999999284744263, "y": 7.135077953338623, "dataset": "y"}, {"x": 1.709999918937683, "y": 5.67036247253418, "dataset": "y"}, {"x": 1.71999990940094, "y": 6.4344377517700195, "dataset": "y"}, {"x": 1.7299998998641968, "y": 5.392552852630615, "dataset": "y"}, {"x": 1.7399998903274536, "y": 7.3883490562438965, "dataset": "y"}, {"x": 1.75, "y": 6.043199062347412, "dataset": "y"}, {"x": 1.7599999904632568, "y": 7.6449666023254395, "dataset": "y"}, {"x": 1.7699999809265137, "y": 7.076910018920898, "dataset": "y"}, {"x": 1.7799999713897705, "y": 8.391023635864258, "dataset": "y"}, {"x": 1.7899999618530273, "y": 6.28856086730957, "dataset": "y"}, {"x": 1.7999999523162842, "y": 5.94514799118042, "dataset": "y"}, {"x": 1.809999942779541, "y": 5.186346054077148, "dataset": "y"}, {"x": 1.8199999332427979, "y": 6.566246032714844, "dataset": "y"}, {"x": 1.8300000429153442, "y": 6.891949653625488, "dataset": "y"}, {"x": 1.840000033378601, "y": 7.7486114501953125, "dataset": "y"}, {"x": 1.850000023841858, "y": 5.136987686157227, "dataset": "y"}, {"x": 1.8600000143051147, "y": 7.6584014892578125, "dataset": "y"}, {"x": 1.8700000047683716, "y": 5.759944438934326, "dataset": "y"}, {"x": 1.8799999952316284, "y": 5.732701301574707, "dataset": "y"}, {"x": 1.8899999856948853, "y": 6.375460147857666, "dataset": "y"}, {"x": 1.899999976158142, "y": 5.573690891265869, "dataset": "y"}, {"x": 1.9100000858306885, "y": 5.945894718170166, "dataset": "y"}, {"x": 1.9199999570846558, "y": 7.676204204559326, "dataset": "y"}, {"x": 1.9299999475479126, "y": 4.362092971801758, "dataset": "y"}, {"x": 1.9399999380111694, "y": 5.332510471343994, "dataset": "y"}, {"x": 1.9499999284744263, "y": 7.137335777282715, "dataset": "y"}, {"x": 1.959999918937683, "y": 6.888383865356445, "dataset": "y"}, {"x": 1.96999990940094, "y": 7.080775260925293, "dataset": "y"}, {"x": 1.9799998998641968, "y": 5.644770622253418, "dataset": "y"}, {"x": 1.9900000095367432, "y": 7.257413387298584, "dataset": "y"}, {"x": 2.0, "y": 8.905658721923828, "dataset": "y"}, {"x": 2.009999990463257, "y": 6.992066383361816, "dataset": "y"}, {"x": 2.0199999809265137, "y": 5.462586402893066, "dataset": "y"}, {"x": 2.0299999713897705, "y": 7.562922477722168, "dataset": "y"}, {"x": 2.0399999618530273, "y": 5.640652656555176, "dataset": "y"}, {"x": 2.049999952316284, "y": 6.30998420715332, "dataset": "y"}, {"x": 2.059999942779541, "y": 7.634317398071289, "dataset": "y"}, {"x": 2.069999933242798, "y": 8.106170654296875, "dataset": "y"}, {"x": 2.0799999237060547, "y": 6.835422515869141, "dataset": "y"}, {"x": 2.0899999141693115, "y": 6.670807361602783, "dataset": "y"}, {"x": 2.0999999046325684, "y": 5.370237350463867, "dataset": "y"}, {"x": 2.109999895095825, "y": 8.077366828918457, "dataset": "y"}, {"x": 2.119999885559082, "y": 6.651854991912842, "dataset": "y"}, {"x": 2.129999876022339, "y": 6.047020435333252, "dataset": "y"}, {"x": 2.1399998664855957, "y": 8.281339645385742, "dataset": "y"}, {"x": 2.1499998569488525, "y": 6.304501056671143, "dataset": "y"}, {"x": 2.1600000858306885, "y": 7.440502166748047, "dataset": "y"}, {"x": 2.1700000762939453, "y": 6.988882064819336, "dataset": "y"}, {"x": 2.180000066757202, "y": 6.911972522735596, "dataset": "y"}, {"x": 2.190000057220459, "y": 8.018295288085938, "dataset": "y"}, {"x": 2.200000047683716, "y": 7.3730316162109375, "dataset": "y"}, {"x": 2.2100000381469727, "y": 6.042349815368652, "dataset": "y"}, {"x": 2.2200000286102295, "y": 8.753612518310547, "dataset": "y"}, {"x": 2.2300000190734863, "y": 6.57029914855957, "dataset": "y"}, {"x": 2.240000009536743, "y": 6.507447242736816, "dataset": "y"}, {"x": 2.25, "y": 5.547922134399414, "dataset": "y"}, {"x": 2.259999990463257, "y": 7.371868133544922, "dataset": "y"}, {"x": 2.2699999809265137, "y": 6.516325950622559, "dataset": "y"}, {"x": 2.2799999713897705, "y": 7.953387260437012, "dataset": "y"}, {"x": 2.2899999618530273, "y": 6.761951923370361, "dataset": "y"}, {"x": 2.299999952316284, "y": 8.309065818786621, "dataset": "y"}, {"x": 2.309999942779541, "y": 8.77283763885498, "dataset": "y"}, {"x": 2.319999933242798, "y": 6.5898284912109375, "dataset": "y"}, {"x": 2.3299999237060547, "y": 6.404168605804443, "dataset": "y"}, {"x": 2.3399999141693115, "y": 8.054763793945312, "dataset": "y"}, {"x": 2.3499999046325684, "y": 8.87782096862793, "dataset": "y"}, {"x": 2.359999895095825, "y": 4.995913505554199, "dataset": "y"}, {"x": 2.369999885559082, "y": 6.842517375946045, "dataset": "y"}, {"x": 2.379999876022339, "y": 8.564289093017578, "dataset": "y"}, {"x": 2.3899998664855957, "y": 8.832980155944824, "dataset": "y"}, {"x": 2.4000000953674316, "y": 8.226041793823242, "dataset": "y"}, {"x": 2.4100000858306885, "y": 8.293006896972656, "dataset": "y"}, {"x": 2.4200000762939453, "y": 7.935512542724609, "dataset": "y"}, {"x": 2.430000066757202, "y": 8.545894622802734, "dataset": "y"}, {"x": 2.440000057220459, "y": 8.520635604858398, "dataset": "y"}, {"x": 2.450000047683716, "y": 7.734459400177002, "dataset": "y"}, {"x": 2.4600000381469727, "y": 7.077146053314209, "dataset": "y"}, {"x": 2.4700000286102295, "y": 7.195420265197754, "dataset": "y"}, {"x": 2.4800000190734863, "y": 8.77668285369873, "dataset": "y"}, {"x": 2.490000009536743, "y": 6.808030605316162, "dataset": "y"}, {"x": 2.5, "y": 7.666328430175781, "dataset": "y"}, {"x": 2.509999990463257, "y": 7.462406158447266, "dataset": "y"}, {"x": 2.5199999809265137, "y": 7.056617259979248, "dataset": "y"}, {"x": 2.5299999713897705, "y": 7.9862961769104, "dataset": "y"}, {"x": 2.5399999618530273, "y": 8.050758361816406, "dataset": "y"}, {"x": 2.549999952316284, "y": 9.645471572875977, "dataset": "y"}, {"x": 2.559999942779541, "y": 7.539018630981445, "dataset": "y"}, {"x": 2.569999933242798, "y": 8.012618064880371, "dataset": "y"}, {"x": 2.5799999237060547, "y": 8.955838203430176, "dataset": "y"}, {"x": 2.5899999141693115, "y": 9.23609447479248, "dataset": "y"}, {"x": 2.5999999046325684, "y": 8.10473346710205, "dataset": "y"}, {"x": 2.609999895095825, "y": 8.000773429870605, "dataset": "y"}, {"x": 2.619999885559082, "y": 8.412490844726562, "dataset": "y"}, {"x": 2.629999876022339, "y": 7.805771827697754, "dataset": "y"}, {"x": 2.640000104904175, "y": 9.030725479125977, "dataset": "y"}, {"x": 2.6500000953674316, "y": 6.309379577636719, "dataset": "y"}, {"x": 2.6600000858306885, "y": 6.739753723144531, "dataset": "y"}, {"x": 2.6700000762939453, "y": 9.04019832611084, "dataset": "y"}, {"x": 2.680000066757202, "y": 7.4773969650268555, "dataset": "y"}, {"x": 2.690000057220459, "y": 7.903952121734619, "dataset": "y"}, {"x": 2.700000047683716, "y": 8.203986167907715, "dataset": "y"}, {"x": 2.7100000381469727, "y": 8.05913257598877, "dataset": "y"}, {"x": 2.7200000286102295, "y": 8.060995101928711, "dataset": "y"}, {"x": 2.7300000190734863, "y": 7.236374378204346, "dataset": "y"}, {"x": 2.740000009536743, "y": 7.438595771789551, "dataset": "y"}, {"x": 2.75, "y": 8.552497863769531, "dataset": "y"}, {"x": 2.759999990463257, "y": 7.215753555297852, "dataset": "y"}, {"x": 2.7699999809265137, "y": 9.207157135009766, "dataset": "y"}, {"x": 2.7799999713897705, "y": 9.60122013092041, "dataset": "y"}, {"x": 2.7899999618530273, "y": 8.857961654663086, "dataset": "y"}, {"x": 2.799999952316284, "y": 8.926297187805176, "dataset": "y"}, {"x": 2.809999942779541, "y": 7.843085289001465, "dataset": "y"}, {"x": 2.819999933242798, "y": 8.11921501159668, "dataset": "y"}, {"x": 2.8299999237060547, "y": 8.435049057006836, "dataset": "y"}, {"x": 2.8399999141693115, "y": 9.140341758728027, "dataset": "y"}, {"x": 2.8499999046325684, "y": 8.322726249694824, "dataset": "y"}, {"x": 2.859999895095825, "y": 10.722223281860352, "dataset": "y"}, {"x": 2.869999885559082, "y": 8.112034797668457, "dataset": "y"}, {"x": 2.880000114440918, "y": 7.55252742767334, "dataset": "y"}, {"x": 2.890000104904175, "y": 8.669329643249512, "dataset": "y"}, {"x": 2.9000000953674316, "y": 8.66787052154541, "dataset": "y"}, {"x": 2.9100000858306885, "y": 7.82528018951416, "dataset": "y"}, {"x": 2.9200000762939453, "y": 10.325233459472656, "dataset": "y"}, {"x": 2.930000066757202, "y": 9.229471206665039, "dataset": "y"}, {"x": 2.940000057220459, "y": 7.667969226837158, "dataset": "y"}, {"x": 2.950000047683716, "y": 8.01330280303955, "dataset": "y"}, {"x": 2.9600000381469727, "y": 7.551626205444336, "dataset": "y"}, {"x": 2.9700000286102295, "y": 11.95248794555664, "dataset": "y"}, {"x": 2.9800000190734863, "y": 8.185225486755371, "dataset": "y"}, {"x": 2.990000009536743, "y": 8.368325233459473, "dataset": "y"}, {"x": 3.0, "y": 11.267422676086426, "dataset": "y"}, {"x": 3.009999990463257, "y": 9.649955749511719, "dataset": "y"}, {"x": 3.0199999809265137, "y": 8.19390869140625, "dataset": "y"}, {"x": 3.0299999713897705, "y": 8.019577980041504, "dataset": "y"}, {"x": 3.0399999618530273, "y": 10.478777885437012, "dataset": "y"}, {"x": 3.049999952316284, "y": 10.238134384155273, "dataset": "y"}, {"x": 3.059999942779541, "y": 8.391607284545898, "dataset": "y"}, {"x": 3.069999933242798, "y": 11.544986724853516, "dataset": "y"}, {"x": 3.0799999237060547, "y": 12.195040702819824, "dataset": "y"}, {"x": 3.0899999141693115, "y": 9.337095260620117, "dataset": "y"}, {"x": 3.0999999046325684, "y": 11.099879264831543, "dataset": "y"}, {"x": 3.109999895095825, "y": 9.722850799560547, "dataset": "y"}, {"x": 3.119999885559082, "y": 9.719194412231445, "dataset": "y"}, {"x": 3.129999876022339, "y": 9.990367889404297, "dataset": "y"}, {"x": 3.1399998664855957, "y": 8.715995788574219, "dataset": "y"}, {"x": 3.1499998569488525, "y": 8.347304344177246, "dataset": "y"}, {"x": 3.1599998474121094, "y": 9.088979721069336, "dataset": "y"}, {"x": 3.169999837875366, "y": 7.949250221252441, "dataset": "y"}, {"x": 3.179999828338623, "y": 9.532055854797363, "dataset": "y"}, {"x": 3.18999981880188, "y": 9.563227653503418, "dataset": "y"}, {"x": 3.200000047683716, "y": 9.180432319641113, "dataset": "y"}, {"x": 3.2100000381469727, "y": 10.780006408691406, "dataset": "y"}, {"x": 3.2200000286102295, "y": 7.669251918792725, "dataset": "y"}, {"x": 3.2300000190734863, "y": 9.10634994506836, "dataset": "y"}, {"x": 3.240000009536743, "y": 9.55239200592041, "dataset": "y"}, {"x": 3.25, "y": 9.927446365356445, "dataset": "y"}, {"x": 3.259999990463257, "y": 9.382617950439453, "dataset": "y"}, {"x": 3.2699999809265137, "y": 10.423675537109375, "dataset": "y"}, {"x": 3.2799999713897705, "y": 8.111299514770508, "dataset": "y"}, {"x": 3.2899999618530273, "y": 8.91815185546875, "dataset": "y"}, {"x": 3.299999952316284, "y": 9.94438362121582, "dataset": "y"}, {"x": 3.309999942779541, "y": 9.005526542663574, "dataset": "y"}, {"x": 3.319999933242798, "y": 9.65119743347168, "dataset": "y"}, {"x": 3.3299999237060547, "y": 10.434877395629883, "dataset": "y"}, {"x": 3.3399999141693115, "y": 9.999958992004395, "dataset": "y"}, {"x": 3.3499999046325684, "y": 9.035622596740723, "dataset": "y"}, {"x": 3.359999895095825, "y": 10.219467163085938, "dataset": "y"}, {"x": 3.369999885559082, "y": 8.806087493896484, "dataset": "y"}, {"x": 3.379999876022339, "y": 10.856695175170898, "dataset": "y"}, {"x": 3.3899998664855957, "y": 10.713951110839844, "dataset": "y"}, {"x": 3.3999998569488525, "y": 8.147927284240723, "dataset": "y"}, {"x": 3.4099998474121094, "y": 12.252891540527344, "dataset": "y"}, {"x": 3.419999837875366, "y": 8.571051597595215, "dataset": "y"}, {"x": 3.429999828338623, "y": 10.748763084411621, "dataset": "y"}, {"x": 3.440000057220459, "y": 7.772303581237793, "dataset": "y"}, {"x": 3.450000047683716, "y": 8.494058609008789, "dataset": "y"}, {"x": 3.4600000381469727, "y": 9.451995849609375, "dataset": "y"}, {"x": 3.4700000286102295, "y": 10.662446975708008, "dataset": "y"}, {"x": 3.4800000190734863, "y": 10.380273818969727, "dataset": "y"}, {"x": 3.490000009536743, "y": 10.838739395141602, "dataset": "y"}, {"x": 3.5, "y": 10.645532608032227, "dataset": "y"}, {"x": 3.509999990463257, "y": 10.11835765838623, "dataset": "y"}, {"x": 3.5199999809265137, "y": 9.572970390319824, "dataset": "y"}, {"x": 3.5299999713897705, "y": 10.968339920043945, "dataset": "y"}, {"x": 3.5399999618530273, "y": 10.422850608825684, "dataset": "y"}, {"x": 3.549999952316284, "y": 10.0629243850708, "dataset": "y"}, {"x": 3.559999942779541, "y": 9.482614517211914, "dataset": "y"}, {"x": 3.569999933242798, "y": 9.220183372497559, "dataset": "y"}, {"x": 3.5799999237060547, "y": 11.33275318145752, "dataset": "y"}, {"x": 3.5899999141693115, "y": 10.154732704162598, "dataset": "y"}, {"x": 3.5999999046325684, "y": 10.394700050354004, "dataset": "y"}, {"x": 3.609999895095825, "y": 11.233908653259277, "dataset": "y"}, {"x": 3.619999885559082, "y": 10.367642402648926, "dataset": "y"}, {"x": 3.629999876022339, "y": 7.988655090332031, "dataset": "y"}, {"x": 3.6399998664855957, "y": 10.031570434570312, "dataset": "y"}, {"x": 3.6499998569488525, "y": 9.729588508605957, "dataset": "y"}, {"x": 3.6599998474121094, "y": 10.443315505981445, "dataset": "y"}, {"x": 3.669999837875366, "y": 10.127459526062012, "dataset": "y"}, {"x": 3.680000066757202, "y": 11.062983512878418, "dataset": "y"}, {"x": 3.690000057220459, "y": 9.089698791503906, "dataset": "y"}, {"x": 3.700000047683716, "y": 11.38500690460205, "dataset": "y"}, {"x": 3.7100000381469727, "y": 11.378429412841797, "dataset": "y"}, {"x": 3.7200000286102295, "y": 10.121967315673828, "dataset": "y"}, {"x": 3.7300000190734863, "y": 12.18570613861084, "dataset": "y"}, {"x": 3.740000009536743, "y": 10.060523986816406, "dataset": "y"}, {"x": 3.75, "y": 9.024465560913086, "dataset": "y"}, {"x": 3.759999990463257, "y": 10.04450798034668, "dataset": "y"}, {"x": 3.7699999809265137, "y": 9.465949058532715, "dataset": "y"}, {"x": 3.7799999713897705, "y": 11.572259902954102, "dataset": "y"}, {"x": 3.7899999618530273, "y": 9.715831756591797, "dataset": "y"}, {"x": 3.799999952316284, "y": 11.957242012023926, "dataset": "y"}, {"x": 3.809999942779541, "y": 11.523323059082031, "dataset": "y"}, {"x": 3.819999933242798, "y": 10.442768096923828, "dataset": "y"}, {"x": 3.8299999237060547, "y": 12.532684326171875, "dataset": "y"}, {"x": 3.8399999141693115, "y": 11.322991371154785, "dataset": "y"}, {"x": 3.8499999046325684, "y": 11.386502265930176, "dataset": "y"}, {"x": 3.859999895095825, "y": 10.926371574401855, "dataset": "y"}, {"x": 3.869999885559082, "y": 9.796855926513672, "dataset": "y"}, {"x": 3.879999876022339, "y": 8.722763061523438, "dataset": "y"}, {"x": 3.8899998664855957, "y": 9.946626663208008, "dataset": "y"}, {"x": 3.8999998569488525, "y": 10.771437644958496, "dataset": "y"}, {"x": 3.9099998474121094, "y": 11.67529296875, "dataset": "y"}, {"x": 3.9200000762939453, "y": 10.738595008850098, "dataset": "y"}, {"x": 3.930000066757202, "y": 11.41125774383545, "dataset": "y"}, {"x": 3.940000057220459, "y": 12.258471488952637, "dataset": "y"}, {"x": 3.950000047683716, "y": 11.99769401550293, "dataset": "y"}, {"x": 3.9600000381469727, "y": 10.913394927978516, "dataset": "y"}, {"x": 3.9700000286102295, "y": 11.753026962280273, "dataset": "y"}, {"x": 3.9800000190734863, "y": 10.46420669555664, "dataset": "y"}, {"x": 3.990000009536743, "y": 12.771523475646973, "dataset": "y"}, {"x": 4.0, "y": 10.887067794799805, "dataset": "y"}, {"x": 4.010000228881836, "y": 10.254803657531738, "dataset": "y"}, {"x": 4.019999980926514, "y": 10.225848197937012, "dataset": "y"}, {"x": 4.03000020980835, "y": 10.117487907409668, "dataset": "y"}, {"x": 4.039999961853027, "y": 10.839312553405762, "dataset": "y"}, {"x": 4.050000190734863, "y": 11.84023380279541, "dataset": "y"}, {"x": 4.059999942779541, "y": 9.223748207092285, "dataset": "y"}, {"x": 4.070000171661377, "y": 11.7392578125, "dataset": "y"}, {"x": 4.079999923706055, "y": 11.01101303100586, "dataset": "y"}, {"x": 4.090000152587891, "y": 11.99072265625, "dataset": "y"}, {"x": 4.099999904632568, "y": 9.958404541015625, "dataset": "y"}, {"x": 4.110000133514404, "y": 11.547026634216309, "dataset": "y"}, {"x": 4.119999885559082, "y": 14.629858016967773, "dataset": "y"}, {"x": 4.130000114440918, "y": 10.534122467041016, "dataset": "y"}, {"x": 4.139999866485596, "y": 11.744205474853516, "dataset": "y"}, {"x": 4.150000095367432, "y": 11.38363265991211, "dataset": "y"}, {"x": 4.159999847412109, "y": 11.4465913772583, "dataset": "y"}, {"x": 4.170000076293945, "y": 11.096308708190918, "dataset": "y"}, {"x": 4.179999828338623, "y": 10.528258323669434, "dataset": "y"}, {"x": 4.190000057220459, "y": 11.318358421325684, "dataset": "y"}, {"x": 4.199999809265137, "y": 10.465224266052246, "dataset": "y"}, {"x": 4.210000038146973, "y": 10.548835754394531, "dataset": "y"}, {"x": 4.21999979019165, "y": 11.2714204788208, "dataset": "y"}, {"x": 4.230000019073486, "y": 12.11678695678711, "dataset": "y"}, {"x": 4.239999771118164, "y": 12.225258827209473, "dataset": "y"}, {"x": 4.25, "y": 10.947565078735352, "dataset": "y"}, {"x": 4.259999752044678, "y": 9.451370239257812, "dataset": "y"}, {"x": 4.269999980926514, "y": 12.005145072937012, "dataset": "y"}, {"x": 4.279999732971191, "y": 11.826391220092773, "dataset": "y"}, {"x": 4.289999961853027, "y": 11.60004997253418, "dataset": "y"}, {"x": 4.299999713897705, "y": 10.019099235534668, "dataset": "y"}, {"x": 4.309999942779541, "y": 12.350641250610352, "dataset": "y"}, {"x": 4.320000171661377, "y": 11.225841522216797, "dataset": "y"}, {"x": 4.330000400543213, "y": 11.804801940917969, "dataset": "y"}, {"x": 4.340000152587891, "y": 11.483968734741211, "dataset": "y"}, {"x": 4.350000381469727, "y": 11.782126426696777, "dataset": "y"}, {"x": 4.360000133514404, "y": 12.7359619140625, "dataset": "y"}, {"x": 4.37000036239624, "y": 12.101283073425293, "dataset": "y"}, {"x": 4.380000114440918, "y": 11.883110046386719, "dataset": "y"}, {"x": 4.390000343322754, "y": 11.116677284240723, "dataset": "y"}, {"x": 4.400000095367432, "y": 11.361103057861328, "dataset": "y"}, {"x": 4.410000324249268, "y": 10.330179214477539, "dataset": "y"}, {"x": 4.420000076293945, "y": 13.370811462402344, "dataset": "y"}, {"x": 4.430000305175781, "y": 11.137969017028809, "dataset": "y"}, {"x": 4.440000057220459, "y": 10.568572998046875, "dataset": "y"}, {"x": 4.450000286102295, "y": 12.33580207824707, "dataset": "y"}, {"x": 4.460000038146973, "y": 11.06967544555664, "dataset": "y"}, {"x": 4.470000267028809, "y": 12.258501052856445, "dataset": "y"}, {"x": 4.480000019073486, "y": 11.905248641967773, "dataset": "y"}, {"x": 4.490000247955322, "y": 11.836973190307617, "dataset": "y"}, {"x": 4.5, "y": 10.234151840209961, "dataset": "y"}, {"x": 4.510000228881836, "y": 12.975363731384277, "dataset": "y"}, {"x": 4.519999980926514, "y": 9.987077713012695, "dataset": "y"}, {"x": 4.53000020980835, "y": 10.59559440612793, "dataset": "y"}, {"x": 4.539999961853027, "y": 12.105490684509277, "dataset": "y"}, {"x": 4.550000190734863, "y": 10.481518745422363, "dataset": "y"}, {"x": 4.559999942779541, "y": 11.095417976379395, "dataset": "y"}, {"x": 4.570000171661377, "y": 13.393457412719727, "dataset": "y"}, {"x": 4.579999923706055, "y": 11.30681037902832, "dataset": "y"}, {"x": 4.590000152587891, "y": 13.956228256225586, "dataset": "y"}, {"x": 4.599999904632568, "y": 13.86666488647461, "dataset": "y"}, {"x": 4.610000133514404, "y": 11.576080322265625, "dataset": "y"}, {"x": 4.619999885559082, "y": 12.362527847290039, "dataset": "y"}, {"x": 4.630000114440918, "y": 12.744348526000977, "dataset": "y"}, {"x": 4.639999866485596, "y": 11.61953353881836, "dataset": "y"}, {"x": 4.650000095367432, "y": 13.350883483886719, "dataset": "y"}, {"x": 4.659999847412109, "y": 11.425447463989258, "dataset": "y"}, {"x": 4.670000076293945, "y": 12.506763458251953, "dataset": "y"}, {"x": 4.679999828338623, "y": 12.544079780578613, "dataset": "y"}, {"x": 4.690000057220459, "y": 11.760200500488281, "dataset": "y"}, {"x": 4.699999809265137, "y": 11.898605346679688, "dataset": "y"}, {"x": 4.710000038146973, "y": 11.788393020629883, "dataset": "y"}, {"x": 4.71999979019165, "y": 13.256980895996094, "dataset": "y"}, {"x": 4.730000019073486, "y": 14.278676986694336, "dataset": "y"}, {"x": 4.739999771118164, "y": 11.778094291687012, "dataset": "y"}, {"x": 4.75, "y": 12.86543083190918, "dataset": "y"}, {"x": 4.759999752044678, "y": 12.33925724029541, "dataset": "y"}, {"x": 4.769999980926514, "y": 12.235077857971191, "dataset": "y"}, {"x": 4.779999732971191, "y": 12.044026374816895, "dataset": "y"}, {"x": 4.789999961853027, "y": 13.473464012145996, "dataset": "y"}, {"x": 4.800000190734863, "y": 14.109691619873047, "dataset": "y"}, {"x": 4.810000419616699, "y": 13.926201820373535, "dataset": "y"}, {"x": 4.820000171661377, "y": 14.814640045166016, "dataset": "y"}, {"x": 4.830000400543213, "y": 13.533717155456543, "dataset": "y"}, {"x": 4.840000152587891, "y": 11.890188217163086, "dataset": "y"}, {"x": 4.850000381469727, "y": 14.887703895568848, "dataset": "y"}, {"x": 4.860000133514404, "y": 13.542081832885742, "dataset": "y"}, {"x": 4.87000036239624, "y": 14.011507034301758, "dataset": "y"}, {"x": 4.880000114440918, "y": 11.84542465209961, "dataset": "y"}, {"x": 4.890000343322754, "y": 12.622247695922852, "dataset": "y"}, {"x": 4.900000095367432, "y": 12.171454429626465, "dataset": "y"}, {"x": 4.910000324249268, "y": 11.941190719604492, "dataset": "y"}, {"x": 4.920000076293945, "y": 12.64615249633789, "dataset": "y"}, {"x": 4.930000305175781, "y": 10.81389045715332, "dataset": "y"}, {"x": 4.940000057220459, "y": 12.622420310974121, "dataset": "y"}, {"x": 4.950000286102295, "y": 12.364584922790527, "dataset": "y"}, {"x": 4.960000038146973, "y": 14.247153282165527, "dataset": "y"}, {"x": 4.970000267028809, "y": 13.280714988708496, "dataset": "y"}, {"x": 4.980000019073486, "y": 12.606937408447266, "dataset": "y"}, {"x": 4.990000247955322, "y": 12.477616310119629, "dataset": "y"}, {"x": 5.0, "y": 11.830824851989746, "dataset": "y"}, {"x": 5.010000228881836, "y": 14.988810539245605, "dataset": "y"}, {"x": 5.019999980926514, "y": 12.56022834777832, "dataset": "y"}, {"x": 5.03000020980835, "y": 10.812132835388184, "dataset": "y"}, {"x": 5.039999961853027, "y": 13.852907180786133, "dataset": "y"}, {"x": 5.050000190734863, "y": 12.419480323791504, "dataset": "y"}, {"x": 5.059999942779541, "y": 14.442398071289062, "dataset": "y"}, {"x": 5.070000171661377, "y": 13.408208847045898, "dataset": "y"}, {"x": 5.079999923706055, "y": 13.575355529785156, "dataset": "y"}, {"x": 5.090000152587891, "y": 12.324402809143066, "dataset": "y"}, {"x": 5.099999904632568, "y": 13.76547622680664, "dataset": "y"}, {"x": 5.110000133514404, "y": 12.91611099243164, "dataset": "y"}, {"x": 5.119999885559082, "y": 15.256439208984375, "dataset": "y"}, {"x": 5.130000114440918, "y": 13.034198760986328, "dataset": "y"}, {"x": 5.139999866485596, "y": 13.262566566467285, "dataset": "y"}, {"x": 5.150000095367432, "y": 13.323147773742676, "dataset": "y"}, {"x": 5.159999847412109, "y": 14.457785606384277, "dataset": "y"}, {"x": 5.170000076293945, "y": 14.184962272644043, "dataset": "y"}, {"x": 5.179999828338623, "y": 14.235716819763184, "dataset": "y"}, {"x": 5.190000057220459, "y": 12.787527084350586, "dataset": "y"}, {"x": 5.199999809265137, "y": 13.102675437927246, "dataset": "y"}, {"x": 5.210000038146973, "y": 12.153855323791504, "dataset": "y"}, {"x": 5.21999979019165, "y": 14.900543212890625, "dataset": "y"}, {"x": 5.230000019073486, "y": 12.946549415588379, "dataset": "y"}, {"x": 5.239999771118164, "y": 13.825202941894531, "dataset": "y"}, {"x": 5.25, "y": 15.639727592468262, "dataset": "y"}, {"x": 5.259999752044678, "y": 15.315911293029785, "dataset": "y"}, {"x": 5.269999980926514, "y": 12.750723838806152, "dataset": "y"}, {"x": 5.28000020980835, "y": 14.794635772705078, "dataset": "y"}, {"x": 5.2900004386901855, "y": 13.953563690185547, "dataset": "y"}, {"x": 5.300000190734863, "y": 13.501687049865723, "dataset": "y"}, {"x": 5.310000419616699, "y": 13.104914665222168, "dataset": "y"}, {"x": 5.320000171661377, "y": 13.742104530334473, "dataset": "y"}, {"x": 5.330000400543213, "y": 11.671059608459473, "dataset": "y"}, {"x": 5.340000152587891, "y": 13.502058029174805, "dataset": "y"}, {"x": 5.350000381469727, "y": 13.947099685668945, "dataset": "y"}, {"x": 5.360000133514404, "y": 13.899166107177734, "dataset": "y"}, {"x": 5.37000036239624, "y": 13.723857879638672, "dataset": "y"}, {"x": 5.380000114440918, "y": 15.342499732971191, "dataset": "y"}, {"x": 5.390000343322754, "y": 14.856589317321777, "dataset": "y"}, {"x": 5.400000095367432, "y": 13.866519927978516, "dataset": "y"}, {"x": 5.410000324249268, "y": 14.66588020324707, "dataset": "y"}, {"x": 5.420000076293945, "y": 15.444977760314941, "dataset": "y"}, {"x": 5.430000305175781, "y": 14.213637351989746, "dataset": "y"}, {"x": 5.440000057220459, "y": 13.67020034790039, "dataset": "y"}, {"x": 5.450000286102295, "y": 12.547870635986328, "dataset": "y"}, {"x": 5.460000038146973, "y": 13.476618766784668, "dataset": "y"}, {"x": 5.470000267028809, "y": 14.14091968536377, "dataset": "y"}, {"x": 5.480000019073486, "y": 13.790224075317383, "dataset": "y"}, {"x": 5.490000247955322, "y": 13.386714935302734, "dataset": "y"}, {"x": 5.5, "y": 14.193750381469727, "dataset": "y"}, {"x": 5.510000228881836, "y": 14.06550407409668, "dataset": "y"}, {"x": 5.519999980926514, "y": 15.249156951904297, "dataset": "y"}, {"x": 5.53000020980835, "y": 14.135984420776367, "dataset": "y"}, {"x": 5.539999961853027, "y": 11.629166603088379, "dataset": "y"}, {"x": 5.550000190734863, "y": 14.358230590820312, "dataset": "y"}, {"x": 5.559999942779541, "y": 13.427717208862305, "dataset": "y"}, {"x": 5.570000171661377, "y": 14.743351936340332, "dataset": "y"}, {"x": 5.579999923706055, "y": 14.623339653015137, "dataset": "y"}, {"x": 5.590000152587891, "y": 15.79407787322998, "dataset": "y"}, {"x": 5.599999904632568, "y": 13.557992935180664, "dataset": "y"}, {"x": 5.610000133514404, "y": 15.931880950927734, "dataset": "y"}, {"x": 5.619999885559082, "y": 13.910330772399902, "dataset": "y"}, {"x": 5.630000114440918, "y": 14.985472679138184, "dataset": "y"}, {"x": 5.639999866485596, "y": 13.03845500946045, "dataset": "y"}, {"x": 5.650000095367432, "y": 14.115346908569336, "dataset": "y"}, {"x": 5.659999847412109, "y": 15.19432258605957, "dataset": "y"}, {"x": 5.670000076293945, "y": 17.016498565673828, "dataset": "y"}, {"x": 5.679999828338623, "y": 15.128240585327148, "dataset": "y"}, {"x": 5.690000057220459, "y": 15.372880935668945, "dataset": "y"}, {"x": 5.699999809265137, "y": 15.318096160888672, "dataset": "y"}, {"x": 5.710000038146973, "y": 14.230862617492676, "dataset": "y"}, {"x": 5.71999979019165, "y": 15.008169174194336, "dataset": "y"}, {"x": 5.730000019073486, "y": 14.191390991210938, "dataset": "y"}, {"x": 5.739999771118164, "y": 13.99533748626709, "dataset": "y"}, {"x": 5.75, "y": 13.504510879516602, "dataset": "y"}, {"x": 5.760000228881836, "y": 14.294888496398926, "dataset": "y"}, {"x": 5.770000457763672, "y": 14.378576278686523, "dataset": "y"}, {"x": 5.78000020980835, "y": 16.347335815429688, "dataset": "y"}, {"x": 5.7900004386901855, "y": 14.027843475341797, "dataset": "y"}, {"x": 5.800000190734863, "y": 13.576966285705566, "dataset": "y"}, {"x": 5.810000419616699, "y": 14.222657203674316, "dataset": "y"}, {"x": 5.820000171661377, "y": 14.473653793334961, "dataset": "y"}, {"x": 5.830000400543213, "y": 15.674017906188965, "dataset": "y"}, {"x": 5.840000152587891, "y": 14.444131851196289, "dataset": "y"}, {"x": 5.850000381469727, "y": 15.461801528930664, "dataset": "y"}, {"x": 5.860000133514404, "y": 13.528226852416992, "dataset": "y"}, {"x": 5.87000036239624, "y": 15.310073852539062, "dataset": "y"}, {"x": 5.880000114440918, "y": 14.306221961975098, "dataset": "y"}, {"x": 5.890000343322754, "y": 14.595725059509277, "dataset": "y"}, {"x": 5.900000095367432, "y": 15.909770965576172, "dataset": "y"}, {"x": 5.910000324249268, "y": 14.710590362548828, "dataset": "y"}, {"x": 5.920000076293945, "y": 16.65110206604004, "dataset": "y"}, {"x": 5.930000305175781, "y": 15.422847747802734, "dataset": "y"}, {"x": 5.940000057220459, "y": 13.957468032836914, "dataset": "y"}, {"x": 5.950000286102295, "y": 15.671189308166504, "dataset": "y"}, {"x": 5.960000038146973, "y": 16.034997940063477, "dataset": "y"}, {"x": 5.970000267028809, "y": 14.482366561889648, "dataset": "y"}, {"x": 5.980000019073486, "y": 15.582653999328613, "dataset": "y"}, {"x": 5.990000247955322, "y": 14.466949462890625, "dataset": "y"}, {"x": 6.0, "y": 14.968839645385742, "dataset": "y"}, {"x": 6.010000228881836, "y": 14.94509220123291, "dataset": "y"}, {"x": 6.019999980926514, "y": 14.545384407043457, "dataset": "y"}, {"x": 6.03000020980835, "y": 15.256258964538574, "dataset": "y"}, {"x": 6.039999961853027, "y": 13.229372024536133, "dataset": "y"}, {"x": 6.050000190734863, "y": 12.799086570739746, "dataset": "y"}, {"x": 6.059999942779541, "y": 15.117132186889648, "dataset": "y"}, {"x": 6.070000171661377, "y": 13.296929359436035, "dataset": "y"}, {"x": 6.079999923706055, "y": 16.289688110351562, "dataset": "y"}, {"x": 6.090000152587891, "y": 15.872644424438477, "dataset": "y"}, {"x": 6.099999904632568, "y": 15.056157112121582, "dataset": "y"}, {"x": 6.110000133514404, "y": 14.748462677001953, "dataset": "y"}, {"x": 6.119999885559082, "y": 15.393757820129395, "dataset": "y"}, {"x": 6.130000114440918, "y": 15.136685371398926, "dataset": "y"}, {"x": 6.139999866485596, "y": 14.968208312988281, "dataset": "y"}, {"x": 6.150000095367432, "y": 14.2734375, "dataset": "y"}, {"x": 6.159999847412109, "y": 16.08478355407715, "dataset": "y"}, {"x": 6.170000076293945, "y": 16.15095329284668, "dataset": "y"}, {"x": 6.179999828338623, "y": 16.847837448120117, "dataset": "y"}, {"x": 6.190000057220459, "y": 13.495954513549805, "dataset": "y"}, {"x": 6.199999809265137, "y": 15.03976821899414, "dataset": "y"}, {"x": 6.210000038146973, "y": 15.641406059265137, "dataset": "y"}, {"x": 6.21999979019165, "y": 16.334558486938477, "dataset": "y"}, {"x": 6.230000019073486, "y": 14.619091987609863, "dataset": "y"}, {"x": 6.239999771118164, "y": 16.218894958496094, "dataset": "y"}, {"x": 6.25, "y": 14.595251083374023, "dataset": "y"}, {"x": 6.259999752044678, "y": 15.408174514770508, "dataset": "y"}, {"x": 6.269999980926514, "y": 15.025110244750977, "dataset": "y"}, {"x": 6.279999732971191, "y": 16.116985321044922, "dataset": "y"}, {"x": 6.289999961853027, "y": 15.75260066986084, "dataset": "y"}, {"x": 6.299999713897705, "y": 15.062490463256836, "dataset": "y"}, {"x": 6.309999942779541, "y": 16.111404418945312, "dataset": "y"}, {"x": 6.320000171661377, "y": 14.848495483398438, "dataset": "y"}, {"x": 6.330000400543213, "y": 16.98627281188965, "dataset": "y"}, {"x": 6.340000152587891, "y": 15.433656692504883, "dataset": "y"}, {"x": 6.350000381469727, "y": 16.92130470275879, "dataset": "y"}, {"x": 6.360000133514404, "y": 14.077646255493164, "dataset": "y"}, {"x": 6.37000036239624, "y": 15.38419246673584, "dataset": "y"}, {"x": 6.380000114440918, "y": 16.16064453125, "dataset": "y"}, {"x": 6.390000343322754, "y": 12.870630264282227, "dataset": "y"}, {"x": 6.400000095367432, "y": 14.836161613464355, "dataset": "y"}, {"x": 6.410000324249268, "y": 15.482385635375977, "dataset": "y"}, {"x": 6.420000076293945, "y": 15.007268905639648, "dataset": "y"}, {"x": 6.430000305175781, "y": 17.580129623413086, "dataset": "y"}, {"x": 6.440000057220459, "y": 16.292749404907227, "dataset": "y"}, {"x": 6.450000286102295, "y": 17.295019149780273, "dataset": "y"}, {"x": 6.460000038146973, "y": 15.532431602478027, "dataset": "y"}, {"x": 6.470000267028809, "y": 16.583202362060547, "dataset": "y"}, {"x": 6.480000019073486, "y": 14.812788963317871, "dataset": "y"}, {"x": 6.490000247955322, "y": 15.603504180908203, "dataset": "y"}, {"x": 6.5, "y": 15.324358940124512, "dataset": "y"}, {"x": 6.510000228881836, "y": 16.843507766723633, "dataset": "y"}, {"x": 6.519999980926514, "y": 16.919965744018555, "dataset": "y"}, {"x": 6.53000020980835, "y": 15.90131664276123, "dataset": "y"}, {"x": 6.539999961853027, "y": 15.540213584899902, "dataset": "y"}, {"x": 6.550000190734863, "y": 16.27297592163086, "dataset": "y"}, {"x": 6.559999942779541, "y": 16.6300048828125, "dataset": "y"}, {"x": 6.570000171661377, "y": 17.093341827392578, "dataset": "y"}, {"x": 6.579999923706055, "y": 15.568400382995605, "dataset": "y"}, {"x": 6.590000152587891, "y": 17.32444953918457, "dataset": "y"}, {"x": 6.599999904632568, "y": 15.407366752624512, "dataset": "y"}, {"x": 6.610000133514404, "y": 16.12241554260254, "dataset": "y"}, {"x": 6.619999885559082, "y": 15.43227767944336, "dataset": "y"}, {"x": 6.630000114440918, "y": 16.724477767944336, "dataset": "y"}, {"x": 6.639999866485596, "y": 15.969229698181152, "dataset": "y"}, {"x": 6.650000095367432, "y": 14.739709854125977, "dataset": "y"}, {"x": 6.659999847412109, "y": 17.314586639404297, "dataset": "y"}, {"x": 6.670000076293945, "y": 14.854344367980957, "dataset": "y"}, {"x": 6.679999828338623, "y": 18.11216926574707, "dataset": "y"}, {"x": 6.690000057220459, "y": 15.93018913269043, "dataset": "y"}, {"x": 6.699999809265137, "y": 15.2860107421875, "dataset": "y"}, {"x": 6.710000038146973, "y": 17.66775131225586, "dataset": "y"}, {"x": 6.71999979019165, "y": 16.099153518676758, "dataset": "y"}, {"x": 6.730000019073486, "y": 16.128969192504883, "dataset": "y"}, {"x": 6.739999771118164, "y": 13.892287254333496, "dataset": "y"}, {"x": 6.75, "y": 17.27834701538086, "dataset": "y"}, {"x": 6.759999752044678, "y": 17.03007698059082, "dataset": "y"}, {"x": 6.769999980926514, "y": 17.25981330871582, "dataset": "y"}, {"x": 6.779999732971191, "y": 17.19867515563965, "dataset": "y"}, {"x": 6.789999961853027, "y": 15.593186378479004, "dataset": "y"}, {"x": 6.800000190734863, "y": 15.869088172912598, "dataset": "y"}, {"x": 6.810000419616699, "y": 16.76595115661621, "dataset": "y"}, {"x": 6.820000171661377, "y": 16.4969482421875, "dataset": "y"}, {"x": 6.830000400543213, "y": 16.88482093811035, "dataset": "y"}, {"x": 6.840000152587891, "y": 16.45798683166504, "dataset": "y"}, {"x": 6.850000381469727, "y": 16.44550132751465, "dataset": "y"}, {"x": 6.860000133514404, "y": 16.283037185668945, "dataset": "y"}, {"x": 6.87000036239624, "y": 16.95208740234375, "dataset": "y"}, {"x": 6.880000114440918, "y": 17.863401412963867, "dataset": "y"}, {"x": 6.890000343322754, "y": 15.860776901245117, "dataset": "y"}, {"x": 6.900000095367432, "y": 16.839387893676758, "dataset": "y"}, {"x": 6.910000324249268, "y": 16.856016159057617, "dataset": "y"}, {"x": 6.920000076293945, "y": 17.10268783569336, "dataset": "y"}, {"x": 6.930000305175781, "y": 16.32232093811035, "dataset": "y"}, {"x": 6.940000057220459, "y": 17.8317813873291, "dataset": "y"}, {"x": 6.950000286102295, "y": 17.8905086517334, "dataset": "y"}, {"x": 6.960000038146973, "y": 17.425426483154297, "dataset": "y"}, {"x": 6.970000267028809, "y": 17.327266693115234, "dataset": "y"}, {"x": 6.980000019073486, "y": 17.495590209960938, "dataset": "y"}, {"x": 6.990000247955322, "y": 16.91490936279297, "dataset": "y"}, {"x": 7.0, "y": 17.045751571655273, "dataset": "y"}, {"x": 7.010000228881836, "y": 16.10178565979004, "dataset": "y"}, {"x": 7.019999980926514, "y": 18.850072860717773, "dataset": "y"}, {"x": 7.03000020980835, "y": 17.288583755493164, "dataset": "y"}, {"x": 7.039999961853027, "y": 16.05361557006836, "dataset": "y"}, {"x": 7.050000190734863, "y": 17.79840850830078, "dataset": "y"}, {"x": 7.059999942779541, "y": 16.1242618560791, "dataset": "y"}, {"x": 7.070000171661377, "y": 17.485435485839844, "dataset": "y"}, {"x": 7.079999923706055, "y": 19.68479347229004, "dataset": "y"}, {"x": 7.090000152587891, "y": 17.43943214416504, "dataset": "y"}, {"x": 7.099999904632568, "y": 16.51283073425293, "dataset": "y"}, {"x": 7.110000133514404, "y": 16.8305606842041, "dataset": "y"}, {"x": 7.119999885559082, "y": 16.251163482666016, "dataset": "y"}, {"x": 7.130000114440918, "y": 14.871963500976562, "dataset": "y"}, {"x": 7.139999866485596, "y": 17.368228912353516, "dataset": "y"}, {"x": 7.150000095367432, "y": 17.73525619506836, "dataset": "y"}, {"x": 7.159999847412109, "y": 17.916461944580078, "dataset": "y"}, {"x": 7.170000076293945, "y": 15.657282829284668, "dataset": "y"}, {"x": 7.179999828338623, "y": 18.12590217590332, "dataset": "y"}, {"x": 7.190000057220459, "y": 16.40154457092285, "dataset": "y"}, {"x": 7.199999809265137, "y": 18.3275146484375, "dataset": "y"}, {"x": 7.210000038146973, "y": 17.79526138305664, "dataset": "y"}, {"x": 7.21999979019165, "y": 14.660908699035645, "dataset": "y"}, {"x": 7.230000019073486, "y": 18.17041778564453, "dataset": "y"}, {"x": 7.239999771118164, "y": 17.11417579650879, "dataset": "y"}, {"x": 7.25, "y": 17.617399215698242, "dataset": "y"}, {"x": 7.259999752044678, "y": 18.998432159423828, "dataset": "y"}, {"x": 7.269999980926514, "y": 18.114521026611328, "dataset": "y"}, {"x": 7.28000020980835, "y": 16.496797561645508, "dataset": "y"}, {"x": 7.2900004386901855, "y": 18.50583839416504, "dataset": "y"}, {"x": 7.300000190734863, "y": 17.939476013183594, "dataset": "y"}, {"x": 7.310000419616699, "y": 17.016151428222656, "dataset": "y"}, {"x": 7.320000171661377, "y": 17.347291946411133, "dataset": "y"}, {"x": 7.330000400543213, "y": 18.175424575805664, "dataset": "y"}, {"x": 7.340000152587891, "y": 15.850178718566895, "dataset": "y"}, {"x": 7.350000381469727, "y": 18.81064796447754, "dataset": "y"}, {"x": 7.360000133514404, "y": 16.822790145874023, "dataset": "y"}, {"x": 7.37000036239624, "y": 16.01814842224121, "dataset": "y"}, {"x": 7.380000114440918, "y": 16.50201988220215, "dataset": "y"}, {"x": 7.390000343322754, "y": 18.369138717651367, "dataset": "y"}, {"x": 7.400000095367432, "y": 17.12234115600586, "dataset": "y"}, {"x": 7.410000324249268, "y": 18.906604766845703, "dataset": "y"}, {"x": 7.420000076293945, "y": 15.948103904724121, "dataset": "y"}, {"x": 7.430000305175781, "y": 19.142196655273438, "dataset": "y"}, {"x": 7.440000057220459, "y": 18.853797912597656, "dataset": "y"}, {"x": 7.450000286102295, "y": 16.300893783569336, "dataset": "y"}, {"x": 7.460000038146973, "y": 16.979480743408203, "dataset": "y"}, {"x": 7.470000267028809, "y": 18.596799850463867, "dataset": "y"}, {"x": 7.480000019073486, "y": 18.660419464111328, "dataset": "y"}, {"x": 7.490000247955322, "y": 17.943708419799805, "dataset": "y"}, {"x": 7.5, "y": 16.910253524780273, "dataset": "y"}, {"x": 7.510000228881836, "y": 17.176443099975586, "dataset": "y"}, {"x": 7.519999980926514, "y": 17.76988410949707, "dataset": "y"}, {"x": 7.53000020980835, "y": 18.561498641967773, "dataset": "y"}, {"x": 7.539999961853027, "y": 17.954891204833984, "dataset": "y"}, {"x": 7.550000190734863, "y": 19.195432662963867, "dataset": "y"}, {"x": 7.559999942779541, "y": 17.54800796508789, "dataset": "y"}, {"x": 7.570000171661377, "y": 17.119455337524414, "dataset": "y"}, {"x": 7.579999923706055, "y": 17.30137825012207, "dataset": "y"}, {"x": 7.590000152587891, "y": 18.112539291381836, "dataset": "y"}, {"x": 7.599999904632568, "y": 18.11016845703125, "dataset": "y"}, {"x": 7.610000133514404, "y": 17.704389572143555, "dataset": "y"}, {"x": 7.619999885559082, "y": 19.389516830444336, "dataset": "y"}, {"x": 7.630000114440918, "y": 17.531360626220703, "dataset": "y"}, {"x": 7.639999866485596, "y": 18.665788650512695, "dataset": "y"}, {"x": 7.650000095367432, "y": 18.136016845703125, "dataset": "y"}, {"x": 7.659999847412109, "y": 18.11422348022461, "dataset": "y"}, {"x": 7.670000076293945, "y": 18.10892105102539, "dataset": "y"}, {"x": 7.679999828338623, "y": 19.280765533447266, "dataset": "y"}, {"x": 7.690000057220459, "y": 19.250761032104492, "dataset": "y"}, {"x": 7.699999809265137, "y": 17.119415283203125, "dataset": "y"}, {"x": 7.710000038146973, "y": 17.440998077392578, "dataset": "y"}, {"x": 7.71999979019165, "y": 17.825010299682617, "dataset": "y"}, {"x": 7.730000019073486, "y": 19.806819915771484, "dataset": "y"}, {"x": 7.739999771118164, "y": 17.233137130737305, "dataset": "y"}, {"x": 7.75, "y": 18.70694923400879, "dataset": "y"}, {"x": 7.760000228881836, "y": 18.429960250854492, "dataset": "y"}, {"x": 7.770000457763672, "y": 17.611099243164062, "dataset": "y"}, {"x": 7.78000020980835, "y": 17.986865997314453, "dataset": "y"}, {"x": 7.7900004386901855, "y": 18.830623626708984, "dataset": "y"}, {"x": 7.800000190734863, "y": 18.417987823486328, "dataset": "y"}, {"x": 7.810000419616699, "y": 17.977542877197266, "dataset": "y"}, {"x": 7.820000171661377, "y": 19.11511993408203, "dataset": "y"}, {"x": 7.830000400543213, "y": 18.222293853759766, "dataset": "y"}, {"x": 7.840000152587891, "y": 19.154605865478516, "dataset": "y"}, {"x": 7.850000381469727, "y": 17.245803833007812, "dataset": "y"}, {"x": 7.860000133514404, "y": 18.895252227783203, "dataset": "y"}, {"x": 7.87000036239624, "y": 17.992645263671875, "dataset": "y"}, {"x": 7.880000114440918, "y": 17.38774299621582, "dataset": "y"}, {"x": 7.890000343322754, "y": 18.050987243652344, "dataset": "y"}, {"x": 7.900000095367432, "y": 16.980913162231445, "dataset": "y"}, {"x": 7.910000324249268, "y": 18.120771408081055, "dataset": "y"}, {"x": 7.920000076293945, "y": 18.40897560119629, "dataset": "y"}, {"x": 7.930000305175781, "y": 19.862735748291016, "dataset": "y"}, {"x": 7.940000057220459, "y": 19.5631103515625, "dataset": "y"}, {"x": 7.950000286102295, "y": 19.31365203857422, "dataset": "y"}, {"x": 7.960000038146973, "y": 19.650901794433594, "dataset": "y"}, {"x": 7.970000267028809, "y": 19.001115798950195, "dataset": "y"}, {"x": 7.980000019073486, "y": 20.33740997314453, "dataset": "y"}, {"x": 7.990000247955322, "y": 19.86085319519043, "dataset": "y"}, {"x": 8.0, "y": 20.28282928466797, "dataset": "y"}, {"x": 8.010000228881836, "y": 19.00649070739746, "dataset": "y"}, {"x": 8.020000457763672, "y": 19.453367233276367, "dataset": "y"}, {"x": 8.029999732971191, "y": 19.888259887695312, "dataset": "y"}, {"x": 8.039999961853027, "y": 20.00456428527832, "dataset": "y"}, {"x": 8.050000190734863, "y": 20.506887435913086, "dataset": "y"}, {"x": 8.0600004196167, "y": 19.602237701416016, "dataset": "y"}, {"x": 8.069999694824219, "y": 17.126201629638672, "dataset": "y"}, {"x": 8.079999923706055, "y": 18.877683639526367, "dataset": "y"}, {"x": 8.09000015258789, "y": 19.172914505004883, "dataset": "y"}, {"x": 8.100000381469727, "y": 18.655925750732422, "dataset": "y"}, {"x": 8.109999656677246, "y": 19.524370193481445, "dataset": "y"}, {"x": 8.119999885559082, "y": 19.162004470825195, "dataset": "y"}, {"x": 8.130000114440918, "y": 18.85146713256836, "dataset": "y"}, {"x": 8.140000343322754, "y": 19.217065811157227, "dataset": "y"}, {"x": 8.149999618530273, "y": 18.302907943725586, "dataset": "y"}, {"x": 8.15999984741211, "y": 18.3172550201416, "dataset": "y"}, {"x": 8.170000076293945, "y": 19.02840805053711, "dataset": "y"}, {"x": 8.180000305175781, "y": 20.646860122680664, "dataset": "y"}, {"x": 8.1899995803833, "y": 20.70028305053711, "dataset": "y"}, {"x": 8.199999809265137, "y": 18.34310531616211, "dataset": "y"}, {"x": 8.210000038146973, "y": 17.32609748840332, "dataset": "y"}, {"x": 8.220000267028809, "y": 20.82653045654297, "dataset": "y"}, {"x": 8.229999542236328, "y": 18.840280532836914, "dataset": "y"}, {"x": 8.239999771118164, "y": 20.988048553466797, "dataset": "y"}, {"x": 8.25, "y": 20.418258666992188, "dataset": "y"}, {"x": 8.260000228881836, "y": 18.861509323120117, "dataset": "y"}, {"x": 8.269999504089355, "y": 18.70110511779785, "dataset": "y"}, {"x": 8.279999732971191, "y": 20.041271209716797, "dataset": "y"}, {"x": 8.289999961853027, "y": 19.826412200927734, "dataset": "y"}, {"x": 8.300000190734863, "y": 18.964628219604492, "dataset": "y"}, {"x": 8.309999465942383, "y": 17.87398338317871, "dataset": "y"}, {"x": 8.319999694824219, "y": 19.3486328125, "dataset": "y"}, {"x": 8.329999923706055, "y": 19.23950958251953, "dataset": "y"}, {"x": 8.34000015258789, "y": 20.301122665405273, "dataset": "y"}, {"x": 8.34999942779541, "y": 17.84716796875, "dataset": "y"}, {"x": 8.359999656677246, "y": 20.629573822021484, "dataset": "y"}, {"x": 8.369999885559082, "y": 18.52888298034668, "dataset": "y"}, {"x": 8.380000114440918, "y": 20.541303634643555, "dataset": "y"}, {"x": 8.389999389648438, "y": 19.42123794555664, "dataset": "y"}, {"x": 8.399999618530273, "y": 20.791542053222656, "dataset": "y"}, {"x": 8.40999984741211, "y": 20.373498916625977, "dataset": "y"}, {"x": 8.420000076293945, "y": 17.801286697387695, "dataset": "y"}, {"x": 8.429999351501465, "y": 20.160383224487305, "dataset": "y"}, {"x": 8.4399995803833, "y": 20.970151901245117, "dataset": "y"}, {"x": 8.449999809265137, "y": 21.267181396484375, "dataset": "y"}, {"x": 8.460000038146973, "y": 19.065122604370117, "dataset": "y"}, {"x": 8.469999313354492, "y": 18.73565101623535, "dataset": "y"}, {"x": 8.479999542236328, "y": 18.653465270996094, "dataset": "y"}, {"x": 8.489999771118164, "y": 21.017375946044922, "dataset": "y"}, {"x": 8.5, "y": 22.190540313720703, "dataset": "y"}, {"x": 8.50999927520752, "y": 20.073766708374023, "dataset": "y"}, {"x": 8.519999504089355, "y": 21.136150360107422, "dataset": "y"}, {"x": 8.529999732971191, "y": 22.357070922851562, "dataset": "y"}, {"x": 8.539999961853027, "y": 21.069931030273438, "dataset": "y"}, {"x": 8.549999237060547, "y": 21.679149627685547, "dataset": "y"}, {"x": 8.5600004196167, "y": 19.912748336791992, "dataset": "y"}, {"x": 8.570000648498535, "y": 21.8294677734375, "dataset": "y"}, {"x": 8.580000877380371, "y": 20.293546676635742, "dataset": "y"}, {"x": 8.59000015258789, "y": 19.267284393310547, "dataset": "y"}, {"x": 8.600000381469727, "y": 21.187824249267578, "dataset": "y"}, {"x": 8.610000610351562, "y": 20.3210506439209, "dataset": "y"}, {"x": 8.620000839233398, "y": 20.374391555786133, "dataset": "y"}, {"x": 8.630000114440918, "y": 20.54169273376465, "dataset": "y"}, {"x": 8.640000343322754, "y": 19.494327545166016, "dataset": "y"}, {"x": 8.65000057220459, "y": 20.544200897216797, "dataset": "y"}, {"x": 8.660000801086426, "y": 20.132944107055664, "dataset": "y"}, {"x": 8.670000076293945, "y": 20.313806533813477, "dataset": "y"}, {"x": 8.680000305175781, "y": 22.40542984008789, "dataset": "y"}, {"x": 8.690000534057617, "y": 20.09201431274414, "dataset": "y"}, {"x": 8.700000762939453, "y": 23.233957290649414, "dataset": "y"}, {"x": 8.710000038146973, "y": 20.640790939331055, "dataset": "y"}, {"x": 8.720000267028809, "y": 18.756174087524414, "dataset": "y"}, {"x": 8.730000495910645, "y": 19.85460662841797, "dataset": "y"}, {"x": 8.74000072479248, "y": 19.82121467590332, "dataset": "y"}, {"x": 8.75, "y": 21.09383201599121, "dataset": "y"}, {"x": 8.760000228881836, "y": 19.799053192138672, "dataset": "y"}, {"x": 8.770000457763672, "y": 20.724546432495117, "dataset": "y"}, {"x": 8.780000686645508, "y": 21.522335052490234, "dataset": "y"}, {"x": 8.789999961853027, "y": 20.27549934387207, "dataset": "y"}, {"x": 8.800000190734863, "y": 20.584468841552734, "dataset": "y"}, {"x": 8.8100004196167, "y": 20.82784652709961, "dataset": "y"}, {"x": 8.820000648498535, "y": 20.01303482055664, "dataset": "y"}, {"x": 8.829999923706055, "y": 20.69964599609375, "dataset": "y"}, {"x": 8.84000015258789, "y": 21.181007385253906, "dataset": "y"}, {"x": 8.850000381469727, "y": 18.835128784179688, "dataset": "y"}, {"x": 8.860000610351562, "y": 19.26925277709961, "dataset": "y"}, {"x": 8.869999885559082, "y": 20.74319839477539, "dataset": "y"}, {"x": 8.880000114440918, "y": 21.199167251586914, "dataset": "y"}, {"x": 8.890000343322754, "y": 19.778514862060547, "dataset": "y"}, {"x": 8.90000057220459, "y": 21.38155746459961, "dataset": "y"}, {"x": 8.90999984741211, "y": 20.91136360168457, "dataset": "y"}, {"x": 8.920000076293945, "y": 20.027055740356445, "dataset": "y"}, {"x": 8.930000305175781, "y": 21.303735733032227, "dataset": "y"}, {"x": 8.940000534057617, "y": 19.985963821411133, "dataset": "y"}, {"x": 8.949999809265137, "y": 21.097644805908203, "dataset": "y"}, {"x": 8.960000038146973, "y": 22.129953384399414, "dataset": "y"}, {"x": 8.970000267028809, "y": 20.892745971679688, "dataset": "y"}, {"x": 8.980000495910645, "y": 19.65569496154785, "dataset": "y"}, {"x": 8.989999771118164, "y": 20.57842445373535, "dataset": "y"}, {"x": 9.0, "y": 21.689565658569336, "dataset": "y"}, {"x": 9.010000228881836, "y": 21.901004791259766, "dataset": "y"}, {"x": 9.020000457763672, "y": 22.17287826538086, "dataset": "y"}, {"x": 9.029999732971191, "y": 22.0883846282959, "dataset": "y"}, {"x": 9.039999961853027, "y": 19.289554595947266, "dataset": "y"}, {"x": 9.050000190734863, "y": 22.69803810119629, "dataset": "y"}, {"x": 9.0600004196167, "y": 21.711828231811523, "dataset": "y"}, {"x": 9.069999694824219, "y": 21.75019073486328, "dataset": "y"}, {"x": 9.079999923706055, "y": 20.24047088623047, "dataset": "y"}, {"x": 9.09000015258789, "y": 21.82596206665039, "dataset": "y"}, {"x": 9.100000381469727, "y": 22.727853775024414, "dataset": "y"}, {"x": 9.109999656677246, "y": 22.03186798095703, "dataset": "y"}, {"x": 9.119999885559082, "y": 21.60354232788086, "dataset": "y"}, {"x": 9.130000114440918, "y": 20.426944732666016, "dataset": "y"}, {"x": 9.140000343322754, "y": 21.452322006225586, "dataset": "y"}, {"x": 9.149999618530273, "y": 20.56204605102539, "dataset": "y"}, {"x": 9.15999984741211, "y": 20.700380325317383, "dataset": "y"}, {"x": 9.170000076293945, "y": 21.435884475708008, "dataset": "y"}, {"x": 9.180000305175781, "y": 20.393266677856445, "dataset": "y"}, {"x": 9.1899995803833, "y": 20.782649993896484, "dataset": "y"}, {"x": 9.199999809265137, "y": 22.296113967895508, "dataset": "y"}, {"x": 9.210000038146973, "y": 20.57615852355957, "dataset": "y"}, {"x": 9.220000267028809, "y": 22.183502197265625, "dataset": "y"}, {"x": 9.229999542236328, "y": 23.014080047607422, "dataset": "y"}, {"x": 9.239999771118164, "y": 21.530750274658203, "dataset": "y"}, {"x": 9.25, "y": 23.190338134765625, "dataset": "y"}, {"x": 9.260000228881836, "y": 20.808412551879883, "dataset": "y"}, {"x": 9.269999504089355, "y": 20.63238525390625, "dataset": "y"}, {"x": 9.279999732971191, "y": 20.754894256591797, "dataset": "y"}, {"x": 9.289999961853027, "y": 22.130382537841797, "dataset": "y"}, {"x": 9.300000190734863, "y": 21.369815826416016, "dataset": "y"}, {"x": 9.309999465942383, "y": 22.105804443359375, "dataset": "y"}, {"x": 9.319999694824219, "y": 21.131027221679688, "dataset": "y"}, {"x": 9.329999923706055, "y": 21.085651397705078, "dataset": "y"}, {"x": 9.34000015258789, "y": 22.31005096435547, "dataset": "y"}, {"x": 9.34999942779541, "y": 21.46257972717285, "dataset": "y"}, {"x": 9.359999656677246, "y": 22.623857498168945, "dataset": "y"}, {"x": 9.369999885559082, "y": 21.114139556884766, "dataset": "y"}, {"x": 9.380000114440918, "y": 21.316110610961914, "dataset": "y"}, {"x": 9.389999389648438, "y": 22.489707946777344, "dataset": "y"}, {"x": 9.399999618530273, "y": 23.31666374206543, "dataset": "y"}, {"x": 9.40999984741211, "y": 21.012691497802734, "dataset": "y"}, {"x": 9.420000076293945, "y": 23.123348236083984, "dataset": "y"}, {"x": 9.429999351501465, "y": 21.737794876098633, "dataset": "y"}, {"x": 9.4399995803833, "y": 21.462318420410156, "dataset": "y"}, {"x": 9.449999809265137, "y": 21.00870132446289, "dataset": "y"}, {"x": 9.460000038146973, "y": 23.180391311645508, "dataset": "y"}, {"x": 9.469999313354492, "y": 22.53056526184082, "dataset": "y"}, {"x": 9.479999542236328, "y": 22.012426376342773, "dataset": "y"}, {"x": 9.489999771118164, "y": 22.221771240234375, "dataset": "y"}, {"x": 9.5, "y": 23.1160831451416, "dataset": "y"}, {"x": 9.50999927520752, "y": 23.091787338256836, "dataset": "y"}, {"x": 9.520000457763672, "y": 22.845745086669922, "dataset": "y"}, {"x": 9.530000686645508, "y": 22.275390625, "dataset": "y"}, {"x": 9.540000915527344, "y": 20.815677642822266, "dataset": "y"}, {"x": 9.550000190734863, "y": 20.401357650756836, "dataset": "y"}, {"x": 9.5600004196167, "y": 23.398147583007812, "dataset": "y"}, {"x": 9.570000648498535, "y": 22.656017303466797, "dataset": "y"}, {"x": 9.580000877380371, "y": 21.202613830566406, "dataset": "y"}, {"x": 9.59000015258789, "y": 21.040502548217773, "dataset": "y"}, {"x": 9.600000381469727, "y": 22.774595260620117, "dataset": "y"}, {"x": 9.610000610351562, "y": 21.075830459594727, "dataset": "y"}, {"x": 9.620000839233398, "y": 22.00583839416504, "dataset": "y"}, {"x": 9.630000114440918, "y": 22.214662551879883, "dataset": "y"}, {"x": 9.640000343322754, "y": 22.765480041503906, "dataset": "y"}, {"x": 9.65000057220459, "y": 22.161470413208008, "dataset": "y"}, {"x": 9.660000801086426, "y": 22.485679626464844, "dataset": "y"}, {"x": 9.670000076293945, "y": 22.204782485961914, "dataset": "y"}, {"x": 9.680000305175781, "y": 21.702035903930664, "dataset": "y"}, {"x": 9.690000534057617, "y": 21.95334243774414, "dataset": "y"}, {"x": 9.700000762939453, "y": 23.805238723754883, "dataset": "y"}, {"x": 9.710000038146973, "y": 20.98301124572754, "dataset": "y"}, {"x": 9.720000267028809, "y": 23.00604248046875, "dataset": "y"}, {"x": 9.730000495910645, "y": 22.591188430786133, "dataset": "y"}, {"x": 9.74000072479248, "y": 22.469348907470703, "dataset": "y"}, {"x": 9.75, "y": 21.544231414794922, "dataset": "y"}, {"x": 9.760000228881836, "y": 22.19978904724121, "dataset": "y"}, {"x": 9.770000457763672, "y": 21.26484489440918, "dataset": "y"}, {"x": 9.780000686645508, "y": 21.94086456298828, "dataset": "y"}, {"x": 9.789999961853027, "y": 26.84507942199707, "dataset": "y"}, {"x": 9.800000190734863, "y": 21.813278198242188, "dataset": "y"}, {"x": 9.8100004196167, "y": 22.674081802368164, "dataset": "y"}, {"x": 9.820000648498535, "y": 24.204008102416992, "dataset": "y"}, {"x": 9.829999923706055, "y": 21.7921085357666, "dataset": "y"}, {"x": 9.84000015258789, "y": 21.29490089416504, "dataset": "y"}, {"x": 9.850000381469727, "y": 23.173242568969727, "dataset": "y"}, {"x": 9.860000610351562, "y": 23.612424850463867, "dataset": "y"}, {"x": 9.869999885559082, "y": 22.020111083984375, "dataset": "y"}, {"x": 9.880000114440918, "y": 23.322038650512695, "dataset": "y"}, {"x": 9.890000343322754, "y": 21.85222053527832, "dataset": "y"}, {"x": 9.90000057220459, "y": 22.64323616027832, "dataset": "y"}, {"x": 9.90999984741211, "y": 22.180339813232422, "dataset": "y"}, {"x": 9.920000076293945, "y": 23.54372215270996, "dataset": "y"}, {"x": 9.930000305175781, "y": 23.5893611907959, "dataset": "y"}, {"x": 9.9399995803833, "y": 21.60552215576172, "dataset": "y"}, {"x": 9.949999809265137, "y": 22.87590789794922, "dataset": "y"}, {"x": 9.960000038146973, "y": 23.60823631286621, "dataset": "y"}, {"x": 9.970000267028809, "y": 22.012765884399414, "dataset": "y"}, {"x": 9.979999542236328, "y": 23.484987258911133, "dataset": "y"}, {"x": 9.989999771118164, "y": 23.1391544342041, "dataset": "y"}, {"x": 0.0, "y": 5.670185565948486, "dataset": "y* (computational)"}, {"x": 0.009999999776482582, "y": 3.1059937477111816, "dataset": "y* (computational)"}, {"x": 0.019999999552965164, "y": 8.125316619873047, "dataset": "y* (computational)"}, {"x": 0.029999999329447746, "y": 5.766298770904541, "dataset": "y* (computational)"}, {"x": 0.03999999910593033, "y": 3.6301212310791016, "dataset": "y* (computational)"}, {"x": 0.04999999701976776, "y": 5.4901628494262695, "dataset": "y* (computational)"}, {"x": 0.05999999865889549, "y": 7.347347736358643, "dataset": "y* (computational)"}, {"x": 0.07000000029802322, "y": 5.486670017242432, "dataset": "y* (computational)"}, {"x": 0.07999999821186066, "y": 3.1138105392456055, "dataset": "y* (computational)"}, {"x": 0.08999999612569809, "y": 6.850489616394043, "dataset": "y* (computational)"}, {"x": 0.09999999403953552, "y": 2.260957717895508, "dataset": "y* (computational)"}, {"x": 0.10999999940395355, "y": 5.989190101623535, "dataset": "y* (computational)"}, {"x": 0.11999999731779099, "y": 4.962820529937744, "dataset": "y* (computational)"}, {"x": 0.12999999523162842, "y": 2.9961156845092773, "dataset": "y* (computational)"}, {"x": 0.14000000059604645, "y": 5.028415679931641, "dataset": "y* (computational)"}, {"x": 0.14999999105930328, "y": 5.063535213470459, "dataset": "y* (computational)"}, {"x": 0.1599999964237213, "y": 5.615023136138916, "dataset": "y* (computational)"}, {"x": 0.17000000178813934, "y": 10.240102767944336, "dataset": "y* (computational)"}, {"x": 0.17999999225139618, "y": 6.129136085510254, "dataset": "y* (computational)"}, {"x": 0.1899999976158142, "y": 8.2357177734375, "dataset": "y* (computational)"}, {"x": 0.19999998807907104, "y": 6.223330974578857, "dataset": "y* (computational)"}, {"x": 0.20999999344348907, "y": 9.828694343566895, "dataset": "y* (computational)"}, {"x": 0.2199999988079071, "y": 6.897046089172363, "dataset": "y* (computational)"}, {"x": 0.22999998927116394, "y": 2.4114813804626465, "dataset": "y* (computational)"}, {"x": 0.23999999463558197, "y": 6.393145561218262, "dataset": "y* (computational)"}, {"x": 0.25, "y": 7.805751800537109, "dataset": "y* (computational)"}, {"x": 0.25999999046325684, "y": 4.349102020263672, "dataset": "y* (computational)"}, {"x": 0.26999998092651367, "y": 5.617960453033447, "dataset": "y* (computational)"}, {"x": 0.2800000011920929, "y": 3.3154773712158203, "dataset": "y* (computational)"}, {"x": 0.28999999165534973, "y": 6.537974834442139, "dataset": "y* (computational)"}, {"x": 0.29999998211860657, "y": 4.822342872619629, "dataset": "y* (computational)"}, {"x": 0.3100000023841858, "y": 6.33327054977417, "dataset": "y* (computational)"}, {"x": 0.3199999928474426, "y": 4.6932291984558105, "dataset": "y* (computational)"}, {"x": 0.32999998331069946, "y": 8.062459945678711, "dataset": "y* (computational)"}, {"x": 0.3400000035762787, "y": 3.113734722137451, "dataset": "y* (computational)"}, {"x": 0.3499999940395355, "y": 7.678752899169922, "dataset": "y* (computational)"}, {"x": 0.35999998450279236, "y": 6.238239288330078, "dataset": "y* (computational)"}, {"x": 0.3700000047683716, "y": 1.1470890045166016, "dataset": "y* (computational)"}, {"x": 0.3799999952316284, "y": 5.731924533843994, "dataset": "y* (computational)"}, {"x": 0.38999998569488525, "y": 9.790548324584961, "dataset": "y* (computational)"}, {"x": 0.4000000059604645, "y": 8.714302062988281, "dataset": "y* (computational)"}, {"x": 0.4099999964237213, "y": 10.164177894592285, "dataset": "y* (computational)"}, {"x": 0.42000001668930054, "y": 7.004757404327393, "dataset": "y* (computational)"}, {"x": 0.4300000071525574, "y": 4.707385063171387, "dataset": "y* (computational)"}, {"x": 0.4399999976158142, "y": 9.90182113647461, "dataset": "y* (computational)"}, {"x": 0.45000001788139343, "y": 4.004482746124268, "dataset": "y* (computational)"}, {"x": 0.46000000834465027, "y": 6.18136739730835, "dataset": "y* (computational)"}, {"x": 0.4699999988079071, "y": 4.595040321350098, "dataset": "y* (computational)"}, {"x": 0.47999998927116394, "y": 5.647463798522949, "dataset": "y* (computational)"}, {"x": 0.4899999797344208, "y": 3.924867868423462, "dataset": "y* (computational)"}, {"x": 0.5, "y": 10.01063346862793, "dataset": "y* (computational)"}, {"x": 0.5099999904632568, "y": 5.696595191955566, "dataset": "y* (computational)"}, {"x": 0.5199999809265137, "y": 4.88808536529541, "dataset": "y* (computational)"}, {"x": 0.5299999713897705, "y": 7.3248372077941895, "dataset": "y* (computational)"}, {"x": 0.5399999618530273, "y": 4.8462815284729, "dataset": "y* (computational)"}, {"x": 0.550000011920929, "y": 5.13958740234375, "dataset": "y* (computational)"}, {"x": 0.5600000023841858, "y": 4.434411525726318, "dataset": "y* (computational)"}, {"x": 0.5699999928474426, "y": 7.83744478225708, "dataset": "y* (computational)"}, {"x": 0.5799999833106995, "y": 8.079903602600098, "dataset": "y* (computational)"}, {"x": 0.5899999737739563, "y": 6.706184387207031, "dataset": "y* (computational)"}, {"x": 0.6000000238418579, "y": 4.258933067321777, "dataset": "y* (computational)"}, {"x": 0.6100000143051147, "y": 5.945323467254639, "dataset": "y* (computational)"}, {"x": 0.6200000047683716, "y": 9.088581085205078, "dataset": "y* (computational)"}, {"x": 0.6299999952316284, "y": 4.394901275634766, "dataset": "y* (computational)"}, {"x": 0.6399999856948853, "y": 5.648285865783691, "dataset": "y* (computational)"}, {"x": 0.6499999761581421, "y": 5.226235866546631, "dataset": "y* (computational)"}, {"x": 0.6599999666213989, "y": 13.584877967834473, "dataset": "y* (computational)"}, {"x": 0.6699999570846558, "y": 9.355384826660156, "dataset": "y* (computational)"}, {"x": 0.6800000071525574, "y": 3.3854429721832275, "dataset": "y* (computational)"}, {"x": 0.6899999976158142, "y": 5.776785373687744, "dataset": "y* (computational)"}, {"x": 0.699999988079071, "y": 6.178755760192871, "dataset": "y* (computational)"}, {"x": 0.7099999785423279, "y": 7.214061260223389, "dataset": "y* (computational)"}, {"x": 0.7200000286102295, "y": 5.486523628234863, "dataset": "y* (computational)"}, {"x": 0.7300000190734863, "y": 8.274792671203613, "dataset": "y* (computational)"}, {"x": 0.7400000095367432, "y": 4.998188018798828, "dataset": "y* (computational)"}, {"x": 0.75, "y": 6.052103042602539, "dataset": "y* (computational)"}, {"x": 0.7600000500679016, "y": 7.105949401855469, "dataset": "y* (computational)"}, {"x": 0.7700000405311584, "y": 4.5201311111450195, "dataset": "y* (computational)"}, {"x": 0.7800000309944153, "y": 2.9328722953796387, "dataset": "y* (computational)"}, {"x": 0.7900000214576721, "y": 10.23060131072998, "dataset": "y* (computational)"}, {"x": 0.800000011920929, "y": 11.182571411132812, "dataset": "y* (computational)"}, {"x": 0.8100000023841858, "y": 5.8458075523376465, "dataset": "y* (computational)"}, {"x": 0.8199999928474426, "y": 5.643830299377441, "dataset": "y* (computational)"}, {"x": 0.8299999833106995, "y": 5.132660865783691, "dataset": "y* (computational)"}, {"x": 0.8400000333786011, "y": 9.793527603149414, "dataset": "y* (computational)"}, {"x": 0.8500000238418579, "y": 8.044071197509766, "dataset": "y* (computational)"}, {"x": 0.8600000143051147, "y": 8.341500282287598, "dataset": "y* (computational)"}, {"x": 0.8700000047683716, "y": 14.88612174987793, "dataset": "y* (computational)"}, {"x": 0.8799999952316284, "y": 6.0782318115234375, "dataset": "y* (computational)"}, {"x": 0.8899999856948853, "y": 5.1080169677734375, "dataset": "y* (computational)"}, {"x": 0.8999999761581421, "y": 2.8736705780029297, "dataset": "y* (computational)"}, {"x": 0.9099999666213989, "y": 11.700826644897461, "dataset": "y* (computational)"}, {"x": 0.9200000166893005, "y": 8.035615921020508, "dataset": "y* (computational)"}, {"x": 0.9300000071525574, "y": 7.436515808105469, "dataset": "y* (computational)"}, {"x": 0.9399999976158142, "y": 4.137481212615967, "dataset": "y* (computational)"}, {"x": 0.949999988079071, "y": 9.615440368652344, "dataset": "y* (computational)"}, {"x": 0.9599999785423279, "y": 7.47245454788208, "dataset": "y* (computational)"}, {"x": 0.9699999690055847, "y": 4.05844783782959, "dataset": "y* (computational)"}, {"x": 0.9799999594688416, "y": 9.401086807250977, "dataset": "y* (computational)"}, {"x": 0.9899999499320984, "y": 4.985559463500977, "dataset": "y* (computational)"}, {"x": 1.0, "y": 7.179440498352051, "dataset": "y* (computational)"}, {"x": 1.0099999904632568, "y": 2.9997920989990234, "dataset": "y* (computational)"}, {"x": 1.0199999809265137, "y": 10.711382865905762, "dataset": "y* (computational)"}, {"x": 1.0299999713897705, "y": 3.4018144607543945, "dataset": "y* (computational)"}, {"x": 1.0399999618530273, "y": 6.402455806732178, "dataset": "y* (computational)"}, {"x": 1.0499999523162842, "y": 10.801855087280273, "dataset": "y* (computational)"}, {"x": 1.059999942779541, "y": 6.6278839111328125, "dataset": "y* (computational)"}, {"x": 1.0699999332427979, "y": 8.809233665466309, "dataset": "y* (computational)"}, {"x": 1.0799999237060547, "y": 9.837970733642578, "dataset": "y* (computational)"}, {"x": 1.0899999141693115, "y": 6.675589084625244, "dataset": "y* (computational)"}, {"x": 1.0999999046325684, "y": 8.432522773742676, "dataset": "y* (computational)"}, {"x": 1.1100000143051147, "y": 7.817347526550293, "dataset": "y* (computational)"}, {"x": 1.1200000047683716, "y": 12.677391052246094, "dataset": "y* (computational)"}, {"x": 1.1299999952316284, "y": 9.225727081298828, "dataset": "y* (computational)"}, {"x": 1.1399999856948853, "y": 4.942983627319336, "dataset": "y* (computational)"}, {"x": 1.149999976158142, "y": 8.749260902404785, "dataset": "y* (computational)"}, {"x": 1.159999966621399, "y": 9.168245315551758, "dataset": "y* (computational)"}, {"x": 1.1699999570846558, "y": 7.689533710479736, "dataset": "y* (computational)"}, {"x": 1.1799999475479126, "y": 5.777792453765869, "dataset": "y* (computational)"}, {"x": 1.190000057220459, "y": 11.797494888305664, "dataset": "y* (computational)"}, {"x": 1.2000000476837158, "y": 11.487640380859375, "dataset": "y* (computational)"}, {"x": 1.2100000381469727, "y": 6.793010234832764, "dataset": "y* (computational)"}, {"x": 1.2200000286102295, "y": 10.756959915161133, "dataset": "y* (computational)"}, {"x": 1.2300000190734863, "y": 5.85493803024292, "dataset": "y* (computational)"}, {"x": 1.2400000095367432, "y": 9.985518455505371, "dataset": "y* (computational)"}, {"x": 1.25, "y": 7.398616313934326, "dataset": "y* (computational)"}, {"x": 1.2599999904632568, "y": 7.423247337341309, "dataset": "y* (computational)"}, {"x": 1.2700001001358032, "y": 6.724954128265381, "dataset": "y* (computational)"}, {"x": 1.2799999713897705, "y": 7.408815383911133, "dataset": "y* (computational)"}, {"x": 1.2899999618530273, "y": 4.494958877563477, "dataset": "y* (computational)"}, {"x": 1.2999999523162842, "y": 5.593457221984863, "dataset": "y* (computational)"}, {"x": 1.309999942779541, "y": 7.860434532165527, "dataset": "y* (computational)"}, {"x": 1.3199999332427979, "y": 5.05665922164917, "dataset": "y* (computational)"}, {"x": 1.3299999237060547, "y": 6.090723514556885, "dataset": "y* (computational)"}, {"x": 1.3399999141693115, "y": 7.834191799163818, "dataset": "y* (computational)"}, {"x": 1.350000023841858, "y": 9.982805252075195, "dataset": "y* (computational)"}, {"x": 1.3600000143051147, "y": 4.497203350067139, "dataset": "y* (computational)"}, {"x": 1.3700000047683716, "y": 7.517868518829346, "dataset": "y* (computational)"}, {"x": 1.3799999952316284, "y": 7.5904388427734375, "dataset": "y* (computational)"}, {"x": 1.3899999856948853, "y": 8.473237037658691, "dataset": "y* (computational)"}, {"x": 1.399999976158142, "y": 7.056894302368164, "dataset": "y* (computational)"}, {"x": 1.409999966621399, "y": 4.7016072273254395, "dataset": "y* (computational)"}, {"x": 1.4199999570846558, "y": 4.673275947570801, "dataset": "y* (computational)"}, {"x": 1.4300000667572021, "y": 6.05940055847168, "dataset": "y* (computational)"}, {"x": 1.440000057220459, "y": 5.935361862182617, "dataset": "y* (computational)"}, {"x": 1.4500000476837158, "y": 10.178548812866211, "dataset": "y* (computational)"}, {"x": 1.4600000381469727, "y": 9.221542358398438, "dataset": "y* (computational)"}, {"x": 1.4700000286102295, "y": 8.973501205444336, "dataset": "y* (computational)"}, {"x": 1.4800000190734863, "y": 6.899753093719482, "dataset": "y* (computational)"}, {"x": 1.4900000095367432, "y": 7.408512592315674, "dataset": "y* (computational)"}, {"x": 1.5, "y": 7.921130657196045, "dataset": "y* (computational)"}, {"x": 1.5100001096725464, "y": 11.529534339904785, "dataset": "y* (computational)"}, {"x": 1.5199999809265137, "y": 4.837428569793701, "dataset": "y* (computational)"}, {"x": 1.5299999713897705, "y": 7.46098518371582, "dataset": "y* (computational)"}, {"x": 1.5399999618530273, "y": 6.474237442016602, "dataset": "y* (computational)"}, {"x": 1.5499999523162842, "y": 13.845988273620605, "dataset": "y* (computational)"}, {"x": 1.559999942779541, "y": 8.679372787475586, "dataset": "y* (computational)"}, {"x": 1.5699999332427979, "y": 2.910614013671875, "dataset": "y* (computational)"}, {"x": 1.5799999237060547, "y": 7.747531414031982, "dataset": "y* (computational)"}, {"x": 1.590000033378601, "y": 8.936193466186523, "dataset": "y* (computational)"}, {"x": 1.600000023841858, "y": 8.086541175842285, "dataset": "y* (computational)"}, {"x": 1.6100000143051147, "y": 10.972652435302734, "dataset": "y* (computational)"}, {"x": 1.6200000047683716, "y": 0.7512664794921875, "dataset": "y* (computational)"}, {"x": 1.6299999952316284, "y": 8.342174530029297, "dataset": "y* (computational)"}, {"x": 1.6399999856948853, "y": 8.56900405883789, "dataset": "y* (computational)"}, {"x": 1.649999976158142, "y": 9.14629077911377, "dataset": "y* (computational)"}, {"x": 1.659999966621399, "y": 6.661962509155273, "dataset": "y* (computational)"}, {"x": 1.6700000762939453, "y": 7.030867099761963, "dataset": "y* (computational)"}, {"x": 1.6799999475479126, "y": 6.5518059730529785, "dataset": "y* (computational)"}, {"x": 1.6899999380111694, "y": 10.473287582397461, "dataset": "y* (computational)"}, {"x": 1.6999999284744263, "y": 9.219365119934082, "dataset": "y* (computational)"}, {"x": 1.709999918937683, "y": 7.512310028076172, "dataset": "y* (computational)"}, {"x": 1.71999990940094, "y": 8.087504386901855, "dataset": "y* (computational)"}, {"x": 1.7299998998641968, "y": 6.505970001220703, "dataset": "y* (computational)"}, {"x": 1.7399998903274536, "y": 6.792301177978516, "dataset": "y* (computational)"}, {"x": 1.75, "y": 4.81637716293335, "dataset": "y* (computational)"}, {"x": 1.7599999904632568, "y": 11.747543334960938, "dataset": "y* (computational)"}, {"x": 1.7699999809265137, "y": 5.766554832458496, "dataset": "y* (computational)"}, {"x": 1.7799999713897705, "y": 16.79711151123047, "dataset": "y* (computational)"}, {"x": 1.7899999618530273, "y": 12.056123733520508, "dataset": "y* (computational)"}, {"x": 1.7999999523162842, "y": 7.578146934509277, "dataset": "y* (computational)"}, {"x": 1.809999942779541, "y": 7.322761535644531, "dataset": "y* (computational)"}, {"x": 1.8199999332427979, "y": 3.945584774017334, "dataset": "y* (computational)"}, {"x": 1.8300000429153442, "y": 5.657680034637451, "dataset": "y* (computational)"}, {"x": 1.840000033378601, "y": 11.159543991088867, "dataset": "y* (computational)"}, {"x": 1.850000023841858, "y": 6.521559238433838, "dataset": "y* (computational)"}, {"x": 1.8600000143051147, "y": 13.269372940063477, "dataset": "y* (computational)"}, {"x": 1.8700000047683716, "y": 4.827467918395996, "dataset": "y* (computational)"}, {"x": 1.8799999952316284, "y": 10.444551467895508, "dataset": "y* (computational)"}, {"x": 1.8899999856948853, "y": 10.391918182373047, "dataset": "y* (computational)"}, {"x": 1.899999976158142, "y": 11.75262451171875, "dataset": "y* (computational)"}, {"x": 1.9100000858306885, "y": 9.189090728759766, "dataset": "y* (computational)"}, {"x": 1.9199999570846558, "y": 9.133716583251953, "dataset": "y* (computational)"}, {"x": 1.9299999475479126, "y": 6.6009931564331055, "dataset": "y* (computational)"}, {"x": 1.9399999380111694, "y": 7.7878241539001465, "dataset": "y* (computational)"}, {"x": 1.9499999284744263, "y": 11.893028259277344, "dataset": "y* (computational)"}, {"x": 1.959999918937683, "y": 6.868181228637695, "dataset": "y* (computational)"}, {"x": 1.96999990940094, "y": 7.96232795715332, "dataset": "y* (computational)"}, {"x": 1.9799998998641968, "y": 3.988802671432495, "dataset": "y* (computational)"}, {"x": 1.9900000095367432, "y": 9.167970657348633, "dataset": "y* (computational)"}, {"x": 2.0, "y": 8.998830795288086, "dataset": "y* (computational)"}, {"x": 2.009999990463257, "y": 9.7047758102417, "dataset": "y* (computational)"}, {"x": 2.0199999809265137, "y": 7.230510234832764, "dataset": "y* (computational)"}, {"x": 2.0299999713897705, "y": 11.656330108642578, "dataset": "y* (computational)"}, {"x": 2.0399999618530273, "y": 6.446822166442871, "dataset": "y* (computational)"}, {"x": 2.049999952316284, "y": 9.676227569580078, "dataset": "y* (computational)"}, {"x": 2.059999942779541, "y": 7.208972454071045, "dataset": "y* (computational)"}, {"x": 2.069999933242798, "y": 8.036628723144531, "dataset": "y* (computational)"}, {"x": 2.0799999237060547, "y": 12.201982498168945, "dataset": "y* (computational)"}, {"x": 2.0899999141693115, "y": 10.750837326049805, "dataset": "y* (computational)"}, {"x": 2.0999999046325684, "y": 5.8252482414245605, "dataset": "y* (computational)"}, {"x": 2.109999895095825, "y": 9.131189346313477, "dataset": "y* (computational)"}, {"x": 2.119999885559082, "y": 6.411351680755615, "dataset": "y* (computational)"}, {"x": 2.129999876022339, "y": 6.303224563598633, "dataset": "y* (computational)"}, {"x": 2.1399998664855957, "y": 10.287331581115723, "dataset": "y* (computational)"}, {"x": 2.1499998569488525, "y": 6.0815205574035645, "dataset": "y* (computational)"}, {"x": 2.1600000858306885, "y": 10.012571334838867, "dataset": "y* (computational)"}, {"x": 2.1700000762939453, "y": 9.799607276916504, "dataset": "y* (computational)"}, {"x": 2.180000066757202, "y": 5.576435089111328, "dataset": "y* (computational)"}, {"x": 2.190000057220459, "y": 8.327128410339355, "dataset": "y* (computational)"}, {"x": 2.200000047683716, "y": 7.247400283813477, "dataset": "y* (computational)"}, {"x": 2.2100000381469727, "y": 9.986054420471191, "dataset": "y* (computational)"}, {"x": 2.2200000286102295, "y": 12.587896347045898, "dataset": "y* (computational)"}, {"x": 2.2300000190734863, "y": 6.352182388305664, "dataset": "y* (computational)"}, {"x": 2.240000009536743, "y": 8.06821060180664, "dataset": "y* (computational)"}, {"x": 2.25, "y": 6.348580837249756, "dataset": "y* (computational)"}, {"x": 2.259999990463257, "y": 9.119175910949707, "dataset": "y* (computational)"}, {"x": 2.2699999809265137, "y": 8.90962028503418, "dataset": "y* (computational)"}, {"x": 2.2799999713897705, "y": 11.656900405883789, "dataset": "y* (computational)"}, {"x": 2.2899999618530273, "y": 9.49216365814209, "dataset": "y* (computational)"}, {"x": 2.299999952316284, "y": 10.415172576904297, "dataset": "y* (computational)"}, {"x": 2.309999942779541, "y": 12.282453536987305, "dataset": "y* (computational)"}, {"x": 2.319999933242798, "y": 8.592611312866211, "dataset": "y* (computational)"}, {"x": 2.3299999237060547, "y": 8.323141098022461, "dataset": "y* (computational)"}, {"x": 2.3399999141693115, "y": 12.686820983886719, "dataset": "y* (computational)"}, {"x": 2.3499999046325684, "y": 9.567768096923828, "dataset": "y* (computational)"}, {"x": 2.359999895095825, "y": 5.496034622192383, "dataset": "y* (computational)"}, {"x": 2.369999885559082, "y": 10.198638916015625, "dataset": "y* (computational)"}, {"x": 2.379999876022339, "y": 8.6604585647583, "dataset": "y* (computational)"}, {"x": 2.3899998664855957, "y": 13.368168830871582, "dataset": "y* (computational)"}, {"x": 2.4000000953674316, "y": 6.363126277923584, "dataset": "y* (computational)"}, {"x": 2.4100000858306885, "y": 11.633015632629395, "dataset": "y* (computational)"}, {"x": 2.4200000762939453, "y": 9.241188049316406, "dataset": "y* (computational)"}, {"x": 2.430000066757202, "y": 15.335603713989258, "dataset": "y* (computational)"}, {"x": 2.440000057220459, "y": 10.070085525512695, "dataset": "y* (computational)"}, {"x": 2.450000047683716, "y": 9.032421112060547, "dataset": "y* (computational)"}, {"x": 2.4600000381469727, "y": 8.806438446044922, "dataset": "y* (computational)"}, {"x": 2.4700000286102295, "y": 9.659409523010254, "dataset": "y* (computational)"}, {"x": 2.4800000190734863, "y": 8.429402351379395, "dataset": "y* (computational)"}, {"x": 2.490000009536743, "y": 11.218887329101562, "dataset": "y* (computational)"}, {"x": 2.5, "y": 9.64554214477539, "dataset": "y* (computational)"}, {"x": 2.509999990463257, "y": 10.358177185058594, "dataset": "y* (computational)"}, {"x": 2.5199999809265137, "y": 9.71906566619873, "dataset": "y* (computational)"}, {"x": 2.5299999713897705, "y": 14.417591094970703, "dataset": "y* (computational)"}, {"x": 2.5399999618530273, "y": 10.260675430297852, "dataset": "y* (computational)"}, {"x": 2.549999952316284, "y": 9.529069900512695, "dataset": "y* (computational)"}, {"x": 2.559999942779541, "y": 10.072023391723633, "dataset": "y* (computational)"}, {"x": 2.569999933242798, "y": 12.795554161071777, "dataset": "y* (computational)"}, {"x": 2.5799999237060547, "y": 10.599004745483398, "dataset": "y* (computational)"}, {"x": 2.5899999141693115, "y": 15.253399848937988, "dataset": "y* (computational)"}, {"x": 2.5999999046325684, "y": 11.045133590698242, "dataset": "y* (computational)"}, {"x": 2.609999895095825, "y": 11.37116527557373, "dataset": "y* (computational)"}, {"x": 2.619999885559082, "y": 8.420621871948242, "dataset": "y* (computational)"}, {"x": 2.629999876022339, "y": 11.19196605682373, "dataset": "y* (computational)"}, {"x": 2.640000104904175, "y": 13.516193389892578, "dataset": "y* (computational)"}, {"x": 2.6500000953674316, "y": 6.907716751098633, "dataset": "y* (computational)"}, {"x": 2.6600000858306885, "y": 9.598665237426758, "dataset": "y* (computational)"}, {"x": 2.6700000762939453, "y": 12.806434631347656, "dataset": "y* (computational)"}, {"x": 2.680000066757202, "y": 13.038865089416504, "dataset": "y* (computational)"}, {"x": 2.690000057220459, "y": 11.21731185913086, "dataset": "y* (computational)"}, {"x": 2.700000047683716, "y": 11.652512550354004, "dataset": "y* (computational)"}, {"x": 2.7100000381469727, "y": 8.533537864685059, "dataset": "y* (computational)"}, {"x": 2.7200000286102295, "y": 10.112683296203613, "dataset": "y* (computational)"}, {"x": 2.7300000190734863, "y": 9.122526168823242, "dataset": "y* (computational)"}, {"x": 2.740000009536743, "y": 7.7217488288879395, "dataset": "y* (computational)"}, {"x": 2.75, "y": 4.76357364654541, "dataset": "y* (computational)"}, {"x": 2.759999990463257, "y": 9.250688552856445, "dataset": "y* (computational)"}, {"x": 2.7699999809265137, "y": 10.47549819946289, "dataset": "y* (computational)"}, {"x": 2.7799999713897705, "y": 12.894806861877441, "dataset": "y* (computational)"}, {"x": 2.7899999618530273, "y": 11.0150785446167, "dataset": "y* (computational)"}, {"x": 2.799999952316284, "y": 11.560158729553223, "dataset": "y* (computational)"}, {"x": 2.809999942779541, "y": 13.084874153137207, "dataset": "y* (computational)"}, {"x": 2.819999933242798, "y": 9.838297843933105, "dataset": "y* (computational)"}, {"x": 2.8299999237060547, "y": 10.800539016723633, "dataset": "y* (computational)"}, {"x": 2.8399999141693115, "y": 15.683816909790039, "dataset": "y* (computational)"}, {"x": 2.8499999046325684, "y": 12.371625900268555, "dataset": "y* (computational)"}, {"x": 2.859999895095825, "y": 12.614835739135742, "dataset": "y* (computational)"}, {"x": 2.869999885559082, "y": 12.661786079406738, "dataset": "y* (computational)"}, {"x": 2.880000114440918, "y": 7.353433609008789, "dataset": "y* (computational)"}, {"x": 2.890000104904175, "y": 15.706583023071289, "dataset": "y* (computational)"}, {"x": 2.9000000953674316, "y": 10.130139350891113, "dataset": "y* (computational)"}, {"x": 2.9100000858306885, "y": 7.255224227905273, "dataset": "y* (computational)"}, {"x": 2.9200000762939453, "y": 14.202326774597168, "dataset": "y* (computational)"}, {"x": 2.930000066757202, "y": 9.23767375946045, "dataset": "y* (computational)"}, {"x": 2.940000057220459, "y": 10.52326774597168, "dataset": "y* (computational)"}, {"x": 2.950000047683716, "y": 7.4844489097595215, "dataset": "y* (computational)"}, {"x": 2.9600000381469727, "y": 7.295078754425049, "dataset": "y* (computational)"}, {"x": 2.9700000286102295, "y": 12.615638732910156, "dataset": "y* (computational)"}, {"x": 2.9800000190734863, "y": 10.480957984924316, "dataset": "y* (computational)"}, {"x": 2.990000009536743, "y": 10.156041145324707, "dataset": "y* (computational)"}, {"x": 3.0, "y": 13.29794692993164, "dataset": "y* (computational)"}, {"x": 3.009999990463257, "y": 12.545886993408203, "dataset": "y* (computational)"}, {"x": 3.0199999809265137, "y": 10.724621772766113, "dataset": "y* (computational)"}, {"x": 3.0299999713897705, "y": 8.29722785949707, "dataset": "y* (computational)"}, {"x": 3.0399999618530273, "y": 9.116242408752441, "dataset": "y* (computational)"}, {"x": 3.049999952316284, "y": 13.603340148925781, "dataset": "y* (computational)"}, {"x": 3.059999942779541, "y": 14.355548858642578, "dataset": "y* (computational)"}, {"x": 3.069999933242798, "y": 11.842184066772461, "dataset": "y* (computational)"}, {"x": 3.0799999237060547, "y": 12.046463012695312, "dataset": "y* (computational)"}, {"x": 3.0899999141693115, "y": 8.357393264770508, "dataset": "y* (computational)"}, {"x": 3.0999999046325684, "y": 14.758578300476074, "dataset": "y* (computational)"}, {"x": 3.109999895095825, "y": 9.009005546569824, "dataset": "y* (computational)"}, {"x": 3.119999885559082, "y": 11.859212875366211, "dataset": "y* (computational)"}, {"x": 3.129999876022339, "y": 10.526987075805664, "dataset": "y* (computational)"}, {"x": 3.1399998664855957, "y": 9.282583236694336, "dataset": "y* (computational)"}, {"x": 3.1499998569488525, "y": 12.863842010498047, "dataset": "y* (computational)"}, {"x": 3.1599998474121094, "y": 12.628084182739258, "dataset": "y* (computational)"}, {"x": 3.169999837875366, "y": 7.1307244300842285, "dataset": "y* (computational)"}, {"x": 3.179999828338623, "y": 7.816722869873047, "dataset": "y* (computational)"}, {"x": 3.18999981880188, "y": 13.19788932800293, "dataset": "y* (computational)"}, {"x": 3.200000047683716, "y": 13.782547950744629, "dataset": "y* (computational)"}, {"x": 3.2100000381469727, "y": 11.429630279541016, "dataset": "y* (computational)"}, {"x": 3.2200000286102295, "y": 13.005367279052734, "dataset": "y* (computational)"}, {"x": 3.2300000190734863, "y": 11.596714973449707, "dataset": "y* (computational)"}, {"x": 3.240000009536743, "y": 10.374064445495605, "dataset": "y* (computational)"}, {"x": 3.25, "y": 12.221403121948242, "dataset": "y* (computational)"}, {"x": 3.259999990463257, "y": 10.974266052246094, "dataset": "y* (computational)"}, {"x": 3.2699999809265137, "y": 13.316832542419434, "dataset": "y* (computational)"}, {"x": 3.2799999713897705, "y": 10.964826583862305, "dataset": "y* (computational)"}, {"x": 3.2899999618530273, "y": 13.190366744995117, "dataset": "y* (computational)"}, {"x": 3.299999952316284, "y": 12.377832412719727, "dataset": "y* (computational)"}, {"x": 3.309999942779541, "y": 14.661094665527344, "dataset": "y* (computational)"}, {"x": 3.319999933242798, "y": 13.082660675048828, "dataset": "y* (computational)"}, {"x": 3.3299999237060547, "y": 10.9153470993042, "dataset": "y* (computational)"}, {"x": 3.3399999141693115, "y": 12.273207664489746, "dataset": "y* (computational)"}, {"x": 3.3499999046325684, "y": 7.605432510375977, "dataset": "y* (computational)"}, {"x": 3.359999895095825, "y": 9.136873245239258, "dataset": "y* (computational)"}, {"x": 3.369999885559082, "y": 11.538241386413574, "dataset": "y* (computational)"}, {"x": 3.379999876022339, "y": 7.167158126831055, "dataset": "y* (computational)"}, {"x": 3.3899998664855957, "y": 14.97592544555664, "dataset": "y* (computational)"}, {"x": 3.3999998569488525, "y": 12.242691040039062, "dataset": "y* (computational)"}, {"x": 3.4099998474121094, "y": 11.484516143798828, "dataset": "y* (computational)"}, {"x": 3.419999837875366, "y": 11.101712226867676, "dataset": "y* (computational)"}, {"x": 3.429999828338623, "y": 11.591289520263672, "dataset": "y* (computational)"}, {"x": 3.440000057220459, "y": 7.602818965911865, "dataset": "y* (computational)"}, {"x": 3.450000047683716, "y": 10.51075553894043, "dataset": "y* (computational)"}, {"x": 3.4600000381469727, "y": 9.78498649597168, "dataset": "y* (computational)"}, {"x": 3.4700000286102295, "y": 11.282110214233398, "dataset": "y* (computational)"}, {"x": 3.4800000190734863, "y": 13.505392074584961, "dataset": "y* (computational)"}, {"x": 3.490000009536743, "y": 10.687870979309082, "dataset": "y* (computational)"}, {"x": 3.5, "y": 12.159828186035156, "dataset": "y* (computational)"}, {"x": 3.509999990463257, "y": 10.710915565490723, "dataset": "y* (computational)"}, {"x": 3.5199999809265137, "y": 14.002342224121094, "dataset": "y* (computational)"}, {"x": 3.5299999713897705, "y": 15.280908584594727, "dataset": "y* (computational)"}, {"x": 3.5399999618530273, "y": 10.566397666931152, "dataset": "y* (computational)"}, {"x": 3.549999952316284, "y": 10.102543830871582, "dataset": "y* (computational)"}, {"x": 3.559999942779541, "y": 12.171196937561035, "dataset": "y* (computational)"}, {"x": 3.569999933242798, "y": 9.921740531921387, "dataset": "y* (computational)"}, {"x": 3.5799999237060547, "y": 15.314434051513672, "dataset": "y* (computational)"}, {"x": 3.5899999141693115, "y": 12.539591789245605, "dataset": "y* (computational)"}, {"x": 3.5999999046325684, "y": 11.51512336730957, "dataset": "y* (computational)"}, {"x": 3.609999895095825, "y": 8.953680038452148, "dataset": "y* (computational)"}, {"x": 3.619999885559082, "y": 8.10796070098877, "dataset": "y* (computational)"}, {"x": 3.629999876022339, "y": 7.673435211181641, "dataset": "y* (computational)"}, {"x": 3.6399998664855957, "y": 13.004220008850098, "dataset": "y* (computational)"}, {"x": 3.6499998569488525, "y": 13.71856689453125, "dataset": "y* (computational)"}, {"x": 3.6599998474121094, "y": 7.013115406036377, "dataset": "y* (computational)"}, {"x": 3.669999837875366, "y": 6.917389869689941, "dataset": "y* (computational)"}, {"x": 3.680000066757202, "y": 12.956953048706055, "dataset": "y* (computational)"}, {"x": 3.690000057220459, "y": 13.734270095825195, "dataset": "y* (computational)"}, {"x": 3.700000047683716, "y": 11.394449234008789, "dataset": "y* (computational)"}, {"x": 3.7100000381469727, "y": 9.58315658569336, "dataset": "y* (computational)"}, {"x": 3.7200000286102295, "y": 13.673699378967285, "dataset": "y* (computational)"}, {"x": 3.7300000190734863, "y": 15.654447555541992, "dataset": "y* (computational)"}, {"x": 3.740000009536743, "y": 7.932455539703369, "dataset": "y* (computational)"}, {"x": 3.75, "y": 6.3999152183532715, "dataset": "y* (computational)"}, {"x": 3.759999990463257, "y": 13.003732681274414, "dataset": "y* (computational)"}, {"x": 3.7699999809265137, "y": 14.15546989440918, "dataset": "y* (computational)"}, {"x": 3.7799999713897705, "y": 14.65408706665039, "dataset": "y* (computational)"}, {"x": 3.7899999618530273, "y": 12.408971786499023, "dataset": "y* (computational)"}, {"x": 3.799999952316284, "y": 16.64324188232422, "dataset": "y* (computational)"}, {"x": 3.809999942779541, "y": 11.158342361450195, "dataset": "y* (computational)"}, {"x": 3.819999933242798, "y": 13.257434844970703, "dataset": "y* (computational)"}, {"x": 3.8299999237060547, "y": 12.211100578308105, "dataset": "y* (computational)"}, {"x": 3.8399999141693115, "y": 16.367332458496094, "dataset": "y* (computational)"}, {"x": 3.8499999046325684, "y": 16.578903198242188, "dataset": "y* (computational)"}, {"x": 3.859999895095825, "y": 13.749879837036133, "dataset": "y* (computational)"}, {"x": 3.869999885559082, "y": 14.007863998413086, "dataset": "y* (computational)"}, {"x": 3.879999876022339, "y": 9.36225700378418, "dataset": "y* (computational)"}, {"x": 3.8899998664855957, "y": 10.497465133666992, "dataset": "y* (computational)"}, {"x": 3.8999998569488525, "y": 11.970073699951172, "dataset": "y* (computational)"}, {"x": 3.9099998474121094, "y": 13.086511611938477, "dataset": "y* (computational)"}, {"x": 3.9200000762939453, "y": 10.666939735412598, "dataset": "y* (computational)"}, {"x": 3.930000066757202, "y": 13.628802299499512, "dataset": "y* (computational)"}, {"x": 3.940000057220459, "y": 9.873698234558105, "dataset": "y* (computational)"}, {"x": 3.950000047683716, "y": 13.104077339172363, "dataset": "y* (computational)"}, {"x": 3.9600000381469727, "y": 15.23379898071289, "dataset": "y* (computational)"}, {"x": 3.9700000286102295, "y": 11.111601829528809, "dataset": "y* (computational)"}, {"x": 3.9800000190734863, "y": 13.090383529663086, "dataset": "y* (computational)"}, {"x": 3.990000009536743, "y": 14.293733596801758, "dataset": "y* (computational)"}, {"x": 4.0, "y": 15.016595840454102, "dataset": "y* (computational)"}, {"x": 4.010000228881836, "y": 9.192879676818848, "dataset": "y* (computational)"}, {"x": 4.019999980926514, "y": 13.837621688842773, "dataset": "y* (computational)"}, {"x": 4.03000020980835, "y": 12.697020530700684, "dataset": "y* (computational)"}, {"x": 4.039999961853027, "y": 12.565629959106445, "dataset": "y* (computational)"}, {"x": 4.050000190734863, "y": 12.762718200683594, "dataset": "y* (computational)"}, {"x": 4.059999942779541, "y": 11.954492568969727, "dataset": "y* (computational)"}, {"x": 4.070000171661377, "y": 14.295027732849121, "dataset": "y* (computational)"}, {"x": 4.079999923706055, "y": 13.691507339477539, "dataset": "y* (computational)"}, {"x": 4.090000152587891, "y": 16.477052688598633, "dataset": "y* (computational)"}, {"x": 4.099999904632568, "y": 13.748896598815918, "dataset": "y* (computational)"}, {"x": 4.110000133514404, "y": 12.676047325134277, "dataset": "y* (computational)"}, {"x": 4.119999885559082, "y": 14.312844276428223, "dataset": "y* (computational)"}, {"x": 4.130000114440918, "y": 10.857467651367188, "dataset": "y* (computational)"}, {"x": 4.139999866485596, "y": 10.904380798339844, "dataset": "y* (computational)"}, {"x": 4.150000095367432, "y": 13.941642761230469, "dataset": "y* (computational)"}, {"x": 4.159999847412109, "y": 8.47697639465332, "dataset": "y* (computational)"}, {"x": 4.170000076293945, "y": 15.482612609863281, "dataset": "y* (computational)"}, {"x": 4.179999828338623, "y": 11.447833061218262, "dataset": "y* (computational)"}, {"x": 4.190000057220459, "y": 14.00635051727295, "dataset": "y* (computational)"}, {"x": 4.199999809265137, "y": 12.592665672302246, "dataset": "y* (computational)"}, {"x": 4.210000038146973, "y": 12.291171073913574, "dataset": "y* (computational)"}, {"x": 4.21999979019165, "y": 16.044105529785156, "dataset": "y* (computational)"}, {"x": 4.230000019073486, "y": 12.005000114440918, "dataset": "y* (computational)"}, {"x": 4.239999771118164, "y": 12.39500617980957, "dataset": "y* (computational)"}, {"x": 4.25, "y": 12.10953140258789, "dataset": "y* (computational)"}, {"x": 4.259999752044678, "y": 10.107423782348633, "dataset": "y* (computational)"}, {"x": 4.269999980926514, "y": 15.492509841918945, "dataset": "y* (computational)"}, {"x": 4.279999732971191, "y": 15.535222053527832, "dataset": "y* (computational)"}, {"x": 4.289999961853027, "y": 11.448457717895508, "dataset": "y* (computational)"}, {"x": 4.299999713897705, "y": 11.534628868103027, "dataset": "y* (computational)"}, {"x": 4.309999942779541, "y": 13.615976333618164, "dataset": "y* (computational)"}, {"x": 4.320000171661377, "y": 12.463788032531738, "dataset": "y* (computational)"}, {"x": 4.330000400543213, "y": 16.75285530090332, "dataset": "y* (computational)"}, {"x": 4.340000152587891, "y": 12.643003463745117, "dataset": "y* (computational)"}, {"x": 4.350000381469727, "y": 16.718280792236328, "dataset": "y* (computational)"}, {"x": 4.360000133514404, "y": 15.222780227661133, "dataset": "y* (computational)"}, {"x": 4.37000036239624, "y": 16.42493438720703, "dataset": "y* (computational)"}, {"x": 4.380000114440918, "y": 9.51994514465332, "dataset": "y* (computational)"}, {"x": 4.390000343322754, "y": 13.076112747192383, "dataset": "y* (computational)"}, {"x": 4.400000095367432, "y": 14.14981460571289, "dataset": "y* (computational)"}, {"x": 4.410000324249268, "y": 12.664645195007324, "dataset": "y* (computational)"}, {"x": 4.420000076293945, "y": 16.32784652709961, "dataset": "y* (computational)"}, {"x": 4.430000305175781, "y": 12.218657493591309, "dataset": "y* (computational)"}, {"x": 4.440000057220459, "y": 15.019537925720215, "dataset": "y* (computational)"}, {"x": 4.450000286102295, "y": 16.838153839111328, "dataset": "y* (computational)"}, {"x": 4.460000038146973, "y": 13.157408714294434, "dataset": "y* (computational)"}, {"x": 4.470000267028809, "y": 11.03851318359375, "dataset": "y* (computational)"}, {"x": 4.480000019073486, "y": 14.678815841674805, "dataset": "y* (computational)"}, {"x": 4.490000247955322, "y": 7.380941867828369, "dataset": "y* (computational)"}, {"x": 4.5, "y": 13.166765213012695, "dataset": "y* (computational)"}, {"x": 4.510000228881836, "y": 12.773391723632812, "dataset": "y* (computational)"}, {"x": 4.519999980926514, "y": 12.950759887695312, "dataset": "y* (computational)"}, {"x": 4.53000020980835, "y": 13.795714378356934, "dataset": "y* (computational)"}, {"x": 4.539999961853027, "y": 15.756240844726562, "dataset": "y* (computational)"}, {"x": 4.550000190734863, "y": 14.797930717468262, "dataset": "y* (computational)"}, {"x": 4.559999942779541, "y": 12.14011001586914, "dataset": "y* (computational)"}, {"x": 4.570000171661377, "y": 12.832550048828125, "dataset": "y* (computational)"}, {"x": 4.579999923706055, "y": 14.892345428466797, "dataset": "y* (computational)"}, {"x": 4.590000152587891, "y": 13.947338104248047, "dataset": "y* (computational)"}, {"x": 4.599999904632568, "y": 17.660112380981445, "dataset": "y* (computational)"}, {"x": 4.610000133514404, "y": 15.722731590270996, "dataset": "y* (computational)"}, {"x": 4.619999885559082, "y": 17.365234375, "dataset": "y* (computational)"}, {"x": 4.630000114440918, "y": 13.263069152832031, "dataset": "y* (computational)"}, {"x": 4.639999866485596, "y": 15.548498153686523, "dataset": "y* (computational)"}, {"x": 4.650000095367432, "y": 15.123146057128906, "dataset": "y* (computational)"}, {"x": 4.659999847412109, "y": 12.081149101257324, "dataset": "y* (computational)"}, {"x": 4.670000076293945, "y": 14.028900146484375, "dataset": "y* (computational)"}, {"x": 4.679999828338623, "y": 16.30384635925293, "dataset": "y* (computational)"}, {"x": 4.690000057220459, "y": 12.720980644226074, "dataset": "y* (computational)"}, {"x": 4.699999809265137, "y": 12.45268440246582, "dataset": "y* (computational)"}, {"x": 4.710000038146973, "y": 14.124187469482422, "dataset": "y* (computational)"}, {"x": 4.71999979019165, "y": 13.72572135925293, "dataset": "y* (computational)"}, {"x": 4.730000019073486, "y": 14.739749908447266, "dataset": "y* (computational)"}, {"x": 4.739999771118164, "y": 14.977126121520996, "dataset": "y* (computational)"}, {"x": 4.75, "y": 17.89059829711914, "dataset": "y* (computational)"}, {"x": 4.759999752044678, "y": 13.998160362243652, "dataset": "y* (computational)"}, {"x": 4.769999980926514, "y": 12.350491523742676, "dataset": "y* (computational)"}, {"x": 4.779999732971191, "y": 12.773429870605469, "dataset": "y* (computational)"}, {"x": 4.789999961853027, "y": 13.424338340759277, "dataset": "y* (computational)"}, {"x": 4.800000190734863, "y": 12.03550910949707, "dataset": "y* (computational)"}, {"x": 4.810000419616699, "y": 17.160377502441406, "dataset": "y* (computational)"}, {"x": 4.820000171661377, "y": 16.256017684936523, "dataset": "y* (computational)"}, {"x": 4.830000400543213, "y": 18.704578399658203, "dataset": "y* (computational)"}, {"x": 4.840000152587891, "y": 12.680678367614746, "dataset": "y* (computational)"}, {"x": 4.850000381469727, "y": 16.571096420288086, "dataset": "y* (computational)"}, {"x": 4.860000133514404, "y": 17.182212829589844, "dataset": "y* (computational)"}, {"x": 4.87000036239624, "y": 17.75076675415039, "dataset": "y* (computational)"}, {"x": 4.880000114440918, "y": 17.493865966796875, "dataset": "y* (computational)"}, {"x": 4.890000343322754, "y": 22.14533233642578, "dataset": "y* (computational)"}, {"x": 4.900000095367432, "y": 14.15740966796875, "dataset": "y* (computational)"}, {"x": 4.910000324249268, "y": 15.055055618286133, "dataset": "y* (computational)"}, {"x": 4.920000076293945, "y": 13.705391883850098, "dataset": "y* (computational)"}, {"x": 4.930000305175781, "y": 11.480472564697266, "dataset": "y* (computational)"}, {"x": 4.940000057220459, "y": 12.576473236083984, "dataset": "y* (computational)"}, {"x": 4.950000286102295, "y": 13.10543441772461, "dataset": "y* (computational)"}, {"x": 4.960000038146973, "y": 14.755658149719238, "dataset": "y* (computational)"}, {"x": 4.970000267028809, "y": 11.863656997680664, "dataset": "y* (computational)"}, {"x": 4.980000019073486, "y": 14.953950881958008, "dataset": "y* (computational)"}, {"x": 4.990000247955322, "y": 14.42444133758545, "dataset": "y* (computational)"}, {"x": 5.0, "y": 11.457518577575684, "dataset": "y* (computational)"}, {"x": 5.010000228881836, "y": 16.328943252563477, "dataset": "y* (computational)"}, {"x": 5.019999980926514, "y": 17.317190170288086, "dataset": "y* (computational)"}, {"x": 5.03000020980835, "y": 12.194031715393066, "dataset": "y* (computational)"}, {"x": 5.039999961853027, "y": 19.004322052001953, "dataset": "y* (computational)"}, {"x": 5.050000190734863, "y": 13.633768081665039, "dataset": "y* (computational)"}, {"x": 5.059999942779541, "y": 13.490666389465332, "dataset": "y* (computational)"}, {"x": 5.070000171661377, "y": 13.173667907714844, "dataset": "y* (computational)"}, {"x": 5.079999923706055, "y": 19.32624053955078, "dataset": "y* (computational)"}, {"x": 5.090000152587891, "y": 12.004383087158203, "dataset": "y* (computational)"}, {"x": 5.099999904632568, "y": 15.783151626586914, "dataset": "y* (computational)"}, {"x": 5.110000133514404, "y": 11.870505332946777, "dataset": "y* (computational)"}, {"x": 5.119999885559082, "y": 17.903179168701172, "dataset": "y* (computational)"}, {"x": 5.130000114440918, "y": 14.376842498779297, "dataset": "y* (computational)"}, {"x": 5.139999866485596, "y": 18.519973754882812, "dataset": "y* (computational)"}, {"x": 5.150000095367432, "y": 13.973037719726562, "dataset": "y* (computational)"}, {"x": 5.159999847412109, "y": 12.073128700256348, "dataset": "y* (computational)"}, {"x": 5.170000076293945, "y": 19.62874984741211, "dataset": "y* (computational)"}, {"x": 5.179999828338623, "y": 14.867731094360352, "dataset": "y* (computational)"}, {"x": 5.190000057220459, "y": 10.807482719421387, "dataset": "y* (computational)"}, {"x": 5.199999809265137, "y": 15.263754844665527, "dataset": "y* (computational)"}, {"x": 5.210000038146973, "y": 11.695972442626953, "dataset": "y* (computational)"}, {"x": 5.21999979019165, "y": 18.201282501220703, "dataset": "y* (computational)"}, {"x": 5.230000019073486, "y": 16.113052368164062, "dataset": "y* (computational)"}, {"x": 5.239999771118164, "y": 16.048171997070312, "dataset": "y* (computational)"}, {"x": 5.25, "y": 16.56528663635254, "dataset": "y* (computational)"}, {"x": 5.259999752044678, "y": 14.844568252563477, "dataset": "y* (computational)"}, {"x": 5.269999980926514, "y": 13.646380424499512, "dataset": "y* (computational)"}, {"x": 5.28000020980835, "y": 15.725526809692383, "dataset": "y* (computational)"}, {"x": 5.2900004386901855, "y": 15.823172569274902, "dataset": "y* (computational)"}, {"x": 5.300000190734863, "y": 15.476542472839355, "dataset": "y* (computational)"}, {"x": 5.310000419616699, "y": 14.499937057495117, "dataset": "y* (computational)"}, {"x": 5.320000171661377, "y": 16.721527099609375, "dataset": "y* (computational)"}, {"x": 5.330000400543213, "y": 12.75402545928955, "dataset": "y* (computational)"}, {"x": 5.340000152587891, "y": 13.713530540466309, "dataset": "y* (computational)"}, {"x": 5.350000381469727, "y": 20.36104965209961, "dataset": "y* (computational)"}, {"x": 5.360000133514404, "y": 11.971029281616211, "dataset": "y* (computational)"}, {"x": 5.37000036239624, "y": 18.8164005279541, "dataset": "y* (computational)"}, {"x": 5.380000114440918, "y": 16.673620223999023, "dataset": "y* (computational)"}, {"x": 5.390000343322754, "y": 16.9609317779541, "dataset": "y* (computational)"}, {"x": 5.400000095367432, "y": 16.178939819335938, "dataset": "y* (computational)"}, {"x": 5.410000324249268, "y": 16.091602325439453, "dataset": "y* (computational)"}, {"x": 5.420000076293945, "y": 18.87999725341797, "dataset": "y* (computational)"}, {"x": 5.430000305175781, "y": 14.772960662841797, "dataset": "y* (computational)"}, {"x": 5.440000057220459, "y": 14.036576271057129, "dataset": "y* (computational)"}, {"x": 5.450000286102295, "y": 11.107398986816406, "dataset": "y* (computational)"}, {"x": 5.460000038146973, "y": 17.781700134277344, "dataset": "y* (computational)"}, {"x": 5.470000267028809, "y": 15.6701078414917, "dataset": "y* (computational)"}, {"x": 5.480000019073486, "y": 15.891873359680176, "dataset": "y* (computational)"}, {"x": 5.490000247955322, "y": 10.472354888916016, "dataset": "y* (computational)"}, {"x": 5.5, "y": 17.070205688476562, "dataset": "y* (computational)"}, {"x": 5.510000228881836, "y": 14.281431198120117, "dataset": "y* (computational)"}, {"x": 5.519999980926514, "y": 18.89110565185547, "dataset": "y* (computational)"}, {"x": 5.53000020980835, "y": 13.315372467041016, "dataset": "y* (computational)"}, {"x": 5.539999961853027, "y": 17.045867919921875, "dataset": "y* (computational)"}, {"x": 5.550000190734863, "y": 18.829090118408203, "dataset": "y* (computational)"}, {"x": 5.559999942779541, "y": 13.27000904083252, "dataset": "y* (computational)"}, {"x": 5.570000171661377, "y": 18.471696853637695, "dataset": "y* (computational)"}, {"x": 5.579999923706055, "y": 18.980236053466797, "dataset": "y* (computational)"}, {"x": 5.590000152587891, "y": 15.037333488464355, "dataset": "y* (computational)"}, {"x": 5.599999904632568, "y": 17.624225616455078, "dataset": "y* (computational)"}, {"x": 5.610000133514404, "y": 17.354204177856445, "dataset": "y* (computational)"}, {"x": 5.619999885559082, "y": 10.096088409423828, "dataset": "y* (computational)"}, {"x": 5.630000114440918, "y": 18.502737045288086, "dataset": "y* (computational)"}, {"x": 5.639999866485596, "y": 13.421379089355469, "dataset": "y* (computational)"}, {"x": 5.650000095367432, "y": 13.227361679077148, "dataset": "y* (computational)"}, {"x": 5.659999847412109, "y": 17.028451919555664, "dataset": "y* (computational)"}, {"x": 5.670000076293945, "y": 14.624834060668945, "dataset": "y* (computational)"}, {"x": 5.679999828338623, "y": 15.906699180603027, "dataset": "y* (computational)"}, {"x": 5.690000057220459, "y": 16.40741729736328, "dataset": "y* (computational)"}, {"x": 5.699999809265137, "y": 19.340211868286133, "dataset": "y* (computational)"}, {"x": 5.710000038146973, "y": 18.715084075927734, "dataset": "y* (computational)"}, {"x": 5.71999979019165, "y": 13.527971267700195, "dataset": "y* (computational)"}, {"x": 5.730000019073486, "y": 15.930116653442383, "dataset": "y* (computational)"}, {"x": 5.739999771118164, "y": 17.466552734375, "dataset": "y* (computational)"}, {"x": 5.75, "y": 17.287717819213867, "dataset": "y* (computational)"}, {"x": 5.760000228881836, "y": 17.834285736083984, "dataset": "y* (computational)"}, {"x": 5.770000457763672, "y": 16.498476028442383, "dataset": "y* (computational)"}, {"x": 5.78000020980835, "y": 20.937191009521484, "dataset": "y* (computational)"}, {"x": 5.7900004386901855, "y": 10.929281234741211, "dataset": "y* (computational)"}, {"x": 5.800000190734863, "y": 15.447007179260254, "dataset": "y* (computational)"}, {"x": 5.810000419616699, "y": 13.221541404724121, "dataset": "y* (computational)"}, {"x": 5.820000171661377, "y": 17.473039627075195, "dataset": "y* (computational)"}, {"x": 5.830000400543213, "y": 18.017953872680664, "dataset": "y* (computational)"}, {"x": 5.840000152587891, "y": 14.113384246826172, "dataset": "y* (computational)"}, {"x": 5.850000381469727, "y": 16.296371459960938, "dataset": "y* (computational)"}, {"x": 5.860000133514404, "y": 19.825132369995117, "dataset": "y* (computational)"}, {"x": 5.87000036239624, "y": 16.317766189575195, "dataset": "y* (computational)"}, {"x": 5.880000114440918, "y": 14.72707748413086, "dataset": "y* (computational)"}, {"x": 5.890000343322754, "y": 12.531900405883789, "dataset": "y* (computational)"}, {"x": 5.900000095367432, "y": 16.65936851501465, "dataset": "y* (computational)"}, {"x": 5.910000324249268, "y": 17.894433975219727, "dataset": "y* (computational)"}, {"x": 5.920000076293945, "y": 15.532992362976074, "dataset": "y* (computational)"}, {"x": 5.930000305175781, "y": 21.840063095092773, "dataset": "y* (computational)"}, {"x": 5.940000057220459, "y": 14.256600379943848, "dataset": "y* (computational)"}, {"x": 5.950000286102295, "y": 14.811872482299805, "dataset": "y* (computational)"}, {"x": 5.960000038146973, "y": 20.510845184326172, "dataset": "y* (computational)"}, {"x": 5.970000267028809, "y": 19.20722007751465, "dataset": "y* (computational)"}, {"x": 5.980000019073486, "y": 15.902222633361816, "dataset": "y* (computational)"}, {"x": 5.990000247955322, "y": 14.248551368713379, "dataset": "y* (computational)"}, {"x": 6.0, "y": 13.244799613952637, "dataset": "y* (computational)"}, {"x": 6.010000228881836, "y": 16.5089111328125, "dataset": "y* (computational)"}, {"x": 6.019999980926514, "y": 15.782685279846191, "dataset": "y* (computational)"}, {"x": 6.03000020980835, "y": 12.621990203857422, "dataset": "y* (computational)"}, {"x": 6.039999961853027, "y": 11.38514518737793, "dataset": "y* (computational)"}, {"x": 6.050000190734863, "y": 13.579083442687988, "dataset": "y* (computational)"}, {"x": 6.059999942779541, "y": 19.825462341308594, "dataset": "y* (computational)"}, {"x": 6.070000171661377, "y": 14.194650650024414, "dataset": "y* (computational)"}, {"x": 6.079999923706055, "y": 22.027389526367188, "dataset": "y* (computational)"}, {"x": 6.090000152587891, "y": 12.79699993133545, "dataset": "y* (computational)"}, {"x": 6.099999904632568, "y": 13.613773345947266, "dataset": "y* (computational)"}, {"x": 6.110000133514404, "y": 14.921219825744629, "dataset": "y* (computational)"}, {"x": 6.119999885559082, "y": 19.25263023376465, "dataset": "y* (computational)"}, {"x": 6.130000114440918, "y": 18.633594512939453, "dataset": "y* (computational)"}, {"x": 6.139999866485596, "y": 19.26406478881836, "dataset": "y* (computational)"}, {"x": 6.150000095367432, "y": 16.69211196899414, "dataset": "y* (computational)"}, {"x": 6.159999847412109, "y": 18.720966339111328, "dataset": "y* (computational)"}, {"x": 6.170000076293945, "y": 20.569271087646484, "dataset": "y* (computational)"}, {"x": 6.179999828338623, "y": 21.401813507080078, "dataset": "y* (computational)"}, {"x": 6.190000057220459, "y": 13.403108596801758, "dataset": "y* (computational)"}, {"x": 6.199999809265137, "y": 20.16006088256836, "dataset": "y* (computational)"}, {"x": 6.210000038146973, "y": 13.342222213745117, "dataset": "y* (computational)"}, {"x": 6.21999979019165, "y": 17.2984619140625, "dataset": "y* (computational)"}, {"x": 6.230000019073486, "y": 15.808841705322266, "dataset": "y* (computational)"}, {"x": 6.239999771118164, "y": 17.322620391845703, "dataset": "y* (computational)"}, {"x": 6.25, "y": 13.677836418151855, "dataset": "y* (computational)"}, {"x": 6.259999752044678, "y": 16.9854736328125, "dataset": "y* (computational)"}, {"x": 6.269999980926514, "y": 14.666374206542969, "dataset": "y* (computational)"}, {"x": 6.279999732971191, "y": 23.435089111328125, "dataset": "y* (computational)"}, {"x": 6.289999961853027, "y": 19.927127838134766, "dataset": "y* (computational)"}, {"x": 6.299999713897705, "y": 18.535686492919922, "dataset": "y* (computational)"}, {"x": 6.309999942779541, "y": 20.48700714111328, "dataset": "y* (computational)"}, {"x": 6.320000171661377, "y": 16.681396484375, "dataset": "y* (computational)"}, {"x": 6.330000400543213, "y": 21.797618865966797, "dataset": "y* (computational)"}, {"x": 6.340000152587891, "y": 15.586283683776855, "dataset": "y* (computational)"}, {"x": 6.350000381469727, "y": 15.23438835144043, "dataset": "y* (computational)"}, {"x": 6.360000133514404, "y": 16.21761131286621, "dataset": "y* (computational)"}, {"x": 6.37000036239624, "y": 14.440522193908691, "dataset": "y* (computational)"}, {"x": 6.380000114440918, "y": 18.650808334350586, "dataset": "y* (computational)"}, {"x": 6.390000343322754, "y": 14.726290702819824, "dataset": "y* (computational)"}, {"x": 6.400000095367432, "y": 15.870640754699707, "dataset": "y* (computational)"}, {"x": 6.410000324249268, "y": 13.12774658203125, "dataset": "y* (computational)"}, {"x": 6.420000076293945, "y": 14.906661033630371, "dataset": "y* (computational)"}, {"x": 6.430000305175781, "y": 18.652677536010742, "dataset": "y* (computational)"}, {"x": 6.440000057220459, "y": 15.090856552124023, "dataset": "y* (computational)"}, {"x": 6.450000286102295, "y": 17.197553634643555, "dataset": "y* (computational)"}, {"x": 6.460000038146973, "y": 17.968530654907227, "dataset": "y* (computational)"}, {"x": 6.470000267028809, "y": 15.982307434082031, "dataset": "y* (computational)"}, {"x": 6.480000019073486, "y": 15.398042678833008, "dataset": "y* (computational)"}, {"x": 6.490000247955322, "y": 16.34711456298828, "dataset": "y* (computational)"}, {"x": 6.5, "y": 15.349644660949707, "dataset": "y* (computational)"}, {"x": 6.510000228881836, "y": 22.043697357177734, "dataset": "y* (computational)"}, {"x": 6.519999980926514, "y": 21.444183349609375, "dataset": "y* (computational)"}, {"x": 6.53000020980835, "y": 17.639488220214844, "dataset": "y* (computational)"}, {"x": 6.539999961853027, "y": 17.1519832611084, "dataset": "y* (computational)"}, {"x": 6.550000190734863, "y": 17.630367279052734, "dataset": "y* (computational)"}, {"x": 6.559999942779541, "y": 19.7756290435791, "dataset": "y* (computational)"}, {"x": 6.570000171661377, "y": 14.945307731628418, "dataset": "y* (computational)"}, {"x": 6.579999923706055, "y": 20.865951538085938, "dataset": "y* (computational)"}, {"x": 6.590000152587891, "y": 19.37912368774414, "dataset": "y* (computational)"}, {"x": 6.599999904632568, "y": 13.810068130493164, "dataset": "y* (computational)"}, {"x": 6.610000133514404, "y": 18.513256072998047, "dataset": "y* (computational)"}, {"x": 6.619999885559082, "y": 20.493982315063477, "dataset": "y* (computational)"}, {"x": 6.630000114440918, "y": 21.485855102539062, "dataset": "y* (computational)"}, {"x": 6.639999866485596, "y": 16.727798461914062, "dataset": "y* (computational)"}, {"x": 6.650000095367432, "y": 17.561389923095703, "dataset": "y* (computational)"}, {"x": 6.659999847412109, "y": 17.764389038085938, "dataset": "y* (computational)"}, {"x": 6.670000076293945, "y": 18.34100341796875, "dataset": "y* (computational)"}, {"x": 6.679999828338623, "y": 18.24892234802246, "dataset": "y* (computational)"}, {"x": 6.690000057220459, "y": 19.678186416625977, "dataset": "y* (computational)"}, {"x": 6.699999809265137, "y": 16.800148010253906, "dataset": "y* (computational)"}, {"x": 6.710000038146973, "y": 19.367895126342773, "dataset": "y* (computational)"}, {"x": 6.71999979019165, "y": 18.144023895263672, "dataset": "y* (computational)"}, {"x": 6.730000019073486, "y": 13.648761749267578, "dataset": "y* (computational)"}, {"x": 6.739999771118164, "y": 14.054845809936523, "dataset": "y* (computational)"}, {"x": 6.75, "y": 15.347296714782715, "dataset": "y* (computational)"}, {"x": 6.759999752044678, "y": 17.46640968322754, "dataset": "y* (computational)"}, {"x": 6.769999980926514, "y": 16.838808059692383, "dataset": "y* (computational)"}, {"x": 6.779999732971191, "y": 14.992402076721191, "dataset": "y* (computational)"}, {"x": 6.789999961853027, "y": 17.239574432373047, "dataset": "y* (computational)"}, {"x": 6.800000190734863, "y": 17.822141647338867, "dataset": "y* (computational)"}, {"x": 6.810000419616699, "y": 19.52037239074707, "dataset": "y* (computational)"}, {"x": 6.820000171661377, "y": 21.42379379272461, "dataset": "y* (computational)"}, {"x": 6.830000400543213, "y": 16.010448455810547, "dataset": "y* (computational)"}, {"x": 6.840000152587891, "y": 21.323501586914062, "dataset": "y* (computational)"}, {"x": 6.850000381469727, "y": 19.961868286132812, "dataset": "y* (computational)"}, {"x": 6.860000133514404, "y": 14.828590393066406, "dataset": "y* (computational)"}, {"x": 6.87000036239624, "y": 20.80868148803711, "dataset": "y* (computational)"}, {"x": 6.880000114440918, "y": 20.186513900756836, "dataset": "y* (computational)"}, {"x": 6.890000343322754, "y": 16.440067291259766, "dataset": "y* (computational)"}, {"x": 6.900000095367432, "y": 20.93736457824707, "dataset": "y* (computational)"}, {"x": 6.910000324249268, "y": 19.369186401367188, "dataset": "y* (computational)"}, {"x": 6.920000076293945, "y": 18.043834686279297, "dataset": "y* (computational)"}, {"x": 6.930000305175781, "y": 18.332149505615234, "dataset": "y* (computational)"}, {"x": 6.940000057220459, "y": 23.52073860168457, "dataset": "y* (computational)"}, {"x": 6.950000286102295, "y": 25.510730743408203, "dataset": "y* (computational)"}, {"x": 6.960000038146973, "y": 20.086313247680664, "dataset": "y* (computational)"}, {"x": 6.970000267028809, "y": 19.41572380065918, "dataset": "y* (computational)"}, {"x": 6.980000019073486, "y": 19.837732315063477, "dataset": "y* (computational)"}, {"x": 6.990000247955322, "y": 21.221446990966797, "dataset": "y* (computational)"}, {"x": 7.0, "y": 14.601593017578125, "dataset": "y* (computational)"}, {"x": 7.010000228881836, "y": 15.654624938964844, "dataset": "y* (computational)"}, {"x": 7.019999980926514, "y": 17.596771240234375, "dataset": "y* (computational)"}, {"x": 7.03000020980835, "y": 16.279943466186523, "dataset": "y* (computational)"}, {"x": 7.039999961853027, "y": 22.794586181640625, "dataset": "y* (computational)"}, {"x": 7.050000190734863, "y": 19.05112075805664, "dataset": "y* (computational)"}, {"x": 7.059999942779541, "y": 15.314382553100586, "dataset": "y* (computational)"}, {"x": 7.070000171661377, "y": 20.029579162597656, "dataset": "y* (computational)"}, {"x": 7.079999923706055, "y": 22.71929168701172, "dataset": "y* (computational)"}, {"x": 7.090000152587891, "y": 16.467464447021484, "dataset": "y* (computational)"}, {"x": 7.099999904632568, "y": 19.697269439697266, "dataset": "y* (computational)"}, {"x": 7.110000133514404, "y": 17.411052703857422, "dataset": "y* (computational)"}, {"x": 7.119999885559082, "y": 17.1826171875, "dataset": "y* (computational)"}, {"x": 7.130000114440918, "y": 17.098556518554688, "dataset": "y* (computational)"}, {"x": 7.139999866485596, "y": 19.965190887451172, "dataset": "y* (computational)"}, {"x": 7.150000095367432, "y": 19.711856842041016, "dataset": "y* (computational)"}, {"x": 7.159999847412109, "y": 18.7449951171875, "dataset": "y* (computational)"}, {"x": 7.170000076293945, "y": 16.670085906982422, "dataset": "y* (computational)"}, {"x": 7.179999828338623, "y": 23.032196044921875, "dataset": "y* (computational)"}, {"x": 7.190000057220459, "y": 21.073970794677734, "dataset": "y* (computational)"}, {"x": 7.199999809265137, "y": 24.174663543701172, "dataset": "y* (computational)"}, {"x": 7.210000038146973, "y": 18.010263442993164, "dataset": "y* (computational)"}, {"x": 7.21999979019165, "y": 18.743057250976562, "dataset": "y* (computational)"}, {"x": 7.230000019073486, "y": 17.969594955444336, "dataset": "y* (computational)"}, {"x": 7.239999771118164, "y": 17.873132705688477, "dataset": "y* (computational)"}, {"x": 7.25, "y": 19.51914405822754, "dataset": "y* (computational)"}, {"x": 7.259999752044678, "y": 23.372859954833984, "dataset": "y* (computational)"}, {"x": 7.269999980926514, "y": 21.944168090820312, "dataset": "y* (computational)"}, {"x": 7.28000020980835, "y": 18.38653564453125, "dataset": "y* (computational)"}, {"x": 7.2900004386901855, "y": 18.724748611450195, "dataset": "y* (computational)"}, {"x": 7.300000190734863, "y": 16.995084762573242, "dataset": "y* (computational)"}, {"x": 7.310000419616699, "y": 23.716882705688477, "dataset": "y* (computational)"}, {"x": 7.320000171661377, "y": 22.146514892578125, "dataset": "y* (computational)"}, {"x": 7.330000400543213, "y": 20.416128158569336, "dataset": "y* (computational)"}, {"x": 7.340000152587891, "y": 17.51017951965332, "dataset": "y* (computational)"}, {"x": 7.350000381469727, "y": 20.721343994140625, "dataset": "y* (computational)"}, {"x": 7.360000133514404, "y": 21.660799026489258, "dataset": "y* (computational)"}, {"x": 7.37000036239624, "y": 18.014606475830078, "dataset": "y* (computational)"}, {"x": 7.380000114440918, "y": 19.314964294433594, "dataset": "y* (computational)"}, {"x": 7.390000343322754, "y": 24.995407104492188, "dataset": "y* (computational)"}, {"x": 7.400000095367432, "y": 15.297834396362305, "dataset": "y* (computational)"}, {"x": 7.410000324249268, "y": 17.79161262512207, "dataset": "y* (computational)"}, {"x": 7.420000076293945, "y": 19.613265991210938, "dataset": "y* (computational)"}, {"x": 7.430000305175781, "y": 19.886369705200195, "dataset": "y* (computational)"}, {"x": 7.440000057220459, "y": 25.553997039794922, "dataset": "y* (computational)"}, {"x": 7.450000286102295, "y": 16.961132049560547, "dataset": "y* (computational)"}, {"x": 7.460000038146973, "y": 20.732465744018555, "dataset": "y* (computational)"}, {"x": 7.470000267028809, "y": 19.930002212524414, "dataset": "y* (computational)"}, {"x": 7.480000019073486, "y": 21.889610290527344, "dataset": "y* (computational)"}, {"x": 7.490000247955322, "y": 20.37594223022461, "dataset": "y* (computational)"}, {"x": 7.5, "y": 19.75603485107422, "dataset": "y* (computational)"}, {"x": 7.510000228881836, "y": 20.603052139282227, "dataset": "y* (computational)"}, {"x": 7.519999980926514, "y": 21.866230010986328, "dataset": "y* (computational)"}, {"x": 7.53000020980835, "y": 23.549245834350586, "dataset": "y* (computational)"}, {"x": 7.539999961853027, "y": 15.412308692932129, "dataset": "y* (computational)"}, {"x": 7.550000190734863, "y": 17.244413375854492, "dataset": "y* (computational)"}, {"x": 7.559999942779541, "y": 22.899314880371094, "dataset": "y* (computational)"}, {"x": 7.570000171661377, "y": 14.686138153076172, "dataset": "y* (computational)"}, {"x": 7.579999923706055, "y": 22.874465942382812, "dataset": "y* (computational)"}, {"x": 7.590000152587891, "y": 16.827346801757812, "dataset": "y* (computational)"}, {"x": 7.599999904632568, "y": 19.635128021240234, "dataset": "y* (computational)"}, {"x": 7.610000133514404, "y": 17.906967163085938, "dataset": "y* (computational)"}, {"x": 7.619999885559082, "y": 19.27128791809082, "dataset": "y* (computational)"}, {"x": 7.630000114440918, "y": 21.0609188079834, "dataset": "y* (computational)"}, {"x": 7.639999866485596, "y": 20.814115524291992, "dataset": "y* (computational)"}, {"x": 7.650000095367432, "y": 14.683761596679688, "dataset": "y* (computational)"}, {"x": 7.659999847412109, "y": 18.394092559814453, "dataset": "y* (computational)"}, {"x": 7.670000076293945, "y": 18.536401748657227, "dataset": "y* (computational)"}, {"x": 7.679999828338623, "y": 23.74802017211914, "dataset": "y* (computational)"}, {"x": 7.690000057220459, "y": 23.55263328552246, "dataset": "y* (computational)"}, {"x": 7.699999809265137, "y": 21.342357635498047, "dataset": "y* (computational)"}, {"x": 7.710000038146973, "y": 15.578473091125488, "dataset": "y* (computational)"}, {"x": 7.71999979019165, "y": 18.129331588745117, "dataset": "y* (computational)"}, {"x": 7.730000019073486, "y": 24.350074768066406, "dataset": "y* (computational)"}, {"x": 7.739999771118164, "y": 21.12964630126953, "dataset": "y* (computational)"}, {"x": 7.75, "y": 26.462793350219727, "dataset": "y* (computational)"}, {"x": 7.760000228881836, "y": 21.3310604095459, "dataset": "y* (computational)"}, {"x": 7.770000457763672, "y": 19.544883728027344, "dataset": "y* (computational)"}, {"x": 7.78000020980835, "y": 21.74909210205078, "dataset": "y* (computational)"}, {"x": 7.7900004386901855, "y": 18.499929428100586, "dataset": "y* (computational)"}, {"x": 7.800000190734863, "y": 19.474809646606445, "dataset": "y* (computational)"}, {"x": 7.810000419616699, "y": 20.253969192504883, "dataset": "y* (computational)"}, {"x": 7.820000171661377, "y": 21.93423843383789, "dataset": "y* (computational)"}, {"x": 7.830000400543213, "y": 23.114316940307617, "dataset": "y* (computational)"}, {"x": 7.840000152587891, "y": 19.191852569580078, "dataset": "y* (computational)"}, {"x": 7.850000381469727, "y": 15.876874923706055, "dataset": "y* (computational)"}, {"x": 7.860000133514404, "y": 18.957984924316406, "dataset": "y* (computational)"}, {"x": 7.87000036239624, "y": 22.95061683654785, "dataset": "y* (computational)"}, {"x": 7.880000114440918, "y": 18.96620750427246, "dataset": "y* (computational)"}, {"x": 7.890000343322754, "y": 19.36211585998535, "dataset": "y* (computational)"}, {"x": 7.900000095367432, "y": 17.04654884338379, "dataset": "y* (computational)"}, {"x": 7.910000324249268, "y": 20.097366333007812, "dataset": "y* (computational)"}, {"x": 7.920000076293945, "y": 20.39711570739746, "dataset": "y* (computational)"}, {"x": 7.930000305175781, "y": 23.675338745117188, "dataset": "y* (computational)"}, {"x": 7.940000057220459, "y": 23.518054962158203, "dataset": "y* (computational)"}, {"x": 7.950000286102295, "y": 21.04629898071289, "dataset": "y* (computational)"}, {"x": 7.960000038146973, "y": 19.62970733642578, "dataset": "y* (computational)"}, {"x": 7.970000267028809, "y": 20.855743408203125, "dataset": "y* (computational)"}, {"x": 7.980000019073486, "y": 20.43535041809082, "dataset": "y* (computational)"}, {"x": 7.990000247955322, "y": 24.320262908935547, "dataset": "y* (computational)"}, {"x": 8.0, "y": 18.828947067260742, "dataset": "y* (computational)"}, {"x": 8.010000228881836, "y": 22.456069946289062, "dataset": "y* (computational)"}, {"x": 8.020000457763672, "y": 20.056556701660156, "dataset": "y* (computational)"}, {"x": 8.029999732971191, "y": 26.858190536499023, "dataset": "y* (computational)"}, {"x": 8.039999961853027, "y": 19.91103172302246, "dataset": "y* (computational)"}, {"x": 8.050000190734863, "y": 24.661178588867188, "dataset": "y* (computational)"}, {"x": 8.0600004196167, "y": 22.609783172607422, "dataset": "y* (computational)"}, {"x": 8.069999694824219, "y": 23.925153732299805, "dataset": "y* (computational)"}, {"x": 8.079999923706055, "y": 18.992149353027344, "dataset": "y* (computational)"}, {"x": 8.09000015258789, "y": 18.13375473022461, "dataset": "y* (computational)"}, {"x": 8.100000381469727, "y": 21.149702072143555, "dataset": "y* (computational)"}, {"x": 8.109999656677246, "y": 23.7867374420166, "dataset": "y* (computational)"}, {"x": 8.119999885559082, "y": 24.32171630859375, "dataset": "y* (computational)"}, {"x": 8.130000114440918, "y": 19.562231063842773, "dataset": "y* (computational)"}, {"x": 8.140000343322754, "y": 19.999347686767578, "dataset": "y* (computational)"}, {"x": 8.149999618530273, "y": 20.624557495117188, "dataset": "y* (computational)"}, {"x": 8.15999984741211, "y": 21.016094207763672, "dataset": "y* (computational)"}, {"x": 8.170000076293945, "y": 18.426965713500977, "dataset": "y* (computational)"}, {"x": 8.180000305175781, "y": 19.337575912475586, "dataset": "y* (computational)"}, {"x": 8.1899995803833, "y": 21.07529067993164, "dataset": "y* (computational)"}, {"x": 8.199999809265137, "y": 21.218467712402344, "dataset": "y* (computational)"}, {"x": 8.210000038146973, "y": 20.461181640625, "dataset": "y* (computational)"}, {"x": 8.220000267028809, "y": 20.767208099365234, "dataset": "y* (computational)"}, {"x": 8.229999542236328, "y": 21.481075286865234, "dataset": "y* (computational)"}, {"x": 8.239999771118164, "y": 26.820823669433594, "dataset": "y* (computational)"}, {"x": 8.25, "y": 22.967100143432617, "dataset": "y* (computational)"}, {"x": 8.260000228881836, "y": 18.567073822021484, "dataset": "y* (computational)"}, {"x": 8.269999504089355, "y": 20.961864471435547, "dataset": "y* (computational)"}, {"x": 8.279999732971191, "y": 21.823081970214844, "dataset": "y* (computational)"}, {"x": 8.289999961853027, "y": 22.35199737548828, "dataset": "y* (computational)"}, {"x": 8.300000190734863, "y": 21.256492614746094, "dataset": "y* (computational)"}, {"x": 8.309999465942383, "y": 18.67919158935547, "dataset": "y* (computational)"}, {"x": 8.319999694824219, "y": 21.534067153930664, "dataset": "y* (computational)"}, {"x": 8.329999923706055, "y": 23.37527084350586, "dataset": "y* (computational)"}, {"x": 8.34000015258789, "y": 23.401588439941406, "dataset": "y* (computational)"}, {"x": 8.34999942779541, "y": 20.525001525878906, "dataset": "y* (computational)"}, {"x": 8.359999656677246, "y": 24.3352108001709, "dataset": "y* (computational)"}, {"x": 8.369999885559082, "y": 18.716434478759766, "dataset": "y* (computational)"}, {"x": 8.380000114440918, "y": 19.494354248046875, "dataset": "y* (computational)"}, {"x": 8.389999389648438, "y": 19.44889259338379, "dataset": "y* (computational)"}, {"x": 8.399999618530273, "y": 22.044816970825195, "dataset": "y* (computational)"}, {"x": 8.40999984741211, "y": 21.910696029663086, "dataset": "y* (computational)"}, {"x": 8.420000076293945, "y": 19.66511344909668, "dataset": "y* (computational)"}, {"x": 8.429999351501465, "y": 26.608949661254883, "dataset": "y* (computational)"}, {"x": 8.4399995803833, "y": 27.111602783203125, "dataset": "y* (computational)"}, {"x": 8.449999809265137, "y": 22.066787719726562, "dataset": "y* (computational)"}, {"x": 8.460000038146973, "y": 20.82550811767578, "dataset": "y* (computational)"}, {"x": 8.469999313354492, "y": 20.80808448791504, "dataset": "y* (computational)"}, {"x": 8.479999542236328, "y": 21.346473693847656, "dataset": "y* (computational)"}, {"x": 8.489999771118164, "y": 21.12287139892578, "dataset": "y* (computational)"}, {"x": 8.5, "y": 24.13140869140625, "dataset": "y* (computational)"}, {"x": 8.50999927520752, "y": 24.0279598236084, "dataset": "y* (computational)"}, {"x": 8.519999504089355, "y": 23.951019287109375, "dataset": "y* (computational)"}, {"x": 8.529999732971191, "y": 24.72907257080078, "dataset": "y* (computational)"}, {"x": 8.539999961853027, "y": 25.363977432250977, "dataset": "y* (computational)"}, {"x": 8.549999237060547, "y": 22.757455825805664, "dataset": "y* (computational)"}, {"x": 8.5600004196167, "y": 20.845043182373047, "dataset": "y* (computational)"}, {"x": 8.570000648498535, "y": 23.57947540283203, "dataset": "y* (computational)"}, {"x": 8.580000877380371, "y": 25.281797409057617, "dataset": "y* (computational)"}, {"x": 8.59000015258789, "y": 22.462013244628906, "dataset": "y* (computational)"}, {"x": 8.600000381469727, "y": 24.184131622314453, "dataset": "y* (computational)"}, {"x": 8.610000610351562, "y": 19.610687255859375, "dataset": "y* (computational)"}, {"x": 8.620000839233398, "y": 23.059616088867188, "dataset": "y* (computational)"}, {"x": 8.630000114440918, "y": 17.19788360595703, "dataset": "y* (computational)"}, {"x": 8.640000343322754, "y": 19.347583770751953, "dataset": "y* (computational)"}, {"x": 8.65000057220459, "y": 19.307872772216797, "dataset": "y* (computational)"}, {"x": 8.660000801086426, "y": 19.16499137878418, "dataset": "y* (computational)"}, {"x": 8.670000076293945, "y": 23.334470748901367, "dataset": "y* (computational)"}, {"x": 8.680000305175781, "y": 26.639543533325195, "dataset": "y* (computational)"}, {"x": 8.690000534057617, "y": 22.860937118530273, "dataset": "y* (computational)"}, {"x": 8.700000762939453, "y": 23.093929290771484, "dataset": "y* (computational)"}, {"x": 8.710000038146973, "y": 24.089763641357422, "dataset": "y* (computational)"}, {"x": 8.720000267028809, "y": 20.045137405395508, "dataset": "y* (computational)"}, {"x": 8.730000495910645, "y": 18.95627212524414, "dataset": "y* (computational)"}, {"x": 8.74000072479248, "y": 21.297483444213867, "dataset": "y* (computational)"}, {"x": 8.75, "y": 28.945964813232422, "dataset": "y* (computational)"}, {"x": 8.760000228881836, "y": 20.401084899902344, "dataset": "y* (computational)"}, {"x": 8.770000457763672, "y": 20.374841690063477, "dataset": "y* (computational)"}, {"x": 8.780000686645508, "y": 22.3837833404541, "dataset": "y* (computational)"}, {"x": 8.789999961853027, "y": 24.185842514038086, "dataset": "y* (computational)"}, {"x": 8.800000190734863, "y": 28.48482894897461, "dataset": "y* (computational)"}, {"x": 8.8100004196167, "y": 22.70310401916504, "dataset": "y* (computational)"}, {"x": 8.820000648498535, "y": 21.470291137695312, "dataset": "y* (computational)"}, {"x": 8.829999923706055, "y": 21.106853485107422, "dataset": "y* (computational)"}, {"x": 8.84000015258789, "y": 28.046010971069336, "dataset": "y* (computational)"}, {"x": 8.850000381469727, "y": 14.298614501953125, "dataset": "y* (computational)"}, {"x": 8.860000610351562, "y": 20.660053253173828, "dataset": "y* (computational)"}, {"x": 8.869999885559082, "y": 26.52396583557129, "dataset": "y* (computational)"}, {"x": 8.880000114440918, "y": 20.95003318786621, "dataset": "y* (computational)"}, {"x": 8.890000343322754, "y": 22.12029266357422, "dataset": "y* (computational)"}, {"x": 8.90000057220459, "y": 23.5692138671875, "dataset": "y* (computational)"}, {"x": 8.90999984741211, "y": 23.258010864257812, "dataset": "y* (computational)"}, {"x": 8.920000076293945, "y": 24.195789337158203, "dataset": "y* (computational)"}, {"x": 8.930000305175781, "y": 24.848278045654297, "dataset": "y* (computational)"}, {"x": 8.940000534057617, "y": 19.356157302856445, "dataset": "y* (computational)"}, {"x": 8.949999809265137, "y": 25.33470916748047, "dataset": "y* (computational)"}, {"x": 8.960000038146973, "y": 23.965713500976562, "dataset": "y* (computational)"}, {"x": 8.970000267028809, "y": 27.58811378479004, "dataset": "y* (computational)"}, {"x": 8.980000495910645, "y": 22.694501876831055, "dataset": "y* (computational)"}, {"x": 8.989999771118164, "y": 23.686660766601562, "dataset": "y* (computational)"}, {"x": 9.0, "y": 24.3179931640625, "dataset": "y* (computational)"}, {"x": 9.010000228881836, "y": 21.091981887817383, "dataset": "y* (computational)"}, {"x": 9.020000457763672, "y": 24.706920623779297, "dataset": "y* (computational)"}, {"x": 9.029999732971191, "y": 25.09316635131836, "dataset": "y* (computational)"}, {"x": 9.039999961853027, "y": 22.718448638916016, "dataset": "y* (computational)"}, {"x": 9.050000190734863, "y": 20.78164291381836, "dataset": "y* (computational)"}, {"x": 9.0600004196167, "y": 21.1237850189209, "dataset": "y* (computational)"}, {"x": 9.069999694824219, "y": 24.19034767150879, "dataset": "y* (computational)"}, {"x": 9.079999923706055, "y": 22.094106674194336, "dataset": "y* (computational)"}, {"x": 9.09000015258789, "y": 28.470565795898438, "dataset": "y* (computational)"}, {"x": 9.100000381469727, "y": 26.620609283447266, "dataset": "y* (computational)"}, {"x": 9.109999656677246, "y": 21.466154098510742, "dataset": "y* (computational)"}, {"x": 9.119999885559082, "y": 20.529495239257812, "dataset": "y* (computational)"}, {"x": 9.130000114440918, "y": 23.583045959472656, "dataset": "y* (computational)"}, {"x": 9.140000343322754, "y": 18.899232864379883, "dataset": "y* (computational)"}, {"x": 9.149999618530273, "y": 21.558273315429688, "dataset": "y* (computational)"}, {"x": 9.15999984741211, "y": 24.138999938964844, "dataset": "y* (computational)"}, {"x": 9.170000076293945, "y": 22.90777587890625, "dataset": "y* (computational)"}, {"x": 9.180000305175781, "y": 21.131446838378906, "dataset": "y* (computational)"}, {"x": 9.1899995803833, "y": 22.277494430541992, "dataset": "y* (computational)"}, {"x": 9.199999809265137, "y": 24.681955337524414, "dataset": "y* (computational)"}, {"x": 9.210000038146973, "y": 23.103023529052734, "dataset": "y* (computational)"}, {"x": 9.220000267028809, "y": 25.7161922454834, "dataset": "y* (computational)"}, {"x": 9.229999542236328, "y": 23.4049072265625, "dataset": "y* (computational)"}, {"x": 9.239999771118164, "y": 20.383527755737305, "dataset": "y* (computational)"}, {"x": 9.25, "y": 24.0413875579834, "dataset": "y* (computational)"}, {"x": 9.260000228881836, "y": 18.502063751220703, "dataset": "y* (computational)"}, {"x": 9.269999504089355, "y": 22.039249420166016, "dataset": "y* (computational)"}, {"x": 9.279999732971191, "y": 20.664770126342773, "dataset": "y* (computational)"}, {"x": 9.289999961853027, "y": 25.358613967895508, "dataset": "y* (computational)"}, {"x": 9.300000190734863, "y": 24.060720443725586, "dataset": "y* (computational)"}, {"x": 9.309999465942383, "y": 25.722625732421875, "dataset": "y* (computational)"}, {"x": 9.319999694824219, "y": 23.850765228271484, "dataset": "y* (computational)"}, {"x": 9.329999923706055, "y": 21.010082244873047, "dataset": "y* (computational)"}, {"x": 9.34000015258789, "y": 29.336402893066406, "dataset": "y* (computational)"}, {"x": 9.34999942779541, "y": 22.199562072753906, "dataset": "y* (computational)"}, {"x": 9.359999656677246, "y": 24.324129104614258, "dataset": "y* (computational)"}, {"x": 9.369999885559082, "y": 25.582857131958008, "dataset": "y* (computational)"}, {"x": 9.380000114440918, "y": 23.1606502532959, "dataset": "y* (computational)"}, {"x": 9.389999389648438, "y": 24.639957427978516, "dataset": "y* (computational)"}, {"x": 9.399999618530273, "y": 27.114421844482422, "dataset": "y* (computational)"}, {"x": 9.40999984741211, "y": 25.151126861572266, "dataset": "y* (computational)"}, {"x": 9.420000076293945, "y": 26.991989135742188, "dataset": "y* (computational)"}, {"x": 9.429999351501465, "y": 24.960309982299805, "dataset": "y* (computational)"}, {"x": 9.4399995803833, "y": 26.162704467773438, "dataset": "y* (computational)"}, {"x": 9.449999809265137, "y": 27.293010711669922, "dataset": "y* (computational)"}, {"x": 9.460000038146973, "y": 26.21392250061035, "dataset": "y* (computational)"}, {"x": 9.469999313354492, "y": 24.094852447509766, "dataset": "y* (computational)"}, {"x": 9.479999542236328, "y": 23.837879180908203, "dataset": "y* (computational)"}, {"x": 9.489999771118164, "y": 24.3555908203125, "dataset": "y* (computational)"}, {"x": 9.5, "y": 25.513378143310547, "dataset": "y* (computational)"}, {"x": 9.50999927520752, "y": 25.900747299194336, "dataset": "y* (computational)"}, {"x": 9.520000457763672, "y": 24.306716918945312, "dataset": "y* (computational)"}, {"x": 9.530000686645508, "y": 20.184406280517578, "dataset": "y* (computational)"}, {"x": 9.540000915527344, "y": 21.650100708007812, "dataset": "y* (computational)"}, {"x": 9.550000190734863, "y": 24.80398178100586, "dataset": "y* (computational)"}, {"x": 9.5600004196167, "y": 28.394500732421875, "dataset": "y* (computational)"}, {"x": 9.570000648498535, "y": 20.494443893432617, "dataset": "y* (computational)"}, {"x": 9.580000877380371, "y": 22.896530151367188, "dataset": "y* (computational)"}, {"x": 9.59000015258789, "y": 21.07431983947754, "dataset": "y* (computational)"}, {"x": 9.600000381469727, "y": 27.209819793701172, "dataset": "y* (computational)"}, {"x": 9.610000610351562, "y": 23.942304611206055, "dataset": "y* (computational)"}, {"x": 9.620000839233398, "y": 21.80896759033203, "dataset": "y* (computational)"}, {"x": 9.630000114440918, "y": 23.45296287536621, "dataset": "y* (computational)"}, {"x": 9.640000343322754, "y": 25.472412109375, "dataset": "y* (computational)"}, {"x": 9.65000057220459, "y": 28.117094039916992, "dataset": "y* (computational)"}, {"x": 9.660000801086426, "y": 23.071773529052734, "dataset": "y* (computational)"}, {"x": 9.670000076293945, "y": 22.14300537109375, "dataset": "y* (computational)"}, {"x": 9.680000305175781, "y": 19.63428497314453, "dataset": "y* (computational)"}, {"x": 9.690000534057617, "y": 20.764690399169922, "dataset": "y* (computational)"}, {"x": 9.700000762939453, "y": 27.968036651611328, "dataset": "y* (computational)"}, {"x": 9.710000038146973, "y": 24.027877807617188, "dataset": "y* (computational)"}, {"x": 9.720000267028809, "y": 25.648529052734375, "dataset": "y* (computational)"}, {"x": 9.730000495910645, "y": 20.433366775512695, "dataset": "y* (computational)"}, {"x": 9.74000072479248, "y": 24.84504508972168, "dataset": "y* (computational)"}, {"x": 9.75, "y": 20.803192138671875, "dataset": "y* (computational)"}, {"x": 9.760000228881836, "y": 24.775007247924805, "dataset": "y* (computational)"}, {"x": 9.770000457763672, "y": 23.022424697875977, "dataset": "y* (computational)"}, {"x": 9.780000686645508, "y": 20.255762100219727, "dataset": "y* (computational)"}, {"x": 9.789999961853027, "y": 25.11452865600586, "dataset": "y* (computational)"}, {"x": 9.800000190734863, "y": 25.00945281982422, "dataset": "y* (computational)"}, {"x": 9.8100004196167, "y": 21.70711898803711, "dataset": "y* (computational)"}, {"x": 9.820000648498535, "y": 25.611404418945312, "dataset": "y* (computational)"}, {"x": 9.829999923706055, "y": 25.85584259033203, "dataset": "y* (computational)"}, {"x": 9.84000015258789, "y": 24.846975326538086, "dataset": "y* (computational)"}, {"x": 9.850000381469727, "y": 27.736614227294922, "dataset": "y* (computational)"}, {"x": 9.860000610351562, "y": 24.08497428894043, "dataset": "y* (computational)"}, {"x": 9.869999885559082, "y": 20.430089950561523, "dataset": "y* (computational)"}, {"x": 9.880000114440918, "y": 29.271371841430664, "dataset": "y* (computational)"}, {"x": 9.890000343322754, "y": 25.37563705444336, "dataset": "y* (computational)"}, {"x": 9.90000057220459, "y": 26.2933292388916, "dataset": "y* (computational)"}, {"x": 9.90999984741211, "y": 24.24854278564453, "dataset": "y* (computational)"}, {"x": 9.920000076293945, "y": 24.430442810058594, "dataset": "y* (computational)"}, {"x": 9.930000305175781, "y": 27.551177978515625, "dataset": "y* (computational)"}, {"x": 9.9399995803833, "y": 19.56329917907715, "dataset": "y* (computational)"}, {"x": 9.949999809265137, "y": 27.84500503540039, "dataset": "y* (computational)"}, {"x": 9.960000038146973, "y": 23.687368392944336, "dataset": "y* (computational)"}, {"x": 9.970000267028809, "y": 21.542156219482422, "dataset": "y* (computational)"}, {"x": 9.979999542236328, "y": 29.754581451416016, "dataset": "y* (computational)"}, {"x": 9.989999771118164, "y": 22.895580291748047, "dataset": "y* (computational)"}, {"x": 0.0, "y": 7.143206596374512, "dataset": "y* (analytical)"}, {"x": 0.009999999776482582, "y": 6.147503852844238, "dataset": "y* (analytical)"}, {"x": 0.019999999552965164, "y": 7.131322860717773, "dataset": "y* (analytical)"}, {"x": 0.029999999329447746, "y": 6.9913249015808105, "dataset": "y* (analytical)"}, {"x": 0.03999999910593033, "y": 5.727168083190918, "dataset": "y* (analytical)"}, {"x": 0.04999999701976776, "y": 5.501786708831787, "dataset": "y* (analytical)"}, {"x": 0.05999999865889549, "y": 2.3199238777160645, "dataset": "y* (analytical)"}, {"x": 0.07000000029802322, "y": 2.5670382976531982, "dataset": "y* (analytical)"}, {"x": 0.07999999821186066, "y": 7.59605073928833, "dataset": "y* (analytical)"}, {"x": 0.08999999612569809, "y": 5.196809768676758, "dataset": "y* (analytical)"}, {"x": 0.09999999403953552, "y": 9.025713920593262, "dataset": "y* (analytical)"}, {"x": 0.10999999940395355, "y": 8.201090812683105, "dataset": "y* (analytical)"}, {"x": 0.11999999731779099, "y": 6.323131561279297, "dataset": "y* (analytical)"}, {"x": 0.12999999523162842, "y": 5.858163833618164, "dataset": "y* (analytical)"}, {"x": 0.14000000059604645, "y": 2.6445603370666504, "dataset": "y* (analytical)"}, {"x": 0.14999999105930328, "y": 1.6178035736083984, "dataset": "y* (analytical)"}, {"x": 0.1599999964237213, "y": 6.249819278717041, "dataset": "y* (analytical)"}, {"x": 0.17000000178813934, "y": 3.9020204544067383, "dataset": "y* (analytical)"}, {"x": 0.17999999225139618, "y": 4.053405284881592, "dataset": "y* (analytical)"}, {"x": 0.1899999976158142, "y": 3.6936240196228027, "dataset": "y* (analytical)"}, {"x": 0.19999998807907104, "y": 6.226385116577148, "dataset": "y* (analytical)"}, {"x": 0.20999999344348907, "y": 9.494672775268555, "dataset": "y* (analytical)"}, {"x": 0.2199999988079071, "y": 8.558176040649414, "dataset": "y* (analytical)"}, {"x": 0.22999998927116394, "y": 4.880383491516113, "dataset": "y* (analytical)"}, {"x": 0.23999999463558197, "y": 9.186403274536133, "dataset": "y* (analytical)"}, {"x": 0.25, "y": 4.846129417419434, "dataset": "y* (analytical)"}, {"x": 0.25999999046325684, "y": 4.653687953948975, "dataset": "y* (analytical)"}, {"x": 0.26999998092651367, "y": 5.522482872009277, "dataset": "y* (analytical)"}, {"x": 0.2800000011920929, "y": 7.686662673950195, "dataset": "y* (analytical)"}, {"x": 0.28999999165534973, "y": 4.576666355133057, "dataset": "y* (analytical)"}, {"x": 0.29999998211860657, "y": 4.299750328063965, "dataset": "y* (analytical)"}, {"x": 0.3100000023841858, "y": 0.6346607208251953, "dataset": "y* (analytical)"}, {"x": 0.3199999928474426, "y": 6.044904708862305, "dataset": "y* (analytical)"}, {"x": 0.32999998331069946, "y": 5.471558094024658, "dataset": "y* (analytical)"}, {"x": 0.3400000035762787, "y": 1.9305527210235596, "dataset": "y* (analytical)"}, {"x": 0.3499999940395355, "y": 4.797136306762695, "dataset": "y* (analytical)"}, {"x": 0.35999998450279236, "y": 7.209267616271973, "dataset": "y* (analytical)"}, {"x": 0.3700000047683716, "y": 2.590728759765625, "dataset": "y* (analytical)"}, {"x": 0.3799999952316284, "y": 7.347785472869873, "dataset": "y* (analytical)"}, {"x": 0.38999998569488525, "y": 8.504655838012695, "dataset": "y* (analytical)"}, {"x": 0.4000000059604645, "y": 3.166330337524414, "dataset": "y* (analytical)"}, {"x": 0.4099999964237213, "y": 6.986019611358643, "dataset": "y* (analytical)"}, {"x": 0.42000001668930054, "y": 8.105642318725586, "dataset": "y* (analytical)"}, {"x": 0.4300000071525574, "y": 3.6582324504852295, "dataset": "y* (analytical)"}, {"x": 0.4399999976158142, "y": 6.663774013519287, "dataset": "y* (analytical)"}, {"x": 0.45000001788139343, "y": 11.611236572265625, "dataset": "y* (analytical)"}, {"x": 0.46000000834465027, "y": 6.153165817260742, "dataset": "y* (analytical)"}, {"x": 0.4699999988079071, "y": 6.4017181396484375, "dataset": "y* (analytical)"}, {"x": 0.47999998927116394, "y": 7.389946937561035, "dataset": "y* (analytical)"}, {"x": 0.4899999797344208, "y": 11.4225435256958, "dataset": "y* (analytical)"}, {"x": 0.5, "y": 5.214353084564209, "dataset": "y* (analytical)"}, {"x": 0.5099999904632568, "y": 7.895998001098633, "dataset": "y* (analytical)"}, {"x": 0.5199999809265137, "y": 4.799525737762451, "dataset": "y* (analytical)"}, {"x": 0.5299999713897705, "y": 6.228255271911621, "dataset": "y* (analytical)"}, {"x": 0.5399999618530273, "y": 6.790587902069092, "dataset": "y* (analytical)"}, {"x": 0.550000011920929, "y": 5.242030143737793, "dataset": "y* (analytical)"}, {"x": 0.5600000023841858, "y": 8.141239166259766, "dataset": "y* (analytical)"}, {"x": 0.5699999928474426, "y": 4.901752471923828, "dataset": "y* (analytical)"}, {"x": 0.5799999833106995, "y": 6.635388374328613, "dataset": "y* (analytical)"}, {"x": 0.5899999737739563, "y": 6.444882392883301, "dataset": "y* (analytical)"}, {"x": 0.6000000238418579, "y": 4.569490432739258, "dataset": "y* (analytical)"}, {"x": 0.6100000143051147, "y": 5.468708038330078, "dataset": "y* (analytical)"}, {"x": 0.6200000047683716, "y": 4.442606449127197, "dataset": "y* (analytical)"}, {"x": 0.6299999952316284, "y": 8.475072860717773, "dataset": "y* (analytical)"}, {"x": 0.6399999856948853, "y": 7.45158052444458, "dataset": "y* (analytical)"}, {"x": 0.6499999761581421, "y": 8.457061767578125, "dataset": "y* (analytical)"}, {"x": 0.6599999666213989, "y": 7.093642234802246, "dataset": "y* (analytical)"}, {"x": 0.6699999570846558, "y": 7.370159149169922, "dataset": "y* (analytical)"}, {"x": 0.6800000071525574, "y": 6.265766143798828, "dataset": "y* (analytical)"}, {"x": 0.6899999976158142, "y": 5.485646724700928, "dataset": "y* (analytical)"}, {"x": 0.699999988079071, "y": 5.32917594909668, "dataset": "y* (analytical)"}, {"x": 0.7099999785423279, "y": 6.018502235412598, "dataset": "y* (analytical)"}, {"x": 0.7200000286102295, "y": 4.303844451904297, "dataset": "y* (analytical)"}, {"x": 0.7300000190734863, "y": 10.163209915161133, "dataset": "y* (analytical)"}, {"x": 0.7400000095367432, "y": 4.906948566436768, "dataset": "y* (analytical)"}, {"x": 0.75, "y": 1.7568044662475586, "dataset": "y* (analytical)"}, {"x": 0.7600000500679016, "y": 5.364787578582764, "dataset": "y* (analytical)"}, {"x": 0.7700000405311584, "y": 5.87379789352417, "dataset": "y* (analytical)"}, {"x": 0.7800000309944153, "y": 3.231687545776367, "dataset": "y* (analytical)"}, {"x": 0.7900000214576721, "y": 6.092281341552734, "dataset": "y* (analytical)"}, {"x": 0.800000011920929, "y": 3.236851930618286, "dataset": "y* (analytical)"}, {"x": 0.8100000023841858, "y": 10.059639930725098, "dataset": "y* (analytical)"}, {"x": 0.8199999928474426, "y": 6.371191501617432, "dataset": "y* (analytical)"}, {"x": 0.8299999833106995, "y": 8.497614860534668, "dataset": "y* (analytical)"}, {"x": 0.8400000333786011, "y": 6.949977874755859, "dataset": "y* (analytical)"}, {"x": 0.8500000238418579, "y": 5.303866386413574, "dataset": "y* (analytical)"}, {"x": 0.8600000143051147, "y": 12.560983657836914, "dataset": "y* (analytical)"}, {"x": 0.8700000047683716, "y": 7.589317798614502, "dataset": "y* (analytical)"}, {"x": 0.8799999952316284, "y": 9.878510475158691, "dataset": "y* (analytical)"}, {"x": 0.8899999856948853, "y": 3.543752431869507, "dataset": "y* (analytical)"}, {"x": 0.8999999761581421, "y": 10.43338680267334, "dataset": "y* (analytical)"}, {"x": 0.9099999666213989, "y": 8.177587509155273, "dataset": "y* (analytical)"}, {"x": 0.9200000166893005, "y": 2.7588577270507812, "dataset": "y* (analytical)"}, {"x": 0.9300000071525574, "y": 8.277377128601074, "dataset": "y* (analytical)"}, {"x": 0.9399999976158142, "y": 6.592596054077148, "dataset": "y* (analytical)"}, {"x": 0.949999988079071, "y": 6.052829742431641, "dataset": "y* (analytical)"}, {"x": 0.9599999785423279, "y": 4.615005016326904, "dataset": "y* (analytical)"}, {"x": 0.9699999690055847, "y": 8.306068420410156, "dataset": "y* (analytical)"}, {"x": 0.9799999594688416, "y": 6.046538352966309, "dataset": "y* (analytical)"}, {"x": 0.9899999499320984, "y": 8.490217208862305, "dataset": "y* (analytical)"}, {"x": 1.0, "y": 6.192192077636719, "dataset": "y* (analytical)"}, {"x": 1.0099999904632568, "y": 5.6897759437561035, "dataset": "y* (analytical)"}, {"x": 1.0199999809265137, "y": 3.036708354949951, "dataset": "y* (analytical)"}, {"x": 1.0299999713897705, "y": 8.70997142791748, "dataset": "y* (analytical)"}, {"x": 1.0399999618530273, "y": 1.6388258934020996, "dataset": "y* (analytical)"}, {"x": 1.0499999523162842, "y": 7.734563827514648, "dataset": "y* (analytical)"}, {"x": 1.059999942779541, "y": 5.042057991027832, "dataset": "y* (analytical)"}, {"x": 1.0699999332427979, "y": 6.676002502441406, "dataset": "y* (analytical)"}, {"x": 1.0799999237060547, "y": 8.743520736694336, "dataset": "y* (analytical)"}, {"x": 1.0899999141693115, "y": 8.154387474060059, "dataset": "y* (analytical)"}, {"x": 1.0999999046325684, "y": 6.866472244262695, "dataset": "y* (analytical)"}, {"x": 1.1100000143051147, "y": 9.342924118041992, "dataset": "y* (analytical)"}, {"x": 1.1200000047683716, "y": 10.917183876037598, "dataset": "y* (analytical)"}, {"x": 1.1299999952316284, "y": 8.74656867980957, "dataset": "y* (analytical)"}, {"x": 1.1399999856948853, "y": 7.536792755126953, "dataset": "y* (analytical)"}, {"x": 1.149999976158142, "y": 9.535269737243652, "dataset": "y* (analytical)"}, {"x": 1.159999966621399, "y": 2.8403124809265137, "dataset": "y* (analytical)"}, {"x": 1.1699999570846558, "y": 4.146690368652344, "dataset": "y* (analytical)"}, {"x": 1.1799999475479126, "y": 7.446657657623291, "dataset": "y* (analytical)"}, {"x": 1.190000057220459, "y": 10.452136993408203, "dataset": "y* (analytical)"}, {"x": 1.2000000476837158, "y": 5.476445198059082, "dataset": "y* (analytical)"}, {"x": 1.2100000381469727, "y": 7.221205711364746, "dataset": "y* (analytical)"}, {"x": 1.2200000286102295, "y": 6.977687835693359, "dataset": "y* (analytical)"}, {"x": 1.2300000190734863, "y": 9.216161727905273, "dataset": "y* (analytical)"}, {"x": 1.2400000095367432, "y": 10.179767608642578, "dataset": "y* (analytical)"}, {"x": 1.25, "y": 8.854470252990723, "dataset": "y* (analytical)"}, {"x": 1.2599999904632568, "y": 2.9556031227111816, "dataset": "y* (analytical)"}, {"x": 1.2700001001358032, "y": 6.8417510986328125, "dataset": "y* (analytical)"}, {"x": 1.2799999713897705, "y": 4.4132080078125, "dataset": "y* (analytical)"}, {"x": 1.2899999618530273, "y": 11.231053352355957, "dataset": "y* (analytical)"}, {"x": 1.2999999523162842, "y": 3.662731647491455, "dataset": "y* (analytical)"}, {"x": 1.309999942779541, "y": 4.747164249420166, "dataset": "y* (analytical)"}, {"x": 1.3199999332427979, "y": 7.077552318572998, "dataset": "y* (analytical)"}, {"x": 1.3299999237060547, "y": 9.70368766784668, "dataset": "y* (analytical)"}, {"x": 1.3399999141693115, "y": 6.781971454620361, "dataset": "y* (analytical)"}, {"x": 1.350000023841858, "y": 10.159150123596191, "dataset": "y* (analytical)"}, {"x": 1.3600000143051147, "y": 11.228703498840332, "dataset": "y* (analytical)"}, {"x": 1.3700000047683716, "y": 11.566803932189941, "dataset": "y* (analytical)"}, {"x": 1.3799999952316284, "y": 12.309972763061523, "dataset": "y* (analytical)"}, {"x": 1.3899999856948853, "y": 11.501679420471191, "dataset": "y* (analytical)"}, {"x": 1.399999976158142, "y": 11.528751373291016, "dataset": "y* (analytical)"}, {"x": 1.409999966621399, "y": 10.470415115356445, "dataset": "y* (analytical)"}, {"x": 1.4199999570846558, "y": 5.516902446746826, "dataset": "y* (analytical)"}, {"x": 1.4300000667572021, "y": 9.464750289916992, "dataset": "y* (analytical)"}, {"x": 1.440000057220459, "y": 6.981840133666992, "dataset": "y* (analytical)"}, {"x": 1.4500000476837158, "y": 7.433420658111572, "dataset": "y* (analytical)"}, {"x": 1.4600000381469727, "y": 7.825700283050537, "dataset": "y* (analytical)"}, {"x": 1.4700000286102295, "y": 6.543490409851074, "dataset": "y* (analytical)"}, {"x": 1.4800000190734863, "y": 8.903853416442871, "dataset": "y* (analytical)"}, {"x": 1.4900000095367432, "y": 8.38919734954834, "dataset": "y* (analytical)"}, {"x": 1.5, "y": 6.260336399078369, "dataset": "y* (analytical)"}, {"x": 1.5100001096725464, "y": 9.058098793029785, "dataset": "y* (analytical)"}, {"x": 1.5199999809265137, "y": 9.211551666259766, "dataset": "y* (analytical)"}, {"x": 1.5299999713897705, "y": 11.613517761230469, "dataset": "y* (analytical)"}, {"x": 1.5399999618530273, "y": 8.725492477416992, "dataset": "y* (analytical)"}, {"x": 1.5499999523162842, "y": 8.704110145568848, "dataset": "y* (analytical)"}, {"x": 1.559999942779541, "y": 9.757404327392578, "dataset": "y* (analytical)"}, {"x": 1.5699999332427979, "y": 7.7529706954956055, "dataset": "y* (analytical)"}, {"x": 1.5799999237060547, "y": 8.051856994628906, "dataset": "y* (analytical)"}, {"x": 1.590000033378601, "y": 11.362930297851562, "dataset": "y* (analytical)"}, {"x": 1.600000023841858, "y": 8.812071800231934, "dataset": "y* (analytical)"}, {"x": 1.6100000143051147, "y": 8.754522323608398, "dataset": "y* (analytical)"}, {"x": 1.6200000047683716, "y": 9.056659698486328, "dataset": "y* (analytical)"}, {"x": 1.6299999952316284, "y": 8.699420928955078, "dataset": "y* (analytical)"}, {"x": 1.6399999856948853, "y": 8.498741149902344, "dataset": "y* (analytical)"}, {"x": 1.649999976158142, "y": 10.277555465698242, "dataset": "y* (analytical)"}, {"x": 1.659999966621399, "y": 6.131406784057617, "dataset": "y* (analytical)"}, {"x": 1.6700000762939453, "y": 7.588580131530762, "dataset": "y* (analytical)"}, {"x": 1.6799999475479126, "y": 6.5485429763793945, "dataset": "y* (analytical)"}, {"x": 1.6899999380111694, "y": 6.395779609680176, "dataset": "y* (analytical)"}, {"x": 1.6999999284744263, "y": 10.15683650970459, "dataset": "y* (analytical)"}, {"x": 1.709999918937683, "y": 13.797399520874023, "dataset": "y* (analytical)"}, {"x": 1.71999990940094, "y": 10.000542640686035, "dataset": "y* (analytical)"}, {"x": 1.7299998998641968, "y": 9.824407577514648, "dataset": "y* (analytical)"}, {"x": 1.7399998903274536, "y": 9.916769981384277, "dataset": "y* (analytical)"}, {"x": 1.75, "y": 4.699060916900635, "dataset": "y* (analytical)"}, {"x": 1.7599999904632568, "y": 8.84756851196289, "dataset": "y* (analytical)"}, {"x": 1.7699999809265137, "y": 9.497823715209961, "dataset": "y* (analytical)"}, {"x": 1.7799999713897705, "y": 9.090498924255371, "dataset": "y* (analytical)"}, {"x": 1.7899999618530273, "y": 9.189743995666504, "dataset": "y* (analytical)"}, {"x": 1.7999999523162842, "y": 10.747479438781738, "dataset": "y* (analytical)"}, {"x": 1.809999942779541, "y": 8.21927261352539, "dataset": "y* (analytical)"}, {"x": 1.8199999332427979, "y": 7.463150501251221, "dataset": "y* (analytical)"}, {"x": 1.8300000429153442, "y": 16.324810028076172, "dataset": "y* (analytical)"}, {"x": 1.840000033378601, "y": 7.010228633880615, "dataset": "y* (analytical)"}, {"x": 1.850000023841858, "y": 12.726863861083984, "dataset": "y* (analytical)"}, {"x": 1.8600000143051147, "y": 8.332472801208496, "dataset": "y* (analytical)"}, {"x": 1.8700000047683716, "y": 11.942483901977539, "dataset": "y* (analytical)"}, {"x": 1.8799999952316284, "y": 13.539228439331055, "dataset": "y* (analytical)"}, {"x": 1.8899999856948853, "y": 10.404158592224121, "dataset": "y* (analytical)"}, {"x": 1.899999976158142, "y": 10.794534683227539, "dataset": "y* (analytical)"}, {"x": 1.9100000858306885, "y": 7.890470027923584, "dataset": "y* (analytical)"}, {"x": 1.9199999570846558, "y": 9.040725708007812, "dataset": "y* (analytical)"}, {"x": 1.9299999475479126, "y": 6.822568893432617, "dataset": "y* (analytical)"}, {"x": 1.9399999380111694, "y": 9.599700927734375, "dataset": "y* (analytical)"}, {"x": 1.9499999284744263, "y": 10.242509841918945, "dataset": "y* (analytical)"}, {"x": 1.959999918937683, "y": 9.454508781433105, "dataset": "y* (analytical)"}, {"x": 1.96999990940094, "y": 7.354557037353516, "dataset": "y* (analytical)"}, {"x": 1.9799998998641968, "y": 4.7545623779296875, "dataset": "y* (analytical)"}, {"x": 1.9900000095367432, "y": 7.481823921203613, "dataset": "y* (analytical)"}, {"x": 2.0, "y": 9.248259544372559, "dataset": "y* (analytical)"}, {"x": 2.009999990463257, "y": 9.175505638122559, "dataset": "y* (analytical)"}, {"x": 2.0199999809265137, "y": 11.775636672973633, "dataset": "y* (analytical)"}, {"x": 2.0299999713897705, "y": 7.483755588531494, "dataset": "y* (analytical)"}, {"x": 2.0399999618530273, "y": 8.682157516479492, "dataset": "y* (analytical)"}, {"x": 2.049999952316284, "y": 9.186575889587402, "dataset": "y* (analytical)"}, {"x": 2.059999942779541, "y": 7.86287784576416, "dataset": "y* (analytical)"}, {"x": 2.069999933242798, "y": 8.186970710754395, "dataset": "y* (analytical)"}, {"x": 2.0799999237060547, "y": 10.4161958694458, "dataset": "y* (analytical)"}, {"x": 2.0899999141693115, "y": 9.301005363464355, "dataset": "y* (analytical)"}, {"x": 2.0999999046325684, "y": 8.09553050994873, "dataset": "y* (analytical)"}, {"x": 2.109999895095825, "y": 5.256083011627197, "dataset": "y* (analytical)"}, {"x": 2.119999885559082, "y": 13.300310134887695, "dataset": "y* (analytical)"}, {"x": 2.129999876022339, "y": 9.263370513916016, "dataset": "y* (analytical)"}, {"x": 2.1399998664855957, "y": 10.16512393951416, "dataset": "y* (analytical)"}, {"x": 2.1499998569488525, "y": 7.69505500793457, "dataset": "y* (analytical)"}, {"x": 2.1600000858306885, "y": 9.058961868286133, "dataset": "y* (analytical)"}, {"x": 2.1700000762939453, "y": 8.628602027893066, "dataset": "y* (analytical)"}, {"x": 2.180000066757202, "y": 10.657698631286621, "dataset": "y* (analytical)"}, {"x": 2.190000057220459, "y": 9.332585334777832, "dataset": "y* (analytical)"}, {"x": 2.200000047683716, "y": 10.571613311767578, "dataset": "y* (analytical)"}, {"x": 2.2100000381469727, "y": 7.393026351928711, "dataset": "y* (analytical)"}, {"x": 2.2200000286102295, "y": 10.813775062561035, "dataset": "y* (analytical)"}, {"x": 2.2300000190734863, "y": 11.340021133422852, "dataset": "y* (analytical)"}, {"x": 2.240000009536743, "y": 8.781831741333008, "dataset": "y* (analytical)"}, {"x": 2.25, "y": 9.654014587402344, "dataset": "y* (analytical)"}, {"x": 2.259999990463257, "y": 7.2731451988220215, "dataset": "y* (analytical)"}, {"x": 2.2699999809265137, "y": 7.772829532623291, "dataset": "y* (analytical)"}, {"x": 2.2799999713897705, "y": 7.006999969482422, "dataset": "y* (analytical)"}, {"x": 2.2899999618530273, "y": 7.851844310760498, "dataset": "y* (analytical)"}, {"x": 2.299999952316284, "y": 11.789802551269531, "dataset": "y* (analytical)"}, {"x": 2.309999942779541, "y": 8.548316955566406, "dataset": "y* (analytical)"}, {"x": 2.319999933242798, "y": 12.608048439025879, "dataset": "y* (analytical)"}, {"x": 2.3299999237060547, "y": 8.885537147521973, "dataset": "y* (analytical)"}, {"x": 2.3399999141693115, "y": 8.601415634155273, "dataset": "y* (analytical)"}, {"x": 2.3499999046325684, "y": 12.308351516723633, "dataset": "y* (analytical)"}, {"x": 2.359999895095825, "y": 10.407852172851562, "dataset": "y* (analytical)"}, {"x": 2.369999885559082, "y": 13.282543182373047, "dataset": "y* (analytical)"}, {"x": 2.379999876022339, "y": 7.369645118713379, "dataset": "y* (analytical)"}, {"x": 2.3899998664855957, "y": 10.520394325256348, "dataset": "y* (analytical)"}, {"x": 2.4000000953674316, "y": 11.037530899047852, "dataset": "y* (analytical)"}, {"x": 2.4100000858306885, "y": 9.369072914123535, "dataset": "y* (analytical)"}, {"x": 2.4200000762939453, "y": 7.697161674499512, "dataset": "y* (analytical)"}, {"x": 2.430000066757202, "y": 9.194746971130371, "dataset": "y* (analytical)"}, {"x": 2.440000057220459, "y": 10.609478950500488, "dataset": "y* (analytical)"}, {"x": 2.450000047683716, "y": 10.523953437805176, "dataset": "y* (analytical)"}, {"x": 2.4600000381469727, "y": 13.159647941589355, "dataset": "y* (analytical)"}, {"x": 2.4700000286102295, "y": 10.500402450561523, "dataset": "y* (analytical)"}, {"x": 2.4800000190734863, "y": 13.130654335021973, "dataset": "y* (analytical)"}, {"x": 2.490000009536743, "y": 11.461750030517578, "dataset": "y* (analytical)"}, {"x": 2.5, "y": 12.857089042663574, "dataset": "y* (analytical)"}, {"x": 2.509999990463257, "y": 11.266804695129395, "dataset": "y* (analytical)"}, {"x": 2.5199999809265137, "y": 9.297879219055176, "dataset": "y* (analytical)"}, {"x": 2.5299999713897705, "y": 12.450521469116211, "dataset": "y* (analytical)"}, {"x": 2.5399999618530273, "y": 13.229915618896484, "dataset": "y* (analytical)"}, {"x": 2.549999952316284, "y": 7.618564605712891, "dataset": "y* (analytical)"}, {"x": 2.559999942779541, "y": 9.211702346801758, "dataset": "y* (analytical)"}, {"x": 2.569999933242798, "y": 11.479988098144531, "dataset": "y* (analytical)"}, {"x": 2.5799999237060547, "y": 7.878048896789551, "dataset": "y* (analytical)"}, {"x": 2.5899999141693115, "y": 9.17070484161377, "dataset": "y* (analytical)"}, {"x": 2.5999999046325684, "y": 12.499893188476562, "dataset": "y* (analytical)"}, {"x": 2.609999895095825, "y": 9.340733528137207, "dataset": "y* (analytical)"}, {"x": 2.619999885559082, "y": 12.045281410217285, "dataset": "y* (analytical)"}, {"x": 2.629999876022339, "y": 10.10767936706543, "dataset": "y* (analytical)"}, {"x": 2.640000104904175, "y": 12.468108177185059, "dataset": "y* (analytical)"}, {"x": 2.6500000953674316, "y": 6.0459208488464355, "dataset": "y* (analytical)"}, {"x": 2.6600000858306885, "y": 10.254854202270508, "dataset": "y* (analytical)"}, {"x": 2.6700000762939453, "y": 10.690056800842285, "dataset": "y* (analytical)"}, {"x": 2.680000066757202, "y": 8.5568208694458, "dataset": "y* (analytical)"}, {"x": 2.690000057220459, "y": 12.366006851196289, "dataset": "y* (analytical)"}, {"x": 2.700000047683716, "y": 9.710927963256836, "dataset": "y* (analytical)"}, {"x": 2.7100000381469727, "y": 10.32656192779541, "dataset": "y* (analytical)"}, {"x": 2.7200000286102295, "y": 12.981988906860352, "dataset": "y* (analytical)"}, {"x": 2.7300000190734863, "y": 11.720346450805664, "dataset": "y* (analytical)"}, {"x": 2.740000009536743, "y": 11.13949966430664, "dataset": "y* (analytical)"}, {"x": 2.75, "y": 12.981032371520996, "dataset": "y* (analytical)"}, {"x": 2.759999990463257, "y": 12.650850296020508, "dataset": "y* (analytical)"}, {"x": 2.7699999809265137, "y": 10.949234962463379, "dataset": "y* (analytical)"}, {"x": 2.7799999713897705, "y": 14.489338874816895, "dataset": "y* (analytical)"}, {"x": 2.7899999618530273, "y": 12.53288459777832, "dataset": "y* (analytical)"}, {"x": 2.799999952316284, "y": 8.880419731140137, "dataset": "y* (analytical)"}, {"x": 2.809999942779541, "y": 9.324148178100586, "dataset": "y* (analytical)"}, {"x": 2.819999933242798, "y": 9.867524147033691, "dataset": "y* (analytical)"}, {"x": 2.8299999237060547, "y": 13.276161193847656, "dataset": "y* (analytical)"}, {"x": 2.8399999141693115, "y": 8.582649230957031, "dataset": "y* (analytical)"}, {"x": 2.8499999046325684, "y": 11.168856620788574, "dataset": "y* (analytical)"}, {"x": 2.859999895095825, "y": 10.119524955749512, "dataset": "y* (analytical)"}, {"x": 2.869999885559082, "y": 12.56480884552002, "dataset": "y* (analytical)"}, {"x": 2.880000114440918, "y": 12.329819679260254, "dataset": "y* (analytical)"}, {"x": 2.890000104904175, "y": 9.373336791992188, "dataset": "y* (analytical)"}, {"x": 2.9000000953674316, "y": 13.279593467712402, "dataset": "y* (analytical)"}, {"x": 2.9100000858306885, "y": 9.157215118408203, "dataset": "y* (analytical)"}, {"x": 2.9200000762939453, "y": 9.399477005004883, "dataset": "y* (analytical)"}, {"x": 2.930000066757202, "y": 13.731169700622559, "dataset": "y* (analytical)"}, {"x": 2.940000057220459, "y": 10.9363431930542, "dataset": "y* (analytical)"}, {"x": 2.950000047683716, "y": 12.713191986083984, "dataset": "y* (analytical)"}, {"x": 2.9600000381469727, "y": 12.012091636657715, "dataset": "y* (analytical)"}, {"x": 2.9700000286102295, "y": 8.883983612060547, "dataset": "y* (analytical)"}, {"x": 2.9800000190734863, "y": 9.887304306030273, "dataset": "y* (analytical)"}, {"x": 2.990000009536743, "y": 9.81527042388916, "dataset": "y* (analytical)"}, {"x": 3.0, "y": 9.105870246887207, "dataset": "y* (analytical)"}, {"x": 3.009999990463257, "y": 5.946828365325928, "dataset": "y* (analytical)"}, {"x": 3.0199999809265137, "y": 12.283956527709961, "dataset": "y* (analytical)"}, {"x": 3.0299999713897705, "y": 12.658076286315918, "dataset": "y* (analytical)"}, {"x": 3.0399999618530273, "y": 11.597195625305176, "dataset": "y* (analytical)"}, {"x": 3.049999952316284, "y": 10.007926940917969, "dataset": "y* (analytical)"}, {"x": 3.059999942779541, "y": 7.484846591949463, "dataset": "y* (analytical)"}, {"x": 3.069999933242798, "y": 14.081823348999023, "dataset": "y* (analytical)"}, {"x": 3.0799999237060547, "y": 13.331225395202637, "dataset": "y* (analytical)"}, {"x": 3.0899999141693115, "y": 18.138124465942383, "dataset": "y* (analytical)"}, {"x": 3.0999999046325684, "y": 11.636940002441406, "dataset": "y* (analytical)"}, {"x": 3.109999895095825, "y": 12.663948059082031, "dataset": "y* (analytical)"}, {"x": 3.119999885559082, "y": 7.927225112915039, "dataset": "y* (analytical)"}, {"x": 3.129999876022339, "y": 9.082941055297852, "dataset": "y* (analytical)"}, {"x": 3.1399998664855957, "y": 13.47721004486084, "dataset": "y* (analytical)"}, {"x": 3.1499998569488525, "y": 16.971492767333984, "dataset": "y* (analytical)"}, {"x": 3.1599998474121094, "y": 10.278194427490234, "dataset": "y* (analytical)"}, {"x": 3.169999837875366, "y": 9.866066932678223, "dataset": "y* (analytical)"}, {"x": 3.179999828338623, "y": 9.724815368652344, "dataset": "y* (analytical)"}, {"x": 3.18999981880188, "y": 11.352838516235352, "dataset": "y* (analytical)"}, {"x": 3.200000047683716, "y": 12.019488334655762, "dataset": "y* (analytical)"}, {"x": 3.2100000381469727, "y": 14.599621772766113, "dataset": "y* (analytical)"}, {"x": 3.2200000286102295, "y": 9.983019828796387, "dataset": "y* (analytical)"}, {"x": 3.2300000190734863, "y": 13.291927337646484, "dataset": "y* (analytical)"}, {"x": 3.240000009536743, "y": 14.549064636230469, "dataset": "y* (analytical)"}, {"x": 3.25, "y": 12.584521293640137, "dataset": "y* (analytical)"}, {"x": 3.259999990463257, "y": 11.411169052124023, "dataset": "y* (analytical)"}, {"x": 3.2699999809265137, "y": 9.88071060180664, "dataset": "y* (analytical)"}, {"x": 3.2799999713897705, "y": 14.68355941772461, "dataset": "y* (analytical)"}, {"x": 3.2899999618530273, "y": 12.068021774291992, "dataset": "y* (analytical)"}, {"x": 3.299999952316284, "y": 6.206914901733398, "dataset": "y* (analytical)"}, {"x": 3.309999942779541, "y": 7.074812412261963, "dataset": "y* (analytical)"}, {"x": 3.319999933242798, "y": 16.859764099121094, "dataset": "y* (analytical)"}, {"x": 3.3299999237060547, "y": 6.413774490356445, "dataset": "y* (analytical)"}, {"x": 3.3399999141693115, "y": 13.29362678527832, "dataset": "y* (analytical)"}, {"x": 3.3499999046325684, "y": 13.28539752960205, "dataset": "y* (analytical)"}, {"x": 3.359999895095825, "y": 9.018887519836426, "dataset": "y* (analytical)"}, {"x": 3.369999885559082, "y": 10.097251892089844, "dataset": "y* (analytical)"}, {"x": 3.379999876022339, "y": 10.791277885437012, "dataset": "y* (analytical)"}, {"x": 3.3899998664855957, "y": 7.212210655212402, "dataset": "y* (analytical)"}, {"x": 3.3999998569488525, "y": 11.456390380859375, "dataset": "y* (analytical)"}, {"x": 3.4099998474121094, "y": 11.170587539672852, "dataset": "y* (analytical)"}, {"x": 3.419999837875366, "y": 10.687323570251465, "dataset": "y* (analytical)"}, {"x": 3.429999828338623, "y": 10.518352508544922, "dataset": "y* (analytical)"}, {"x": 3.440000057220459, "y": 12.330658912658691, "dataset": "y* (analytical)"}, {"x": 3.450000047683716, "y": 7.937232971191406, "dataset": "y* (analytical)"}, {"x": 3.4600000381469727, "y": 13.69662857055664, "dataset": "y* (analytical)"}, {"x": 3.4700000286102295, "y": 11.729928016662598, "dataset": "y* (analytical)"}, {"x": 3.4800000190734863, "y": 9.886889457702637, "dataset": "y* (analytical)"}, {"x": 3.490000009536743, "y": 10.57319164276123, "dataset": "y* (analytical)"}, {"x": 3.5, "y": 13.27704906463623, "dataset": "y* (analytical)"}, {"x": 3.509999990463257, "y": 13.87486457824707, "dataset": "y* (analytical)"}, {"x": 3.5199999809265137, "y": 11.186885833740234, "dataset": "y* (analytical)"}, {"x": 3.5299999713897705, "y": 11.792387008666992, "dataset": "y* (analytical)"}, {"x": 3.5399999618530273, "y": 8.652511596679688, "dataset": "y* (analytical)"}, {"x": 3.549999952316284, "y": 12.987873077392578, "dataset": "y* (analytical)"}, {"x": 3.559999942779541, "y": 10.750079154968262, "dataset": "y* (analytical)"}, {"x": 3.569999933242798, "y": 11.562179565429688, "dataset": "y* (analytical)"}, {"x": 3.5799999237060547, "y": 15.014179229736328, "dataset": "y* (analytical)"}, {"x": 3.5899999141693115, "y": 9.047082901000977, "dataset": "y* (analytical)"}, {"x": 3.5999999046325684, "y": 10.01933765411377, "dataset": "y* (analytical)"}, {"x": 3.609999895095825, "y": 10.516613006591797, "dataset": "y* (analytical)"}, {"x": 3.619999885559082, "y": 9.907386779785156, "dataset": "y* (analytical)"}, {"x": 3.629999876022339, "y": 13.669779777526855, "dataset": "y* (analytical)"}, {"x": 3.6399998664855957, "y": 9.091211318969727, "dataset": "y* (analytical)"}, {"x": 3.6499998569488525, "y": 14.200544357299805, "dataset": "y* (analytical)"}, {"x": 3.6599998474121094, "y": 13.175186157226562, "dataset": "y* (analytical)"}, {"x": 3.669999837875366, "y": 11.855605125427246, "dataset": "y* (analytical)"}, {"x": 3.680000066757202, "y": 13.43305778503418, "dataset": "y* (analytical)"}, {"x": 3.690000057220459, "y": 11.760178565979004, "dataset": "y* (analytical)"}, {"x": 3.700000047683716, "y": 13.353155136108398, "dataset": "y* (analytical)"}, {"x": 3.7100000381469727, "y": 14.35988712310791, "dataset": "y* (analytical)"}, {"x": 3.7200000286102295, "y": 12.535473823547363, "dataset": "y* (analytical)"}, {"x": 3.7300000190734863, "y": 12.28620433807373, "dataset": "y* (analytical)"}, {"x": 3.740000009536743, "y": 13.852046966552734, "dataset": "y* (analytical)"}, {"x": 3.75, "y": 13.758546829223633, "dataset": "y* (analytical)"}, {"x": 3.759999990463257, "y": 11.828333854675293, "dataset": "y* (analytical)"}, {"x": 3.7699999809265137, "y": 13.487071990966797, "dataset": "y* (analytical)"}, {"x": 3.7799999713897705, "y": 13.209213256835938, "dataset": "y* (analytical)"}, {"x": 3.7899999618530273, "y": 11.86371898651123, "dataset": "y* (analytical)"}, {"x": 3.799999952316284, "y": 12.95395565032959, "dataset": "y* (analytical)"}, {"x": 3.809999942779541, "y": 13.740283012390137, "dataset": "y* (analytical)"}, {"x": 3.819999933242798, "y": 14.631969451904297, "dataset": "y* (analytical)"}, {"x": 3.8299999237060547, "y": 14.018816947937012, "dataset": "y* (analytical)"}, {"x": 3.8399999141693115, "y": 11.7015962600708, "dataset": "y* (analytical)"}, {"x": 3.8499999046325684, "y": 10.042322158813477, "dataset": "y* (analytical)"}, {"x": 3.859999895095825, "y": 15.78881549835205, "dataset": "y* (analytical)"}, {"x": 3.869999885559082, "y": 11.178125381469727, "dataset": "y* (analytical)"}, {"x": 3.879999876022339, "y": 14.651715278625488, "dataset": "y* (analytical)"}, {"x": 3.8899998664855957, "y": 12.302660942077637, "dataset": "y* (analytical)"}, {"x": 3.8999998569488525, "y": 13.45289421081543, "dataset": "y* (analytical)"}, {"x": 3.9099998474121094, "y": 13.62675666809082, "dataset": "y* (analytical)"}, {"x": 3.9200000762939453, "y": 13.689376831054688, "dataset": "y* (analytical)"}, {"x": 3.930000066757202, "y": 13.536042213439941, "dataset": "y* (analytical)"}, {"x": 3.940000057220459, "y": 15.221684455871582, "dataset": "y* (analytical)"}, {"x": 3.950000047683716, "y": 16.12071418762207, "dataset": "y* (analytical)"}, {"x": 3.9600000381469727, "y": 12.833642959594727, "dataset": "y* (analytical)"}, {"x": 3.9700000286102295, "y": 10.542865753173828, "dataset": "y* (analytical)"}, {"x": 3.9800000190734863, "y": 8.449119567871094, "dataset": "y* (analytical)"}, {"x": 3.990000009536743, "y": 11.618123054504395, "dataset": "y* (analytical)"}, {"x": 4.0, "y": 10.793999671936035, "dataset": "y* (analytical)"}, {"x": 4.010000228881836, "y": 14.724032402038574, "dataset": "y* (analytical)"}, {"x": 4.019999980926514, "y": 9.962292671203613, "dataset": "y* (analytical)"}, {"x": 4.03000020980835, "y": 13.782477378845215, "dataset": "y* (analytical)"}, {"x": 4.039999961853027, "y": 12.550024032592773, "dataset": "y* (analytical)"}, {"x": 4.050000190734863, "y": 15.308857917785645, "dataset": "y* (analytical)"}, {"x": 4.059999942779541, "y": 10.701037406921387, "dataset": "y* (analytical)"}, {"x": 4.070000171661377, "y": 14.832841873168945, "dataset": "y* (analytical)"}, {"x": 4.079999923706055, "y": 10.531825065612793, "dataset": "y* (analytical)"}, {"x": 4.090000152587891, "y": 12.998298645019531, "dataset": "y* (analytical)"}, {"x": 4.099999904632568, "y": 16.008651733398438, "dataset": "y* (analytical)"}, {"x": 4.110000133514404, "y": 13.943644523620605, "dataset": "y* (analytical)"}, {"x": 4.119999885559082, "y": 11.216476440429688, "dataset": "y* (analytical)"}, {"x": 4.130000114440918, "y": 13.165987968444824, "dataset": "y* (analytical)"}, {"x": 4.139999866485596, "y": 13.72116470336914, "dataset": "y* (analytical)"}, {"x": 4.150000095367432, "y": 15.390697479248047, "dataset": "y* (analytical)"}, {"x": 4.159999847412109, "y": 15.188492774963379, "dataset": "y* (analytical)"}, {"x": 4.170000076293945, "y": 10.567208290100098, "dataset": "y* (analytical)"}, {"x": 4.179999828338623, "y": 14.01491641998291, "dataset": "y* (analytical)"}, {"x": 4.190000057220459, "y": 9.229052543640137, "dataset": "y* (analytical)"}, {"x": 4.199999809265137, "y": 16.611343383789062, "dataset": "y* (analytical)"}, {"x": 4.210000038146973, "y": 9.62940788269043, "dataset": "y* (analytical)"}, {"x": 4.21999979019165, "y": 13.588591575622559, "dataset": "y* (analytical)"}, {"x": 4.230000019073486, "y": 11.983534812927246, "dataset": "y* (analytical)"}, {"x": 4.239999771118164, "y": 12.722564697265625, "dataset": "y* (analytical)"}, {"x": 4.25, "y": 13.578015327453613, "dataset": "y* (analytical)"}, {"x": 4.259999752044678, "y": 9.687801361083984, "dataset": "y* (analytical)"}, {"x": 4.269999980926514, "y": 13.770058631896973, "dataset": "y* (analytical)"}, {"x": 4.279999732971191, "y": 12.119932174682617, "dataset": "y* (analytical)"}, {"x": 4.289999961853027, "y": 6.554202556610107, "dataset": "y* (analytical)"}, {"x": 4.299999713897705, "y": 15.165449142456055, "dataset": "y* (analytical)"}, {"x": 4.309999942779541, "y": 14.434814453125, "dataset": "y* (analytical)"}, {"x": 4.320000171661377, "y": 12.937432289123535, "dataset": "y* (analytical)"}, {"x": 4.330000400543213, "y": 11.83858585357666, "dataset": "y* (analytical)"}, {"x": 4.340000152587891, "y": 11.073380470275879, "dataset": "y* (analytical)"}, {"x": 4.350000381469727, "y": 15.589295387268066, "dataset": "y* (analytical)"}, {"x": 4.360000133514404, "y": 12.083700180053711, "dataset": "y* (analytical)"}, {"x": 4.37000036239624, "y": 9.23111343383789, "dataset": "y* (analytical)"}, {"x": 4.380000114440918, "y": 13.82967472076416, "dataset": "y* (analytical)"}, {"x": 4.390000343322754, "y": 12.695512771606445, "dataset": "y* (analytical)"}, {"x": 4.400000095367432, "y": 12.620769500732422, "dataset": "y* (analytical)"}, {"x": 4.410000324249268, "y": 15.360301971435547, "dataset": "y* (analytical)"}, {"x": 4.420000076293945, "y": 10.970718383789062, "dataset": "y* (analytical)"}, {"x": 4.430000305175781, "y": 10.514062881469727, "dataset": "y* (analytical)"}, {"x": 4.440000057220459, "y": 15.079092025756836, "dataset": "y* (analytical)"}, {"x": 4.450000286102295, "y": 15.8217191696167, "dataset": "y* (analytical)"}, {"x": 4.460000038146973, "y": 18.019184112548828, "dataset": "y* (analytical)"}, {"x": 4.470000267028809, "y": 11.027063369750977, "dataset": "y* (analytical)"}, {"x": 4.480000019073486, "y": 15.675162315368652, "dataset": "y* (analytical)"}, {"x": 4.490000247955322, "y": 17.128219604492188, "dataset": "y* (analytical)"}, {"x": 4.5, "y": 13.43151569366455, "dataset": "y* (analytical)"}, {"x": 4.510000228881836, "y": 15.660400390625, "dataset": "y* (analytical)"}, {"x": 4.519999980926514, "y": 13.375358581542969, "dataset": "y* (analytical)"}, {"x": 4.53000020980835, "y": 14.582988739013672, "dataset": "y* (analytical)"}, {"x": 4.539999961853027, "y": 17.093395233154297, "dataset": "y* (analytical)"}, {"x": 4.550000190734863, "y": 12.959657669067383, "dataset": "y* (analytical)"}, {"x": 4.559999942779541, "y": 14.381361961364746, "dataset": "y* (analytical)"}, {"x": 4.570000171661377, "y": 10.615180969238281, "dataset": "y* (analytical)"}, {"x": 4.579999923706055, "y": 10.57503604888916, "dataset": "y* (analytical)"}, {"x": 4.590000152587891, "y": 16.42535400390625, "dataset": "y* (analytical)"}, {"x": 4.599999904632568, "y": 14.59882926940918, "dataset": "y* (analytical)"}, {"x": 4.610000133514404, "y": 13.778998374938965, "dataset": "y* (analytical)"}, {"x": 4.619999885559082, "y": 12.605714797973633, "dataset": "y* (analytical)"}, {"x": 4.630000114440918, "y": 13.337042808532715, "dataset": "y* (analytical)"}, {"x": 4.639999866485596, "y": 14.987481117248535, "dataset": "y* (analytical)"}, {"x": 4.650000095367432, "y": 10.985179901123047, "dataset": "y* (analytical)"}, {"x": 4.659999847412109, "y": 13.913102149963379, "dataset": "y* (analytical)"}, {"x": 4.670000076293945, "y": 14.354728698730469, "dataset": "y* (analytical)"}, {"x": 4.679999828338623, "y": 18.053951263427734, "dataset": "y* (analytical)"}, {"x": 4.690000057220459, "y": 16.252277374267578, "dataset": "y* (analytical)"}, {"x": 4.699999809265137, "y": 11.525704383850098, "dataset": "y* (analytical)"}, {"x": 4.710000038146973, "y": 10.796189308166504, "dataset": "y* (analytical)"}, {"x": 4.71999979019165, "y": 17.345348358154297, "dataset": "y* (analytical)"}, {"x": 4.730000019073486, "y": 17.74784278869629, "dataset": "y* (analytical)"}, {"x": 4.739999771118164, "y": 11.222821235656738, "dataset": "y* (analytical)"}, {"x": 4.75, "y": 10.485506057739258, "dataset": "y* (analytical)"}, {"x": 4.759999752044678, "y": 13.790912628173828, "dataset": "y* (analytical)"}, {"x": 4.769999980926514, "y": 11.954894065856934, "dataset": "y* (analytical)"}, {"x": 4.779999732971191, "y": 15.13919734954834, "dataset": "y* (analytical)"}, {"x": 4.789999961853027, "y": 13.920793533325195, "dataset": "y* (analytical)"}, {"x": 4.800000190734863, "y": 11.79898452758789, "dataset": "y* (analytical)"}, {"x": 4.810000419616699, "y": 13.663983345031738, "dataset": "y* (analytical)"}, {"x": 4.820000171661377, "y": 16.016464233398438, "dataset": "y* (analytical)"}, {"x": 4.830000400543213, "y": 14.089675903320312, "dataset": "y* (analytical)"}, {"x": 4.840000152587891, "y": 17.734188079833984, "dataset": "y* (analytical)"}, {"x": 4.850000381469727, "y": 13.49992561340332, "dataset": "y* (analytical)"}, {"x": 4.860000133514404, "y": 10.002769470214844, "dataset": "y* (analytical)"}, {"x": 4.87000036239624, "y": 15.374935150146484, "dataset": "y* (analytical)"}, {"x": 4.880000114440918, "y": 14.708443641662598, "dataset": "y* (analytical)"}, {"x": 4.890000343322754, "y": 16.55868148803711, "dataset": "y* (analytical)"}, {"x": 4.900000095367432, "y": 13.086762428283691, "dataset": "y* (analytical)"}, {"x": 4.910000324249268, "y": 13.348676681518555, "dataset": "y* (analytical)"}, {"x": 4.920000076293945, "y": 13.111902236938477, "dataset": "y* (analytical)"}, {"x": 4.930000305175781, "y": 12.202964782714844, "dataset": "y* (analytical)"}, {"x": 4.940000057220459, "y": 14.390972137451172, "dataset": "y* (analytical)"}, {"x": 4.950000286102295, "y": 14.554701805114746, "dataset": "y* (analytical)"}, {"x": 4.960000038146973, "y": 15.036858558654785, "dataset": "y* (analytical)"}, {"x": 4.970000267028809, "y": 16.443660736083984, "dataset": "y* (analytical)"}, {"x": 4.980000019073486, "y": 14.456934928894043, "dataset": "y* (analytical)"}, {"x": 4.990000247955322, "y": 13.536117553710938, "dataset": "y* (analytical)"}, {"x": 5.0, "y": 16.254924774169922, "dataset": "y* (analytical)"}, {"x": 5.010000228881836, "y": 17.694482803344727, "dataset": "y* (analytical)"}, {"x": 5.019999980926514, "y": 16.48662567138672, "dataset": "y* (analytical)"}, {"x": 5.03000020980835, "y": 14.023431777954102, "dataset": "y* (analytical)"}, {"x": 5.039999961853027, "y": 15.719624519348145, "dataset": "y* (analytical)"}, {"x": 5.050000190734863, "y": 16.05017852783203, "dataset": "y* (analytical)"}, {"x": 5.059999942779541, "y": 17.950422286987305, "dataset": "y* (analytical)"}, {"x": 5.070000171661377, "y": 16.72905921936035, "dataset": "y* (analytical)"}, {"x": 5.079999923706055, "y": 18.89510726928711, "dataset": "y* (analytical)"}, {"x": 5.090000152587891, "y": 13.873482704162598, "dataset": "y* (analytical)"}, {"x": 5.099999904632568, "y": 14.378460884094238, "dataset": "y* (analytical)"}, {"x": 5.110000133514404, "y": 16.1524715423584, "dataset": "y* (analytical)"}, {"x": 5.119999885559082, "y": 16.686620712280273, "dataset": "y* (analytical)"}, {"x": 5.130000114440918, "y": 14.191240310668945, "dataset": "y* (analytical)"}, {"x": 5.139999866485596, "y": 15.606095314025879, "dataset": "y* (analytical)"}, {"x": 5.150000095367432, "y": 15.220308303833008, "dataset": "y* (analytical)"}, {"x": 5.159999847412109, "y": 13.266112327575684, "dataset": "y* (analytical)"}, {"x": 5.170000076293945, "y": 12.666431427001953, "dataset": "y* (analytical)"}, {"x": 5.179999828338623, "y": 12.160859107971191, "dataset": "y* (analytical)"}, {"x": 5.190000057220459, "y": 16.93308448791504, "dataset": "y* (analytical)"}, {"x": 5.199999809265137, "y": 17.292356491088867, "dataset": "y* (analytical)"}, {"x": 5.210000038146973, "y": 12.666109085083008, "dataset": "y* (analytical)"}, {"x": 5.21999979019165, "y": 16.754491806030273, "dataset": "y* (analytical)"}, {"x": 5.230000019073486, "y": 17.558347702026367, "dataset": "y* (analytical)"}, {"x": 5.239999771118164, "y": 17.742509841918945, "dataset": "y* (analytical)"}, {"x": 5.25, "y": 17.631492614746094, "dataset": "y* (analytical)"}, {"x": 5.259999752044678, "y": 15.989812850952148, "dataset": "y* (analytical)"}, {"x": 5.269999980926514, "y": 19.357439041137695, "dataset": "y* (analytical)"}, {"x": 5.28000020980835, "y": 18.103321075439453, "dataset": "y* (analytical)"}, {"x": 5.2900004386901855, "y": 14.910945892333984, "dataset": "y* (analytical)"}, {"x": 5.300000190734863, "y": 16.247753143310547, "dataset": "y* (analytical)"}, {"x": 5.310000419616699, "y": 15.3604154586792, "dataset": "y* (analytical)"}, {"x": 5.320000171661377, "y": 10.091606140136719, "dataset": "y* (analytical)"}, {"x": 5.330000400543213, "y": 15.029119491577148, "dataset": "y* (analytical)"}, {"x": 5.340000152587891, "y": 16.91091537475586, "dataset": "y* (analytical)"}, {"x": 5.350000381469727, "y": 16.889249801635742, "dataset": "y* (analytical)"}, {"x": 5.360000133514404, "y": 14.472557067871094, "dataset": "y* (analytical)"}, {"x": 5.37000036239624, "y": 16.366056442260742, "dataset": "y* (analytical)"}, {"x": 5.380000114440918, "y": 14.474824905395508, "dataset": "y* (analytical)"}, {"x": 5.390000343322754, "y": 14.42645263671875, "dataset": "y* (analytical)"}, {"x": 5.400000095367432, "y": 15.233588218688965, "dataset": "y* (analytical)"}, {"x": 5.410000324249268, "y": 19.498132705688477, "dataset": "y* (analytical)"}, {"x": 5.420000076293945, "y": 15.572969436645508, "dataset": "y* (analytical)"}, {"x": 5.430000305175781, "y": 20.393230438232422, "dataset": "y* (analytical)"}, {"x": 5.440000057220459, "y": 9.383824348449707, "dataset": "y* (analytical)"}, {"x": 5.450000286102295, "y": 18.368383407592773, "dataset": "y* (analytical)"}, {"x": 5.460000038146973, "y": 16.85491943359375, "dataset": "y* (analytical)"}, {"x": 5.470000267028809, "y": 17.436155319213867, "dataset": "y* (analytical)"}, {"x": 5.480000019073486, "y": 20.05523681640625, "dataset": "y* (analytical)"}, {"x": 5.490000247955322, "y": 15.022638320922852, "dataset": "y* (analytical)"}, {"x": 5.5, "y": 18.881872177124023, "dataset": "y* (analytical)"}, {"x": 5.510000228881836, "y": 14.709693908691406, "dataset": "y* (analytical)"}, {"x": 5.519999980926514, "y": 15.149340629577637, "dataset": "y* (analytical)"}, {"x": 5.53000020980835, "y": 15.760198593139648, "dataset": "y* (analytical)"}, {"x": 5.539999961853027, "y": 14.504690170288086, "dataset": "y* (analytical)"}, {"x": 5.550000190734863, "y": 17.398921966552734, "dataset": "y* (analytical)"}, {"x": 5.559999942779541, "y": 12.238669395446777, "dataset": "y* (analytical)"}, {"x": 5.570000171661377, "y": 16.298847198486328, "dataset": "y* (analytical)"}, {"x": 5.579999923706055, "y": 17.257131576538086, "dataset": "y* (analytical)"}, {"x": 5.590000152587891, "y": 16.658124923706055, "dataset": "y* (analytical)"}, {"x": 5.599999904632568, "y": 15.342901229858398, "dataset": "y* (analytical)"}, {"x": 5.610000133514404, "y": 14.959054946899414, "dataset": "y* (analytical)"}, {"x": 5.619999885559082, "y": 15.936113357543945, "dataset": "y* (analytical)"}, {"x": 5.630000114440918, "y": 14.40753173828125, "dataset": "y* (analytical)"}, {"x": 5.639999866485596, "y": 18.618572235107422, "dataset": "y* (analytical)"}, {"x": 5.650000095367432, "y": 13.842069625854492, "dataset": "y* (analytical)"}, {"x": 5.659999847412109, "y": 16.75763702392578, "dataset": "y* (analytical)"}, {"x": 5.670000076293945, "y": 18.65224266052246, "dataset": "y* (analytical)"}, {"x": 5.679999828338623, "y": 10.10428237915039, "dataset": "y* (analytical)"}, {"x": 5.690000057220459, "y": 18.145469665527344, "dataset": "y* (analytical)"}, {"x": 5.699999809265137, "y": 18.130081176757812, "dataset": "y* (analytical)"}, {"x": 5.710000038146973, "y": 15.650474548339844, "dataset": "y* (analytical)"}, {"x": 5.71999979019165, "y": 16.57892608642578, "dataset": "y* (analytical)"}, {"x": 5.730000019073486, "y": 17.06868553161621, "dataset": "y* (analytical)"}, {"x": 5.739999771118164, "y": 20.646251678466797, "dataset": "y* (analytical)"}, {"x": 5.75, "y": 12.40231704711914, "dataset": "y* (analytical)"}, {"x": 5.760000228881836, "y": 14.473403930664062, "dataset": "y* (analytical)"}, {"x": 5.770000457763672, "y": 18.986473083496094, "dataset": "y* (analytical)"}, {"x": 5.78000020980835, "y": 17.072593688964844, "dataset": "y* (analytical)"}, {"x": 5.7900004386901855, "y": 15.888360023498535, "dataset": "y* (analytical)"}, {"x": 5.800000190734863, "y": 20.411470413208008, "dataset": "y* (analytical)"}, {"x": 5.810000419616699, "y": 18.47168731689453, "dataset": "y* (analytical)"}, {"x": 5.820000171661377, "y": 15.740178108215332, "dataset": "y* (analytical)"}, {"x": 5.830000400543213, "y": 15.834522247314453, "dataset": "y* (analytical)"}, {"x": 5.840000152587891, "y": 14.81600570678711, "dataset": "y* (analytical)"}, {"x": 5.850000381469727, "y": 14.092975616455078, "dataset": "y* (analytical)"}, {"x": 5.860000133514404, "y": 15.795703887939453, "dataset": "y* (analytical)"}, {"x": 5.87000036239624, "y": 16.671159744262695, "dataset": "y* (analytical)"}, {"x": 5.880000114440918, "y": 20.535512924194336, "dataset": "y* (analytical)"}, {"x": 5.890000343322754, "y": 20.43982696533203, "dataset": "y* (analytical)"}, {"x": 5.900000095367432, "y": 19.64971351623535, "dataset": "y* (analytical)"}, {"x": 5.910000324249268, "y": 13.106720924377441, "dataset": "y* (analytical)"}, {"x": 5.920000076293945, "y": 19.568355560302734, "dataset": "y* (analytical)"}, {"x": 5.930000305175781, "y": 14.332600593566895, "dataset": "y* (analytical)"}, {"x": 5.940000057220459, "y": 15.080543518066406, "dataset": "y* (analytical)"}, {"x": 5.950000286102295, "y": 15.603867530822754, "dataset": "y* (analytical)"}, {"x": 5.960000038146973, "y": 14.927408218383789, "dataset": "y* (analytical)"}, {"x": 5.970000267028809, "y": 18.28411865234375, "dataset": "y* (analytical)"}, {"x": 5.980000019073486, "y": 16.465288162231445, "dataset": "y* (analytical)"}, {"x": 5.990000247955322, "y": 15.928488731384277, "dataset": "y* (analytical)"}, {"x": 6.0, "y": 18.789953231811523, "dataset": "y* (analytical)"}, {"x": 6.010000228881836, "y": 19.78481101989746, "dataset": "y* (analytical)"}, {"x": 6.019999980926514, "y": 18.742298126220703, "dataset": "y* (analytical)"}, {"x": 6.03000020980835, "y": 12.285272598266602, "dataset": "y* (analytical)"}, {"x": 6.039999961853027, "y": 13.26430892944336, "dataset": "y* (analytical)"}, {"x": 6.050000190734863, "y": 18.066011428833008, "dataset": "y* (analytical)"}, {"x": 6.059999942779541, "y": 13.194817543029785, "dataset": "y* (analytical)"}, {"x": 6.070000171661377, "y": 15.533976554870605, "dataset": "y* (analytical)"}, {"x": 6.079999923706055, "y": 16.995302200317383, "dataset": "y* (analytical)"}, {"x": 6.090000152587891, "y": 18.001697540283203, "dataset": "y* (analytical)"}, {"x": 6.099999904632568, "y": 16.62054443359375, "dataset": "y* (analytical)"}, {"x": 6.110000133514404, "y": 20.015365600585938, "dataset": "y* (analytical)"}, {"x": 6.119999885559082, "y": 15.910928726196289, "dataset": "y* (analytical)"}, {"x": 6.130000114440918, "y": 16.22441291809082, "dataset": "y* (analytical)"}, {"x": 6.139999866485596, "y": 14.8821382522583, "dataset": "y* (analytical)"}, {"x": 6.150000095367432, "y": 16.716371536254883, "dataset": "y* (analytical)"}, {"x": 6.159999847412109, "y": 18.249826431274414, "dataset": "y* (analytical)"}, {"x": 6.170000076293945, "y": 15.23698902130127, "dataset": "y* (analytical)"}, {"x": 6.179999828338623, "y": 15.961682319641113, "dataset": "y* (analytical)"}, {"x": 6.190000057220459, "y": 17.23737907409668, "dataset": "y* (analytical)"}, {"x": 6.199999809265137, "y": 18.174707412719727, "dataset": "y* (analytical)"}, {"x": 6.210000038146973, "y": 18.45415687561035, "dataset": "y* (analytical)"}, {"x": 6.21999979019165, "y": 18.86383628845215, "dataset": "y* (analytical)"}, {"x": 6.230000019073486, "y": 20.218503952026367, "dataset": "y* (analytical)"}, {"x": 6.239999771118164, "y": 18.805946350097656, "dataset": "y* (analytical)"}, {"x": 6.25, "y": 15.230620384216309, "dataset": "y* (analytical)"}, {"x": 6.259999752044678, "y": 15.456794738769531, "dataset": "y* (analytical)"}, {"x": 6.269999980926514, "y": 21.38289451599121, "dataset": "y* (analytical)"}, {"x": 6.279999732971191, "y": 18.634672164916992, "dataset": "y* (analytical)"}, {"x": 6.289999961853027, "y": 20.926841735839844, "dataset": "y* (analytical)"}, {"x": 6.299999713897705, "y": 16.185039520263672, "dataset": "y* (analytical)"}, {"x": 6.309999942779541, "y": 16.642105102539062, "dataset": "y* (analytical)"}, {"x": 6.320000171661377, "y": 18.42263412475586, "dataset": "y* (analytical)"}, {"x": 6.330000400543213, "y": 23.48415756225586, "dataset": "y* (analytical)"}, {"x": 6.340000152587891, "y": 20.712331771850586, "dataset": "y* (analytical)"}, {"x": 6.350000381469727, "y": 17.212675094604492, "dataset": "y* (analytical)"}, {"x": 6.360000133514404, "y": 16.203062057495117, "dataset": "y* (analytical)"}, {"x": 6.37000036239624, "y": 14.877876281738281, "dataset": "y* (analytical)"}, {"x": 6.380000114440918, "y": 14.832971572875977, "dataset": "y* (analytical)"}, {"x": 6.390000343322754, "y": 14.999476432800293, "dataset": "y* (analytical)"}, {"x": 6.400000095367432, "y": 21.110841751098633, "dataset": "y* (analytical)"}, {"x": 6.410000324249268, "y": 19.434600830078125, "dataset": "y* (analytical)"}, {"x": 6.420000076293945, "y": 16.260000228881836, "dataset": "y* (analytical)"}, {"x": 6.430000305175781, "y": 17.37369728088379, "dataset": "y* (analytical)"}, {"x": 6.440000057220459, "y": 16.29585075378418, "dataset": "y* (analytical)"}, {"x": 6.450000286102295, "y": 14.044927597045898, "dataset": "y* (analytical)"}, {"x": 6.460000038146973, "y": 19.292701721191406, "dataset": "y* (analytical)"}, {"x": 6.470000267028809, "y": 16.80757713317871, "dataset": "y* (analytical)"}, {"x": 6.480000019073486, "y": 16.003644943237305, "dataset": "y* (analytical)"}, {"x": 6.490000247955322, "y": 15.468209266662598, "dataset": "y* (analytical)"}, {"x": 6.5, "y": 17.911863327026367, "dataset": "y* (analytical)"}, {"x": 6.510000228881836, "y": 18.24581527709961, "dataset": "y* (analytical)"}, {"x": 6.519999980926514, "y": 20.320743560791016, "dataset": "y* (analytical)"}, {"x": 6.53000020980835, "y": 18.422466278076172, "dataset": "y* (analytical)"}, {"x": 6.539999961853027, "y": 17.441186904907227, "dataset": "y* (analytical)"}, {"x": 6.550000190734863, "y": 20.444782257080078, "dataset": "y* (analytical)"}, {"x": 6.559999942779541, "y": 17.359474182128906, "dataset": "y* (analytical)"}, {"x": 6.570000171661377, "y": 16.99005889892578, "dataset": "y* (analytical)"}, {"x": 6.579999923706055, "y": 18.243499755859375, "dataset": "y* (analytical)"}, {"x": 6.590000152587891, "y": 16.225196838378906, "dataset": "y* (analytical)"}, {"x": 6.599999904632568, "y": 16.107580184936523, "dataset": "y* (analytical)"}, {"x": 6.610000133514404, "y": 17.01697540283203, "dataset": "y* (analytical)"}, {"x": 6.619999885559082, "y": 19.56332778930664, "dataset": "y* (analytical)"}, {"x": 6.630000114440918, "y": 16.175983428955078, "dataset": "y* (analytical)"}, {"x": 6.639999866485596, "y": 17.691329956054688, "dataset": "y* (analytical)"}, {"x": 6.650000095367432, "y": 18.00362205505371, "dataset": "y* (analytical)"}, {"x": 6.659999847412109, "y": 19.976680755615234, "dataset": "y* (analytical)"}, {"x": 6.670000076293945, "y": 19.304948806762695, "dataset": "y* (analytical)"}, {"x": 6.679999828338623, "y": 18.31102180480957, "dataset": "y* (analytical)"}, {"x": 6.690000057220459, "y": 13.339016914367676, "dataset": "y* (analytical)"}, {"x": 6.699999809265137, "y": 15.772286415100098, "dataset": "y* (analytical)"}, {"x": 6.710000038146973, "y": 21.19744873046875, "dataset": "y* (analytical)"}, {"x": 6.71999979019165, "y": 17.34578514099121, "dataset": "y* (analytical)"}, {"x": 6.730000019073486, "y": 19.915746688842773, "dataset": "y* (analytical)"}, {"x": 6.739999771118164, "y": 15.888997077941895, "dataset": "y* (analytical)"}, {"x": 6.75, "y": 21.31399154663086, "dataset": "y* (analytical)"}, {"x": 6.759999752044678, "y": 16.64194679260254, "dataset": "y* (analytical)"}, {"x": 6.769999980926514, "y": 19.613136291503906, "dataset": "y* (analytical)"}, {"x": 6.779999732971191, "y": 21.17182731628418, "dataset": "y* (analytical)"}, {"x": 6.789999961853027, "y": 17.847890853881836, "dataset": "y* (analytical)"}, {"x": 6.800000190734863, "y": 25.011646270751953, "dataset": "y* (analytical)"}, {"x": 6.810000419616699, "y": 18.91366958618164, "dataset": "y* (analytical)"}, {"x": 6.820000171661377, "y": 17.404268264770508, "dataset": "y* (analytical)"}, {"x": 6.830000400543213, "y": 15.491239547729492, "dataset": "y* (analytical)"}, {"x": 6.840000152587891, "y": 18.828693389892578, "dataset": "y* (analytical)"}, {"x": 6.850000381469727, "y": 20.410642623901367, "dataset": "y* (analytical)"}, {"x": 6.860000133514404, "y": 20.19635009765625, "dataset": "y* (analytical)"}, {"x": 6.87000036239624, "y": 20.376935958862305, "dataset": "y* (analytical)"}, {"x": 6.880000114440918, "y": 18.13225746154785, "dataset": "y* (analytical)"}, {"x": 6.890000343322754, "y": 16.690258026123047, "dataset": "y* (analytical)"}, {"x": 6.900000095367432, "y": 20.654327392578125, "dataset": "y* (analytical)"}, {"x": 6.910000324249268, "y": 22.628211975097656, "dataset": "y* (analytical)"}, {"x": 6.920000076293945, "y": 20.070640563964844, "dataset": "y* (analytical)"}, {"x": 6.930000305175781, "y": 21.55052947998047, "dataset": "y* (analytical)"}, {"x": 6.940000057220459, "y": 20.164655685424805, "dataset": "y* (analytical)"}, {"x": 6.950000286102295, "y": 20.20789909362793, "dataset": "y* (analytical)"}, {"x": 6.960000038146973, "y": 22.316970825195312, "dataset": "y* (analytical)"}, {"x": 6.970000267028809, "y": 19.960247039794922, "dataset": "y* (analytical)"}, {"x": 6.980000019073486, "y": 18.605302810668945, "dataset": "y* (analytical)"}, {"x": 6.990000247955322, "y": 17.734710693359375, "dataset": "y* (analytical)"}, {"x": 7.0, "y": 17.610836029052734, "dataset": "y* (analytical)"}, {"x": 7.010000228881836, "y": 19.654027938842773, "dataset": "y* (analytical)"}, {"x": 7.019999980926514, "y": 19.948230743408203, "dataset": "y* (analytical)"}, {"x": 7.03000020980835, "y": 15.168486595153809, "dataset": "y* (analytical)"}, {"x": 7.039999961853027, "y": 18.494367599487305, "dataset": "y* (analytical)"}, {"x": 7.050000190734863, "y": 19.206052780151367, "dataset": "y* (analytical)"}, {"x": 7.059999942779541, "y": 20.142955780029297, "dataset": "y* (analytical)"}, {"x": 7.070000171661377, "y": 21.084800720214844, "dataset": "y* (analytical)"}, {"x": 7.079999923706055, "y": 19.21675682067871, "dataset": "y* (analytical)"}, {"x": 7.090000152587891, "y": 18.74532127380371, "dataset": "y* (analytical)"}, {"x": 7.099999904632568, "y": 14.241058349609375, "dataset": "y* (analytical)"}, {"x": 7.110000133514404, "y": 16.665851593017578, "dataset": "y* (analytical)"}, {"x": 7.119999885559082, "y": 16.0238094329834, "dataset": "y* (analytical)"}, {"x": 7.130000114440918, "y": 19.153289794921875, "dataset": "y* (analytical)"}, {"x": 7.139999866485596, "y": 20.445363998413086, "dataset": "y* (analytical)"}, {"x": 7.150000095367432, "y": 19.82111358642578, "dataset": "y* (analytical)"}, {"x": 7.159999847412109, "y": 19.241586685180664, "dataset": "y* (analytical)"}, {"x": 7.170000076293945, "y": 23.260242462158203, "dataset": "y* (analytical)"}, {"x": 7.179999828338623, "y": 21.989486694335938, "dataset": "y* (analytical)"}, {"x": 7.190000057220459, "y": 18.103483200073242, "dataset": "y* (analytical)"}, {"x": 7.199999809265137, "y": 20.938568115234375, "dataset": "y* (analytical)"}, {"x": 7.210000038146973, "y": 17.1878719329834, "dataset": "y* (analytical)"}, {"x": 7.21999979019165, "y": 19.049230575561523, "dataset": "y* (analytical)"}, {"x": 7.230000019073486, "y": 18.5848331451416, "dataset": "y* (analytical)"}, {"x": 7.239999771118164, "y": 19.015289306640625, "dataset": "y* (analytical)"}, {"x": 7.25, "y": 18.27057647705078, "dataset": "y* (analytical)"}, {"x": 7.259999752044678, "y": 22.910308837890625, "dataset": "y* (analytical)"}, {"x": 7.269999980926514, "y": 20.924406051635742, "dataset": "y* (analytical)"}, {"x": 7.28000020980835, "y": 21.497791290283203, "dataset": "y* (analytical)"}, {"x": 7.2900004386901855, "y": 18.807924270629883, "dataset": "y* (analytical)"}, {"x": 7.300000190734863, "y": 18.368139266967773, "dataset": "y* (analytical)"}, {"x": 7.310000419616699, "y": 16.965412139892578, "dataset": "y* (analytical)"}, {"x": 7.320000171661377, "y": 20.79129409790039, "dataset": "y* (analytical)"}, {"x": 7.330000400543213, "y": 15.644601821899414, "dataset": "y* (analytical)"}, {"x": 7.340000152587891, "y": 19.434946060180664, "dataset": "y* (analytical)"}, {"x": 7.350000381469727, "y": 22.709716796875, "dataset": "y* (analytical)"}, {"x": 7.360000133514404, "y": 19.189041137695312, "dataset": "y* (analytical)"}, {"x": 7.37000036239624, "y": 17.994861602783203, "dataset": "y* (analytical)"}, {"x": 7.380000114440918, "y": 21.532440185546875, "dataset": "y* (analytical)"}, {"x": 7.390000343322754, "y": 15.870185852050781, "dataset": "y* (analytical)"}, {"x": 7.400000095367432, "y": 21.481779098510742, "dataset": "y* (analytical)"}, {"x": 7.410000324249268, "y": 17.041847229003906, "dataset": "y* (analytical)"}, {"x": 7.420000076293945, "y": 20.64068603515625, "dataset": "y* (analytical)"}, {"x": 7.430000305175781, "y": 18.98807716369629, "dataset": "y* (analytical)"}, {"x": 7.440000057220459, "y": 17.309879302978516, "dataset": "y* (analytical)"}, {"x": 7.450000286102295, "y": 19.695348739624023, "dataset": "y* (analytical)"}, {"x": 7.460000038146973, "y": 17.355728149414062, "dataset": "y* (analytical)"}, {"x": 7.470000267028809, "y": 18.444246292114258, "dataset": "y* (analytical)"}, {"x": 7.480000019073486, "y": 22.444377899169922, "dataset": "y* (analytical)"}, {"x": 7.490000247955322, "y": 20.973621368408203, "dataset": "y* (analytical)"}, {"x": 7.5, "y": 21.087757110595703, "dataset": "y* (analytical)"}, {"x": 7.510000228881836, "y": 22.677186965942383, "dataset": "y* (analytical)"}, {"x": 7.519999980926514, "y": 21.37407875061035, "dataset": "y* (analytical)"}, {"x": 7.53000020980835, "y": 19.460792541503906, "dataset": "y* (analytical)"}, {"x": 7.539999961853027, "y": 17.987380981445312, "dataset": "y* (analytical)"}, {"x": 7.550000190734863, "y": 20.45512580871582, "dataset": "y* (analytical)"}, {"x": 7.559999942779541, "y": 22.810749053955078, "dataset": "y* (analytical)"}, {"x": 7.570000171661377, "y": 18.715286254882812, "dataset": "y* (analytical)"}, {"x": 7.579999923706055, "y": 19.70752716064453, "dataset": "y* (analytical)"}, {"x": 7.590000152587891, "y": 18.512388229370117, "dataset": "y* (analytical)"}, {"x": 7.599999904632568, "y": 17.292144775390625, "dataset": "y* (analytical)"}, {"x": 7.610000133514404, "y": 17.926097869873047, "dataset": "y* (analytical)"}, {"x": 7.619999885559082, "y": 21.73175048828125, "dataset": "y* (analytical)"}, {"x": 7.630000114440918, "y": 24.435035705566406, "dataset": "y* (analytical)"}, {"x": 7.639999866485596, "y": 22.915802001953125, "dataset": "y* (analytical)"}, {"x": 7.650000095367432, "y": 18.842208862304688, "dataset": "y* (analytical)"}, {"x": 7.659999847412109, "y": 17.919340133666992, "dataset": "y* (analytical)"}, {"x": 7.670000076293945, "y": 17.631324768066406, "dataset": "y* (analytical)"}, {"x": 7.679999828338623, "y": 22.56266212463379, "dataset": "y* (analytical)"}, {"x": 7.690000057220459, "y": 22.25695037841797, "dataset": "y* (analytical)"}, {"x": 7.699999809265137, "y": 20.834867477416992, "dataset": "y* (analytical)"}, {"x": 7.710000038146973, "y": 17.22917366027832, "dataset": "y* (analytical)"}, {"x": 7.71999979019165, "y": 22.975189208984375, "dataset": "y* (analytical)"}, {"x": 7.730000019073486, "y": 19.511215209960938, "dataset": "y* (analytical)"}, {"x": 7.739999771118164, "y": 22.873210906982422, "dataset": "y* (analytical)"}, {"x": 7.75, "y": 19.401443481445312, "dataset": "y* (analytical)"}, {"x": 7.760000228881836, "y": 15.969562530517578, "dataset": "y* (analytical)"}, {"x": 7.770000457763672, "y": 21.191265106201172, "dataset": "y* (analytical)"}, {"x": 7.78000020980835, "y": 19.605243682861328, "dataset": "y* (analytical)"}, {"x": 7.7900004386901855, "y": 20.96073341369629, "dataset": "y* (analytical)"}, {"x": 7.800000190734863, "y": 20.65238380432129, "dataset": "y* (analytical)"}, {"x": 7.810000419616699, "y": 20.42000389099121, "dataset": "y* (analytical)"}, {"x": 7.820000171661377, "y": 20.92086410522461, "dataset": "y* (analytical)"}, {"x": 7.830000400543213, "y": 23.686969757080078, "dataset": "y* (analytical)"}, {"x": 7.840000152587891, "y": 21.52300262451172, "dataset": "y* (analytical)"}, {"x": 7.850000381469727, "y": 22.205656051635742, "dataset": "y* (analytical)"}, {"x": 7.860000133514404, "y": 21.566923141479492, "dataset": "y* (analytical)"}, {"x": 7.87000036239624, "y": 17.005826950073242, "dataset": "y* (analytical)"}, {"x": 7.880000114440918, "y": 21.098024368286133, "dataset": "y* (analytical)"}, {"x": 7.890000343322754, "y": 19.903242111206055, "dataset": "y* (analytical)"}, {"x": 7.900000095367432, "y": 19.544416427612305, "dataset": "y* (analytical)"}, {"x": 7.910000324249268, "y": 20.950424194335938, "dataset": "y* (analytical)"}, {"x": 7.920000076293945, "y": 20.043638229370117, "dataset": "y* (analytical)"}, {"x": 7.930000305175781, "y": 20.904634475708008, "dataset": "y* (analytical)"}, {"x": 7.940000057220459, "y": 16.354524612426758, "dataset": "y* (analytical)"}, {"x": 7.950000286102295, "y": 22.232662200927734, "dataset": "y* (analytical)"}, {"x": 7.960000038146973, "y": 23.579849243164062, "dataset": "y* (analytical)"}, {"x": 7.970000267028809, "y": 23.931884765625, "dataset": "y* (analytical)"}, {"x": 7.980000019073486, "y": 17.96137046813965, "dataset": "y* (analytical)"}, {"x": 7.990000247955322, "y": 23.0363826751709, "dataset": "y* (analytical)"}, {"x": 8.0, "y": 23.44097900390625, "dataset": "y* (analytical)"}, {"x": 8.010000228881836, "y": 19.27958869934082, "dataset": "y* (analytical)"}, {"x": 8.020000457763672, "y": 20.847227096557617, "dataset": "y* (analytical)"}, {"x": 8.029999732971191, "y": 16.22214126586914, "dataset": "y* (analytical)"}, {"x": 8.039999961853027, "y": 24.14688491821289, "dataset": "y* (analytical)"}, {"x": 8.050000190734863, "y": 19.367900848388672, "dataset": "y* (analytical)"}, {"x": 8.0600004196167, "y": 25.014354705810547, "dataset": "y* (analytical)"}, {"x": 8.069999694824219, "y": 22.104209899902344, "dataset": "y* (analytical)"}, {"x": 8.079999923706055, "y": 21.574893951416016, "dataset": "y* (analytical)"}, {"x": 8.09000015258789, "y": 23.056392669677734, "dataset": "y* (analytical)"}, {"x": 8.100000381469727, "y": 21.645017623901367, "dataset": "y* (analytical)"}, {"x": 8.109999656677246, "y": 22.717435836791992, "dataset": "y* (analytical)"}, {"x": 8.119999885559082, "y": 19.83672332763672, "dataset": "y* (analytical)"}, {"x": 8.130000114440918, "y": 23.997575759887695, "dataset": "y* (analytical)"}, {"x": 8.140000343322754, "y": 13.304713249206543, "dataset": "y* (analytical)"}, {"x": 8.149999618530273, "y": 20.68505859375, "dataset": "y* (analytical)"}, {"x": 8.15999984741211, "y": 19.5664005279541, "dataset": "y* (analytical)"}, {"x": 8.170000076293945, "y": 22.69809913635254, "dataset": "y* (analytical)"}, {"x": 8.180000305175781, "y": 21.88988494873047, "dataset": "y* (analytical)"}, {"x": 8.1899995803833, "y": 18.320512771606445, "dataset": "y* (analytical)"}, {"x": 8.199999809265137, "y": 20.378765106201172, "dataset": "y* (analytical)"}, {"x": 8.210000038146973, "y": 20.621505737304688, "dataset": "y* (analytical)"}, {"x": 8.220000267028809, "y": 20.29877471923828, "dataset": "y* (analytical)"}, {"x": 8.229999542236328, "y": 20.545299530029297, "dataset": "y* (analytical)"}, {"x": 8.239999771118164, "y": 20.308374404907227, "dataset": "y* (analytical)"}, {"x": 8.25, "y": 21.817550659179688, "dataset": "y* (analytical)"}, {"x": 8.260000228881836, "y": 19.232206344604492, "dataset": "y* (analytical)"}, {"x": 8.269999504089355, "y": 23.050594329833984, "dataset": "y* (analytical)"}, {"x": 8.279999732971191, "y": 16.612241744995117, "dataset": "y* (analytical)"}, {"x": 8.289999961853027, "y": 21.21102523803711, "dataset": "y* (analytical)"}, {"x": 8.300000190734863, "y": 22.657012939453125, "dataset": "y* (analytical)"}, {"x": 8.309999465942383, "y": 18.507963180541992, "dataset": "y* (analytical)"}, {"x": 8.319999694824219, "y": 21.087289810180664, "dataset": "y* (analytical)"}, {"x": 8.329999923706055, "y": 19.20018768310547, "dataset": "y* (analytical)"}, {"x": 8.34000015258789, "y": 19.454227447509766, "dataset": "y* (analytical)"}, {"x": 8.34999942779541, "y": 19.79371452331543, "dataset": "y* (analytical)"}, {"x": 8.359999656677246, "y": 16.91661834716797, "dataset": "y* (analytical)"}, {"x": 8.369999885559082, "y": 19.967134475708008, "dataset": "y* (analytical)"}, {"x": 8.380000114440918, "y": 24.06757354736328, "dataset": "y* (analytical)"}, {"x": 8.389999389648438, "y": 20.580303192138672, "dataset": "y* (analytical)"}, {"x": 8.399999618530273, "y": 22.782102584838867, "dataset": "y* (analytical)"}, {"x": 8.40999984741211, "y": 19.489105224609375, "dataset": "y* (analytical)"}, {"x": 8.420000076293945, "y": 18.788639068603516, "dataset": "y* (analytical)"}, {"x": 8.429999351501465, "y": 24.696273803710938, "dataset": "y* (analytical)"}, {"x": 8.4399995803833, "y": 21.579164505004883, "dataset": "y* (analytical)"}, {"x": 8.449999809265137, "y": 19.666532516479492, "dataset": "y* (analytical)"}, {"x": 8.460000038146973, "y": 23.37442398071289, "dataset": "y* (analytical)"}, {"x": 8.469999313354492, "y": 21.828168869018555, "dataset": "y* (analytical)"}, {"x": 8.479999542236328, "y": 20.254772186279297, "dataset": "y* (analytical)"}, {"x": 8.489999771118164, "y": 21.93646240234375, "dataset": "y* (analytical)"}, {"x": 8.5, "y": 22.089599609375, "dataset": "y* (analytical)"}, {"x": 8.50999927520752, "y": 16.4947452545166, "dataset": "y* (analytical)"}, {"x": 8.519999504089355, "y": 22.979249954223633, "dataset": "y* (analytical)"}, {"x": 8.529999732971191, "y": 23.520885467529297, "dataset": "y* (analytical)"}, {"x": 8.539999961853027, "y": 20.318710327148438, "dataset": "y* (analytical)"}, {"x": 8.549999237060547, "y": 21.93390464782715, "dataset": "y* (analytical)"}, {"x": 8.5600004196167, "y": 22.069265365600586, "dataset": "y* (analytical)"}, {"x": 8.570000648498535, "y": 24.915464401245117, "dataset": "y* (analytical)"}, {"x": 8.580000877380371, "y": 26.154327392578125, "dataset": "y* (analytical)"}, {"x": 8.59000015258789, "y": 24.2968692779541, "dataset": "y* (analytical)"}, {"x": 8.600000381469727, "y": 20.987581253051758, "dataset": "y* (analytical)"}, {"x": 8.610000610351562, "y": 23.430099487304688, "dataset": "y* (analytical)"}, {"x": 8.620000839233398, "y": 21.577129364013672, "dataset": "y* (analytical)"}, {"x": 8.630000114440918, "y": 22.225372314453125, "dataset": "y* (analytical)"}, {"x": 8.640000343322754, "y": 18.738697052001953, "dataset": "y* (analytical)"}, {"x": 8.65000057220459, "y": 18.98648452758789, "dataset": "y* (analytical)"}, {"x": 8.660000801086426, "y": 21.613338470458984, "dataset": "y* (analytical)"}, {"x": 8.670000076293945, "y": 23.19088363647461, "dataset": "y* (analytical)"}, {"x": 8.680000305175781, "y": 18.765172958374023, "dataset": "y* (analytical)"}, {"x": 8.690000534057617, "y": 22.972990036010742, "dataset": "y* (analytical)"}, {"x": 8.700000762939453, "y": 23.243167877197266, "dataset": "y* (analytical)"}, {"x": 8.710000038146973, "y": 16.750816345214844, "dataset": "y* (analytical)"}, {"x": 8.720000267028809, "y": 19.77564239501953, "dataset": "y* (analytical)"}, {"x": 8.730000495910645, "y": 20.05379867553711, "dataset": "y* (analytical)"}, {"x": 8.74000072479248, "y": 18.80443572998047, "dataset": "y* (analytical)"}, {"x": 8.75, "y": 24.875022888183594, "dataset": "y* (analytical)"}, {"x": 8.760000228881836, "y": 16.637401580810547, "dataset": "y* (analytical)"}, {"x": 8.770000457763672, "y": 18.921619415283203, "dataset": "y* (analytical)"}, {"x": 8.780000686645508, "y": 24.385019302368164, "dataset": "y* (analytical)"}, {"x": 8.789999961853027, "y": 24.288705825805664, "dataset": "y* (analytical)"}, {"x": 8.800000190734863, "y": 21.205530166625977, "dataset": "y* (analytical)"}, {"x": 8.8100004196167, "y": 19.53754234313965, "dataset": "y* (analytical)"}, {"x": 8.820000648498535, "y": 20.105937957763672, "dataset": "y* (analytical)"}, {"x": 8.829999923706055, "y": 22.58236312866211, "dataset": "y* (analytical)"}, {"x": 8.84000015258789, "y": 26.087417602539062, "dataset": "y* (analytical)"}, {"x": 8.850000381469727, "y": 23.78345489501953, "dataset": "y* (analytical)"}, {"x": 8.860000610351562, "y": 21.54453468322754, "dataset": "y* (analytical)"}, {"x": 8.869999885559082, "y": 19.142196655273438, "dataset": "y* (analytical)"}, {"x": 8.880000114440918, "y": 22.018234252929688, "dataset": "y* (analytical)"}, {"x": 8.890000343322754, "y": 23.451265335083008, "dataset": "y* (analytical)"}, {"x": 8.90000057220459, "y": 22.49431610107422, "dataset": "y* (analytical)"}, {"x": 8.90999984741211, "y": 24.65294075012207, "dataset": "y* (analytical)"}, {"x": 8.920000076293945, "y": 24.09072494506836, "dataset": "y* (analytical)"}, {"x": 8.930000305175781, "y": 24.994932174682617, "dataset": "y* (analytical)"}, {"x": 8.940000534057617, "y": 21.634239196777344, "dataset": "y* (analytical)"}, {"x": 8.949999809265137, "y": 22.775644302368164, "dataset": "y* (analytical)"}, {"x": 8.960000038146973, "y": 23.995220184326172, "dataset": "y* (analytical)"}, {"x": 8.970000267028809, "y": 20.107067108154297, "dataset": "y* (analytical)"}, {"x": 8.980000495910645, "y": 19.314783096313477, "dataset": "y* (analytical)"}, {"x": 8.989999771118164, "y": 20.95369529724121, "dataset": "y* (analytical)"}, {"x": 9.0, "y": 24.172069549560547, "dataset": "y* (analytical)"}, {"x": 9.010000228881836, "y": 24.173429489135742, "dataset": "y* (analytical)"}, {"x": 9.020000457763672, "y": 21.22662925720215, "dataset": "y* (analytical)"}, {"x": 9.029999732971191, "y": 21.312149047851562, "dataset": "y* (analytical)"}, {"x": 9.039999961853027, "y": 24.32352638244629, "dataset": "y* (analytical)"}, {"x": 9.050000190734863, "y": 20.975297927856445, "dataset": "y* (analytical)"}, {"x": 9.0600004196167, "y": 23.071388244628906, "dataset": "y* (analytical)"}, {"x": 9.069999694824219, "y": 23.83213996887207, "dataset": "y* (analytical)"}, {"x": 9.079999923706055, "y": 25.794296264648438, "dataset": "y* (analytical)"}, {"x": 9.09000015258789, "y": 24.249746322631836, "dataset": "y* (analytical)"}, {"x": 9.100000381469727, "y": 23.379642486572266, "dataset": "y* (analytical)"}, {"x": 9.109999656677246, "y": 23.75606918334961, "dataset": "y* (analytical)"}, {"x": 9.119999885559082, "y": 24.500883102416992, "dataset": "y* (analytical)"}, {"x": 9.130000114440918, "y": 22.112150192260742, "dataset": "y* (analytical)"}, {"x": 9.140000343322754, "y": 23.320886611938477, "dataset": "y* (analytical)"}, {"x": 9.149999618530273, "y": 24.139785766601562, "dataset": "y* (analytical)"}, {"x": 9.15999984741211, "y": 28.967063903808594, "dataset": "y* (analytical)"}, {"x": 9.170000076293945, "y": 23.673376083374023, "dataset": "y* (analytical)"}, {"x": 9.180000305175781, "y": 24.79500389099121, "dataset": "y* (analytical)"}, {"x": 9.1899995803833, "y": 20.94243621826172, "dataset": "y* (analytical)"}, {"x": 9.199999809265137, "y": 24.730731964111328, "dataset": "y* (analytical)"}, {"x": 9.210000038146973, "y": 24.979732513427734, "dataset": "y* (analytical)"}, {"x": 9.220000267028809, "y": 23.63474464416504, "dataset": "y* (analytical)"}, {"x": 9.229999542236328, "y": 21.724767684936523, "dataset": "y* (analytical)"}, {"x": 9.239999771118164, "y": 25.53243064880371, "dataset": "y* (analytical)"}, {"x": 9.25, "y": 23.561037063598633, "dataset": "y* (analytical)"}, {"x": 9.260000228881836, "y": 24.41338348388672, "dataset": "y* (analytical)"}, {"x": 9.269999504089355, "y": 21.12240219116211, "dataset": "y* (analytical)"}, {"x": 9.279999732971191, "y": 20.329448699951172, "dataset": "y* (analytical)"}, {"x": 9.289999961853027, "y": 25.060266494750977, "dataset": "y* (analytical)"}, {"x": 9.300000190734863, "y": 21.223039627075195, "dataset": "y* (analytical)"}, {"x": 9.309999465942383, "y": 22.89763832092285, "dataset": "y* (analytical)"}, {"x": 9.319999694824219, "y": 25.25107192993164, "dataset": "y* (analytical)"}, {"x": 9.329999923706055, "y": 20.574674606323242, "dataset": "y* (analytical)"}, {"x": 9.34000015258789, "y": 21.26227378845215, "dataset": "y* (analytical)"}, {"x": 9.34999942779541, "y": 26.05560874938965, "dataset": "y* (analytical)"}, {"x": 9.359999656677246, "y": 23.41210174560547, "dataset": "y* (analytical)"}, {"x": 9.369999885559082, "y": 24.74211311340332, "dataset": "y* (analytical)"}, {"x": 9.380000114440918, "y": 26.07984161376953, "dataset": "y* (analytical)"}, {"x": 9.389999389648438, "y": 26.793256759643555, "dataset": "y* (analytical)"}, {"x": 9.399999618530273, "y": 22.990821838378906, "dataset": "y* (analytical)"}, {"x": 9.40999984741211, "y": 20.919466018676758, "dataset": "y* (analytical)"}, {"x": 9.420000076293945, "y": 23.667997360229492, "dataset": "y* (analytical)"}, {"x": 9.429999351501465, "y": 22.271320343017578, "dataset": "y* (analytical)"}, {"x": 9.4399995803833, "y": 23.485933303833008, "dataset": "y* (analytical)"}, {"x": 9.449999809265137, "y": 25.608449935913086, "dataset": "y* (analytical)"}, {"x": 9.460000038146973, "y": 22.277179718017578, "dataset": "y* (analytical)"}, {"x": 9.469999313354492, "y": 25.25446319580078, "dataset": "y* (analytical)"}, {"x": 9.479999542236328, "y": 25.1075382232666, "dataset": "y* (analytical)"}, {"x": 9.489999771118164, "y": 23.7921199798584, "dataset": "y* (analytical)"}, {"x": 9.5, "y": 25.004167556762695, "dataset": "y* (analytical)"}, {"x": 9.50999927520752, "y": 23.259489059448242, "dataset": "y* (analytical)"}, {"x": 9.520000457763672, "y": 25.474315643310547, "dataset": "y* (analytical)"}, {"x": 9.530000686645508, "y": 23.985776901245117, "dataset": "y* (analytical)"}, {"x": 9.540000915527344, "y": 22.2941837310791, "dataset": "y* (analytical)"}, {"x": 9.550000190734863, "y": 20.314069747924805, "dataset": "y* (analytical)"}, {"x": 9.5600004196167, "y": 23.260723114013672, "dataset": "y* (analytical)"}, {"x": 9.570000648498535, "y": 28.679611206054688, "dataset": "y* (analytical)"}, {"x": 9.580000877380371, "y": 20.18425178527832, "dataset": "y* (analytical)"}, {"x": 9.59000015258789, "y": 24.023983001708984, "dataset": "y* (analytical)"}, {"x": 9.600000381469727, "y": 28.914705276489258, "dataset": "y* (analytical)"}, {"x": 9.610000610351562, "y": 23.510528564453125, "dataset": "y* (analytical)"}, {"x": 9.620000839233398, "y": 25.29879379272461, "dataset": "y* (analytical)"}, {"x": 9.630000114440918, "y": 26.764148712158203, "dataset": "y* (analytical)"}, {"x": 9.640000343322754, "y": 27.666301727294922, "dataset": "y* (analytical)"}, {"x": 9.65000057220459, "y": 23.02480697631836, "dataset": "y* (analytical)"}, {"x": 9.660000801086426, "y": 26.081680297851562, "dataset": "y* (analytical)"}, {"x": 9.670000076293945, "y": 22.70587158203125, "dataset": "y* (analytical)"}, {"x": 9.680000305175781, "y": 18.820669174194336, "dataset": "y* (analytical)"}, {"x": 9.690000534057617, "y": 24.17906951904297, "dataset": "y* (analytical)"}, {"x": 9.700000762939453, "y": 25.690250396728516, "dataset": "y* (analytical)"}, {"x": 9.710000038146973, "y": 20.138092041015625, "dataset": "y* (analytical)"}, {"x": 9.720000267028809, "y": 22.053274154663086, "dataset": "y* (analytical)"}, {"x": 9.730000495910645, "y": 24.90855598449707, "dataset": "y* (analytical)"}, {"x": 9.74000072479248, "y": 21.61699104309082, "dataset": "y* (analytical)"}, {"x": 9.75, "y": 28.353721618652344, "dataset": "y* (analytical)"}, {"x": 9.760000228881836, "y": 28.459684371948242, "dataset": "y* (analytical)"}, {"x": 9.770000457763672, "y": 29.464366912841797, "dataset": "y* (analytical)"}, {"x": 9.780000686645508, "y": 25.987688064575195, "dataset": "y* (analytical)"}, {"x": 9.789999961853027, "y": 24.601972579956055, "dataset": "y* (analytical)"}, {"x": 9.800000190734863, "y": 28.145292282104492, "dataset": "y* (analytical)"}, {"x": 9.8100004196167, "y": 29.312416076660156, "dataset": "y* (analytical)"}, {"x": 9.820000648498535, "y": 23.417705535888672, "dataset": "y* (analytical)"}, {"x": 9.829999923706055, "y": 24.003347396850586, "dataset": "y* (analytical)"}, {"x": 9.84000015258789, "y": 24.173141479492188, "dataset": "y* (analytical)"}, {"x": 9.850000381469727, "y": 25.84324836730957, "dataset": "y* (analytical)"}, {"x": 9.860000610351562, "y": 23.88496971130371, "dataset": "y* (analytical)"}, {"x": 9.869999885559082, "y": 24.91059684753418, "dataset": "y* (analytical)"}, {"x": 9.880000114440918, "y": 25.453075408935547, "dataset": "y* (analytical)"}, {"x": 9.890000343322754, "y": 24.13217544555664, "dataset": "y* (analytical)"}, {"x": 9.90000057220459, "y": 22.699975967407227, "dataset": "y* (analytical)"}, {"x": 9.90999984741211, "y": 23.023447036743164, "dataset": "y* (analytical)"}, {"x": 9.920000076293945, "y": 21.703054428100586, "dataset": "y* (analytical)"}, {"x": 9.930000305175781, "y": 24.449138641357422, "dataset": "y* (analytical)"}, {"x": 9.9399995803833, "y": 26.979164123535156, "dataset": "y* (analytical)"}, {"x": 9.949999809265137, "y": 23.434080123901367, "dataset": "y* (analytical)"}, {"x": 9.960000038146973, "y": 26.58111000061035, "dataset": "y* (analytical)"}, {"x": 9.970000267028809, "y": 23.826496124267578, "dataset": "y* (analytical)"}, {"x": 9.979999542236328, "y": 23.560300827026367, "dataset": "y* (analytical)"}, {"x": 9.989999771118164, "y": 28.19155502319336, "dataset": "y* (analytical)"}]}}, {"mode": "vega-lite"});
</script>
</div>
</div>

<div class="no-row-height column-margin column-container"><div class="">
<p>Note, <code>torch.normal</code> takes the std dev instead of the variance.</p>
</div><div class="">
<p>To see each series more clearly, click on one in the legend.</p>
</div></div>
<p>The chart shows both the computational analysis verifies the analytical solution while the table above shows the mean and variance of the residuals of the computational anlysis is the same as the analytical solution. The table of statistics for each series also reflects these findings.</p>
</section>
<section id="in-the-end-it-didnt-even-matter" class="level2 page-columns page-full">
<h2 class="anchored" data-anchor-id="in-the-end-it-didnt-even-matter"># In the end, it didn’t even matter</h2>
<p>That took a bit of work. Thankfully, this question didn’t make it into our company pub quiz. Even if it had, I think everyone (sans the author) would have had to ultimately guess the answer. We only had 30 seconds per question. I didn’t even finish reading the problem statement let alone begin tackling it in that time!</p>
<p>In the end, whether this question would have been included or not, wouldn’t have changed the outcome. The quiz was neck and neck between 3 teams for most of the game. My team bouncing between 1<img src="https://latex.codecogs.com/png.latex?%5E%7Bst%7D"> and 3<img src="https://latex.codecogs.com/png.latex?%5E%7Brd%7D"> place. That is until the final round of questions from the Leadership team, which were highly specific to a certain someone.</p>

<div class="no-row-height column-margin column-container"><div class="">
<p>If we have another pub quiz, I’ll make sure to sling in some equally maladjusted questions. But I’ll post the answers beforehand here.<br>
<br>
Watch this space.</p>
</div></div><p>Good thing I had the CEO on my team 🥇</p>


<!-- -->


</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents" id="quarto-bibliography"><h2 class="anchored quarto-appendix-heading">References</h2><div id="refs" class="references csl-bib-body hanging-indent">
<div id="ref-ross2010" class="csl-entry">
Ross, Sheldon. 2010. <em>A First Course in Probability</em>. 8th ed. Pearson Prentice Hall.
</div>
</div></section></div> ]]></description>
  <category>probability</category>
  <category>pub quiz</category>
  <guid>https://bear-toes.pages.dev/posts/summing_random_variables/</guid>
  <pubDate>Sun, 14 Jan 2024 00:00:00 GMT</pubDate>
</item>
<item>
  <title>Waltzing with Python’s Walrus Operator</title>
  <link>https://bear-toes.pages.dev/posts/waltzing_with_the_walrus/</link>
  <description><![CDATA[ 





<p><a href="https://docs.python.org/3/whatsnew/3.8.html#assignment-expressions">Python 3.8</a> introduced a new assignment operator with <a href="https://peps.python.org/pep-0572/">PEP 572</a> called <strong>assignment expressions</strong>, a.k.a the <strong>walrus operator</strong>. The walrus operator uses the new walrus-like syntax <code>:=</code>, to assign variables within an expression.</p>
<p>It’s been out for a few years at this point (at the time of writing Python 3.12 is around the corner) and I’ve found some joy in how it’s helped elegantly shorten some parts of my code. Here are the ways I’ve made use of the walrus operator.</p>
<section id="error-handling" class="level2">
<h2 class="anchored" data-anchor-id="error-handling">Error Handling</h2>
<p>The walrus operator can help reduce repetition and make error handling a bit more streamlined. In the following snippet, <code>func()</code> will return <code>None</code> to represent an error occurred.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> func()</span>
<span id="cb1-2"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">not</span> x:</span>
<span id="cb1-3">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Error message"</span>)</span>
<span id="cb1-4">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span></span></code></pre></div></div>
<p>Using the walrus operator, the call to <code>func()</code> can be inlined.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">not</span> x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> func():</span>
<span id="cb2-2">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Error message"</span>)</span>
<span id="cb2-3">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span></span></code></pre></div></div>
<p>Shaving off a single line may seem trivial but those saved lines can add up. For example, when parsing user inputs and performing validation. In the following snippet, we want to validate user inputs <code>x</code>, <code>y</code>, and <code>z</code>. If there’s a validation problem, <code>validate</code> will return a string with a message explaining what is wrong with the input and a message of how to fix. These messages get appended to a list so all validation messages can be printed out together.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb3-1">validation_errors <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb3-2"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> msg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> validate(x):</span>
<span id="cb3-3">    validation_errors <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+=</span> msg</span>
<span id="cb3-4"></span>
<span id="cb3-5"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> msg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> validate(y):</span>
<span id="cb3-6">    validation_errors <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+=</span> msg</span>
<span id="cb3-7"></span>
<span id="cb3-8"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> msg <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> validate(z):</span>
<span id="cb3-9">    validation_errors <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+=</span> msg</span>
<span id="cb3-10"></span>
<span id="cb3-11"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> validation_errors: <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># a non-empty list resolves to True</span></span>
<span id="cb3-12">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> error <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> validation_errors:</span>
<span id="cb3-13">        <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(error)</span>
<span id="cb3-14">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">return</span></span></code></pre></div></div>
</section>
<section id="comprehensions" class="level2">
<h2 class="anchored" data-anchor-id="comprehensions">Comprehensions</h2>
<p>Let’s say we wanted to create a list of results from expensive function call but only results that aren’t <code>None</code>. With a list comprehension, the expensive function would need to be called twice. Not ideal.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb4-1">y <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [</span>
<span id="cb4-2">    expensive_function(i) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> expensive_function(i) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>)</span>
<span id="cb4-3">]</span></code></pre></div></div>
<p>Of course, you could use normal for loop syntax but it’s a fair bit more verbose, and for illustrative purposes, we’re allergic to verbose.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb5-1">y <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb5-2"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> a <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>):</span>
<span id="cb5-3">    x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> expensive_function(i)</span>
<span id="cb5-4">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">==</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>:</span>
<span id="cb5-5">        y.append(x)</span></code></pre></div></div>
<p>The walrus operator plops to the rescue here and allows us to use a list comprehension.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb6-1">y <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [</span>
<span id="cb6-2">    x <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> expensive_function(i)) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>)</span>
<span id="cb6-3">]</span></code></pre></div></div>
<p>This also applies to dictionary comprehensions.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb7-1">y <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> {</span>
<span id="cb7-2">    i: x <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> expensive_function(i)) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>)</span>
<span id="cb7-3">}</span></code></pre></div></div>
</section>
<section id="do-while-loops" class="level2">
<h2 class="anchored" data-anchor-id="do-while-loops">Do While Loops</h2>
<p>A do-while loop was proposed for Python in <a href="https://peps.python.org/pep-0315/">PEP 315</a> but was rejected for not providing a material improvement over the following:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb8-1"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">while</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>:</span>
<span id="cb8-2">    x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> f(a, b) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># setup code</span></span>
<span id="cb8-3">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">not</span> x:   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># condition</span></span>
<span id="cb8-4">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">break</span></span>
<span id="cb8-5">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># loop body using x</span></span></code></pre></div></div>
<p>A shortened version of do-while loop can be accomplished by having setup code execute once before the loop and moving the condition into a while loop. However, this is error-prone; <code>x = f(a, b)</code> is duplicated for both the setup code and the loop body, and if it needs changing there are now multiple places that must be updated.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb9-1">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> f(a, b) <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># setup code</span></span>
<span id="cb9-2"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">while</span> x:    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># condition</span></span>
<span id="cb9-3">    x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> f(a, b)</span>
<span id="cb9-4">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># loop body using x</span></span></code></pre></div></div>
<p>With the walrus operator, it can all be inlined to the while condition.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb10-1"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">while</span> x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> f(a, b): <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># setup code and condition</span></span>
<span id="cb10-2">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># loop body using x</span></span></code></pre></div></div>
</section>
<section id="pattern-matching" class="level2">
<h2 class="anchored" data-anchor-id="pattern-matching">Pattern Matching</h2>
<p>The walrus operator can also be useful in Pattern Matching. Structural Pattern Matching was introduced in Python 3.10 with <a href="https://peps.python.org/pep-0622/">PEP 622</a>. If you’re not yet familiar see <a href="https://peps.python.org/pep-0636/">PEP 363</a> for a tutorial. The walrus can be useful to inline a function call and store the return value in a variable for use in the cases.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb11-1"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">match</span> x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> f(a, b):</span>
<span id="cb11-2">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">case</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>:</span>
<span id="cb11-3">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># do stuff with x</span></span>
<span id="cb11-4">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">case</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>:</span>
<span id="cb11-5">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># do more stuff with x</span></span>
<span id="cb11-6">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">case</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>:</span>
<span id="cb11-7">        <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># even more doing with x</span></span></code></pre></div></div>
</section>
<section id="an-over-the-top-overuse-example" class="level2">
<h2 class="anchored" data-anchor-id="an-over-the-top-overuse-example">An Over-the-Top Overuse Example</h2>
<p>While the walrus operator is handy for shaving off a few lines of code, inlining too much can make code difficult to reason about. Use it sparingly, especially with other code-golfing operators. For example, with the ternary operator.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb12-1">height <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> get_height(name) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (name <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> get_name(user_id)) <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span></span></code></pre></div></div>
<p>I think this can be okay but I also think it’s clearer written long-form,</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb13" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb13-1"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> name <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> get_name(user_id):</span>
<span id="cb13-2">    height <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> get_height(name)</span>
<span id="cb13-3"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span>:</span>
<span id="cb13-4">    height <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span></span></code></pre></div></div>
<p>It could be formatted over multiple lines so it’s just as readible as a normal <code>if</code> / <code>else</code> and to keep the benefits of the ternary usage by only assigning <code>height</code> once, but it’s now a whopping 5 lines.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb14" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb14-1">height <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (</span>
<span id="cb14-2">    get_height(name)</span>
<span id="cb14-3">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (name <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> get_name(user_id))</span>
<span id="cb14-4">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">None</span></span>
<span id="cb14-5">)</span></code></pre></div></div>
<p>And remember, just because you can doesn’t mean you should write code like below, if you can avoid it. This example is modified from my own code.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb15-1">params: Dict[<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>, Dict[<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">str</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>]]</span>
<span id="cb15-2"></span>
<span id="cb15-3">sampler_weights <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (</span>
<span id="cb15-4">    {</span>
<span id="cb15-5">        ModeEnum(mode): weight</span>
<span id="cb15-6">        <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> mode, weight <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> normalize_weights(weights).items()</span>
<span id="cb15-7">    }</span>
<span id="cb15-8">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">if</span> (weights <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:=</span> params.get(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sampler"</span>, {}).get(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"weights"</span>))</span>
<span id="cb15-9">    <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">else</span> {<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x"</span>: <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"y"</span>: <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">0.5</span>}</span>
<span id="cb15-10">)</span></code></pre></div></div>
<p>Here, I’ve slapped a dictionary comprehension, a ternary operator, and a walrus operator into the same expression. There’s a lot going on, but it’s formatted over multiple lines to help delineate what’s happening. The variable, <code>params</code>, holds the contents of a configuration <code>.toml</code> that I needed to parse some weights from and convert into an dictionary of <code>{enum: weight}</code>.</p>


</section>

 ]]></description>
  <category>python</category>
  <guid>https://bear-toes.pages.dev/posts/waltzing_with_the_walrus/</guid>
  <pubDate>Sat, 12 Aug 2023 23:00:00 GMT</pubDate>
</item>
</channel>
</rss>
