<?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>Posts by Rito Ghosh</title>
<link>https://ritog.github.io/index.html</link>
<atom:link href="https://ritog.github.io/index.xml" rel="self" type="application/rss+xml"/>
<description></description>
<generator>quarto-1.3.450</generator>
<lastBuildDate>Mon, 05 Jan 2026 18:30:00 GMT</lastBuildDate>
<item>
  <title>Training a Hamiltonian Neural Network</title>
  <dc:creator>Ritobrata Ghosh</dc:creator>
  <link>https://ritog.github.io/posts/hamiltonian_nn/index.html</link>
  <description><![CDATA[ 




<section id="training-a-hamiltonian-neural-network-using-an-nn-for-simulating-the-phase-space-of-a-harmonic-oscillator" class="level2">
<h2 class="anchored" data-anchor-id="training-a-hamiltonian-neural-network-using-an-nn-for-simulating-the-phase-space-of-a-harmonic-oscillator">Training a Hamiltonian Neural Network: Using an NN for Simulating the Phase Space of a Harmonic Oscillator</h2>
<p><img src="https://ritog.github.io/posts/hamiltonian_nn/cover_hamiltonian_nn.png" class="img-fluid"></p>
</section>
<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>We can use Neural Networks not only for predicting the class of an image, completing sentences, or classifying sentiment of a paragraph of text. We can also use Neural Networks for solving scientific problems. In this article, you will learn about using a trained Neural Network to simulate the phase space of a Harmonic Oscillator (a weighted rigid pendulum). Here, there’s a twist. We will train the Neural Network not by calculating the loss between the outputs and the ground truth data, but we will <em>train using the derivatives</em>. We will leverage our Physics knowledge to train the Neural Network.</p>
</section>
<section id="prerequisites" class="level2">
<h2 class="anchored" data-anchor-id="prerequisites">Prerequisites</h2>
<p>I expect the reader to be knowledgeable about basics of training a Neural Network from scratch- using a library like PyTorch, Jax, etc. I will use PyTorch in this project. I expect no knowledge of Hamiltonian Dynamics or college-level Physics, but knowing the basics of Physics up to High School level. Being well-versed in Differential Calculus is required. Experience with Python is helpful. I also expect the reader to have read an earlier post on simulating a spring with Hamiltonian Mechanics and plotting the phase space as well as the trajectory: <a href="../../posts/implicit_euler/index.html">Modelling a Spring System in Hamiltonian Mechanics: Using Euler’s Method for Trajectory Plotting</a>.</p>
</section>
<section id="objectives" class="level2">
<h2 class="anchored" data-anchor-id="objectives">Objectives</h2>
<p>We will model our system using Hamiltonian Dynamics. And using the Python function, we will plot the phase space of the system. And then using the the derivatives, we will train a Neural Network using those derivatives. Then we will use the trained Neural Network to again simulate the system and plot the phase space of the system. And we will see how the NN is doing. If you don’t know about Hamiltonian Dynamics or phase spaces, then that’s okay. I will cover what we need.</p>
</section>
<section id="code" class="level2">
<h2 class="anchored" data-anchor-id="code">Code</h2>
<p>All code used in this project is available on GitHub: <a href="https://github.com/ritog/harmonic"><strong>ritog/harmonic</strong></a>.</p>
</section>
<section id="our-physical-system" class="level2">
<h2 class="anchored" data-anchor-id="our-physical-system">Our Physical System</h2>
<p>We will work with a rigid pendulum.</p>
<p><img src="https://ritog.github.io/posts/hamiltonian_nn/physical-pendulum-rod-and-ball.png" class="img-fluid"></p>
<p>The related variables are:</p>
<ul>
<li>A body of mass <img src="https://latex.codecogs.com/png.latex?m"> on a rigid rod of length <img src="https://latex.codecogs.com/png.latex?l"></li>
<li>Angle <img src="https://latex.codecogs.com/png.latex?q"> (<img src="https://latex.codecogs.com/png.latex?0"> is straight down)</li>
<li>Angular momentum, <img src="https://latex.codecogs.com/png.latex?p"></li>
<li>Gravity <img src="https://latex.codecogs.com/png.latex?g"></li>
</ul>
</section>
<section id="defining-the-hamiltonian-of-our-system" class="level2">
<h2 class="anchored" data-anchor-id="defining-the-hamiltonian-of-our-system">Defining the Hamiltonian of Our System</h2>
<ol type="1">
<li>Potential Energy(<img src="https://latex.codecogs.com/png.latex?V">): Height is <img src="https://latex.codecogs.com/png.latex?l(1-%5Ccos%7Bq%7D)">, so, <img src="https://latex.codecogs.com/png.latex?V%20=%20mgl(1-%5Ccos%7Bq%7D)"></li>
</ol>
<p>How? <img src="https://ritog.github.io/posts/hamiltonian_nn/triangle.png" class="img-fluid"></p>
<ol start="2" type="1">
<li>Kinetic Energy (<img src="https://latex.codecogs.com/png.latex?T">):</li>
</ol>
<p>Rotational kinetic energy is <img src="https://latex.codecogs.com/png.latex?%5Cdfrac12%20I%20%7B%5Comega%7D%5E2">. For a point mass, moment of inertia, <img src="https://latex.codecogs.com/png.latex?I=ml%5E2">, and angular velocity, <img src="https://latex.codecogs.com/png.latex?%5Comega%20=%20%5Cdfrac%7Bp%7D%7Bml%5E2%7D">.</p>
<p>So, Kinetic Energy in terms of momentum, <img src="https://latex.codecogs.com/png.latex?T(p)%20=%20%5Cdfrac%7Bp%5E2%7D%7B2ml%5E2%7D"></p>
<p>Remember that, in Hamiltonian mechanics, the Hamiltonian of the system is:</p>
<p><img src="https://latex.codecogs.com/png.latex?H(q,%20p)%20=%20V%20+%20T"></p>
<p>And the Hamiltonian equations are:</p>
<ol type="1">
<li><img src="https://latex.codecogs.com/png.latex?%5Cdfrac%7Bdq%7D%7Bdt%7D%20=%20%5Cdfrac%7B%5Cpartial%20H%7D%7B%5Cpartial%20p%7D"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cdfrac%7Bdp%7D%7Bdt%7D%20=%20-%5Cdfrac%7B%5Cpartial%20H%7D%7B%5Cpartial%20q%7D"></li>
</ol>
<p>If we calculate theses, we will get:</p>
<p><img src="https://latex.codecogs.com/png.latex?%5Cbegin%7Baligned%7D%0A%5Cfrac%7Bdq%7D%7Bdt%7D%20&amp;=%20%5Cfrac%7Bp%7D%7Bml%5E2%7D%20&amp;%20%5Ctext%7B(Angular%20Velocity)%7D%20%5C%5C%0A%5Cfrac%7Bdp%7D%7Bdt%7D%20&amp;=%20-mgl%20%5Csin%20q%20&amp;%20%5Ctext%7B(Torque%20due%20to%20Gravity)%7D%0A%5Cend%7Baligned%7D"></p>
<p>You can trust me, or check using a pen and paper. Remember that I said the same thing in the last article as well?</p>
</section>
<section id="implementing" class="level2">
<h2 class="anchored" data-anchor-id="implementing">Implementing</h2>
<p>This is how we implement this in Python. Using this function, we can find the derivatives, and using these, we can find the trajectory.</p>
<p>Here’s a basic implementation using NumPy:</p>
<div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">def</span> pendulum_dynamics(t, state: List, m, l, g) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> List:</span>
<span id="cb1-2">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""</span></span>
<span id="cb1-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    inputs:</span></span>
<span id="cb1-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    t: The current time, solvers expect it.</span></span>
<span id="cb1-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    state: A list or array containing [q, p].</span></span>
<span id="cb1-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    m: mass</span></span>
<span id="cb1-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    l: the length of the rigid pendulum</span></span>
<span id="cb1-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    g: gravitational acceleration</span></span>
<span id="cb1-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    output:</span></span>
<span id="cb1-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    the list [dq_dt, dp_dt]</span></span>
<span id="cb1-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    """</span></span>
<span id="cb1-12">    dq_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> state[<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> (m <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.power(l, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>))</span>
<span id="cb1-13">    dp_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>m <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> g <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> l <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> np.sin(state[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>])</span>
<span id="cb1-14">    <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">return</span> [dq_dt, dp_dt]</span></code></pre></div>
<p>Or, we can write a version using <code>torch</code>. This will make things better.</p>
<div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">def</span> pendulum_dynamics_tensor(t, state: torch.Tensor, m, l, g) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> torch.Tensor:</span>
<span id="cb2-2">    dq_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (state[:, <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> (m <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> torch.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">pow</span>(torch.tensor(l), <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">2</span>))).unsqueeze(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb2-3">    dp_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>m <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> g <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> l <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> torch.sin(state[:, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>])).unsqueeze(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb2-4">    <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">return</span> torch.cat([dq_dt, dp_dt], dim<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></code></pre></div>
<p>We can use the earlier function to plot the trajectory of the pendulum.</p>
<div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> pendulum_nonlinear <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pendulum_dynamics</span>
<span id="cb3-2"></span>
<span id="cb3-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># different initial states</span></span>
<span id="cb3-4">init_a <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 class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># small release</span></span>
<span id="cb3-5">init_b <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;">3.1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># close to top</span></span>
<span id="cb3-6">init_c <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="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5.0</span>]  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># close to bottom with force</span></span>
<span id="cb3-7"></span>
<span id="cb3-8"></span>
<span id="cb3-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># params</span></span>
<span id="cb3-10">m <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;">1.0</span>    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># mass</span></span>
<span id="cb3-11">l <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;">1.0</span>    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># length of rod</span></span>
<span id="cb3-12">dt <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.05</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># time-step</span></span>
<span id="cb3-13">g <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;">9.8</span>    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># gravitational acceleration</span></span>
<span id="cb3-14"></span>
<span id="cb3-15"></span>
<span id="cb3-16"></span>
<span id="cb3-17"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">def</span> run_simulation(init_state: List):</span>
<span id="cb3-18">    p_vals <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb3-19">    q_vals <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb3-20">    <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
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;">1_000</span>):</span>
<span id="cb3-21">        q, p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> init_state</span>
<span id="cb3-22">        _, dp_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pendulum_dynamics(t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>dt, state<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[q, p], m<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>m, l<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>l, g<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>g)</span>
<span id="cb3-23">        p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> dp_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> dt</span>
<span id="cb3-24">        dq_dt, _ <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pendulum_dynamics(t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>dt, state<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[q, p], m<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>m, l<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>l, g<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>g)</span>
<span id="cb3-25">        q <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> q <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> dq_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> dt</span>
<span id="cb3-26">        init_state <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [q, p]</span>
<span id="cb3-27">        q_vals.append(q)</span>
<span id="cb3-28">        p_vals.append(p)</span>
<span id="cb3-29">    <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">return</span> p_vals, q_vals</span>
<span id="cb3-30"></span>
<span id="cb3-31">a_p_vals, a_q_vals <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> run_simulation(init_a)</span>
<span id="cb3-32">b_p_vals, b_q_vals <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> run_simulation(init_b)</span>
<span id="cb3-33">c_p_vals, c_q_vals <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> run_simulation(init_c)</span>
<span id="cb3-34"></span>
<span id="cb3-35"></span>
<span id="cb3-36"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Plotting</span></span>
<span id="cb3-37">plt.plot(a_q_vals, a_p_vals, label<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;">"$q_0=0, p_0=0$"</span>)</span>
<span id="cb3-38">plt.plot(b_q_vals, b_p_vals, label<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;">"$q_0=3.1, p_0=0$"</span>)</span>
<span id="cb3-39">plt.plot(c_q_vals, c_p_vals, label<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;">"$q_0=0, p_0=5.0$"</span>)</span>
<span id="cb3-40">plt.xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$q$"</span>)</span>
<span id="cb3-41">plt.ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$p$"</span>)</span>
<span id="cb3-42">plt.title(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$p v. q$ for different inital conditions"</span>)</span>
<span id="cb3-43">plt.legend()</span>
<span id="cb3-44">plt.tight_layout()</span>
<span id="cb3-45">plt.show()</span></code></pre></div>
<p>This is the plot that the code generates:</p>
<p><img src="https://ritog.github.io/posts/hamiltonian_nn/Figure_3.png" class="img-fluid"></p>
<p>The Blue and green loops represent the pendulum swinging back and forth. It doesn’t have enough energy to go over the top, so it stays trapped in a closed loop. The Orange loop is right on the edge! If you had just a tiny bit more energy, the pendulum would stop swinging back and start spinning 360° continuously.</p>
<p>One of the reasons that Hamiltonian Neural Networks are better than vanilla Neural ODEs comes from Hamiltonian Mechanics. There’s a special property called Liouville’s Theorem, which says that the total area under the curve for the total set of initial points will be preserved for the total set of end points. That is, if you think of the initial points as a blob of points, then the blob might stretch, skew, twist, or distort, but the total area will remain constant. This is how Neural Networks handle data in higher dimension, and maps training data to target. I recommend that you watch Alfredo Canziani’s video from NYU CDS: <a href="https://youtu.be/0TdAmZUMj2k?si=dcQG-2jwaYiVwyHx&amp;t=1127">02 – Neural nets: rotation and squashing</a> to get great a visual grasp of this. These kind of transformations are modelled and studied extensively in Linear Algebra.</p>
<p>This incompressible flow of points, and fluid-like behaviour (as opposed to gas-like, as gases compress and expand) are great for Neural Networks, and NNs trained using Hamiltonian mechanics are much more robust and well-behaved than simple NODEs.</p>
<p>I am not writing more about this here. Maybe in a future post I write more on this.</p>
</section>
<section id="hamiltonian-neural-network" class="level2">
<h2 class="anchored" data-anchor-id="hamiltonian-neural-network">Hamiltonian Neural Network</h2>
<p>With our Python function, we can generate the data from our knowledge of Physics.</p>
<p>With Deep Learning, we solve the opposite problem- going from data to the Physics.</p>
<p>Standard Neural ODEs try to learn the derivatives directly from the available data.</p>
<p>Input: <img src="https://latex.codecogs.com/png.latex?(q,%20p)">, Output: <img src="https://latex.codecogs.com/png.latex?(%5Cdfrac%7Bdq%7D%7Bdt%7D,%20%5Cdfrac%7Bdp%7D%7Bdt%7D)"></p>
<p>But, Hamiltonian Neural Networks are smarter. Instead of training the NN to predict the data, we force the NN to <em>predict the Hamiltonian</em> of the system.</p>
<p><img src="https://latex.codecogs.com/png.latex?%5Chat%7BH%7D%20=%20NeuralNet(q,%20p;%5Ctheta)"></p>
<p>Here, <img src="https://latex.codecogs.com/png.latex?%5Ctheta"> is the set of trainable parameters of the neural network.</p>
<p>We ask the Neural Network to output the Hamiltonian of the system. And, <em>as the Neural Network is just a chain of differentiable math operations, if we calculate the gradients of the output ($), with respect to the variables <img src="https://latex.codecogs.com/png.latex?q"> and <img src="https://latex.codecogs.com/png.latex?p">, then, what we have are predicted time derivatives of the Hamiltonian</em>.</p>
<ol type="1">
<li><img src="https://latex.codecogs.com/png.latex?%5Cdfrac%7Bd%5Chat%7Bq%7D%7D%7Bdt%7D%20=%20%5Cdfrac%7B%5Cpartial%20%5Chat%7BH%7D%7D%7B%5Cpartial%20p%7D"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cdfrac%7Bd%5Chat%7Bp%7D%7D%7Bdt%7D%20=%20-%5Cdfrac%7B%5Cpartial%20%5Chat%7BH%7D%7D%7B%5Cpartial%20q%7D"></li>
</ol>
<p>Here is our Neural Network:</p>
<div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb4-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb4-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> torch <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> nn</span>
<span id="cb4-3"></span>
<span id="cb4-4">device <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;">"cuda"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">if</span> torch.cuda.is_available() <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">else</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cpu"</span></span>
<span id="cb4-5"></span>
<span id="cb4-6"></span>
<span id="cb4-7"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">class</span> HNN(nn.Module):</span>
<span id="cb4-8">    <span class="kw" style="color: #003B4F;
background-color: null;
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>):</span>
<span id="cb4-9">        <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">super</span>().<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">__init__</span>()</span>
<span id="cb4-10">        <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>.linear_block <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> nn.Sequential(</span>
<span id="cb4-11">            nn.Linear(<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;">200</span>),</span>
<span id="cb4-12">            nn.Tanh(),</span>
<span id="cb4-13">            nn.Linear(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span>),</span>
<span id="cb4-14">            nn.Tanh(),</span>
<span id="cb4-15">            nn.Linear(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>),</span>
<span id="cb4-16">        )</span>
<span id="cb4-17"></span>
<span id="cb4-18">    <span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">def</span> forward(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">self</span>, x):</span>
<span id="cb4-19">        H <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>.linear_block(x)</span>
<span id="cb4-20">        <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">return</span> H</span></code></pre></div>
<p>There are two things to note in the code:</p>
<ul>
<li>There is no activation function at the end of the final Fully Connected (FC) layer. Because we want the Neural Network to output a value that is perceived as the total energy of the system, and it’s a real-numbered value, not limited to the range of the <img src="https://latex.codecogs.com/png.latex?%5Ctanh%7B%7D"> function.</li>
<li>We chose the <code>tanh()</code> activation function. As the function is thoroughly differentiable at every point.</li>
</ul>
<p>We want to feed a batch of 200 pairs of <img src="https://latex.codecogs.com/png.latex?q"> and <img src="https://latex.codecogs.com/png.latex?p"> to the NN.</p>
</section>
<section id="training-the-hamiltonian-neural-network" class="level2">
<h2 class="anchored" data-anchor-id="training-the-hamiltonian-neural-network">Training the Hamiltonian Neural Network</h2>
<p>We want to write vectorized code. We don’t want to bottleneck the model by feeding in data through naive for loops.</p>
<p>For that, we can write a function to get the derivatives of the model, in batches:</p>
<div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines 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> torch</span>
<span id="cb5-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> HNN <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> HNN</span>
<span id="cb5-3"></span>
<span id="cb5-4">device <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;">"cuda"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">if</span> torch.cuda.is_available() <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">else</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cpu"</span></span>
<span id="cb5-5"></span>
<span id="cb5-6"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">def</span> get_model_time_derivatives(model, x):</span>
<span id="cb5-7">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""</span></span>
<span id="cb5-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    Compute time derivatives [dq/dt, dp/dt] for a batch of inputs.</span></span>
<span id="cb5-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    x: Tensor of shape (Batch_Size, 2)</span></span>
<span id="cb5-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    """</span></span>
<span id="cb5-11">    H_hat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> model(x)</span>
<span id="cb5-12"></span>
<span id="cb5-13">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># sum the energy to get a scalar,</span></span>
<span id="cb5-14">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># the gradients separate out perfectly per row</span></span>
<span id="cb5-15">    grads <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.autograd.grad(H_hat.<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">sum</span>(), x, create_graph<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="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb5-16"></span>
<span id="cb5-17">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># grads shape: (Batch, 2) -&gt; [dH/dq, dH/dp]</span></span>
<span id="cb5-18"></span>
<span id="cb5-19">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># flipping (Symplectic Swap (Hamilton's Eqs))</span></span>
<span id="cb5-20">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># dq/dt =  dH/dp</span></span>
<span id="cb5-21">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># dp/dt = -dH/dq</span></span>
<span id="cb5-22"></span>
<span id="cb5-23">    dH_dq <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> grads[:, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>].unsqueeze(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb5-24">    dH_dp <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> grads[:, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>].unsqueeze(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>)</span>
<span id="cb5-25"></span>
<span id="cb5-26">    <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">return</span> torch.cat([dH_dp, <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>dH_dq], dim<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="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># - because minus</span></span></code></pre></div>
<p>There is a nice trick with the summing up of the predicted Hamiltonians. PyTorch can only find gradients of scalars. And here we have a tensor of predicted Hamiltonians. We can just sum them up, and then find the gradient with respect to the whole batch of the inputs. And everything gets neatly stored in rows. Gradient of a sum is equal to sum of gradients.</p>
<p>I am not going deep into it for now. I hope that you know why this is the case.</p>
<p>Here’s what the training script looks like:</p>
<div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb6-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb6-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> tqdm <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> tqdm</span>
<span id="cb6-3"></span>
<span id="cb6-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> HNN <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> HNN</span>
<span id="cb6-5"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> hnn_model_derivs <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> get_model_time_derivatives</span>
<span id="cb6-6"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> pendulum_tensor <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pendulum_dynamics_tensor</span>
<span id="cb6-7"></span>
<span id="cb6-8">device <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;">"cuda"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">if</span> torch.cuda.is_available() <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">else</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cpu"</span></span>
<span id="cb6-9"></span>
<span id="cb6-10"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># params</span></span>
<span id="cb6-11">m <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;">1.0</span>    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># mass</span></span>
<span id="cb6-12">l <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;">1.0</span>    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># length of rod</span></span>
<span id="cb6-13">dt <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.05</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># time-step</span></span>
<span id="cb6-14">g <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;">9.8</span>    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># gravitational acceleration</span></span>
<span id="cb6-15"></span>
<span id="cb6-16">mean <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.tensor([<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;">3.0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">3.0</span>])</span>
<span id="cb6-17">std <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.1</span></span>
<span id="cb6-18">init_states <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;">6</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> torch.rand(<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;">2</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;">3</span>).to(device).requires_grad_()</span>
<span id="cb6-19"></span>
<span id="cb6-20">true_derivatives <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pendulum_dynamics_tensor(t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>dt, state<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>init_states, m<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>m, l<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>l, g<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>g)</span>
<span id="cb6-21"></span>
<span id="cb6-22">hamiltonian_nn <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> HNN().to(device)</span>
<span id="cb6-23">loss_func <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.nn.MSELoss()</span>
<span id="cb6-24">optimizer <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.optim.Adam(hamiltonian_nn.parameters(), lr<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;">1e-2</span>)</span>
<span id="cb6-25"></span>
<span id="cb6-26">n_epochs <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_200</span></span>
<span id="cb6-27"></span>
<span id="cb6-28"><span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">for</span> epoch <span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">in</span> tqdm(<span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(n_epochs <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="cb6-29">    deriv_pred <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> get_model_time_derivatives(hamiltonian_nn, init_states)</span>
<span id="cb6-30">    loss <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> loss_func(deriv_pred, true_derivatives)</span>
<span id="cb6-31"></span>
<span id="cb6-32">    optimizer.zero_grad()</span>
<span id="cb6-33">    loss.backward(retain_graph<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="cb6-34"></span>
<span id="cb6-35">    optimizer.step()</span>
<span id="cb6-36">    <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">if</span> epoch <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</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;">0</span>:</span>
<span id="cb6-37">        <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"Epoch: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>epoch<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">}</span><span class="ch" style="color: #20794D;
background-color: null;
font-style: inherit;">\t</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;"> Loss: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>loss<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="cb6-38"></span>
<span id="cb6-39">torch.save(hamiltonian_nn.state_dict(), <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"hamiltonian_nn_1.pth"</span>)</span></code></pre></div>
<p>Note the calculation of loss- <code>loss = loss_func(deriv_pred, true_derivatives)</code>. We calculate the loss between predicted and true derivatives. You are usually accustomed to see the loss being calculated between <code>y_pred</code> and <code>y</code>. But the parameters of the model get updated through backpropagation, as the optimizer receives them: <code>optimizer = torch.optim.Adam(hamiltonian_nn.parameters(), lr=1e-2)</code>.</p>
<p>After running this script, I had a loss of <img src="https://latex.codecogs.com/png.latex?0.0009111023391596973"> - which is great.</p>
<p>Note that I <em>train the model derivatives to be close to the true derivatives</em> - unlike normal NNs - where we train the model to output values close to the ground truth.</p>
<p>Throughout the training, and generating data, maintaining the graph of the computation is crucial.</p>
</section>
<section id="plotting-the-trajectory-as-predicted-using-the-model" class="level2">
<h2 class="anchored" data-anchor-id="plotting-the-trajectory-as-predicted-using-the-model">Plotting the Trajectory as Predicted Using the Model</h2>
<p>Now, I will plot the trajectory as solved from the derivatives predicted by the Neural Network. Here, we are using Semi-Implicit Euler’s Method to find points in the phase space. To learn more about this, read the previously mentioned post.</p>
<div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb7-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Here, we have an already trained HNN</span></span>
<span id="cb7-2"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># We use it to plot trajectory</span></span>
<span id="cb7-3"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> torch</span>
<span id="cb7-4"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> matplotlib <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb7-5"></span>
<span id="cb7-6"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> HNN <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> HNN</span>
<span id="cb7-7"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> hnn_model_derivs <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> get_model_time_derivatives</span>
<span id="cb7-8"></span>
<span id="cb7-9">device <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;">"cuda"</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">if</span> torch.cuda.is_available() <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">else</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"cpu"</span></span>
<span id="cb7-10"></span>
<span id="cb7-11"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># different initial states</span></span>
<span id="cb7-12">init_a <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;">0.5</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]).to(device)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># small release</span></span>
<span id="cb7-13">init_b <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;">3.1</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]).to(device)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># close to top</span></span>
<span id="cb7-14">init_c <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.tensor([<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5.0</span>]).to(device)  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># kicked from near bottom</span></span>
<span id="cb7-15"></span>
<span id="cb7-16"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># params</span></span>
<span id="cb7-17">m <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;">1.0</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># mass</span></span>
<span id="cb7-18">l <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;">1.0</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># length of rod</span></span>
<span id="cb7-19">dt <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.05</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># time-step</span></span>
<span id="cb7-20">g <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;">9.8</span>  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># gravitational acceleration</span></span>
<span id="cb7-21"></span>
<span id="cb7-22">hamiltonian_model <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> HNN().to(device)</span>
<span id="cb7-23">hamiltonian_model.load_state_dict(torch.load(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"hamiltonian_nn_1.pth"</span>, weights_only<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-24"></span>
<span id="cb7-25"></span>
<span id="cb7-26"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">def</span> run_simulation_HNN(init_state: torch.Tensor):</span>
<span id="cb7-27">    p_vals <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb7-28">    q_vals <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb7-29">    <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
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;">1_000</span>):</span>
<span id="cb7-30">        curr_state_tensor <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (</span>
<span id="cb7-31">            init_state.clone().detach().unsqueeze(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>).requires_grad_(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">True</span>)</span>
<span id="cb7-32">        )</span>
<span id="cb7-33">        derivs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> get_model_time_derivatives(hamiltonian_model, curr_state_tensor)</span>
<span id="cb7-34"></span>
<span id="cb7-35">        dq_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> derivs[<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;">0</span>]</span>
<span id="cb7-36">        dp_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> derivs[<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>]</span>
<span id="cb7-37"></span>
<span id="cb7-38">        q_old, p_old <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> init_state</span>
<span id="cb7-39"></span>
<span id="cb7-40">        p_new <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> p_old <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> dp_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> dt</span>
<span id="cb7-41">        q_new <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> q_old <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> dq_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> dt</span>
<span id="cb7-42"></span>
<span id="cb7-43">        init_state <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> torch.tensor([q_new, p_new]).to(device)</span>
<span id="cb7-44"></span>
<span id="cb7-45">        q_vals.append(q_new.item())</span>
<span id="cb7-46">        p_vals.append(p_new.item())</span>
<span id="cb7-47">    <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">return</span> p_vals, q_vals</span>
<span id="cb7-48"></span>
<span id="cb7-49"></span>
<span id="cb7-50">a_p_vals, a_q_vals <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> run_simulation_HNN(init_a)</span>
<span id="cb7-51">b_p_vals, b_q_vals <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> run_simulation_HNN(init_b)</span>
<span id="cb7-52">c_p_vals, c_q_vals <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> run_simulation_HNN(init_c)</span>
<span id="cb7-53"></span>
<span id="cb7-54"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Plotting</span></span>
<span id="cb7-55">plt.plot(a_q_vals, a_p_vals, label<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;">"$q_0=0, p_0=0$"</span>)</span>
<span id="cb7-56">plt.plot(b_q_vals, b_p_vals, label<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;">"$q_0=3.1, p_0=0$"</span>)</span>
<span id="cb7-57">plt.plot(c_q_vals, c_p_vals, label<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;">"$q_0=0, p_0=5.0$"</span>)</span>
<span id="cb7-58"></span>
<span id="cb7-59">plt.xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$q$"</span>)</span>
<span id="cb7-60">plt.ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$p$"</span>)</span>
<span id="cb7-61">plt.title(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"$p  v. q$ for different inital conditions simulated via Hamiltonian NN"</span>)</span>
<span id="cb7-62">plt.legend()</span>
<span id="cb7-63">plt.tight_layout()</span>
<span id="cb7-64">plt.savefig(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"FIG5.png"</span>)</span></code></pre></div>
<p>Note that, we are not using a Python function for this plot, but load the trained weights from a <code>.pth</code> file: <code>hamiltonian_model.load_state_dict(torch.load("hamiltonian_nn_1.pth", weights_only=True))</code>.</p>
<p>This is the plot that we get:</p>
<p><img src="https://ritog.github.io/posts/hamiltonian_nn/FIG5.png" class="img-fluid"></p>
<p>For the inner loops (blue and green), The network did a decent job learning the “swinging” motion! It captured the concentric nature of the phase space near the center. The outer “loop” (orange): This trajectory starts at q=3.1. In our clean phase space figure, this was a closed loop (the “eye”). In our HNN simulation, it drifts off significantly.</p>
<p>This is due to the fact that the point was an out-of-distribution data point for the model.</p>
</section>
<section id="conclusion" class="level2">
<h2 class="anchored" data-anchor-id="conclusion">Conclusion</h2>
<p>We have trained a Neural Network’s parameters so that the model learns the Physics from the data, by making <em>its gradients</em> be close to the real derivatives. We saw that we can leverage our Physics knowledge in training of Neural Networks, and leverage Physical properties like Liouville’s Theorem to train well-behaved NNs with predictable behaviour.</p>
<hr>
<section id="discuss" class="level3">
<h3 class="anchored" data-anchor-id="discuss">Discuss</h3>
<p>If you have read this post, and found it interesting or edifying, please let me know. I would like that very much. If you have any criticism, suggestion, or want to tell me anything, just add a comment or let me know privately. Discuss this post on the <a href="https://mathstodon.xyz/@rg/115844261208692910">Fediverse</a>, <a href="https://news.ycombinator.com/item?id=46508707">Hacker News</a>, or <a href="https://x.com/AllesistKode/status/2008268111871713479">Twitter/X</a>.</p>
</section>
<section id="changelog" class="level3">
<h3 class="anchored" data-anchor-id="changelog">Changelog</h3>
<p>This is an Open Source blog. Feel free to inspect diffs in the GitHub <a href="https://github.com/ritog/ritog.github.io">repo</a>.</p>
<p><img src="https://ritog.github.io/posts/hamiltonian_nn/human-gen-sticker.png" width="256"></p>
<hr>
</section>
<section id="cite-this-article" class="level3">
<h3 class="anchored" data-anchor-id="cite-this-article">Cite this Article</h3>
<pre><code>@ONLINE {,
    author = "Ritobrata Ghosh",
    title  = "Training a Hamiltonian Neural Network",
    month  = "jan",
    year   = "2026",
    url    = "https://ritog.github.io/posts/hamiltonian_nn"
}</code></pre>


</section>
</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div id="quarto-reuse" class="quarto-appendix-contents"><div>CC-BY-NC-SA</div></div></section></div> ]]></description>
  <category>deep-learning</category>
  <category>physics</category>
  <category>computational-math</category>
  <guid>https://ritog.github.io/posts/hamiltonian_nn/index.html</guid>
  <pubDate>Mon, 05 Jan 2026 18:30:00 GMT</pubDate>
  <media:content url="https://ritog.github.io/posts/hamiltonian_nn/cover_hamiltonian_nn.png" medium="image" type="image/png" height="79" width="144"/>
</item>
<item>
  <title>Modelling a Spring System in Hamiltonian Mechanics</title>
  <dc:creator>Ritobrata Ghosh</dc:creator>
  <link>https://ritog.github.io/posts/implicit_euler/index.html</link>
  <description><![CDATA[ 




<section id="modelling-a-spring-system-in-hamiltonian-mechanics-using-euler-method-for-trajectory" class="level2">
<h2 class="anchored" data-anchor-id="modelling-a-spring-system-in-hamiltonian-mechanics-using-euler-method-for-trajectory">Modelling a Spring System in Hamiltonian Mechanics: Using Euler Method for Trajectory</h2>
<p><img src="https://ritog.github.io/posts/implicit_euler/euler_cover.png" class="img-fluid"></p>
</section>
<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>Hamiltonian Mechanics provides us with ways to deal with dynamical systems computationally. We can simulate a system of a weighted spring using Hamiltonian mechanics. We can plot trajectories using the simulation. We will use Euler’s method and Semi-Implicit Euler’s method to plot phase spaces, and compare between them. In a future post, I will describe the training of a Hamiltonian Neural Network for learning the physics of a non-linear system, and simulate it.</p>
</section>
<section id="code" class="level2">
<h2 class="anchored" data-anchor-id="code">Code</h2>
<p>All code used in this project, as well as code that can be used to reproduce the project can be found on GitHub: <a href="https://github.com/ritog/spring_hamiltonian">ritog/spring_hamiltonian</a>.</p>
</section>
<section id="prerequisites" class="level2">
<h2 class="anchored" data-anchor-id="prerequisites">Prerequisites</h2>
<p>I expect the reader to have some programming background in any imperative language. I will use Python. I expect no knowledge of Hamiltonian Dynamics or college-level Physics, but knowing the basics of Physics up to High School level is needed. Being well-versed in Differential Calculus is required. Experience with Python is helpful.</p>
</section>
<section id="objectives" class="level2">
<h2 class="anchored" data-anchor-id="objectives">Objectives</h2>
<p>We will model our system using Hamiltonian Dynamics. We will first write a function to get derivatives of two variables at each step. And using the Python function, we will plot the phase space of the system. For doing that we will need to integrate them using a DE solver - we will use Euler’s method. Then we will see if that suffices. If not, we will switch to implicit Euler, and plot the same phase space. If you don’t know about Hamiltonian Dynamics or phase spaces, then that’s okay. I will cover what we need. This is a trivial example for something I want to build up to- training a Hamiltonian Neural Network. But that’s not the objective of this article.</p>
</section>
<section id="our-system" class="level2">
<h2 class="anchored" data-anchor-id="our-system">Our System</h2>
<p>We have a mass <img src="https://latex.codecogs.com/png.latex?m"> attached to a spring of negligible mass.</p>
<p><img src="https://ritog.github.io/posts/implicit_euler/system.jpg" class="img-fluid"></p>
<p>And we are concerned with only two variables of the system- the position <img src="https://latex.codecogs.com/png.latex?q">, and the momentum <img src="https://latex.codecogs.com/png.latex?p"> (<img src="https://latex.codecogs.com/png.latex?p%20=%20m%20%5Ccdot%20v">). These are the only two variables needed to construct the Hamiltonian. And if we plot <img src="https://latex.codecogs.com/png.latex?p"> versus <img src="https://latex.codecogs.com/png.latex?q"> in a 2-dimensional figure, what we get is called a <strong>phase space</strong>.</p>
</section>
<section id="hamiltonian-of-the-system" class="level2">
<h2 class="anchored" data-anchor-id="hamiltonian-of-the-system">Hamiltonian of the System</h2>
<p>The Hamiltonian of the system is the total energy of the system. It is the sum of kinetic and potential energies of that system. And it is characterized by position and momentum of a particular body.</p>
<p>You are probably more familiar with Newtonian Mechanics where we are more concerned with <em>force</em>. Newton’s Second Law of Motion, <img src="https://latex.codecogs.com/png.latex?F%20=%20ma">, is a second-order differential equation, <img src="https://latex.codecogs.com/png.latex?F%20=%20m%20%5Ctimes%20%5Cdfrac%7Bd%5E2x%7D%7Bdt%5E2%7D">, where <img src="https://latex.codecogs.com/png.latex?x"> denotes the position of the body. Computational solvers work better with first-order differential equation, or a system of first-order DEs. If you would like to read a nice article on DEs and solving them computationally with Julia, read this post: <a href="../../posts/1st-order-DE-julia/1st_order_DE_julia.html">Solving First Order Differential Equations with Julia</a>, <a href="https://news.ycombinator.com/item?id=43245172">Hacker News discussion</a>.</p>
<p>With Hamiltonian system, we get what computers are better at solving. Although that’s not why it was invented or used for a long time. With Hamiltonian mechanics, we have conservation laws baked in, and it can represent evolution of the system through time as a flow, and it provides many geometrical niceties which we will not delve (I know) deep into in this article.</p>
<p>The Hamiltonian of our system, is the sum of kinetic and potential energies of the system. And it is always conserved.</p>
<p>Hamiltonian, <img src="https://latex.codecogs.com/png.latex?H"> of our system:</p>
<p><img src="https://latex.codecogs.com/png.latex?H(q,%20p)%20=%20%5Ctext%7BKinetic%20Energy%20+%20Potential%20Energy%7D"></p>
<p>The Hamiltonian is a function of <img src="https://latex.codecogs.com/png.latex?p"> and <img src="https://latex.codecogs.com/png.latex?q"> only.</p>
<p><img src="https://latex.codecogs.com/png.latex?H(q,%20p)%20=%20%5Cdfrac12%20mv%5E2%20+%20%5Cdfrac12%20kx%5E2"></p>
<p>The above equation can be re-written as:</p>
<p><img src="https://latex.codecogs.com/png.latex?H(q,%20p)%20=%20%5Cdfrac%7Bp%5E2%7D%7B2m%7D%20+%20%5Cdfrac12%20kq%5E2"></p>
<p>As <img src="https://latex.codecogs.com/png.latex?v%20=%20%5Cdfrac%7Bp%7D%7Bm%7D">. And the position <img src="https://latex.codecogs.com/png.latex?x"> is simply rewritten as <img src="https://latex.codecogs.com/png.latex?q">.</p>
</section>
<section id="hamiltonian-equations" class="level2">
<h2 class="anchored" data-anchor-id="hamiltonian-equations">Hamiltonian Equations</h2>
<p>The Hamiltonian Equations are:</p>
<ol type="1">
<li><img src="https://latex.codecogs.com/png.latex?%5Cdfrac%7Bdq%7D%7Bdt%7D%20=%20%5Cdfrac%7B%5Cpartial%20H%7D%7B%5Cpartial%20p%7D"></li>
<li><img src="https://latex.codecogs.com/png.latex?%5Cdfrac%7Bdp%7D%7Bdt%7D%20=%20-%5Cdfrac%7B%5Cpartial%20H%7D%7B%5Cpartial%20q%7D"></li>
</ol>
<p>If you have never seen partial derivatives before- they are simple if you know derivatives. In partial derivatives, the variable you are differentiating with respect to, is treated as a variable. All other variables, <em>and constants</em> are treated as constants.</p>
<p>Let’s say there is a function, <img src="https://latex.codecogs.com/png.latex?f(m,%20n)%20=%20m%5E2n%20+%20n%5E3m%20+%20m%20-%20n"> then <img src="https://latex.codecogs.com/png.latex?%5Cdfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20m%7D%20=%202mn%20+%20n%5E3%20+%201"> and <img src="https://latex.codecogs.com/png.latex?%5Cdfrac%7B%5Cpartial%20f%7D%7B%5Cpartial%20n%7D%20=%20m%5E2%20+%203n%5E2m%20-%201">. Even though <img src="https://latex.codecogs.com/png.latex?m"> and <img src="https://latex.codecogs.com/png.latex?n"> are variables, when we are differentiating with respect to one of them, we are treating the other as a constant.</p>
<p>Now, if we calculate the Right Hand Sides of 1 and 2 above, we get,</p>
<p><img src="https://latex.codecogs.com/png.latex?%5Cbegin%7Baligned%7D%0A%5Cfrac%7Bdq%7D%7Bdt%7D%20&amp;=%20%5Cfrac%7Bp%7D%7Bm%7D%20%5C%5C%0A%5Cfrac%7Bdp%7D%7Bdt%7D%20&amp;=%20-kq%0A%5Cend%7Baligned%7D"></p>
<p>You either trust me, or pick up a pen and paper and work through them!</p>
<p>Now, look at the equations above. This is the core beauty of Hamiltonian mechanics. The change in <img src="https://latex.codecogs.com/png.latex?q"> through time is dependent on <img src="https://latex.codecogs.com/png.latex?p"> and the change in <img src="https://latex.codecogs.com/png.latex?p"> is dependent on <img src="https://latex.codecogs.com/png.latex?q">.</p>
</section>
<section id="writing-a-program" class="level2">
<h2 class="anchored" data-anchor-id="writing-a-program">Writing a Program</h2>
<p>Now we can code up the Python function that will give us <img src="https://latex.codecogs.com/png.latex?%5Cfrac%7Bdq%7D%7Bdt%7D"> and <img src="https://latex.codecogs.com/png.latex?%5Cfrac%7Bdp%7D%7Bdt%7D">. This is where we will get the true derivatives that will later guide our training, and will also help up simulate the system.</p>
<div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">def</span> harmonic_dynamics(t, state: List, m, k) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-&gt;</span> List:</span>
<span id="cb1-2">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">"""</span></span>
<span id="cb1-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    inputs:</span></span>
<span id="cb1-4"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    t: The current time, solvers expect it.</span></span>
<span id="cb1-5"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    state: A list or array containing [q, p].</span></span>
<span id="cb1-6"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    m, k: The mass and spring constant.</span></span>
<span id="cb1-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    output:</span></span>
<span id="cb1-8"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    the list [dq_dt, dp_dt]</span></span>
<span id="cb1-9"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">    """</span></span>
<span id="cb1-10">    dq_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> state[<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> m</span>
<span id="cb1-11">    dp_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> state[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>]</span>
<span id="cb1-12">    <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">return</span> [dq_dt, dp_dt]</span></code></pre></div>
<p>This is a basic function that returns a Python array. We will not deal with PyTorch arrays or SIMD hardware for now.</p>
<p>This function returns terms analogous to velocities, but to plot the phase space, we will need something analogous to positions. And we need to integrate.</p>
</section>
<section id="eulers-method" class="level2">
<h2 class="anchored" data-anchor-id="eulers-method">Euler’s Method</h2>
<p>We could use something like <a href="https://docs.scipy.org/doc//scipy-1.16.2/tutorial/integrate.html"><code>scipy.integrate</code></a>, but let’s implement our own solver in Python. We will implement a solver using the Euler Method.</p>
<p>You can read formally about Euler Method in any decent book covering DEs, but, put simply, it says that- <em>“The state in the next moment is the current state plus a small step in the direction of the derivative.”</em></p>
<p>In Math:</p>
<p><img src="https://latex.codecogs.com/png.latex?%5Cmathbf%7By%7D_%7Bt+dt%7D%20=%20%5Cmathbf%7By%7D_t%20+%20%5Cdfrac%7Bd%5Cmathbf%7By%7D%7D%7Bdt%7D%20%5Ccdot%20dt"></p>
</section>
<section id="coding-things-up-the-dynamics-of-the-system" class="level2">
<h2 class="anchored" data-anchor-id="coding-things-up-the-dynamics-of-the-system">Coding Things Up: The Dynamics of the System</h2>
<p>Now, we can get the “positions” in the phase space, using the code below.</p>
<div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> harmonic <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> harmonic_dynamics</span>
<span id="cb2-2"></span>
<span id="cb2-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># params</span></span>
<span id="cb2-4">m <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;">1.0</span>&nbsp; <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># mass</span></span>
<span id="cb2-5">k <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;">1.0</span>&nbsp; <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># spring constant</span></span>
<span id="cb2-6">q0 <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>&nbsp;  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># initial position</span></span>
<span id="cb2-7">p0 <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>&nbsp;  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># initial momentum</span></span>
<span id="cb2-8">dt <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.1</span>&nbsp;<span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># time-step</span></span>
<span id="cb2-9"></span>
<span id="cb2-10">init_state <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> q0, p0</span>
<span id="cb2-11">q_vals <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb2-12">p_vals <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> []</span>
<span id="cb2-13"></span>
<span id="cb2-14"><span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
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;">200</span>):</span>
<span id="cb2-15">&nbsp; &nbsp; q, p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> init_state</span>
<span id="cb2-16">&nbsp; &nbsp; dq_dt, dp_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> harmonic_dynamics(t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>dt, state<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[q,p], m<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>m, k<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>k)</span>
<span id="cb2-17">&nbsp; &nbsp; q <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> q <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> dq_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> dt</span>
<span id="cb2-18">&nbsp; &nbsp; p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> dp_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> dt</span>
<span id="cb2-19">&nbsp; &nbsp; init_state <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [q, p]</span>
<span id="cb2-20">&nbsp; &nbsp; q_vals.append(q)</span>
<span id="cb2-21">&nbsp; &nbsp; p_vals.append(p)</span></code></pre></div>
<p>We are taking the following values for the system:</p>
<ul>
<li>mass, <img src="https://latex.codecogs.com/png.latex?m%20=%201.0"></li>
<li>spring constant, <img src="https://latex.codecogs.com/png.latex?k=1"></li>
<li>initial position, <img src="https://latex.codecogs.com/png.latex?q_0%20=%200"></li>
<li>initial momentum, <img src="https://latex.codecogs.com/png.latex?p_0%20=%201"> (started at the center with some momentum)</li>
</ul>
<p>And for time-stepping, we are taking <img src="https://latex.codecogs.com/png.latex?dt%20=%200.1">.</p>
<p>Now if we plot both q vs.&nbsp;p (phase space), and q vs.&nbsp;t, we will get:</p>
<p><img src="https://ritog.github.io/posts/implicit_euler/Figure_1.png" class="img-fluid"></p>
</section>
<section id="semi-implicit-eulers-method" class="level2">
<h2 class="anchored" data-anchor-id="semi-implicit-eulers-method">Semi-Implicit Euler’s Method</h2>
<p>We see that the q vs.&nbsp;p plot is spiralling outward with time. This is not the expected behaviour as the total energy is supposed to be conserved. We also see that this ideal version of the spring is swinging more and more as time goes on. This is not happening due to friction or gravity. They are not even considered here! And nothing is <em>pumping</em> energy into the system.</p>
<p>This is happening due to the limits of Euler’s Method. Imagine walking on a circular track. Euler’s Method says, “take a direction in the direction of the path- the tangent. If you take a straight step along the tangent of a circle, you land slightly outside the circle. Do this 200 times, and you spiral outwards.</p>
<p>To fix this, we need a Symplectic integrator- one that preserves the area in phase space (and thus behaves better with energy). The simplest version is Semi-Implicit Euler.</p>
<p>Instead of updating both q and p based on the old state, we update one, and then use that new value to update the other.</p>
<p>We do this:</p>
<ul>
<li>Calculate dp_dt using the current q.</li>
<li>Immediately update p.</li>
<li>Then, calculate dq_dt using this new, updated p.</li>
<li>Update q using that.</li>
</ul>
<p>Things will be clearer in code. We keep everything else intact. But we change the loop to this:</p>
<div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb3-1"> <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
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;">200</span>):</span>
<span id="cb3-2">    q, p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> init_state</span>
<span id="cb3-3">    _, dp_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> harmonic_dynamics(t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>dt, state<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[q, p], m<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>m, k<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>k)</span>
<span id="cb3-4">    p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> dp_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> dt</span>
<span id="cb3-5">    dq_dt, _ <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> harmonic_dynamics(t<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>dt, state<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>[q, p], m<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>m, k<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>k)</span>
<span id="cb3-6">    q <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> q <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">+</span> dq_dt <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> dt</span>
<span id="cb3-7">    init_state <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> [q, p]</span>
<span id="cb3-8">    q_vals.append(q)</span>
<span id="cb3-9">    p_vals.append(p) </span></code></pre></div>
<p>Doing this, if we plot again, we get:</p>
<p><img src="https://ritog.github.io/posts/implicit_euler/Figure_2.png" class="img-fluid"></p>
<p>Now, it is a well-behaved phase space with no spiralling. And the position vs.&nbsp;time plot is also a smooth sinusoidal wave, as expected.</p>
</section>
<section id="conclusion" class="level2">
<h2 class="anchored" data-anchor-id="conclusion">Conclusion</h2>
<p>We saw that, while simulating a weighted spring in Hamiltonian mechanics, the way we choose to integrate matters a lot.</p>
<p>This was a linear system. In a future post, I will simulate a non-linear system, and train a Hamiltonian Neural Network to simulate the system.</p>
<hr>
<section id="discuss" class="level3">
<h3 class="anchored" data-anchor-id="discuss">Discuss</h3>
<p>If you have read this post, and found it interesting or edifying, please let me know. I would like that very much. If you have any criticism, suggestion, or want to tell me anything, just add a comment or let me know privately. Discuss this post on the <a href="https://mathstodon.xyz/@rg/115827298165244834">Fediverse</a>, <a href="https://news.ycombinator.com/item?id=46468733">Hacker News</a>, or <a href="https://x.com/AllesistKode/status/2007180722139017609">Twitter/X</a>.</p>
</section>
<section id="changelog" class="level3">
<h3 class="anchored" data-anchor-id="changelog">Changelog</h3>
<p>This is an Open Source blog. Feel free to inspect diffs in the GitHub <a href="https://github.com/ritog/ritog.github.io">repo</a>.</p>
<p><img src="https://ritog.github.io/posts/implicit_euler/human-gen-sticker.png" width="256"></p>
<hr>
</section>
<section id="cite-this-article" class="level3">
<h3 class="anchored" data-anchor-id="cite-this-article">Cite this Article</h3>
<pre><code>@ONLINE {,
    author = "Ritobrata Ghosh",
    title  = "Modelling a Spring System in Hamiltonian Mechanics",
    month  = "jan",
    year   = "2026",
    url    = "https://ritog.github.io/posts/implicit_euler"
}</code></pre>
</section>
<section id="support" class="level3">
<h3 class="anchored" data-anchor-id="support">Support</h3>
<p>I highly appreciate donations. If you liked this post, or the content in the site in general, support me via <a href="https://ko-fi.com/ritog">Ko-Fi</a>, <a href="https://liberapay.com/ritog">Liberapay</a> or if you are in India, via UPI <a href="https://i.imgur.com/D9rTvVN.png">ritogh8@oksbi</a>.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="https://ko-fi.com/B0B33QVX2"><img src="https://ritog.github.io/posts/implicit_euler/https:/ko-fi.com/img/githubbutton_sm.svg" class="img-fluid figure-img"></a></p>
</figure>
</div>
<script src="https://liberapay.com/ritog/widgets/button.js"></script>
<noscript>
<a href="https://liberapay.com/ritog/donate"><img alt="Donate using Liberapay" src="https://ritog.github.io/posts/implicit_euler/https:/liberapay.com/assets/widgets/donate.svg"></a>
</noscript>


</section>
</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div id="quarto-reuse" class="quarto-appendix-contents"><div>CC-BY-NC-SA</div></div></section></div> ]]></description>
  <category>math</category>
  <category>physics</category>
  <category>computational-math</category>
  <guid>https://ritog.github.io/posts/implicit_euler/index.html</guid>
  <pubDate>Fri, 02 Jan 2026 18:30:00 GMT</pubDate>
  <media:content url="https://ritog.github.io/posts/implicit_euler/euler_cover.png" medium="image" type="image/png" height="79" width="144"/>
</item>
<item>
  <title>Solving First Order Differential Equations with Julia</title>
  <dc:creator>Ritobrata Ghosh</dc:creator>
  <link>https://ritog.github.io/posts/1st-order-DE-julia/1st_order_DE_julia.html</link>
  <description><![CDATA[ 




<section id="solving-first-order-differential-equations-with-julia" class="level2">
<h2 class="anchored" data-anchor-id="solving-first-order-differential-equations-with-julia">Solving First Order Differential Equations with Julia</h2>
<p><img src="https://ritog.github.io/posts/1st-order-DE-julia/fractal-2008101.jpg" class="img-fluid"></p>
<p>Image by <a href="https://pixabay.com/users/thedigitalartist-202249/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2008101">Pete Linforth</a> from <a href="https://pixabay.com//?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=2008101">Pixabay</a></p>
<section id="introduction" class="level3">
<h3 class="anchored" data-anchor-id="introduction">Introduction</h3>
<p>In this tutorial, we will learn about solving Differential Equations with Julia. Differential Equations are everywhere in Science and Engineering problems. And, being able to solve Differential Equations using computers is very convenient. We will use the <a href="https://docs.sciml.ai/DiffEqDocs/stable/">DifferentialEquations.jl</a> package for solving Differential Equations.</p>
</section>
<section id="who-is-this-for" class="level3">
<h3 class="anchored" data-anchor-id="who-is-this-for">Who is this for</h3>
<p>This is for people who are already familiar with Differential Equations from Mathematics, and who can code, preferably in Julia. Only the very basics of Julia language is required. If you are unfamiliar with Julia, and yet you have non-trivial experience with any of Python, C/C++, Ruby, JavaScript, golang, etc., you are fine, and you can follow along.</p>
</section>
<section id="what-we-will-do" class="level3">
<h3 class="anchored" data-anchor-id="what-we-will-do">What we will do</h3>
<p>In this tutorial, we will only focus on using the high level API of the DifferentialEquations.jl package, and we will learn, <em>from scratch</em>, how to translate linear first order Differential Equations to Julia, and how to solve them using the library. We will not learn about and code up numerical methods of solving Differential Equations such as <a href="https://tutorial.math.lamar.edu/classes/de/eulersmethod.aspx">Euler’s method</a>, <a href="https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods">Runge-Kutta methods</a>, etc. Neither we will talk about testing for accuracy, testing convergence of our algorithms. We will simply and plainly have some DEs in our familiar mathematical notation, and then translate them to a form Julia and the library can understand, and then we call high level APIs of the <code>DifferentialEquations.jl</code> library to solve our DEs. That’s it.</p>
<p>And for this post, we are limiting ourselves to First Order Differential Equations.</p>
</section>
<section id="what-are-differential-equations-a-very-quick-recap" class="level3">
<h3 class="anchored" data-anchor-id="what-are-differential-equations-a-very-quick-recap">What are Differential Equations: a <em>very</em> quick recap</h3>
<section id="normal-equations" class="level4">
<h4 class="anchored" data-anchor-id="normal-equations"><em>“Normal”</em> Equations</h4>
<p>Let’s take a step back and discuss normal equations first. Normal equations are equations involving one or more unknown roots. Like this:</p>
<p><img src="https://latex.codecogs.com/png.latex?x%5E2%20-%203x%20-%2018%20=%200"></p>
<p>And you solve this equation for two values of <img src="https://latex.codecogs.com/png.latex?x">, since this equation is quadratic.</p>
<p>How do you <em>create</em> this equation? You formulate an equation from a real-world scenario. Here’s an example, from which you will get the above equation:</p>
<blockquote class="blockquote">
<p>A farmer is designing a rectangular vegetable garden. The length of the garden is 3 meters longer than its width. The total area of the garden is 18 square meters. How long are the sides of this garden?</p>
</blockquote>
<p>This is how the equation is created: <img src="https://latex.codecogs.com/png.latex?x(x-3)%20=%2018">, where <img src="https://latex.codecogs.com/png.latex?x"> is the length of the longer side of the garden.</p>
</section>
<section id="differential-equations" class="level4">
<h4 class="anchored" data-anchor-id="differential-equations">Differential Equations</h4>
<p>In normal equations, we solve the equation to find out values of variables previously unknown to us. In case of Differential Equations, we solve to find out <strong><em>functions</em></strong> previously unknown to us.</p>
<p>For normal equations, we find out a relation of the unknown variable with something known to us, concretely.</p>
<p>In DEs, we know how an unknown functions <em>changes</em> with time, or another variable. We form our equation with this derivative of an unknown function, and it’s derivatives- one or more.</p>
<p>It might look like this:</p>
<p><img src="https://latex.codecogs.com/png.latex?%5Cdfrac%7Bdy%7D%7Bdx%7D%20=%20-y"></p>
<p>Differential Equations are used to model real-world happenings, and we aim to solve for that function.</p>
<p>Forming a Differential Equation is only possible when there is a function that changes with another variable, let’s say, time. It is not enough for the output of a function to differ with time, it is also necessary that the <em>function itself</em> changes with time.</p>
<p>Here are some examples:</p>
<ul>
<li><p>An ideal candle burns at a constant rate, i.e.&nbsp;the rate of burning of wax is the same when the candle is in its full length, as well as when it is nearly finished. But, the growth rate of population is not the same when the population is low as well as when it is hight. Not only population itself increases as population increases, but the rate of increase of population also increases with growing population. (Here I am talking about human population in modern age- with the absence of a natural predator, exceptionally good medical facilities, etc.)</p></li>
<li><p>Another example I can think of is the water emission rate of a hole that is used to empty a water tank. When the water tank is nearly full, the rate of emission of water from the hole is very high, but when the tank is almost empty, the rate of water emission is much lower.</p></li>
<li><p>When you have just made coffee, and say it’s temperature is <img src="https://latex.codecogs.com/png.latex?70%20%5E%5Ccirc%20C">, and your surrounding temperature is <img src="https://latex.codecogs.com/png.latex?8%20%5E%5Ccirc%20C">, the time taken by the coffee to reach <img src="https://latex.codecogs.com/png.latex?30%20%5E%5Ccirc%20C"> is much lower than the time it takes to reach <img src="https://latex.codecogs.com/png.latex?8%20%5E%5Ccirc%20C"> from <img src="https://latex.codecogs.com/png.latex?12%20%5E%5Ccirc%20C">. The <em>process of cooling</em> is slower when the temperature difference is lower compared to when the temperature difference is larger. We will deal with this situation in our second example.</p></li>
</ul>
<p>These are the situations that you model using Differential Equations.</p>
</section>
</section>
<section id="numerical-solutions-of-differential-equations" class="level3">
<h3 class="anchored" data-anchor-id="numerical-solutions-of-differential-equations">Numerical Solutions of Differential Equations</h3>
<p>There are some situations where finding the exact solution to a Differential Equation is not possible, or is impractical. This is why we try to find approximate solution. In many situations, this is good enough. When an analytical solution is impossible, numerical solutions is all we have.</p>
<section id="what-we-expect-here" class="level4">
<h4 class="anchored" data-anchor-id="what-we-expect-here">What we expect here</h4>
<p>For the Differential Equations that we will implement here, and will solve numerically, we will see a graph that will predict the behavior of the unknown function.</p>
</section>
</section>
<section id="first-example-radioactive-decay" class="level3">
<h3 class="anchored" data-anchor-id="first-example-radioactive-decay">First Example: Radioactive Decay</h3>
<p>Radioactivity is the phenomena in which an unstable nucleus loses energy by radiation.</p>
<p>In radioactive decay, if a sample of radioactive nucleus is kept, through several kinds of radiation, the original sample reduces in mass. If there were <img src="https://latex.codecogs.com/png.latex?n"> number of nuclei originally, after a certain amount of time, there would be <img src="https://latex.codecogs.com/png.latex?p"> number of nuclei, where <img src="https://latex.codecogs.com/png.latex?p%20%3C%20n">.</p>
<p>We know that the amount of decay is directly proportional to the number of nuclei present in a sample.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%20%20%20%20-%5Cdfrac%7BdN%7D%7Bdt%7D%20&amp;%5Cpropto%20N%20%5C%5C%0A%20%20%20%20%5Cimplies%20-%5Cdfrac%7BdN%7D%7Bdt%7D%20&amp;=%20%5Clambda%20N%0A%5Cend%7Balign%7D%0A"></p>
<p>The sign is negative, because, the rate <em>decreases</em> with decreasing number of nuclei.</p>
<p>We will reframe this equation so that we can implement the equation in Julia, and solve it using the solver.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%20%20%20%20&amp;-%5Cdfrac%7BdN%7D%7Bdt%7D%20%5Cpropto%20N%20%5C%5C%0A%20%20%20%20&amp;%5Cimplies%20-%5Cdfrac%7BdN%7D%7Bdt%7D%20=%20%5Clambda%20N%20%5C%5C%0A%20%20%20%20&amp;%5Cimplies%20%5Cdfrac%7BdN%7D%7BN%7D%20=%20-%5Clambda%20dt%0A%5Cend%7Balign%7D%0A"></p>
<p>Julia package <code>DifferentialEquations.jl</code> expects functions to be in this format-</p>
<div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource julia number-lines code-with-copy"><code class="sourceCode julia"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">f</span>(du, u, p, t) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> u</span></code></pre></div>
<p>Where <code>du</code> is the first derivative, <code>u</code> is the function, <code>t</code> is the time-span for which we want the function’s output, and <code>p</code> is the parameter, or a set of parameters.</p>
<p>From here, we can frame <code>du</code> to be <code>du[1] = -lambda * u[1]</code>.</p>
<section id="importing-packages" class="level4">
<h4 class="anchored" data-anchor-id="importing-packages">Importing Packages</h4>
<div class="cell" data-tags="[]" data-execution_count="1">
<div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource julia number-lines code-with-copy"><code class="sourceCode julia"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Pkg</span></span>
<span id="cb2-2"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Pkg</span>.<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"DifferentialEquations"</span>)</span>
<span id="cb2-3"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Pkg</span>.<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">add</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Plots"</span>)</span>
<span id="cb2-4"></span>
<span id="cb2-5"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">using</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">DifferentialEquations</span>, <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">Plots</span></span></code></pre></div>
<div class="cell-output cell-output-stderr">
<pre><code>   Resolving package versions...
  No Changes to `~/.julia/environments/v1.11/Project.toml`
  No Changes to `~/.julia/environments/v1.11/Manifest.toml`
   Resolving package versions...
  No Changes to `~/.julia/environments/v1.11/Project.toml`
  No Changes to `~/.julia/environments/v1.11/Manifest.toml`</code></pre>
</div>
</div>
</section>
<section id="function-definition" class="level4">
<h4 class="anchored" data-anchor-id="function-definition">Function Definition</h4>
<div class="cell" data-tags="[]" data-execution_count="2">
<div class="sourceCode cell-code" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode numberSource julia number-lines code-with-copy"><code class="sourceCode julia"><span id="cb4-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">radio_decay!</span>(du, u, p, t)</span>
<span id="cb4-2">    lambda <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span>p</span>
<span id="cb4-3">    du[<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> lambda <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> u[<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>]</span>
<span id="cb4-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">end</span></span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="3">
<pre><code>radio_decay! (generic function with 1 method)</code></pre>
</div>
</div>
</section>
<section id="declaring-parameters" class="level4">
<h4 class="anchored" data-anchor-id="declaring-parameters">Declaring Parameters</h4>
<div class="cell" data-tags="[]" data-execution_count="3">
<div class="sourceCode cell-code" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode numberSource julia number-lines code-with-copy"><code class="sourceCode julia"><span id="cb6-1">N <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;">60.0e18</span>]           <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># initial condition</span></span>
<span id="cb6-2"></span>
<span id="cb6-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># parameter</span></span>
<span id="cb6-4">lambda <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;">2.28e6</span>         <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># in SI unit, s^{-1}</span></span>
<span id="cb6-5">p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> lambda</span>
<span id="cb6-6"></span>
<span id="cb6-7"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># time-span</span></span>
<span id="cb6-8">tspan <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 class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">5e-6</span>)     <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># time-span is very small because the half-life is very small</span></span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="4">
<pre><code>(0.0, 5.0e-6)</code></pre>
</div>
</div>
</section>
<section id="defining-the-ode-problem" class="level4">
<h4 class="anchored" data-anchor-id="defining-the-ode-problem">Defining the ODE Problem</h4>
<div class="cell" data-tags="[]" data-execution_count="4">
<div class="sourceCode cell-code" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode numberSource julia number-lines code-with-copy"><code class="sourceCode julia"><span id="cb8-1">prob <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ODEProblem</span>(radio_decay!, N, tspan, p)</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="5">
<div class="ansi-escaped-output">
<pre><span style="color:rgb(86,182,194)">ODEProblem</span> with uType <span style="color:rgb(86,182,194)">Vector{Float64}</span> and tType <span style="color:rgb(86,182,194)">Float64</span>. In-place: <span style="color:rgb(86,182,194)">true</span>
Non-trivial mass matrix: <span style="color:rgb(86,182,194)">false</span>
timespan: (0.0, 5.0e-6)
u0: 1-element Vector{Float64}:
 6.0e19</pre>
</div>
</div>
</div>
</section>
<section id="solving-and-plotting-the-solution" class="level4">
<h4 class="anchored" data-anchor-id="solving-and-plotting-the-solution">Solving and Plotting the Solution</h4>
<div class="cell" data-tags="[]" data-execution_count="5">
<div class="sourceCode cell-code" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode numberSource julia number-lines code-with-copy"><code class="sourceCode julia"><span id="cb9-1">sol <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">solve</span>(prob)</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="6">
<pre><code>retcode: Success
Interpolation: 3rd order Hermite
t: 17-element Vector{Float64}:
 0.0
 4.3859649122807024e-7
 6.41342034530829e-7
 9.724902283236061e-7
 1.2462761785169967e-6
 1.5654877939700708e-6
 1.8726226804630439e-6
 2.196788921416817e-6
 2.5203638024729064e-6
 2.8511887164148543e-6
 3.183703238312926e-6
 3.519781092460714e-6
 3.857529202669002e-6
 4.19723875341719e-6
 4.538177668884617e-6
 4.880273689241893e-6
 5.0e-6
u: 17-element Vector{Vector{Float64}}:
 [6.0e19]
 [2.2085932679488193e19]
 [1.3911043910467977e19]
 [6.538685467576463e18]
 [3.5026563834049787e18]
 [1.6917664046442598e18]
 [8.399157113217204e17]
 [4.011209837867301e17]
 [1.9182281652161018e17]
 [9.022998274997682e16]
 [4.227947963649966e16]
 [1.9650908828375188e16]
 [9.098778059095644e15]
 [4.194139573993325e15]
 [1.927908419090074e15]
 [8.838633947171844e14]
 [6.727182427233061e14]</code></pre>
</div>
</div>
<div class="cell" data-tags="[]" data-execution_count="6">
<div class="sourceCode cell-code" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode numberSource julia number-lines code-with-copy"><code class="sourceCode julia"><span id="cb11-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot</span>(sol, 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;">"Radioactive Decay"</span>, xlabel<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;">"Time"</span>, ylabel<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;">"N"</span>)</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="7">
<!--?xml version="1.0" encoding="utf-8"?-->
<svg xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" width="672" height="480" viewbox="0 0 2688 1920">
<defs>
  <clippath id="clip530">
    <rect x="0" y="0" width="2688" height="1920"></rect>
  </clippath>
</defs>
<path clip-path="url(#clip530)" d="M0 1920 L2688 1920 L2688 0 L0 0  Z" fill="#ffffff" fill-rule="evenodd" fill-opacity="1"></path>
<defs>
  <clippath id="clip531">
    <rect x="537" y="0" width="1883" height="1883"></rect>
  </clippath>
</defs>
<path clip-path="url(#clip530)" d="M368.583 1720.96 L2640.76 1720.96 L2640.76 127.792 L368.583 127.792  Z" fill="#ffffff" fill-rule="evenodd" fill-opacity="1"></path>
<defs>
  <clippath id="clip532">
    <rect x="368" y="127" width="2273" height="1594"></rect>
  </clippath>
</defs>
<polyline clip-path="url(#clip532)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="368.583,1720.96 368.583,127.792 "></polyline>
<polyline clip-path="url(#clip532)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="823.018,1720.96 823.018,127.792 "></polyline>
<polyline clip-path="url(#clip532)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="1277.45,1720.96 1277.45,127.792 "></polyline>
<polyline clip-path="url(#clip532)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="1731.89,1720.96 1731.89,127.792 "></polyline>
<polyline clip-path="url(#clip532)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="2186.32,1720.96 2186.32,127.792 "></polyline>
<polyline clip-path="url(#clip532)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="2640.76,1720.96 2640.76,127.792 "></polyline>
<polyline clip-path="url(#clip532)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="368.583,1675.88 2640.76,1675.88 "></polyline>
<polyline clip-path="url(#clip532)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="368.583,1425.38 2640.76,1425.38 "></polyline>
<polyline clip-path="url(#clip532)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="368.583,1174.88 2640.76,1174.88 "></polyline>
<polyline clip-path="url(#clip532)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="368.583,924.383 2640.76,924.383 "></polyline>
<polyline clip-path="url(#clip532)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="368.583,673.882 2640.76,673.882 "></polyline>
<polyline clip-path="url(#clip532)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="368.583,423.382 2640.76,423.382 "></polyline>
<polyline clip-path="url(#clip532)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="368.583,172.882 2640.76,172.882 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="368.583,1720.96 2640.76,1720.96 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="368.583,1720.96 368.583,1702.06 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="823.018,1720.96 823.018,1702.06 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="1277.45,1720.96 1277.45,1702.06 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="1731.89,1720.96 1731.89,1702.06 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2186.32,1720.96 2186.32,1702.06 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2640.76,1720.96 2640.76,1702.06 "></polyline>
<path clip-path="url(#clip530)" d="M368.583 1754.18 Q364.972 1754.18 363.144 1757.74 Q361.338 1761.29 361.338 1768.42 Q361.338 1775.52 363.144 1779.09 Q364.972 1782.63 368.583 1782.63 Q372.218 1782.63 374.023 1779.09 Q375.852 1775.52 375.852 1768.42 Q375.852 1761.29 374.023 1757.74 Q372.218 1754.18 368.583 1754.18 M368.583 1750.48 Q374.394 1750.48 377.449 1755.08 Q380.528 1759.67 380.528 1768.42 Q380.528 1777.14 377.449 1781.75 Q374.394 1786.33 368.583 1786.33 Q362.773 1786.33 359.695 1781.75 Q356.639 1777.14 356.639 1768.42 Q356.639 1759.67 359.695 1755.08 Q362.773 1750.48 368.583 1750.48 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M715.011 1797.39 L722.65 1797.39 L722.65 1771.02 L714.34 1772.69 L714.34 1768.43 L722.604 1766.76 L727.28 1766.76 L727.28 1797.39 L734.919 1797.39 L734.919 1801.32 L715.011 1801.32 L715.011 1797.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M744.363 1795.44 L749.247 1795.44 L749.247 1801.32 L744.363 1801.32 L744.363 1795.44 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M769.432 1769.84 Q765.821 1769.84 763.993 1773.4 Q762.187 1776.95 762.187 1784.08 Q762.187 1791.18 763.993 1794.75 Q765.821 1798.29 769.432 1798.29 Q773.067 1798.29 774.872 1794.75 Q776.701 1791.18 776.701 1784.08 Q776.701 1776.95 774.872 1773.4 Q773.067 1769.84 769.432 1769.84 M769.432 1766.14 Q775.243 1766.14 778.298 1770.74 Q781.377 1775.33 781.377 1784.08 Q781.377 1792.8 778.298 1797.41 Q775.243 1801.99 769.432 1801.99 Q763.622 1801.99 760.544 1797.41 Q757.488 1792.8 757.488 1784.08 Q757.488 1775.33 760.544 1770.74 Q763.622 1766.14 769.432 1766.14 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M817.765 1775.86 L807.187 1786.48 L817.765 1797.06 L815.011 1799.86 L804.386 1789.24 L793.761 1799.86 L791.029 1797.06 L801.585 1786.48 L791.029 1775.86 L793.761 1773.06 L804.386 1783.68 L815.011 1773.06 L817.765 1775.86 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M830.126 1797.39 L837.765 1797.39 L837.765 1771.02 L829.455 1772.69 L829.455 1768.43 L837.719 1766.76 L842.395 1766.76 L842.395 1797.39 L850.034 1797.39 L850.034 1801.32 L830.126 1801.32 L830.126 1797.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M869.478 1769.84 Q865.867 1769.84 864.038 1773.4 Q862.233 1776.95 862.233 1784.08 Q862.233 1791.18 864.038 1794.75 Q865.867 1798.29 869.478 1798.29 Q873.112 1798.29 874.918 1794.75 Q876.747 1791.18 876.747 1784.08 Q876.747 1776.95 874.918 1773.4 Q873.112 1769.84 869.478 1769.84 M869.478 1766.14 Q875.288 1766.14 878.344 1770.74 Q881.423 1775.33 881.423 1784.08 Q881.423 1792.8 878.344 1797.41 Q875.288 1801.99 869.478 1801.99 Q863.668 1801.99 860.589 1797.41 Q857.534 1792.8 857.534 1784.08 Q857.534 1775.33 860.589 1770.74 Q863.668 1766.14 869.478 1766.14 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M881.423 1760.24 L905.534 1760.24 L905.534 1763.43 L881.423 1763.43 L881.423 1760.24 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M922.329 1758.36 Q919.772 1758.36 918.267 1760.11 Q916.781 1761.85 916.781 1764.9 Q916.781 1767.93 918.267 1769.7 Q919.772 1771.45 922.329 1771.45 Q924.887 1771.45 926.373 1769.7 Q927.878 1767.93 927.878 1764.9 Q927.878 1761.85 926.373 1760.11 Q924.887 1758.36 922.329 1758.36 M929.871 1746.45 L929.871 1749.91 Q928.442 1749.23 926.975 1748.88 Q925.527 1748.52 924.097 1748.52 Q920.336 1748.52 918.342 1751.06 Q916.367 1753.6 916.085 1758.73 Q917.195 1757.1 918.869 1756.23 Q920.543 1755.35 922.555 1755.35 Q926.787 1755.35 929.232 1757.92 Q931.696 1760.48 931.696 1764.9 Q931.696 1769.23 929.138 1771.84 Q926.58 1774.46 922.329 1774.46 Q917.458 1774.46 914.882 1770.73 Q912.305 1766.99 912.305 1759.9 Q912.305 1753.24 915.465 1749.29 Q918.624 1745.32 923.947 1745.32 Q925.376 1745.32 926.824 1745.6 Q928.291 1745.89 929.871 1746.45 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1173.53 1797.39 L1189.85 1797.39 L1189.85 1801.32 L1167.91 1801.32 L1167.91 1797.39 Q1170.57 1794.63 1175.15 1790 Q1179.76 1785.35 1180.94 1784.01 Q1183.18 1781.48 1184.06 1779.75 Q1184.97 1777.99 1184.97 1776.3 Q1184.97 1773.54 1183.02 1771.81 Q1181.1 1770.07 1178 1770.07 Q1175.8 1770.07 1173.35 1770.83 Q1170.92 1771.6 1168.14 1773.15 L1168.14 1768.43 Q1170.96 1767.29 1173.42 1766.71 Q1175.87 1766.14 1177.91 1766.14 Q1183.28 1766.14 1186.47 1768.82 Q1189.67 1771.51 1189.67 1776 Q1189.67 1778.13 1188.86 1780.05 Q1188.07 1781.95 1185.96 1784.54 Q1185.38 1785.21 1182.28 1788.43 Q1179.18 1791.62 1173.53 1797.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1199.67 1795.44 L1204.55 1795.44 L1204.55 1801.32 L1199.67 1801.32 L1199.67 1795.44 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1224.73 1769.84 Q1221.12 1769.84 1219.3 1773.4 Q1217.49 1776.95 1217.49 1784.08 Q1217.49 1791.18 1219.3 1794.75 Q1221.12 1798.29 1224.73 1798.29 Q1228.37 1798.29 1230.17 1794.75 Q1232 1791.18 1232 1784.08 Q1232 1776.95 1230.17 1773.4 Q1228.37 1769.84 1224.73 1769.84 M1224.73 1766.14 Q1230.55 1766.14 1233.6 1770.74 Q1236.68 1775.33 1236.68 1784.08 Q1236.68 1792.8 1233.6 1797.41 Q1230.55 1801.99 1224.73 1801.99 Q1218.92 1801.99 1215.85 1797.41 Q1212.79 1792.8 1212.79 1784.08 Q1212.79 1775.33 1215.85 1770.74 Q1218.92 1766.14 1224.73 1766.14 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1273.07 1775.86 L1262.49 1786.48 L1273.07 1797.06 L1270.31 1799.86 L1259.69 1789.24 L1249.06 1799.86 L1246.33 1797.06 L1256.89 1786.48 L1246.33 1775.86 L1249.06 1773.06 L1259.69 1783.68 L1270.31 1773.06 L1273.07 1775.86 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1285.43 1797.39 L1293.07 1797.39 L1293.07 1771.02 L1284.76 1772.69 L1284.76 1768.43 L1293.02 1766.76 L1297.7 1766.76 L1297.7 1797.39 L1305.34 1797.39 L1305.34 1801.32 L1285.43 1801.32 L1285.43 1797.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1324.78 1769.84 Q1321.17 1769.84 1319.34 1773.4 Q1317.54 1776.95 1317.54 1784.08 Q1317.54 1791.18 1319.34 1794.75 Q1321.17 1798.29 1324.78 1798.29 Q1328.41 1798.29 1330.22 1794.75 Q1332.05 1791.18 1332.05 1784.08 Q1332.05 1776.95 1330.22 1773.4 Q1328.41 1769.84 1324.78 1769.84 M1324.78 1766.14 Q1330.59 1766.14 1333.65 1770.74 Q1336.73 1775.33 1336.73 1784.08 Q1336.73 1792.8 1333.65 1797.41 Q1330.59 1801.99 1324.78 1801.99 Q1318.97 1801.99 1315.89 1797.41 Q1312.84 1792.8 1312.84 1784.08 Q1312.84 1775.33 1315.89 1770.74 Q1318.97 1766.14 1324.78 1766.14 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1336.73 1760.24 L1360.84 1760.24 L1360.84 1763.43 L1336.73 1763.43 L1336.73 1760.24 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1377.63 1758.36 Q1375.07 1758.36 1373.57 1760.11 Q1372.08 1761.85 1372.08 1764.9 Q1372.08 1767.93 1373.57 1769.7 Q1375.07 1771.45 1377.63 1771.45 Q1380.19 1771.45 1381.68 1769.7 Q1383.18 1767.93 1383.18 1764.9 Q1383.18 1761.85 1381.68 1760.11 Q1380.19 1758.36 1377.63 1758.36 M1385.17 1746.45 L1385.17 1749.91 Q1383.74 1749.23 1382.28 1748.88 Q1380.83 1748.52 1379.4 1748.52 Q1375.64 1748.52 1373.64 1751.06 Q1371.67 1753.6 1371.39 1758.73 Q1372.5 1757.1 1374.17 1756.23 Q1375.85 1755.35 1377.86 1755.35 Q1382.09 1755.35 1384.53 1757.92 Q1387 1760.48 1387 1764.9 Q1387 1769.23 1384.44 1771.84 Q1381.88 1774.46 1377.63 1774.46 Q1372.76 1774.46 1370.18 1770.73 Q1367.61 1766.99 1367.61 1759.9 Q1367.61 1753.24 1370.77 1749.29 Q1373.93 1745.32 1379.25 1745.32 Q1380.68 1745.32 1382.13 1745.6 Q1383.59 1745.89 1385.17 1746.45 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1638.04 1782.69 Q1641.39 1783.4 1643.27 1785.67 Q1645.16 1787.94 1645.16 1791.27 Q1645.16 1796.39 1641.65 1799.19 Q1638.13 1801.99 1631.65 1801.99 Q1629.47 1801.99 1627.16 1801.55 Q1624.86 1801.14 1622.41 1800.28 L1622.41 1795.76 Q1624.35 1796.9 1626.67 1797.48 Q1628.98 1798.06 1631.51 1798.06 Q1635.91 1798.06 1638.2 1796.32 Q1640.51 1794.58 1640.51 1791.27 Q1640.51 1788.22 1638.36 1786.51 Q1636.23 1784.77 1632.41 1784.77 L1628.38 1784.77 L1628.38 1780.93 L1632.6 1780.93 Q1636.04 1780.93 1637.87 1779.56 Q1639.7 1778.17 1639.7 1775.58 Q1639.7 1772.92 1637.8 1771.51 Q1635.93 1770.07 1632.41 1770.07 Q1630.49 1770.07 1628.29 1770.49 Q1626.09 1770.9 1623.45 1771.78 L1623.45 1767.62 Q1626.11 1766.88 1628.43 1766.51 Q1630.77 1766.14 1632.83 1766.14 Q1638.15 1766.14 1641.25 1768.57 Q1644.35 1770.97 1644.35 1775.09 Q1644.35 1777.96 1642.71 1779.95 Q1641.07 1781.92 1638.04 1782.69 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1654.03 1795.44 L1658.91 1795.44 L1658.91 1801.32 L1654.03 1801.32 L1654.03 1795.44 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1679.1 1769.84 Q1675.49 1769.84 1673.66 1773.4 Q1671.85 1776.95 1671.85 1784.08 Q1671.85 1791.18 1673.66 1794.75 Q1675.49 1798.29 1679.1 1798.29 Q1682.73 1798.29 1684.54 1794.75 Q1686.37 1791.18 1686.37 1784.08 Q1686.37 1776.95 1684.54 1773.4 Q1682.73 1769.84 1679.1 1769.84 M1679.1 1766.14 Q1684.91 1766.14 1687.97 1770.74 Q1691.04 1775.33 1691.04 1784.08 Q1691.04 1792.8 1687.97 1797.41 Q1684.91 1801.99 1679.1 1801.99 Q1673.29 1801.99 1670.21 1797.41 Q1667.16 1792.8 1667.16 1784.08 Q1667.16 1775.33 1670.21 1770.74 Q1673.29 1766.14 1679.1 1766.14 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1727.43 1775.86 L1716.85 1786.48 L1727.43 1797.06 L1724.68 1799.86 L1714.05 1789.24 L1703.43 1799.86 L1700.7 1797.06 L1711.25 1786.48 L1700.7 1775.86 L1703.43 1773.06 L1714.05 1783.68 L1724.68 1773.06 L1727.43 1775.86 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1739.79 1797.39 L1747.43 1797.39 L1747.43 1771.02 L1739.12 1772.69 L1739.12 1768.43 L1747.39 1766.76 L1752.06 1766.76 L1752.06 1797.39 L1759.7 1797.39 L1759.7 1801.32 L1739.79 1801.32 L1739.79 1797.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1779.15 1769.84 Q1775.53 1769.84 1773.71 1773.4 Q1771.9 1776.95 1771.9 1784.08 Q1771.9 1791.18 1773.71 1794.75 Q1775.53 1798.29 1779.15 1798.29 Q1782.78 1798.29 1784.59 1794.75 Q1786.41 1791.18 1786.41 1784.08 Q1786.41 1776.95 1784.59 1773.4 Q1782.78 1769.84 1779.15 1769.84 M1779.15 1766.14 Q1784.96 1766.14 1788.01 1770.74 Q1791.09 1775.33 1791.09 1784.08 Q1791.09 1792.8 1788.01 1797.41 Q1784.96 1801.99 1779.15 1801.99 Q1773.34 1801.99 1770.26 1797.41 Q1767.2 1792.8 1767.2 1784.08 Q1767.2 1775.33 1770.26 1770.74 Q1773.34 1766.14 1779.15 1766.14 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1791.09 1760.24 L1815.2 1760.24 L1815.2 1763.43 L1791.09 1763.43 L1791.09 1760.24 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1832 1758.36 Q1829.44 1758.36 1827.93 1760.11 Q1826.45 1761.85 1826.45 1764.9 Q1826.45 1767.93 1827.93 1769.7 Q1829.44 1771.45 1832 1771.45 Q1834.55 1771.45 1836.04 1769.7 Q1837.55 1767.93 1837.55 1764.9 Q1837.55 1761.85 1836.04 1760.11 Q1834.55 1758.36 1832 1758.36 M1839.54 1746.45 L1839.54 1749.91 Q1838.11 1749.23 1836.64 1748.88 Q1835.19 1748.52 1833.76 1748.52 Q1830 1748.52 1828.01 1751.06 Q1826.03 1753.6 1825.75 1758.73 Q1826.86 1757.1 1828.54 1756.23 Q1830.21 1755.35 1832.22 1755.35 Q1836.45 1755.35 1838.9 1757.92 Q1841.36 1760.48 1841.36 1764.9 Q1841.36 1769.23 1838.81 1771.84 Q1836.25 1774.46 1832 1774.46 Q1827.13 1774.46 1824.55 1770.73 Q1821.97 1766.99 1821.97 1759.9 Q1821.97 1753.24 1825.13 1749.29 Q1828.29 1745.32 1833.61 1745.32 Q1835.04 1745.32 1836.49 1745.6 Q1837.96 1745.89 1839.54 1746.45 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2091.8 1770.83 L2079.99 1789.28 L2091.8 1789.28 L2091.8 1770.83 M2090.57 1766.76 L2096.45 1766.76 L2096.45 1789.28 L2101.38 1789.28 L2101.38 1793.17 L2096.45 1793.17 L2096.45 1801.32 L2091.8 1801.32 L2091.8 1793.17 L2076.2 1793.17 L2076.2 1788.66 L2090.57 1766.76 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2109.11 1795.44 L2114 1795.44 L2114 1801.32 L2109.11 1801.32 L2109.11 1795.44 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2134.18 1769.84 Q2130.57 1769.84 2128.74 1773.4 Q2126.94 1776.95 2126.94 1784.08 Q2126.94 1791.18 2128.74 1794.75 Q2130.57 1798.29 2134.18 1798.29 Q2137.82 1798.29 2139.62 1794.75 Q2141.45 1791.18 2141.45 1784.08 Q2141.45 1776.95 2139.62 1773.4 Q2137.82 1769.84 2134.18 1769.84 M2134.18 1766.14 Q2139.99 1766.14 2143.05 1770.74 Q2146.13 1775.33 2146.13 1784.08 Q2146.13 1792.8 2143.05 1797.41 Q2139.99 1801.99 2134.18 1801.99 Q2128.37 1801.99 2125.29 1797.41 Q2122.24 1792.8 2122.24 1784.08 Q2122.24 1775.33 2125.29 1770.74 Q2128.37 1766.14 2134.18 1766.14 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2182.52 1775.86 L2171.94 1786.48 L2182.52 1797.06 L2179.76 1799.86 L2169.14 1789.24 L2158.51 1799.86 L2155.78 1797.06 L2166.34 1786.48 L2155.78 1775.86 L2158.51 1773.06 L2169.14 1783.68 L2179.76 1773.06 L2182.52 1775.86 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2194.88 1797.39 L2202.52 1797.39 L2202.52 1771.02 L2194.21 1772.69 L2194.21 1768.43 L2202.47 1766.76 L2207.15 1766.76 L2207.15 1797.39 L2214.78 1797.39 L2214.78 1801.32 L2194.88 1801.32 L2194.88 1797.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2234.23 1769.84 Q2230.62 1769.84 2228.79 1773.4 Q2226.98 1776.95 2226.98 1784.08 Q2226.98 1791.18 2228.79 1794.75 Q2230.62 1798.29 2234.23 1798.29 Q2237.86 1798.29 2239.67 1794.75 Q2241.5 1791.18 2241.5 1784.08 Q2241.5 1776.95 2239.67 1773.4 Q2237.86 1769.84 2234.23 1769.84 M2234.23 1766.14 Q2240.04 1766.14 2243.09 1770.74 Q2246.17 1775.33 2246.17 1784.08 Q2246.17 1792.8 2243.09 1797.41 Q2240.04 1801.99 2234.23 1801.99 Q2228.42 1801.99 2225.34 1797.41 Q2222.28 1792.8 2222.28 1784.08 Q2222.28 1775.33 2225.34 1770.74 Q2228.42 1766.14 2234.23 1766.14 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2246.17 1760.24 L2270.28 1760.24 L2270.28 1763.43 L2246.17 1763.43 L2246.17 1760.24 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2287.08 1758.36 Q2284.52 1758.36 2283.02 1760.11 Q2281.53 1761.85 2281.53 1764.9 Q2281.53 1767.93 2283.02 1769.7 Q2284.52 1771.45 2287.08 1771.45 Q2289.64 1771.45 2291.12 1769.7 Q2292.63 1767.93 2292.63 1764.9 Q2292.63 1761.85 2291.12 1760.11 Q2289.64 1758.36 2287.08 1758.36 M2294.62 1746.45 L2294.62 1749.91 Q2293.19 1749.23 2291.73 1748.88 Q2290.28 1748.52 2288.85 1748.52 Q2285.09 1748.52 2283.09 1751.06 Q2281.12 1753.6 2280.84 1758.73 Q2281.95 1757.1 2283.62 1756.23 Q2285.29 1755.35 2287.31 1755.35 Q2291.54 1755.35 2293.98 1757.92 Q2296.45 1760.48 2296.45 1764.9 Q2296.45 1769.23 2293.89 1771.84 Q2291.33 1774.46 2287.08 1774.46 Q2282.21 1774.46 2279.63 1770.73 Q2277.06 1766.99 2277.06 1759.9 Q2277.06 1753.24 2280.21 1749.29 Q2283.37 1745.32 2288.7 1745.32 Q2290.13 1745.32 2291.57 1745.6 Q2293.04 1745.89 2294.62 1746.45 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2532.76 1766.76 L2551.12 1766.76 L2551.12 1770.7 L2537.04 1770.7 L2537.04 1779.17 Q2538.06 1778.82 2539.08 1778.66 Q2540.1 1778.47 2541.12 1778.47 Q2546.9 1778.47 2550.28 1781.64 Q2553.66 1784.82 2553.66 1790.23 Q2553.66 1795.81 2550.19 1798.91 Q2546.72 1801.99 2540.4 1801.99 Q2538.22 1801.99 2535.96 1801.62 Q2533.71 1801.25 2531.3 1800.51 L2531.3 1795.81 Q2533.39 1796.95 2535.61 1797.5 Q2537.83 1798.06 2540.31 1798.06 Q2544.31 1798.06 2546.65 1795.95 Q2548.99 1793.84 2548.99 1790.23 Q2548.99 1786.62 2546.65 1784.51 Q2544.31 1782.41 2540.31 1782.41 Q2538.43 1782.41 2536.56 1782.83 Q2534.71 1783.24 2532.76 1784.12 L2532.76 1766.76 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2562.88 1795.44 L2567.76 1795.44 L2567.76 1801.32 L2562.88 1801.32 L2562.88 1795.44 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2587.95 1769.84 Q2584.33 1769.84 2582.51 1773.4 Q2580.7 1776.95 2580.7 1784.08 Q2580.7 1791.18 2582.51 1794.75 Q2584.33 1798.29 2587.95 1798.29 Q2591.58 1798.29 2593.39 1794.75 Q2595.21 1791.18 2595.21 1784.08 Q2595.21 1776.95 2593.39 1773.4 Q2591.58 1769.84 2587.95 1769.84 M2587.95 1766.14 Q2593.76 1766.14 2596.81 1770.74 Q2599.89 1775.33 2599.89 1784.08 Q2599.89 1792.8 2596.81 1797.41 Q2593.76 1801.99 2587.95 1801.99 Q2582.14 1801.99 2579.06 1797.41 Q2576 1792.8 2576 1784.08 Q2576 1775.33 2579.06 1770.74 Q2582.14 1766.14 2587.95 1766.14 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2636.28 1775.86 L2625.7 1786.48 L2636.28 1797.06 L2633.52 1799.86 L2622.9 1789.24 L2612.27 1799.86 L2609.54 1797.06 L2620.1 1786.48 L2609.54 1775.86 L2612.27 1773.06 L2622.9 1783.68 L2633.52 1773.06 L2636.28 1775.86 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2648.64 1797.39 L2656.28 1797.39 L2656.28 1771.02 L2647.97 1772.69 L2647.97 1768.43 L2656.23 1766.76 L2660.91 1766.76 L2660.91 1797.39 L2668.55 1797.39 L2668.55 1801.32 L2648.64 1801.32 L2648.64 1797.39 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2687.99 1769.84 Q2684.38 1769.84 2682.55 1773.4 Q2680.75 1776.95 2680.75 1784.08 Q2680.75 1791.18 2682.55 1794.75 Q2684.38 1798.29 2687.99 1798.29 Q2691.63 1798.29 2693.43 1794.75 Q2695.26 1791.18 2695.26 1784.08 Q2695.26 1776.95 2693.43 1773.4 Q2691.63 1769.84 2687.99 1769.84 M2687.99 1766.14 Q2693.8 1766.14 2696.86 1770.74 Q2699.94 1775.33 2699.94 1784.08 Q2699.94 1792.8 2696.86 1797.41 Q2693.8 1801.99 2687.99 1801.99 Q2682.18 1801.99 2679.1 1797.41 Q2676.05 1792.8 2676.05 1784.08 Q2676.05 1775.33 2679.1 1770.74 Q2682.18 1766.14 2687.99 1766.14 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2699.94 1760.24 L2724.05 1760.24 L2724.05 1763.43 L2699.94 1763.43 L2699.94 1760.24 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2740.84 1758.36 Q2738.29 1758.36 2736.78 1760.11 Q2735.29 1761.85 2735.29 1764.9 Q2735.29 1767.93 2736.78 1769.7 Q2738.29 1771.45 2740.84 1771.45 Q2743.4 1771.45 2744.89 1769.7 Q2746.39 1767.93 2746.39 1764.9 Q2746.39 1761.85 2744.89 1760.11 Q2743.4 1758.36 2740.84 1758.36 M2748.38 1746.45 L2748.38 1749.91 Q2746.96 1749.23 2745.49 1748.88 Q2744.04 1748.52 2742.61 1748.52 Q2738.85 1748.52 2736.86 1751.06 Q2734.88 1753.6 2734.6 1758.73 Q2735.71 1757.1 2737.38 1756.23 Q2739.06 1755.35 2741.07 1755.35 Q2745.3 1755.35 2747.75 1757.92 Q2750.21 1760.48 2750.21 1764.9 Q2750.21 1769.23 2747.65 1771.84 Q2745.09 1774.46 2740.84 1774.46 Q2735.97 1774.46 2733.4 1770.73 Q2730.82 1766.99 2730.82 1759.9 Q2730.82 1753.24 2733.98 1749.29 Q2737.14 1745.32 2742.46 1745.32 Q2743.89 1745.32 2745.34 1745.6 Q2746.8 1745.89 2748.38 1746.45 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1426.55 1841.05 L1466.75 1841.05 L1466.75 1846.46 L1449.88 1846.46 L1449.88 1888.57 L1443.42 1888.57 L1443.42 1846.46 L1426.55 1846.46 L1426.55 1841.05 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1470.69 1852.92 L1476.55 1852.92 L1476.55 1888.57 L1470.69 1888.57 L1470.69 1852.92 M1470.69 1839.04 L1476.55 1839.04 L1476.55 1846.46 L1470.69 1846.46 L1470.69 1839.04 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1516.56 1859.76 Q1518.75 1855.81 1521.81 1853.94 Q1524.86 1852.06 1529 1852.06 Q1534.57 1852.06 1537.6 1855.97 Q1540.62 1859.86 1540.62 1867.05 L1540.62 1888.57 L1534.73 1888.57 L1534.73 1867.24 Q1534.73 1862.12 1532.92 1859.63 Q1531.1 1857.15 1527.38 1857.15 Q1522.83 1857.15 1520.19 1860.17 Q1517.54 1863.2 1517.54 1868.42 L1517.54 1888.57 L1511.66 1888.57 L1511.66 1867.24 Q1511.66 1862.08 1509.84 1859.63 Q1508.03 1857.15 1504.24 1857.15 Q1499.75 1857.15 1497.11 1860.21 Q1494.47 1863.23 1494.47 1868.42 L1494.47 1888.57 L1488.58 1888.57 L1488.58 1852.92 L1494.47 1852.92 L1494.47 1858.46 Q1496.47 1855.18 1499.27 1853.62 Q1502.08 1852.06 1505.93 1852.06 Q1509.81 1852.06 1512.52 1854.03 Q1515.25 1856 1516.56 1859.76 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1582.79 1869.28 L1582.79 1872.14 L1555.87 1872.14 Q1556.25 1878.19 1559.49 1881.37 Q1562.77 1884.52 1568.6 1884.52 Q1571.97 1884.52 1575.12 1883.7 Q1578.3 1882.87 1581.42 1881.21 L1581.42 1886.75 Q1578.27 1888.09 1574.96 1888.79 Q1571.65 1889.49 1568.25 1889.49 Q1559.72 1889.49 1554.72 1884.52 Q1549.75 1879.56 1549.75 1871.09 Q1549.75 1862.34 1554.47 1857.21 Q1559.21 1852.06 1567.23 1852.06 Q1574.42 1852.06 1578.59 1856.7 Q1582.79 1861.32 1582.79 1869.28 M1576.94 1867.56 Q1576.87 1862.75 1574.23 1859.89 Q1571.62 1857.02 1567.29 1857.02 Q1562.39 1857.02 1559.43 1859.79 Q1556.5 1862.56 1556.06 1867.59 L1576.94 1867.56 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="368.583,1720.96 368.583,127.792 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="368.583,1675.88 387.481,1675.88 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="368.583,1425.38 387.481,1425.38 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="368.583,1174.88 387.481,1174.88 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="368.583,924.383 387.481,924.383 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="368.583,673.882 387.481,673.882 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="368.583,423.382 387.481,423.382 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="368.583,172.882 387.481,172.882 "></polyline>
<path clip-path="url(#clip530)" d="M316.319 1661.68 Q312.708 1661.68 310.879 1665.25 Q309.074 1668.79 309.074 1675.92 Q309.074 1683.02 310.879 1686.59 Q312.708 1690.13 316.319 1690.13 Q319.953 1690.13 321.759 1686.59 Q323.587 1683.02 323.587 1675.92 Q323.587 1668.79 321.759 1665.25 Q319.953 1661.68 316.319 1661.68 M316.319 1657.98 Q322.129 1657.98 325.185 1662.59 Q328.263 1667.17 328.263 1675.92 Q328.263 1684.65 325.185 1689.25 Q322.129 1693.84 316.319 1693.84 Q310.509 1693.84 307.43 1689.25 Q304.375 1684.65 304.375 1675.92 Q304.375 1667.17 307.43 1662.59 Q310.509 1657.98 316.319 1657.98 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M119.779 1445.18 L127.418 1445.18 L127.418 1418.81 L119.108 1420.48 L119.108 1416.22 L127.372 1414.55 L132.048 1414.55 L132.048 1445.18 L139.687 1445.18 L139.687 1449.11 L119.779 1449.11 L119.779 1445.18 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M149.131 1443.23 L154.015 1443.23 L154.015 1449.11 L149.131 1449.11 L149.131 1443.23 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M174.2 1417.63 Q170.589 1417.63 168.76 1421.19 Q166.955 1424.74 166.955 1431.87 Q166.955 1438.97 168.76 1442.54 Q170.589 1446.08 174.2 1446.08 Q177.834 1446.08 179.64 1442.54 Q181.469 1438.97 181.469 1431.87 Q181.469 1424.74 179.64 1421.19 Q177.834 1417.63 174.2 1417.63 M174.2 1413.93 Q180.01 1413.93 183.066 1418.53 Q186.145 1423.12 186.145 1431.87 Q186.145 1440.59 183.066 1445.2 Q180.01 1449.78 174.2 1449.78 Q168.39 1449.78 165.311 1445.2 Q162.256 1440.59 162.256 1431.87 Q162.256 1423.12 165.311 1418.53 Q168.39 1413.93 174.2 1413.93 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M222.533 1423.65 L211.955 1434.27 L222.533 1444.85 L219.779 1447.65 L209.154 1437.03 L198.529 1447.65 L195.797 1444.85 L206.353 1434.27 L195.797 1423.65 L198.529 1420.85 L209.154 1431.47 L219.779 1420.85 L222.533 1423.65 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M234.894 1445.18 L242.533 1445.18 L242.533 1418.81 L234.223 1420.48 L234.223 1416.22 L242.487 1414.55 L247.163 1414.55 L247.163 1445.18 L254.802 1445.18 L254.802 1449.11 L234.894 1449.11 L234.894 1445.18 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M274.246 1417.63 Q270.635 1417.63 268.806 1421.19 Q267.001 1424.74 267.001 1431.87 Q267.001 1438.97 268.806 1442.54 Q270.635 1446.08 274.246 1446.08 Q277.88 1446.08 279.686 1442.54 Q281.514 1438.97 281.514 1431.87 Q281.514 1424.74 279.686 1421.19 Q277.88 1417.63 274.246 1417.63 M274.246 1413.93 Q280.056 1413.93 283.112 1418.53 Q286.19 1423.12 286.19 1431.87 Q286.19 1440.59 283.112 1445.2 Q280.056 1449.78 274.246 1449.78 Q268.436 1449.78 265.357 1445.2 Q262.302 1440.59 262.302 1431.87 Q262.302 1423.12 265.357 1418.53 Q268.436 1413.93 274.246 1413.93 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M286.736 1418.5 L292.942 1418.5 L292.942 1397.08 L286.19 1398.44 L286.19 1394.97 L292.905 1393.62 L296.704 1393.62 L296.704 1418.5 L302.91 1418.5 L302.91 1421.7 L286.736 1421.7 L286.736 1418.5 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M310.697 1421.12 L310.697 1417.66 Q312.126 1418.33 313.593 1418.69 Q315.06 1419.05 316.471 1419.05 Q320.232 1419.05 322.207 1416.53 Q324.201 1413.99 324.483 1408.84 Q323.392 1410.45 321.718 1411.32 Q320.044 1412.18 318.013 1412.18 Q313.8 1412.18 311.336 1409.64 Q308.891 1407.09 308.891 1402.67 Q308.891 1398.34 311.449 1395.73 Q314.007 1393.11 318.258 1393.11 Q323.129 1393.11 325.687 1396.86 Q328.263 1400.58 328.263 1407.69 Q328.263 1414.33 325.104 1418.3 Q321.963 1422.25 316.64 1422.25 Q315.211 1422.25 313.744 1421.96 Q312.277 1421.68 310.697 1421.12 M318.258 1409.21 Q320.815 1409.21 322.301 1407.46 Q323.806 1405.71 323.806 1402.67 Q323.806 1399.64 322.301 1397.89 Q320.815 1396.12 318.258 1396.12 Q315.7 1396.12 314.195 1397.89 Q312.709 1399.64 312.709 1402.67 Q312.709 1405.71 314.195 1407.46 Q315.7 1409.21 318.258 1409.21 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M122.997 1194.68 L139.316 1194.68 L139.316 1198.61 L117.372 1198.61 L117.372 1194.68 Q120.034 1191.92 124.617 1187.29 Q129.224 1182.64 130.404 1181.3 Q132.65 1178.77 133.529 1177.04 Q134.432 1175.28 134.432 1173.59 Q134.432 1170.83 132.488 1169.1 Q130.566 1167.36 127.464 1167.36 Q125.265 1167.36 122.812 1168.12 Q120.381 1168.89 117.603 1170.44 L117.603 1165.72 Q120.427 1164.58 122.881 1164 Q125.335 1163.43 127.372 1163.43 Q132.742 1163.43 135.937 1166.11 Q139.131 1168.8 139.131 1173.29 Q139.131 1175.42 138.321 1177.34 Q137.534 1179.24 135.427 1181.83 Q134.849 1182.5 131.747 1185.72 Q128.645 1188.91 122.997 1194.68 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M149.131 1192.73 L154.015 1192.73 L154.015 1198.61 L149.131 1198.61 L149.131 1192.73 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M174.2 1167.13 Q170.589 1167.13 168.76 1170.69 Q166.955 1174.24 166.955 1181.37 Q166.955 1188.47 168.76 1192.04 Q170.589 1195.58 174.2 1195.58 Q177.834 1195.58 179.64 1192.04 Q181.469 1188.47 181.469 1181.37 Q181.469 1174.24 179.64 1170.69 Q177.834 1167.13 174.2 1167.13 M174.2 1163.43 Q180.01 1163.43 183.066 1168.03 Q186.145 1172.62 186.145 1181.37 Q186.145 1190.09 183.066 1194.7 Q180.01 1199.28 174.2 1199.28 Q168.39 1199.28 165.311 1194.7 Q162.256 1190.09 162.256 1181.37 Q162.256 1172.62 165.311 1168.03 Q168.39 1163.43 174.2 1163.43 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M222.533 1173.15 L211.955 1183.77 L222.533 1194.35 L219.779 1197.15 L209.154 1186.53 L198.529 1197.15 L195.797 1194.35 L206.353 1183.77 L195.797 1173.15 L198.529 1170.35 L209.154 1180.97 L219.779 1170.35 L222.533 1173.15 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M234.894 1194.68 L242.533 1194.68 L242.533 1168.31 L234.223 1169.98 L234.223 1165.72 L242.487 1164.05 L247.163 1164.05 L247.163 1194.68 L254.802 1194.68 L254.802 1198.61 L234.894 1198.61 L234.894 1194.68 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M274.246 1167.13 Q270.635 1167.13 268.806 1170.69 Q267.001 1174.24 267.001 1181.37 Q267.001 1188.47 268.806 1192.04 Q270.635 1195.58 274.246 1195.58 Q277.88 1195.58 279.686 1192.04 Q281.514 1188.47 281.514 1181.37 Q281.514 1174.24 279.686 1170.69 Q277.88 1167.13 274.246 1167.13 M274.246 1163.43 Q280.056 1163.43 283.112 1168.03 Q286.19 1172.62 286.19 1181.37 Q286.19 1190.09 283.112 1194.7 Q280.056 1199.28 274.246 1199.28 Q268.436 1199.28 265.357 1194.7 Q262.302 1190.09 262.302 1181.37 Q262.302 1172.62 265.357 1168.03 Q268.436 1163.43 274.246 1163.43 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M286.736 1168 L292.942 1168 L292.942 1146.58 L286.19 1147.94 L286.19 1144.47 L292.905 1143.12 L296.704 1143.12 L296.704 1168 L302.91 1168 L302.91 1171.2 L286.736 1171.2 L286.736 1168 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M310.697 1170.62 L310.697 1167.16 Q312.126 1167.83 313.593 1168.19 Q315.06 1168.55 316.471 1168.55 Q320.232 1168.55 322.207 1166.03 Q324.201 1163.49 324.483 1158.34 Q323.392 1159.95 321.718 1160.82 Q320.044 1161.68 318.013 1161.68 Q313.8 1161.68 311.336 1159.14 Q308.891 1156.59 308.891 1152.17 Q308.891 1147.84 311.449 1145.23 Q314.007 1142.61 318.258 1142.61 Q323.129 1142.61 325.687 1146.36 Q328.263 1150.08 328.263 1157.19 Q328.263 1163.83 325.104 1167.8 Q321.963 1171.75 316.64 1171.75 Q315.211 1171.75 313.744 1171.46 Q312.277 1171.18 310.697 1170.62 M318.258 1158.71 Q320.815 1158.71 322.301 1156.96 Q323.806 1155.21 323.806 1152.17 Q323.806 1149.14 322.301 1147.39 Q320.815 1145.62 318.258 1145.62 Q315.7 1145.62 314.195 1147.39 Q312.709 1149.14 312.709 1152.17 Q312.709 1155.21 314.195 1156.96 Q315.7 1158.71 318.258 1158.71 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M133.136 929.476 Q136.492 930.194 138.367 932.462 Q140.265 934.731 140.265 938.064 Q140.265 943.18 136.747 945.981 Q133.228 948.782 126.747 948.782 Q124.571 948.782 122.256 948.342 Q119.964 947.925 117.511 947.069 L117.511 942.555 Q119.455 943.689 121.77 944.268 Q124.085 944.846 126.608 944.846 Q131.006 944.846 133.298 943.11 Q135.612 941.374 135.612 938.064 Q135.612 935.009 133.46 933.296 Q131.33 931.559 127.511 931.559 L123.483 931.559 L123.483 927.717 L127.696 927.717 Q131.145 927.717 132.974 926.351 Q134.802 924.962 134.802 922.37 Q134.802 919.708 132.904 918.296 Q131.029 916.86 127.511 916.86 Q125.589 916.86 123.39 917.277 Q121.191 917.694 118.552 918.573 L118.552 914.407 Q121.214 913.666 123.529 913.296 Q125.867 912.925 127.927 912.925 Q133.251 912.925 136.353 915.356 Q139.455 917.763 139.455 921.884 Q139.455 924.754 137.812 926.745 Q136.168 928.712 133.136 929.476 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M149.131 942.231 L154.015 942.231 L154.015 948.11 L149.131 948.11 L149.131 942.231 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M174.2 916.629 Q170.589 916.629 168.76 920.194 Q166.955 923.735 166.955 930.865 Q166.955 937.971 168.76 941.536 Q170.589 945.078 174.2 945.078 Q177.834 945.078 179.64 941.536 Q181.469 937.971 181.469 930.865 Q181.469 923.735 179.64 920.194 Q177.834 916.629 174.2 916.629 M174.2 912.925 Q180.01 912.925 183.066 917.532 Q186.145 922.115 186.145 930.865 Q186.145 939.592 183.066 944.198 Q180.01 948.782 174.2 948.782 Q168.39 948.782 165.311 944.198 Q162.256 939.592 162.256 930.865 Q162.256 922.115 165.311 917.532 Q168.39 912.925 174.2 912.925 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M222.533 922.647 L211.955 933.272 L222.533 943.851 L219.779 946.652 L209.154 936.027 L198.529 946.652 L195.797 943.851 L206.353 933.272 L195.797 922.647 L198.529 919.847 L209.154 930.472 L219.779 919.847 L222.533 922.647 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M234.894 944.175 L242.533 944.175 L242.533 917.81 L234.223 919.476 L234.223 915.217 L242.487 913.55 L247.163 913.55 L247.163 944.175 L254.802 944.175 L254.802 948.11 L234.894 948.11 L234.894 944.175 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M274.246 916.629 Q270.635 916.629 268.806 920.194 Q267.001 923.735 267.001 930.865 Q267.001 937.971 268.806 941.536 Q270.635 945.078 274.246 945.078 Q277.88 945.078 279.686 941.536 Q281.514 937.971 281.514 930.865 Q281.514 923.735 279.686 920.194 Q277.88 916.629 274.246 916.629 M274.246 912.925 Q280.056 912.925 283.112 917.532 Q286.19 922.115 286.19 930.865 Q286.19 939.592 283.112 944.198 Q280.056 948.782 274.246 948.782 Q268.436 948.782 265.357 944.198 Q262.302 939.592 262.302 930.865 Q262.302 922.115 265.357 917.532 Q268.436 912.925 274.246 912.925 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M286.736 917.503 L292.942 917.503 L292.942 896.081 L286.19 897.435 L286.19 893.974 L292.905 892.62 L296.704 892.62 L296.704 917.503 L302.91 917.503 L302.91 920.7 L286.736 920.7 L286.736 917.503 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M310.697 920.117 L310.697 916.656 Q312.126 917.333 313.593 917.691 Q315.06 918.048 316.471 918.048 Q320.232 918.048 322.207 915.528 Q324.201 912.989 324.483 907.835 Q323.392 909.453 321.718 910.318 Q320.044 911.183 318.013 911.183 Q313.8 911.183 311.336 908.644 Q308.891 906.086 308.891 901.666 Q308.891 897.341 311.449 894.726 Q314.007 892.112 318.258 892.112 Q323.129 892.112 325.687 895.855 Q328.263 899.579 328.263 906.688 Q328.263 913.327 325.104 917.296 Q321.963 921.245 316.64 921.245 Q315.211 921.245 313.744 920.963 Q312.277 920.681 310.697 920.117 M318.258 908.212 Q320.815 908.212 322.301 906.462 Q323.806 904.713 323.806 901.666 Q323.806 898.638 322.301 896.889 Q320.815 895.121 318.258 895.121 Q315.7 895.121 314.195 896.889 Q312.709 898.638 312.709 901.666 Q312.709 904.713 314.195 906.462 Q315.7 908.212 318.258 908.212 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M131.816 667.124 L120.011 685.573 L131.816 685.573 L131.816 667.124 M130.589 663.05 L136.469 663.05 L136.469 685.573 L141.399 685.573 L141.399 689.462 L136.469 689.462 L136.469 697.61 L131.816 697.61 L131.816 689.462 L116.214 689.462 L116.214 684.948 L130.589 663.05 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M149.131 691.73 L154.015 691.73 L154.015 697.61 L149.131 697.61 L149.131 691.73 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M174.2 666.129 Q170.589 666.129 168.76 669.693 Q166.955 673.235 166.955 680.365 Q166.955 687.471 168.76 691.036 Q170.589 694.578 174.2 694.578 Q177.834 694.578 179.64 691.036 Q181.469 687.471 181.469 680.365 Q181.469 673.235 179.64 669.693 Q177.834 666.129 174.2 666.129 M174.2 662.425 Q180.01 662.425 183.066 667.031 Q186.145 671.615 186.145 680.365 Q186.145 689.091 183.066 693.698 Q180.01 698.281 174.2 698.281 Q168.39 698.281 165.311 693.698 Q162.256 689.091 162.256 680.365 Q162.256 671.615 165.311 667.031 Q168.39 662.425 174.2 662.425 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M222.533 672.147 L211.955 682.772 L222.533 693.351 L219.779 696.152 L209.154 685.527 L198.529 696.152 L195.797 693.351 L206.353 682.772 L195.797 672.147 L198.529 669.346 L209.154 679.971 L219.779 669.346 L222.533 672.147 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M234.894 693.675 L242.533 693.675 L242.533 667.309 L234.223 668.976 L234.223 664.717 L242.487 663.05 L247.163 663.05 L247.163 693.675 L254.802 693.675 L254.802 697.61 L234.894 697.61 L234.894 693.675 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M274.246 666.129 Q270.635 666.129 268.806 669.693 Q267.001 673.235 267.001 680.365 Q267.001 687.471 268.806 691.036 Q270.635 694.578 274.246 694.578 Q277.88 694.578 279.686 691.036 Q281.514 687.471 281.514 680.365 Q281.514 673.235 279.686 669.693 Q277.88 666.129 274.246 666.129 M274.246 662.425 Q280.056 662.425 283.112 667.031 Q286.19 671.615 286.19 680.365 Q286.19 689.091 283.112 693.698 Q280.056 698.281 274.246 698.281 Q268.436 698.281 265.357 693.698 Q262.302 689.091 262.302 680.365 Q262.302 671.615 265.357 667.031 Q268.436 662.425 274.246 662.425 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M286.736 667.002 L292.942 667.002 L292.942 645.58 L286.19 646.934 L286.19 643.474 L292.905 642.12 L296.704 642.12 L296.704 667.002 L302.91 667.002 L302.91 670.2 L286.736 670.2 L286.736 667.002 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M310.697 669.617 L310.697 666.156 Q312.126 666.833 313.593 667.19 Q315.06 667.548 316.471 667.548 Q320.232 667.548 322.207 665.027 Q324.201 662.488 324.483 657.335 Q323.392 658.953 321.718 659.818 Q320.044 660.683 318.013 660.683 Q313.8 660.683 311.336 658.144 Q308.891 655.586 308.891 651.166 Q308.891 646.84 311.449 644.226 Q314.007 641.612 318.258 641.612 Q323.129 641.612 325.687 645.354 Q328.263 649.078 328.263 656.188 Q328.263 662.827 325.104 666.795 Q321.963 670.745 316.64 670.745 Q315.211 670.745 313.744 670.463 Q312.277 670.181 310.697 669.617 M318.258 657.711 Q320.815 657.711 322.301 655.962 Q323.806 654.213 323.806 651.166 Q323.806 648.138 322.301 646.389 Q320.815 644.621 318.258 644.621 Q315.7 644.621 314.195 646.389 Q312.709 648.138 312.709 651.166 Q312.709 654.213 314.195 655.962 Q315.7 657.711 318.258 657.711 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M119.015 412.55 L137.372 412.55 L137.372 416.485 L123.298 416.485 L123.298 424.957 Q124.316 424.61 125.335 424.448 Q126.353 424.263 127.372 424.263 Q133.159 424.263 136.538 427.434 Q139.918 430.605 139.918 436.022 Q139.918 441.6 136.446 444.702 Q132.974 447.781 126.654 447.781 Q124.478 447.781 122.21 447.411 Q119.964 447.04 117.557 446.299 L117.557 441.6 Q119.64 442.735 121.863 443.29 Q124.085 443.846 126.562 443.846 Q130.566 443.846 132.904 441.739 Q135.242 439.633 135.242 436.022 Q135.242 432.411 132.904 430.304 Q130.566 428.198 126.562 428.198 Q124.687 428.198 122.812 428.614 Q120.96 429.031 119.015 429.911 L119.015 412.55 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M149.131 441.23 L154.015 441.23 L154.015 447.11 L149.131 447.11 L149.131 441.23 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M174.2 415.628 Q170.589 415.628 168.76 419.193 Q166.955 422.735 166.955 429.864 Q166.955 436.971 168.76 440.536 Q170.589 444.077 174.2 444.077 Q177.834 444.077 179.64 440.536 Q181.469 436.971 181.469 429.864 Q181.469 422.735 179.64 419.193 Q177.834 415.628 174.2 415.628 M174.2 411.925 Q180.01 411.925 183.066 416.531 Q186.145 421.114 186.145 429.864 Q186.145 438.591 183.066 443.198 Q180.01 447.781 174.2 447.781 Q168.39 447.781 165.311 443.198 Q162.256 438.591 162.256 429.864 Q162.256 421.114 165.311 416.531 Q168.39 411.925 174.2 411.925 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M222.533 421.647 L211.955 432.272 L222.533 442.85 L219.779 445.651 L209.154 435.026 L198.529 445.651 L195.797 442.85 L206.353 432.272 L195.797 421.647 L198.529 418.846 L209.154 429.471 L219.779 418.846 L222.533 421.647 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M234.894 443.174 L242.533 443.174 L242.533 416.809 L234.223 418.476 L234.223 414.216 L242.487 412.55 L247.163 412.55 L247.163 443.174 L254.802 443.174 L254.802 447.11 L234.894 447.11 L234.894 443.174 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M274.246 415.628 Q270.635 415.628 268.806 419.193 Q267.001 422.735 267.001 429.864 Q267.001 436.971 268.806 440.536 Q270.635 444.077 274.246 444.077 Q277.88 444.077 279.686 440.536 Q281.514 436.971 281.514 429.864 Q281.514 422.735 279.686 419.193 Q277.88 415.628 274.246 415.628 M274.246 411.925 Q280.056 411.925 283.112 416.531 Q286.19 421.114 286.19 429.864 Q286.19 438.591 283.112 443.198 Q280.056 447.781 274.246 447.781 Q268.436 447.781 265.357 443.198 Q262.302 438.591 262.302 429.864 Q262.302 421.114 265.357 416.531 Q268.436 411.925 274.246 411.925 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M286.736 416.502 L292.942 416.502 L292.942 395.08 L286.19 396.434 L286.19 392.973 L292.905 391.619 L296.704 391.619 L296.704 416.502 L302.91 416.502 L302.91 419.699 L286.736 419.699 L286.736 416.502 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M310.697 419.116 L310.697 415.656 Q312.126 416.333 313.593 416.69 Q315.06 417.047 316.471 417.047 Q320.232 417.047 322.207 414.527 Q324.201 411.988 324.483 406.835 Q323.392 408.452 321.718 409.317 Q320.044 410.182 318.013 410.182 Q313.8 410.182 311.336 407.643 Q308.891 405.086 308.891 400.666 Q308.891 396.34 311.449 393.726 Q314.007 391.111 318.258 391.111 Q323.129 391.111 325.687 394.854 Q328.263 398.578 328.263 405.687 Q328.263 412.327 325.104 416.295 Q321.963 420.245 316.64 420.245 Q315.211 420.245 313.744 419.963 Q312.277 419.68 310.697 419.116 M318.258 407.211 Q320.815 407.211 322.301 405.462 Q323.806 403.713 323.806 400.666 Q323.806 397.638 322.301 395.889 Q320.815 394.121 318.258 394.121 Q315.7 394.121 314.195 395.889 Q312.709 397.638 312.709 400.666 Q312.709 403.713 314.195 405.462 Q315.7 407.211 318.258 407.211 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M129.548 177.466 Q126.4 177.466 124.548 179.619 Q122.719 181.771 122.719 185.521 Q122.719 189.248 124.548 191.424 Q126.4 193.577 129.548 193.577 Q132.696 193.577 134.525 191.424 Q136.376 189.248 136.376 185.521 Q136.376 181.771 134.525 179.619 Q132.696 177.466 129.548 177.466 M138.83 162.813 L138.83 167.072 Q137.071 166.239 135.265 165.799 Q133.483 165.359 131.724 165.359 Q127.094 165.359 124.64 168.484 Q122.21 171.609 121.863 177.929 Q123.228 175.915 125.288 174.85 Q127.349 173.762 129.825 173.762 Q135.034 173.762 138.043 176.933 Q141.075 180.082 141.075 185.521 Q141.075 190.845 137.927 194.063 Q134.779 197.281 129.548 197.281 Q123.552 197.281 120.381 192.697 Q117.21 188.091 117.21 179.364 Q117.21 171.17 121.099 166.309 Q124.988 161.424 131.538 161.424 Q133.298 161.424 135.08 161.772 Q136.886 162.119 138.83 162.813 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M149.131 190.73 L154.015 190.73 L154.015 196.609 L149.131 196.609 L149.131 190.73 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M174.2 165.128 Q170.589 165.128 168.76 168.693 Q166.955 172.234 166.955 179.364 Q166.955 186.47 168.76 190.035 Q170.589 193.577 174.2 193.577 Q177.834 193.577 179.64 190.035 Q181.469 186.47 181.469 179.364 Q181.469 172.234 179.64 168.693 Q177.834 165.128 174.2 165.128 M174.2 161.424 Q180.01 161.424 183.066 166.031 Q186.145 170.614 186.145 179.364 Q186.145 188.091 183.066 192.697 Q180.01 197.281 174.2 197.281 Q168.39 197.281 165.311 192.697 Q162.256 188.091 162.256 179.364 Q162.256 170.614 165.311 166.031 Q168.39 161.424 174.2 161.424 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M222.533 171.146 L211.955 181.771 L222.533 192.35 L219.779 195.151 L209.154 184.526 L198.529 195.151 L195.797 192.35 L206.353 181.771 L195.797 171.146 L198.529 168.346 L209.154 178.97 L219.779 168.346 L222.533 171.146 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M234.894 192.674 L242.533 192.674 L242.533 166.309 L234.223 167.975 L234.223 163.716 L242.487 162.049 L247.163 162.049 L247.163 192.674 L254.802 192.674 L254.802 196.609 L234.894 196.609 L234.894 192.674 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M274.246 165.128 Q270.635 165.128 268.806 168.693 Q267.001 172.234 267.001 179.364 Q267.001 186.47 268.806 190.035 Q270.635 193.577 274.246 193.577 Q277.88 193.577 279.686 190.035 Q281.514 186.47 281.514 179.364 Q281.514 172.234 279.686 168.693 Q277.88 165.128 274.246 165.128 M274.246 161.424 Q280.056 161.424 283.112 166.031 Q286.19 170.614 286.19 179.364 Q286.19 188.091 283.112 192.697 Q280.056 197.281 274.246 197.281 Q268.436 197.281 265.357 192.697 Q262.302 188.091 262.302 179.364 Q262.302 170.614 265.357 166.031 Q268.436 161.424 274.246 161.424 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M286.736 166.002 L292.942 166.002 L292.942 144.58 L286.19 145.934 L286.19 142.473 L292.905 141.119 L296.704 141.119 L296.704 166.002 L302.91 166.002 L302.91 169.199 L286.736 169.199 L286.736 166.002 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M310.697 168.616 L310.697 165.155 Q312.126 165.832 313.593 166.19 Q315.06 166.547 316.471 166.547 Q320.232 166.547 322.207 164.027 Q324.201 161.488 324.483 156.334 Q323.392 157.952 321.718 158.817 Q320.044 159.682 318.013 159.682 Q313.8 159.682 311.336 157.143 Q308.891 154.585 308.891 150.165 Q308.891 145.84 311.449 143.225 Q314.007 140.611 318.258 140.611 Q323.129 140.611 325.687 144.354 Q328.263 148.078 328.263 155.187 Q328.263 161.826 325.104 165.795 Q321.963 169.744 316.64 169.744 Q315.211 169.744 313.744 169.462 Q312.277 169.18 310.697 168.616 M318.258 156.711 Q320.815 156.711 322.301 154.961 Q323.806 153.212 323.806 150.165 Q323.806 147.137 322.301 145.388 Q320.815 143.62 318.258 143.62 Q315.7 143.62 314.195 145.388 Q312.709 147.137 312.709 150.165 Q312.709 153.212 314.195 154.961 Q315.7 156.711 318.258 156.711 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M14.1184 942.357 L14.1184 933.7 L53.8723 912.63 L14.1184 912.63 L14.1184 906.391 L61.6384 906.391 L61.6384 915.049 L21.8846 936.119 L61.6384 936.119 L61.6384 942.357 L14.1184 942.357 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1152.59 44.2197 Q1155.22 45.1109 1157.69 48.0275 Q1160.2 50.9442 1162.71 56.0483 L1171.02 72.576 L1162.23 72.576 L1154.49 57.061 Q1151.49 50.9847 1148.66 48.9997 Q1145.86 47.0148 1141 47.0148 L1132.09 47.0148 L1132.09 72.576 L1123.9 72.576 L1123.9 12.096 L1142.38 12.096 Q1152.75 12.096 1157.85 16.4305 Q1162.96 20.7649 1162.96 29.5149 Q1162.96 35.2267 1160.28 38.994 Q1157.65 42.7613 1152.59 44.2197 M1132.09 18.8205 L1132.09 40.2903 L1142.38 40.2903 Q1148.29 40.2903 1151.29 37.5762 Q1154.33 34.8216 1154.33 29.5149 Q1154.33 24.2082 1151.29 21.5346 Q1148.29 18.8205 1142.38 18.8205 L1132.09 18.8205 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1200.02 49.7694 Q1190.99 49.7694 1187.5 51.8354 Q1184.02 53.9013 1184.02 58.8839 Q1184.02 62.8538 1186.61 65.2034 Q1189.25 67.5124 1193.74 67.5124 Q1199.94 67.5124 1203.67 63.1374 Q1207.43 58.7219 1207.43 51.4303 L1207.43 49.7694 L1200.02 49.7694 M1214.89 46.6907 L1214.89 72.576 L1207.43 72.576 L1207.43 65.6895 Q1204.88 69.8214 1201.07 71.8063 Q1197.27 73.7508 1191.76 73.7508 Q1184.79 73.7508 1180.66 69.8619 Q1176.57 65.9325 1176.57 59.3701 Q1176.57 51.7138 1181.67 47.825 Q1186.82 43.9361 1196.98 43.9361 L1207.43 43.9361 L1207.43 43.2069 Q1207.43 38.0623 1204.03 35.2672 Q1200.67 32.4315 1194.55 32.4315 Q1190.66 32.4315 1186.98 33.3632 Q1183.29 34.295 1179.89 36.1584 L1179.89 29.2718 Q1183.98 27.692 1187.83 26.9223 Q1191.68 26.1121 1195.32 26.1121 Q1205.17 26.1121 1210.03 31.2163 Q1214.89 36.3204 1214.89 46.6907 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1260.1 34.0924 L1260.1 9.54393 L1267.55 9.54393 L1267.55 72.576 L1260.1 72.576 L1260.1 65.7705 Q1257.75 69.8214 1254.14 71.8063 Q1250.58 73.7508 1245.55 73.7508 Q1237.33 73.7508 1232.15 67.1883 Q1227 60.6258 1227 49.9314 Q1227 39.2371 1232.15 32.6746 Q1237.33 26.1121 1245.55 26.1121 Q1250.58 26.1121 1254.14 28.0971 Q1257.75 30.0415 1260.1 34.0924 M1234.7 49.9314 Q1234.7 58.1548 1238.06 62.8538 Q1241.46 67.5124 1247.38 67.5124 Q1253.29 67.5124 1256.69 62.8538 Q1260.1 58.1548 1260.1 49.9314 Q1260.1 41.7081 1256.69 37.0496 Q1253.29 32.3505 1247.38 32.3505 Q1241.46 32.3505 1238.06 37.0496 Q1234.7 41.7081 1234.7 49.9314 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1282.9 27.2059 L1290.36 27.2059 L1290.36 72.576 L1282.9 72.576 L1282.9 27.2059 M1282.9 9.54393 L1290.36 9.54393 L1290.36 18.9825 L1282.9 18.9825 L1282.9 9.54393 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1323.53 32.4315 Q1317.54 32.4315 1314.05 37.1306 Q1310.57 41.7891 1310.57 49.9314 Q1310.57 58.0738 1314.01 62.7728 Q1317.5 67.4314 1323.53 67.4314 Q1329.49 67.4314 1332.97 62.7323 Q1336.46 58.0333 1336.46 49.9314 Q1336.46 41.8701 1332.97 37.1711 Q1329.49 32.4315 1323.53 32.4315 M1323.53 26.1121 Q1333.26 26.1121 1338.81 32.4315 Q1344.36 38.7509 1344.36 49.9314 Q1344.36 61.0714 1338.81 67.4314 Q1333.26 73.7508 1323.53 73.7508 Q1313.77 73.7508 1308.22 67.4314 Q1302.71 61.0714 1302.71 49.9314 Q1302.71 38.7509 1308.22 32.4315 Q1313.77 26.1121 1323.53 26.1121 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1377.33 49.7694 Q1368.3 49.7694 1364.81 51.8354 Q1361.33 53.9013 1361.33 58.8839 Q1361.33 62.8538 1363.92 65.2034 Q1366.55 67.5124 1371.05 67.5124 Q1377.25 67.5124 1380.98 63.1374 Q1384.74 58.7219 1384.74 51.4303 L1384.74 49.7694 L1377.33 49.7694 M1392.2 46.6907 L1392.2 72.576 L1384.74 72.576 L1384.74 65.6895 Q1382.19 69.8214 1378.38 71.8063 Q1374.57 73.7508 1369.07 73.7508 Q1362.1 73.7508 1357.97 69.8619 Q1353.87 65.9325 1353.87 59.3701 Q1353.87 51.7138 1358.98 47.825 Q1364.12 43.9361 1374.29 43.9361 L1384.74 43.9361 L1384.74 43.2069 Q1384.74 38.0623 1381.34 35.2672 Q1377.98 32.4315 1371.86 32.4315 Q1367.97 32.4315 1364.29 33.3632 Q1360.6 34.295 1357.2 36.1584 L1357.2 29.2718 Q1361.29 27.692 1365.14 26.9223 Q1368.98 26.1121 1372.63 26.1121 Q1382.47 26.1121 1387.34 31.2163 Q1392.2 36.3204 1392.2 46.6907 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1440.2 28.9478 L1440.2 35.9153 Q1437.04 34.1734 1433.84 33.3227 Q1430.68 32.4315 1427.44 32.4315 Q1420.19 32.4315 1416.18 37.0496 Q1412.17 41.6271 1412.17 49.9314 Q1412.17 58.2358 1416.18 62.8538 Q1420.19 67.4314 1427.44 67.4314 Q1430.68 67.4314 1433.84 66.5807 Q1437.04 65.6895 1440.2 63.9476 L1440.2 70.8341 Q1437.08 72.2924 1433.72 73.0216 Q1430.4 73.7508 1426.63 73.7508 Q1416.38 73.7508 1410.34 67.3098 Q1404.31 60.8689 1404.31 49.9314 Q1404.31 38.832 1410.38 32.472 Q1416.5 26.1121 1427.12 26.1121 Q1430.56 26.1121 1433.84 26.8413 Q1437.12 27.5299 1440.2 28.9478 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1460.54 14.324 L1460.54 27.2059 L1475.89 27.2059 L1475.89 32.9987 L1460.54 32.9987 L1460.54 57.6282 Q1460.54 63.1779 1462.03 64.7578 Q1463.57 66.3376 1468.23 66.3376 L1475.89 66.3376 L1475.89 72.576 L1468.23 72.576 Q1459.6 72.576 1456.32 69.3758 Q1453.04 66.1351 1453.04 57.6282 L1453.04 32.9987 L1447.57 32.9987 L1447.57 27.2059 L1453.04 27.2059 L1453.04 14.324 L1460.54 14.324 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1485.69 27.2059 L1493.14 27.2059 L1493.14 72.576 L1485.69 72.576 L1485.69 27.2059 M1485.69 9.54393 L1493.14 9.54393 L1493.14 18.9825 L1485.69 18.9825 L1485.69 9.54393 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1503.39 27.2059 L1511.29 27.2059 L1525.47 65.2844 L1539.65 27.2059 L1547.55 27.2059 L1530.53 72.576 L1520.41 72.576 L1503.39 27.2059 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1596.65 48.0275 L1596.65 51.6733 L1562.37 51.6733 Q1562.86 59.3701 1566.99 63.421 Q1571.17 67.4314 1578.58 67.4314 Q1582.87 67.4314 1586.88 66.3781 Q1590.93 65.3249 1594.9 63.2184 L1594.9 70.267 Q1590.89 71.9684 1586.68 72.8596 Q1582.47 73.7508 1578.13 73.7508 Q1567.28 73.7508 1560.92 67.4314 Q1554.6 61.1119 1554.6 50.3365 Q1554.6 39.1965 1560.59 32.6746 Q1566.63 26.1121 1576.84 26.1121 Q1585.99 26.1121 1591.3 32.0264 Q1596.65 37.9003 1596.65 48.0275 M1589.19 45.84 Q1589.11 39.7232 1585.75 36.0774 Q1582.43 32.4315 1576.92 32.4315 Q1570.68 32.4315 1566.91 35.9558 Q1563.18 39.4801 1562.62 45.8805 L1589.19 45.84 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1643.76 18.8205 L1643.76 65.8515 L1653.64 65.8515 Q1666.16 65.8515 1671.95 60.1802 Q1677.79 54.509 1677.79 42.2752 Q1677.79 30.1225 1671.95 24.4918 Q1666.16 18.8205 1653.64 18.8205 L1643.76 18.8205 M1635.57 12.096 L1652.39 12.096 Q1669.97 12.096 1678.19 19.4281 Q1686.41 26.7198 1686.41 42.2752 Q1686.41 57.9117 1678.15 65.2439 Q1669.89 72.576 1652.39 72.576 L1635.57 72.576 L1635.57 12.096 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1737.94 48.0275 L1737.94 51.6733 L1703.67 51.6733 Q1704.16 59.3701 1708.29 63.421 Q1712.46 67.4314 1719.87 67.4314 Q1724.17 67.4314 1728.18 66.3781 Q1732.23 65.3249 1736.2 63.2184 L1736.2 70.267 Q1732.19 71.9684 1727.98 72.8596 Q1723.76 73.7508 1719.43 73.7508 Q1708.57 73.7508 1702.21 67.4314 Q1695.89 61.1119 1695.89 50.3365 Q1695.89 39.1965 1701.89 32.6746 Q1707.92 26.1121 1718.13 26.1121 Q1727.29 26.1121 1732.59 32.0264 Q1737.94 37.9003 1737.94 48.0275 M1730.49 45.84 Q1730.41 39.7232 1727.04 36.0774 Q1723.72 32.4315 1718.21 32.4315 Q1711.97 32.4315 1708.21 35.9558 Q1704.48 39.4801 1703.91 45.8805 L1730.49 45.84 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1782.82 28.9478 L1782.82 35.9153 Q1779.67 34.1734 1776.47 33.3227 Q1773.31 32.4315 1770.06 32.4315 Q1762.81 32.4315 1758.8 37.0496 Q1754.79 41.6271 1754.79 49.9314 Q1754.79 58.2358 1758.8 62.8538 Q1762.81 67.4314 1770.06 67.4314 Q1773.31 67.4314 1776.47 66.5807 Q1779.67 65.6895 1782.82 63.9476 L1782.82 70.8341 Q1779.71 72.2924 1776.34 73.0216 Q1773.02 73.7508 1769.25 73.7508 Q1759.01 73.7508 1752.97 67.3098 Q1746.93 60.8689 1746.93 49.9314 Q1746.93 38.832 1753.01 32.472 Q1759.13 26.1121 1769.74 26.1121 Q1773.18 26.1121 1776.47 26.8413 Q1779.75 27.5299 1782.82 28.9478 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1816.41 49.7694 Q1807.37 49.7694 1803.89 51.8354 Q1800.41 53.9013 1800.41 58.8839 Q1800.41 62.8538 1803 65.2034 Q1805.63 67.5124 1810.13 67.5124 Q1816.33 67.5124 1820.05 63.1374 Q1823.82 58.7219 1823.82 51.4303 L1823.82 49.7694 L1816.41 49.7694 M1831.27 46.6907 L1831.27 72.576 L1823.82 72.576 L1823.82 65.6895 Q1821.27 69.8214 1817.46 71.8063 Q1813.65 73.7508 1808.14 73.7508 Q1801.18 73.7508 1797.04 69.8619 Q1792.95 65.9325 1792.95 59.3701 Q1792.95 51.7138 1798.06 47.825 Q1803.2 43.9361 1813.37 43.9361 L1823.82 43.9361 L1823.82 43.2069 Q1823.82 38.0623 1820.42 35.2672 Q1817.06 32.4315 1810.94 32.4315 Q1807.05 32.4315 1803.36 33.3632 Q1799.68 34.295 1796.27 36.1584 L1796.27 29.2718 Q1800.37 27.692 1804.21 26.9223 Q1808.06 26.1121 1811.71 26.1121 Q1821.55 26.1121 1826.41 31.2163 Q1831.27 36.3204 1831.27 46.6907 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M1865.5 76.7889 Q1862.34 84.8907 1859.35 87.3618 Q1856.35 89.8329 1851.33 89.8329 L1845.37 89.8329 L1845.37 83.5945 L1849.75 83.5945 Q1852.82 83.5945 1854.53 82.1361 Q1856.23 80.6778 1858.29 75.2496 L1859.63 71.8468 L1841.28 27.2059 L1849.18 27.2059 L1863.36 62.6918 L1877.54 27.2059 L1885.43 27.2059 L1865.5 76.7889 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><polyline clip-path="url(#clip532)" style="stroke:#009af9; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="368.583,172.882 370.858,189.938 373.132,206.805 375.407,223.485 377.681,239.979 379.956,256.29 382.23,272.418 384.504,288.367 386.779,304.136 389.053,319.729 391.328,335.148 393.602,350.392 395.877,365.465 398.151,380.369 400.426,395.104 402.7,409.672 404.975,424.076 407.249,438.317 409.523,452.396 411.798,466.315 414.072,480.076 416.347,493.68 418.621,507.13 420.896,520.425 423.17,533.569 425.445,546.563 427.719,559.409 429.993,572.107 432.268,584.659 434.542,597.068 436.817,609.334 439.091,621.46 441.366,633.446 443.64,645.294 445.915,657.006 448.189,668.583 450.463,680.026 452.738,691.338 455.012,702.519 457.287,713.572 459.561,724.496 461.836,735.295 464.11,745.969 466.385,756.52 468.659,766.949 470.933,777.258 473.208,787.447 475.482,797.519 477.757,807.475 480.031,817.315 482.306,827.043 484.58,836.657 486.855,846.162 489.129,855.556 491.404,864.842 493.678,874.022 495.952,883.095 498.227,892.065 500.501,900.931 502.776,909.695 505.05,918.359 507.325,926.924 509.599,935.39 511.874,943.76 514.148,952.034 516.422,960.214 518.697,968.301 520.971,976.295 523.246,984.199 525.52,992.013 527.795,999.739 530.069,1007.38 532.344,1014.93 534.618,1022.4 536.892,1029.78 539.167,1037.08 541.441,1044.3 543.716,1051.44 545.99,1058.5 548.265,1065.48 550.539,1072.38 552.814,1079.21 555.088,1085.96 557.362,1092.64 559.637,1099.24 561.911,1105.78 564.186,1112.24 566.46,1118.63 568.735,1124.95 571.009,1131.2 573.284,1137.38 575.558,1143.49 577.832,1149.53 580.107,1155.51 582.381,1161.41 584.656,1167.25 586.93,1173.02 589.205,1178.73 591.479,1184.37 593.754,1189.95 596.028,1195.46 598.303,1200.91 600.577,1206.3 602.851,1211.63 605.126,1216.9 607.4,1222.1 609.675,1227.25 611.949,1232.34 614.224,1237.38 616.498,1242.35 618.773,1247.27 621.047,1252.13 623.321,1256.94 625.596,1261.7 627.87,1266.39 630.145,1271.04 632.419,1275.63 634.694,1280.17 636.968,1284.66 639.243,1289.1 641.517,1293.49 643.791,1297.83 646.066,1302.12 648.34,1306.36 650.615,1310.55 652.889,1314.7 655.164,1318.8 657.438,1322.85 659.713,1326.85 661.987,1330.81 664.261,1334.73 666.536,1338.6 668.81,1342.43 671.085,1346.21 673.359,1349.96 675.634,1353.66 677.908,1357.31 680.183,1360.93 682.457,1364.51 684.731,1368.04 687.006,1371.54 689.28,1374.99 691.555,1378.41 693.829,1381.79 696.104,1385.13 698.378,1388.43 700.653,1391.69 702.927,1394.92 705.202,1398.11 707.476,1401.26 709.75,1404.38 712.025,1407.46 714.299,1410.51 716.574,1413.52 718.848,1416.5 721.123,1419.44 723.397,1422.35 725.672,1425.23 727.946,1428.07 730.22,1430.88 732.495,1433.66 734.769,1436.41 737.044,1439.13 739.318,1441.81 741.593,1444.47 743.867,1447.09 746.142,1449.69 748.416,1452.25 750.69,1454.79 752.965,1457.3 755.239,1459.78 757.514,1462.23 759.788,1464.65 762.063,1467.05 764.337,1469.41 766.612,1471.75 768.886,1474.07 771.16,1476.36 773.435,1478.62 775.709,1480.85 777.984,1483.07 780.258,1485.25 782.533,1487.41 784.807,1489.55 787.082,1491.66 789.356,1493.75 791.631,1495.82 793.905,1497.86 796.179,1499.88 798.454,1501.87 800.728,1503.85 803.003,1505.8 805.277,1507.73 807.552,1509.63 809.826,1511.52 812.101,1513.39 814.375,1515.23 816.649,1517.05 818.924,1518.86 821.198,1520.64 823.473,1522.4 825.747,1524.14 828.022,1525.86 830.296,1527.57 832.571,1529.25 834.845,1530.91 837.119,1532.56 839.394,1534.19 841.668,1535.79 843.943,1537.38 846.217,1538.96 848.492,1540.51 850.766,1542.05 853.041,1543.56 855.315,1545.07 857.589,1546.55 859.864,1548.02 862.138,1549.47 864.413,1550.9 866.687,1552.32 868.962,1553.72 871.236,1555.11 873.511,1556.48 875.785,1557.83 878.059,1559.17 880.334,1560.5 882.608,1561.81 884.883,1563.1 887.157,1564.38 889.432,1565.65 891.706,1566.9 893.981,1568.13 896.255,1569.35 898.53,1570.56 900.804,1571.76 903.078,1572.94 905.353,1574.11 907.627,1575.26 909.902,1576.4 912.176,1577.53 914.451,1578.65 916.725,1579.75 919,1580.84 921.274,1581.92 923.548,1582.98 925.823,1584.04 928.097,1585.08 930.372,1586.11 932.646,1587.13 934.921,1588.14 937.195,1589.13 939.47,1590.12 941.744,1591.09 944.018,1592.05 946.293,1593 948.567,1593.94 950.842,1594.87 953.116,1595.79 955.391,1596.7 957.665,1597.6 959.94,1598.49 962.214,1599.37 964.488,1600.24 966.763,1601.1 969.037,1601.95 971.312,1602.78 973.586,1603.61 975.861,1604.44 978.135,1605.25 980.41,1606.05 982.684,1606.84 984.958,1607.62 987.233,1608.4 989.507,1609.17 991.782,1609.92 994.056,1610.67 996.331,1611.41 998.605,1612.14 1000.88,1612.87 1003.15,1613.58 1005.43,1614.29 1007.7,1614.99 1009.98,1615.68 1012.25,1616.36 1014.53,1617.04 1016.8,1617.7 1019.08,1618.36 1021.35,1619.02 1023.62,1619.66 1025.9,1620.3 1028.17,1620.93 1030.45,1621.55 1032.72,1622.17 1035,1622.78 1037.27,1623.38 1039.55,1623.97 1041.82,1624.56 1044.09,1625.15 1046.37,1625.72 1048.64,1626.29 1050.92,1626.85 1053.19,1627.41 1055.47,1627.96 1057.74,1628.5 1060.02,1629.04 1062.29,1629.57 1064.56,1630.09 1066.84,1630.61 1069.11,1631.13 1071.39,1631.63 1073.66,1632.14 1075.94,1632.63 1078.21,1633.12 1080.49,1633.61 1082.76,1634.09 1085.03,1634.56 1087.31,1635.03 1089.58,1635.5 1091.86,1635.95 1094.13,1636.41 1096.41,1636.86 1098.68,1637.3 1100.96,1637.74 1103.23,1638.17 1105.5,1638.6 1107.78,1639.02 1110.05,1639.44 1112.33,1639.85 1114.6,1640.26 1116.88,1640.67 1119.15,1641.07 1121.43,1641.46 1123.7,1641.85 1125.97,1642.24 1128.25,1642.62 1130.52,1643 1132.8,1643.37 1135.07,1643.74 1137.35,1644.1 1139.62,1644.47 1141.9,1644.82 1144.17,1645.17 1146.44,1645.52 1148.72,1645.87 1150.99,1646.21 1153.27,1646.54 1155.54,1646.88 1157.82,1647.21 1160.09,1647.53 1162.37,1647.85 1164.64,1648.17 1166.91,1648.49 1169.19,1648.8 1171.46,1649.1 1173.74,1649.41 1176.01,1649.71 1178.29,1650 1180.56,1650.3 1182.84,1650.59 1185.11,1650.87 1187.38,1651.16 1189.66,1651.44 1191.93,1651.72 1194.21,1651.99 1196.48,1652.26 1198.76,1652.53 1201.03,1652.79 1203.31,1653.06 1205.58,1653.31 1207.85,1653.57 1210.13,1653.82 1212.4,1654.07 1214.68,1654.32 1216.95,1654.57 1219.23,1654.81 1221.5,1655.05 1223.78,1655.28 1226.05,1655.52 1228.32,1655.75 1230.6,1655.98 1232.87,1656.2 1235.15,1656.43 1237.42,1656.65 1239.7,1656.87 1241.97,1657.08 1244.25,1657.29 1246.52,1657.51 1248.79,1657.71 1251.07,1657.92 1253.34,1658.12 1255.62,1658.33 1257.89,1658.53 1260.17,1658.72 1262.44,1658.92 1264.72,1659.11 1266.99,1659.3 1269.26,1659.49 1271.54,1659.67 1273.81,1659.86 1276.09,1660.04 1278.36,1660.22 1280.64,1660.4 1282.91,1660.57 1285.19,1660.75 1287.46,1660.92 1289.73,1661.09 1292.01,1661.26 1294.28,1661.42 1296.56,1661.59 1298.83,1661.75 1301.11,1661.91 1303.38,1662.07 1305.66,1662.22 1307.93,1662.38 1310.2,1662.53 1312.48,1662.68 1314.75,1662.83 1317.03,1662.98 1319.3,1663.13 1321.58,1663.27 1323.85,1663.42 1326.13,1663.56 1328.4,1663.7 1330.67,1663.84 1332.95,1663.97 1335.22,1664.11 1337.5,1664.24 1339.77,1664.37 1342.05,1664.5 1344.32,1664.63 1346.6,1664.76 1348.87,1664.89 1351.14,1665.01 1353.42,1665.13 1355.69,1665.26 1357.97,1665.38 1360.24,1665.5 1362.52,1665.61 1364.79,1665.73 1367.07,1665.84 1369.34,1665.96 1371.61,1666.07 1373.89,1666.18 1376.16,1666.29 1378.44,1666.4 1380.71,1666.51 1382.99,1666.62 1385.26,1666.72 1387.54,1666.83 1389.81,1666.93 1392.08,1667.03 1394.36,1667.13 1396.63,1667.23 1398.91,1667.33 1401.18,1667.42 1403.46,1667.52 1405.73,1667.62 1408.01,1667.71 1410.28,1667.8 1412.55,1667.89 1414.83,1667.98 1417.1,1668.07 1419.38,1668.16 1421.65,1668.25 1423.93,1668.34 1426.2,1668.42 1428.48,1668.51 1430.75,1668.59 1433.02,1668.67 1435.3,1668.76 1437.57,1668.84 1439.85,1668.92 1442.12,1669 1444.4,1669.07 1446.67,1669.15 1448.95,1669.23 1451.22,1669.3 1453.49,1669.38 1455.77,1669.45 1458.04,1669.52 1460.32,1669.6 1462.59,1669.67 1464.87,1669.74 1467.14,1669.81 1469.42,1669.88 1471.69,1669.95 1473.96,1670.01 1476.24,1670.08 1478.51,1670.14 1480.79,1670.21 1483.06,1670.27 1485.34,1670.34 1487.61,1670.4 1489.89,1670.46 1492.16,1670.52 1494.43,1670.59 1496.71,1670.65 1498.98,1670.7 1501.26,1670.76 1503.53,1670.82 1505.81,1670.88 1508.08,1670.94 1510.36,1670.99 1512.63,1671.05 1514.9,1671.1 1517.18,1671.16 1519.45,1671.21 1521.73,1671.26 1524,1671.32 1526.28,1671.37 1528.55,1671.42 1530.83,1671.47 1533.1,1671.52 1535.37,1671.57 1537.65,1671.62 1539.92,1671.67 1542.2,1671.71 1544.47,1671.76 1546.75,1671.81 1549.02,1671.85 1551.3,1671.9 1553.57,1671.95 1555.84,1671.99 1558.12,1672.03 1560.39,1672.08 1562.67,1672.12 1564.94,1672.16 1567.22,1672.21 1569.49,1672.25 1571.77,1672.29 1574.04,1672.33 1576.31,1672.37 1578.59,1672.41 1580.86,1672.45 1583.14,1672.49 1585.41,1672.53 1587.69,1672.57 1589.96,1672.6 1592.24,1672.64 1594.51,1672.68 1596.78,1672.71 1599.06,1672.75 1601.33,1672.78 1603.61,1672.82 1605.88,1672.85 1608.16,1672.89 1610.43,1672.92 1612.71,1672.96 1614.98,1672.99 1617.25,1673.02 1619.53,1673.06 1621.8,1673.09 1624.08,1673.12 1626.35,1673.15 1628.63,1673.18 1630.9,1673.21 1633.18,1673.24 1635.45,1673.27 1637.72,1673.3 1640,1673.33 1642.27,1673.36 1644.55,1673.39 1646.82,1673.42 1649.1,1673.44 1651.37,1673.47 1653.65,1673.5 1655.92,1673.53 1658.19,1673.55 1660.47,1673.58 1662.74,1673.61 1665.02,1673.63 1667.29,1673.66 1669.57,1673.68 1671.84,1673.71 1674.12,1673.73 1676.39,1673.76 1678.66,1673.78 1680.94,1673.8 1683.21,1673.83 1685.49,1673.85 1687.76,1673.87 1690.04,1673.9 1692.31,1673.92 1694.59,1673.94 1696.86,1673.96 1699.13,1673.99 1701.41,1674.01 1703.68,1674.03 1705.96,1674.05 1708.23,1674.07 1710.51,1674.09 1712.78,1674.11 1715.06,1674.13 1717.33,1674.15 1719.6,1674.17 1721.88,1674.19 1724.15,1674.21 1726.43,1674.23 1728.7,1674.25 1730.98,1674.27 1733.25,1674.29 1735.53,1674.3 1737.8,1674.32 1740.07,1674.34 1742.35,1674.36 1744.62,1674.37 1746.9,1674.39 1749.17,1674.41 1751.45,1674.42 1753.72,1674.44 1756,1674.46 1758.27,1674.47 1760.54,1674.49 1762.82,1674.51 1765.09,1674.52 1767.37,1674.54 1769.64,1674.55 1771.92,1674.57 1774.19,1674.58 1776.47,1674.6 1778.74,1674.61 1781.01,1674.63 1783.29,1674.64 1785.56,1674.65 1787.84,1674.67 1790.11,1674.68 1792.39,1674.7 1794.66,1674.71 1796.94,1674.72 1799.21,1674.74 1801.48,1674.75 1803.76,1674.76 1806.03,1674.77 1808.31,1674.79 1810.58,1674.8 1812.86,1674.81 1815.13,1674.82 1817.41,1674.84 1819.68,1674.85 1821.95,1674.86 1824.23,1674.87 1826.5,1674.88 1828.78,1674.89 1831.05,1674.9 1833.33,1674.92 1835.6,1674.93 1837.88,1674.94 1840.15,1674.95 1842.43,1674.96 1844.7,1674.97 1846.97,1674.98 1849.25,1674.99 1851.52,1675 1853.8,1675.01 1856.07,1675.02 1858.35,1675.03 1860.62,1675.04 1862.9,1675.05 1865.17,1675.06 1867.44,1675.07 1869.72,1675.08 1871.99,1675.09 1874.27,1675.1 1876.54,1675.1 1878.82,1675.11 1881.09,1675.12 1883.37,1675.13 1885.64,1675.14 1887.91,1675.15 1890.19,1675.16 1892.46,1675.16 1894.74,1675.17 1897.01,1675.18 1899.29,1675.19 1901.56,1675.2 1903.84,1675.2 1906.11,1675.21 1908.38,1675.22 1910.66,1675.23 1912.93,1675.23 1915.21,1675.24 1917.48,1675.25 1919.76,1675.26 1922.03,1675.26 1924.31,1675.27 1926.58,1675.28 1928.85,1675.28 1931.13,1675.29 1933.4,1675.3 1935.68,1675.3 1937.95,1675.31 1940.23,1675.32 1942.5,1675.32 1944.78,1675.33 1947.05,1675.34 1949.32,1675.34 1951.6,1675.35 1953.87,1675.36 1956.15,1675.36 1958.42,1675.37 1960.7,1675.37 1962.97,1675.38 1965.25,1675.38 1967.52,1675.39 1969.79,1675.4 1972.07,1675.4 1974.34,1675.41 1976.62,1675.41 1978.89,1675.42 1981.17,1675.42 1983.44,1675.43 1985.72,1675.43 1987.99,1675.44 1990.26,1675.44 1992.54,1675.45 1994.81,1675.45 1997.09,1675.46 1999.36,1675.46 2001.64,1675.47 2003.91,1675.47 2006.19,1675.48 2008.46,1675.48 2010.73,1675.49 2013.01,1675.49 2015.28,1675.5 2017.56,1675.5 2019.83,1675.5 2022.11,1675.51 2024.38,1675.51 2026.66,1675.52 2028.93,1675.52 2031.2,1675.53 2033.48,1675.53 2035.75,1675.53 2038.03,1675.54 2040.3,1675.54 2042.58,1675.55 2044.85,1675.55 2047.13,1675.55 2049.4,1675.56 2051.67,1675.56 2053.95,1675.56 2056.22,1675.57 2058.5,1675.57 2060.77,1675.57 2063.05,1675.58 2065.32,1675.58 2067.6,1675.58 2069.87,1675.59 2072.14,1675.59 2074.42,1675.59 2076.69,1675.6 2078.97,1675.6 2081.24,1675.6 2083.52,1675.61 2085.79,1675.61 2088.07,1675.61 2090.34,1675.62 2092.61,1675.62 2094.89,1675.62 2097.16,1675.63 2099.44,1675.63 2101.71,1675.63 2103.99,1675.63 2106.26,1675.64 2108.54,1675.64 2110.81,1675.64 2113.08,1675.65 2115.36,1675.65 2117.63,1675.65 2119.91,1675.65 2122.18,1675.66 2124.46,1675.66 2126.73,1675.66 2129.01,1675.66 2131.28,1675.67 2133.55,1675.67 2135.83,1675.67 2138.1,1675.67 2140.38,1675.68 2142.65,1675.68 2144.93,1675.68 2147.2,1675.68 2149.48,1675.69 2151.75,1675.69 2154.02,1675.69 2156.3,1675.69 2158.57,1675.69 2160.85,1675.7 2163.12,1675.7 2165.4,1675.7 2167.67,1675.7 2169.95,1675.7 2172.22,1675.71 2174.49,1675.71 2176.77,1675.71 2179.04,1675.71 2181.32,1675.71 2183.59,1675.72 2185.87,1675.72 2188.14,1675.72 2190.42,1675.72 2192.69,1675.72 2194.96,1675.73 2197.24,1675.73 2199.51,1675.73 2201.79,1675.73 2204.06,1675.73 2206.34,1675.73 2208.61,1675.74 2210.89,1675.74 2213.16,1675.74 2215.43,1675.74 2217.71,1675.74 2219.98,1675.74 2222.26,1675.75 2224.53,1675.75 2226.81,1675.75 2229.08,1675.75 2231.36,1675.75 2233.63,1675.75 2235.9,1675.76 2238.18,1675.76 2240.45,1675.76 2242.73,1675.76 2245,1675.76 2247.28,1675.76 2249.55,1675.76 2251.83,1675.77 2254.1,1675.77 2256.37,1675.77 2258.65,1675.77 2260.92,1675.77 2263.2,1675.77 2265.47,1675.77 2267.75,1675.77 2270.02,1675.78 2272.3,1675.78 2274.57,1675.78 2276.84,1675.78 2279.12,1675.78 2281.39,1675.78 2283.67,1675.78 2285.94,1675.78 2288.22,1675.78 2290.49,1675.79 2292.77,1675.79 2295.04,1675.79 2297.31,1675.79 2299.59,1675.79 2301.86,1675.79 2304.14,1675.79 2306.41,1675.79 2308.69,1675.79 2310.96,1675.8 2313.24,1675.8 2315.51,1675.8 2317.78,1675.8 2320.06,1675.8 2322.33,1675.8 2324.61,1675.8 2326.88,1675.8 2329.16,1675.8 2331.43,1675.8 2333.71,1675.81 2335.98,1675.81 2338.25,1675.81 2340.53,1675.81 2342.8,1675.81 2345.08,1675.81 2347.35,1675.81 2349.63,1675.81 2351.9,1675.81 2354.18,1675.81 2356.45,1675.81 2358.72,1675.81 2361,1675.82 2363.27,1675.82 2365.55,1675.82 2367.82,1675.82 2370.1,1675.82 2372.37,1675.82 2374.65,1675.82 2376.92,1675.82 2379.19,1675.82 2381.47,1675.82 2383.74,1675.82 2386.02,1675.82 2388.29,1675.82 2390.57,1675.82 2392.84,1675.83 2395.12,1675.83 2397.39,1675.83 2399.66,1675.83 2401.94,1675.83 2404.21,1675.83 2406.49,1675.83 2408.76,1675.83 2411.04,1675.83 2413.31,1675.83 2415.59,1675.83 2417.86,1675.83 2420.13,1675.83 2422.41,1675.83 2424.68,1675.83 2426.96,1675.83 2429.23,1675.84 2431.51,1675.84 2433.78,1675.84 2436.06,1675.84 2438.33,1675.84 2440.6,1675.84 2442.88,1675.84 2445.15,1675.84 2447.43,1675.84 2449.7,1675.84 2451.98,1675.84 2454.25,1675.84 2456.53,1675.84 2458.8,1675.84 2461.07,1675.84 2463.35,1675.84 2465.62,1675.84 2467.9,1675.84 2470.17,1675.84 2472.45,1675.84 2474.72,1675.84 2477,1675.85 2479.27,1675.85 2481.54,1675.85 2483.82,1675.85 2486.09,1675.85 2488.37,1675.85 2490.64,1675.85 2492.92,1675.85 2495.19,1675.85 2497.47,1675.85 2499.74,1675.85 2502.01,1675.85 2504.29,1675.85 2506.56,1675.85 2508.84,1675.85 2511.11,1675.85 2513.39,1675.85 2515.66,1675.85 2517.94,1675.85 2520.21,1675.85 2522.48,1675.85 2524.76,1675.85 2527.03,1675.85 2529.31,1675.85 2531.58,1675.85 2533.86,1675.85 2536.13,1675.86 2538.41,1675.86 2540.68,1675.86 2542.95,1675.86 2545.23,1675.86 2547.5,1675.86 2549.78,1675.86 2552.05,1675.86 2554.33,1675.86 2556.6,1675.86 2558.88,1675.86 2561.15,1675.86 2563.42,1675.86 2565.7,1675.86 2567.97,1675.86 2570.25,1675.86 2572.52,1675.86 2574.8,1675.86 2577.07,1675.86 2579.35,1675.86 2581.62,1675.86 2583.89,1675.86 2586.17,1675.86 2588.44,1675.86 2590.72,1675.86 2592.99,1675.86 2595.27,1675.86 2597.54,1675.86 2599.82,1675.86 2602.09,1675.86 2604.36,1675.86 2606.64,1675.86 2608.91,1675.86 2611.19,1675.86 2613.46,1675.86 2615.74,1675.86 2618.01,1675.86 2620.29,1675.87 2622.56,1675.87 2624.83,1675.87 2627.11,1675.87 2629.38,1675.87 2631.66,1675.87 2633.93,1675.87 2636.21,1675.87 2638.48,1675.87 2640.76,1675.87 "></polyline>
<path clip-path="url(#clip530)" d="M2248.7 284.578 L2565.02 284.578 L2565.02 180.898 L2248.7 180.898  Z" fill="#ffffff" fill-rule="evenodd" fill-opacity="1"></path>
<polyline clip-path="url(#clip530)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2248.7,284.578 2565.02,284.578 2565.02,180.898 2248.7,180.898 2248.7,284.578 "></polyline>
<polyline clip-path="url(#clip530)" style="stroke:#009af9; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2273.95,232.738 2425.43,232.738 "></polyline>
<path clip-path="url(#clip530)" d="M2450.67 239.786 L2450.67 224.092 L2454.93 224.092 L2454.93 239.624 Q2454.93 243.305 2456.37 245.157 Q2457.8 246.985 2460.67 246.985 Q2464.12 246.985 2466.11 244.786 Q2468.13 242.587 2468.13 238.791 L2468.13 224.092 L2472.39 224.092 L2472.39 250.018 L2468.13 250.018 L2468.13 246.036 Q2466.58 248.397 2464.52 249.555 Q2462.48 250.689 2459.77 250.689 Q2455.3 250.689 2452.99 247.911 Q2450.67 245.133 2450.67 239.786 M2461.39 223.467 L2461.39 223.467 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2480.77 213.999 L2490.58 213.999 L2490.58 217.309 L2485.03 217.309 L2485.03 252.957 L2490.58 252.957 L2490.58 256.268 L2480.77 256.268 L2480.77 213.999 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2501.07 246.082 L2508.71 246.082 L2508.71 219.717 L2500.4 221.383 L2500.4 217.124 L2508.66 215.458 L2513.34 215.458 L2513.34 246.082 L2520.97 246.082 L2520.97 250.018 L2501.07 250.018 L2501.07 246.082 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip530)" d="M2539.77 213.999 L2539.77 256.268 L2529.96 256.268 L2529.96 252.957 L2535.49 252.957 L2535.49 217.309 L2529.96 217.309 L2529.96 213.999 L2539.77 213.999 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path></svg>
</div>
</div>
</section>
</section>
<section id="second-example-newtons-law-of-cooling" class="level3">
<h3 class="anchored" data-anchor-id="second-example-newtons-law-of-cooling">Second Example: Newton’s Law of Cooling</h3>
<p>As we have seen in an example before, we know that something cools much faster when the difference between the temperature of that object and the surrounding temperature is comparatively higher. When the difference is lower, it takes a <em>higher</em> amount of time to cool down.</p>
<p>The problem was quantified by Isaac Newton himself. Let’s understand it.</p>
<p>The temperature of an object, <img src="https://latex.codecogs.com/png.latex?T"> varies with time, <img src="https://latex.codecogs.com/png.latex?t">, and it depends on the difference of the temperature of the object and its surroundings- the ambient temperature <img src="https://latex.codecogs.com/png.latex?T_a">.</p>
<p><img src="https://latex.codecogs.com/png.latex?%0A%5Cbegin%7Balign%7D%0A%20%20%20%20%5Cdfrac%7BdT%7D%7Bdt%7D%20&amp;%5Cpropto%20(T%20-%20T_a)%20%5C%5C%0A%20%20%20%20%5Cimplies%20%5Cdfrac%7BdT%7D%7Bdt%7D%20&amp;=%20k(T%20-%20T_a)%0A%5Cend%7Balign%7D%0A"></p>
<p>where <img src="https://latex.codecogs.com/png.latex?k"> is a constant of proportionality, the value of which depends on the material.</p>
<p>Now we will implement this DE in Julia, and solve it using <code>DifferentialEquations.jl</code> library.</p>
<section id="function-definition-1" class="level4">
<h4 class="anchored" data-anchor-id="function-definition-1">Function Definition</h4>
<div class="cell" data-tags="[]" data-execution_count="7">
<div class="sourceCode cell-code" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode numberSource julia number-lines code-with-copy"><code class="sourceCode julia"><span id="cb12-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">function</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">newtons_cooling!</span>(du, u, p, t)</span>
<span id="cb12-2">    k, T_a <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> p</span>
<span id="cb12-3">    du[<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> (u[<span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">-</span> T_a)</span>
<span id="cb12-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">end</span></span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="8">
<pre><code>newtons_cooling! (generic function with 1 method)</code></pre>
</div>
</div>
<p>Expected format-</p>
<div class="sourceCode" id="cb14" style="background: #f1f3f5;"><pre class="sourceCode numberSource julia number-lines code-with-copy"><code class="sourceCode julia"><span id="cb14-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">f</span>(du, u, p, t) <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> u</span></code></pre></div>
<p>Where <code>du</code> is the first derivative, <code>u</code> is the function, <code>t</code> is the time-span for which we want the function’s output, and <code>p</code> is the parameter, or a set of parameters.</p>
<p>Here, we are using in-place updating to define <code>du</code> because it is memory efficient, and will be a crucial where there is a system of Differential Equations present.</p>
<p>Here we have two parameters- <code>k</code> and <code>T_a</code>, and they are related as <img src="https://latex.codecogs.com/png.latex?T_1%20=%20k%20%5Ctimes%20(T_0%20-%20T_a)">. That is what we implement on line 3 of the function definition.</p>
</section>
<section id="declaring-parameters-1" class="level4">
<h4 class="anchored" data-anchor-id="declaring-parameters-1">Declaring Parameters</h4>
<div class="cell" data-tags="[]" data-execution_count="8">
<div class="sourceCode cell-code" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode numberSource julia number-lines code-with-copy"><code class="sourceCode julia"><span id="cb15-1">T <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;">80.0</span>]                <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Temperature of object</span></span>
<span id="cb15-2">k <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</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.06</span>                 <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># k, the cooling constant, negative, because cooling</span></span>
<span id="cb15-3">T_a <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;">20.0</span>                <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># the ambient temperature</span></span>
<span id="cb15-4">tspan <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 class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">300.0</span>)      <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># time-period for which we want to tract the values of the function, i.e. temperature of the object</span></span>
<span id="cb15-5">p <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> (k, T_a)              <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># defining a tuple of parameters as expected by the library</span></span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="9">
<pre><code>(-0.06, 20.0)</code></pre>
</div>
</div>
</section>
<section id="defining-the-ode-problem-1" class="level4">
<h4 class="anchored" data-anchor-id="defining-the-ode-problem-1">Defining the ODE Problem</h4>
<p>Here we define the <code>ODEProblem</code> as required by the solver package.</p>
<div class="cell" data-tags="[]" data-execution_count="9">
<div class="sourceCode cell-code" id="cb17" style="background: #f1f3f5;"><pre class="sourceCode numberSource julia number-lines code-with-copy"><code class="sourceCode julia"><span id="cb17-1">prob <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ODEProblem</span>(newtons_cooling!, T, tspan, p)</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="10">
<div class="ansi-escaped-output">
<pre><span style="color:rgb(86,182,194)">ODEProblem</span> with uType <span style="color:rgb(86,182,194)">Vector{Float64}</span> and tType <span style="color:rgb(86,182,194)">Float64</span>. In-place: <span style="color:rgb(86,182,194)">true</span>
Non-trivial mass matrix: <span style="color:rgb(86,182,194)">false</span>
timespan: (0.0, 300.0)
u0: 1-element Vector{Float64}:
 80.0</pre>
</div>
</div>
</div>
</section>
<section id="solving-the-ode" class="level4">
<h4 class="anchored" data-anchor-id="solving-the-ode">Solving the ODE</h4>
<div class="cell" data-tags="[]" data-execution_count="10">
<div class="sourceCode cell-code" id="cb18" style="background: #f1f3f5;"><pre class="sourceCode numberSource julia number-lines code-with-copy"><code class="sourceCode julia"><span id="cb18-1">sol <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">solve</span>(prob)</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="11">
<pre><code>retcode: Success
Interpolation: 3rd order Hermite
t: 19-element Vector{Float64}:
   0.0
   0.18593390178623953
   2.045272919648635
   6.383848011370185
  11.959325821307548
  18.73361986647917
  26.74893491369098
  35.99530039828558
  46.545554755847775
  58.51808266239741
  72.13894261696798
  87.73678833989489
 105.79306069340441
 126.99454945496298
 152.3564523878484
 183.42977158769716
 222.68158609043894
 273.9980369813687
 300.0
u: 19-element Vector{Vector{Float64}}:
 [80.0]
 [79.33435782064105]
 [73.07086984267411]
 [60.9075122329383]
 [49.276503335091164]
 [39.49832238666797]
 [32.054188527309826]
 [26.921535861341653]
 [23.675325765485024]
 [21.792012228502433]
 [20.79153270072668]
 [20.31058542718253]
 [20.10523457704901]
 [20.029607729780903]
 [20.006573373974568]
 [20.0011132329579]
 [20.00018200375497]
 [20.000082850038083]
 [20.00001776796253]</code></pre>
</div>
</div>
<div class="cell" data-tags="[]" data-execution_count="11">
<div class="sourceCode cell-code" id="cb20" style="background: #f1f3f5;"><pre class="sourceCode numberSource julia number-lines code-with-copy"><code class="sourceCode julia"><span id="cb20-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">plot</span>(sol,</span>
<span id="cb20-2">    xlabel<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;">"Time, t"</span>,</span>
<span id="cb20-3">    ylabel<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;">"Temperature, T"</span>,</span>
<span id="cb20-4">    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;">"Temperature vs. Time"</span>)</span></code></pre></div>
<div class="cell-output cell-output-display" data-execution_count="12">
<!--?xml version="1.0" encoding="utf-8"?-->
<svg xmlns="http://www.w3.org/2000/svg" xlink="http://www.w3.org/1999/xlink" width="672" height="480" viewbox="0 0 2688 1920">
<defs>
  <clippath id="clip620">
    <rect x="0" y="0" width="2688" height="1920"></rect>
  </clippath>
</defs>
<path clip-path="url(#clip620)" d="M0 1920 L2688 1920 L2688 0 L0 0  Z" fill="#ffffff" fill-rule="evenodd" fill-opacity="1"></path>
<defs>
  <clippath id="clip621">
    <rect x="537" y="0" width="1883" height="1883"></rect>
  </clippath>
</defs>
<path clip-path="url(#clip620)" d="M211.395 1734.12 L2640.76 1734.12 L2640.76 127.792 L211.395 127.792  Z" fill="#ffffff" fill-rule="evenodd" fill-opacity="1"></path>
<defs>
  <clippath id="clip622">
    <rect x="211" y="127" width="2430" height="1607"></rect>
  </clippath>
</defs>
<polyline clip-path="url(#clip622)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="211.395,1734.12 211.395,127.792 "></polyline>
<polyline clip-path="url(#clip622)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="1021.18,1734.12 1021.18,127.792 "></polyline>
<polyline clip-path="url(#clip622)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="1830.97,1734.12 1830.97,127.792 "></polyline>
<polyline clip-path="url(#clip622)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="2640.76,1734.12 2640.76,127.792 "></polyline>
<polyline clip-path="url(#clip622)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="211.395,1688.65 2640.76,1688.65 "></polyline>
<polyline clip-path="url(#clip622)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="211.395,1436.09 2640.76,1436.09 "></polyline>
<polyline clip-path="url(#clip622)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="211.395,1183.52 2640.76,1183.52 "></polyline>
<polyline clip-path="url(#clip622)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="211.395,930.954 2640.76,930.954 "></polyline>
<polyline clip-path="url(#clip622)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="211.395,678.387 2640.76,678.387 "></polyline>
<polyline clip-path="url(#clip622)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="211.395,425.821 2640.76,425.821 "></polyline>
<polyline clip-path="url(#clip622)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:2; stroke-opacity:0.1; fill:none" points="211.395,173.254 2640.76,173.254 "></polyline>
<polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="211.395,1734.12 2640.76,1734.12 "></polyline>
<polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="211.395,1734.12 211.395,1715.22 "></polyline>
<polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="1021.18,1734.12 1021.18,1715.22 "></polyline>
<polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="1830.97,1734.12 1830.97,1715.22 "></polyline>
<polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2640.76,1734.12 2640.76,1715.22 "></polyline>
<path clip-path="url(#clip620)" d="M211.395 1767.34 Q207.784 1767.34 205.955 1770.9 Q204.15 1774.45 204.15 1781.58 Q204.15 1788.68 205.955 1792.25 Q207.784 1795.79 211.395 1795.79 Q215.03 1795.79 216.835 1792.25 Q218.664 1788.68 218.664 1781.58 Q218.664 1774.45 216.835 1770.9 Q215.03 1767.34 211.395 1767.34 M211.395 1763.64 Q217.205 1763.64 220.261 1768.24 Q223.34 1772.83 223.34 1781.58 Q223.34 1790.3 220.261 1794.91 Q217.205 1799.49 211.395 1799.49 Q205.585 1799.49 202.506 1794.91 Q199.451 1790.3 199.451 1781.58 Q199.451 1772.83 202.506 1768.24 Q205.585 1763.64 211.395 1763.64 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M980.789 1794.89 L988.428 1794.89 L988.428 1768.52 L980.118 1770.19 L980.118 1765.93 L988.381 1764.26 L993.057 1764.26 L993.057 1794.89 L1000.7 1794.89 L1000.7 1798.82 L980.789 1798.82 L980.789 1794.89 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1020.14 1767.34 Q1016.53 1767.34 1014.7 1770.9 Q1012.9 1774.45 1012.9 1781.58 Q1012.9 1788.68 1014.7 1792.25 Q1016.53 1795.79 1020.14 1795.79 Q1023.77 1795.79 1025.58 1792.25 Q1027.41 1788.68 1027.41 1781.58 Q1027.41 1774.45 1025.58 1770.9 Q1023.77 1767.34 1020.14 1767.34 M1020.14 1763.64 Q1025.95 1763.64 1029.01 1768.24 Q1032.08 1772.83 1032.08 1781.58 Q1032.08 1790.3 1029.01 1794.91 Q1025.95 1799.49 1020.14 1799.49 Q1014.33 1799.49 1011.25 1794.91 Q1008.2 1790.3 1008.2 1781.58 Q1008.2 1772.83 1011.25 1768.24 Q1014.33 1763.64 1020.14 1763.64 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1050.3 1767.34 Q1046.69 1767.34 1044.86 1770.9 Q1043.06 1774.45 1043.06 1781.58 Q1043.06 1788.68 1044.86 1792.25 Q1046.69 1795.79 1050.3 1795.79 Q1053.94 1795.79 1055.74 1792.25 Q1057.57 1788.68 1057.57 1781.58 Q1057.57 1774.45 1055.74 1770.9 Q1053.94 1767.34 1050.3 1767.34 M1050.3 1763.64 Q1056.11 1763.64 1059.17 1768.24 Q1062.25 1772.83 1062.25 1781.58 Q1062.25 1790.3 1059.17 1794.91 Q1056.11 1799.49 1050.3 1799.49 Q1044.49 1799.49 1041.41 1794.91 Q1038.36 1790.3 1038.36 1781.58 Q1038.36 1772.83 1041.41 1768.24 Q1044.49 1763.64 1050.3 1763.64 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1794.66 1794.89 L1810.98 1794.89 L1810.98 1798.82 L1789.04 1798.82 L1789.04 1794.89 Q1791.7 1792.13 1796.28 1787.5 Q1800.89 1782.85 1802.07 1781.51 Q1804.31 1778.98 1805.19 1777.25 Q1806.1 1775.49 1806.1 1773.8 Q1806.1 1771.04 1804.15 1769.31 Q1802.23 1767.57 1799.13 1767.57 Q1796.93 1767.57 1794.48 1768.34 Q1792.05 1769.1 1789.27 1770.65 L1789.27 1765.93 Q1792.09 1764.79 1794.55 1764.21 Q1797 1763.64 1799.04 1763.64 Q1804.41 1763.64 1807.6 1766.32 Q1810.8 1769.01 1810.8 1773.5 Q1810.8 1775.63 1809.99 1777.55 Q1809.2 1779.45 1807.09 1782.04 Q1806.51 1782.71 1803.41 1785.93 Q1800.31 1789.12 1794.66 1794.89 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1830.8 1767.34 Q1827.18 1767.34 1825.36 1770.9 Q1823.55 1774.45 1823.55 1781.58 Q1823.55 1788.68 1825.36 1792.25 Q1827.18 1795.79 1830.8 1795.79 Q1834.43 1795.79 1836.24 1792.25 Q1838.06 1788.68 1838.06 1781.58 Q1838.06 1774.45 1836.24 1770.9 Q1834.43 1767.34 1830.8 1767.34 M1830.8 1763.64 Q1836.61 1763.64 1839.66 1768.24 Q1842.74 1772.83 1842.74 1781.58 Q1842.74 1790.3 1839.66 1794.91 Q1836.61 1799.49 1830.8 1799.49 Q1824.99 1799.49 1821.91 1794.91 Q1818.85 1790.3 1818.85 1781.58 Q1818.85 1772.83 1821.91 1768.24 Q1824.99 1763.64 1830.8 1763.64 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1860.96 1767.34 Q1857.35 1767.34 1855.52 1770.9 Q1853.71 1774.45 1853.71 1781.58 Q1853.71 1788.68 1855.52 1792.25 Q1857.35 1795.79 1860.96 1795.79 Q1864.59 1795.79 1866.4 1792.25 Q1868.23 1788.68 1868.23 1781.58 Q1868.23 1774.45 1866.4 1770.9 Q1864.59 1767.34 1860.96 1767.34 M1860.96 1763.64 Q1866.77 1763.64 1869.82 1768.24 Q1872.9 1772.83 1872.9 1781.58 Q1872.9 1790.3 1869.82 1794.91 Q1866.77 1799.49 1860.96 1799.49 Q1855.15 1799.49 1852.07 1794.91 Q1849.01 1790.3 1849.01 1781.58 Q1849.01 1772.83 1852.07 1768.24 Q1855.15 1763.64 1860.96 1763.64 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M2614.52 1780.19 Q2617.87 1780.9 2619.75 1783.17 Q2621.65 1785.44 2621.65 1788.77 Q2621.65 1793.89 2618.13 1796.69 Q2614.61 1799.49 2608.13 1799.49 Q2605.95 1799.49 2603.64 1799.05 Q2601.35 1798.64 2598.89 1797.78 L2598.89 1793.27 Q2600.84 1794.4 2603.15 1794.98 Q2605.47 1795.56 2607.99 1795.56 Q2612.39 1795.56 2614.68 1793.82 Q2616.99 1792.08 2616.99 1788.77 Q2616.99 1785.72 2614.84 1784.01 Q2612.71 1782.27 2608.89 1782.27 L2604.86 1782.27 L2604.86 1778.43 L2609.08 1778.43 Q2612.53 1778.43 2614.36 1777.06 Q2616.18 1775.67 2616.18 1773.08 Q2616.18 1770.42 2614.29 1769.01 Q2612.41 1767.57 2608.89 1767.57 Q2606.97 1767.57 2604.77 1767.99 Q2602.57 1768.4 2599.93 1769.28 L2599.93 1765.12 Q2602.6 1764.38 2604.91 1764.01 Q2607.25 1763.64 2609.31 1763.64 Q2614.63 1763.64 2617.74 1766.07 Q2620.84 1768.47 2620.84 1772.59 Q2620.84 1775.46 2619.19 1777.46 Q2617.55 1779.42 2614.52 1780.19 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M2640.51 1767.34 Q2636.9 1767.34 2635.07 1770.9 Q2633.27 1774.45 2633.27 1781.58 Q2633.27 1788.68 2635.07 1792.25 Q2636.9 1795.79 2640.51 1795.79 Q2644.15 1795.79 2645.95 1792.25 Q2647.78 1788.68 2647.78 1781.58 Q2647.78 1774.45 2645.95 1770.9 Q2644.15 1767.34 2640.51 1767.34 M2640.51 1763.64 Q2646.32 1763.64 2649.38 1768.24 Q2652.46 1772.83 2652.46 1781.58 Q2652.46 1790.3 2649.38 1794.91 Q2646.32 1799.49 2640.51 1799.49 Q2634.7 1799.49 2631.62 1794.91 Q2628.57 1790.3 2628.57 1781.58 Q2628.57 1772.83 2631.62 1768.24 Q2634.7 1763.64 2640.51 1763.64 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M2670.67 1767.34 Q2667.06 1767.34 2665.23 1770.9 Q2663.43 1774.45 2663.43 1781.58 Q2663.43 1788.68 2665.23 1792.25 Q2667.06 1795.79 2670.67 1795.79 Q2674.31 1795.79 2676.11 1792.25 Q2677.94 1788.68 2677.94 1781.58 Q2677.94 1774.45 2676.11 1770.9 Q2674.31 1767.34 2670.67 1767.34 M2670.67 1763.64 Q2676.48 1763.64 2679.54 1768.24 Q2682.62 1772.83 2682.62 1781.58 Q2682.62 1790.3 2679.54 1794.91 Q2676.48 1799.49 2670.67 1799.49 Q2664.86 1799.49 2661.79 1794.91 Q2658.73 1790.3 2658.73 1781.58 Q2658.73 1772.83 2661.79 1768.24 Q2664.86 1763.64 2670.67 1763.64 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1313.5 1835.78 L1353.7 1835.78 L1353.7 1841.19 L1336.83 1841.19 L1336.83 1883.3 L1330.37 1883.3 L1330.37 1841.19 L1313.5 1841.19 L1313.5 1835.78 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1357.64 1847.65 L1363.5 1847.65 L1363.5 1883.3 L1357.64 1883.3 L1357.64 1847.65 M1357.64 1833.78 L1363.5 1833.78 L1363.5 1841.19 L1357.64 1841.19 L1357.64 1833.78 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1403.51 1854.5 Q1405.71 1850.55 1408.76 1848.67 Q1411.82 1846.79 1415.95 1846.79 Q1421.52 1846.79 1424.55 1850.71 Q1427.57 1854.59 1427.57 1861.78 L1427.57 1883.3 L1421.68 1883.3 L1421.68 1861.98 Q1421.68 1856.85 1419.87 1854.37 Q1418.05 1851.89 1414.33 1851.89 Q1409.78 1851.89 1407.14 1854.91 Q1404.5 1857.93 1404.5 1863.15 L1404.5 1883.3 L1398.61 1883.3 L1398.61 1861.98 Q1398.61 1856.82 1396.79 1854.37 Q1394.98 1851.89 1391.19 1851.89 Q1386.7 1851.89 1384.06 1854.94 Q1381.42 1857.97 1381.42 1863.15 L1381.42 1883.3 L1375.53 1883.3 L1375.53 1847.65 L1381.42 1847.65 L1381.42 1853.19 Q1383.43 1849.91 1386.23 1848.35 Q1389.03 1846.79 1392.88 1846.79 Q1396.76 1846.79 1399.47 1848.77 Q1402.2 1850.74 1403.51 1854.5 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1469.74 1864.01 L1469.74 1866.88 L1442.82 1866.88 Q1443.2 1872.92 1446.45 1876.11 Q1449.72 1879.26 1455.55 1879.26 Q1458.92 1879.26 1462.07 1878.43 Q1465.26 1877.6 1468.38 1875.95 L1468.38 1881.49 Q1465.22 1882.82 1461.91 1883.52 Q1458.6 1884.22 1455.2 1884.22 Q1446.67 1884.22 1441.67 1879.26 Q1436.71 1874.29 1436.71 1865.83 Q1436.71 1857.07 1441.42 1851.95 Q1446.16 1846.79 1454.18 1846.79 Q1461.37 1846.79 1465.54 1851.44 Q1469.74 1856.06 1469.74 1864.01 M1463.89 1862.29 Q1463.82 1857.49 1461.18 1854.62 Q1458.57 1851.76 1454.24 1851.76 Q1449.34 1851.76 1446.38 1854.53 Q1443.45 1857.3 1443.01 1862.33 L1463.89 1862.29 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1480.85 1875.22 L1487.57 1875.22 L1487.57 1880.69 L1482.35 1890.88 L1478.24 1890.88 L1480.85 1880.69 L1480.85 1875.22 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1526.59 1837.53 L1526.59 1847.65 L1538.65 1847.65 L1538.65 1852.2 L1526.59 1852.2 L1526.59 1871.56 Q1526.59 1875.92 1527.77 1877.16 Q1528.98 1878.4 1532.64 1878.4 L1538.65 1878.4 L1538.65 1883.3 L1532.64 1883.3 Q1525.86 1883.3 1523.28 1880.79 Q1520.7 1878.24 1520.7 1871.56 L1520.7 1852.2 L1516.4 1852.2 L1516.4 1847.65 L1520.7 1847.65 L1520.7 1837.53 L1526.59 1837.53 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="211.395,1734.12 211.395,127.792 "></polyline>
<polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="211.395,1688.65 230.293,1688.65 "></polyline>
<polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="211.395,1436.09 230.293,1436.09 "></polyline>
<polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="211.395,1183.52 230.293,1183.52 "></polyline>
<polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="211.395,930.954 230.293,930.954 "></polyline>
<polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="211.395,678.387 230.293,678.387 "></polyline>
<polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="211.395,425.821 230.293,425.821 "></polyline>
<polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="211.395,173.254 230.293,173.254 "></polyline>
<path clip-path="url(#clip620)" d="M122.997 1702 L139.316 1702 L139.316 1705.93 L117.372 1705.93 L117.372 1702 Q120.034 1699.24 124.617 1694.61 Q129.224 1689.96 130.404 1688.62 Q132.65 1686.1 133.529 1684.36 Q134.432 1682.6 134.432 1680.91 Q134.432 1678.16 132.488 1676.42 Q130.566 1674.68 127.464 1674.68 Q125.265 1674.68 122.812 1675.45 Q120.381 1676.21 117.603 1677.76 L117.603 1673.04 Q120.427 1671.91 122.881 1671.33 Q125.335 1670.75 127.372 1670.75 Q132.742 1670.75 135.937 1673.43 Q139.131 1676.12 139.131 1680.61 Q139.131 1682.74 138.321 1684.66 Q137.534 1686.56 135.427 1689.15 Q134.849 1689.82 131.747 1693.04 Q128.645 1696.23 122.997 1702 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M159.131 1674.45 Q155.52 1674.45 153.691 1678.02 Q151.886 1681.56 151.886 1688.69 Q151.886 1695.79 153.691 1699.36 Q155.52 1702.9 159.131 1702.9 Q162.765 1702.9 164.571 1699.36 Q166.399 1695.79 166.399 1688.69 Q166.399 1681.56 164.571 1678.02 Q162.765 1674.45 159.131 1674.45 M159.131 1670.75 Q164.941 1670.75 167.997 1675.36 Q171.075 1679.94 171.075 1688.69 Q171.075 1697.42 167.997 1702.02 Q164.941 1706.61 159.131 1706.61 Q153.321 1706.61 150.242 1702.02 Q147.186 1697.42 147.186 1688.69 Q147.186 1679.94 150.242 1675.36 Q153.321 1670.75 159.131 1670.75 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M133.136 1434.73 Q136.492 1435.45 138.367 1437.72 Q140.265 1439.99 140.265 1443.32 Q140.265 1448.44 136.747 1451.24 Q133.228 1454.04 126.747 1454.04 Q124.571 1454.04 122.256 1453.6 Q119.964 1453.18 117.511 1452.33 L117.511 1447.81 Q119.455 1448.95 121.77 1449.52 Q124.085 1450.1 126.608 1450.1 Q131.006 1450.1 133.298 1448.37 Q135.612 1446.63 135.612 1443.32 Q135.612 1440.27 133.46 1438.55 Q131.33 1436.82 127.511 1436.82 L123.483 1436.82 L123.483 1432.97 L127.696 1432.97 Q131.145 1432.97 132.974 1431.61 Q134.802 1430.22 134.802 1427.63 Q134.802 1424.96 132.904 1423.55 Q131.029 1422.12 127.511 1422.12 Q125.589 1422.12 123.39 1422.53 Q121.191 1422.95 118.552 1423.83 L118.552 1419.66 Q121.214 1418.92 123.529 1418.55 Q125.867 1418.18 127.927 1418.18 Q133.251 1418.18 136.353 1420.61 Q139.455 1423.02 139.455 1427.14 Q139.455 1430.01 137.812 1432 Q136.168 1433.97 133.136 1434.73 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M159.131 1421.89 Q155.52 1421.89 153.691 1425.45 Q151.886 1428.99 151.886 1436.12 Q151.886 1443.23 153.691 1446.79 Q155.52 1450.33 159.131 1450.33 Q162.765 1450.33 164.571 1446.79 Q166.399 1443.23 166.399 1436.12 Q166.399 1428.99 164.571 1425.45 Q162.765 1421.89 159.131 1421.89 M159.131 1418.18 Q164.941 1418.18 167.997 1422.79 Q171.075 1427.37 171.075 1436.12 Q171.075 1444.85 167.997 1449.46 Q164.941 1454.04 159.131 1454.04 Q153.321 1454.04 150.242 1449.46 Q147.186 1444.85 147.186 1436.12 Q147.186 1427.37 150.242 1422.79 Q153.321 1418.18 159.131 1418.18 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M131.816 1170.31 L120.011 1188.76 L131.816 1188.76 L131.816 1170.31 M130.589 1166.24 L136.469 1166.24 L136.469 1188.76 L141.399 1188.76 L141.399 1192.65 L136.469 1192.65 L136.469 1200.8 L131.816 1200.8 L131.816 1192.65 L116.214 1192.65 L116.214 1188.14 L130.589 1166.24 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M159.131 1169.32 Q155.52 1169.32 153.691 1172.88 Q151.886 1176.43 151.886 1183.56 Q151.886 1190.66 153.691 1194.23 Q155.52 1197.77 159.131 1197.77 Q162.765 1197.77 164.571 1194.23 Q166.399 1190.66 166.399 1183.56 Q166.399 1176.43 164.571 1172.88 Q162.765 1169.32 159.131 1169.32 M159.131 1165.62 Q164.941 1165.62 167.997 1170.22 Q171.075 1174.81 171.075 1183.56 Q171.075 1192.28 167.997 1196.89 Q164.941 1201.47 159.131 1201.47 Q153.321 1201.47 150.242 1196.89 Q147.186 1192.28 147.186 1183.56 Q147.186 1174.81 150.242 1170.22 Q153.321 1165.62 159.131 1165.62 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M119.015 913.674 L137.372 913.674 L137.372 917.609 L123.298 917.609 L123.298 926.081 Q124.316 925.734 125.335 925.572 Q126.353 925.387 127.372 925.387 Q133.159 925.387 136.538 928.558 Q139.918 931.729 139.918 937.146 Q139.918 942.725 136.446 945.827 Q132.974 948.905 126.654 948.905 Q124.478 948.905 122.21 948.535 Q119.964 948.165 117.557 947.424 L117.557 942.725 Q119.64 943.859 121.863 944.415 Q124.085 944.97 126.562 944.97 Q130.566 944.97 132.904 942.864 Q135.242 940.757 135.242 937.146 Q135.242 933.535 132.904 931.429 Q130.566 929.322 126.562 929.322 Q124.687 929.322 122.812 929.739 Q120.96 930.155 119.015 931.035 L119.015 913.674 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M159.131 916.753 Q155.52 916.753 153.691 920.317 Q151.886 923.859 151.886 930.989 Q151.886 938.095 153.691 941.66 Q155.52 945.202 159.131 945.202 Q162.765 945.202 164.571 941.66 Q166.399 938.095 166.399 930.989 Q166.399 923.859 164.571 920.317 Q162.765 916.753 159.131 916.753 M159.131 913.049 Q164.941 913.049 167.997 917.655 Q171.075 922.239 171.075 930.989 Q171.075 939.715 167.997 944.322 Q164.941 948.905 159.131 948.905 Q153.321 948.905 150.242 944.322 Q147.186 939.715 147.186 930.989 Q147.186 922.239 150.242 917.655 Q153.321 913.049 159.131 913.049 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M129.548 676.524 Q126.4 676.524 124.548 678.677 Q122.719 680.829 122.719 684.579 Q122.719 688.306 124.548 690.482 Q126.4 692.635 129.548 692.635 Q132.696 692.635 134.525 690.482 Q136.376 688.306 136.376 684.579 Q136.376 680.829 134.525 678.677 Q132.696 676.524 129.548 676.524 M138.83 661.871 L138.83 666.13 Q137.071 665.297 135.265 664.857 Q133.483 664.418 131.724 664.418 Q127.094 664.418 124.64 667.543 Q122.21 670.667 121.863 676.987 Q123.228 674.973 125.288 673.908 Q127.349 672.82 129.825 672.82 Q135.034 672.82 138.043 675.992 Q141.075 679.14 141.075 684.579 Q141.075 689.904 137.927 693.121 Q134.779 696.339 129.548 696.339 Q123.552 696.339 120.381 691.755 Q117.21 687.149 117.21 678.422 Q117.21 670.228 121.099 665.367 Q124.988 660.482 131.538 660.482 Q133.298 660.482 135.08 660.83 Q136.886 661.177 138.83 661.871 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M159.131 664.186 Q155.52 664.186 153.691 667.751 Q151.886 671.292 151.886 678.422 Q151.886 685.529 153.691 689.093 Q155.52 692.635 159.131 692.635 Q162.765 692.635 164.571 689.093 Q166.399 685.529 166.399 678.422 Q166.399 671.292 164.571 667.751 Q162.765 664.186 159.131 664.186 M159.131 660.482 Q164.941 660.482 167.997 665.089 Q171.075 669.672 171.075 678.422 Q171.075 687.149 167.997 691.755 Q164.941 696.339 159.131 696.339 Q153.321 696.339 150.242 691.755 Q147.186 687.149 147.186 678.422 Q147.186 669.672 150.242 665.089 Q153.321 660.482 159.131 660.482 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M117.789 408.541 L140.011 408.541 L140.011 410.531 L127.464 443.101 L122.58 443.101 L134.386 412.476 L117.789 412.476 L117.789 408.541 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M159.131 411.619 Q155.52 411.619 153.691 415.184 Q151.886 418.726 151.886 425.855 Q151.886 432.962 153.691 436.527 Q155.52 440.068 159.131 440.068 Q162.765 440.068 164.571 436.527 Q166.399 432.962 166.399 425.855 Q166.399 418.726 164.571 415.184 Q162.765 411.619 159.131 411.619 M159.131 407.916 Q164.941 407.916 167.997 412.522 Q171.075 417.106 171.075 425.855 Q171.075 434.582 167.997 439.189 Q164.941 443.772 159.131 443.772 Q153.321 443.772 150.242 439.189 Q147.186 434.582 147.186 425.855 Q147.186 417.106 150.242 412.522 Q153.321 407.916 159.131 407.916 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M128.969 174.122 Q125.636 174.122 123.714 175.905 Q121.816 177.687 121.816 180.812 Q121.816 183.937 123.714 185.719 Q125.636 187.502 128.969 187.502 Q132.302 187.502 134.224 185.719 Q136.145 183.914 136.145 180.812 Q136.145 177.687 134.224 175.905 Q132.325 174.122 128.969 174.122 M124.293 172.131 Q121.284 171.391 119.594 169.331 Q117.927 167.27 117.927 164.307 Q117.927 160.164 120.867 157.757 Q123.83 155.349 128.969 155.349 Q134.131 155.349 137.071 157.757 Q140.011 160.164 140.011 164.307 Q140.011 167.27 138.321 169.331 Q136.654 171.391 133.668 172.131 Q137.048 172.919 138.923 175.21 Q140.821 177.502 140.821 180.812 Q140.821 185.835 137.742 188.52 Q134.687 191.205 128.969 191.205 Q123.251 191.205 120.173 188.52 Q117.117 185.835 117.117 180.812 Q117.117 177.502 119.015 175.21 Q120.913 172.919 124.293 172.131 M122.58 164.747 Q122.58 167.432 124.247 168.937 Q125.937 170.442 128.969 170.442 Q131.978 170.442 133.668 168.937 Q135.381 167.432 135.381 164.747 Q135.381 162.062 133.668 160.557 Q131.978 159.053 128.969 159.053 Q125.937 159.053 124.247 160.557 Q122.58 162.062 122.58 164.747 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M159.131 159.053 Q155.52 159.053 153.691 162.618 Q151.886 166.159 151.886 173.289 Q151.886 180.395 153.691 183.96 Q155.52 187.502 159.131 187.502 Q162.765 187.502 164.571 183.96 Q166.399 180.395 166.399 173.289 Q166.399 166.159 164.571 162.618 Q162.765 159.053 159.131 159.053 M159.131 155.349 Q164.941 155.349 167.997 159.956 Q171.075 164.539 171.075 173.289 Q171.075 182.016 167.997 186.622 Q164.941 191.205 159.131 191.205 Q153.321 191.205 150.242 186.622 Q147.186 182.016 147.186 173.289 Q147.186 164.539 150.242 159.956 Q153.321 155.349 159.131 155.349 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M14.1184 1178.23 L14.1184 1138.03 L19.5293 1138.03 L19.5293 1154.9 L61.6384 1154.9 L61.6384 1161.36 L19.5293 1161.36 L19.5293 1178.23 L14.1184 1178.23 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M42.3504 1112.66 L45.2149 1112.66 L45.2149 1139.59 Q51.2623 1139.21 54.4452 1135.96 Q57.5962 1132.68 57.5962 1126.86 Q57.5962 1123.49 56.7687 1120.33 Q55.9411 1117.15 54.2861 1114.03 L59.8242 1114.03 Q61.161 1117.18 61.8612 1120.49 Q62.5615 1123.8 62.5615 1127.21 Q62.5615 1135.74 57.5962 1140.74 Q52.631 1145.7 44.1646 1145.7 Q35.4117 1145.7 30.2873 1140.99 Q25.1311 1136.25 25.1311 1128.23 Q25.1311 1121.03 29.7781 1116.87 Q34.3932 1112.66 42.3504 1112.66 M40.6316 1118.52 Q35.8255 1118.58 32.9609 1121.23 Q30.0964 1123.84 30.0964 1128.16 Q30.0964 1133.07 32.8654 1136.03 Q35.6345 1138.95 40.6634 1139.4 L40.6316 1118.52 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M32.8336 1075.3 Q28.8869 1073.1 27.009 1070.05 Q25.1311 1066.99 25.1311 1062.85 Q25.1311 1057.28 29.046 1054.26 Q32.9291 1051.23 40.1224 1051.23 L61.6384 1051.23 L61.6384 1057.12 L40.3133 1057.12 Q35.1889 1057.12 32.7063 1058.94 Q30.2237 1060.75 30.2237 1064.48 Q30.2237 1069.03 33.2474 1071.67 Q36.2711 1074.31 41.491 1074.31 L61.6384 1074.31 L61.6384 1080.2 L40.3133 1080.2 Q35.1571 1080.2 32.7063 1082.01 Q30.2237 1083.83 30.2237 1087.61 Q30.2237 1092.1 33.2792 1094.74 Q36.3029 1097.39 41.491 1097.39 L61.6384 1097.39 L61.6384 1103.27 L25.9905 1103.27 L25.9905 1097.39 L31.5287 1097.39 Q28.2503 1095.38 26.6907 1092.58 Q25.1311 1089.78 25.1311 1085.93 Q25.1311 1082.04 27.1045 1079.34 Q29.0779 1076.6 32.8336 1075.3 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M56.2912 1033.89 L75.1974 1033.89 L75.1974 1039.78 L25.9905 1039.78 L25.9905 1033.89 L31.4013 1033.89 Q28.2185 1032.04 26.6907 1029.24 Q25.1311 1026.41 25.1311 1022.49 Q25.1311 1016 30.2873 1011.96 Q35.4436 1007.88 43.8463 1007.88 Q52.249 1007.88 57.4052 1011.96 Q62.5615 1016 62.5615 1022.49 Q62.5615 1026.41 61.0337 1029.24 Q59.4741 1032.04 56.2912 1033.89 M43.8463 1013.96 Q37.3851 1013.96 33.7248 1016.64 Q30.0327 1019.28 30.0327 1023.93 Q30.0327 1028.57 33.7248 1031.25 Q37.3851 1033.89 43.8463 1033.89 Q50.3075 1033.89 53.9996 1031.25 Q57.6599 1028.57 57.6599 1023.93 Q57.6599 1019.28 53.9996 1016.64 Q50.3075 1013.96 43.8463 1013.96 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M42.3504 967.685 L45.2149 967.685 L45.2149 994.612 Q51.2623 994.23 54.4452 990.983 Q57.5962 987.705 57.5962 981.88 Q57.5962 978.506 56.7687 975.355 Q55.9411 972.173 54.2861 969.053 L59.8242 969.053 Q61.161 972.204 61.8612 975.515 Q62.5615 978.825 62.5615 982.23 Q62.5615 990.76 57.5962 995.757 Q52.631 1000.72 44.1646 1000.72 Q35.4117 1000.72 30.2873 996.012 Q25.1311 991.27 25.1311 983.249 Q25.1311 976.056 29.7781 971.886 Q34.3932 967.685 42.3504 967.685 M40.6316 973.541 Q35.8255 973.605 32.9609 976.247 Q30.0964 978.856 30.0964 983.185 Q30.0964 988.087 32.8654 991.047 Q35.6345 993.975 40.6634 994.421 L40.6316 973.541 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M31.465 937.416 Q30.8921 938.402 30.6375 939.58 Q30.351 940.726 30.351 942.126 Q30.351 947.092 33.5975 949.765 Q36.8122 952.407 42.8596 952.407 L61.6384 952.407 L61.6384 958.295 L25.9905 958.295 L25.9905 952.407 L31.5287 952.407 Q28.2821 950.561 26.7225 947.601 Q25.1311 944.641 25.1311 940.408 Q25.1311 939.803 25.2266 939.071 Q25.2903 938.339 25.4494 937.448 L31.465 937.416 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M43.719 915.072 Q43.719 922.17 45.3422 924.907 Q46.9655 927.644 50.8804 927.644 Q53.9996 927.644 55.8457 925.607 Q57.6599 923.539 57.6599 920.006 Q57.6599 915.136 54.2224 912.208 Q50.7531 909.247 45.0239 909.247 L43.719 909.247 L43.719 915.072 M41.3 903.391 L61.6384 903.391 L61.6384 909.247 L56.2276 909.247 Q59.4741 911.253 61.0337 914.245 Q62.5615 917.236 62.5615 921.565 Q62.5615 927.04 59.5059 930.286 Q56.4186 933.501 51.2623 933.501 Q45.2467 933.501 42.1912 929.49 Q39.1357 925.448 39.1357 917.459 L39.1357 909.247 L38.5628 909.247 Q34.5205 909.247 32.3244 911.921 Q30.0964 914.563 30.0964 919.369 Q30.0964 922.425 30.8284 925.321 Q31.5605 928.217 33.0246 930.891 L27.6137 930.891 Q26.3724 927.676 25.7677 924.653 Q25.1311 921.629 25.1311 918.764 Q25.1311 911.03 29.1415 907.21 Q33.1519 903.391 41.3 903.391 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M15.869 885.535 L25.9905 885.535 L25.9905 873.472 L30.542 873.472 L30.542 885.535 L49.8937 885.535 Q54.2542 885.535 55.4955 884.358 Q56.7368 883.148 56.7368 879.488 L56.7368 873.472 L61.6384 873.472 L61.6384 879.488 Q61.6384 886.267 59.124 888.845 Q56.5777 891.424 49.8937 891.424 L30.542 891.424 L30.542 895.72 L25.9905 895.72 L25.9905 891.424 L15.869 891.424 L15.869 885.535 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M47.5702 866.374 L25.9905 866.374 L25.9905 860.518 L47.3474 860.518 Q52.4082 860.518 54.9545 858.545 Q57.4689 856.571 57.4689 852.625 Q57.4689 847.882 54.4452 845.145 Q51.4215 842.376 46.2016 842.376 L25.9905 842.376 L25.9905 836.519 L61.6384 836.519 L61.6384 842.376 L56.1639 842.376 Q59.4104 844.508 61.0019 847.341 Q62.5615 850.142 62.5615 853.866 Q62.5615 860.009 58.742 863.192 Q54.9226 866.374 47.5702 866.374 M25.1311 851.638 L25.1311 851.638 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M31.465 803.8 Q30.8921 804.786 30.6375 805.964 Q30.351 807.11 30.351 808.51 Q30.351 813.475 33.5975 816.149 Q36.8122 818.791 42.8596 818.791 L61.6384 818.791 L61.6384 824.679 L25.9905 824.679 L25.9905 818.791 L31.5287 818.791 Q28.2821 816.945 26.7225 813.985 Q25.1311 811.025 25.1311 806.791 Q25.1311 806.187 25.2266 805.455 Q25.2903 804.723 25.4494 803.831 L31.465 803.8 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M42.3504 768.597 L45.2149 768.597 L45.2149 795.524 Q51.2623 795.142 54.4452 791.896 Q57.5962 788.617 57.5962 782.793 Q57.5962 779.419 56.7687 776.268 Q55.9411 773.085 54.2861 769.966 L59.8242 769.966 Q61.161 773.117 61.8612 776.427 Q62.5615 779.737 62.5615 783.143 Q62.5615 791.673 57.5962 796.67 Q52.631 801.635 44.1646 801.635 Q35.4117 801.635 30.2873 796.925 Q25.1311 792.182 25.1311 784.161 Q25.1311 776.968 29.7781 772.799 Q34.3932 768.597 42.3504 768.597 M40.6316 774.454 Q35.8255 774.517 32.9609 777.159 Q30.0964 779.769 30.0964 784.098 Q30.0964 788.999 32.8654 791.959 Q35.6345 794.888 40.6634 795.333 L40.6316 774.454 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M53.554 757.489 L53.554 750.773 L59.0285 750.773 L69.2136 755.993 L69.2136 760.099 L59.0285 757.489 L53.554 757.489 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M14.1184 723.878 L14.1184 683.679 L19.5293 683.679 L19.5293 700.548 L61.6384 700.548 L61.6384 707.009 L19.5293 707.009 L19.5293 723.878 L14.1184 723.878 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M978.167 12.096 L1029.33 12.096 L1029.33 18.9825 L1007.86 18.9825 L1007.86 72.576 L999.637 72.576 L999.637 18.9825 L978.167 18.9825 L978.167 12.096 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1061.62 48.0275 L1061.62 51.6733 L1027.35 51.6733 Q1027.83 59.3701 1031.96 63.421 Q1036.14 67.4314 1043.55 67.4314 Q1047.84 67.4314 1051.85 66.3781 Q1055.9 65.3249 1059.87 63.2184 L1059.87 70.267 Q1055.86 71.9684 1051.65 72.8596 Q1047.44 73.7508 1043.1 73.7508 Q1032.25 73.7508 1025.89 67.4314 Q1019.57 61.1119 1019.57 50.3365 Q1019.57 39.1965 1025.56 32.6746 Q1031.6 26.1121 1041.81 26.1121 Q1050.96 26.1121 1056.27 32.0264 Q1061.62 37.9003 1061.62 48.0275 M1054.16 45.84 Q1054.08 39.7232 1050.72 36.0774 Q1047.4 32.4315 1041.89 32.4315 Q1035.65 32.4315 1031.88 35.9558 Q1028.16 39.4801 1027.59 45.8805 L1054.16 45.84 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1109.17 35.9153 Q1111.97 30.8922 1115.86 28.5022 Q1119.75 26.1121 1125.01 26.1121 Q1132.1 26.1121 1135.95 31.0947 Q1139.8 36.0368 1139.8 45.1919 L1139.8 72.576 L1132.3 72.576 L1132.3 45.4349 Q1132.3 38.913 1129.99 35.7533 Q1127.69 32.5936 1122.95 32.5936 Q1117.15 32.5936 1113.79 36.4419 Q1110.43 40.2903 1110.43 46.9338 L1110.43 72.576 L1102.93 72.576 L1102.93 45.4349 Q1102.93 38.8725 1100.63 35.7533 Q1098.32 32.5936 1093.5 32.5936 Q1087.78 32.5936 1084.42 36.4824 Q1081.06 40.3308 1081.06 46.9338 L1081.06 72.576 L1073.57 72.576 L1073.57 27.2059 L1081.06 27.2059 L1081.06 34.2544 Q1083.61 30.082 1087.18 28.0971 Q1090.74 26.1121 1095.64 26.1121 Q1100.59 26.1121 1104.03 28.6237 Q1107.51 31.1352 1109.17 35.9153 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1161.88 65.7705 L1161.88 89.8329 L1154.38 89.8329 L1154.38 27.2059 L1161.88 27.2059 L1161.88 34.0924 Q1164.23 30.0415 1167.79 28.0971 Q1171.4 26.1121 1176.38 26.1121 Q1184.64 26.1121 1189.79 32.6746 Q1194.97 39.2371 1194.97 49.9314 Q1194.97 60.6258 1189.79 67.1883 Q1184.64 73.7508 1176.38 73.7508 Q1171.4 73.7508 1167.79 71.8063 Q1164.23 69.8214 1161.88 65.7705 M1187.23 49.9314 Q1187.23 41.7081 1183.83 37.0496 Q1180.47 32.3505 1174.55 32.3505 Q1168.64 32.3505 1165.24 37.0496 Q1161.88 41.7081 1161.88 49.9314 Q1161.88 58.1548 1165.24 62.8538 Q1168.64 67.5124 1174.55 67.5124 Q1180.47 67.5124 1183.83 62.8538 Q1187.23 58.1548 1187.23 49.9314 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1246.13 48.0275 L1246.13 51.6733 L1211.86 51.6733 Q1212.35 59.3701 1216.48 63.421 Q1220.65 67.4314 1228.07 67.4314 Q1232.36 67.4314 1236.37 66.3781 Q1240.42 65.3249 1244.39 63.2184 L1244.39 70.267 Q1240.38 71.9684 1236.17 72.8596 Q1231.96 73.7508 1227.62 73.7508 Q1216.77 73.7508 1210.41 67.4314 Q1204.09 61.1119 1204.09 50.3365 Q1204.09 39.1965 1210.08 32.6746 Q1216.12 26.1121 1226.33 26.1121 Q1235.48 26.1121 1240.79 32.0264 Q1246.13 37.9003 1246.13 48.0275 M1238.68 45.84 Q1238.6 39.7232 1235.24 36.0774 Q1231.92 32.4315 1226.41 32.4315 Q1220.17 32.4315 1216.4 35.9558 Q1212.67 39.4801 1212.11 45.8805 L1238.68 45.84 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1284.66 34.1734 Q1283.4 33.4443 1281.9 33.1202 Q1280.45 32.7556 1278.66 32.7556 Q1272.34 32.7556 1268.94 36.8875 Q1265.58 40.9789 1265.58 48.6757 L1265.58 72.576 L1258.08 72.576 L1258.08 27.2059 L1265.58 27.2059 L1265.58 34.2544 Q1267.93 30.1225 1271.7 28.1376 Q1275.46 26.1121 1280.85 26.1121 Q1281.62 26.1121 1282.55 26.2337 Q1283.48 26.3147 1284.62 26.5172 L1284.66 34.1734 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1313.1 49.7694 Q1304.06 49.7694 1300.58 51.8354 Q1297.09 53.9013 1297.09 58.8839 Q1297.09 62.8538 1299.69 65.2034 Q1302.32 67.5124 1306.82 67.5124 Q1313.01 67.5124 1316.74 63.1374 Q1320.51 58.7219 1320.51 51.4303 L1320.51 49.7694 L1313.1 49.7694 M1327.96 46.6907 L1327.96 72.576 L1320.51 72.576 L1320.51 65.6895 Q1317.96 69.8214 1314.15 71.8063 Q1310.34 73.7508 1304.83 73.7508 Q1297.86 73.7508 1293.73 69.8619 Q1289.64 65.9325 1289.64 59.3701 Q1289.64 51.7138 1294.75 47.825 Q1299.89 43.9361 1310.06 43.9361 L1320.51 43.9361 L1320.51 43.2069 Q1320.51 38.0623 1317.11 35.2672 Q1313.74 32.4315 1307.63 32.4315 Q1303.74 32.4315 1300.05 33.3632 Q1296.37 34.295 1292.96 36.1584 L1292.96 29.2718 Q1297.05 27.692 1300.9 26.9223 Q1304.75 26.1121 1308.4 26.1121 Q1318.24 26.1121 1323.1 31.2163 Q1327.96 36.3204 1327.96 46.6907 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1350.69 14.324 L1350.69 27.2059 L1366.04 27.2059 L1366.04 32.9987 L1350.69 32.9987 L1350.69 57.6282 Q1350.69 63.1779 1352.19 64.7578 Q1353.73 66.3376 1358.38 66.3376 L1366.04 66.3376 L1366.04 72.576 L1358.38 72.576 Q1349.76 72.576 1346.48 69.3758 Q1343.19 66.1351 1343.19 57.6282 L1343.19 32.9987 L1337.73 32.9987 L1337.73 27.2059 L1343.19 27.2059 L1343.19 14.324 L1350.69 14.324 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1375.07 54.671 L1375.07 27.2059 L1382.53 27.2059 L1382.53 54.3874 Q1382.53 60.8284 1385.04 64.0691 Q1387.55 67.2693 1392.57 67.2693 Q1398.61 67.2693 1402.09 63.421 Q1405.62 59.5726 1405.62 52.9291 L1405.62 27.2059 L1413.07 27.2059 L1413.07 72.576 L1405.62 72.576 L1405.62 65.6084 Q1402.9 69.7404 1399.3 71.7658 Q1395.73 73.7508 1390.99 73.7508 Q1383.18 73.7508 1379.13 68.8897 Q1375.07 64.0286 1375.07 54.671 M1393.83 26.1121 L1393.83 26.1121 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1454.72 34.1734 Q1453.46 33.4443 1451.96 33.1202 Q1450.5 32.7556 1448.72 32.7556 Q1442.4 32.7556 1439 36.8875 Q1435.64 40.9789 1435.64 48.6757 L1435.64 72.576 L1428.14 72.576 L1428.14 27.2059 L1435.64 27.2059 L1435.64 34.2544 Q1437.99 30.1225 1441.75 28.1376 Q1445.52 26.1121 1450.91 26.1121 Q1451.68 26.1121 1452.61 26.2337 Q1453.54 26.3147 1454.67 26.5172 L1454.72 34.1734 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1499.52 48.0275 L1499.52 51.6733 L1465.25 51.6733 Q1465.73 59.3701 1469.87 63.421 Q1474.04 67.4314 1481.45 67.4314 Q1485.75 67.4314 1489.76 66.3781 Q1493.81 65.3249 1497.78 63.2184 L1497.78 70.267 Q1493.77 71.9684 1489.55 72.8596 Q1485.34 73.7508 1481.01 73.7508 Q1470.15 73.7508 1463.79 67.4314 Q1457.47 61.1119 1457.47 50.3365 Q1457.47 39.1965 1463.47 32.6746 Q1469.5 26.1121 1479.71 26.1121 Q1488.86 26.1121 1494.17 32.0264 Q1499.52 37.9003 1499.52 48.0275 M1492.06 45.84 Q1491.98 39.7232 1488.62 36.0774 Q1485.3 32.4315 1479.79 32.4315 Q1473.55 32.4315 1469.78 35.9558 Q1466.06 39.4801 1465.49 45.8805 L1492.06 45.84 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1532.78 27.2059 L1540.68 27.2059 L1554.85 65.2844 L1569.03 27.2059 L1576.93 27.2059 L1559.92 72.576 L1549.79 72.576 L1532.78 27.2059 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1616.14 28.5427 L1616.14 35.5912 Q1612.98 33.9709 1609.58 33.1607 Q1606.18 32.3505 1602.53 32.3505 Q1596.98 32.3505 1594.19 34.0519 Q1591.43 35.7533 1591.43 39.156 Q1591.43 41.7486 1593.42 43.2475 Q1595.4 44.7058 1601.4 46.0426 L1603.95 46.6097 Q1611.89 48.3111 1615.21 51.4303 Q1618.57 54.509 1618.57 60.0587 Q1618.57 66.3781 1613.55 70.0644 Q1608.57 73.7508 1599.82 73.7508 Q1596.17 73.7508 1592.2 73.0216 Q1588.27 72.3329 1583.9 70.9151 L1583.9 63.2184 Q1588.03 65.3654 1592.04 66.4591 Q1596.05 67.5124 1599.98 67.5124 Q1605.25 67.5124 1608.08 65.73 Q1610.92 63.9071 1610.92 60.6258 Q1610.92 57.5877 1608.85 55.9673 Q1606.83 54.3469 1599.9 52.8481 L1597.31 52.2405 Q1590.38 50.7821 1587.3 47.7845 Q1584.22 44.7463 1584.22 39.4801 Q1584.22 33.0797 1588.76 29.5959 Q1593.3 26.1121 1601.64 26.1121 Q1605.77 26.1121 1609.42 26.7198 Q1613.07 27.3274 1616.14 28.5427 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1631.5 62.2867 L1640.04 62.2867 L1640.04 72.576 L1631.5 72.576 L1631.5 62.2867 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1675.13 12.096 L1726.29 12.096 L1726.29 18.9825 L1704.82 18.9825 L1704.82 72.576 L1696.59 72.576 L1696.59 18.9825 L1675.13 18.9825 L1675.13 12.096 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1731.31 27.2059 L1738.76 27.2059 L1738.76 72.576 L1731.31 72.576 L1731.31 27.2059 M1731.31 9.54393 L1738.76 9.54393 L1738.76 18.9825 L1731.31 18.9825 L1731.31 9.54393 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1789.68 35.9153 Q1792.48 30.8922 1796.37 28.5022 Q1800.26 26.1121 1805.52 26.1121 Q1812.61 26.1121 1816.46 31.0947 Q1820.31 36.0368 1820.31 45.1919 L1820.31 72.576 L1812.82 72.576 L1812.82 45.4349 Q1812.82 38.913 1810.51 35.7533 Q1808.2 32.5936 1803.46 32.5936 Q1797.67 32.5936 1794.3 36.4419 Q1790.94 40.2903 1790.94 46.9338 L1790.94 72.576 L1783.45 72.576 L1783.45 45.4349 Q1783.45 38.8725 1781.14 35.7533 Q1778.83 32.5936 1774.01 32.5936 Q1768.3 32.5936 1764.93 36.4824 Q1761.57 40.3308 1761.57 46.9338 L1761.57 72.576 L1754.08 72.576 L1754.08 27.2059 L1761.57 27.2059 L1761.57 34.2544 Q1764.12 30.082 1767.69 28.0971 Q1771.25 26.1121 1776.15 26.1121 Q1781.1 26.1121 1784.54 28.6237 Q1788.02 31.1352 1789.68 35.9153 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M1873.98 48.0275 L1873.98 51.6733 L1839.71 51.6733 Q1840.2 59.3701 1844.33 63.421 Q1848.5 67.4314 1855.92 67.4314 Q1860.21 67.4314 1864.22 66.3781 Q1868.27 65.3249 1872.24 63.2184 L1872.24 70.267 Q1868.23 71.9684 1864.02 72.8596 Q1859.81 73.7508 1855.47 73.7508 Q1844.62 73.7508 1838.26 67.4314 Q1831.94 61.1119 1831.94 50.3365 Q1831.94 39.1965 1837.93 32.6746 Q1843.97 26.1121 1854.18 26.1121 Q1863.33 26.1121 1868.64 32.0264 Q1873.98 37.9003 1873.98 48.0275 M1866.53 45.84 Q1866.45 39.7232 1863.09 36.0774 Q1859.77 32.4315 1854.26 32.4315 Q1848.02 32.4315 1844.25 35.9558 Q1840.52 39.4801 1839.96 45.8805 L1866.53 45.84 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><polyline clip-path="url(#clip622)" style="stroke:#009af9; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="211.395,173.254 213.827,200.314 216.259,226.891 218.691,252.993 221.122,278.629 223.554,303.808 225.986,328.536 228.418,352.823 230.85,376.677 233.281,400.105 235.713,423.114 238.145,445.712 240.577,467.907 243.009,489.706 245.44,511.115 247.872,532.142 250.304,552.793 252.736,573.076 255.168,592.996 257.599,612.561 260.031,631.776 262.463,650.649 264.895,669.184 267.326,687.388 269.758,705.268 272.19,722.828 274.622,740.075 277.054,757.013 279.485,773.649 281.917,789.988 284.349,806.035 286.781,821.796 289.213,837.275 291.644,852.478 294.076,867.409 296.508,882.073 298.94,896.476 301.372,910.622 303.803,924.515 306.235,938.16 308.667,951.561 311.099,964.723 313.531,977.65 315.962,990.347 318.394,1002.82 320.826,1015.06 323.258,1027.09 325.69,1038.91 328.121,1050.51 330.553,1061.9 332.985,1073.1 335.417,1084.09 337.848,1094.88 340.28,1105.48 342.712,1115.9 345.144,1126.13 347.576,1136.17 350.007,1146.03 352.439,1155.72 354.871,1165.24 357.303,1174.59 359.735,1183.77 362.166,1192.78 364.598,1201.64 367.03,1210.33 369.462,1218.87 371.894,1227.26 374.325,1235.5 376.757,1243.6 379.189,1251.54 381.621,1259.35 384.053,1267.02 386.484,1274.54 388.916,1281.94 391.348,1289.2 393.78,1296.33 396.211,1303.34 398.643,1310.22 401.075,1316.98 403.507,1323.61 405.939,1330.13 408.37,1336.53 410.802,1342.82 413.234,1349 415.666,1355.06 418.098,1361.02 420.529,1366.87 422.961,1372.61 425.393,1378.26 427.825,1383.8 430.257,1389.24 432.688,1394.59 435.12,1399.84 437.552,1405 439.984,1410.07 442.416,1415.04 444.847,1419.93 447.279,1424.73 449.711,1429.44 452.143,1434.07 454.575,1438.62 457.006,1443.08 459.438,1447.47 461.87,1451.77 464.302,1456 466.733,1460.16 469.165,1464.24 471.597,1468.24 474.029,1472.18 476.461,1476.04 478.892,1479.84 481.324,1483.57 483.756,1487.23 486.188,1490.83 488.62,1494.36 491.051,1497.83 493.483,1501.23 495.915,1504.58 498.347,1507.87 500.779,1511.1 503.21,1514.27 505.642,1517.38 508.074,1520.44 510.506,1523.44 512.938,1526.39 515.369,1529.29 517.801,1532.14 520.233,1534.93 522.665,1537.68 525.096,1540.38 527.528,1543.02 529.96,1545.63 532.392,1548.18 534.824,1550.69 537.255,1553.15 539.687,1555.57 542.119,1557.95 544.551,1560.28 546.983,1562.57 549.414,1564.83 551.846,1567.04 554.278,1569.21 556.71,1571.34 559.142,1573.43 561.573,1575.49 564.005,1577.51 566.437,1579.5 568.869,1581.44 571.301,1583.36 573.732,1585.24 576.164,1587.08 578.596,1588.9 581.028,1590.68 583.46,1592.43 585.891,1594.15 588.323,1595.83 590.755,1597.49 593.187,1599.12 595.618,1600.72 598.05,1602.29 600.482,1603.83 602.914,1605.35 605.346,1606.84 607.777,1608.3 610.209,1609.73 612.641,1611.14 615.073,1612.53 617.505,1613.89 619.936,1615.22 622.368,1616.53 624.8,1617.82 627.232,1619.09 629.664,1620.33 632.095,1621.55 634.527,1622.75 636.959,1623.92 639.391,1625.08 641.823,1626.22 644.254,1627.33 646.686,1628.42 649.118,1629.5 651.55,1630.56 653.981,1631.59 656.413,1632.61 658.845,1633.61 661.277,1634.59 663.709,1635.56 666.14,1636.51 668.572,1637.44 671.004,1638.35 673.436,1639.25 675.868,1640.13 678.299,1641 680.731,1641.85 683.163,1642.68 685.595,1643.5 688.027,1644.31 690.458,1645.1 692.89,1645.88 695.322,1646.64 697.754,1647.39 700.186,1648.13 702.617,1648.86 705.049,1649.57 707.481,1650.27 709.913,1650.95 712.345,1651.63 714.776,1652.29 717.208,1652.94 719.64,1653.58 722.072,1654.2 724.503,1654.82 726.935,1655.42 729.367,1656.02 731.799,1656.6 734.231,1657.17 736.662,1657.73 739.094,1658.29 741.526,1658.83 743.958,1659.36 746.39,1659.88 748.821,1660.4 751.253,1660.9 753.685,1661.4 756.117,1661.88 758.549,1662.36 760.98,1662.83 763.412,1663.29 765.844,1663.74 768.276,1664.19 770.708,1664.62 773.139,1665.05 775.571,1665.47 778.003,1665.89 780.435,1666.29 782.866,1666.69 785.298,1667.08 787.73,1667.47 790.162,1667.85 792.594,1668.22 795.025,1668.58 797.457,1668.94 799.889,1669.29 802.321,1669.64 804.753,1669.98 807.184,1670.31 809.616,1670.64 812.048,1670.96 814.48,1671.28 816.912,1671.59 819.343,1671.89 821.775,1672.19 824.207,1672.49 826.639,1672.78 829.071,1673.06 831.502,1673.34 833.934,1673.62 836.366,1673.88 838.798,1674.15 841.23,1674.41 843.661,1674.66 846.093,1674.91 848.525,1675.16 850.957,1675.4 853.388,1675.64 855.82,1675.87 858.252,1676.1 860.684,1676.32 863.116,1676.54 865.547,1676.76 867.979,1676.97 870.411,1677.18 872.843,1677.38 875.275,1677.58 877.706,1677.78 880.138,1677.97 882.57,1678.16 885.002,1678.35 887.434,1678.53 889.865,1678.71 892.297,1678.89 894.729,1679.07 897.161,1679.24 899.593,1679.4 902.024,1679.57 904.456,1679.73 906.888,1679.89 909.32,1680.05 911.751,1680.2 914.183,1680.35 916.615,1680.5 919.047,1680.64 921.479,1680.79 923.91,1680.93 926.342,1681.06 928.774,1681.2 931.206,1681.33 933.638,1681.46 936.069,1681.59 938.501,1681.72 940.933,1681.84 943.365,1681.97 945.797,1682.09 948.228,1682.2 950.66,1682.32 953.092,1682.43 955.524,1682.54 957.956,1682.65 960.387,1682.76 962.819,1682.87 965.251,1682.97 967.683,1683.07 970.115,1683.17 972.546,1683.27 974.978,1683.37 977.41,1683.46 979.842,1683.56 982.273,1683.65 984.705,1683.74 987.137,1683.82 989.569,1683.91 992.001,1683.99 994.432,1684.08 996.864,1684.16 999.296,1684.24 1001.73,1684.32 1004.16,1684.4 1006.59,1684.47 1009.02,1684.55 1011.45,1684.62 1013.89,1684.69 1016.32,1684.76 1018.75,1684.83 1021.18,1684.9 1023.61,1684.97 1026.05,1685.03 1028.48,1685.09 1030.91,1685.16 1033.34,1685.22 1035.77,1685.28 1038.2,1685.34 1040.64,1685.4 1043.07,1685.46 1045.5,1685.51 1047.93,1685.57 1050.36,1685.62 1052.8,1685.68 1055.23,1685.73 1057.66,1685.78 1060.09,1685.83 1062.52,1685.88 1064.95,1685.93 1067.39,1685.98 1069.82,1686.03 1072.25,1686.08 1074.68,1686.12 1077.11,1686.17 1079.55,1686.21 1081.98,1686.26 1084.41,1686.3 1086.84,1686.34 1089.27,1686.38 1091.7,1686.42 1094.14,1686.46 1096.57,1686.5 1099,1686.54 1101.43,1686.58 1103.86,1686.62 1106.29,1686.65 1108.73,1686.69 1111.16,1686.73 1113.59,1686.76 1116.02,1686.79 1118.45,1686.83 1120.89,1686.86 1123.32,1686.89 1125.75,1686.93 1128.18,1686.96 1130.61,1686.99 1133.04,1687.02 1135.48,1687.05 1137.91,1687.08 1140.34,1687.1 1142.77,1687.13 1145.2,1687.16 1147.64,1687.19 1150.07,1687.21 1152.5,1687.24 1154.93,1687.26 1157.36,1687.29 1159.79,1687.31 1162.23,1687.34 1164.66,1687.36 1167.09,1687.38 1169.52,1687.4 1171.95,1687.43 1174.39,1687.45 1176.82,1687.47 1179.25,1687.49 1181.68,1687.51 1184.11,1687.53 1186.54,1687.55 1188.98,1687.57 1191.41,1687.59 1193.84,1687.61 1196.27,1687.63 1198.7,1687.64 1201.13,1687.66 1203.57,1687.68 1206,1687.7 1208.43,1687.71 1210.86,1687.73 1213.29,1687.75 1215.73,1687.76 1218.16,1687.78 1220.59,1687.79 1223.02,1687.81 1225.45,1687.82 1227.88,1687.84 1230.32,1687.85 1232.75,1687.87 1235.18,1687.88 1237.61,1687.89 1240.04,1687.91 1242.48,1687.92 1244.91,1687.93 1247.34,1687.95 1249.77,1687.96 1252.2,1687.97 1254.63,1687.98 1257.07,1688 1259.5,1688.01 1261.93,1688.02 1264.36,1688.03 1266.79,1688.04 1269.22,1688.05 1271.66,1688.07 1274.09,1688.08 1276.52,1688.09 1278.95,1688.1 1281.38,1688.11 1283.82,1688.12 1286.25,1688.13 1288.68,1688.14 1291.11,1688.15 1293.54,1688.16 1295.97,1688.16 1298.41,1688.17 1300.84,1688.18 1303.27,1688.19 1305.7,1688.2 1308.13,1688.21 1310.57,1688.22 1313,1688.22 1315.43,1688.23 1317.86,1688.24 1320.29,1688.25 1322.72,1688.25 1325.16,1688.26 1327.59,1688.27 1330.02,1688.28 1332.45,1688.28 1334.88,1688.29 1337.32,1688.3 1339.75,1688.3 1342.18,1688.31 1344.61,1688.31 1347.04,1688.32 1349.47,1688.33 1351.91,1688.33 1354.34,1688.34 1356.77,1688.34 1359.2,1688.35 1361.63,1688.35 1364.06,1688.36 1366.5,1688.36 1368.93,1688.37 1371.36,1688.37 1373.79,1688.38 1376.22,1688.38 1378.66,1688.39 1381.09,1688.39 1383.52,1688.4 1385.95,1688.4 1388.38,1688.41 1390.81,1688.41 1393.25,1688.41 1395.68,1688.42 1398.11,1688.42 1400.54,1688.43 1402.97,1688.43 1405.41,1688.43 1407.84,1688.44 1410.27,1688.44 1412.7,1688.44 1415.13,1688.45 1417.56,1688.45 1420,1688.46 1422.43,1688.46 1424.86,1688.46 1427.29,1688.47 1429.72,1688.47 1432.16,1688.47 1434.59,1688.47 1437.02,1688.48 1439.45,1688.48 1441.88,1688.48 1444.31,1688.49 1446.75,1688.49 1449.18,1688.49 1451.61,1688.5 1454.04,1688.5 1456.47,1688.5 1458.9,1688.5 1461.34,1688.51 1463.77,1688.51 1466.2,1688.51 1468.63,1688.51 1471.06,1688.52 1473.5,1688.52 1475.93,1688.52 1478.36,1688.52 1480.79,1688.53 1483.22,1688.53 1485.65,1688.53 1488.09,1688.53 1490.52,1688.54 1492.95,1688.54 1495.38,1688.54 1497.81,1688.54 1500.25,1688.55 1502.68,1688.55 1505.11,1688.55 1507.54,1688.55 1509.97,1688.55 1512.4,1688.56 1514.84,1688.56 1517.27,1688.56 1519.7,1688.56 1522.13,1688.56 1524.56,1688.56 1526.99,1688.57 1529.43,1688.57 1531.86,1688.57 1534.29,1688.57 1536.72,1688.57 1539.15,1688.57 1541.59,1688.58 1544.02,1688.58 1546.45,1688.58 1548.88,1688.58 1551.31,1688.58 1553.74,1688.58 1556.18,1688.58 1558.61,1688.59 1561.04,1688.59 1563.47,1688.59 1565.9,1688.59 1568.34,1688.59 1570.77,1688.59 1573.2,1688.59 1575.63,1688.59 1578.06,1688.6 1580.49,1688.6 1582.93,1688.6 1585.36,1688.6 1587.79,1688.6 1590.22,1688.6 1592.65,1688.6 1595.09,1688.6 1597.52,1688.6 1599.95,1688.6 1602.38,1688.6 1604.81,1688.61 1607.24,1688.61 1609.68,1688.61 1612.11,1688.61 1614.54,1688.61 1616.97,1688.61 1619.4,1688.61 1621.83,1688.61 1624.27,1688.61 1626.7,1688.61 1629.13,1688.61 1631.56,1688.61 1633.99,1688.61 1636.43,1688.61 1638.86,1688.61 1641.29,1688.61 1643.72,1688.62 1646.15,1688.62 1648.58,1688.62 1651.02,1688.62 1653.45,1688.62 1655.88,1688.62 1658.31,1688.62 1660.74,1688.62 1663.18,1688.62 1665.61,1688.62 1668.04,1688.62 1670.47,1688.62 1672.9,1688.62 1675.33,1688.62 1677.77,1688.62 1680.2,1688.62 1682.63,1688.62 1685.06,1688.62 1687.49,1688.62 1689.93,1688.62 1692.36,1688.62 1694.79,1688.63 1697.22,1688.63 1699.65,1688.63 1702.08,1688.63 1704.52,1688.63 1706.95,1688.63 1709.38,1688.63 1711.81,1688.63 1714.24,1688.63 1716.67,1688.63 1719.11,1688.63 1721.54,1688.63 1723.97,1688.63 1726.4,1688.63 1728.83,1688.63 1731.27,1688.63 1733.7,1688.63 1736.13,1688.63 1738.56,1688.63 1740.99,1688.63 1743.42,1688.63 1745.86,1688.64 1748.29,1688.64 1750.72,1688.64 1753.15,1688.64 1755.58,1688.64 1758.02,1688.64 1760.45,1688.64 1762.88,1688.64 1765.31,1688.64 1767.74,1688.64 1770.17,1688.64 1772.61,1688.64 1775.04,1688.64 1777.47,1688.64 1779.9,1688.64 1782.33,1688.64 1784.76,1688.64 1787.2,1688.64 1789.63,1688.64 1792.06,1688.64 1794.49,1688.64 1796.92,1688.64 1799.36,1688.64 1801.79,1688.64 1804.22,1688.64 1806.65,1688.64 1809.08,1688.64 1811.51,1688.64 1813.95,1688.64 1816.38,1688.64 1818.81,1688.65 1821.24,1688.65 1823.67,1688.65 1826.11,1688.65 1828.54,1688.65 1830.97,1688.65 1833.4,1688.65 1835.83,1688.65 1838.26,1688.65 1840.7,1688.65 1843.13,1688.65 1845.56,1688.65 1847.99,1688.65 1850.42,1688.65 1852.86,1688.65 1855.29,1688.65 1857.72,1688.65 1860.15,1688.65 1862.58,1688.65 1865.01,1688.65 1867.45,1688.65 1869.88,1688.65 1872.31,1688.65 1874.74,1688.65 1877.17,1688.65 1879.6,1688.65 1882.04,1688.65 1884.47,1688.65 1886.9,1688.65 1889.33,1688.65 1891.76,1688.65 1894.2,1688.65 1896.63,1688.65 1899.06,1688.65 1901.49,1688.65 1903.92,1688.65 1906.35,1688.65 1908.79,1688.65 1911.22,1688.65 1913.65,1688.65 1916.08,1688.65 1918.51,1688.65 1920.95,1688.65 1923.38,1688.65 1925.81,1688.65 1928.24,1688.65 1930.67,1688.65 1933.1,1688.65 1935.54,1688.65 1937.97,1688.65 1940.4,1688.65 1942.83,1688.65 1945.26,1688.65 1947.7,1688.65 1950.13,1688.65 1952.56,1688.65 1954.99,1688.65 1957.42,1688.65 1959.85,1688.65 1962.29,1688.65 1964.72,1688.65 1967.15,1688.65 1969.58,1688.65 1972.01,1688.65 1974.44,1688.65 1976.88,1688.65 1979.31,1688.65 1981.74,1688.65 1984.17,1688.65 1986.6,1688.65 1989.04,1688.65 1991.47,1688.65 1993.9,1688.65 1996.33,1688.65 1998.76,1688.65 2001.19,1688.65 2003.63,1688.65 2006.06,1688.65 2008.49,1688.65 2010.92,1688.65 2013.35,1688.65 2015.79,1688.65 2018.22,1688.65 2020.65,1688.65 2023.08,1688.65 2025.51,1688.65 2027.94,1688.65 2030.38,1688.65 2032.81,1688.65 2035.24,1688.65 2037.67,1688.65 2040.1,1688.65 2042.53,1688.65 2044.97,1688.65 2047.4,1688.65 2049.83,1688.65 2052.26,1688.65 2054.69,1688.65 2057.13,1688.65 2059.56,1688.65 2061.99,1688.65 2064.42,1688.65 2066.85,1688.65 2069.28,1688.65 2071.72,1688.65 2074.15,1688.65 2076.58,1688.65 2079.01,1688.65 2081.44,1688.65 2083.88,1688.65 2086.31,1688.65 2088.74,1688.65 2091.17,1688.65 2093.6,1688.65 2096.03,1688.65 2098.47,1688.65 2100.9,1688.65 2103.33,1688.65 2105.76,1688.65 2108.19,1688.65 2110.63,1688.65 2113.06,1688.65 2115.49,1688.65 2117.92,1688.65 2120.35,1688.65 2122.78,1688.65 2125.22,1688.65 2127.65,1688.65 2130.08,1688.65 2132.51,1688.65 2134.94,1688.65 2137.37,1688.65 2139.81,1688.65 2142.24,1688.65 2144.67,1688.65 2147.1,1688.65 2149.53,1688.65 2151.97,1688.65 2154.4,1688.65 2156.83,1688.65 2159.26,1688.65 2161.69,1688.65 2164.12,1688.65 2166.56,1688.65 2168.99,1688.65 2171.42,1688.65 2173.85,1688.65 2176.28,1688.65 2178.72,1688.65 2181.15,1688.65 2183.58,1688.65 2186.01,1688.65 2188.44,1688.65 2190.87,1688.65 2193.31,1688.65 2195.74,1688.65 2198.17,1688.65 2200.6,1688.65 2203.03,1688.65 2205.47,1688.65 2207.9,1688.65 2210.33,1688.65 2212.76,1688.65 2215.19,1688.65 2217.62,1688.65 2220.06,1688.65 2222.49,1688.65 2224.92,1688.65 2227.35,1688.65 2229.78,1688.65 2232.21,1688.65 2234.65,1688.65 2237.08,1688.65 2239.51,1688.65 2241.94,1688.65 2244.37,1688.65 2246.81,1688.65 2249.24,1688.65 2251.67,1688.65 2254.1,1688.65 2256.53,1688.65 2258.96,1688.65 2261.4,1688.65 2263.83,1688.65 2266.26,1688.65 2268.69,1688.65 2271.12,1688.65 2273.56,1688.65 2275.99,1688.65 2278.42,1688.65 2280.85,1688.65 2283.28,1688.65 2285.71,1688.65 2288.15,1688.65 2290.58,1688.65 2293.01,1688.65 2295.44,1688.65 2297.87,1688.65 2300.3,1688.65 2302.74,1688.65 2305.17,1688.65 2307.6,1688.65 2310.03,1688.65 2312.46,1688.65 2314.9,1688.65 2317.33,1688.65 2319.76,1688.65 2322.19,1688.65 2324.62,1688.65 2327.05,1688.65 2329.49,1688.65 2331.92,1688.65 2334.35,1688.65 2336.78,1688.65 2339.21,1688.65 2341.65,1688.65 2344.08,1688.65 2346.51,1688.65 2348.94,1688.65 2351.37,1688.65 2353.8,1688.65 2356.24,1688.65 2358.67,1688.65 2361.1,1688.65 2363.53,1688.65 2365.96,1688.65 2368.4,1688.65 2370.83,1688.65 2373.26,1688.65 2375.69,1688.65 2378.12,1688.65 2380.55,1688.65 2382.99,1688.65 2385.42,1688.65 2387.85,1688.65 2390.28,1688.65 2392.71,1688.65 2395.14,1688.65 2397.58,1688.65 2400.01,1688.65 2402.44,1688.65 2404.87,1688.65 2407.3,1688.65 2409.74,1688.65 2412.17,1688.65 2414.6,1688.65 2417.03,1688.65 2419.46,1688.65 2421.89,1688.65 2424.33,1688.65 2426.76,1688.65 2429.19,1688.65 2431.62,1688.65 2434.05,1688.65 2436.49,1688.65 2438.92,1688.65 2441.35,1688.65 2443.78,1688.65 2446.21,1688.65 2448.64,1688.65 2451.08,1688.65 2453.51,1688.65 2455.94,1688.65 2458.37,1688.65 2460.8,1688.65 2463.24,1688.65 2465.67,1688.65 2468.1,1688.65 2470.53,1688.65 2472.96,1688.65 2475.39,1688.65 2477.83,1688.65 2480.26,1688.65 2482.69,1688.65 2485.12,1688.65 2487.55,1688.65 2489.98,1688.65 2492.42,1688.65 2494.85,1688.65 2497.28,1688.65 2499.71,1688.65 2502.14,1688.65 2504.58,1688.65 2507.01,1688.65 2509.44,1688.65 2511.87,1688.65 2514.3,1688.65 2516.73,1688.65 2519.17,1688.65 2521.6,1688.65 2524.03,1688.65 2526.46,1688.65 2528.89,1688.65 2531.33,1688.65 2533.76,1688.65 2536.19,1688.65 2538.62,1688.65 2541.05,1688.65 2543.48,1688.65 2545.92,1688.65 2548.35,1688.65 2550.78,1688.65 2553.21,1688.65 2555.64,1688.65 2558.07,1688.65 2560.51,1688.65 2562.94,1688.65 2565.37,1688.65 2567.8,1688.65 2570.23,1688.65 2572.67,1688.65 2575.1,1688.65 2577.53,1688.65 2579.96,1688.65 2582.39,1688.65 2584.82,1688.65 2587.26,1688.65 2589.69,1688.65 2592.12,1688.65 2594.55,1688.65 2596.98,1688.65 2599.42,1688.65 2601.85,1688.65 2604.28,1688.65 2606.71,1688.65 2609.14,1688.65 2611.57,1688.65 2614.01,1688.65 2616.44,1688.65 2618.87,1688.65 2621.3,1688.65 2623.73,1688.65 2626.17,1688.65 2628.6,1688.65 2631.03,1688.65 2633.46,1688.65 2635.89,1688.65 2638.32,1688.65 2640.76,1688.65 "></polyline>
<path clip-path="url(#clip620)" d="M2227.74 285.016 L2559.78 285.016 L2559.78 181.336 L2227.74 181.336  Z" fill="#ffffff" fill-rule="evenodd" fill-opacity="1"></path>
<polyline clip-path="url(#clip620)" style="stroke:#000000; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2227.74,285.016 2559.78,285.016 2559.78,181.336 2227.74,181.336 2227.74,285.016 "></polyline>
<polyline clip-path="url(#clip620)" style="stroke:#009af9; stroke-linecap:round; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none" points="2254.74,233.176 2416.69,233.176 "></polyline>
<path clip-path="url(#clip620)" d="M2443.69 240.225 L2443.69 224.531 L2447.95 224.531 L2447.95 240.063 Q2447.95 243.743 2449.38 245.595 Q2450.82 247.424 2453.69 247.424 Q2457.14 247.424 2459.13 245.225 Q2461.14 243.026 2461.14 239.229 L2461.14 224.531 L2465.4 224.531 L2465.4 250.456 L2461.14 250.456 L2461.14 246.475 Q2459.59 248.836 2457.53 249.993 Q2455.49 251.128 2452.78 251.128 Q2448.32 251.128 2446 248.35 Q2443.69 245.572 2443.69 240.225 M2454.41 223.906 L2454.41 223.906 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M2473.78 214.438 L2483.59 214.438 L2483.59 217.748 L2478.04 217.748 L2478.04 253.396 L2483.59 253.396 L2483.59 256.706 L2473.78 256.706 L2473.78 214.438 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M2494.08 246.521 L2501.72 246.521 L2501.72 220.156 L2493.41 221.822 L2493.41 217.563 L2501.67 215.896 L2506.35 215.896 L2506.35 246.521 L2513.99 246.521 L2513.99 250.456 L2494.08 250.456 L2494.08 246.521 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path><path clip-path="url(#clip620)" d="M2532.78 214.438 L2532.78 256.706 L2522.97 256.706 L2522.97 253.396 L2528.5 253.396 L2528.5 217.748 L2522.97 217.748 L2522.97 214.438 L2532.78 214.438 Z" fill="#000000" fill-rule="nonzero" fill-opacity="1"></path></svg>
</div>
</div>
<p>We see very clearly how the value of the function <img src="https://latex.codecogs.com/png.latex?T"> changes with time.</p>
</section>
</section>
<section id="conclusion" class="level3">
<h3 class="anchored" data-anchor-id="conclusion">Conclusion</h3>
<p>We have seen the very basics and intuitive explanation of First Order Differential Equations, and learned about how <code>DifferentialEquations.jl</code> solves DEs, and how to frame DEs according to the format expected by that library.</p>
</section>
<section id="acknowledgements" class="level3">
<h3 class="anchored" data-anchor-id="acknowledgements">Acknowledgements</h3>
<p>I learned a lot about the content of this tutorial from- some amazing teachers that I had in college, and some amazing textbooks like <a href="https://www.cambridge.org/highereducation/books/mathematical-methods-for-physics-and-engineering/FC466374D5B94E86D969100070CA6483#overview">Mathematical Methods for Physics and Engineering</a> by Riley, Hobson, Bence and <a href="https://shop.elsevier.com/books/mathematical-methods-for-physicists/arfken/978-0-12-384654-9">Mathematical Methods for Physicists</a> by Arfken, Weber, and Harris. I learned about the DE solver package from many content from the creator: <a href="https://chrisrackauckas.com">Chris Rackauckas</a>, and some example videos from this YouTube channel- <a href="https://www.youtube.com/@doggodotjl">doggo dot jl</a>.</p>
</section>
<section id="discuss" class="level3">
<h3 class="anchored" data-anchor-id="discuss">Discuss</h3>
<p>If you have read this post, and found it interesting or edifying, please let me know. I would like that very much. If you have any criticism, suggestion, or want to tell me anything, just add a comment or let me know privately. Discuss this post on the <a href="https://mathstodon.xyz/@rg/114099971889812602">Fediverse</a>, <a href="https://news.ycombinator.com/item?id=43245172">Hacker News</a>, or <a href="https://x.com/AllesistKode/status/1896632787555451001">Twitter/X</a>.</p>
</section>
<section id="changelog" class="level3">
<h3 class="anchored" data-anchor-id="changelog">Changelog</h3>
<p>This is an Open Source blog. Feel free to inspect diffs in the GitHub <a href="https://github.com/ritog/ritog.github.io">repo</a>.</p>
<p><img src="https://ritog.github.io/posts/1st-order-DE-julia/human-gen-sticker.png" width="256"></p>
</section>
<section id="cite-this-article" class="level3">
<h3 class="anchored" data-anchor-id="cite-this-article">Cite this Article</h3>
<pre><code>@ONLINE {,
    author = "Ritobrata Ghosh",
    title  = "Solving First Order Differential Equations with Julia",
    month  = "mar",
    year   = "2025",
    url    = "https://ritog.github.io/posts/1st-order-DE-julia/1st_order_DE_julia.html"
}</code></pre>
</section>
<section id="support" class="level3">
<h3 class="anchored" data-anchor-id="support">Support</h3>
<p>I highly appreciate donations. If you liked this post, or the content in the site in general, support me via <a href="https://ko-fi.com/ritog">Ko-Fi</a>, <a href="https://liberapay.com/ritog">Liberapay</a> or if you are in India, via UPI <a href="https://i.imgur.com/D9rTvVN.png">ritogh8@oksbi</a>.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><a href="https://ko-fi.com/B0B33QVX2"><img src="https://ritog.github.io/posts/1st-order-DE-julia/https:/ko-fi.com/img/githubbutton_sm.svg" class="img-fluid figure-img"></a></p>
</figure>
</div>
<script src="https://liberapay.com/ritog/widgets/button.js"></script>
<noscript>
<a href="https://liberapay.com/ritog/donate"><img alt="Donate using Liberapay" src="https://ritog.github.io/posts/1st-order-DE-julia/https:/liberapay.com/assets/widgets/donate.svg"></a>
</noscript>


</section>
</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div id="quarto-reuse" class="quarto-appendix-contents"><div>CC-BY-NC-SA</div></div></section></div> ]]></description>
  <category>math</category>
  <category>julia</category>
  <category>computational-math</category>
  <guid>https://ritog.github.io/posts/1st-order-DE-julia/1st_order_DE_julia.html</guid>
  <pubDate>Sun, 02 Mar 2025 18:30:00 GMT</pubDate>
  <media:content url="https://ritog.github.io/posts/1st-order-DE-julia/fractal-2008101.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Non-Linear Dynamics Trajectories with Python</title>
  <dc:creator>Ritobrata Ghosh</dc:creator>
  <link>https://ritog.github.io/posts/non-linear-dynamics-trajectories-with-python/index.html</link>
  <description><![CDATA[ 




<section id="non-linear-dynamics-trajectories-with-python" class="level1">
<h1>Non-Linear Dynamics Trajectories with Python</h1>
<p>by Ritobrata Ghosh</p>
<section id="introduction" class="level3">
<h3 class="anchored" data-anchor-id="introduction">Introduction</h3>
<p>In this Notebook, trajectories of the Logistic Map [1] is plotted with Python.</p>
<div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines 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> matplotlib.pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span></code></pre></div>
<div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">def</span> logistic_function(parameter: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>, initial_value: <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="cb2-2">    <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">return</span> parameter <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">*</span> initial_value <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> initial_value)</span></code></pre></div>
<div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb3-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">def</span> logistic_function_trajectory(parameter: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>,</span>
<span id="cb3-2">                                 initial_value: <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>,</span>
<span id="cb3-3">                                 num_iter: <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> np.array:</span>
<span id="cb3-4">    trajectory <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.zeros(num_iter)</span>
<span id="cb3-5">    trajectory[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> initial_value</span>
<span id="cb3-6">    <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">for</span> i <span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">in</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">range</span>(num_iter<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-7">        trajectory[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;">1</span>] <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> logistic_function(parameter, initial_value)</span>
<span id="cb3-8">        initial_value <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> trajectory[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;">1</span>]</span>
<span id="cb3-9">    <span class="cf" style="color: #003B4F;
background-color: null;
font-style: inherit;">return</span> np.array(trajectory)</span></code></pre></div>
<div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb4-1">logistic_function_trajectory(parameter<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;">2.2</span>, initial_value<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.8</span>, num_iter<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></code></pre></div>
<pre><code>array([0.8       , 0.352     , 0.5018112 , 0.54999278, 0.54450159,
       0.54564314, 0.54541675, 0.5454621 , 0.54545303, 0.54545485])</code></pre>
<div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb6-1">xs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<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;">200</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span>)</span>
<span id="cb6-2">ys <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> logistic_function_trajectory(parameter<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;">2.2</span>, initial_value<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.8</span>, num_iter<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;">200</span>)</span></code></pre></div>
<div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb7-1"><span class="kw" style="color: #003B4F;
background-color: null;
font-style: inherit;">def</span> plot_trajectory(xs, ys, x_label, y_label, title):</span>
<span id="cb7-2">    plt.figure(figsize<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;">20</span>,<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">10</span>))</span>
<span id="cb7-3">    plt.scatter(xs, ys, marker<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;">'o'</span>, edgecolor<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;">'black'</span>, c<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>point_colors <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;">50</span>)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-4">    plt.xlabel(x_label)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-5">    plt.ylabel(y_label)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-6">    plt.title(title)<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span>
<span id="cb7-7">    plt.grid()<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">;</span></span></code></pre></div>
<div class="sourceCode" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb8-1">point_colors <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;">'cyan'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'magenta'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'yellow'</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'black'</span>]</span></code></pre></div>
<div class="sourceCode" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb9-1">plot_trajectory(xs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>xs, ys<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ys, x_label<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;">'$n$'</span>, y_label<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_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;">'Trajectory'</span>)</span></code></pre></div>
<p><img src="https://ritog.github.io/posts/non-linear-dynamics-trajectories-with-python/output_10_0.png" class="img-fluid"></p>
</section>
<section id="r-2" class="level3">
<h3 class="anchored" data-anchor-id="r-2"><img src="https://latex.codecogs.com/png.latex?r%20=%202"></h3>
<div class="sourceCode" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb10-1">x_n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> logistic_function_trajectory(parameter<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;">2.0</span>, initial_value<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.2</span>, num_iter<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;">200</span>)</span>
<span id="cb10-2">x_n_hat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> logistic_function_trajectory(parameter<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;">2.0</span>, initial_value<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.200001</span>, num_iter<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;">200</span>)</span></code></pre></div>
<div class="sourceCode" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb11-1">ys <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;">abs</span>(np.subtract(x_n, x_n_hat))</span>
<span id="cb11-2">xs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<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;">200</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span>)</span></code></pre></div>
<div class="sourceCode" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb12-1">plot_trajectory(xs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>xs, ys<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ys, x_label<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;">'$n$'</span>, y_label<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_n - \hat</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{x_n}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;"> $'</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;">'Trajectory for $r = 2$'</span>)</span></code></pre></div>
<p><img src="https://ritog.github.io/posts/non-linear-dynamics-trajectories-with-python/output_14_0.png" class="img-fluid"></p>
</section>
<section id="plotting-x_n---hatx_n-vs.-n-for-r3.4" class="level3">
<h3 class="anchored" data-anchor-id="plotting-x_n---hatx_n-vs.-n-for-r3.4">Plotting <img src="https://latex.codecogs.com/png.latex?x_n%20-%20%5Chat%7Bx_n%7D"> vs.&nbsp;<img src="https://latex.codecogs.com/png.latex?n"> for <img src="https://latex.codecogs.com/png.latex?r=3.4"></h3>
<div class="sourceCode" id="cb13" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb13-1">x_n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> logistic_function_trajectory(parameter<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;">3.4</span>, initial_value<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.2</span>, num_iter<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;">200</span>)</span>
<span id="cb13-2">x_n_hat <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> logistic_function_trajectory(parameter<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;">3.4</span>, initial_value<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.200001</span>, num_iter<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;">200</span>)</span>
<span id="cb13-3"></span>
<span id="cb13-4">ys <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;">abs</span>(np.subtract(x_n, x_n_hat))</span>
<span id="cb13-5">xs <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.linspace(<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;">200</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">200</span>)</span>
<span id="cb13-6"></span>
<span id="cb13-7">plot_trajectory(xs<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>xs, ys<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>ys, x_label<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;">'$n$'</span>, y_label<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_n - \hat</span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{x_n}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;"> $'</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;">'Trajectory for $r = 3.4$'</span>)</span></code></pre></div>
<p><img src="https://ritog.github.io/posts/non-linear-dynamics-trajectories-with-python/output_16_0.png" class="img-fluid"></p>
<p>We can thus plot the trajectories of the Logistic Map with Python and relevant libraries.</p>
</section>
</section>
<section id="references" class="level1">
<h1>References</h1>
<ol type="1">
<li>https://en.wikipedia.org/wiki/Logistic_map</li>
<li>Bradley, Liz: <em>Nonlinear Dynamics: Mathematical and Computational Approaches</em> via Complexity Explorer, Santa Fe Institute</li>
</ol>
<p>Cite this Notebook:</p>
<pre><code>@ONLINE {,
    author = "Ritobrata Ghosh",
    title  = "Non Linear Dynamics Trajectories with Python",
    month  = "apr",
    year   = "2023",
    url    = "https://www.kaggle.com/truthr/non-linear-dynamics-trajectories-with-python"
}</code></pre>


</section>

 ]]></description>
  <category>deep-learning</category>
  <category>physics</category>
  <category>chaos-theory</category>
  <category>ai</category>
  <guid>https://ritog.github.io/posts/non-linear-dynamics-trajectories-with-python/index.html</guid>
  <pubDate>Wed, 26 Apr 2023 18:30:00 GMT</pubDate>
  <media:content url="https://ritog.github.io/posts/non-linear-dynamics-trajectories-with-python/output_16_0.png" medium="image" type="image/png" height="75" width="144"/>
</item>
<item>
  <title>Stuff About Complex Number I Wish Somebody Told Me</title>
  <dc:creator>Ritobrata Ghosh</dc:creator>
  <link>https://ritog.github.io/posts/complex-numbers/index.html</link>
  <description><![CDATA[ 




<section id="stuff-about-complex-number-i-wish-somebody-told-me" class="level1">
<h1>Stuff About Complex Number I Wish Somebody Told Me</h1>
<p>by <a href="https://github.com/ritog">Rito Ghosh</a></p>
<section id="introduction" class="level2">
<h2 class="anchored" data-anchor-id="introduction">Introduction</h2>
<p>There are many places that teach you complex number like High School, college classes, YouTube channels, and so on.</p>
<p>But they earlier ones often heavy on solving problems by-hand, and almost every time, they do only that.</p>
<p>The latter ones focus mainly on shiny visuals or advanced properties that are not intended for the uninitiated.</p>
<p>This is a piece written for both people who are getting introduced to Complex Numbers for the first time, and for the people who have studied it in college, and are hazy on the topic. (Why won’t they be? They had to focus on solving boring problems by hand.)</p>
<p>When I saw Jeremy talk about Complex Numbers on the APL study group, I knew I had to write something- I did my Junior year Math paper on Complex Number in High School!</p>
<p>The idea is to:</p>
<ul>
<li>quickly introduce Complex Numbers, and how to work with them</li>
<li>talk about their origins: why need complex numbers in the first place?</li>
<li>show how they extend the number line</li>
<li>show how <img src="https://latex.codecogs.com/png.latex?i"> works as an operator, and briefly what operators are</li>
<li>talk about a real world example, and probable future usage</li>
</ul>
<p>I will keep it short and crisp.</p>
<hr>
</section>
<section id="comples-numbers" class="level2">
<h2 class="anchored" data-anchor-id="comples-numbers">Comples Numbers</h2>
<p>Complex Numbers, as you might have seen are written like this:</p>
<p><img src="https://latex.codecogs.com/png.latex?x%20=%20a%20+%20ib"></p>
<p>Here, the whole thing in the right-hand side is the number. a is the Real part, and b is the imaginary part.</p>
<p>Do not get misguided by the names. Imaginary numbers aren’t imaginary at all. They make appearance, or rather, they can represent stuff in real life really well! We will soon see.</p>
<p>You can add and subtract complex numbers. You add (or subtract) the real and imaginary parts separately.</p>
<p>Let me show you.</p>
<p><img src="https://latex.codecogs.com/png.latex?(4%20+%205i)%20+%20(3%20+%206i)%20=%20(4%20+%203)%20+%20(5%20+%206)i"></p>
<p><img src="https://latex.codecogs.com/png.latex?%20(6i)%20-%20(3%20+%207i)%20=%20(0-3)%20-%20(7-6)i%20=%20-3%20-%20i"></p>
<p>They can be multiplied and divided with real numbers and other complex numbers. They work just as you expect them to.</p>
<p><img src="https://latex.codecogs.com/png.latex?(3%20+%202i)(1%20+%204i)%20=%203%20+%2012i%20+%202i%20+%208i%5E2"></p>
<p>Let’s not spend too much time here.</p>
<p>As how they behave, and more related information can quickly be found- and good ones at that- on internet.</p>
<p>I suggest the Khan Academy course on Complex Numbers.</p>
<hr>
<p>Oh, I haven’t told you the value of <img src="https://latex.codecogs.com/png.latex?i"> yet.</p>
<p><img src="https://latex.codecogs.com/png.latex?i">, is defined such that,</p>
<p><img src="https://latex.codecogs.com/png.latex?i%20=%20%5Csqrt(-1),%20%5Ctext%7Bor%7D,%20i%5E2%20=%20-1"></p>
<p>That’s it!</p>
<hr>
</section>
<section id="why-do-we-need-i-and-the-whole-complex-number-scenery" class="level2">
<h2 class="anchored" data-anchor-id="why-do-we-need-i-and-the-whole-complex-number-scenery">Why do we Need i, and the Whole Complex Number Scenery</h2>
<p>The story goes, when the Greeks were ridden with famines and other troubles, the Oracle of Delphi told them to double the height of the cube made in honor of Apollo.</p>
<p>The Greeks could not do it! How could they?</p>
<p>To double the size of a cube, you need to find the cube root of 2. The Greeks didn’t know how to that!</p>
<p>Too bad.</p>
<p>You are probably familiar with the story that Pythagoras, frustrated with the fact that the the size of the diagonal of a square with the side of 1 could not be measured, ordered to off someone! Just like that!</p>
<p>Because the square root of 2 was not measurable then. It is not a number that you write down like the others.</p>
<p>Human beings needed something that could be tamed- numbers that always had roots- no matter what the number was!</p>
<p>This is how it came to be. Complex numbers are numbers that always has roots. No matter what.</p>
<p>And with the advent of imaginary numbers, it was possible to calculate the square root of negative numbers, too. But that came later.</p>
<hr>
</section>
<section id="extending-the-number-line" class="level2">
<h2 class="anchored" data-anchor-id="extending-the-number-line">Extending the Number Line</h2>
<p>The number line is a simple animal.</p>
<p>It is one-dimensional. It extends both ways of zero.</p>
<p>And thus, it was limiting.</p>
<p>Complex numbers was defined in such a way that they added one extra dimension to the number line.</p>
<p>It wasn’t so one-dimensional anymore.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://ritog.github.io/posts/complex-numbers/https:/upload.wikimedia.org/wikipedia/commons/5/50/A_plus_bi.svg" class="img-fluid figure-img"></p>
<figcaption class="figure-caption">argand plane</figcaption>
</figure>
</div>
<p>Picture: Wikipedia</p>
<p>Now, numbers weren’t limited to a line, but it was a plane.</p>
<p>And many more operations became possible that simply weren’t before.</p>
<hr>
</section>
<section id="i-as-an-operator" class="level2">
<h2 class="anchored" data-anchor-id="i-as-an-operator">i as an Operator</h2>
<p>i is not simple. Adding it or multiplying it has consequences.</p>
<p>If you don’t know yet, very simply, operators are stuff that act on other stuff.</p>
<p>(No mathematical rigor whatsoever can be expected from the previous line)</p>
<p>You know operators. We are talking about it in APL. We use them whenever we code.</p>
<p>Functions are also operators.</p>
<p>Think, for example, about the - operator.</p>
<p>This is our friendly negative sign. But add it before a positive number, and the result will be a negative number. The number will no longer remain positive.</p>
<p>Think about the + operator in math. It takes two numbers, not one. And the result is the sum of both of them.</p>
<p>Operator takes stuff in it, and spits out results.</p>
<p>i is also an operator.</p>
<p>Multiplying a number with i rotates the number by 90 degrees counter-clockwise in the complex plain.</p>
<p>Rotate it twice, and you get the negative of a number. Because, you know, i is the square of -1. And multiplying a number with square of i negates it, i.e.&nbsp;rotates the number by 180 degrees, or throws it to the dark, ehm, negative side.</p>
<p>This has important consequences.</p>
<hr>
</section>
<section id="example-of-use-of-complex-number-in-real-world-electronics" class="level2">
<h2 class="anchored" data-anchor-id="example-of-use-of-complex-number-in-real-world-electronics">Example of Use of Complex Number in Real World: Electronics</h2>
<p>The scope of this piece is very limited.</p>
<p>But I will show you one example.</p>
<p>Alternating Current is not steady, or fixed like Direct Current or DC. AC current, the one powers our home is the only practical form of electricity that can be practically transported from one point to another over a long distance.</p>
<p>This form of electricity acts like a wave.</p>
<p>And whenever waves are involved, we have to deal with angles, frequencies, and amplitudes.</p>
<p>When angles become involved, we can use trigonometric functions like cosine and sine.</p>
<p>And complex numbers are related to trigonometric functions via the Euler’s Formula:</p>
<p><img src="https://latex.codecogs.com/png.latex?e%5E%7Bi%20%5Ctheta%7D%20=%20%5Ccos%7B%5Ctheta%7D%20+%20i%20%5Ccdot%20%5Csin%7B%5Ctheta%7D"></p>
<p>And, when we can use the special number, e, we can solve many problems easily because the function returns itself after differentiation and integration.</p>
<p>That makes a lot of the things easier.</p>
<p>While this is the reason for using complex numbers in electronics in the first place, they also make life easier for easier calculation and quantity manipulation.</p>
<hr>
</section>
<section id="why-bother-isnt-one-more-dimension-enough" class="level2">
<h2 class="anchored" data-anchor-id="why-bother-isnt-one-more-dimension-enough">Why Bother: Isn’t One More Dimension Enough?</h2>
<p>You might think that complex numbers are such nuisance, and we could have done the same clever things with adding one more dimension to the real number like we do in geometry. Would not a ‘y’ suffice instead of this dimension riddled with ‘imaginary numbers’?</p>
<p>The answer is no.</p>
<p>You will not have the same behavior then.</p>
<p>You won’t be able to get the niceties that is afforded to you via Euler’s formula and the access it provides you to the exponential function.</p>
<hr>
<p>I hope I was able to give you some intuition about complex numbers, and their uses.</p>
<p>Please let me know what you think.</p>
<hr>
<p>Subscribe to my <a href="https://ritog.substack.com">substack</a> to get posts on your inbox, or subscribe via RSS.</p>


</section>
</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div id="quarto-reuse" class="quarto-appendix-contents"><div>CC-BY-NC-SA</div></div></section></div> ]]></description>
  <category>math</category>
  <guid>https://ritog.github.io/posts/complex-numbers/index.html</guid>
  <pubDate>Tue, 05 Jul 2022 18:30:00 GMT</pubDate>
  <media:content url="https://ritog.github.io/posts/complex-numbers/complex-numbers-post.png" medium="image" type="image/png" height="144" width="144"/>
</item>
<item>
  <title>A Gentle Introduction to the Hugging Face API</title>
  <dc:creator>Ritobrata Ghosh</dc:creator>
  <link>https://ritog.github.io/posts/intro-to-huggingface-api/2021-06-20-intro-huggingface-api.html</link>
  <description><![CDATA[ 




<p><img src="https://ritog.github.io/posts/intro-to-huggingface-api/2021-06-20-intro-huggingface-api-0.jpg" class="img-fluid"></p>
<section id="introduction" class="level3">
<h3 class="anchored" data-anchor-id="introduction">Introduction</h3>
<p>Natural Language Processing is a fast-advancing field. And it is also one of the fields that require a huge amount of computational resources to make important progress. And although breakthroughs are openly announced, and papers are released in free-to-access repositories such as <a href="https://arxiv.org/">arXiv</a>, Open Review, Papers with Code, etc., and despite (sometimes) having the code freely available on GitHub, using those language models is not something widely accessible and easy.</p>
<p>Let me provide more context. BERT is a state-of-the-art encoder language model. It takes days to train the model from the ground up even when using very powerful GPUs that only a few entities have access to. In 2019, NVIDIA <a href="https://nvidianews.nvidia.com/news/nvidia-achieves-breakthroughs-in-language-understandingto-enable-real-time-conversational-ai">used</a> 1472 NVIDIA V100 GPUs to train BERT from scratch in 53 minutes. Yes, 1,472!</p>
<p>One estimate <a href="https://twitter.com/eturner303/status/1266264358771757057?s=20">puts</a> the cost of training GPT-3, a 175 billion parameter model, for a single training run at $12 Million USD.</p>
<p>And such language models are released every now and then. How do you use these powerful language models for your task?</p>
<p>Here Hugging Face comes to the scene. They aim to solve this problem by providing pre-trained models, and simple API so that you can use them, fine-tune them, and use the API in your applications.</p>
<p>In this article, my goal is to introduce the Hugging Face <code>pipeline</code> API to accomplish very interesting tasks by utilizing powerful pre-trained models present in the models hub of Hugging Face.</p>
<p>To follow through this article, you need not have any prior knowledge of Natural Language Processing. I, however, assume minor prior experience in writing Python code.</p>
<hr>
<p>In this article, I will go over, describe, and provide examples for the following tasks using Hugging Face <code>pipeline</code>-</p>
<ul>
<li>Sentiment Analysis</li>
<li>Zero-Shot Classification</li>
<li>Text Generation</li>
<li>Mask-Filling</li>
<li>Named Entity Recognition</li>
<li>Question Answering</li>
<li>Summarization</li>
<li>Translation</li>
</ul>
<hr>
</section>
<section id="installing-and-importing" class="level3">
<h3 class="anchored" data-anchor-id="installing-and-importing">Installing and Importing</h3>
<pre><code>! pip install transformers[sentencepiece] &gt; /dev/null</code></pre>
<p>If you have not seen a <code>pip</code> install with a square bracket in it before, don’t worry. It means that you are installing the <code>transformers</code> package with extra support added for the <code>sentencepiece</code> package. You can find out more about square parentheses installs in <code>pip</code> <a href="https://stackoverflow.com/questions/46775346/what-do-square-brackets-mean-in-pip-install">here</a>.</p>
<div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource py number-lines code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> transformers <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> pipeline</span></code></pre></div>
<p>We will use the utilities available in the <code>pipeline</code> namespace in the <code>transformers</code> library.</p>
<hr>
</section>
<section id="sentiment-analysis" class="level3">
<h3 class="anchored" data-anchor-id="sentiment-analysis">Sentiment Analysis</h3>
<p>Before I begin going through the specific <code>pipeline</code>s, let me tell you something beforehand that you will find yourself. Hugging Face API is very intuitive. When you want to use a <code>pipeline</code>, you have to instantiate an object, then you pass data to that object to get result. Very simple! You are soon to see what I mean.</p>
<div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode numberSource py number-lines code-with-copy"><code class="sourceCode python"><span id="cb3-1">classifier_sentiment <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pipeline(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"sentiment-analysis"</span>)</span></code></pre></div>
<p>That’s it. You call the <code>pipeline()</code> method with the task you want to accomplish as an argument. And you assign a name to it. You are done now. You can now begin to use the object as a function to achieve what you want. Let’s see an example-</p>
<iframe src="https://www.kaggle.com/embed/truthr/a-gentle-introduction-to-the-hugging-face-api?cellId=6&amp;cellIds=15&amp;kernelSessionId=66118660" height="150" style="margin: 0 auto; width: 100%; max-width: 950px;" frameborder="0" scrolling="auto" title="A Gentle Introduction to the Hugging Face API">
</iframe>
<p>See, it returns a dictionary contained in a list that has two items, <code>label</code> and <code>score</code>. The <code>label</code> part tells us its prediction, and the <code>score</code> tells us its confidence score.</p>
<blockquote class="blockquote">
<p><em>As an aside, I think they are structured this way because this structure is easily compatible with <code>.json</code> and similar filetypes which are very common in APIs.</em></p>
</blockquote>
<p>Let’s see another example.</p>
<iframe src="https://www.kaggle.com/embed/truthr/a-gentle-introduction-to-the-hugging-face-api?cellId=6&amp;cellIds=17&amp;kernelSessionId=66118660" height="150" style="margin: 0 auto; width: 100%; max-width: 950px;" frameborder="0" scrolling="auto" title="A Gentle Introduction to the Hugging Face API">
</iframe>
<p>See, how the classifier is aware of my emotion about pineapple pizzas? 🙃</p>
<hr>
</section>
<section id="zero-shot-classification" class="level3">
<h3 class="anchored" data-anchor-id="zero-shot-classification">Zero-Shot Classification</h3>
<p>When you want to classify something using Deep Learning, in many cases you need to train it with labeled examples. This approach is known as Supervised Learning. Even when leveraging transfer learning, you need to train your model with quite a few labeled examples in the domain of your choice. Zero-shot classification is different than that. In this, you use a pre-trained model to classify a given string and some labels of your choice. The model returns you the confidence score for each model.</p>
<p>Let me show you how this works. First, you instantiate an object and assign it a name just like you did in the case of the Sentiment Analysis pipeline.</p>
<div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode numberSource py number-lines code-with-copy"><code class="sourceCode python"><span id="cb4-1">classifier_zero_shot <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pipeline(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"zero-shot-classification"</span>)</span></code></pre></div>
<p>Then you pass a string, along with the labels of your choice to test how well they correspond to your sentence.</p>
<iframe src="https://www.kaggle.com/embed/truthr/a-gentle-introduction-to-the-hugging-face-api?cellId=6&amp;cellIds=25&amp;kernelSessionId=66118660" height="260" style="margin: 0 auto; width: 100%; max-width: 950px;" frameborder="0" scrolling="auto" title="A Gentle Introduction to the Hugging Face API">
</iframe>
<p>See, the given sentence is about a profession, and the model tells you that. And it knows that it is much more related to education than politics.</p>
<p>Essentially, when you are doing Zero-Shot Classification, you are supplying a string to the <code>pipeline</code>, and also labels. The pipeline returns how accurate <strong>those labels are</strong>.</p>
<hr>
</section>
<section id="text-generation" class="level3">
<h3 class="anchored" data-anchor-id="text-generation">Text Generation</h3>
<p>Before I heard about Deep Learning, I heard about Natural Language Processing, because I heard that you can generate text with it! This is the most exciting part of NLP to me, personally.</p>
<p>As the name suggests, this <code>pipeline</code> lets you generate text. It just needs you to supply a prompt, a text that will determine what the generated text will be. Let me show you how.</p>
<div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode numberSource py number-lines code-with-copy"><code class="sourceCode python"><span id="cb5-1">generator <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pipeline(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"text-generation"</span>)</span></code></pre></div>
<iframe src="https://www.kaggle.com/embed/truthr/a-gentle-introduction-to-the-hugging-face-api?cellId=6&amp;cellIds=30&amp;kernelSessionId=66118660" height="230" style="margin: 0 auto; width: 100%; max-width: 950px;" frameborder="0" scrolling="auto" title="A Gentle Introduction to the Hugging Face API">
</iframe>
<p>See what I mean! Even with zero training, it can create logically coherent text that is even interesting to read. Robots will take over writers soon 🤖!</p>
<p>You can control the maximum length of the output of the <code>pipeline</code>, and even ask for multiple possible outputs, like so-</p>
<iframe src="https://www.kaggle.com/embed/truthr/a-gentle-introduction-to-the-hugging-face-api?cellIds=34&amp;kernelSessionId=66128979" height="320" style="margin: 0 auto; width: 100%; max-width: 950px;" frameborder="0" scrolling="auto" title="A Gentle Introduction to the Hugging Face API">
</iframe>
<blockquote class="blockquote">
<p><em>Whoa, it’s poetic!</em></p>
</blockquote>
<p>We can accomplish more interesting things with transfer learning. But that is a story for another day.</p>
<hr>
</section>
<section id="mask-filling" class="level3">
<h3 class="anchored" data-anchor-id="mask-filling">Mask Filling</h3>
<p>In this pipeline, if there is a word that you hide and supply the string with the hidden word, the <code>pipeline</code> will predict that word. This is like magic!</p>
<div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode numberSource py number-lines code-with-copy"><code class="sourceCode python"><span id="cb6-1">unmasker <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pipeline(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"fill-mask"</span>)</span></code></pre></div>
<p>You pass the sentence with the masked word, and it will predict it. You can choose the number of predictions you want to see. You just have to pass a value to the <code>top_k</code> parameter.</p>
<iframe src="https://www.kaggle.com/embed/truthr/a-gentle-introduction-to-the-hugging-face-api?cellIds=41&amp;kernelSessionId=66128979" height="330" style="margin: 0 auto; width: 100%; max-width: 950px;" frameborder="0" scrolling="auto" title="A Gentle Introduction to the Hugging Face API">
</iframe>
<iframe src="https://www.kaggle.com/embed/truthr/a-gentle-introduction-to-the-hugging-face-api?cellId=6&amp;cellIds=40&amp;kernelSessionId=66118660" height="320" style="margin: 0 auto; width: 100%; max-width: 950px;" frameborder="0" scrolling="auto" title="A Gentle Introduction to the Hugging Face API">
</iframe>
<p>It can predict the words quite well. Just remember to mask the word using <code>&lt;mask&gt;</code>.</p>
<hr>
</section>
<section id="named-entity-recognition" class="level3">
<h3 class="anchored" data-anchor-id="named-entity-recognition">Named Entity Recognition</h3>
<p>This <code>pipeline</code> recognizes the proper nouns in your sentence. And it also classifies them. Let’s see an example.</p>
<div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode numberSource py number-lines code-with-copy"><code class="sourceCode python"><span id="cb7-1">ner <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pipeline(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ner"</span>, grouped_entities<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></code></pre></div>
<p>The <code>grouped_entities</code> parameter just ensures that the <code>pipeline</code> can recognize the names that have more than one word, like, you know, Chocolate Factory.</p>
<iframe src="https://www.kaggle.com/embed/truthr/a-gentle-introduction-to-the-hugging-face-api?cellId=6&amp;cellIds=46&amp;kernelSessionId=66118660" height="400" style="margin: 0 auto; width: 100%; max-width: 950px;" frameborder="0" scrolling="auto" title="A Gentle Introduction to the Hugging Face API">
</iframe>
<p>See how it recognizes a person, his profession, and location on its own, and also labels them as “PER”, “ORG”, and “LOC” (meaning location), respectively.</p>
<hr>
</section>
<section id="question-answering" class="level3">
<h3 class="anchored" data-anchor-id="question-answering">Question Answering</h3>
<p>This pipeline provides you with an answer to a question you ask from the context that you provide.</p>
<div class="sourceCode" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode numberSource py number-lines code-with-copy"><code class="sourceCode python"><span id="cb8-1">question_answerer <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pipeline(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"question-answering"</span>)</span></code></pre></div>
<iframe src="https://www.kaggle.com/embed/truthr/a-gentle-introduction-to-the-hugging-face-api?cellId=6&amp;cellIds=51&amp;kernelSessionId=66118660" height="210" style="margin: 0 auto; width: 100%; max-width: 950px;" frameborder="0" scrolling="auto" title="A Gentle Introduction to the Hugging Face API">
</iframe>
<p>It can answer multiple questions from the same prompt.</p>
<iframe src="https://www.kaggle.com/embed/truthr/a-gentle-introduction-to-the-hugging-face-api?cellId=6&amp;cellIds=53&amp;kernelSessionId=66118660" height="210" style="margin: 0 auto; width: 100%; max-width: 950px;" frameborder="0" scrolling="auto" title="A Gentle Introduction to the Hugging Face API">
</iframe>
<hr>
</section>
<section id="summarization" class="level3">
<h3 class="anchored" data-anchor-id="summarization">Summarization</h3>
<p>This is one of the most practical tasks that has existed for a long time. Deep Learning really changes the landscape of the task.</p>
<p>Let’s see it in action.</p>
<div class="sourceCode" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode numberSource py number-lines code-with-copy"><code class="sourceCode python"><span id="cb9-1">summarizer <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pipeline(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"summarization"</span>)</span></code></pre></div>
<p>Let’s summarize a piece of text from a <a href="https://blog.royalsloth.eu/posts/i-wish-i-could-write-this-well/">blog post</a> I recently read.</p>
<iframe src="https://www.kaggle.com/embed/truthr/a-gentle-introduction-to-the-hugging-face-api?cellId=6&amp;cellIds=59&amp;kernelSessionId=66118660" height="650" style="margin: 0 auto; width: 100%; max-width: 950px;" frameborder="0" scrolling="auto" title="A Gentle Introduction to the Hugging Face API">
</iframe>
<p>Now, that’s something! The efficacy of the summarizer really shocked me. It does this task so well.</p>
<hr>
</section>
<section id="translation" class="level3">
<h3 class="anchored" data-anchor-id="translation">Translation</h3>
<p>The translation <code>pipeline</code> translates a piece of text from one language to another. It also lets you choose the language model of your choice.</p>
<p>First, let’s translate a text from English to German. I will use the <a href="https://huggingface.co/Helsinki-NLP/opus-mt-en-de"><code>Helsinki-NLP/opus-mt-en-de</code></a> model for this task.</p>
<div class="sourceCode" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode numberSource py number-lines code-with-copy"><code class="sourceCode python"><span id="cb10-1">translator_de <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pipeline(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"translation"</span>, model<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;">"Helsinki-NLP/opus-mt-en-de"</span>)</span></code></pre></div>
<iframe src="https://www.kaggle.com/embed/truthr/a-gentle-introduction-to-the-hugging-face-api?cellId=6&amp;cellIds=64&amp;kernelSessionId=66118660" height="165" style="margin: 0 auto; width: 100%; max-width: 950px;" frameborder="0" scrolling="auto" title="A Gentle Introduction to the Hugging Face API">
</iframe>
<p>Note that you are not explicitly telling the model about the language of the input language or the output language. A language model is only trained for translating from one language to another. It cannot translate other languages. If you want to translate from German to English, you’d have to use another model from the model hub. You can find all the translation models <a href="https://huggingface.co/models?pipeline_tag=translation">here</a>.</p>
<p>The cool thing is that Hugging Face is not limited to Romance languages or European languages in general. Let me show you by translating a piece of text from Bengali.</p>
<div class="sourceCode" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode numberSource py number-lines code-with-copy"><code class="sourceCode python"><span id="cb11-1">translator_bn <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> pipeline(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"translation"</span>, model<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;">"Helsinki-NLP/opus-mt-bn-en"</span>)</span></code></pre></div>
<iframe src="https://www.kaggle.com/embed/truthr/a-gentle-introduction-to-the-hugging-face-api?cellId=6&amp;cellIds=68&amp;kernelSessionId=66118660" height="165" style="margin: 0 auto; width: 100%; max-width: 950px;" frameborder="0" scrolling="auto" title="A Gentle Introduction to the Hugging Face API">
</iframe>
<blockquote class="blockquote">

</blockquote>
<hr>
</section>
<section id="conclusion" class="level3">
<h3 class="anchored" data-anchor-id="conclusion">Conclusion</h3>
<p>I have shown you several pipeline APIs and what they do and how they work.</p>
<p>Here are the suggested next steps-</p>
<ul>
<li><strong>Experiment.</strong> Play with the <code>pipeline</code>s by yourself, try different things with different parameters, run inference on examples of your own, test edge cases, run wild with it. I believe that is the best way to learn.</li>
<li><strong>Do Projects.</strong> Use the knowledge you gained here in simple projects. We only learn by doing.</li>
<li><strong>Hugging Face Course.</strong> Hugging Face has recently released a <a href="https://huggingface.co/course/chapter1">free course</a> where they teach you about Transformers and their library ecosystem. It is a good next step.</li>
<li><strong>Explore.</strong> Explore the Hugging Face <a href="https://huggingface.co/">website</a>, learn more about their APIs, Services, pre-trained models, and many more things it has to offer.</li>
</ul>
<hr>
<p>If you notice any error, mistake, or typo, please feel free to let me know. If something is not clear, please let me know that as well. I will do my best to correct it and will credit you here.</p>
<p>Let me know if you have any questions at all.</p>
<hr>
<p><em>(Originally <a href="https://www.kaggle.com/truthr/a-gentle-introduction-to-the-hugging-face-api">published as a Notebook</a> on Kaggle.)</em></p>


</section>

 ]]></description>
  <category>deep-learning</category>
  <category>machine-learning</category>
  <category>data-science</category>
  <category>ai</category>
  <category>tutorial</category>
  <category>nlp</category>
  <category>kaggle</category>
  <guid>https://ritog.github.io/posts/intro-to-huggingface-api/2021-06-20-intro-huggingface-api.html</guid>
  <pubDate>Sat, 19 Jun 2021 18:30:00 GMT</pubDate>
  <media:content url="https://ritog.github.io/posts/intro-to-huggingface-api/2021-06-20-intro-huggingface-api-0.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Creating Any Boolean Function</title>
  <dc:creator>Ritobrata Ghosh</dc:creator>
  <link>https://ritog.github.io/posts/nand2tetris_1/2021-06-13-chips-logic-gates-nand2tetris-1.html</link>
  <description><![CDATA[ 




<p>by <a href="https://ritog.github.io">Ritobrata Ghosh</a></p>
<section id="introduction" class="level3">
<h3 class="anchored" data-anchor-id="introduction">Introduction</h3>
<p>Digital electronics is probably the most impactful and widespread technology now. It forms the basis of all of the chips- from ARM microcontrollers to processors in cellphones, all the way to uberpowerful AMD Threadrippers. In all these cases, digital electronics reign supreme.</p>
<p>It is very useful to learn not only about basic principles but also how these principles and the components of Digital Electronics exactly form the basis of the modern world, i.e., how do we go from basic logic gates to fully functional computers.</p>
</section>
<section id="elements-of-computing-systems" class="level3">
<h3 class="anchored" data-anchor-id="elements-of-computing-systems">Elements of Computing Systems</h3>
<p>Digital Electronics is not only important because it is the base of the modern technology that literally governs our lives, but it makes us better as programmers, and computer scientists.</p>
<p>Whether we are self-taught programmers or a person with a 4-year CS degree, we were never taught how we go from basic logic gates to CPUs.</p>
<p>A book that I have come across- <a href="https://mitpress.mit.edu/books/elements-computing-systems-second-edition"><em>The Elements of Computing Systems</em></a> by By Noam Nisan and Shimon Schocken does just that. It teaches you how the basic building blocks of modern computers actually create the computers.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://ritog.github.io/posts/nand2tetris_1/https:/m.media-amazon.com/images/I/71tRTKR3NOL._SL1500_.jpg" class="img-fluid figure-img"></p>
<figcaption class="figure-caption">nand2tetris-book-cover-2ed</figcaption>
</figure>
</div>
<p><em>[Although it shows the new 2nd edition, I am reading the first one]</em></p>
<p>It promises to teach you, actively, how we can start from nothing but a NAND gate and go all the way to a full-fledged computer with an operating system, and a general-purpose programming language that runs on it, which can be used to create anything. The book is also known as <strong><em>nand2tetris</em></strong>.</p>
<p>I have started reading this book and working through it every Sunday, and I have almost finished a chapter.</p>
</section>
<section id="building-gates-from-elementary-gates" class="level3">
<h3 class="anchored" data-anchor-id="building-gates-from-elementary-gates">Building Gates from Elementary Gates</h3>
<p>People who have taken a Digital Architecture class or a Digital Electronics class will know that NAND (NOT AND) gates are called “universal gates” because some combination of them are able to create any other gates. So, when you have a NAND gate with you, you can create a general-purpose computer with it. And the book makes you do that. It makes you create many logic gates starting from AND, NOT, and OR with nothing but a pre-implemented NAND gate.</p>
<p>So, a NAND gate is already implemented and supplied. You first have to create AND, OR, and NOT gates. Then you go on to further create XOR gates, Multiplexors (MUX), Demultiplexors (D-MUX), and multi-bit versions of these gates and basic gates with what you have built previously, viz.&nbsp;AND, OR, NOT, and NAND gates.</p>
<p>This is a fascinating task in itself, and very intellectually stimulating.</p>
<p>This is where the core of the post comes in.</p>
<p>I will show you how to implement any Boolean function with nothing but three logic gates. This is a trick worth knowing.</p>
<p>Let’s start.</p>
<hr>
</section>
<section id="implementing-a-boolean-function" class="level3">
<h3 class="anchored" data-anchor-id="implementing-a-boolean-function">Implementing a Boolean Function</h3>
<section id="design-a-boolean-function" class="level4">
<h4 class="anchored" data-anchor-id="design-a-boolean-function">Design a Boolean Function</h4>
<p>Let’s say we need a Boolean function that behaves in such a way-</p>
<table class="table">
<thead>
<tr class="header">
<th>A</th>
<th>B</th>
<th>C</th>
<th>Y</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
</tr>
<tr class="even">
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
</tr>
<tr class="odd">
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
</tr>
<tr class="even">
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
</tr>
<tr class="odd">
<td>1</td>
<td>0</td>
<td>0</td>
<td>1</td>
</tr>
<tr class="even">
<td>1</td>
<td>0</td>
<td>1</td>
<td>1</td>
</tr>
<tr class="odd">
<td>1</td>
<td>1</td>
<td>0</td>
<td>1</td>
</tr>
<tr class="even">
<td>1</td>
<td>1</td>
<td>1</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>This <em>truth table</em> tells you that we need such a Boolean function that outputs 1 iff- * <em>A</em>, <em>B</em>, and <em>C</em>, three Boolean variables, are all 0 * only <em>A</em> is 1, <em>B</em> and <em>C</em> are 0 * <em>A</em> and <em>C</em> are 1, <em>B</em> is 0 * <em>A</em> and <em>B</em> are 1, <em>C</em> is 0</p>
<p>Now, in some situations, you might need to define a Boolean function that behaves as you expect. Do not worry about what this function is doing. Let’s focus on the implementation part.</p>
</section>
<section id="boolean-expression" class="level4">
<h4 class="anchored" data-anchor-id="boolean-expression">Boolean Expression</h4>
<p>I am assuming that you already know about the basic gates, and how they function.</p>
<p>So, in the first step to build a Boolean function, you must create the Boolean expression. Just like a Boolean variable can have two values (0, 1), and a Boolean function can only output two values (0, 1, duh!), a Boolean expression always evaluates to either 0 or 1.</p>
<p>How to actually do it?</p>
<ol type="1">
<li>You should just note in which cases the function outputs a 1. Focus just on those.</li>
<li>Note which variables are on (1) and which are off (0).</li>
<li>Keep the variables unchanged which are 1 in this case, and take a negation of those which are off (in electronics, you would put them through NOT).</li>
<li>Multiply them together.</li>
<li>For these products for each 1 in the output, just add them together.</li>
</ol>
<p>That’s it. You have got your Boolean expression.</p>
<p>Let me go through it step by step.</p>
<p>In the first occurrence of 1 in the output, we see that all the input variables are off. So, we get a*, b*, and c*, where a, b, and c are the variables representing inputs <em>A</em>, <em>B</em>, and <em>C</em>, respectively, and x* is the negation of x. We multiply them together, and we get a*b*c*.</p>
<p>In the second occurrence of 1, in a similar manner, we get- ab*c*.</p>
<p>For the third and fourth occurrences of 1, we get ab*c, and abc*, respectively.</p>
<p>We have to add them. And doing so, we get-</p>
<p><img src="https://latex.codecogs.com/png.latex?%20y%20=%20%5Coverline%7Ba%7D%5Coverline%7Bb%7D%5Coverline%7Bc%7D%20+%20a%5Coverline%7Bb%7D%5Coverline%7Bc%7D%20+%20a%5Coverline%7Bb%7Dc%20+%20ab%5Coverline%7Bc%7D%20"></p>
<p>[You are required to write cases in the proper order. The first of three variable has these values row-wise- 0-0-0-0-1-1-1-1, the second one varies- 0-0-1-1-0-0-1-1, and the third one- 0-1-0-1-0-1-0-1.]</p>
</section>
<section id="implementation" class="level4">
<h4 class="anchored" data-anchor-id="implementation">Implementation</h4>
<p>You might be already aware that negation is passing through a NOT gate, multiplying is just passing through an AND gate, and adding is just an OR gate.</p>
<p>The first <em>component</em> a*b*c* can be obtained in this way-</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://ritog.github.io/posts/nand2tetris_1/https:/cdn.hashnode.com/res/hashnode/image/upload/v1623507789933/QBItJ0Vmd.png" class="img-fluid figure-img"></p>
<figcaption class="figure-caption">image.png</figcaption>
</figure>
</div>
<p>And here are the second, third, and fourth components-</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://ritog.github.io/posts/nand2tetris_1/https:/cdn.hashnode.com/res/hashnode/image/upload/v1623507861780/SGdZszA-c.png" class="img-fluid figure-img"></p>
<figcaption class="figure-caption">image.png</figcaption>
</figure>
</div>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://ritog.github.io/posts/nand2tetris_1/https:/cdn.hashnode.com/res/hashnode/image/upload/v1623508014150/-0UIiS7o5.png" class="img-fluid figure-img"></p>
<figcaption class="figure-caption">image.png</figcaption>
</figure>
</div>
<p>And,</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://ritog.github.io/posts/nand2tetris_1/https:/cdn.hashnode.com/res/hashnode/image/upload/v1623508144340/0hlCdyidE.png" class="img-fluid figure-img"></p>
<figcaption class="figure-caption">image.png</figcaption>
</figure>
</div>
<p>Now, we have to add them all together, i.e.&nbsp;put these components through an OR gate. The output of the OR gate will be our final output.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://ritog.github.io/posts/nand2tetris_1/https:/cdn.hashnode.com/res/hashnode/image/upload/v1623566604394/Cm-9WW_ftX.png" class="img-fluid figure-img"></p>
<figcaption class="figure-caption">image.png</figcaption>
</figure>
</div>
<p>Our final output.</p>
</section>
<section id="hdl-implement-and-test" class="level4">
<h4 class="anchored" data-anchor-id="hdl-implement-and-test">HDL: Implement and Test</h4>
<p>Now, if you have ICs lying around, you can quickly test this with a power supply or a 5V cell, and some wires. You will also need a multimeter or LED bulbs to check your output.</p>
<p>But, remember, we are building a computer from scratch when following this book. Using thousands of ICs to build a computer is not slightly practical unless you happen to have a contract with TSMC!</p>
<p>Something called HDL (Hardware Description Language) is used. It is an intuitive, high-level, special-purpose programming language that you use to design and test chips, and use previously created chips.</p>
<p>It is implemented in Java, but you do not have to worry about its implementation, you just need to use it. A GUI program is also supplied to do load and test chips.</p>
<p>For example, given a NAND gate, you will design an AND gate this way.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://ritog.github.io/posts/nand2tetris_1/https:/cdn.hashnode.com/res/hashnode/image/upload/v1623567491868/2i-eaHy4V.png" class="img-fluid figure-img"></p>
<figcaption class="figure-caption">image.png</figcaption>
</figure>
</div>
<p>As you can see, it is very intuitive, and you can pick it up in 20 minutes.</p>
<p>And, this is how you’d test this:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://ritog.github.io/posts/nand2tetris_1/https:/cdn.hashnode.com/res/hashnode/image/upload/v1623567613326/EIaikZlbD.png" class="img-fluid figure-img"></p>
<figcaption class="figure-caption">image.png</figcaption>
</figure>
</div>
<p>To write our custom function in HDL, we would do-</p>
<div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource hdl number-lines code-with-copy"><code class="sourceCode"><span id="cb1-1">// Custom.hdl</span>
<span id="cb1-2">// this is a part of Hashnode blog Convoluted demo</span>
<span id="cb1-3"></span>
<span id="cb1-4">CHIP Custom {</span>
<span id="cb1-5">    IN a, b, c;</span>
<span id="cb1-6">    OUT out;</span>
<span id="cb1-7"></span>
<span id="cb1-8">    PARTS:</span>
<span id="cb1-9">    Not(in=a, out=nota);</span>
<span id="cb1-10">    Not(in=b, out=notb);</span>
<span id="cb1-11">    Not(in=c, out=notc);</span>
<span id="cb1-12">    And(a=nota, b=notb, out=notanotb);</span>
<span id="cb1-13">    And(a=notanotb, b=notc, out=w1);</span>
<span id="cb1-14">    And(a=a, b=notb, out=anotb);</span>
<span id="cb1-15">    And(a=anotb, b=notc, out=w2);</span>
<span id="cb1-16">    And(a=anotb, b=c, out=w3);</span>
<span id="cb1-17">    And(a=a, b=b, out=ab);</span>
<span id="cb1-18">    And(a=ab, b=notc, out=w4);</span>
<span id="cb1-19">    Or8Way(in[0]=w1, in[1]=w2, in[2]=w3, in[3]=w4, out=out);</span>
<span id="cb1-20">}</span></code></pre></div>
<p>And as this is a custom chip, the <code>.tst</code> test file, and <code>.cmp</code> compare file are not supplied. So, for testing this chip, I wrote my own.</p>
<p>Here is the test (<code>.tst</code>) file-</p>
<div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource hdl number-lines code-with-copy"><code class="sourceCode"><span id="cb2-1">// Custom.tst</span>
<span id="cb2-2">// test file for testing custom chip</span>
<span id="cb2-3">// could be found at- https://gist.github.com/ghosh-r/c4e6f5ceb1e7ea2e3ba3601c9de121be</span>
<span id="cb2-4"></span>
<span id="cb2-5">// test file for a custom chip in Convoluted, a Hashnode blog</span>
<span id="cb2-6"></span>
<span id="cb2-7">load Custom.hdl,</span>
<span id="cb2-8">output-file Custom.out,</span>
<span id="cb2-9">compare-to Custom.cmp,</span>
<span id="cb2-10">output-list a%B3.1.3 b%B3.1.3 c%B3.1.3 out%B3.1.3;</span>
<span id="cb2-11"></span>
<span id="cb2-12">set a 0,</span>
<span id="cb2-13">set b 0,</span>
<span id="cb2-14">set c 0,</span>
<span id="cb2-15">eval,</span>
<span id="cb2-16">output;</span>
<span id="cb2-17"></span>
<span id="cb2-18">set a 0,</span>
<span id="cb2-19">set b 0,</span>
<span id="cb2-20">set c 1,</span>
<span id="cb2-21">eval,</span>
<span id="cb2-22">output;</span>
<span id="cb2-23"></span>
<span id="cb2-24">set a 0,</span>
<span id="cb2-25">set b 1,</span>
<span id="cb2-26">set c 0,</span>
<span id="cb2-27">eval,</span>
<span id="cb2-28">output;</span>
<span id="cb2-29"></span>
<span id="cb2-30">set a 0,</span>
<span id="cb2-31">set b 1,</span>
<span id="cb2-32">set c 1,</span>
<span id="cb2-33">eval,</span>
<span id="cb2-34">output; </span>
<span id="cb2-35"></span>
<span id="cb2-36">set a 1,</span>
<span id="cb2-37">set b 0,</span>
<span id="cb2-38">set c 0,</span>
<span id="cb2-39">eval,</span>
<span id="cb2-40">output;</span>
<span id="cb2-41"></span>
<span id="cb2-42">set a 1,</span>
<span id="cb2-43">set b 0,</span>
<span id="cb2-44">set c 1,</span>
<span id="cb2-45">eval,</span>
<span id="cb2-46">output;</span>
<span id="cb2-47"></span>
<span id="cb2-48">set a 1,</span>
<span id="cb2-49">set b 1,</span>
<span id="cb2-50">set c 0,</span>
<span id="cb2-51">eval,</span>
<span id="cb2-52">output;</span>
<span id="cb2-53"></span>
<span id="cb2-54">set a 1,</span>
<span id="cb2-55">set b 1,</span>
<span id="cb2-56">set c 1,</span>
<span id="cb2-57">eval,</span>
<span id="cb2-58">output;</span></code></pre></div>
<p>And here is the compare (<code>.cmp</code>) file. It contains the truth table that we expect.</p>
<div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode numberSource hdl number-lines code-with-copy"><code class="sourceCode"><span id="cb3-1">// Custom.cmp</span>
<span id="cb3-2">// compare file for chip Custom.hdl</span>
<span id="cb3-3">// found at- https://gist.github.com/ghosh-r/c4e6f5ceb1e7ea2e3ba3601c9de121be</span>
<span id="cb3-4">// test file at- https://gist.github.com/ghosh-r/cef52b9f6ac017e00d64460b025a53fe</span>
<span id="cb3-5"></span>
<span id="cb3-6">|   a   |   b   |   c   |  out  |</span>
<span id="cb3-7">|   0   |   0   |   0   |   1   |</span>
<span id="cb3-8">|   0   |   0   |   1   |   0   |</span>
<span id="cb3-9">|   0   |   1   |   0   |   0   |</span>
<span id="cb3-10">|   0   |   1   |   1   |   0   |</span>
<span id="cb3-11">|   1   |   0   |   0   |   1   |</span>
<span id="cb3-12">|   1   |   0   |   1   |   1   |</span>
<span id="cb3-13">|   1   |   1   |   0   |   1   |</span>
<span id="cb3-14">|   1   |   1   |   1   |   0   |</span></code></pre></div>
<p>Note that the text in Compare files is not robust to whitespaces.</p>
<p>It will be compared with the output file generated by the simulator.</p>
<p>Here’s how the successful run looks like-</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://ritog.github.io/posts/nand2tetris_1/https:/cdn.hashnode.com/res/hashnode/image/upload/v1623576505734/bj93xn62K.gif" class="img-fluid figure-img"></p>
<figcaption class="figure-caption">final_60c5cd572911290063ac8055_216317.gif</figcaption>
</figure>
</div>
</section>
<section id="another-example-xor-gate" class="level4">
<h4 class="anchored" data-anchor-id="another-example-xor-gate">Another Example: XOR Gate</h4>
<p>Suppose you want to implement a XOR gate from basic gates. And the truth-table would be-</p>
<table class="table">
<thead>
<tr class="header">
<th>A</th>
<th>B</th>
<th>Y</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
<tr class="even">
<td>0</td>
<td>1</td>
<td>1</td>
</tr>
<tr class="odd">
<td>1</td>
<td>0</td>
<td>1</td>
</tr>
<tr class="even">
<td>1</td>
<td>1</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>This will be your Boolean expression-</p>
<p><img src="https://latex.codecogs.com/png.latex?%20y%20=%20%5Coverline%7Ba%7Db%20+%20a%5Coverline%7Bb%7D%20"></p>
<p>And this will be your HDL implementation.</p>
<div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode numberSource hdl number-lines code-with-copy"><code class="sourceCode"><span id="cb4-1">// Xor.hdl</span>
<span id="cb4-2"></span>
<span id="cb4-3">CHIP Xor {</span>
<span id="cb4-4">    IN a, b;</span>
<span id="cb4-5">    OUT out;</span>
<span id="cb4-6"></span>
<span id="cb4-7">    PARTS:</span>
<span id="cb4-8">    Not(in=a, out=nota);</span>
<span id="cb4-9">    Not(in=b, out=notb);</span>
<span id="cb4-10">    And(a=a, b=notb, out=w1);</span>
<span id="cb4-11">    And(a=nota, b=b, out=w2);</span>
<span id="cb4-12">    Or(a=w1, b=w2, out=out);</span>
<span id="cb4-13">}</span></code></pre></div>
<hr>
</section>
</section>
<section id="conclusion" class="level3">
<h3 class="anchored" data-anchor-id="conclusion">Conclusion</h3>
<p>I showed you how to implement any Boolean function with nothing but three elementary logic gates. However, you should keep in mind that this approach is impractical when there are more variables, and the chip you want is more complicated.</p>
<hr>
<p>Follow the blog to get more similar posts.</p>
<p>Follow me on <a href="https://twitter.com/AllesistKode">Twitter</a> or connect with me on <a href="https://www.linkedin.com/in/ritobrata-ghosh/">LinkedIn</a>.</p>


</section>

<div id="quarto-appendix" class="default"><section class="quarto-appendix-contents"><h2 class="anchored quarto-appendix-heading">Reuse</h2><div id="quarto-reuse" class="quarto-appendix-contents"><div>CC-BY-NC-SA</div></div></section></div> ]]></description>
  <category>nand2tetris</category>
  <category>computer-science</category>
  <category>electronics</category>
  <category>computation</category>
  <guid>https://ritog.github.io/posts/nand2tetris_1/2021-06-13-chips-logic-gates-nand2tetris-1.html</guid>
  <pubDate>Sat, 12 Jun 2021 18:30:00 GMT</pubDate>
  <media:content url="https://ritog.github.io/posts/nand2tetris_1/2021-06-13-chips-logic-gates-nand2tetris-1-1.png" medium="image" type="image/png" height="76" width="144"/>
</item>
</channel>
</rss>
