Files
pylib/docs/build/html/_modules/function.html

351 lines
25 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>function &#8212; pylib 2019.5.19 documentation</title>
<link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script type="text/javascript" src="../_static/jquery.js"></script>
<script type="text/javascript" src="../_static/underscore.js"></script>
<script type="text/javascript" src="../_static/doctools.js"></script>
<script type="text/javascript" src="../_static/language_data.js"></script>
<script async="async" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="stylesheet" href="../_static/custom.css" type="text/css" />
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
</head><body>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for function</h1><div class="highlight"><pre>
<span></span><span class="ch">#!/usr/bin/env python</span>
<span class="c1"># -*- coding: utf-8 -*-</span>
<span class="sd">&quot;&quot;&quot;Mathematical equations.</span>
<span class="sd">:Date: 2019-11-04</span>
<span class="sd">.. module:: function</span>
<span class="sd"> :platform: *nix, Windows</span>
<span class="sd"> :synopsis: Mathematical equations.</span>
<span class="sd">.. moduleauthor:: Daniel Weschke &lt;daniel.weschke@directbox.de&gt;</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">math</span>
<span class="kn">from</span> <span class="nn">pylib.mathematics</span> <span class="k">import</span> <span class="n">lcm</span>
<div class="viewcode-block" id="transformation"><a class="viewcode-back" href="../function.html#function.transformation">[docs]</a><span class="k">def</span> <span class="nf">transformation</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">scale_vertical</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">scale_horizontal</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
<span class="n">shift_horizontal</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">shift_vertical</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Transform functions.</span>
<span class="sd"> :param f: function or list of functions</span>
<span class="sd"> :type f: function or list</span>
<span class="sd"> :param scale_vertical: &quot;a&quot; scale factor in vertical direction (default</span>
<span class="sd"> = 1)</span>
<span class="sd"> :type height: float</span>
<span class="sd"> :param scale_horizontal: &quot;b&quot; scale factor in horizontal direction</span>
<span class="sd"> (default = 1)</span>
<span class="sd"> :type height: float</span>
<span class="sd"> :param shift_horizontal: &quot;c&quot; shift factor in horizontal direction</span>
<span class="sd"> (default = 0)</span>
<span class="sd"> :type height: float</span>
<span class="sd"> :param shift_vertical: &quot;d&quot; shift factor in vertical direction (default</span>
<span class="sd"> = 0)</span>
<span class="sd"> :type height: float</span>
<span class="sd"> :returns: transformed function or list of transformed functions</span>
<span class="sd"> :rtype: function or list</span>
<span class="sd"> .. math::</span>
<span class="sd"> y = a \, f(b\,(x-c)) + d</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># shorter variables</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">scale_vertical</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">scale_horizontal</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">shift_horizontal</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">shift_vertical</span>
<span class="c1"># check if f is a function than put it in a list and return only</span>
<span class="c1"># the function, not the one element list</span>
<span class="k">if</span> <span class="n">callable</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
<span class="k">return</span> <span class="n">transformation</span><span class="p">(</span>
<span class="p">[</span><span class="n">f</span><span class="p">],</span> <span class="n">scale_vertical</span><span class="o">=</span><span class="n">a</span><span class="p">,</span> <span class="n">scale_horizontal</span><span class="o">=</span><span class="n">b</span><span class="p">,</span> <span class="n">shift_horizontal</span><span class="o">=</span><span class="n">c</span><span class="p">,</span> <span class="n">shift_vertical</span><span class="o">=</span><span class="n">d</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># otherwise assume list of functions</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">f</span><span class="p">:</span> <span class="c1"># if f is empty. End of the recursive fucntion</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">return</span> <span class="p">[</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">t</span><span class="p">:</span> <span class="n">a</span><span class="o">*</span><span class="n">f</span><span class="p">[</span><span class="mi">0</span><span class="p">](</span><span class="n">b</span><span class="o">*</span><span class="p">(</span><span class="n">x</span><span class="o">-</span><span class="n">c</span><span class="p">),</span> <span class="n">t</span><span class="p">)</span><span class="o">+</span><span class="n">d</span><span class="p">]</span> <span class="o">+</span>\
<span class="n">transformation</span><span class="p">(</span>
<span class="n">f</span><span class="p">[</span><span class="mi">1</span><span class="p">:],</span> <span class="n">scale_vertical</span><span class="o">=</span><span class="n">a</span><span class="p">,</span> <span class="n">scale_horizontal</span><span class="o">=</span><span class="n">b</span><span class="p">,</span> <span class="n">shift_horizontal</span><span class="o">=</span><span class="n">c</span><span class="p">,</span> <span class="n">shift_vertical</span><span class="o">=</span><span class="n">d</span><span class="p">)</span></div>
<div class="viewcode-block" id="sine_wave"><a class="viewcode-back" href="../function.html#function.sine_wave">[docs]</a><span class="k">def</span> <span class="nf">sine_wave</span><span class="p">(</span><span class="n">A</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">f</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">phi</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">D</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">degree</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;A sine wave or sinusoid is a mathematical curve that describes a</span>
<span class="sd"> smooth periodic oscillation.</span>
<span class="sd"> :param A: amplitude</span>
<span class="sd"> :type A: float or int</span>
<span class="sd"> :param k: (angular) wave number</span>
<span class="sd"> :type k: float or int</span>
<span class="sd"> :param f: ordinary frequency</span>
<span class="sd"> :type f: float or int</span>
<span class="sd"> :param phi: phase</span>
<span class="sd"> :type phi: float or int</span>
<span class="sd"> :param D: non-zero center amplitude</span>
<span class="sd"> :type D: float or int</span>
<span class="sd"> :param degree: boolean to switch between radians and degree. If</span>
<span class="sd"> False phi is interpreted in radians and if True then phi is</span>
<span class="sd"> interpreted in degrees.</span>
<span class="sd"> :type degree: bool</span>
<span class="sd"> :results: sine wave function of spatial variable x and optional</span>
<span class="sd"> time t</span>
<span class="sd"> In general, the function is:</span>
<span class="sd"> .. math::</span>
<span class="sd"> y(x,t) = A\sin(kx + 2\pi f t + \varphi) + D \\</span>
<span class="sd"> y(x,t) = A\sin(kx + \omega t + \varphi) + D</span>
<span class="sd"> where:</span>
<span class="sd"> * A, amplitude, the peak deviation of the function from zero.</span>
<span class="sd"> * f, ordinary frequency, the number of oscillations (cycles) that</span>
<span class="sd"> occur each second of time.</span>
<span class="sd"> * ω = 2πf, angular frequency, the rate of change of the function</span>
<span class="sd"> argument in units of radians per second. If ω &lt; 0 the wave is</span>
<span class="sd"> moving to the right, if ω &gt; 0 the wave is moving to the left.</span>
<span class="sd"> * φ, phase, specifies (in radians) where in its cycle the</span>
<span class="sd"> oscillation is at t = 0.</span>
<span class="sd"> * x, spatial variable that represents the position on the</span>
<span class="sd"> dimension on which the wave propagates.</span>
<span class="sd"> * k, characteristic parameter called wave number (or angular wave</span>
<span class="sd"> number), which represents the proportionality between the</span>
<span class="sd"> angular frequency ω and the linear speed (speed of propagation)</span>
<span class="sd"> ν.</span>
<span class="sd"> * D, non-zero center amplitude.</span>
<span class="sd"> The wavenumber is related to the angular frequency by:</span>
<span class="sd"> .. math::</span>
<span class="sd"> k={\omega \over v}={2\pi f \over v}={2\pi \over \lambda }</span>
<span class="sd"> where λ (lambda) is the wavelength, f is the frequency, and v is the</span>
<span class="sd"> linear speed.</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`function_cosine_wave_degree`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">degree</span><span class="p">:</span>
<span class="n">phi</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">radians</span><span class="p">(</span><span class="n">phi</span><span class="p">)</span>
<span class="k">return</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="mi">0</span><span class="p">:</span> <span class="n">A</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">k</span><span class="o">*</span><span class="n">x</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="o">*</span><span class="n">f</span><span class="o">*</span><span class="n">t</span> <span class="o">+</span> <span class="n">phi</span><span class="p">)</span> <span class="o">+</span> <span class="n">D</span></div>
<div class="viewcode-block" id="cosine_wave"><a class="viewcode-back" href="../function.html#function.cosine_wave">[docs]</a><span class="k">def</span> <span class="nf">cosine_wave</span><span class="p">(</span><span class="n">A</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">f</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">phi</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">D</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">degree</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;A cosine wave is said to be sinusoidal, because,</span>
<span class="sd"> :math:`\cos(x) = \sin(x + \pi/2)`, which is also a sine wave with a</span>
<span class="sd"> phase-shift of π/2 radians. Because of this head start, it is often</span>
<span class="sd"> said that the cosine function leads the sine function or the sine</span>
<span class="sd"> lags the cosine.</span>
<span class="sd"> :param A: amplitude</span>
<span class="sd"> :type A: float or int</span>
<span class="sd"> :param k: (angular) wave number</span>
<span class="sd"> :type k: float or int</span>
<span class="sd"> :param f: ordinary frequency</span>
<span class="sd"> :type f: float or int</span>
<span class="sd"> :param phi: phase</span>
<span class="sd"> :type phi: float or int</span>
<span class="sd"> :param D: non-zero center amplitude</span>
<span class="sd"> :type D: float or int</span>
<span class="sd"> :param degree: boolean to switch between radians and degree. If</span>
<span class="sd"> False phi is interpreted in radians and if True then phi is</span>
<span class="sd"> interpreted in degrees.</span>
<span class="sd"> :type degree: bool</span>
<span class="sd"> :results: sine wave function of spatial variable x and optional</span>
<span class="sd"> time t</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`function_sine_wave_degree`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">degree</span><span class="p">:</span>
<span class="n">phi</span> <span class="o">=</span> <span class="n">phi</span> <span class="o">+</span> <span class="mi">90</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">phi</span> <span class="o">=</span> <span class="n">phi</span> <span class="o">+</span> <span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span>
<span class="k">return</span> <span class="n">sine_wave</span><span class="p">(</span><span class="n">A</span><span class="o">=</span><span class="n">A</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="n">k</span><span class="p">,</span> <span class="n">f</span><span class="o">=</span><span class="n">f</span><span class="p">,</span> <span class="n">phi</span><span class="o">=</span><span class="n">phi</span><span class="p">,</span> <span class="n">D</span><span class="o">=</span><span class="n">D</span><span class="p">,</span> <span class="n">degree</span><span class="o">=</span><span class="n">degree</span><span class="p">)</span></div>
<span class="c1">#</span>
<span class="c1"># Parametric equations</span>
<span class="c1"># roulette</span>
<span class="c1">#</span>
<div class="viewcode-block" id="hypotrochoid"><a class="viewcode-back" href="../function.html#function.hypotrochoid">[docs]</a><span class="k">def</span> <span class="nf">hypotrochoid</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">d</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Hypotrochoid</span>
<span class="sd"> A point is attached with a distance d from the center of a circle</span>
<span class="sd"> of radius r. The circle is rolling around the inside of a fixed</span>
<span class="sd"> circle of radius R.</span>
<span class="sd"> :param R: radius of the fixed exterior circle</span>
<span class="sd"> :type R: float</span>
<span class="sd"> :param r: radius of the rolling circle inside of the fixed circle</span>
<span class="sd"> :typre r: float</span>
<span class="sd"> :param d: distance from the center of the interior circle</span>
<span class="sd"> :type d: float</span>
<span class="sd"> :results: functions for x of theta and y of theta</span>
<span class="sd"> :rtype: tuple</span>
<span class="sd"> .. math::</span>
<span class="sd"> x(\theta) = (R - r)\cos\theta + d\cos\left(\frac{R-r}{r}\theta\right) \\</span>
<span class="sd"> y(\theta) = (R - r)\sin\theta - d\sin\left(\frac{R-r}{r}\theta\right) \\</span>
<span class="sd"> \theta = \left[0, 2\pi\frac{\mathrm{lcm}(r, R)}{R}\right]</span>
<span class="sd"> ::</span>
<span class="sd"> * * *</span>
<span class="sd"> * R *</span>
<span class="sd"> * *</span>
<span class="sd"> * * * *</span>
<span class="sd"> * * r **</span>
<span class="sd"> * * .... *</span>
<span class="sd"> * * d *</span>
<span class="sd"> * * **</span>
<span class="sd"> * * * *</span>
<span class="sd"> * *</span>
<span class="sd"> * *</span>
<span class="sd"> * * *</span>
<span class="sd"> &gt;&gt;&gt; x, y = hyotrochoid(20, 6, 6)[:1]</span>
<span class="sd"> &gt;&gt;&gt; x, y, theta_end = hyotrochoid(20, 6, 6)</span>
<span class="sd"> .. seealso::</span>
<span class="sd"> :meth:`mathematics.lcm`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">theta</span><span class="p">:</span> <span class="p">(</span><span class="n">R</span><span class="o">-</span><span class="n">r</span><span class="p">)</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">+</span> <span class="n">d</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">((</span><span class="n">R</span><span class="o">-</span><span class="n">r</span><span class="p">)</span><span class="o">/</span><span class="n">r</span> <span class="o">*</span> <span class="n">theta</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">theta</span><span class="p">:</span> <span class="p">(</span><span class="n">R</span><span class="o">-</span><span class="n">r</span><span class="p">)</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">-</span> <span class="n">d</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">((</span><span class="n">R</span><span class="o">-</span><span class="n">r</span><span class="p">)</span><span class="o">/</span><span class="n">r</span> <span class="o">*</span> <span class="n">theta</span><span class="p">)</span>
<span class="n">theta_end</span> <span class="o">=</span> <span class="mi">2</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="o">*</span><span class="n">lcm</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">R</span><span class="p">)</span><span class="o">/</span><span class="n">R</span>
<span class="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">theta_end</span></div>
<div class="viewcode-block" id="epitrochoid"><a class="viewcode-back" href="../function.html#function.epitrochoid">[docs]</a><span class="k">def</span> <span class="nf">epitrochoid</span><span class="p">(</span><span class="n">R</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">d</span><span class="p">):</span>
<span class="sa">r</span><span class="sd">&quot;&quot;&quot;Epitrochoid</span>
<span class="sd"> A point is attached with a distance d from the center of a circle</span>
<span class="sd"> of radius r. The circle is rolling around the outside of a fixed</span>
<span class="sd"> circle of radius R.</span>
<span class="sd"> :param R: radius of the fixed interior circle</span>
<span class="sd"> :type R: float</span>
<span class="sd"> :param r: radius of the rolling circle outside of the fixed circle</span>
<span class="sd"> :typre r: float</span>
<span class="sd"> :param d: distance from the center of the exterior circle</span>
<span class="sd"> :type d: float</span>
<span class="sd"> :results: functions for x of theta and y of theta</span>
<span class="sd"> :rtype: tuple</span>
<span class="sd"> .. math::</span>
<span class="sd"> x(\theta) = (R + r)\cos\theta - d\cos\left(\frac{R+r}{r}\theta\right) \\</span>
<span class="sd"> y(\theta) = (R + r)\sin\theta - d\sin\left(\frac{R+r}{r}\theta\right) \\</span>
<span class="sd"> \theta = \left[0, 2\pi\right]</span>
<span class="sd"> ::</span>
<span class="sd"> * * *</span>
<span class="sd"> * R *</span>
<span class="sd"> * *</span>
<span class="sd"> * * * *</span>
<span class="sd"> * * * r *</span>
<span class="sd"> * ** .... *</span>
<span class="sd"> * ** d *</span>
<span class="sd"> * * * *</span>
<span class="sd"> * * * *</span>
<span class="sd"> * *</span>
<span class="sd"> * *</span>
<span class="sd"> * * *</span>
<span class="sd"> &gt;&gt;&gt; x, y = epitrochoid(3, 1, 0.5)[:1]</span>
<span class="sd"> &gt;&gt;&gt; x, y, theta_end = epitrochoid(3, 1, 0.5)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">x</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">theta</span><span class="p">:</span> <span class="p">(</span><span class="n">R</span><span class="o">+</span><span class="n">r</span><span class="p">)</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">-</span> <span class="n">d</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">cos</span><span class="p">((</span><span class="n">R</span><span class="o">+</span><span class="n">r</span><span class="p">)</span><span class="o">/</span><span class="n">r</span> <span class="o">*</span> <span class="n">theta</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">theta</span><span class="p">:</span> <span class="p">(</span><span class="n">R</span><span class="o">+</span><span class="n">r</span><span class="p">)</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">)</span> <span class="o">-</span> <span class="n">d</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">((</span><span class="n">R</span><span class="o">+</span><span class="n">r</span><span class="p">)</span><span class="o">/</span><span class="n">r</span> <span class="o">*</span> <span class="n">theta</span><span class="p">)</span>
<span class="n">theta_end</span> <span class="o">=</span> <span class="mi">2</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span>
<span class="k">return</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">theta_end</span></div>
</pre></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h1 class="logo"><a href="../index.html">pylib</a></h1>
<h3>Navigation</h3>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="../index.html">Documentation overview</a><ul>
<li><a href="index.html">Module code</a><ul>
</ul></li>
</ul></li>
</ul>
</div>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer">
&copy;2019, Daniel Weschke.
|
Powered by <a href="http://sphinx-doc.org/">Sphinx 2.2.0</a>
&amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.12</a>
</div>
</body>
</html>