<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="generator" content="pdoc 14.6.0"/>
    <title>pyerrors.fits API documentation</title>

    <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}</style>
    <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pdoc-code .cp{color:#9C6500}.pdoc-code .cpf{color:#3D7B7B; font-style:italic}.pdoc-code .c1{color:#3D7B7B; font-style:italic}.pdoc-code .cs{color:#3D7B7B; font-style:italic}.pdoc-code .gd{color:#A00000}.pdoc-code .ge{font-style:italic}.pdoc-code .gr{color:#E40000}.pdoc-code .gh{color:#000080; font-weight:bold}.pdoc-code .gi{color:#008400}.pdoc-code .go{color:#717171}.pdoc-code .gp{color:#000080; font-weight:bold}.pdoc-code .gs{font-weight:bold}.pdoc-code .gu{color:#800080; font-weight:bold}.pdoc-code .gt{color:#0044DD}.pdoc-code .kc{color:#008000; font-weight:bold}.pdoc-code .kd{color:#008000; font-weight:bold}.pdoc-code .kn{color:#008000; font-weight:bold}.pdoc-code .kp{color:#008000}.pdoc-code .kr{color:#008000; font-weight:bold}.pdoc-code .kt{color:#B00040}.pdoc-code .m{color:#666666}.pdoc-code .s{color:#BA2121}.pdoc-code .na{color:#687822}.pdoc-code .nb{color:#008000}.pdoc-code .nc{color:#0000FF; font-weight:bold}.pdoc-code .no{color:#880000}.pdoc-code .nd{color:#AA22FF}.pdoc-code .ni{color:#717171; font-weight:bold}.pdoc-code .ne{color:#CB3F38; font-weight:bold}.pdoc-code .nf{color:#0000FF}.pdoc-code .nl{color:#767600}.pdoc-code .nn{color:#0000FF; font-weight:bold}.pdoc-code .nt{color:#008000; font-weight:bold}.pdoc-code .nv{color:#19177C}.pdoc-code .ow{color:#AA22FF; font-weight:bold}.pdoc-code .w{color:#bbbbbb}.pdoc-code .mb{color:#666666}.pdoc-code .mf{color:#666666}.pdoc-code .mh{color:#666666}.pdoc-code .mi{color:#666666}.pdoc-code .mo{color:#666666}.pdoc-code .sa{color:#BA2121}.pdoc-code .sb{color:#BA2121}.pdoc-code .sc{color:#BA2121}.pdoc-code .dl{color:#BA2121}.pdoc-code .sd{color:#BA2121; font-style:italic}.pdoc-code .s2{color:#BA2121}.pdoc-code .se{color:#AA5D1F; font-weight:bold}.pdoc-code .sh{color:#BA2121}.pdoc-code .si{color:#A45A77; font-weight:bold}.pdoc-code .sx{color:#008000}.pdoc-code .sr{color:#A45A77}.pdoc-code .s1{color:#BA2121}.pdoc-code .ss{color:#19177C}.pdoc-code .bp{color:#008000}.pdoc-code .fm{color:#0000FF}.pdoc-code .vc{color:#19177C}.pdoc-code .vg{color:#19177C}.pdoc-code .vi{color:#19177C}.pdoc-code .vm{color:#19177C}.pdoc-code .il{color:#666666}</style>
    <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
    <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;z-index:999;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem;}.git-button{display:none !important;}nav input[type="search"]{max-width:77%;}nav input[type="search"]:first-child{margin-top:-6px;}nav input[type="search"]:valid ~ *{display:none !important;}}@media (min-width:770px){:root{--sidebar-width:clamp(12.5rem, 28vw, 22rem);}nav{position:fixed;overflow:auto;height:100vh;width:var(--sidebar-width);}main, header{padding:3rem 2rem 3rem calc(var(--sidebar-width) + 3rem);width:calc(54rem + var(--sidebar-width));max-width:100%;}header + main{margin-top:-4rem;}#navtoggle{display:none;}}#togglestate{position:absolute;height:0;opacity:0;}nav.pdoc{--pad:clamp(0.5rem, 2vw, 1.75rem);--indent:1.5rem;background-color:var(--accent);border-right:1px solid var(--accent2);box-shadow:0 0 20px rgba(50, 50, 50, .2) inset;padding:0 0 0 var(--pad);overflow-wrap:anywhere;scrollbar-width:thin; scrollbar-color:var(--accent2) transparent; z-index:1}nav.pdoc::-webkit-scrollbar{width:.4rem; }nav.pdoc::-webkit-scrollbar-thumb{background-color:var(--accent2); }nav.pdoc > div{padding:var(--pad) 0;}nav.pdoc .module-list-button{display:inline-flex;align-items:center;color:var(--text);border-color:var(--muted);margin-bottom:1rem;}nav.pdoc .module-list-button:hover{border-color:var(--text);}nav.pdoc input[type=search]{display:block;outline-offset:0;width:calc(100% - var(--pad));}nav.pdoc .logo{max-width:calc(100% - var(--pad));max-height:35vh;display:block;margin:0 auto 1rem;transform:translate(calc(-.5 * var(--pad)), 0);}nav.pdoc ul{list-style:none;padding-left:0;}nav.pdoc > div > ul{margin-left:calc(0px - var(--pad));}nav.pdoc li a{padding:.2rem 0 .2rem calc(var(--pad) + var(--indent));}nav.pdoc > div > ul > li > a{padding-left:var(--pad);}nav.pdoc li{transition:all 100ms;}nav.pdoc li:hover{background-color:var(--nav-hover);}nav.pdoc a, nav.pdoc a:hover{color:var(--text);}nav.pdoc a{display:block;}nav.pdoc > h2:first-of-type{margin-top:1.5rem;}nav.pdoc .class:before{content:"class ";color:var(--muted);}nav.pdoc .function:after{content:"()";color:var(--muted);}nav.pdoc footer:before{content:"";display:block;width:calc(100% - var(--pad));border-top:solid var(--accent2) 1px;margin-top:1.5rem;padding-top:.5rem;}nav.pdoc footer{font-size:small;}</style>
    <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{cursor:pointer;display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:.75rem center;margin-bottom:1rem;}.pdoc .alert > em{display:none;}.pdoc .alert > *:last-child{margin-bottom:0;}.pdoc .alert.note {color:#084298;background-color:#cfe2ff;border-color:#b6d4fe;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23084298%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M8%2016A8%208%200%201%200%208%200a8%208%200%200%200%200%2016zm.93-9.412-1%204.705c-.07.34.029.533.304.533.194%200%20.487-.07.686-.246l-.088.416c-.287.346-.92.598-1.465.598-.703%200-1.002-.422-.808-1.319l.738-3.468c.064-.293.006-.399-.287-.47l-.451-.081.082-.381%202.29-.287zM8%205.5a1%201%200%201%201%200-2%201%201%200%200%201%200%202z%22/%3E%3C/svg%3E");}.pdoc .alert.warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23664d03%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M8.982%201.566a1.13%201.13%200%200%200-1.96%200L.165%2013.233c-.457.778.091%201.767.98%201.767h13.713c.889%200%201.438-.99.98-1.767L8.982%201.566zM8%205c.535%200%20.954.462.9.995l-.35%203.507a.552.552%200%200%201-1.1%200L7.1%205.995A.905.905%200%200%201%208%205zm.002%206a1%201%200%201%201%200%202%201%201%200%200%201%200-2z%22/%3E%3C/svg%3E");}.pdoc .alert.danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7;background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2224%22%20height%3D%2224%22%20fill%3D%22%23842029%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20d%3D%22M5.52.359A.5.5%200%200%201%206%200h4a.5.5%200%200%201%20.474.658L8.694%206H12.5a.5.5%200%200%201%20.395.807l-7%209a.5.5%200%200%201-.873-.454L6.823%209.5H3.5a.5.5%200%200%201-.48-.641l2.5-8.5z%22/%3E%3C/svg%3E");}.pdoc .visually-hidden{position:absolute !important;width:1px !important;height:1px !important;padding:0 !important;margin:-1px !important;overflow:hidden !important;clip:rect(0, 0, 0, 0) !important;white-space:nowrap !important;border:0 !important;}.pdoc h1, .pdoc h2, .pdoc h3{font-weight:300;margin:.3em 0;padding:.2em 0;}.pdoc > section:not(.module-info) h1{font-size:1.5rem;font-weight:500;}.pdoc > section:not(.module-info) h2{font-size:1.4rem;font-weight:500;}.pdoc > section:not(.module-info) h3{font-size:1.3rem;font-weight:500;}.pdoc > section:not(.module-info) h4{font-size:1.2rem;}.pdoc > section:not(.module-info) h5{font-size:1.1rem;}.pdoc a{text-decoration:none;color:var(--link);}.pdoc a:hover{color:var(--link-hover);}.pdoc blockquote{margin-left:2rem;}.pdoc pre{border-top:1px solid var(--accent2);border-bottom:1px solid var(--accent2);margin-top:0;margin-bottom:1em;padding:.5rem 0 .5rem .5rem;overflow-x:auto;background-color:var(--code);}.pdoc code{color:var(--text);padding:.2em .4em;margin:0;font-size:85%;background-color:var(--accent);border-radius:6px;}.pdoc a > code{color:inherit;}.pdoc pre > code{display:inline-block;font-size:inherit;background:none;border:none;padding:0;}.pdoc > section:not(.module-info){margin-bottom:1.5rem;}.pdoc .modulename{margin-top:0;font-weight:bold;}.pdoc .modulename a{color:var(--link);transition:100ms all;}.pdoc .git-button{float:right;border:solid var(--link) 1px;}.pdoc .git-button:hover{background-color:var(--link);color:var(--pdoc-background);}.view-source-toggle-state,.view-source-toggle-state ~ .pdoc-code{display:none;}.view-source-toggle-state:checked ~ .pdoc-code{display:block;}.view-source-button{display:inline-block;float:right;font-size:.75rem;line-height:1.5rem;color:var(--muted);padding:0 .4rem 0 1.3rem;cursor:pointer;text-indent:-2px;}.view-source-button > span{visibility:hidden;}.module-info .view-source-button{float:none;display:flex;justify-content:flex-end;margin:-1.2rem .4rem -.2rem 0;}.view-source-button::before{position:absolute;content:"View Source";display:list-item;list-style-type:disclosure-closed;}.view-source-toggle-state:checked ~ .attr .view-source-button::before,.view-source-toggle-state:checked ~ .view-source-button::before{list-style-type:disclosure-open;}.pdoc .docstring{margin-bottom:1.5rem;}.pdoc section:not(.module-info) .docstring{margin-left:clamp(0rem, 5vw - 2rem, 1rem);}.pdoc .docstring .pdoc-code{margin-left:1em;margin-right:1em;}.pdoc h1:target,.pdoc h2:target,.pdoc h3:target,.pdoc h4:target,.pdoc h5:target,.pdoc h6:target,.pdoc .pdoc-code > pre > span:target{background-color:var(--active);box-shadow:-1rem 0 0 0 var(--active);}.pdoc .pdoc-code > pre > span:target{display:block;}.pdoc div:target > .attr,.pdoc section:target > .attr,.pdoc dd:target > a{background-color:var(--active);}.pdoc *{scroll-margin:2rem;}.pdoc .pdoc-code .linenos{user-select:none;}.pdoc .attr:hover{filter:contrast(0.95);}.pdoc section, .pdoc .classattr{position:relative;}.pdoc .headerlink{--width:clamp(1rem, 3vw, 2rem);position:absolute;top:0;left:calc(0rem - var(--width));transition:all 100ms ease-in-out;opacity:0;}.pdoc .headerlink::before{content:"#";display:block;text-align:center;width:var(--width);height:2.3rem;line-height:2.3rem;font-size:1.5rem;}.pdoc .attr:hover ~ .headerlink,.pdoc *:target > .headerlink,.pdoc .headerlink:hover{opacity:1;}.pdoc .attr{display:block;margin:.5rem 0 .5rem;padding:.4rem .4rem .4rem 1rem;background-color:var(--accent);overflow-x:auto;}.pdoc .classattr{margin-left:2rem;}.pdoc .name{color:var(--name);font-weight:bold;}.pdoc .def{color:var(--def);font-weight:bold;}.pdoc .signature{background-color:transparent;}.pdoc .param, .pdoc .return-annotation{white-space:pre;}.pdoc .signature.multiline .param{display:block;}.pdoc .signature.condensed .param{display:inline-block;}.pdoc .annotation{color:var(--annotation);}.pdoc .view-value-toggle-state,.pdoc .view-value-toggle-state ~ .default_value{display:none;}.pdoc .view-value-toggle-state:checked ~ .default_value{display:inherit;}.pdoc .view-value-button{font-size:.5rem;vertical-align:middle;border-style:dashed;margin-top:-0.1rem;}.pdoc .view-value-button:hover{background:white;}.pdoc .view-value-button::before{content:"show";text-align:center;width:2.2em;display:inline-block;}.pdoc .view-value-toggle-state:checked ~ .view-value-button::before{content:"hide";}.pdoc .inherited{margin-left:2rem;}.pdoc .inherited dt{font-weight:700;}.pdoc .inherited dt, .pdoc .inherited dd{display:inline;margin-left:0;margin-bottom:.5rem;}.pdoc .inherited dd:not(:last-child):after{content:", ";}.pdoc .inherited .class:before{content:"class ";}.pdoc .inherited .function a:after{content:"()";}.pdoc .search-result .docstring{overflow:auto;max-height:25vh;}.pdoc .search-result.focused > .attr{background-color:var(--active);}.pdoc .attribution{margin-top:2rem;display:block;opacity:0.5;transition:all 200ms;filter:grayscale(100%);}.pdoc .attribution:hover{opacity:1;filter:grayscale(0%);}.pdoc .attribution img{margin-left:5px;height:35px;vertical-align:middle;width:70px;transition:all 200ms;}.pdoc table{display:block;width:max-content;max-width:100%;overflow:auto;margin-bottom:1rem;}.pdoc table th{font-weight:600;}.pdoc table th, .pdoc table td{padding:6px 13px;border:1px solid var(--accent2);}</style>
    <style>/*! custom.css */</style><script>
    window.MathJax = {
        tex: {
            inlineMath: [['$', '$'], ['\\(', '\\)']]
        }
    };
</script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
<script>
    /* Re-invoke MathJax when DOM content changes, for example during search. */
    document.addEventListener("DOMContentLoaded", () => {
        new MutationObserver(() => MathJax.typeset()).observe(
            document.querySelector("main.pdoc").parentNode,
            {childList: true}
        );
    })
</script>
<style>
    mjx-container {
        overflow-x: auto;
        overflow-y: hidden;
    }
</style></head>
<body>
    <nav class="pdoc">
        <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
        <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
        <div>            <a class="pdoc-button module-list-button" href="../pyerrors.html">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
  <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
  <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
</svg>                &nbsp;pyerrors</a>


            <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
                   pattern=".+" required>



            <h2>API Documentation</h2>
                <ul class="memberlist">
            <li>
                    <a class="class" href="#Fit_result">Fit_result</a>
                            <ul class="memberlist">
                        <li>
                                <a class="variable" href="#Fit_result.fit_parameters">fit_parameters</a>
                        </li>
                        <li>
                                <a class="function" href="#Fit_result.gamma_method">gamma_method</a>
                        </li>
                        <li>
                                <a class="function" href="#Fit_result.gm">gm</a>
                        </li>
                </ul>

            </li>
            <li>
                    <a class="function" href="#least_squares">least_squares</a>
            </li>
            <li>
                    <a class="function" href="#total_least_squares">total_least_squares</a>
            </li>
            <li>
                    <a class="function" href="#fit_lin">fit_lin</a>
            </li>
            <li>
                    <a class="function" href="#qqplot">qqplot</a>
            </li>
            <li>
                    <a class="function" href="#residual_plot">residual_plot</a>
            </li>
            <li>
                    <a class="function" href="#error_band">error_band</a>
            </li>
            <li>
                    <a class="function" href="#ks_test">ks_test</a>
            </li>
    </ul>



        <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev" target="_blank">
            built with <span class="visually-hidden">pdoc</span><img
                alt="pdoc logo"
                src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.365-.306.49.49%200%200%200-.286-.196c-1.718-1.06-4.931-1.47-7.353.191l-.219.15c-1.707%201.187-3.413%202.131-4.328%201.03-.02-.027-.49-.685-.141-1.763.233-.721.546-2.408.772-4.076.042-.09.067-.187.046-.288.166-1.347.277-2.625.241-3.351%201.378-1.008%202.271-2.586%202.271-4.362%200-.976-.272-1.935-.788-2.774-.057-.094-.122-.18-.184-.268.033-.167.052-.339.052-.516%200-1.477-1.202-2.679-2.679-2.679-.791%200-1.496.352-1.987.9a6.3%206.3%200%200%200-1.001.029c-.492-.564-1.207-.929-2.012-.929-1.477%200-2.679%201.202-2.679%202.679A2.65%202.65%200%200%200%20.97%206.554c-.383.747-.595%201.572-.595%202.41%200%202.311%201.507%204.29%203.635%205.107-.037.699-.147%202.27-.423%203.294l-.137.461c-.622%202.042-2.515%208.257%201.727%2010.643%201.614.908%203.06%201.248%204.317%201.248%202.665%200%204.492-1.524%205.322-2.401%201.476-1.559%202.886-1.854%206.491.82%201.877%201.393%203.514%201.753%204.861%201.068%202.223-1.713%202.811-3.867%203.399-6.374.077-.846.056-1.469.054-1.537zm-4.835%204.313c-.054.305-.156.586-.242.629-.034-.007-.131-.022-.307-.157-.145-.111-.314-.478-.456-.908.221.121.432.25.675.355.115.039.219.051.33.081zm-2.251-1.238c-.05.33-.158.648-.252.694-.022.001-.125-.018-.307-.157-.217-.166-.488-.906-.639-1.573.358.344.754.693%201.198%201.036zm-3.887-2.337c-.006-.116-.018-.231-.041-.342.635.145%201.189.368%201.599.625.097.231.166.481.174.642-.03.049-.055.101-.067.158-.046.013-.128.026-.298.004-.278-.037-.901-.57-1.367-1.087zm-1.127-.497c.116.306.176.625.12.71-.019.014-.117.045-.345.016-.206-.027-.604-.332-.986-.695.41-.051.816-.056%201.211-.031zm-4.535%201.535c.209.22.379.47.358.598-.006.041-.088.138-.351.234-.144.055-.539-.063-.979-.259a11.66%2011.66%200%200%200%20.972-.573zm.983-.664c.359-.237.738-.418%201.126-.554.25.237.479.548.457.694-.006.042-.087.138-.351.235-.174.064-.694-.105-1.232-.375zm-3.381%201.794c-.022.145-.061.29-.149.401-.133.166-.358.248-.69.251h-.002c-.133%200-.306-.26-.45-.621.417.091.854.07%201.291-.031zm-2.066-8.077a4.78%204.78%200%200%201-.775-.584c.172-.115.505-.254.88-.378l-.105.962zm-.331%202.302a10.32%2010.32%200%200%201-.828-.502c.202-.143.576-.328.984-.49l-.156.992zm-.45%202.157l-.701-.403c.214-.115.536-.249.891-.376a11.57%2011.57%200%200%201-.19.779zm-.181%201.716c.064.398.194.702.298.893-.194-.051-.435-.162-.736-.398.061-.119.224-.3.438-.495zM8.87%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zm-.735-.389a1.15%201.15%200%200%200-.314.783%201.16%201.16%200%200%200%201.162%201.162c.457%200%20.842-.27%201.032-.653.026.117.042.238.042.362a1.68%201.68%200%200%201-1.679%201.679%201.68%201.68%200%200%201-1.679-1.679c0-.843.626-1.535%201.436-1.654zM5.059%205.406A1.68%201.68%200%200%201%203.38%207.085a1.68%201.68%200%200%201-1.679-1.679c0-.037.009-.072.011-.109.21.3.541.508.935.508a1.16%201.16%200%200%200%201.162-1.162%201.14%201.14%200%200%200-.474-.912c.015%200%20.03-.005.045-.005.926.001%201.679.754%201.679%201.68zM3.198%204.141c0%20.152-.123.276-.276.276s-.275-.124-.275-.276.123-.276.276-.276.275.124.275.276zM1.375%208.964c0-.52.103-1.035.288-1.52.466.394%201.06.64%201.717.64%201.144%200%202.116-.725%202.499-1.738.383%201.012%201.355%201.738%202.499%201.738.867%200%201.631-.421%202.121-1.062.307.605.478%201.267.478%201.942%200%202.486-2.153%204.51-4.801%204.51s-4.801-2.023-4.801-4.51zm24.342%2019.349c-.985.498-2.267.168-3.813-.979-3.073-2.281-5.453-3.199-7.813-.705-1.315%201.391-4.163%203.365-8.423.97-3.174-1.786-2.239-6.266-1.261-9.479l.146-.492c.276-1.02.395-2.457.444-3.268a6.11%206.11%200%200%200%201.18.115%206.01%206.01%200%200%200%202.536-.562l-.006.175c-.802.215-1.848.612-2.021%201.25-.079.295.021.601.274.837.219.203.415.364.598.501-.667.304-1.243.698-1.311%201.179-.02.144-.022.507.393.787.213.144.395.26.564.365-1.285.521-1.361.96-1.381%201.126-.018.142-.011.496.427.746l.854.489c-.473.389-.971.914-.999%201.429-.018.278.095.532.316.713.675.556%201.231.721%201.653.721.059%200%20.104-.014.158-.02.207.707.641%201.64%201.513%201.64h.013c.8-.008%201.236-.345%201.462-.626.173-.216.268-.457.325-.692.424.195.93.374%201.372.374.151%200%20.294-.021.423-.068.732-.27.944-.704.993-1.021.009-.061.003-.119.002-.179.266.086.538.147.789.147.15%200%20.294-.021.423-.069.542-.2.797-.489.914-.754.237.147.478.258.704.288.106.014.205.021.296.021.356%200%20.595-.101.767-.229.438.435%201.094.992%201.656%201.067.106.014.205.021.296.021a1.56%201.56%200%200%200%20.323-.035c.17.575.453%201.289.866%201.605.358.273.665.362.914.362a.99.99%200%200%200%20.421-.093%201.03%201.03%200%200%200%20.245-.164c.168.428.39.846.68%201.068.358.273.665.362.913.362a.99.99%200%200%200%20.421-.093c.317-.148.512-.448.639-.762.251.157.495.257.726.257.127%200%20.25-.024.37-.071.427-.17.706-.617.841-1.314.022-.015.047-.022.068-.038.067-.051.133-.104.196-.159-.443%201.486-1.107%202.761-2.086%203.257zM8.66%209.925a.5.5%200%201%200-1%200c0%20.653-.818%201.205-1.787%201.205s-1.787-.552-1.787-1.205a.5.5%200%201%200-1%200c0%201.216%201.25%202.205%202.787%202.205s2.787-.989%202.787-2.205zm4.4%2015.965l-.208.097c-2.661%201.258-4.708%201.436-6.086.527-1.542-1.017-1.88-3.19-1.844-4.198a.4.4%200%200%200-.385-.414c-.242-.029-.406.164-.414.385-.046%201.249.367%203.686%202.202%204.896.708.467%201.547.7%202.51.7%201.248%200%202.706-.392%204.362-1.174l.185-.086a.4.4%200%200%200%20.205-.527c-.089-.204-.326-.291-.527-.206zM9.547%202.292c.093.077.205.114.317.114a.5.5%200%200%200%20.318-.886L8.817.397a.5.5%200%200%200-.703.068.5.5%200%200%200%20.069.703l1.364%201.124zm-7.661-.065c.086%200%20.173-.022.253-.068l1.523-.893a.5.5%200%200%200-.506-.863l-1.523.892a.5.5%200%200%200-.179.685c.094.158.261.247.432.247z%22%20transform%3D%22matrix%28-1%200%200%201%2058%200%29%22%20fill%3D%22%233bb300%22/%3E%3Cpath%20d%3D%22M.3%2021.86V10.18q0-.46.02-.68.04-.22.18-.5.28-.54%201.34-.54%201.06%200%201.42.28.38.26.44.78.76-1.04%202.38-1.04%201.64%200%203.1%201.54%201.46%201.54%201.46%203.58%200%202.04-1.46%203.58-1.44%201.54-3.08%201.54-1.64%200-2.38-.92v4.04q0%20.46-.04.68-.02.22-.18.5-.14.3-.5.42-.36.12-.98.12-.62%200-1-.12-.36-.12-.52-.4-.14-.28-.18-.5-.02-.22-.02-.68zm3.96-9.42q-.46.54-.46%201.18%200%20.64.46%201.18.48.52%201.2.52.74%200%201.24-.52.52-.52.52-1.18%200-.66-.48-1.18-.48-.54-1.26-.54-.76%200-1.22.54zm14.741-8.36q.16-.3.54-.42.38-.12%201-.12.64%200%201.02.12.38.12.52.42.16.3.18.54.04.22.04.68v11.94q0%20.46-.04.7-.02.22-.18.5-.3.54-1.7.54-1.38%200-1.54-.98-.84.96-2.34.96-1.8%200-3.28-1.56-1.48-1.58-1.48-3.66%200-2.1%201.48-3.68%201.5-1.58%203.28-1.58%201.48%200%202.3%201v-4.2q0-.46.02-.68.04-.24.18-.52zm-3.24%2010.86q.52.54%201.26.54.74%200%201.22-.54.5-.54.5-1.18%200-.66-.48-1.22-.46-.56-1.26-.56-.8%200-1.28.56-.48.54-.48%201.2%200%20.66.52%201.2zm7.833-1.2q0-2.4%201.68-3.96%201.68-1.56%203.84-1.56%202.16%200%203.82%201.56%201.66%201.54%201.66%203.94%200%201.66-.86%202.96-.86%201.28-2.1%201.9-1.22.6-2.54.6-1.32%200-2.56-.64-1.24-.66-2.1-1.92-.84-1.28-.84-2.88zm4.18%201.44q.64.48%201.3.48.66%200%201.32-.5.66-.5.66-1.48%200-.98-.62-1.46-.62-.48-1.34-.48-.72%200-1.34.5-.62.5-.62%201.48%200%20.96.64%201.46zm11.412-1.44q0%20.84.56%201.32.56.46%201.18.46.64%200%201.18-.36.56-.38.9-.38.6%200%201.46%201.06.46.58.46%201.04%200%20.76-1.1%201.42-1.14.8-2.8.8-1.86%200-3.58-1.34-.82-.64-1.34-1.7-.52-1.08-.52-2.36%200-1.3.52-2.34.52-1.06%201.34-1.7%201.66-1.32%203.54-1.32.76%200%201.48.22.72.2%201.06.4l.32.2q.36.24.56.38.52.4.52.92%200%20.5-.42%201.14-.72%201.1-1.38%201.1-.38%200-1.08-.44-.36-.34-1.04-.34-.66%200-1.24.48-.58.48-.58%201.34z%22%20fill%3D%22green%22/%3E%3C/svg%3E"/>
        </a>
</div>
    </nav>
    <main class="pdoc">
            <section class="module-info">
                    <h1 class="modulename">
<a href="./../pyerrors.html">pyerrors</a><wbr>.fits    </h1>

                
                        <input id="mod-fits-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">

                        <label class="view-source-button" for="mod-fits-view-source"><span>View Source</span></label>

                        <div class="pdoc-code codehilite"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos">  1</span></a><span class="kn">import</span> <span class="nn">gc</span>
</span><span id="L-2"><a href="#L-2"><span class="linenos">  2</span></a><span class="kn">from</span> <span class="nn">collections.abc</span> <span class="kn">import</span> <span class="n">Sequence</span>
</span><span id="L-3"><a href="#L-3"><span class="linenos">  3</span></a><span class="kn">import</span> <span class="nn">warnings</span>
</span><span id="L-4"><a href="#L-4"><span class="linenos">  4</span></a><span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
</span><span id="L-5"><a href="#L-5"><span class="linenos">  5</span></a><span class="kn">import</span> <span class="nn">autograd.numpy</span> <span class="k">as</span> <span class="nn">anp</span>
</span><span id="L-6"><a href="#L-6"><span class="linenos">  6</span></a><span class="kn">import</span> <span class="nn">scipy.optimize</span>
</span><span id="L-7"><a href="#L-7"><span class="linenos">  7</span></a><span class="kn">import</span> <span class="nn">scipy.stats</span>
</span><span id="L-8"><a href="#L-8"><span class="linenos">  8</span></a><span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
</span><span id="L-9"><a href="#L-9"><span class="linenos">  9</span></a><span class="kn">from</span> <span class="nn">matplotlib</span> <span class="kn">import</span> <span class="n">gridspec</span>
</span><span id="L-10"><a href="#L-10"><span class="linenos"> 10</span></a><span class="kn">from</span> <span class="nn">scipy.odr</span> <span class="kn">import</span> <span class="n">ODR</span><span class="p">,</span> <span class="n">Model</span><span class="p">,</span> <span class="n">RealData</span>
</span><span id="L-11"><a href="#L-11"><span class="linenos"> 11</span></a><span class="kn">import</span> <span class="nn">iminuit</span>
</span><span id="L-12"><a href="#L-12"><span class="linenos"> 12</span></a><span class="kn">from</span> <span class="nn">autograd</span> <span class="kn">import</span> <span class="n">jacobian</span> <span class="k">as</span> <span class="n">auto_jacobian</span>
</span><span id="L-13"><a href="#L-13"><span class="linenos"> 13</span></a><span class="kn">from</span> <span class="nn">autograd</span> <span class="kn">import</span> <span class="n">hessian</span> <span class="k">as</span> <span class="n">auto_hessian</span>
</span><span id="L-14"><a href="#L-14"><span class="linenos"> 14</span></a><span class="kn">from</span> <span class="nn">autograd</span> <span class="kn">import</span> <span class="n">elementwise_grad</span> <span class="k">as</span> <span class="n">egrad</span>
</span><span id="L-15"><a href="#L-15"><span class="linenos"> 15</span></a><span class="kn">from</span> <span class="nn">numdifftools</span> <span class="kn">import</span> <span class="n">Jacobian</span> <span class="k">as</span> <span class="n">num_jacobian</span>
</span><span id="L-16"><a href="#L-16"><span class="linenos"> 16</span></a><span class="kn">from</span> <span class="nn">numdifftools</span> <span class="kn">import</span> <span class="n">Hessian</span> <span class="k">as</span> <span class="n">num_hessian</span>
</span><span id="L-17"><a href="#L-17"><span class="linenos"> 17</span></a><span class="kn">from</span> <span class="nn">.obs</span> <span class="kn">import</span> <span class="n">Obs</span><span class="p">,</span> <span class="n">derived_observable</span><span class="p">,</span> <span class="n">covariance</span><span class="p">,</span> <span class="n">cov_Obs</span>
</span><span id="L-18"><a href="#L-18"><span class="linenos"> 18</span></a>
</span><span id="L-19"><a href="#L-19"><span class="linenos"> 19</span></a>
</span><span id="L-20"><a href="#L-20"><span class="linenos"> 20</span></a><span class="k">class</span> <span class="nc">Fit_result</span><span class="p">(</span><span class="n">Sequence</span><span class="p">):</span>
</span><span id="L-21"><a href="#L-21"><span class="linenos"> 21</span></a><span class="w">    </span><span class="sd">&quot;&quot;&quot;Represents fit results.</span>
</span><span id="L-22"><a href="#L-22"><span class="linenos"> 22</span></a>
</span><span id="L-23"><a href="#L-23"><span class="linenos"> 23</span></a><span class="sd">    Attributes</span>
</span><span id="L-24"><a href="#L-24"><span class="linenos"> 24</span></a><span class="sd">    ----------</span>
</span><span id="L-25"><a href="#L-25"><span class="linenos"> 25</span></a><span class="sd">    fit_parameters : list</span>
</span><span id="L-26"><a href="#L-26"><span class="linenos"> 26</span></a><span class="sd">        results for the individual fit parameters,</span>
</span><span id="L-27"><a href="#L-27"><span class="linenos"> 27</span></a><span class="sd">        also accessible via indices.</span>
</span><span id="L-28"><a href="#L-28"><span class="linenos"> 28</span></a><span class="sd">    chisquare_by_dof : float</span>
</span><span id="L-29"><a href="#L-29"><span class="linenos"> 29</span></a><span class="sd">        reduced chisquare.</span>
</span><span id="L-30"><a href="#L-30"><span class="linenos"> 30</span></a><span class="sd">    p_value : float</span>
</span><span id="L-31"><a href="#L-31"><span class="linenos"> 31</span></a><span class="sd">        p-value of the fit</span>
</span><span id="L-32"><a href="#L-32"><span class="linenos"> 32</span></a><span class="sd">    t2_p_value : float</span>
</span><span id="L-33"><a href="#L-33"><span class="linenos"> 33</span></a><span class="sd">        Hotelling t-squared p-value for correlated fits.</span>
</span><span id="L-34"><a href="#L-34"><span class="linenos"> 34</span></a><span class="sd">    &quot;&quot;&quot;</span>
</span><span id="L-35"><a href="#L-35"><span class="linenos"> 35</span></a>
</span><span id="L-36"><a href="#L-36"><span class="linenos"> 36</span></a>    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-37"><a href="#L-37"><span class="linenos"> 37</span></a>        <span class="bp">self</span><span class="o">.</span><span class="n">fit_parameters</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="L-38"><a href="#L-38"><span class="linenos"> 38</span></a>
</span><span id="L-39"><a href="#L-39"><span class="linenos"> 39</span></a>    <span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
</span><span id="L-40"><a href="#L-40"><span class="linenos"> 40</span></a>        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fit_parameters</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
</span><span id="L-41"><a href="#L-41"><span class="linenos"> 41</span></a>
</span><span id="L-42"><a href="#L-42"><span class="linenos"> 42</span></a>    <span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-43"><a href="#L-43"><span class="linenos"> 43</span></a>        <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fit_parameters</span><span class="p">)</span>
</span><span id="L-44"><a href="#L-44"><span class="linenos"> 44</span></a>
</span><span id="L-45"><a href="#L-45"><span class="linenos"> 45</span></a>    <span class="k">def</span> <span class="nf">gamma_method</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="L-46"><a href="#L-46"><span class="linenos"> 46</span></a><span class="w">        </span><span class="sd">&quot;&quot;&quot;Apply the gamma method to all fit parameters&quot;&quot;&quot;</span>
</span><span id="L-47"><a href="#L-47"><span class="linenos"> 47</span></a>        <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">gamma_method</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fit_parameters</span><span class="p">]</span>
</span><span id="L-48"><a href="#L-48"><span class="linenos"> 48</span></a>
</span><span id="L-49"><a href="#L-49"><span class="linenos"> 49</span></a>    <span class="n">gm</span> <span class="o">=</span> <span class="n">gamma_method</span>
</span><span id="L-50"><a href="#L-50"><span class="linenos"> 50</span></a>
</span><span id="L-51"><a href="#L-51"><span class="linenos"> 51</span></a>    <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-52"><a href="#L-52"><span class="linenos"> 52</span></a>        <span class="n">my_str</span> <span class="o">=</span> <span class="s1">&#39;Goodness of fit:</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="L-53"><a href="#L-53"><span class="linenos"> 53</span></a>        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;chisquare_by_dof&#39;</span><span class="p">):</span>
</span><span id="L-54"><a href="#L-54"><span class="linenos"> 54</span></a>            <span class="n">my_str</span> <span class="o">+=</span> <span class="s1">&#39;</span><span class="se">\u03C7\u00b2</span><span class="s1">/d.o.f. = &#39;</span> <span class="o">+</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">chisquare_by_dof</span><span class="si">:</span><span class="s1">2.6f</span><span class="si">}</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="L-55"><a href="#L-55"><span class="linenos"> 55</span></a>        <span class="k">elif</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;residual_variance&#39;</span><span class="p">):</span>
</span><span id="L-56"><a href="#L-56"><span class="linenos"> 56</span></a>            <span class="n">my_str</span> <span class="o">+=</span> <span class="s1">&#39;residual variance = &#39;</span> <span class="o">+</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">residual_variance</span><span class="si">:</span><span class="s1">2.6f</span><span class="si">}</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="L-57"><a href="#L-57"><span class="linenos"> 57</span></a>        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;chisquare_by_expected_chisquare&#39;</span><span class="p">):</span>
</span><span id="L-58"><a href="#L-58"><span class="linenos"> 58</span></a>            <span class="n">my_str</span> <span class="o">+=</span> <span class="s1">&#39;</span><span class="se">\u03C7\u00b2</span><span class="s1">/</span><span class="se">\u03C7\u00b2</span><span class="s1">exp  = &#39;</span> <span class="o">+</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">chisquare_by_expected_chisquare</span><span class="si">:</span><span class="s1">2.6f</span><span class="si">}</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="L-59"><a href="#L-59"><span class="linenos"> 59</span></a>        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;p_value&#39;</span><span class="p">):</span>
</span><span id="L-60"><a href="#L-60"><span class="linenos"> 60</span></a>            <span class="n">my_str</span> <span class="o">+=</span> <span class="s1">&#39;p-value   = &#39;</span> <span class="o">+</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">p_value</span><span class="si">:</span><span class="s1">2.4f</span><span class="si">}</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="L-61"><a href="#L-61"><span class="linenos"> 61</span></a>        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;t2_p_value&#39;</span><span class="p">):</span>
</span><span id="L-62"><a href="#L-62"><span class="linenos"> 62</span></a>            <span class="n">my_str</span> <span class="o">+=</span> <span class="s1">&#39;t</span><span class="se">\u00B2</span><span class="s1">p-value = &#39;</span> <span class="o">+</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">t2_p_value</span><span class="si">:</span><span class="s1">2.4f</span><span class="si">}</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="L-63"><a href="#L-63"><span class="linenos"> 63</span></a>        <span class="n">my_str</span> <span class="o">+=</span> <span class="s1">&#39;Fit parameters:</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="L-64"><a href="#L-64"><span class="linenos"> 64</span></a>        <span class="k">for</span> <span class="n">i_par</span><span class="p">,</span> <span class="n">par</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fit_parameters</span><span class="p">):</span>
</span><span id="L-65"><a href="#L-65"><span class="linenos"> 65</span></a>            <span class="n">my_str</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">i_par</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\t</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">*</span> <span class="nb">int</span><span class="p">(</span><span class="n">par</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">par</span><span class="p">)</span><span class="o">.</span><span class="n">rjust</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">par</span> <span class="o">&lt;</span> <span class="mf">0.0</span><span class="p">))</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="L-66"><a href="#L-66"><span class="linenos"> 66</span></a>        <span class="k">return</span> <span class="n">my_str</span>
</span><span id="L-67"><a href="#L-67"><span class="linenos"> 67</span></a>
</span><span id="L-68"><a href="#L-68"><span class="linenos"> 68</span></a>    <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="L-69"><a href="#L-69"><span class="linenos"> 69</span></a>        <span class="n">m</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">len</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">keys</span><span class="p">())))</span> <span class="o">+</span> <span class="mi">1</span>
</span><span id="L-70"><a href="#L-70"><span class="linenos"> 70</span></a>        <span class="k">return</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">key</span><span class="o">.</span><span class="n">rjust</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;: &#39;</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">items</span><span class="p">())])</span>
</span><span id="L-71"><a href="#L-71"><span class="linenos"> 71</span></a>
</span><span id="L-72"><a href="#L-72"><span class="linenos"> 72</span></a>
</span><span id="L-73"><a href="#L-73"><span class="linenos"> 73</span></a><span class="k">def</span> <span class="nf">least_squares</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">priors</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="L-74"><a href="#L-74"><span class="linenos"> 74</span></a><span class="w">    </span><span class="sa">r</span><span class="sd">&#39;&#39;&#39;Performs a non-linear fit to y = func(x).</span>
</span><span id="L-75"><a href="#L-75"><span class="linenos"> 75</span></a><span class="sd">        ```</span>
</span><span id="L-76"><a href="#L-76"><span class="linenos"> 76</span></a>
</span><span id="L-77"><a href="#L-77"><span class="linenos"> 77</span></a><span class="sd">    Parameters</span>
</span><span id="L-78"><a href="#L-78"><span class="linenos"> 78</span></a><span class="sd">    ----------</span>
</span><span id="L-79"><a href="#L-79"><span class="linenos"> 79</span></a><span class="sd">    For an uncombined fit:</span>
</span><span id="L-80"><a href="#L-80"><span class="linenos"> 80</span></a>
</span><span id="L-81"><a href="#L-81"><span class="linenos"> 81</span></a><span class="sd">    x : list</span>
</span><span id="L-82"><a href="#L-82"><span class="linenos"> 82</span></a><span class="sd">        list of floats.</span>
</span><span id="L-83"><a href="#L-83"><span class="linenos"> 83</span></a><span class="sd">    y : list</span>
</span><span id="L-84"><a href="#L-84"><span class="linenos"> 84</span></a><span class="sd">        list of Obs.</span>
</span><span id="L-85"><a href="#L-85"><span class="linenos"> 85</span></a><span class="sd">    func : object</span>
</span><span id="L-86"><a href="#L-86"><span class="linenos"> 86</span></a><span class="sd">        fit function, has to be of the form</span>
</span><span id="L-87"><a href="#L-87"><span class="linenos"> 87</span></a>
</span><span id="L-88"><a href="#L-88"><span class="linenos"> 88</span></a><span class="sd">        ```python</span>
</span><span id="L-89"><a href="#L-89"><span class="linenos"> 89</span></a><span class="sd">        import autograd.numpy as anp</span>
</span><span id="L-90"><a href="#L-90"><span class="linenos"> 90</span></a>
</span><span id="L-91"><a href="#L-91"><span class="linenos"> 91</span></a><span class="sd">        def func(a, x):</span>
</span><span id="L-92"><a href="#L-92"><span class="linenos"> 92</span></a><span class="sd">            return a[0] + a[1] * x + a[2] * anp.sinh(x)</span>
</span><span id="L-93"><a href="#L-93"><span class="linenos"> 93</span></a><span class="sd">        ```</span>
</span><span id="L-94"><a href="#L-94"><span class="linenos"> 94</span></a>
</span><span id="L-95"><a href="#L-95"><span class="linenos"> 95</span></a><span class="sd">        For multiple x values func can be of the form</span>
</span><span id="L-96"><a href="#L-96"><span class="linenos"> 96</span></a>
</span><span id="L-97"><a href="#L-97"><span class="linenos"> 97</span></a><span class="sd">        ```python</span>
</span><span id="L-98"><a href="#L-98"><span class="linenos"> 98</span></a><span class="sd">        def func(a, x):</span>
</span><span id="L-99"><a href="#L-99"><span class="linenos"> 99</span></a><span class="sd">            (x1, x2) = x</span>
</span><span id="L-100"><a href="#L-100"><span class="linenos">100</span></a><span class="sd">            return a[0] * x1 ** 2 + a[1] * x2</span>
</span><span id="L-101"><a href="#L-101"><span class="linenos">101</span></a><span class="sd">        ```</span>
</span><span id="L-102"><a href="#L-102"><span class="linenos">102</span></a><span class="sd">        It is important that all numpy functions refer to autograd.numpy, otherwise the differentiation</span>
</span><span id="L-103"><a href="#L-103"><span class="linenos">103</span></a><span class="sd">        will not work.</span>
</span><span id="L-104"><a href="#L-104"><span class="linenos">104</span></a>
</span><span id="L-105"><a href="#L-105"><span class="linenos">105</span></a><span class="sd">    OR For a combined fit:</span>
</span><span id="L-106"><a href="#L-106"><span class="linenos">106</span></a>
</span><span id="L-107"><a href="#L-107"><span class="linenos">107</span></a><span class="sd">    x : dict</span>
</span><span id="L-108"><a href="#L-108"><span class="linenos">108</span></a><span class="sd">        dict of lists.</span>
</span><span id="L-109"><a href="#L-109"><span class="linenos">109</span></a><span class="sd">    y : dict</span>
</span><span id="L-110"><a href="#L-110"><span class="linenos">110</span></a><span class="sd">        dict of lists of Obs.</span>
</span><span id="L-111"><a href="#L-111"><span class="linenos">111</span></a><span class="sd">    funcs : dict</span>
</span><span id="L-112"><a href="#L-112"><span class="linenos">112</span></a><span class="sd">        dict of objects</span>
</span><span id="L-113"><a href="#L-113"><span class="linenos">113</span></a><span class="sd">        fit functions have to be of the form (here a[0] is the common fit parameter)</span>
</span><span id="L-114"><a href="#L-114"><span class="linenos">114</span></a><span class="sd">        ```python</span>
</span><span id="L-115"><a href="#L-115"><span class="linenos">115</span></a><span class="sd">        import autograd.numpy as anp</span>
</span><span id="L-116"><a href="#L-116"><span class="linenos">116</span></a><span class="sd">        funcs = {&quot;a&quot;: func_a,</span>
</span><span id="L-117"><a href="#L-117"><span class="linenos">117</span></a><span class="sd">                &quot;b&quot;: func_b}</span>
</span><span id="L-118"><a href="#L-118"><span class="linenos">118</span></a>
</span><span id="L-119"><a href="#L-119"><span class="linenos">119</span></a><span class="sd">        def func_a(a, x):</span>
</span><span id="L-120"><a href="#L-120"><span class="linenos">120</span></a><span class="sd">            return a[1] * anp.exp(-a[0] * x)</span>
</span><span id="L-121"><a href="#L-121"><span class="linenos">121</span></a>
</span><span id="L-122"><a href="#L-122"><span class="linenos">122</span></a><span class="sd">        def func_b(a, x):</span>
</span><span id="L-123"><a href="#L-123"><span class="linenos">123</span></a><span class="sd">            return a[2] * anp.exp(-a[0] * x)</span>
</span><span id="L-124"><a href="#L-124"><span class="linenos">124</span></a>
</span><span id="L-125"><a href="#L-125"><span class="linenos">125</span></a><span class="sd">        It is important that all numpy functions refer to autograd.numpy, otherwise the differentiation</span>
</span><span id="L-126"><a href="#L-126"><span class="linenos">126</span></a><span class="sd">        will not work.</span>
</span><span id="L-127"><a href="#L-127"><span class="linenos">127</span></a>
</span><span id="L-128"><a href="#L-128"><span class="linenos">128</span></a><span class="sd">    priors : dict or list, optional</span>
</span><span id="L-129"><a href="#L-129"><span class="linenos">129</span></a><span class="sd">        priors can either be a dictionary with integer keys and the corresponding priors as values or</span>
</span><span id="L-130"><a href="#L-130"><span class="linenos">130</span></a><span class="sd">        a list with an entry for every parameter in the fit. The entries can either be</span>
</span><span id="L-131"><a href="#L-131"><span class="linenos">131</span></a><span class="sd">        Obs (e.g. results from a previous fit) or strings containing a value and an error formatted like</span>
</span><span id="L-132"><a href="#L-132"><span class="linenos">132</span></a><span class="sd">        0.548(23), 500(40) or 0.5(0.4)</span>
</span><span id="L-133"><a href="#L-133"><span class="linenos">133</span></a><span class="sd">    silent : bool, optional</span>
</span><span id="L-134"><a href="#L-134"><span class="linenos">134</span></a><span class="sd">        If true all output to the console is omitted (default False).</span>
</span><span id="L-135"><a href="#L-135"><span class="linenos">135</span></a><span class="sd">    initial_guess : list</span>
</span><span id="L-136"><a href="#L-136"><span class="linenos">136</span></a><span class="sd">        can provide an initial guess for the input parameters. Relevant for</span>
</span><span id="L-137"><a href="#L-137"><span class="linenos">137</span></a><span class="sd">        non-linear fits with many parameters. In case of correlated fits the guess is used to perform</span>
</span><span id="L-138"><a href="#L-138"><span class="linenos">138</span></a><span class="sd">        an uncorrelated fit which then serves as guess for the correlated fit.</span>
</span><span id="L-139"><a href="#L-139"><span class="linenos">139</span></a><span class="sd">    method : str, optional</span>
</span><span id="L-140"><a href="#L-140"><span class="linenos">140</span></a><span class="sd">        can be used to choose an alternative method for the minimization of chisquare.</span>
</span><span id="L-141"><a href="#L-141"><span class="linenos">141</span></a><span class="sd">        The possible methods are the ones which can be used for scipy.optimize.minimize and</span>
</span><span id="L-142"><a href="#L-142"><span class="linenos">142</span></a><span class="sd">        migrad of iminuit. If no method is specified, Levenberg-Marquard is used.</span>
</span><span id="L-143"><a href="#L-143"><span class="linenos">143</span></a><span class="sd">        Reliable alternatives are migrad, Powell and Nelder-Mead.</span>
</span><span id="L-144"><a href="#L-144"><span class="linenos">144</span></a><span class="sd">    tol: float, optional</span>
</span><span id="L-145"><a href="#L-145"><span class="linenos">145</span></a><span class="sd">        can be used (only for combined fits and methods other than Levenberg-Marquard) to set the tolerance for convergence</span>
</span><span id="L-146"><a href="#L-146"><span class="linenos">146</span></a><span class="sd">        to a different value to either speed up convergence at the cost of a larger error on the fitted parameters (and possibly</span>
</span><span id="L-147"><a href="#L-147"><span class="linenos">147</span></a><span class="sd">        invalid estimates for parameter uncertainties) or smaller values to get more accurate parameter values</span>
</span><span id="L-148"><a href="#L-148"><span class="linenos">148</span></a><span class="sd">        The stopping criterion depends on the method, e.g. migrad: edm_max = 0.002 * tol * errordef (EDM criterion: edm &lt; edm_max)</span>
</span><span id="L-149"><a href="#L-149"><span class="linenos">149</span></a><span class="sd">    correlated_fit : bool</span>
</span><span id="L-150"><a href="#L-150"><span class="linenos">150</span></a><span class="sd">        If True, use the full inverse covariance matrix in the definition of the chisquare cost function.</span>
</span><span id="L-151"><a href="#L-151"><span class="linenos">151</span></a><span class="sd">        For details about how the covariance matrix is estimated see `pyerrors.obs.covariance`.</span>
</span><span id="L-152"><a href="#L-152"><span class="linenos">152</span></a><span class="sd">        In practice the correlation matrix is Cholesky decomposed and inverted (instead of the covariance matrix).</span>
</span><span id="L-153"><a href="#L-153"><span class="linenos">153</span></a><span class="sd">        This procedure should be numerically more stable as the correlation matrix is typically better conditioned (Jacobi preconditioning).</span>
</span><span id="L-154"><a href="#L-154"><span class="linenos">154</span></a><span class="sd">    expected_chisquare : bool</span>
</span><span id="L-155"><a href="#L-155"><span class="linenos">155</span></a><span class="sd">        If True estimates the expected chisquare which is</span>
</span><span id="L-156"><a href="#L-156"><span class="linenos">156</span></a><span class="sd">        corrected by effects caused by correlated input data (default False).</span>
</span><span id="L-157"><a href="#L-157"><span class="linenos">157</span></a><span class="sd">    resplot : bool</span>
</span><span id="L-158"><a href="#L-158"><span class="linenos">158</span></a><span class="sd">        If True, a plot which displays fit, data and residuals is generated (default False).</span>
</span><span id="L-159"><a href="#L-159"><span class="linenos">159</span></a><span class="sd">    qqplot : bool</span>
</span><span id="L-160"><a href="#L-160"><span class="linenos">160</span></a><span class="sd">        If True, a quantile-quantile plot of the fit result is generated (default False).</span>
</span><span id="L-161"><a href="#L-161"><span class="linenos">161</span></a><span class="sd">    num_grad : bool</span>
</span><span id="L-162"><a href="#L-162"><span class="linenos">162</span></a><span class="sd">        Use numerical differentation instead of automatic differentiation to perform the error propagation (default False).</span>
</span><span id="L-163"><a href="#L-163"><span class="linenos">163</span></a>
</span><span id="L-164"><a href="#L-164"><span class="linenos">164</span></a><span class="sd">    Returns</span>
</span><span id="L-165"><a href="#L-165"><span class="linenos">165</span></a><span class="sd">    -------</span>
</span><span id="L-166"><a href="#L-166"><span class="linenos">166</span></a><span class="sd">    output : Fit_result</span>
</span><span id="L-167"><a href="#L-167"><span class="linenos">167</span></a><span class="sd">        Parameters and information on the fitted result.</span>
</span><span id="L-168"><a href="#L-168"><span class="linenos">168</span></a><span class="sd">    &#39;&#39;&#39;</span>
</span><span id="L-169"><a href="#L-169"><span class="linenos">169</span></a>    <span class="n">output</span> <span class="o">=</span> <span class="n">Fit_result</span><span class="p">()</span>
</span><span id="L-170"><a href="#L-170"><span class="linenos">170</span></a>
</span><span id="L-171"><a href="#L-171"><span class="linenos">171</span></a>    <span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)):</span>
</span><span id="L-172"><a href="#L-172"><span class="linenos">172</span></a>        <span class="n">xd</span> <span class="o">=</span> <span class="p">{</span><span class="n">key</span><span class="p">:</span> <span class="n">anp</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">x</span><span class="p">}</span>
</span><span id="L-173"><a href="#L-173"><span class="linenos">173</span></a>        <span class="n">yd</span> <span class="o">=</span> <span class="n">y</span>
</span><span id="L-174"><a href="#L-174"><span class="linenos">174</span></a>        <span class="n">funcd</span> <span class="o">=</span> <span class="n">func</span>
</span><span id="L-175"><a href="#L-175"><span class="linenos">175</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">fit_function</span> <span class="o">=</span> <span class="n">func</span>
</span><span id="L-176"><a href="#L-176"><span class="linenos">176</span></a>    <span class="k">elif</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)):</span>
</span><span id="L-177"><a href="#L-177"><span class="linenos">177</span></a>        <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;All arguments have to be dictionaries in order to perform a combined fit.&quot;</span><span class="p">)</span>
</span><span id="L-178"><a href="#L-178"><span class="linenos">178</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-179"><a href="#L-179"><span class="linenos">179</span></a>        <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span><span id="L-180"><a href="#L-180"><span class="linenos">180</span></a>        <span class="n">xd</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;&quot;</span><span class="p">:</span> <span class="n">x</span><span class="p">}</span>
</span><span id="L-181"><a href="#L-181"><span class="linenos">181</span></a>        <span class="n">yd</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;&quot;</span><span class="p">:</span> <span class="n">y</span><span class="p">}</span>
</span><span id="L-182"><a href="#L-182"><span class="linenos">182</span></a>        <span class="n">funcd</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;&quot;</span><span class="p">:</span> <span class="n">func</span><span class="p">}</span>
</span><span id="L-183"><a href="#L-183"><span class="linenos">183</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">fit_function</span> <span class="o">=</span> <span class="n">func</span>
</span><span id="L-184"><a href="#L-184"><span class="linenos">184</span></a>
</span><span id="L-185"><a href="#L-185"><span class="linenos">185</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;num_grad&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-186"><a href="#L-186"><span class="linenos">186</span></a>        <span class="n">jacobian</span> <span class="o">=</span> <span class="n">num_jacobian</span>
</span><span id="L-187"><a href="#L-187"><span class="linenos">187</span></a>        <span class="n">hessian</span> <span class="o">=</span> <span class="n">num_hessian</span>
</span><span id="L-188"><a href="#L-188"><span class="linenos">188</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-189"><a href="#L-189"><span class="linenos">189</span></a>        <span class="n">jacobian</span> <span class="o">=</span> <span class="n">auto_jacobian</span>
</span><span id="L-190"><a href="#L-190"><span class="linenos">190</span></a>        <span class="n">hessian</span> <span class="o">=</span> <span class="n">auto_hessian</span>
</span><span id="L-191"><a href="#L-191"><span class="linenos">191</span></a>
</span><span id="L-192"><a href="#L-192"><span class="linenos">192</span></a>    <span class="n">key_ls</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">xd</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span>
</span><span id="L-193"><a href="#L-193"><span class="linenos">193</span></a>
</span><span id="L-194"><a href="#L-194"><span class="linenos">194</span></a>    <span class="k">if</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">yd</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span> <span class="o">!=</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="L-195"><a href="#L-195"><span class="linenos">195</span></a>        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;x and y dictionaries do not contain the same keys.&#39;</span><span class="p">)</span>
</span><span id="L-196"><a href="#L-196"><span class="linenos">196</span></a>
</span><span id="L-197"><a href="#L-197"><span class="linenos">197</span></a>    <span class="k">if</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">funcd</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span> <span class="o">!=</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="L-198"><a href="#L-198"><span class="linenos">198</span></a>        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;x and func dictionaries do not contain the same keys.&#39;</span><span class="p">)</span>
</span><span id="L-199"><a href="#L-199"><span class="linenos">199</span></a>
</span><span id="L-200"><a href="#L-200"><span class="linenos">200</span></a>    <span class="n">x_all</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">([</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">])</span>
</span><span id="L-201"><a href="#L-201"><span class="linenos">201</span></a>    <span class="n">y_all</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">([</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">yd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">])</span>
</span><span id="L-202"><a href="#L-202"><span class="linenos">202</span></a>
</span><span id="L-203"><a href="#L-203"><span class="linenos">203</span></a>    <span class="n">y_f</span> <span class="o">=</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y_all</span><span class="p">]</span>
</span><span id="L-204"><a href="#L-204"><span class="linenos">204</span></a>    <span class="n">dy_f</span> <span class="o">=</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">dvalue</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y_all</span><span class="p">]</span>
</span><span id="L-205"><a href="#L-205"><span class="linenos">205</span></a>
</span><span id="L-206"><a href="#L-206"><span class="linenos">206</span></a>    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x_all</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
</span><span id="L-207"><a href="#L-207"><span class="linenos">207</span></a>        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unknown format for x values&quot;</span><span class="p">)</span>
</span><span id="L-208"><a href="#L-208"><span class="linenos">208</span></a>
</span><span id="L-209"><a href="#L-209"><span class="linenos">209</span></a>    <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">dy_f</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mf">0.0</span><span class="p">):</span>
</span><span id="L-210"><a href="#L-210"><span class="linenos">210</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;No y errors available, run the gamma method first.&quot;</span><span class="p">)</span>
</span><span id="L-211"><a href="#L-211"><span class="linenos">211</span></a>
</span><span id="L-212"><a href="#L-212"><span class="linenos">212</span></a>    <span class="c1"># number of fit parameters</span>
</span><span id="L-213"><a href="#L-213"><span class="linenos">213</span></a>    <span class="n">n_parms_ls</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-214"><a href="#L-214"><span class="linenos">214</span></a>    <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="L-215"><a href="#L-215"><span class="linenos">215</span></a>        <span class="k">if</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">]):</span>
</span><span id="L-216"><a href="#L-216"><span class="linenos">216</span></a>            <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;func (key=&#39;</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s1">&#39;) is not a function.&#39;</span><span class="p">)</span>
</span><span id="L-217"><a href="#L-217"><span class="linenos">217</span></a>        <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">yd</span><span class="p">[</span><span class="n">key</span><span class="p">]):</span>
</span><span id="L-218"><a href="#L-218"><span class="linenos">218</span></a>            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;x and y input (key=&#39;</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s1">&#39;) do not have the same length&#39;</span><span class="p">)</span>
</span><span id="L-219"><a href="#L-219"><span class="linenos">219</span></a>        <span class="k">for</span> <span class="n">n_loc</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
</span><span id="L-220"><a href="#L-220"><span class="linenos">220</span></a>            <span class="k">try</span><span class="p">:</span>
</span><span id="L-221"><a href="#L-221"><span class="linenos">221</span></a>                <span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">](</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">n_loc</span><span class="p">),</span> <span class="n">x_all</span><span class="o">.</span><span class="n">T</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="L-222"><a href="#L-222"><span class="linenos">222</span></a>            <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
</span><span id="L-223"><a href="#L-223"><span class="linenos">223</span></a>                <span class="k">continue</span>
</span><span id="L-224"><a href="#L-224"><span class="linenos">224</span></a>            <span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
</span><span id="L-225"><a href="#L-225"><span class="linenos">225</span></a>                <span class="k">continue</span>
</span><span id="L-226"><a href="#L-226"><span class="linenos">226</span></a>            <span class="k">else</span><span class="p">:</span>
</span><span id="L-227"><a href="#L-227"><span class="linenos">227</span></a>                <span class="k">break</span>
</span><span id="L-228"><a href="#L-228"><span class="linenos">228</span></a>        <span class="k">else</span><span class="p">:</span>
</span><span id="L-229"><a href="#L-229"><span class="linenos">229</span></a>            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Fit function (key=&quot;</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s2">&quot;) is not valid.&quot;</span><span class="p">)</span>
</span><span id="L-230"><a href="#L-230"><span class="linenos">230</span></a>        <span class="n">n_parms_ls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">n_loc</span><span class="p">)</span>
</span><span id="L-231"><a href="#L-231"><span class="linenos">231</span></a>
</span><span id="L-232"><a href="#L-232"><span class="linenos">232</span></a>    <span class="n">n_parms</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">n_parms_ls</span><span class="p">)</span>
</span><span id="L-233"><a href="#L-233"><span class="linenos">233</span></a>
</span><span id="L-234"><a href="#L-234"><span class="linenos">234</span></a>    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">key_ls</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="L-235"><a href="#L-235"><span class="linenos">235</span></a>        <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="L-236"><a href="#L-236"><span class="linenos">236</span></a>            <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">yd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span><span class="o">.</span><span class="n">shape</span> <span class="o">!=</span> <span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">](</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">n_parms</span><span class="p">),</span> <span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span><span class="o">.</span><span class="n">shape</span><span class="p">:</span>
</span><span id="L-237"><a href="#L-237"><span class="linenos">237</span></a>                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Fit function </span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2"> returns the wrong shape (</span><span class="si">{</span><span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">](</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">n_parms</span><span class="p">),</span><span class="w"> </span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span><span class="o">.</span><span class="n">shape</span><span class="si">}</span><span class="s2"> instead of </span><span class="si">{</span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="n">shape</span><span class="si">}</span><span class="s2">)</span><span class="se">\n</span><span class="s2">If the fit function is just a constant you could try adding x*0 to get the correct shape.&quot;</span><span class="p">)</span>
</span><span id="L-238"><a href="#L-238"><span class="linenos">238</span></a>
</span><span id="L-239"><a href="#L-239"><span class="linenos">239</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="L-240"><a href="#L-240"><span class="linenos">240</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Fit with&#39;</span><span class="p">,</span> <span class="n">n_parms</span><span class="p">,</span> <span class="s1">&#39;parameter&#39;</span> <span class="o">+</span> <span class="s1">&#39;s&#39;</span> <span class="o">*</span> <span class="p">(</span><span class="n">n_parms</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">))</span>
</span><span id="L-241"><a href="#L-241"><span class="linenos">241</span></a>
</span><span id="L-242"><a href="#L-242"><span class="linenos">242</span></a>    <span class="k">if</span> <span class="n">priors</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-243"><a href="#L-243"><span class="linenos">243</span></a>        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">priors</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">)):</span>
</span><span id="L-244"><a href="#L-244"><span class="linenos">244</span></a>            <span class="k">if</span> <span class="n">n_parms</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">priors</span><span class="p">):</span>
</span><span id="L-245"><a href="#L-245"><span class="linenos">245</span></a>                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;&#39;priors&#39; does not have the correct length.&quot;</span><span class="p">)</span>
</span><span id="L-246"><a href="#L-246"><span class="linenos">246</span></a>
</span><span id="L-247"><a href="#L-247"><span class="linenos">247</span></a>            <span class="n">loc_priors</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-248"><a href="#L-248"><span class="linenos">248</span></a>            <span class="k">for</span> <span class="n">i_n</span><span class="p">,</span> <span class="n">i_prior</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">priors</span><span class="p">):</span>
</span><span id="L-249"><a href="#L-249"><span class="linenos">249</span></a>                <span class="n">loc_priors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_construct_prior_obs</span><span class="p">(</span><span class="n">i_prior</span><span class="p">,</span> <span class="n">i_n</span><span class="p">))</span>
</span><span id="L-250"><a href="#L-250"><span class="linenos">250</span></a>
</span><span id="L-251"><a href="#L-251"><span class="linenos">251</span></a>            <span class="n">prior_mask</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">priors</span><span class="p">))</span>
</span><span id="L-252"><a href="#L-252"><span class="linenos">252</span></a>            <span class="n">output</span><span class="o">.</span><span class="n">priors</span> <span class="o">=</span> <span class="n">loc_priors</span>
</span><span id="L-253"><a href="#L-253"><span class="linenos">253</span></a>
</span><span id="L-254"><a href="#L-254"><span class="linenos">254</span></a>        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">priors</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
</span><span id="L-255"><a href="#L-255"><span class="linenos">255</span></a>            <span class="n">loc_priors</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-256"><a href="#L-256"><span class="linenos">256</span></a>            <span class="n">prior_mask</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-257"><a href="#L-257"><span class="linenos">257</span></a>            <span class="n">output</span><span class="o">.</span><span class="n">priors</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="L-258"><a href="#L-258"><span class="linenos">258</span></a>            <span class="k">for</span> <span class="n">pos</span><span class="p">,</span> <span class="n">prior</span> <span class="ow">in</span> <span class="n">priors</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span id="L-259"><a href="#L-259"><span class="linenos">259</span></a>                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
</span><span id="L-260"><a href="#L-260"><span class="linenos">260</span></a>                    <span class="n">prior_mask</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pos</span><span class="p">)</span>
</span><span id="L-261"><a href="#L-261"><span class="linenos">261</span></a>                <span class="k">else</span><span class="p">:</span>
</span><span id="L-262"><a href="#L-262"><span class="linenos">262</span></a>                    <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Prior position needs to be an integer.&quot;</span><span class="p">)</span>
</span><span id="L-263"><a href="#L-263"><span class="linenos">263</span></a>                <span class="n">loc_priors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_construct_prior_obs</span><span class="p">(</span><span class="n">prior</span><span class="p">,</span> <span class="n">pos</span><span class="p">))</span>
</span><span id="L-264"><a href="#L-264"><span class="linenos">264</span></a>
</span><span id="L-265"><a href="#L-265"><span class="linenos">265</span></a>                <span class="n">output</span><span class="o">.</span><span class="n">priors</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">=</span> <span class="n">loc_priors</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span><span id="L-266"><a href="#L-266"><span class="linenos">266</span></a>            <span class="k">if</span> <span class="nb">max</span><span class="p">(</span><span class="n">prior_mask</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">n_parms</span><span class="p">:</span>
</span><span id="L-267"><a href="#L-267"><span class="linenos">267</span></a>                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Prior position out of range.&quot;</span><span class="p">)</span>
</span><span id="L-268"><a href="#L-268"><span class="linenos">268</span></a>        <span class="k">else</span><span class="p">:</span>
</span><span id="L-269"><a href="#L-269"><span class="linenos">269</span></a>            <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Unkown type for `priors`.&quot;</span><span class="p">)</span>
</span><span id="L-270"><a href="#L-270"><span class="linenos">270</span></a>
</span><span id="L-271"><a href="#L-271"><span class="linenos">271</span></a>        <span class="n">p_f</span> <span class="o">=</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">loc_priors</span><span class="p">]</span>
</span><span id="L-272"><a href="#L-272"><span class="linenos">272</span></a>        <span class="n">dp_f</span> <span class="o">=</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">dvalue</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">loc_priors</span><span class="p">]</span>
</span><span id="L-273"><a href="#L-273"><span class="linenos">273</span></a>        <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">dp_f</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mf">0.0</span><span class="p">):</span>
</span><span id="L-274"><a href="#L-274"><span class="linenos">274</span></a>            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;No prior errors available, run the gamma method first.&quot;</span><span class="p">)</span>
</span><span id="L-275"><a href="#L-275"><span class="linenos">275</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-276"><a href="#L-276"><span class="linenos">276</span></a>        <span class="n">p_f</span> <span class="o">=</span> <span class="n">dp_f</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([])</span>
</span><span id="L-277"><a href="#L-277"><span class="linenos">277</span></a>        <span class="n">prior_mask</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-278"><a href="#L-278"><span class="linenos">278</span></a>        <span class="n">loc_priors</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-279"><a href="#L-279"><span class="linenos">279</span></a>
</span><span id="L-280"><a href="#L-280"><span class="linenos">280</span></a>    <span class="k">if</span> <span class="s1">&#39;initial_guess&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
</span><span id="L-281"><a href="#L-281"><span class="linenos">281</span></a>        <span class="n">x0</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;initial_guess&#39;</span><span class="p">)</span>
</span><span id="L-282"><a href="#L-282"><span class="linenos">282</span></a>        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">)</span> <span class="o">!=</span> <span class="n">n_parms</span><span class="p">:</span>
</span><span id="L-283"><a href="#L-283"><span class="linenos">283</span></a>            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Initial guess does not have the correct length: </span><span class="si">%d</span><span class="s1"> vs. </span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">),</span> <span class="n">n_parms</span><span class="p">))</span>
</span><span id="L-284"><a href="#L-284"><span class="linenos">284</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-285"><a href="#L-285"><span class="linenos">285</span></a>        <span class="n">x0</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.1</span><span class="p">]</span> <span class="o">*</span> <span class="n">n_parms</span>
</span><span id="L-286"><a href="#L-286"><span class="linenos">286</span></a>
</span><span id="L-287"><a href="#L-287"><span class="linenos">287</span></a>    <span class="k">if</span> <span class="n">priors</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-288"><a href="#L-288"><span class="linenos">288</span></a>        <span class="k">def</span> <span class="nf">general_chisqfunc_uncorr</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">ivars</span><span class="p">,</span> <span class="n">pr</span><span class="p">):</span>
</span><span id="L-289"><a href="#L-289"><span class="linenos">289</span></a>            <span class="n">model</span> <span class="o">=</span> <span class="n">anp</span><span class="o">.</span><span class="n">concatenate</span><span class="p">([</span><span class="n">anp</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">](</span><span class="n">p</span><span class="p">,</span> <span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">])</span>
</span><span id="L-290"><a href="#L-290"><span class="linenos">290</span></a>            <span class="k">return</span> <span class="p">(</span><span class="n">ivars</span> <span class="o">-</span> <span class="n">model</span><span class="p">)</span> <span class="o">/</span> <span class="n">dy_f</span>
</span><span id="L-291"><a href="#L-291"><span class="linenos">291</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-292"><a href="#L-292"><span class="linenos">292</span></a>        <span class="k">def</span> <span class="nf">general_chisqfunc_uncorr</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">ivars</span><span class="p">,</span> <span class="n">pr</span><span class="p">):</span>
</span><span id="L-293"><a href="#L-293"><span class="linenos">293</span></a>            <span class="n">model</span> <span class="o">=</span> <span class="n">anp</span><span class="o">.</span><span class="n">concatenate</span><span class="p">([</span><span class="n">anp</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">](</span><span class="n">p</span><span class="p">,</span> <span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">])</span>
</span><span id="L-294"><a href="#L-294"><span class="linenos">294</span></a>            <span class="k">return</span> <span class="n">anp</span><span class="o">.</span><span class="n">concatenate</span><span class="p">(((</span><span class="n">ivars</span> <span class="o">-</span> <span class="n">model</span><span class="p">)</span> <span class="o">/</span> <span class="n">dy_f</span><span class="p">,</span> <span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="n">prior_mask</span><span class="p">]</span> <span class="o">-</span> <span class="n">pr</span><span class="p">)</span> <span class="o">/</span> <span class="n">dp_f</span><span class="p">))</span>
</span><span id="L-295"><a href="#L-295"><span class="linenos">295</span></a>
</span><span id="L-296"><a href="#L-296"><span class="linenos">296</span></a>    <span class="k">def</span> <span class="nf">chisqfunc_uncorr</span><span class="p">(</span><span class="n">p</span><span class="p">):</span>
</span><span id="L-297"><a href="#L-297"><span class="linenos">297</span></a>        <span class="k">return</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">general_chisqfunc_uncorr</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">y_f</span><span class="p">,</span> <span class="n">p_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="L-298"><a href="#L-298"><span class="linenos">298</span></a>
</span><span id="L-299"><a href="#L-299"><span class="linenos">299</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;correlated_fit&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-300"><a href="#L-300"><span class="linenos">300</span></a>        <span class="n">corr</span> <span class="o">=</span> <span class="n">covariance</span><span class="p">(</span><span class="n">y_all</span><span class="p">,</span> <span class="n">correlation</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="L-301"><a href="#L-301"><span class="linenos">301</span></a>        <span class="n">covdiag</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">diag</span><span class="p">(</span><span class="mi">1</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">dy_f</span><span class="p">))</span>
</span><span id="L-302"><a href="#L-302"><span class="linenos">302</span></a>        <span class="n">condn</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">cond</span><span class="p">(</span><span class="n">corr</span><span class="p">)</span>
</span><span id="L-303"><a href="#L-303"><span class="linenos">303</span></a>        <span class="k">if</span> <span class="n">condn</span> <span class="o">&gt;</span> <span class="mf">0.1</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">:</span>
</span><span id="L-304"><a href="#L-304"><span class="linenos">304</span></a>            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Cannot invert correlation matrix as its condition number exceeds machine precision (</span><span class="si">{</span><span class="n">condn</span><span class="si">:</span><span class="s2">1.2e</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">)</span>
</span><span id="L-305"><a href="#L-305"><span class="linenos">305</span></a>        <span class="k">if</span> <span class="n">condn</span> <span class="o">&gt;</span> <span class="mf">1e13</span><span class="p">:</span>
</span><span id="L-306"><a href="#L-306"><span class="linenos">306</span></a>            <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">&quot;Correlation matrix may be ill-conditioned, condition number: {</span><span class="si">%1.2e</span><span class="s2">}&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">condn</span><span class="p">),</span> <span class="ne">RuntimeWarning</span><span class="p">)</span>
</span><span id="L-307"><a href="#L-307"><span class="linenos">307</span></a>        <span class="n">chol</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">cholesky</span><span class="p">(</span><span class="n">corr</span><span class="p">)</span>
</span><span id="L-308"><a href="#L-308"><span class="linenos">308</span></a>        <span class="n">chol_inv</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">solve_triangular</span><span class="p">(</span><span class="n">chol</span><span class="p">,</span> <span class="n">covdiag</span><span class="p">,</span> <span class="n">lower</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-309"><a href="#L-309"><span class="linenos">309</span></a>
</span><span id="L-310"><a href="#L-310"><span class="linenos">310</span></a>        <span class="k">def</span> <span class="nf">general_chisqfunc</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">ivars</span><span class="p">,</span> <span class="n">pr</span><span class="p">):</span>
</span><span id="L-311"><a href="#L-311"><span class="linenos">311</span></a>            <span class="n">model</span> <span class="o">=</span> <span class="n">anp</span><span class="o">.</span><span class="n">concatenate</span><span class="p">([</span><span class="n">anp</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">](</span><span class="n">p</span><span class="p">,</span> <span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">])</span>
</span><span id="L-312"><a href="#L-312"><span class="linenos">312</span></a>            <span class="k">return</span> <span class="n">anp</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">anp</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">chol_inv</span><span class="p">,</span> <span class="p">(</span><span class="n">ivars</span> <span class="o">-</span> <span class="n">model</span><span class="p">)),</span> <span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="n">prior_mask</span><span class="p">]</span> <span class="o">-</span> <span class="n">pr</span><span class="p">)</span> <span class="o">/</span> <span class="n">dp_f</span><span class="p">))</span>
</span><span id="L-313"><a href="#L-313"><span class="linenos">313</span></a>
</span><span id="L-314"><a href="#L-314"><span class="linenos">314</span></a>        <span class="k">def</span> <span class="nf">chisqfunc</span><span class="p">(</span><span class="n">p</span><span class="p">):</span>
</span><span id="L-315"><a href="#L-315"><span class="linenos">315</span></a>            <span class="k">return</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">general_chisqfunc</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">y_f</span><span class="p">,</span> <span class="n">p_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="L-316"><a href="#L-316"><span class="linenos">316</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-317"><a href="#L-317"><span class="linenos">317</span></a>        <span class="n">general_chisqfunc</span> <span class="o">=</span> <span class="n">general_chisqfunc_uncorr</span>
</span><span id="L-318"><a href="#L-318"><span class="linenos">318</span></a>        <span class="n">chisqfunc</span> <span class="o">=</span> <span class="n">chisqfunc_uncorr</span>
</span><span id="L-319"><a href="#L-319"><span class="linenos">319</span></a>
</span><span id="L-320"><a href="#L-320"><span class="linenos">320</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;method&#39;</span><span class="p">,</span> <span class="s1">&#39;Levenberg-Marquardt&#39;</span><span class="p">)</span>
</span><span id="L-321"><a href="#L-321"><span class="linenos">321</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="L-322"><a href="#L-322"><span class="linenos">322</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Method:&#39;</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">method</span><span class="p">)</span>
</span><span id="L-323"><a href="#L-323"><span class="linenos">323</span></a>
</span><span id="L-324"><a href="#L-324"><span class="linenos">324</span></a>    <span class="k">if</span> <span class="n">output</span><span class="o">.</span><span class="n">method</span> <span class="o">!=</span> <span class="s1">&#39;Levenberg-Marquardt&#39;</span><span class="p">:</span>
</span><span id="L-325"><a href="#L-325"><span class="linenos">325</span></a>        <span class="k">if</span> <span class="n">output</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;migrad&#39;</span><span class="p">:</span>
</span><span id="L-326"><a href="#L-326"><span class="linenos">326</span></a>            <span class="n">tolerance</span> <span class="o">=</span> <span class="mf">1e-4</span>  <span class="c1"># default value of 1e-1 set by iminuit can be problematic</span>
</span><span id="L-327"><a href="#L-327"><span class="linenos">327</span></a>            <span class="k">if</span> <span class="s1">&#39;tol&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
</span><span id="L-328"><a href="#L-328"><span class="linenos">328</span></a>                <span class="n">tolerance</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;tol&#39;</span><span class="p">)</span>
</span><span id="L-329"><a href="#L-329"><span class="linenos">329</span></a>            <span class="n">fit_result</span> <span class="o">=</span> <span class="n">iminuit</span><span class="o">.</span><span class="n">minimize</span><span class="p">(</span><span class="n">chisqfunc_uncorr</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">tol</span><span class="o">=</span><span class="n">tolerance</span><span class="p">)</span>  <span class="c1"># Stopping criterion 0.002 * tol * errordef</span>
</span><span id="L-330"><a href="#L-330"><span class="linenos">330</span></a>            <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;correlated_fit&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-331"><a href="#L-331"><span class="linenos">331</span></a>                <span class="n">fit_result</span> <span class="o">=</span> <span class="n">iminuit</span><span class="o">.</span><span class="n">minimize</span><span class="p">(</span><span class="n">chisqfunc</span><span class="p">,</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">tol</span><span class="o">=</span><span class="n">tolerance</span><span class="p">)</span>
</span><span id="L-332"><a href="#L-332"><span class="linenos">332</span></a>            <span class="n">output</span><span class="o">.</span><span class="n">iterations</span> <span class="o">=</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">nfev</span>
</span><span id="L-333"><a href="#L-333"><span class="linenos">333</span></a>        <span class="k">else</span><span class="p">:</span>
</span><span id="L-334"><a href="#L-334"><span class="linenos">334</span></a>            <span class="n">tolerance</span> <span class="o">=</span> <span class="mf">1e-12</span>
</span><span id="L-335"><a href="#L-335"><span class="linenos">335</span></a>            <span class="k">if</span> <span class="s1">&#39;tol&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
</span><span id="L-336"><a href="#L-336"><span class="linenos">336</span></a>                <span class="n">tolerance</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;tol&#39;</span><span class="p">)</span>
</span><span id="L-337"><a href="#L-337"><span class="linenos">337</span></a>            <span class="n">fit_result</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">optimize</span><span class="o">.</span><span class="n">minimize</span><span class="p">(</span><span class="n">chisqfunc_uncorr</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;method&#39;</span><span class="p">),</span> <span class="n">tol</span><span class="o">=</span><span class="n">tolerance</span><span class="p">)</span>
</span><span id="L-338"><a href="#L-338"><span class="linenos">338</span></a>            <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;correlated_fit&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-339"><a href="#L-339"><span class="linenos">339</span></a>                <span class="n">fit_result</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">optimize</span><span class="o">.</span><span class="n">minimize</span><span class="p">(</span><span class="n">chisqfunc</span><span class="p">,</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;method&#39;</span><span class="p">),</span> <span class="n">tol</span><span class="o">=</span><span class="n">tolerance</span><span class="p">)</span>
</span><span id="L-340"><a href="#L-340"><span class="linenos">340</span></a>            <span class="n">output</span><span class="o">.</span><span class="n">iterations</span> <span class="o">=</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">nit</span>
</span><span id="L-341"><a href="#L-341"><span class="linenos">341</span></a>
</span><span id="L-342"><a href="#L-342"><span class="linenos">342</span></a>        <span class="n">chisquare</span> <span class="o">=</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">fun</span>
</span><span id="L-343"><a href="#L-343"><span class="linenos">343</span></a>
</span><span id="L-344"><a href="#L-344"><span class="linenos">344</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-345"><a href="#L-345"><span class="linenos">345</span></a>        <span class="k">if</span> <span class="s1">&#39;tol&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
</span><span id="L-346"><a href="#L-346"><span class="linenos">346</span></a>            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;tol cannot be set for Levenberg-Marquardt&#39;</span><span class="p">)</span>
</span><span id="L-347"><a href="#L-347"><span class="linenos">347</span></a>
</span><span id="L-348"><a href="#L-348"><span class="linenos">348</span></a>        <span class="k">def</span> <span class="nf">chisqfunc_residuals_uncorr</span><span class="p">(</span><span class="n">p</span><span class="p">):</span>
</span><span id="L-349"><a href="#L-349"><span class="linenos">349</span></a>            <span class="k">return</span> <span class="n">general_chisqfunc_uncorr</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">y_f</span><span class="p">,</span> <span class="n">p_f</span><span class="p">)</span>
</span><span id="L-350"><a href="#L-350"><span class="linenos">350</span></a>
</span><span id="L-351"><a href="#L-351"><span class="linenos">351</span></a>        <span class="n">fit_result</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">optimize</span><span class="o">.</span><span class="n">least_squares</span><span class="p">(</span><span class="n">chisqfunc_residuals_uncorr</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">&#39;lm&#39;</span><span class="p">,</span> <span class="n">ftol</span><span class="o">=</span><span class="mf">1e-15</span><span class="p">,</span> <span class="n">gtol</span><span class="o">=</span><span class="mf">1e-15</span><span class="p">,</span> <span class="n">xtol</span><span class="o">=</span><span class="mf">1e-15</span><span class="p">)</span>
</span><span id="L-352"><a href="#L-352"><span class="linenos">352</span></a>        <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;correlated_fit&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-353"><a href="#L-353"><span class="linenos">353</span></a>
</span><span id="L-354"><a href="#L-354"><span class="linenos">354</span></a>            <span class="k">def</span> <span class="nf">chisqfunc_residuals</span><span class="p">(</span><span class="n">p</span><span class="p">):</span>
</span><span id="L-355"><a href="#L-355"><span class="linenos">355</span></a>                <span class="k">return</span> <span class="n">general_chisqfunc</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">y_f</span><span class="p">,</span> <span class="n">p_f</span><span class="p">)</span>
</span><span id="L-356"><a href="#L-356"><span class="linenos">356</span></a>
</span><span id="L-357"><a href="#L-357"><span class="linenos">357</span></a>            <span class="n">fit_result</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">optimize</span><span class="o">.</span><span class="n">least_squares</span><span class="p">(</span><span class="n">chisqfunc_residuals</span><span class="p">,</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">&#39;lm&#39;</span><span class="p">,</span> <span class="n">ftol</span><span class="o">=</span><span class="mf">1e-15</span><span class="p">,</span> <span class="n">gtol</span><span class="o">=</span><span class="mf">1e-15</span><span class="p">,</span> <span class="n">xtol</span><span class="o">=</span><span class="mf">1e-15</span><span class="p">)</span>
</span><span id="L-358"><a href="#L-358"><span class="linenos">358</span></a>
</span><span id="L-359"><a href="#L-359"><span class="linenos">359</span></a>        <span class="n">chisquare</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">fit_result</span><span class="o">.</span><span class="n">fun</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="L-360"><a href="#L-360"><span class="linenos">360</span></a>        <span class="k">assert</span> <span class="n">np</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">chisquare</span><span class="p">,</span> <span class="n">chisqfunc</span><span class="p">(</span><span class="n">fit_result</span><span class="o">.</span><span class="n">x</span><span class="p">),</span> <span class="n">atol</span><span class="o">=</span><span class="mf">1e-14</span><span class="p">)</span>
</span><span id="L-361"><a href="#L-361"><span class="linenos">361</span></a>
</span><span id="L-362"><a href="#L-362"><span class="linenos">362</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">iterations</span> <span class="o">=</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">nfev</span>
</span><span id="L-363"><a href="#L-363"><span class="linenos">363</span></a>
</span><span id="L-364"><a href="#L-364"><span class="linenos">364</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">success</span><span class="p">:</span>
</span><span id="L-365"><a href="#L-365"><span class="linenos">365</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;The minimization procedure did not converge.&#39;</span><span class="p">)</span>
</span><span id="L-366"><a href="#L-366"><span class="linenos">366</span></a>
</span><span id="L-367"><a href="#L-367"><span class="linenos">367</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">chisquare</span> <span class="o">=</span> <span class="n">chisquare</span>
</span><span id="L-368"><a href="#L-368"><span class="linenos">368</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">dof</span> <span class="o">=</span> <span class="n">y_all</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">n_parms</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">loc_priors</span><span class="p">)</span>
</span><span id="L-369"><a href="#L-369"><span class="linenos">369</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">p_value</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">scipy</span><span class="o">.</span><span class="n">stats</span><span class="o">.</span><span class="n">chi2</span><span class="o">.</span><span class="n">cdf</span><span class="p">(</span><span class="n">output</span><span class="o">.</span><span class="n">chisquare</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">dof</span><span class="p">)</span>
</span><span id="L-370"><a href="#L-370"><span class="linenos">370</span></a>    <span class="k">if</span> <span class="n">output</span><span class="o">.</span><span class="n">dof</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="L-371"><a href="#L-371"><span class="linenos">371</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_dof</span> <span class="o">=</span> <span class="n">output</span><span class="o">.</span><span class="n">chisquare</span> <span class="o">/</span> <span class="n">output</span><span class="o">.</span><span class="n">dof</span>
</span><span id="L-372"><a href="#L-372"><span class="linenos">372</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-373"><a href="#L-373"><span class="linenos">373</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_dof</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="s1">&#39;nan&#39;</span><span class="p">)</span>
</span><span id="L-374"><a href="#L-374"><span class="linenos">374</span></a>
</span><span id="L-375"><a href="#L-375"><span class="linenos">375</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">message</span>
</span><span id="L-376"><a href="#L-376"><span class="linenos">376</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="L-377"><a href="#L-377"><span class="linenos">377</span></a>        <span class="nb">print</span><span class="p">(</span><span class="n">fit_result</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="L-378"><a href="#L-378"><span class="linenos">378</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;chisquare/d.o.f.:&#39;</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_dof</span><span class="p">)</span>
</span><span id="L-379"><a href="#L-379"><span class="linenos">379</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;fit parameters&#39;</span><span class="p">,</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">x</span><span class="p">)</span>
</span><span id="L-380"><a href="#L-380"><span class="linenos">380</span></a>
</span><span id="L-381"><a href="#L-381"><span class="linenos">381</span></a>    <span class="k">def</span> <span class="nf">prepare_hat_matrix</span><span class="p">():</span>
</span><span id="L-382"><a href="#L-382"><span class="linenos">382</span></a>        <span class="n">hat_vector</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-383"><a href="#L-383"><span class="linenos">383</span></a>        <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="L-384"><a href="#L-384"><span class="linenos">384</span></a>            <span class="k">if</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">):</span>
</span><span id="L-385"><a href="#L-385"><span class="linenos">385</span></a>                <span class="n">hat_vector</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">jacobian</span><span class="p">(</span><span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">])(</span><span class="n">fit_result</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span>
</span><span id="L-386"><a href="#L-386"><span class="linenos">386</span></a>        <span class="n">hat_vector</span> <span class="o">=</span> <span class="p">[</span><span class="n">item</span> <span class="k">for</span> <span class="n">sublist</span> <span class="ow">in</span> <span class="n">hat_vector</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">sublist</span><span class="p">]</span>
</span><span id="L-387"><a href="#L-387"><span class="linenos">387</span></a>        <span class="k">return</span> <span class="n">hat_vector</span>
</span><span id="L-388"><a href="#L-388"><span class="linenos">388</span></a>
</span><span id="L-389"><a href="#L-389"><span class="linenos">389</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;expected_chisquare&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-390"><a href="#L-390"><span class="linenos">390</span></a>        <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;correlated_fit&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-391"><a href="#L-391"><span class="linenos">391</span></a>            <span class="n">W</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">diag</span><span class="p">(</span><span class="mi">1</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">dy_f</span><span class="p">))</span>
</span><span id="L-392"><a href="#L-392"><span class="linenos">392</span></a>            <span class="n">cov</span> <span class="o">=</span> <span class="n">covariance</span><span class="p">(</span><span class="n">y_all</span><span class="p">)</span>
</span><span id="L-393"><a href="#L-393"><span class="linenos">393</span></a>            <span class="n">hat_vector</span> <span class="o">=</span> <span class="n">prepare_hat_matrix</span><span class="p">()</span>
</span><span id="L-394"><a href="#L-394"><span class="linenos">394</span></a>            <span class="n">A</span> <span class="o">=</span> <span class="n">W</span> <span class="o">@</span> <span class="n">hat_vector</span>
</span><span id="L-395"><a href="#L-395"><span class="linenos">395</span></a>            <span class="n">P_phi</span> <span class="o">=</span> <span class="n">A</span> <span class="o">@</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">pinv</span><span class="p">(</span><span class="n">A</span><span class="o">.</span><span class="n">T</span> <span class="o">@</span> <span class="n">A</span><span class="p">)</span> <span class="o">@</span> <span class="n">A</span><span class="o">.</span><span class="n">T</span>
</span><span id="L-396"><a href="#L-396"><span class="linenos">396</span></a>            <span class="n">expected_chisquare</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">trace</span><span class="p">((</span><span class="n">np</span><span class="o">.</span><span class="n">identity</span><span class="p">(</span><span class="n">y_all</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">-</span> <span class="n">P_phi</span><span class="p">)</span> <span class="o">@</span> <span class="n">W</span> <span class="o">@</span> <span class="n">cov</span> <span class="o">@</span> <span class="n">W</span><span class="p">)</span>
</span><span id="L-397"><a href="#L-397"><span class="linenos">397</span></a>            <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_expected_chisquare</span> <span class="o">=</span> <span class="n">output</span><span class="o">.</span><span class="n">chisquare</span> <span class="o">/</span> <span class="n">expected_chisquare</span>
</span><span id="L-398"><a href="#L-398"><span class="linenos">398</span></a>            <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="L-399"><a href="#L-399"><span class="linenos">399</span></a>                <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;chisquare/expected_chisquare:&#39;</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_expected_chisquare</span><span class="p">)</span>
</span><span id="L-400"><a href="#L-400"><span class="linenos">400</span></a>
</span><span id="L-401"><a href="#L-401"><span class="linenos">401</span></a>    <span class="n">fitp</span> <span class="o">=</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">x</span>
</span><span id="L-402"><a href="#L-402"><span class="linenos">402</span></a>
</span><span id="L-403"><a href="#L-403"><span class="linenos">403</span></a>    <span class="k">try</span><span class="p">:</span>
</span><span id="L-404"><a href="#L-404"><span class="linenos">404</span></a>        <span class="n">hess</span> <span class="o">=</span> <span class="n">hessian</span><span class="p">(</span><span class="n">chisqfunc</span><span class="p">)(</span><span class="n">fitp</span><span class="p">)</span>
</span><span id="L-405"><a href="#L-405"><span class="linenos">405</span></a>    <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
</span><span id="L-406"><a href="#L-406"><span class="linenos">406</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;It is required to use autograd.numpy instead of numpy within fit functions, see the documentation for details.&quot;</span><span class="p">)</span> <span class="kn">from</span> <span class="kc">None</span>
</span><span id="L-407"><a href="#L-407"><span class="linenos">407</span></a>
</span><span id="L-408"><a href="#L-408"><span class="linenos">408</span></a>    <span class="n">len_y</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">y_f</span><span class="p">)</span>
</span><span id="L-409"><a href="#L-409"><span class="linenos">409</span></a>
</span><span id="L-410"><a href="#L-410"><span class="linenos">410</span></a>    <span class="k">def</span> <span class="nf">chisqfunc_compact</span><span class="p">(</span><span class="n">d</span><span class="p">):</span>
</span><span id="L-411"><a href="#L-411"><span class="linenos">411</span></a>        <span class="k">return</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">general_chisqfunc</span><span class="p">(</span><span class="n">d</span><span class="p">[:</span><span class="n">n_parms</span><span class="p">],</span> <span class="n">d</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:</span> <span class="n">n_parms</span> <span class="o">+</span> <span class="n">len_y</span><span class="p">],</span> <span class="n">d</span><span class="p">[</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">len_y</span><span class="p">:])</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="L-412"><a href="#L-412"><span class="linenos">412</span></a>
</span><span id="L-413"><a href="#L-413"><span class="linenos">413</span></a>    <span class="n">jac_jac_y</span> <span class="o">=</span> <span class="n">hessian</span><span class="p">(</span><span class="n">chisqfunc_compact</span><span class="p">)(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">fitp</span><span class="p">,</span> <span class="n">y_f</span><span class="p">,</span> <span class="n">p_f</span><span class="p">)))</span>
</span><span id="L-414"><a href="#L-414"><span class="linenos">414</span></a>
</span><span id="L-415"><a href="#L-415"><span class="linenos">415</span></a>    <span class="c1"># Compute hess^{-1} @ jac_jac_y[:n_parms + m, n_parms + m:] using LAPACK dgesv</span>
</span><span id="L-416"><a href="#L-416"><span class="linenos">416</span></a>    <span class="k">try</span><span class="p">:</span>
</span><span id="L-417"><a href="#L-417"><span class="linenos">417</span></a>        <span class="n">deriv_y</span> <span class="o">=</span> <span class="o">-</span><span class="n">scipy</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">solve</span><span class="p">(</span><span class="n">hess</span><span class="p">,</span> <span class="n">jac_jac_y</span><span class="p">[:</span><span class="n">n_parms</span><span class="p">,</span> <span class="n">n_parms</span><span class="p">:])</span>
</span><span id="L-418"><a href="#L-418"><span class="linenos">418</span></a>    <span class="k">except</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">LinAlgError</span><span class="p">:</span>
</span><span id="L-419"><a href="#L-419"><span class="linenos">419</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Cannot invert hessian matrix.&quot;</span><span class="p">)</span>
</span><span id="L-420"><a href="#L-420"><span class="linenos">420</span></a>
</span><span id="L-421"><a href="#L-421"><span class="linenos">421</span></a>    <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-422"><a href="#L-422"><span class="linenos">422</span></a>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n_parms</span><span class="p">):</span>
</span><span id="L-423"><a href="#L-423"><span class="linenos">423</span></a>        <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">derived_observable</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x_all</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="p">(</span><span class="n">x_all</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">y_all</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">)</span> <span class="o">*</span> <span class="n">fitp</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="nb">list</span><span class="p">(</span><span class="n">y_all</span><span class="p">)</span> <span class="o">+</span> <span class="n">loc_priors</span><span class="p">,</span> <span class="n">man_grad</span><span class="o">=</span><span class="nb">list</span><span class="p">(</span><span class="n">deriv_y</span><span class="p">[</span><span class="n">i</span><span class="p">])))</span>
</span><span id="L-424"><a href="#L-424"><span class="linenos">424</span></a>
</span><span id="L-425"><a href="#L-425"><span class="linenos">425</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">fit_parameters</span> <span class="o">=</span> <span class="n">result</span>
</span><span id="L-426"><a href="#L-426"><span class="linenos">426</span></a>
</span><span id="L-427"><a href="#L-427"><span class="linenos">427</span></a>    <span class="c1"># Hotelling t-squared p-value for correlated fits.</span>
</span><span id="L-428"><a href="#L-428"><span class="linenos">428</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;correlated_fit&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-429"><a href="#L-429"><span class="linenos">429</span></a>        <span class="n">n_cov</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">vectorize</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x_all</span><span class="p">:</span> <span class="n">x_all</span><span class="o">.</span><span class="n">N</span><span class="p">)(</span><span class="n">y_all</span><span class="p">))</span>
</span><span id="L-430"><a href="#L-430"><span class="linenos">430</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">t2_p_value</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">scipy</span><span class="o">.</span><span class="n">stats</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">cdf</span><span class="p">((</span><span class="n">n_cov</span> <span class="o">-</span> <span class="n">output</span><span class="o">.</span><span class="n">dof</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">output</span><span class="o">.</span><span class="n">dof</span> <span class="o">*</span> <span class="p">(</span><span class="n">n_cov</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> <span class="o">*</span> <span class="n">output</span><span class="o">.</span><span class="n">chisquare</span><span class="p">,</span>
</span><span id="L-431"><a href="#L-431"><span class="linenos">431</span></a>                                                  <span class="n">output</span><span class="o">.</span><span class="n">dof</span><span class="p">,</span> <span class="n">n_cov</span> <span class="o">-</span> <span class="n">output</span><span class="o">.</span><span class="n">dof</span><span class="p">)</span>
</span><span id="L-432"><a href="#L-432"><span class="linenos">432</span></a>
</span><span id="L-433"><a href="#L-433"><span class="linenos">433</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;resplot&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-434"><a href="#L-434"><span class="linenos">434</span></a>        <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="L-435"><a href="#L-435"><span class="linenos">435</span></a>            <span class="n">residual_plot</span><span class="p">(</span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">yd</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">result</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
</span><span id="L-436"><a href="#L-436"><span class="linenos">436</span></a>
</span><span id="L-437"><a href="#L-437"><span class="linenos">437</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;qqplot&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-438"><a href="#L-438"><span class="linenos">438</span></a>        <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="L-439"><a href="#L-439"><span class="linenos">439</span></a>            <span class="n">qqplot</span><span class="p">(</span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">yd</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">result</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
</span><span id="L-440"><a href="#L-440"><span class="linenos">440</span></a>
</span><span id="L-441"><a href="#L-441"><span class="linenos">441</span></a>    <span class="k">return</span> <span class="n">output</span>
</span><span id="L-442"><a href="#L-442"><span class="linenos">442</span></a>
</span><span id="L-443"><a href="#L-443"><span class="linenos">443</span></a>
</span><span id="L-444"><a href="#L-444"><span class="linenos">444</span></a><span class="k">def</span> <span class="nf">total_least_squares</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="L-445"><a href="#L-445"><span class="linenos">445</span></a><span class="w">    </span><span class="sa">r</span><span class="sd">&#39;&#39;&#39;Performs a non-linear fit to y = func(x) and returns a list of Obs corresponding to the fit parameters.</span>
</span><span id="L-446"><a href="#L-446"><span class="linenos">446</span></a>
</span><span id="L-447"><a href="#L-447"><span class="linenos">447</span></a><span class="sd">    Parameters</span>
</span><span id="L-448"><a href="#L-448"><span class="linenos">448</span></a><span class="sd">    ----------</span>
</span><span id="L-449"><a href="#L-449"><span class="linenos">449</span></a><span class="sd">    x : list</span>
</span><span id="L-450"><a href="#L-450"><span class="linenos">450</span></a><span class="sd">        list of Obs, or a tuple of lists of Obs</span>
</span><span id="L-451"><a href="#L-451"><span class="linenos">451</span></a><span class="sd">    y : list</span>
</span><span id="L-452"><a href="#L-452"><span class="linenos">452</span></a><span class="sd">        list of Obs. The dvalues of the Obs are used as x- and yerror for the fit.</span>
</span><span id="L-453"><a href="#L-453"><span class="linenos">453</span></a><span class="sd">    func : object</span>
</span><span id="L-454"><a href="#L-454"><span class="linenos">454</span></a><span class="sd">        func has to be of the form</span>
</span><span id="L-455"><a href="#L-455"><span class="linenos">455</span></a>
</span><span id="L-456"><a href="#L-456"><span class="linenos">456</span></a><span class="sd">        ```python</span>
</span><span id="L-457"><a href="#L-457"><span class="linenos">457</span></a><span class="sd">        import autograd.numpy as anp</span>
</span><span id="L-458"><a href="#L-458"><span class="linenos">458</span></a>
</span><span id="L-459"><a href="#L-459"><span class="linenos">459</span></a><span class="sd">        def func(a, x):</span>
</span><span id="L-460"><a href="#L-460"><span class="linenos">460</span></a><span class="sd">            return a[0] + a[1] * x + a[2] * anp.sinh(x)</span>
</span><span id="L-461"><a href="#L-461"><span class="linenos">461</span></a><span class="sd">        ```</span>
</span><span id="L-462"><a href="#L-462"><span class="linenos">462</span></a>
</span><span id="L-463"><a href="#L-463"><span class="linenos">463</span></a><span class="sd">        For multiple x values func can be of the form</span>
</span><span id="L-464"><a href="#L-464"><span class="linenos">464</span></a>
</span><span id="L-465"><a href="#L-465"><span class="linenos">465</span></a><span class="sd">        ```python</span>
</span><span id="L-466"><a href="#L-466"><span class="linenos">466</span></a><span class="sd">        def func(a, x):</span>
</span><span id="L-467"><a href="#L-467"><span class="linenos">467</span></a><span class="sd">            (x1, x2) = x</span>
</span><span id="L-468"><a href="#L-468"><span class="linenos">468</span></a><span class="sd">            return a[0] * x1 ** 2 + a[1] * x2</span>
</span><span id="L-469"><a href="#L-469"><span class="linenos">469</span></a><span class="sd">        ```</span>
</span><span id="L-470"><a href="#L-470"><span class="linenos">470</span></a>
</span><span id="L-471"><a href="#L-471"><span class="linenos">471</span></a><span class="sd">        It is important that all numpy functions refer to autograd.numpy, otherwise the differentiation</span>
</span><span id="L-472"><a href="#L-472"><span class="linenos">472</span></a><span class="sd">        will not work.</span>
</span><span id="L-473"><a href="#L-473"><span class="linenos">473</span></a><span class="sd">    silent : bool, optional</span>
</span><span id="L-474"><a href="#L-474"><span class="linenos">474</span></a><span class="sd">        If true all output to the console is omitted (default False).</span>
</span><span id="L-475"><a href="#L-475"><span class="linenos">475</span></a><span class="sd">    initial_guess : list</span>
</span><span id="L-476"><a href="#L-476"><span class="linenos">476</span></a><span class="sd">        can provide an initial guess for the input parameters. Relevant for non-linear</span>
</span><span id="L-477"><a href="#L-477"><span class="linenos">477</span></a><span class="sd">        fits with many parameters.</span>
</span><span id="L-478"><a href="#L-478"><span class="linenos">478</span></a><span class="sd">    expected_chisquare : bool</span>
</span><span id="L-479"><a href="#L-479"><span class="linenos">479</span></a><span class="sd">        If true prints the expected chisquare which is</span>
</span><span id="L-480"><a href="#L-480"><span class="linenos">480</span></a><span class="sd">        corrected by effects caused by correlated input data.</span>
</span><span id="L-481"><a href="#L-481"><span class="linenos">481</span></a><span class="sd">        This can take a while as the full correlation matrix</span>
</span><span id="L-482"><a href="#L-482"><span class="linenos">482</span></a><span class="sd">        has to be calculated (default False).</span>
</span><span id="L-483"><a href="#L-483"><span class="linenos">483</span></a><span class="sd">    num_grad : bool</span>
</span><span id="L-484"><a href="#L-484"><span class="linenos">484</span></a><span class="sd">        Use numerical differentation instead of automatic differentiation to perform the error propagation (default False).</span>
</span><span id="L-485"><a href="#L-485"><span class="linenos">485</span></a>
</span><span id="L-486"><a href="#L-486"><span class="linenos">486</span></a><span class="sd">    Notes</span>
</span><span id="L-487"><a href="#L-487"><span class="linenos">487</span></a><span class="sd">    -----</span>
</span><span id="L-488"><a href="#L-488"><span class="linenos">488</span></a><span class="sd">    Based on the orthogonal distance regression module of scipy.</span>
</span><span id="L-489"><a href="#L-489"><span class="linenos">489</span></a>
</span><span id="L-490"><a href="#L-490"><span class="linenos">490</span></a><span class="sd">    Returns</span>
</span><span id="L-491"><a href="#L-491"><span class="linenos">491</span></a><span class="sd">    -------</span>
</span><span id="L-492"><a href="#L-492"><span class="linenos">492</span></a><span class="sd">    output : Fit_result</span>
</span><span id="L-493"><a href="#L-493"><span class="linenos">493</span></a><span class="sd">        Parameters and information on the fitted result.</span>
</span><span id="L-494"><a href="#L-494"><span class="linenos">494</span></a><span class="sd">    &#39;&#39;&#39;</span>
</span><span id="L-495"><a href="#L-495"><span class="linenos">495</span></a>
</span><span id="L-496"><a href="#L-496"><span class="linenos">496</span></a>    <span class="n">output</span> <span class="o">=</span> <span class="n">Fit_result</span><span class="p">()</span>
</span><span id="L-497"><a href="#L-497"><span class="linenos">497</span></a>
</span><span id="L-498"><a href="#L-498"><span class="linenos">498</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">fit_function</span> <span class="o">=</span> <span class="n">func</span>
</span><span id="L-499"><a href="#L-499"><span class="linenos">499</span></a>
</span><span id="L-500"><a href="#L-500"><span class="linenos">500</span></a>    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span><span id="L-501"><a href="#L-501"><span class="linenos">501</span></a>
</span><span id="L-502"><a href="#L-502"><span class="linenos">502</span></a>    <span class="n">x_shape</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">shape</span>
</span><span id="L-503"><a href="#L-503"><span class="linenos">503</span></a>
</span><span id="L-504"><a href="#L-504"><span class="linenos">504</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;num_grad&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-505"><a href="#L-505"><span class="linenos">505</span></a>        <span class="n">jacobian</span> <span class="o">=</span> <span class="n">num_jacobian</span>
</span><span id="L-506"><a href="#L-506"><span class="linenos">506</span></a>        <span class="n">hessian</span> <span class="o">=</span> <span class="n">num_hessian</span>
</span><span id="L-507"><a href="#L-507"><span class="linenos">507</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-508"><a href="#L-508"><span class="linenos">508</span></a>        <span class="n">jacobian</span> <span class="o">=</span> <span class="n">auto_jacobian</span>
</span><span id="L-509"><a href="#L-509"><span class="linenos">509</span></a>        <span class="n">hessian</span> <span class="o">=</span> <span class="n">auto_hessian</span>
</span><span id="L-510"><a href="#L-510"><span class="linenos">510</span></a>
</span><span id="L-511"><a href="#L-511"><span class="linenos">511</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
</span><span id="L-512"><a href="#L-512"><span class="linenos">512</span></a>        <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;func has to be a function.&#39;</span><span class="p">)</span>
</span><span id="L-513"><a href="#L-513"><span class="linenos">513</span></a>
</span><span id="L-514"><a href="#L-514"><span class="linenos">514</span></a>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">42</span><span class="p">):</span>
</span><span id="L-515"><a href="#L-515"><span class="linenos">515</span></a>        <span class="k">try</span><span class="p">:</span>
</span><span id="L-516"><a href="#L-516"><span class="linenos">516</span></a>            <span class="n">func</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">i</span><span class="p">),</span> <span class="n">x</span><span class="o">.</span><span class="n">T</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="L-517"><a href="#L-517"><span class="linenos">517</span></a>        <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
</span><span id="L-518"><a href="#L-518"><span class="linenos">518</span></a>            <span class="k">continue</span>
</span><span id="L-519"><a href="#L-519"><span class="linenos">519</span></a>        <span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
</span><span id="L-520"><a href="#L-520"><span class="linenos">520</span></a>            <span class="k">continue</span>
</span><span id="L-521"><a href="#L-521"><span class="linenos">521</span></a>        <span class="k">else</span><span class="p">:</span>
</span><span id="L-522"><a href="#L-522"><span class="linenos">522</span></a>            <span class="k">break</span>
</span><span id="L-523"><a href="#L-523"><span class="linenos">523</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-524"><a href="#L-524"><span class="linenos">524</span></a>        <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Fit function is not valid.&quot;</span><span class="p">)</span>
</span><span id="L-525"><a href="#L-525"><span class="linenos">525</span></a>
</span><span id="L-526"><a href="#L-526"><span class="linenos">526</span></a>    <span class="n">n_parms</span> <span class="o">=</span> <span class="n">i</span>
</span><span id="L-527"><a href="#L-527"><span class="linenos">527</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="L-528"><a href="#L-528"><span class="linenos">528</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Fit with&#39;</span><span class="p">,</span> <span class="n">n_parms</span><span class="p">,</span> <span class="s1">&#39;parameter&#39;</span> <span class="o">+</span> <span class="s1">&#39;s&#39;</span> <span class="o">*</span> <span class="p">(</span><span class="n">n_parms</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">))</span>
</span><span id="L-529"><a href="#L-529"><span class="linenos">529</span></a>
</span><span id="L-530"><a href="#L-530"><span class="linenos">530</span></a>    <span class="n">x_f</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vectorize</span><span class="p">(</span><span class="k">lambda</span> <span class="n">o</span><span class="p">:</span> <span class="n">o</span><span class="o">.</span><span class="n">value</span><span class="p">)(</span><span class="n">x</span><span class="p">)</span>
</span><span id="L-531"><a href="#L-531"><span class="linenos">531</span></a>    <span class="n">dx_f</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vectorize</span><span class="p">(</span><span class="k">lambda</span> <span class="n">o</span><span class="p">:</span> <span class="n">o</span><span class="o">.</span><span class="n">dvalue</span><span class="p">)(</span><span class="n">x</span><span class="p">)</span>
</span><span id="L-532"><a href="#L-532"><span class="linenos">532</span></a>    <span class="n">y_f</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y</span><span class="p">])</span>
</span><span id="L-533"><a href="#L-533"><span class="linenos">533</span></a>    <span class="n">dy_f</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">o</span><span class="o">.</span><span class="n">dvalue</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y</span><span class="p">])</span>
</span><span id="L-534"><a href="#L-534"><span class="linenos">534</span></a>
</span><span id="L-535"><a href="#L-535"><span class="linenos">535</span></a>    <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">dx_f</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mf">0.0</span><span class="p">):</span>
</span><span id="L-536"><a href="#L-536"><span class="linenos">536</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;No x errors available, run the gamma method first.&#39;</span><span class="p">)</span>
</span><span id="L-537"><a href="#L-537"><span class="linenos">537</span></a>
</span><span id="L-538"><a href="#L-538"><span class="linenos">538</span></a>    <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">dy_f</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mf">0.0</span><span class="p">):</span>
</span><span id="L-539"><a href="#L-539"><span class="linenos">539</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;No y errors available, run the gamma method first.&#39;</span><span class="p">)</span>
</span><span id="L-540"><a href="#L-540"><span class="linenos">540</span></a>
</span><span id="L-541"><a href="#L-541"><span class="linenos">541</span></a>    <span class="k">if</span> <span class="s1">&#39;initial_guess&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
</span><span id="L-542"><a href="#L-542"><span class="linenos">542</span></a>        <span class="n">x0</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;initial_guess&#39;</span><span class="p">)</span>
</span><span id="L-543"><a href="#L-543"><span class="linenos">543</span></a>        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">)</span> <span class="o">!=</span> <span class="n">n_parms</span><span class="p">:</span>
</span><span id="L-544"><a href="#L-544"><span class="linenos">544</span></a>            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Initial guess does not have the correct length: </span><span class="si">%d</span><span class="s1"> vs. </span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">),</span> <span class="n">n_parms</span><span class="p">))</span>
</span><span id="L-545"><a href="#L-545"><span class="linenos">545</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-546"><a href="#L-546"><span class="linenos">546</span></a>        <span class="n">x0</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">n_parms</span>
</span><span id="L-547"><a href="#L-547"><span class="linenos">547</span></a>
</span><span id="L-548"><a href="#L-548"><span class="linenos">548</span></a>    <span class="n">data</span> <span class="o">=</span> <span class="n">RealData</span><span class="p">(</span><span class="n">x_f</span><span class="p">,</span> <span class="n">y_f</span><span class="p">,</span> <span class="n">sx</span><span class="o">=</span><span class="n">dx_f</span><span class="p">,</span> <span class="n">sy</span><span class="o">=</span><span class="n">dy_f</span><span class="p">)</span>
</span><span id="L-549"><a href="#L-549"><span class="linenos">549</span></a>    <span class="n">model</span> <span class="o">=</span> <span class="n">Model</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
</span><span id="L-550"><a href="#L-550"><span class="linenos">550</span></a>    <span class="n">odr</span> <span class="o">=</span> <span class="n">ODR</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">partol</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">)</span>
</span><span id="L-551"><a href="#L-551"><span class="linenos">551</span></a>    <span class="n">odr</span><span class="o">.</span><span class="n">set_job</span><span class="p">(</span><span class="n">fit_type</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">deriv</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="L-552"><a href="#L-552"><span class="linenos">552</span></a>    <span class="n">out</span> <span class="o">=</span> <span class="n">odr</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</span><span id="L-553"><a href="#L-553"><span class="linenos">553</span></a>
</span><span id="L-554"><a href="#L-554"><span class="linenos">554</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">residual_variance</span> <span class="o">=</span> <span class="n">out</span><span class="o">.</span><span class="n">res_var</span>
</span><span id="L-555"><a href="#L-555"><span class="linenos">555</span></a>
</span><span id="L-556"><a href="#L-556"><span class="linenos">556</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="s1">&#39;ODR&#39;</span>
</span><span id="L-557"><a href="#L-557"><span class="linenos">557</span></a>
</span><span id="L-558"><a href="#L-558"><span class="linenos">558</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">out</span><span class="o">.</span><span class="n">stopreason</span>
</span><span id="L-559"><a href="#L-559"><span class="linenos">559</span></a>
</span><span id="L-560"><a href="#L-560"><span class="linenos">560</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">xplus</span> <span class="o">=</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span>
</span><span id="L-561"><a href="#L-561"><span class="linenos">561</span></a>
</span><span id="L-562"><a href="#L-562"><span class="linenos">562</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="L-563"><a href="#L-563"><span class="linenos">563</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Method: ODR&#39;</span><span class="p">)</span>
</span><span id="L-564"><a href="#L-564"><span class="linenos">564</span></a>        <span class="nb">print</span><span class="p">(</span><span class="o">*</span><span class="n">out</span><span class="o">.</span><span class="n">stopreason</span><span class="p">)</span>
</span><span id="L-565"><a href="#L-565"><span class="linenos">565</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Residual variance:&#39;</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">residual_variance</span><span class="p">)</span>
</span><span id="L-566"><a href="#L-566"><span class="linenos">566</span></a>
</span><span id="L-567"><a href="#L-567"><span class="linenos">567</span></a>    <span class="k">if</span> <span class="n">out</span><span class="o">.</span><span class="n">info</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">:</span>
</span><span id="L-568"><a href="#L-568"><span class="linenos">568</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;The minimization procedure did not converge.&#39;</span><span class="p">)</span>
</span><span id="L-569"><a href="#L-569"><span class="linenos">569</span></a>
</span><span id="L-570"><a href="#L-570"><span class="linenos">570</span></a>    <span class="n">m</span> <span class="o">=</span> <span class="n">x_f</span><span class="o">.</span><span class="n">size</span>
</span><span id="L-571"><a href="#L-571"><span class="linenos">571</span></a>
</span><span id="L-572"><a href="#L-572"><span class="linenos">572</span></a>    <span class="k">def</span> <span class="nf">odr_chisquare</span><span class="p">(</span><span class="n">p</span><span class="p">):</span>
</span><span id="L-573"><a href="#L-573"><span class="linenos">573</span></a>        <span class="n">model</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">p</span><span class="p">[:</span><span class="n">n_parms</span><span class="p">],</span> <span class="n">p</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">))</span>
</span><span id="L-574"><a href="#L-574"><span class="linenos">574</span></a>        <span class="n">chisq</span> <span class="o">=</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(((</span><span class="n">y_f</span> <span class="o">-</span> <span class="n">model</span><span class="p">)</span> <span class="o">/</span> <span class="n">dy_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(((</span><span class="n">x_f</span> <span class="o">-</span> <span class="n">p</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">))</span> <span class="o">/</span> <span class="n">dx_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="L-575"><a href="#L-575"><span class="linenos">575</span></a>        <span class="k">return</span> <span class="n">chisq</span>
</span><span id="L-576"><a href="#L-576"><span class="linenos">576</span></a>
</span><span id="L-577"><a href="#L-577"><span class="linenos">577</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;expected_chisquare&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="L-578"><a href="#L-578"><span class="linenos">578</span></a>        <span class="n">W</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">diag</span><span class="p">(</span><span class="mi">1</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">dy_f</span><span class="o">.</span><span class="n">ravel</span><span class="p">(),</span> <span class="n">dx_f</span><span class="o">.</span><span class="n">ravel</span><span class="p">()))))</span>
</span><span id="L-579"><a href="#L-579"><span class="linenos">579</span></a>
</span><span id="L-580"><a href="#L-580"><span class="linenos">580</span></a>        <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;covariance&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-581"><a href="#L-581"><span class="linenos">581</span></a>            <span class="n">cov</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;covariance&#39;</span><span class="p">)</span>
</span><span id="L-582"><a href="#L-582"><span class="linenos">582</span></a>        <span class="k">else</span><span class="p">:</span>
</span><span id="L-583"><a href="#L-583"><span class="linenos">583</span></a>            <span class="n">cov</span> <span class="o">=</span> <span class="n">covariance</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">ravel</span><span class="p">())))</span>
</span><span id="L-584"><a href="#L-584"><span class="linenos">584</span></a>
</span><span id="L-585"><a href="#L-585"><span class="linenos">585</span></a>        <span class="n">number_of_x_parameters</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">m</span> <span class="o">/</span> <span class="n">x_f</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
</span><span id="L-586"><a href="#L-586"><span class="linenos">586</span></a>
</span><span id="L-587"><a href="#L-587"><span class="linenos">587</span></a>        <span class="n">old_jac</span> <span class="o">=</span> <span class="n">jacobian</span><span class="p">(</span><span class="n">func</span><span class="p">)(</span><span class="n">out</span><span class="o">.</span><span class="n">beta</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="p">)</span>
</span><span id="L-588"><a href="#L-588"><span class="linenos">588</span></a>        <span class="n">fused_row1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">old_jac</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">number_of_x_parameters</span> <span class="o">*</span> <span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">old_jac</span><span class="o">.</span><span class="n">shape</span><span class="p">)]),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)))</span>
</span><span id="L-589"><a href="#L-589"><span class="linenos">589</span></a>        <span class="n">fused_row2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">jacobian</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">func</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">))(</span><span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">beta</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_f</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">x_f</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">number_of_x_parameters</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">identity</span><span class="p">(</span><span class="n">number_of_x_parameters</span> <span class="o">*</span> <span class="n">old_jac</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">])))</span>
</span><span id="L-590"><a href="#L-590"><span class="linenos">590</span></a>        <span class="n">new_jac</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">fused_row1</span><span class="p">,</span> <span class="n">fused_row2</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="L-591"><a href="#L-591"><span class="linenos">591</span></a>
</span><span id="L-592"><a href="#L-592"><span class="linenos">592</span></a>        <span class="n">A</span> <span class="o">=</span> <span class="n">W</span> <span class="o">@</span> <span class="n">new_jac</span>
</span><span id="L-593"><a href="#L-593"><span class="linenos">593</span></a>        <span class="n">P_phi</span> <span class="o">=</span> <span class="n">A</span> <span class="o">@</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">pinv</span><span class="p">(</span><span class="n">A</span><span class="o">.</span><span class="n">T</span> <span class="o">@</span> <span class="n">A</span><span class="p">)</span> <span class="o">@</span> <span class="n">A</span><span class="o">.</span><span class="n">T</span>
</span><span id="L-594"><a href="#L-594"><span class="linenos">594</span></a>        <span class="n">expected_chisquare</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">trace</span><span class="p">((</span><span class="n">np</span><span class="o">.</span><span class="n">identity</span><span class="p">(</span><span class="n">P_phi</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">-</span> <span class="n">P_phi</span><span class="p">)</span> <span class="o">@</span> <span class="n">W</span> <span class="o">@</span> <span class="n">cov</span> <span class="o">@</span> <span class="n">W</span><span class="p">)</span>
</span><span id="L-595"><a href="#L-595"><span class="linenos">595</span></a>        <span class="k">if</span> <span class="n">expected_chisquare</span> <span class="o">&lt;=</span> <span class="mf">0.0</span><span class="p">:</span>
</span><span id="L-596"><a href="#L-596"><span class="linenos">596</span></a>            <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">&quot;Negative expected_chisquare.&quot;</span><span class="p">,</span> <span class="ne">RuntimeWarning</span><span class="p">)</span>
</span><span id="L-597"><a href="#L-597"><span class="linenos">597</span></a>            <span class="n">expected_chisquare</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">expected_chisquare</span><span class="p">)</span>
</span><span id="L-598"><a href="#L-598"><span class="linenos">598</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_expected_chisquare</span> <span class="o">=</span> <span class="n">odr_chisquare</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">out</span><span class="o">.</span><span class="n">beta</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="o">.</span><span class="n">ravel</span><span class="p">())))</span> <span class="o">/</span> <span class="n">expected_chisquare</span>
</span><span id="L-599"><a href="#L-599"><span class="linenos">599</span></a>        <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="L-600"><a href="#L-600"><span class="linenos">600</span></a>            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;chisquare/expected_chisquare:&#39;</span><span class="p">,</span>
</span><span id="L-601"><a href="#L-601"><span class="linenos">601</span></a>                  <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_expected_chisquare</span><span class="p">)</span>
</span><span id="L-602"><a href="#L-602"><span class="linenos">602</span></a>
</span><span id="L-603"><a href="#L-603"><span class="linenos">603</span></a>    <span class="n">fitp</span> <span class="o">=</span> <span class="n">out</span><span class="o">.</span><span class="n">beta</span>
</span><span id="L-604"><a href="#L-604"><span class="linenos">604</span></a>    <span class="k">try</span><span class="p">:</span>
</span><span id="L-605"><a href="#L-605"><span class="linenos">605</span></a>        <span class="n">hess</span> <span class="o">=</span> <span class="n">hessian</span><span class="p">(</span><span class="n">odr_chisquare</span><span class="p">)(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">fitp</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="o">.</span><span class="n">ravel</span><span class="p">())))</span>
</span><span id="L-606"><a href="#L-606"><span class="linenos">606</span></a>    <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
</span><span id="L-607"><a href="#L-607"><span class="linenos">607</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;It is required to use autograd.numpy instead of numpy within fit functions, see the documentation for details.&quot;</span><span class="p">)</span> <span class="kn">from</span> <span class="kc">None</span>
</span><span id="L-608"><a href="#L-608"><span class="linenos">608</span></a>
</span><span id="L-609"><a href="#L-609"><span class="linenos">609</span></a>    <span class="k">def</span> <span class="nf">odr_chisquare_compact_x</span><span class="p">(</span><span class="n">d</span><span class="p">):</span>
</span><span id="L-610"><a href="#L-610"><span class="linenos">610</span></a>        <span class="n">model</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">d</span><span class="p">[:</span><span class="n">n_parms</span><span class="p">],</span> <span class="n">d</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">))</span>
</span><span id="L-611"><a href="#L-611"><span class="linenos">611</span></a>        <span class="n">chisq</span> <span class="o">=</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(((</span><span class="n">y_f</span> <span class="o">-</span> <span class="n">model</span><span class="p">)</span> <span class="o">/</span> <span class="n">dy_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(((</span><span class="n">d</span><span class="p">[</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">:]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">)</span> <span class="o">-</span> <span class="n">d</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">))</span> <span class="o">/</span> <span class="n">dx_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="L-612"><a href="#L-612"><span class="linenos">612</span></a>        <span class="k">return</span> <span class="n">chisq</span>
</span><span id="L-613"><a href="#L-613"><span class="linenos">613</span></a>
</span><span id="L-614"><a href="#L-614"><span class="linenos">614</span></a>    <span class="n">jac_jac_x</span> <span class="o">=</span> <span class="n">hessian</span><span class="p">(</span><span class="n">odr_chisquare_compact_x</span><span class="p">)(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">fitp</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="o">.</span><span class="n">ravel</span><span class="p">(),</span> <span class="n">x_f</span><span class="o">.</span><span class="n">ravel</span><span class="p">())))</span>
</span><span id="L-615"><a href="#L-615"><span class="linenos">615</span></a>
</span><span id="L-616"><a href="#L-616"><span class="linenos">616</span></a>    <span class="c1"># Compute hess^{-1} @ jac_jac_x[:n_parms + m, n_parms + m:] using LAPACK dgesv</span>
</span><span id="L-617"><a href="#L-617"><span class="linenos">617</span></a>    <span class="k">try</span><span class="p">:</span>
</span><span id="L-618"><a href="#L-618"><span class="linenos">618</span></a>        <span class="n">deriv_x</span> <span class="o">=</span> <span class="o">-</span><span class="n">scipy</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">solve</span><span class="p">(</span><span class="n">hess</span><span class="p">,</span> <span class="n">jac_jac_x</span><span class="p">[:</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">,</span> <span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">:])</span>
</span><span id="L-619"><a href="#L-619"><span class="linenos">619</span></a>    <span class="k">except</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">LinAlgError</span><span class="p">:</span>
</span><span id="L-620"><a href="#L-620"><span class="linenos">620</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Cannot invert hessian matrix.&quot;</span><span class="p">)</span>
</span><span id="L-621"><a href="#L-621"><span class="linenos">621</span></a>
</span><span id="L-622"><a href="#L-622"><span class="linenos">622</span></a>    <span class="k">def</span> <span class="nf">odr_chisquare_compact_y</span><span class="p">(</span><span class="n">d</span><span class="p">):</span>
</span><span id="L-623"><a href="#L-623"><span class="linenos">623</span></a>        <span class="n">model</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">d</span><span class="p">[:</span><span class="n">n_parms</span><span class="p">],</span> <span class="n">d</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">))</span>
</span><span id="L-624"><a href="#L-624"><span class="linenos">624</span></a>        <span class="n">chisq</span> <span class="o">=</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(((</span><span class="n">d</span><span class="p">[</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">:]</span> <span class="o">-</span> <span class="n">model</span><span class="p">)</span> <span class="o">/</span> <span class="n">dy_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(((</span><span class="n">x_f</span> <span class="o">-</span> <span class="n">d</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">))</span> <span class="o">/</span> <span class="n">dx_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="L-625"><a href="#L-625"><span class="linenos">625</span></a>        <span class="k">return</span> <span class="n">chisq</span>
</span><span id="L-626"><a href="#L-626"><span class="linenos">626</span></a>
</span><span id="L-627"><a href="#L-627"><span class="linenos">627</span></a>    <span class="n">jac_jac_y</span> <span class="o">=</span> <span class="n">hessian</span><span class="p">(</span><span class="n">odr_chisquare_compact_y</span><span class="p">)(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">fitp</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="o">.</span><span class="n">ravel</span><span class="p">(),</span> <span class="n">y_f</span><span class="p">)))</span>
</span><span id="L-628"><a href="#L-628"><span class="linenos">628</span></a>
</span><span id="L-629"><a href="#L-629"><span class="linenos">629</span></a>    <span class="c1"># Compute hess^{-1} @ jac_jac_y[:n_parms + m, n_parms + m:] using LAPACK dgesv</span>
</span><span id="L-630"><a href="#L-630"><span class="linenos">630</span></a>    <span class="k">try</span><span class="p">:</span>
</span><span id="L-631"><a href="#L-631"><span class="linenos">631</span></a>        <span class="n">deriv_y</span> <span class="o">=</span> <span class="o">-</span><span class="n">scipy</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">solve</span><span class="p">(</span><span class="n">hess</span><span class="p">,</span> <span class="n">jac_jac_y</span><span class="p">[:</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">,</span> <span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">:])</span>
</span><span id="L-632"><a href="#L-632"><span class="linenos">632</span></a>    <span class="k">except</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">LinAlgError</span><span class="p">:</span>
</span><span id="L-633"><a href="#L-633"><span class="linenos">633</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Cannot invert hessian matrix.&quot;</span><span class="p">)</span>
</span><span id="L-634"><a href="#L-634"><span class="linenos">634</span></a>
</span><span id="L-635"><a href="#L-635"><span class="linenos">635</span></a>    <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-636"><a href="#L-636"><span class="linenos">636</span></a>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n_parms</span><span class="p">):</span>
</span><span id="L-637"><a href="#L-637"><span class="linenos">637</span></a>        <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">derived_observable</span><span class="p">(</span><span class="k">lambda</span> <span class="n">my_var</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="p">(</span><span class="n">my_var</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">ravel</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">)</span> <span class="o">*</span> <span class="n">out</span><span class="o">.</span><span class="n">beta</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="nb">list</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">ravel</span><span class="p">())</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="n">man_grad</span><span class="o">=</span><span class="nb">list</span><span class="p">(</span><span class="n">deriv_x</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="n">deriv_y</span><span class="p">[</span><span class="n">i</span><span class="p">])))</span>
</span><span id="L-638"><a href="#L-638"><span class="linenos">638</span></a>
</span><span id="L-639"><a href="#L-639"><span class="linenos">639</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">fit_parameters</span> <span class="o">=</span> <span class="n">result</span>
</span><span id="L-640"><a href="#L-640"><span class="linenos">640</span></a>
</span><span id="L-641"><a href="#L-641"><span class="linenos">641</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">odr_chisquare</span> <span class="o">=</span> <span class="n">odr_chisquare</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">out</span><span class="o">.</span><span class="n">beta</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="o">.</span><span class="n">ravel</span><span class="p">())))</span>
</span><span id="L-642"><a href="#L-642"><span class="linenos">642</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">dof</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">n_parms</span>
</span><span id="L-643"><a href="#L-643"><span class="linenos">643</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">p_value</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">scipy</span><span class="o">.</span><span class="n">stats</span><span class="o">.</span><span class="n">chi2</span><span class="o">.</span><span class="n">cdf</span><span class="p">(</span><span class="n">output</span><span class="o">.</span><span class="n">odr_chisquare</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">dof</span><span class="p">)</span>
</span><span id="L-644"><a href="#L-644"><span class="linenos">644</span></a>
</span><span id="L-645"><a href="#L-645"><span class="linenos">645</span></a>    <span class="k">return</span> <span class="n">output</span>
</span><span id="L-646"><a href="#L-646"><span class="linenos">646</span></a>
</span><span id="L-647"><a href="#L-647"><span class="linenos">647</span></a>
</span><span id="L-648"><a href="#L-648"><span class="linenos">648</span></a><span class="k">def</span> <span class="nf">fit_lin</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="L-649"><a href="#L-649"><span class="linenos">649</span></a><span class="w">    </span><span class="sd">&quot;&quot;&quot;Performs a linear fit to y = n + m * x and returns two Obs n, m.</span>
</span><span id="L-650"><a href="#L-650"><span class="linenos">650</span></a>
</span><span id="L-651"><a href="#L-651"><span class="linenos">651</span></a><span class="sd">    Parameters</span>
</span><span id="L-652"><a href="#L-652"><span class="linenos">652</span></a><span class="sd">    ----------</span>
</span><span id="L-653"><a href="#L-653"><span class="linenos">653</span></a><span class="sd">    x : list</span>
</span><span id="L-654"><a href="#L-654"><span class="linenos">654</span></a><span class="sd">        Can either be a list of floats in which case no xerror is assumed, or</span>
</span><span id="L-655"><a href="#L-655"><span class="linenos">655</span></a><span class="sd">        a list of Obs, where the dvalues of the Obs are used as xerror for the fit.</span>
</span><span id="L-656"><a href="#L-656"><span class="linenos">656</span></a><span class="sd">    y : list</span>
</span><span id="L-657"><a href="#L-657"><span class="linenos">657</span></a><span class="sd">        List of Obs, the dvalues of the Obs are used as yerror for the fit.</span>
</span><span id="L-658"><a href="#L-658"><span class="linenos">658</span></a>
</span><span id="L-659"><a href="#L-659"><span class="linenos">659</span></a><span class="sd">    Returns</span>
</span><span id="L-660"><a href="#L-660"><span class="linenos">660</span></a><span class="sd">    -------</span>
</span><span id="L-661"><a href="#L-661"><span class="linenos">661</span></a><span class="sd">    fit_parameters : list[Obs]</span>
</span><span id="L-662"><a href="#L-662"><span class="linenos">662</span></a><span class="sd">        LIist of fitted observables.</span>
</span><span id="L-663"><a href="#L-663"><span class="linenos">663</span></a><span class="sd">    &quot;&quot;&quot;</span>
</span><span id="L-664"><a href="#L-664"><span class="linenos">664</span></a>
</span><span id="L-665"><a href="#L-665"><span class="linenos">665</span></a>    <span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
</span><span id="L-666"><a href="#L-666"><span class="linenos">666</span></a>        <span class="n">y</span> <span class="o">=</span> <span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span>
</span><span id="L-667"><a href="#L-667"><span class="linenos">667</span></a>        <span class="k">return</span> <span class="n">y</span>
</span><span id="L-668"><a href="#L-668"><span class="linenos">668</span></a>
</span><span id="L-669"><a href="#L-669"><span class="linenos">669</span></a>    <span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">Obs</span><span class="p">)</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">x</span><span class="p">):</span>
</span><span id="L-670"><a href="#L-670"><span class="linenos">670</span></a>        <span class="n">out</span> <span class="o">=</span> <span class="n">total_least_squares</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="L-671"><a href="#L-671"><span class="linenos">671</span></a>        <span class="k">return</span> <span class="n">out</span><span class="o">.</span><span class="n">fit_parameters</span>
</span><span id="L-672"><a href="#L-672"><span class="linenos">672</span></a>    <span class="k">elif</span> <span class="nb">all</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="nb">float</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">x</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">):</span>
</span><span id="L-673"><a href="#L-673"><span class="linenos">673</span></a>        <span class="n">out</span> <span class="o">=</span> <span class="n">least_squares</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="L-674"><a href="#L-674"><span class="linenos">674</span></a>        <span class="k">return</span> <span class="n">out</span><span class="o">.</span><span class="n">fit_parameters</span>
</span><span id="L-675"><a href="#L-675"><span class="linenos">675</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-676"><a href="#L-676"><span class="linenos">676</span></a>        <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;Unsupported types for x&#39;</span><span class="p">)</span>
</span><span id="L-677"><a href="#L-677"><span class="linenos">677</span></a>
</span><span id="L-678"><a href="#L-678"><span class="linenos">678</span></a>
</span><span id="L-679"><a href="#L-679"><span class="linenos">679</span></a><span class="k">def</span> <span class="nf">qqplot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">o_y</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
</span><span id="L-680"><a href="#L-680"><span class="linenos">680</span></a><span class="w">    </span><span class="sd">&quot;&quot;&quot;Generates a quantile-quantile plot of the fit result which can be used to</span>
</span><span id="L-681"><a href="#L-681"><span class="linenos">681</span></a><span class="sd">       check if the residuals of the fit are gaussian distributed.</span>
</span><span id="L-682"><a href="#L-682"><span class="linenos">682</span></a>
</span><span id="L-683"><a href="#L-683"><span class="linenos">683</span></a><span class="sd">    Returns</span>
</span><span id="L-684"><a href="#L-684"><span class="linenos">684</span></a><span class="sd">    -------</span>
</span><span id="L-685"><a href="#L-685"><span class="linenos">685</span></a><span class="sd">    None</span>
</span><span id="L-686"><a href="#L-686"><span class="linenos">686</span></a><span class="sd">    &quot;&quot;&quot;</span>
</span><span id="L-687"><a href="#L-687"><span class="linenos">687</span></a>
</span><span id="L-688"><a href="#L-688"><span class="linenos">688</span></a>    <span class="n">residuals</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-689"><a href="#L-689"><span class="linenos">689</span></a>    <span class="k">for</span> <span class="n">i_x</span><span class="p">,</span> <span class="n">i_y</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">o_y</span><span class="p">):</span>
</span><span id="L-690"><a href="#L-690"><span class="linenos">690</span></a>        <span class="n">residuals</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">i_y</span> <span class="o">-</span> <span class="n">func</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">i_x</span><span class="p">))</span> <span class="o">/</span> <span class="n">i_y</span><span class="o">.</span><span class="n">dvalue</span><span class="p">)</span>
</span><span id="L-691"><a href="#L-691"><span class="linenos">691</span></a>    <span class="n">residuals</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">residuals</span><span class="p">)</span>
</span><span id="L-692"><a href="#L-692"><span class="linenos">692</span></a>    <span class="n">my_y</span> <span class="o">=</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">residuals</span><span class="p">]</span>
</span><span id="L-693"><a href="#L-693"><span class="linenos">693</span></a>    <span class="n">probplot</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">stats</span><span class="o">.</span><span class="n">probplot</span><span class="p">(</span><span class="n">my_y</span><span class="p">)</span>
</span><span id="L-694"><a href="#L-694"><span class="linenos">694</span></a>    <span class="n">my_x</span> <span class="o">=</span> <span class="n">probplot</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
</span><span id="L-695"><a href="#L-695"><span class="linenos">695</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span> <span class="o">/</span> <span class="mf">1.618</span><span class="p">))</span>
</span><span id="L-696"><a href="#L-696"><span class="linenos">696</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">errorbar</span><span class="p">(</span><span class="n">my_x</span><span class="p">,</span> <span class="n">my_y</span><span class="p">,</span> <span class="n">fmt</span><span class="o">=</span><span class="s1">&#39;o&#39;</span><span class="p">)</span>
</span><span id="L-697"><a href="#L-697"><span class="linenos">697</span></a>    <span class="n">fit_start</span> <span class="o">=</span> <span class="n">my_x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="L-698"><a href="#L-698"><span class="linenos">698</span></a>    <span class="n">fit_stop</span> <span class="o">=</span> <span class="n">my_x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span><span id="L-699"><a href="#L-699"><span class="linenos">699</span></a>    <span class="n">samples</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">fit_start</span><span class="p">,</span> <span class="n">fit_stop</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">)</span>
</span><span id="L-700"><a href="#L-700"><span class="linenos">700</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">samples</span><span class="p">,</span> <span class="n">samples</span><span class="p">,</span> <span class="s1">&#39;k--&#39;</span><span class="p">,</span> <span class="n">zorder</span><span class="o">=</span><span class="mi">11</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;Standard normal distribution&#39;</span><span class="p">)</span>
</span><span id="L-701"><a href="#L-701"><span class="linenos">701</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">samples</span><span class="p">,</span> <span class="n">probplot</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">samples</span> <span class="o">+</span> <span class="n">probplot</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">],</span> <span class="n">zorder</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;Least squares fit, r=&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">around</span><span class="p">(</span><span class="n">probplot</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">2</span><span class="p">],</span> <span class="mi">3</span><span class="p">)),</span> <span class="n">marker</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">ls</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
</span><span id="L-702"><a href="#L-702"><span class="linenos">702</span></a>
</span><span id="L-703"><a href="#L-703"><span class="linenos">703</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s1">&#39;Theoretical quantiles&#39;</span><span class="p">)</span>
</span><span id="L-704"><a href="#L-704"><span class="linenos">704</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s1">&#39;Ordered Values&#39;</span><span class="p">)</span>
</span><span id="L-705"><a href="#L-705"><span class="linenos">705</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="n">title</span><span class="p">)</span>
</span><span id="L-706"><a href="#L-706"><span class="linenos">706</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
</span><span id="L-707"><a href="#L-707"><span class="linenos">707</span></a>
</span><span id="L-708"><a href="#L-708"><span class="linenos">708</span></a>
</span><span id="L-709"><a href="#L-709"><span class="linenos">709</span></a><span class="k">def</span> <span class="nf">residual_plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">fit_res</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
</span><span id="L-710"><a href="#L-710"><span class="linenos">710</span></a><span class="w">    </span><span class="sd">&quot;&quot;&quot;Generates a plot which compares the fit to the data and displays the corresponding residuals</span>
</span><span id="L-711"><a href="#L-711"><span class="linenos">711</span></a>
</span><span id="L-712"><a href="#L-712"><span class="linenos">712</span></a><span class="sd">    For uncorrelated data the residuals are expected to be distributed ~N(0,1).</span>
</span><span id="L-713"><a href="#L-713"><span class="linenos">713</span></a>
</span><span id="L-714"><a href="#L-714"><span class="linenos">714</span></a><span class="sd">    Returns</span>
</span><span id="L-715"><a href="#L-715"><span class="linenos">715</span></a><span class="sd">    -------</span>
</span><span id="L-716"><a href="#L-716"><span class="linenos">716</span></a><span class="sd">    None</span>
</span><span id="L-717"><a href="#L-717"><span class="linenos">717</span></a><span class="sd">    &quot;&quot;&quot;</span>
</span><span id="L-718"><a href="#L-718"><span class="linenos">718</span></a>    <span class="n">sorted_x</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span><span id="L-719"><a href="#L-719"><span class="linenos">719</span></a>    <span class="n">xstart</span> <span class="o">=</span> <span class="n">sorted_x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">sorted_x</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">sorted_x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="L-720"><a href="#L-720"><span class="linenos">720</span></a>    <span class="n">xstop</span> <span class="o">=</span> <span class="n">sorted_x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">sorted_x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">sorted_x</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">])</span>
</span><span id="L-721"><a href="#L-721"><span class="linenos">721</span></a>    <span class="n">x_samples</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">xstart</span><span class="p">,</span> <span class="n">xstop</span> <span class="o">+</span> <span class="mf">0.01</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">)</span>
</span><span id="L-722"><a href="#L-722"><span class="linenos">722</span></a>
</span><span id="L-723"><a href="#L-723"><span class="linenos">723</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span> <span class="o">/</span> <span class="mf">1.618</span><span class="p">))</span>
</span><span id="L-724"><a href="#L-724"><span class="linenos">724</span></a>    <span class="n">gs</span> <span class="o">=</span> <span class="n">gridspec</span><span class="o">.</span><span class="n">GridSpec</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">height_ratios</span><span class="o">=</span><span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="n">wspace</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">hspace</span><span class="o">=</span><span class="mf">0.0</span><span class="p">)</span>
</span><span id="L-725"><a href="#L-725"><span class="linenos">725</span></a>    <span class="n">ax0</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="n">gs</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="L-726"><a href="#L-726"><span class="linenos">726</span></a>    <span class="n">ax0</span><span class="o">.</span><span class="n">errorbar</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y</span><span class="p">],</span> <span class="n">yerr</span><span class="o">=</span><span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">dvalue</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y</span><span class="p">],</span> <span class="n">ls</span><span class="o">=</span><span class="s1">&#39;none&#39;</span><span class="p">,</span> <span class="n">fmt</span><span class="o">=</span><span class="s1">&#39;o&#39;</span><span class="p">,</span> <span class="n">capsize</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">markersize</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;Data&#39;</span><span class="p">)</span>
</span><span id="L-727"><a href="#L-727"><span class="linenos">727</span></a>    <span class="n">ax0</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x_samples</span><span class="p">,</span> <span class="n">func</span><span class="p">([</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">fit_res</span><span class="p">],</span> <span class="n">x_samples</span><span class="p">),</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;Fit&#39;</span><span class="p">,</span> <span class="n">zorder</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">ls</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="n">ms</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
</span><span id="L-728"><a href="#L-728"><span class="linenos">728</span></a>    <span class="n">ax0</span><span class="o">.</span><span class="n">set_xticklabels</span><span class="p">([])</span>
</span><span id="L-729"><a href="#L-729"><span class="linenos">729</span></a>    <span class="n">ax0</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">([</span><span class="n">xstart</span><span class="p">,</span> <span class="n">xstop</span><span class="p">])</span>
</span><span id="L-730"><a href="#L-730"><span class="linenos">730</span></a>    <span class="n">ax0</span><span class="o">.</span><span class="n">set_xticklabels</span><span class="p">([])</span>
</span><span id="L-731"><a href="#L-731"><span class="linenos">731</span></a>    <span class="n">ax0</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="n">title</span><span class="p">)</span>
</span><span id="L-732"><a href="#L-732"><span class="linenos">732</span></a>
</span><span id="L-733"><a href="#L-733"><span class="linenos">733</span></a>    <span class="n">residuals</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y</span><span class="p">])</span> <span class="o">-</span> <span class="n">func</span><span class="p">([</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">fit_res</span><span class="p">],</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">x</span><span class="p">)))</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="n">o</span><span class="o">.</span><span class="n">dvalue</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y</span><span class="p">])</span>
</span><span id="L-734"><a href="#L-734"><span class="linenos">734</span></a>    <span class="n">ax1</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="n">gs</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
</span><span id="L-735"><a href="#L-735"><span class="linenos">735</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">residuals</span><span class="p">,</span> <span class="s1">&#39;ko&#39;</span><span class="p">,</span> <span class="n">ls</span><span class="o">=</span><span class="s1">&#39;none&#39;</span><span class="p">,</span> <span class="n">markersize</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
</span><span id="L-736"><a href="#L-736"><span class="linenos">736</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">tick_params</span><span class="p">(</span><span class="n">direction</span><span class="o">=</span><span class="s1">&#39;out&#39;</span><span class="p">)</span>
</span><span id="L-737"><a href="#L-737"><span class="linenos">737</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">tick_params</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="s2">&quot;x&quot;</span><span class="p">,</span> <span class="n">bottom</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">top</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">labelbottom</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="L-738"><a href="#L-738"><span class="linenos">738</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="n">y</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">ls</span><span class="o">=</span><span class="s1">&#39;--&#39;</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">&#39;k&#39;</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">)</span>
</span><span id="L-739"><a href="#L-739"><span class="linenos">739</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">fill_between</span><span class="p">(</span><span class="n">x_samples</span><span class="p">,</span> <span class="o">-</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="s1">&#39;k&#39;</span><span class="p">)</span>
</span><span id="L-740"><a href="#L-740"><span class="linenos">740</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">([</span><span class="n">xstart</span><span class="p">,</span> <span class="n">xstop</span><span class="p">])</span>
</span><span id="L-741"><a href="#L-741"><span class="linenos">741</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">&#39;Residuals&#39;</span><span class="p">)</span>
</span><span id="L-742"><a href="#L-742"><span class="linenos">742</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">subplots_adjust</span><span class="p">(</span><span class="n">wspace</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">hspace</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span><span id="L-743"><a href="#L-743"><span class="linenos">743</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
</span><span id="L-744"><a href="#L-744"><span class="linenos">744</span></a>
</span><span id="L-745"><a href="#L-745"><span class="linenos">745</span></a>
</span><span id="L-746"><a href="#L-746"><span class="linenos">746</span></a><span class="k">def</span> <span class="nf">error_band</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">beta</span><span class="p">):</span>
</span><span id="L-747"><a href="#L-747"><span class="linenos">747</span></a><span class="w">    </span><span class="sd">&quot;&quot;&quot;Calculate the error band for an array of sample values x, for given fit function func with optimized parameters beta.</span>
</span><span id="L-748"><a href="#L-748"><span class="linenos">748</span></a>
</span><span id="L-749"><a href="#L-749"><span class="linenos">749</span></a><span class="sd">    Returns</span>
</span><span id="L-750"><a href="#L-750"><span class="linenos">750</span></a><span class="sd">    -------</span>
</span><span id="L-751"><a href="#L-751"><span class="linenos">751</span></a><span class="sd">    err : np.array(Obs)</span>
</span><span id="L-752"><a href="#L-752"><span class="linenos">752</span></a><span class="sd">        Error band for an array of sample values x</span>
</span><span id="L-753"><a href="#L-753"><span class="linenos">753</span></a><span class="sd">    &quot;&quot;&quot;</span>
</span><span id="L-754"><a href="#L-754"><span class="linenos">754</span></a>    <span class="n">cov</span> <span class="o">=</span> <span class="n">covariance</span><span class="p">(</span><span class="n">beta</span><span class="p">)</span>
</span><span id="L-755"><a href="#L-755"><span class="linenos">755</span></a>    <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">cov</span> <span class="o">-</span> <span class="n">cov</span><span class="o">.</span><span class="n">T</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1000</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">):</span>
</span><span id="L-756"><a href="#L-756"><span class="linenos">756</span></a>        <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">&quot;Covariance matrix is not symmetric within floating point precision&quot;</span><span class="p">,</span> <span class="ne">RuntimeWarning</span><span class="p">)</span>
</span><span id="L-757"><a href="#L-757"><span class="linenos">757</span></a>
</span><span id="L-758"><a href="#L-758"><span class="linenos">758</span></a>    <span class="n">deriv</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-759"><a href="#L-759"><span class="linenos">759</span></a>    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">item</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
</span><span id="L-760"><a href="#L-760"><span class="linenos">760</span></a>        <span class="n">deriv</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">egrad</span><span class="p">(</span><span class="n">func</span><span class="p">)([</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">beta</span><span class="p">],</span> <span class="n">item</span><span class="p">)))</span>
</span><span id="L-761"><a href="#L-761"><span class="linenos">761</span></a>
</span><span id="L-762"><a href="#L-762"><span class="linenos">762</span></a>    <span class="n">err</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-763"><a href="#L-763"><span class="linenos">763</span></a>    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">item</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
</span><span id="L-764"><a href="#L-764"><span class="linenos">764</span></a>        <span class="n">err</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">deriv</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">@</span> <span class="n">cov</span> <span class="o">@</span> <span class="n">deriv</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span>
</span><span id="L-765"><a href="#L-765"><span class="linenos">765</span></a>    <span class="n">err</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
</span><span id="L-766"><a href="#L-766"><span class="linenos">766</span></a>
</span><span id="L-767"><a href="#L-767"><span class="linenos">767</span></a>    <span class="k">return</span> <span class="n">err</span>
</span><span id="L-768"><a href="#L-768"><span class="linenos">768</span></a>
</span><span id="L-769"><a href="#L-769"><span class="linenos">769</span></a>
</span><span id="L-770"><a href="#L-770"><span class="linenos">770</span></a><span class="k">def</span> <span class="nf">ks_test</span><span class="p">(</span><span class="n">objects</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
</span><span id="L-771"><a href="#L-771"><span class="linenos">771</span></a><span class="w">    </span><span class="sd">&quot;&quot;&quot;Performs a Kolmogorov–Smirnov test for the p-values of all fit object.</span>
</span><span id="L-772"><a href="#L-772"><span class="linenos">772</span></a>
</span><span id="L-773"><a href="#L-773"><span class="linenos">773</span></a><span class="sd">    Parameters</span>
</span><span id="L-774"><a href="#L-774"><span class="linenos">774</span></a><span class="sd">    ----------</span>
</span><span id="L-775"><a href="#L-775"><span class="linenos">775</span></a><span class="sd">    objects : list</span>
</span><span id="L-776"><a href="#L-776"><span class="linenos">776</span></a><span class="sd">        List of fit results to include in the analysis (optional).</span>
</span><span id="L-777"><a href="#L-777"><span class="linenos">777</span></a>
</span><span id="L-778"><a href="#L-778"><span class="linenos">778</span></a><span class="sd">    Returns</span>
</span><span id="L-779"><a href="#L-779"><span class="linenos">779</span></a><span class="sd">    -------</span>
</span><span id="L-780"><a href="#L-780"><span class="linenos">780</span></a><span class="sd">    None</span>
</span><span id="L-781"><a href="#L-781"><span class="linenos">781</span></a><span class="sd">    &quot;&quot;&quot;</span>
</span><span id="L-782"><a href="#L-782"><span class="linenos">782</span></a>
</span><span id="L-783"><a href="#L-783"><span class="linenos">783</span></a>    <span class="k">if</span> <span class="n">objects</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="L-784"><a href="#L-784"><span class="linenos">784</span></a>        <span class="n">obs_list</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="L-785"><a href="#L-785"><span class="linenos">785</span></a>        <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">gc</span><span class="o">.</span><span class="n">get_objects</span><span class="p">():</span>
</span><span id="L-786"><a href="#L-786"><span class="linenos">786</span></a>            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">Fit_result</span><span class="p">):</span>
</span><span id="L-787"><a href="#L-787"><span class="linenos">787</span></a>                <span class="n">obs_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
</span><span id="L-788"><a href="#L-788"><span class="linenos">788</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-789"><a href="#L-789"><span class="linenos">789</span></a>        <span class="n">obs_list</span> <span class="o">=</span> <span class="n">objects</span>
</span><span id="L-790"><a href="#L-790"><span class="linenos">790</span></a>
</span><span id="L-791"><a href="#L-791"><span class="linenos">791</span></a>    <span class="n">p_values</span> <span class="o">=</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">p_value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">obs_list</span><span class="p">]</span>
</span><span id="L-792"><a href="#L-792"><span class="linenos">792</span></a>
</span><span id="L-793"><a href="#L-793"><span class="linenos">793</span></a>    <span class="n">bins</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">p_values</span><span class="p">)</span>
</span><span id="L-794"><a href="#L-794"><span class="linenos">794</span></a>    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">1.001</span><span class="p">,</span> <span class="mf">0.001</span><span class="p">)</span>
</span><span id="L-795"><a href="#L-795"><span class="linenos">795</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="s1">&#39;k&#39;</span><span class="p">,</span> <span class="n">zorder</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="L-796"><a href="#L-796"><span class="linenos">796</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">xlim</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span><span id="L-797"><a href="#L-797"><span class="linenos">797</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">ylim</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span><span id="L-798"><a href="#L-798"><span class="linenos">798</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s1">&#39;p-value&#39;</span><span class="p">)</span>
</span><span id="L-799"><a href="#L-799"><span class="linenos">799</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s1">&#39;Cumulative probability&#39;</span><span class="p">)</span>
</span><span id="L-800"><a href="#L-800"><span class="linenos">800</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">bins</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; p-values&#39;</span><span class="p">)</span>
</span><span id="L-801"><a href="#L-801"><span class="linenos">801</span></a>
</span><span id="L-802"><a href="#L-802"><span class="linenos">802</span></a>    <span class="n">n</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">bins</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">(</span><span class="n">bins</span><span class="p">)</span>
</span><span id="L-803"><a href="#L-803"><span class="linenos">803</span></a>    <span class="n">Xs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">p_values</span><span class="p">)</span>
</span><span id="L-804"><a href="#L-804"><span class="linenos">804</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="n">Xs</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
</span><span id="L-805"><a href="#L-805"><span class="linenos">805</span></a>    <span class="n">diffs</span> <span class="o">=</span> <span class="n">n</span> <span class="o">-</span> <span class="n">Xs</span>
</span><span id="L-806"><a href="#L-806"><span class="linenos">806</span></a>    <span class="n">loc_max_diff</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">diffs</span><span class="p">))</span>
</span><span id="L-807"><a href="#L-807"><span class="linenos">807</span></a>    <span class="n">loc</span> <span class="o">=</span> <span class="n">Xs</span><span class="p">[</span><span class="n">loc_max_diff</span><span class="p">]</span>
</span><span id="L-808"><a href="#L-808"><span class="linenos">808</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">xy</span><span class="o">=</span><span class="p">(</span><span class="n">loc</span><span class="p">,</span> <span class="n">loc</span><span class="p">),</span> <span class="n">xytext</span><span class="o">=</span><span class="p">(</span><span class="n">loc</span><span class="p">,</span> <span class="n">loc</span> <span class="o">+</span> <span class="n">diffs</span><span class="p">[</span><span class="n">loc_max_diff</span><span class="p">]),</span> <span class="n">arrowprops</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">arrowstyle</span><span class="o">=</span><span class="s1">&#39;&lt;-&gt;&#39;</span><span class="p">,</span> <span class="n">shrinkA</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">shrinkB</span><span class="o">=</span><span class="mi">0</span><span class="p">))</span>
</span><span id="L-809"><a href="#L-809"><span class="linenos">809</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
</span><span id="L-810"><a href="#L-810"><span class="linenos">810</span></a>
</span><span id="L-811"><a href="#L-811"><span class="linenos">811</span></a>    <span class="nb">print</span><span class="p">(</span><span class="n">scipy</span><span class="o">.</span><span class="n">stats</span><span class="o">.</span><span class="n">kstest</span><span class="p">(</span><span class="n">p_values</span><span class="p">,</span> <span class="s1">&#39;uniform&#39;</span><span class="p">))</span>
</span><span id="L-812"><a href="#L-812"><span class="linenos">812</span></a>
</span><span id="L-813"><a href="#L-813"><span class="linenos">813</span></a>
</span><span id="L-814"><a href="#L-814"><span class="linenos">814</span></a><span class="k">def</span> <span class="nf">_extract_val_and_dval</span><span class="p">(</span><span class="n">string</span><span class="p">):</span>
</span><span id="L-815"><a href="#L-815"><span class="linenos">815</span></a>    <span class="n">split_string</span> <span class="o">=</span> <span class="n">string</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;(&#39;</span><span class="p">)</span>
</span><span id="L-816"><a href="#L-816"><span class="linenos">816</span></a>    <span class="k">if</span> <span class="s1">&#39;.&#39;</span> <span class="ow">in</span> <span class="n">split_string</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">and</span> <span class="s1">&#39;.&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">split_string</span><span class="p">[</span><span class="mi">1</span><span class="p">][:</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
</span><span id="L-817"><a href="#L-817"><span class="linenos">817</span></a>        <span class="n">factor</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">**</span> <span class="o">-</span><span class="nb">len</span><span class="p">(</span><span class="n">split_string</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">partition</span><span class="p">(</span><span class="s1">&#39;.&#39;</span><span class="p">)[</span><span class="mi">2</span><span class="p">])</span>
</span><span id="L-818"><a href="#L-818"><span class="linenos">818</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-819"><a href="#L-819"><span class="linenos">819</span></a>        <span class="n">factor</span> <span class="o">=</span> <span class="mi">1</span>
</span><span id="L-820"><a href="#L-820"><span class="linenos">820</span></a>    <span class="k">return</span> <span class="nb">float</span><span class="p">(</span><span class="n">split_string</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="nb">float</span><span class="p">(</span><span class="n">split_string</span><span class="p">[</span><span class="mi">1</span><span class="p">][:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">*</span> <span class="n">factor</span>
</span><span id="L-821"><a href="#L-821"><span class="linenos">821</span></a>
</span><span id="L-822"><a href="#L-822"><span class="linenos">822</span></a>
</span><span id="L-823"><a href="#L-823"><span class="linenos">823</span></a><span class="k">def</span> <span class="nf">_construct_prior_obs</span><span class="p">(</span><span class="n">i_prior</span><span class="p">,</span> <span class="n">i_n</span><span class="p">):</span>
</span><span id="L-824"><a href="#L-824"><span class="linenos">824</span></a>    <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i_prior</span><span class="p">,</span> <span class="n">Obs</span><span class="p">):</span>
</span><span id="L-825"><a href="#L-825"><span class="linenos">825</span></a>        <span class="k">return</span> <span class="n">i_prior</span>
</span><span id="L-826"><a href="#L-826"><span class="linenos">826</span></a>    <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">i_prior</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="L-827"><a href="#L-827"><span class="linenos">827</span></a>        <span class="n">loc_val</span><span class="p">,</span> <span class="n">loc_dval</span> <span class="o">=</span> <span class="n">_extract_val_and_dval</span><span class="p">(</span><span class="n">i_prior</span><span class="p">)</span>
</span><span id="L-828"><a href="#L-828"><span class="linenos">828</span></a>        <span class="k">return</span> <span class="n">cov_Obs</span><span class="p">(</span><span class="n">loc_val</span><span class="p">,</span> <span class="n">loc_dval</span> <span class="o">**</span> <span class="mi">2</span><span class="p">,</span> <span class="s1">&#39;#prior&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">i_n</span><span class="p">)</span> <span class="o">+</span> <span class="sa">f</span><span class="s2">&quot;_</span><span class="si">{</span><span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">2147483647</span><span class="p">)</span><span class="si">:</span><span class="s2">010d</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="L-829"><a href="#L-829"><span class="linenos">829</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="L-830"><a href="#L-830"><span class="linenos">830</span></a>        <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Prior entries need to be &#39;Obs&#39; or &#39;str&#39;.&quot;</span><span class="p">)</span>
</span></pre></div>


            </section>
                <section id="Fit_result">
                            <input id="Fit_result-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr class">
            
    <span class="def">class</span>
    <span class="name">Fit_result</span><wbr>(<span class="base">collections.abc.Sequence</span>):

                <label class="view-source-button" for="Fit_result-view-source"><span>View Source</span></label>

    </div>
    <a class="headerlink" href="#Fit_result"></a>
            <div class="pdoc-code codehilite"><pre><span></span><span id="Fit_result-21"><a href="#Fit_result-21"><span class="linenos">21</span></a><span class="k">class</span> <span class="nc">Fit_result</span><span class="p">(</span><span class="n">Sequence</span><span class="p">):</span>
</span><span id="Fit_result-22"><a href="#Fit_result-22"><span class="linenos">22</span></a><span class="w">    </span><span class="sd">&quot;&quot;&quot;Represents fit results.</span>
</span><span id="Fit_result-23"><a href="#Fit_result-23"><span class="linenos">23</span></a>
</span><span id="Fit_result-24"><a href="#Fit_result-24"><span class="linenos">24</span></a><span class="sd">    Attributes</span>
</span><span id="Fit_result-25"><a href="#Fit_result-25"><span class="linenos">25</span></a><span class="sd">    ----------</span>
</span><span id="Fit_result-26"><a href="#Fit_result-26"><span class="linenos">26</span></a><span class="sd">    fit_parameters : list</span>
</span><span id="Fit_result-27"><a href="#Fit_result-27"><span class="linenos">27</span></a><span class="sd">        results for the individual fit parameters,</span>
</span><span id="Fit_result-28"><a href="#Fit_result-28"><span class="linenos">28</span></a><span class="sd">        also accessible via indices.</span>
</span><span id="Fit_result-29"><a href="#Fit_result-29"><span class="linenos">29</span></a><span class="sd">    chisquare_by_dof : float</span>
</span><span id="Fit_result-30"><a href="#Fit_result-30"><span class="linenos">30</span></a><span class="sd">        reduced chisquare.</span>
</span><span id="Fit_result-31"><a href="#Fit_result-31"><span class="linenos">31</span></a><span class="sd">    p_value : float</span>
</span><span id="Fit_result-32"><a href="#Fit_result-32"><span class="linenos">32</span></a><span class="sd">        p-value of the fit</span>
</span><span id="Fit_result-33"><a href="#Fit_result-33"><span class="linenos">33</span></a><span class="sd">    t2_p_value : float</span>
</span><span id="Fit_result-34"><a href="#Fit_result-34"><span class="linenos">34</span></a><span class="sd">        Hotelling t-squared p-value for correlated fits.</span>
</span><span id="Fit_result-35"><a href="#Fit_result-35"><span class="linenos">35</span></a><span class="sd">    &quot;&quot;&quot;</span>
</span><span id="Fit_result-36"><a href="#Fit_result-36"><span class="linenos">36</span></a>
</span><span id="Fit_result-37"><a href="#Fit_result-37"><span class="linenos">37</span></a>    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="Fit_result-38"><a href="#Fit_result-38"><span class="linenos">38</span></a>        <span class="bp">self</span><span class="o">.</span><span class="n">fit_parameters</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="Fit_result-39"><a href="#Fit_result-39"><span class="linenos">39</span></a>
</span><span id="Fit_result-40"><a href="#Fit_result-40"><span class="linenos">40</span></a>    <span class="k">def</span> <span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
</span><span id="Fit_result-41"><a href="#Fit_result-41"><span class="linenos">41</span></a>        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">fit_parameters</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
</span><span id="Fit_result-42"><a href="#Fit_result-42"><span class="linenos">42</span></a>
</span><span id="Fit_result-43"><a href="#Fit_result-43"><span class="linenos">43</span></a>    <span class="k">def</span> <span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="Fit_result-44"><a href="#Fit_result-44"><span class="linenos">44</span></a>        <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fit_parameters</span><span class="p">)</span>
</span><span id="Fit_result-45"><a href="#Fit_result-45"><span class="linenos">45</span></a>
</span><span id="Fit_result-46"><a href="#Fit_result-46"><span class="linenos">46</span></a>    <span class="k">def</span> <span class="nf">gamma_method</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="Fit_result-47"><a href="#Fit_result-47"><span class="linenos">47</span></a><span class="w">        </span><span class="sd">&quot;&quot;&quot;Apply the gamma method to all fit parameters&quot;&quot;&quot;</span>
</span><span id="Fit_result-48"><a href="#Fit_result-48"><span class="linenos">48</span></a>        <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">gamma_method</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fit_parameters</span><span class="p">]</span>
</span><span id="Fit_result-49"><a href="#Fit_result-49"><span class="linenos">49</span></a>
</span><span id="Fit_result-50"><a href="#Fit_result-50"><span class="linenos">50</span></a>    <span class="n">gm</span> <span class="o">=</span> <span class="n">gamma_method</span>
</span><span id="Fit_result-51"><a href="#Fit_result-51"><span class="linenos">51</span></a>
</span><span id="Fit_result-52"><a href="#Fit_result-52"><span class="linenos">52</span></a>    <span class="k">def</span> <span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="Fit_result-53"><a href="#Fit_result-53"><span class="linenos">53</span></a>        <span class="n">my_str</span> <span class="o">=</span> <span class="s1">&#39;Goodness of fit:</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="Fit_result-54"><a href="#Fit_result-54"><span class="linenos">54</span></a>        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;chisquare_by_dof&#39;</span><span class="p">):</span>
</span><span id="Fit_result-55"><a href="#Fit_result-55"><span class="linenos">55</span></a>            <span class="n">my_str</span> <span class="o">+=</span> <span class="s1">&#39;</span><span class="se">\u03C7\u00b2</span><span class="s1">/d.o.f. = &#39;</span> <span class="o">+</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">chisquare_by_dof</span><span class="si">:</span><span class="s1">2.6f</span><span class="si">}</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="Fit_result-56"><a href="#Fit_result-56"><span class="linenos">56</span></a>        <span class="k">elif</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;residual_variance&#39;</span><span class="p">):</span>
</span><span id="Fit_result-57"><a href="#Fit_result-57"><span class="linenos">57</span></a>            <span class="n">my_str</span> <span class="o">+=</span> <span class="s1">&#39;residual variance = &#39;</span> <span class="o">+</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">residual_variance</span><span class="si">:</span><span class="s1">2.6f</span><span class="si">}</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="Fit_result-58"><a href="#Fit_result-58"><span class="linenos">58</span></a>        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;chisquare_by_expected_chisquare&#39;</span><span class="p">):</span>
</span><span id="Fit_result-59"><a href="#Fit_result-59"><span class="linenos">59</span></a>            <span class="n">my_str</span> <span class="o">+=</span> <span class="s1">&#39;</span><span class="se">\u03C7\u00b2</span><span class="s1">/</span><span class="se">\u03C7\u00b2</span><span class="s1">exp  = &#39;</span> <span class="o">+</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">chisquare_by_expected_chisquare</span><span class="si">:</span><span class="s1">2.6f</span><span class="si">}</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="Fit_result-60"><a href="#Fit_result-60"><span class="linenos">60</span></a>        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;p_value&#39;</span><span class="p">):</span>
</span><span id="Fit_result-61"><a href="#Fit_result-61"><span class="linenos">61</span></a>            <span class="n">my_str</span> <span class="o">+=</span> <span class="s1">&#39;p-value   = &#39;</span> <span class="o">+</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">p_value</span><span class="si">:</span><span class="s1">2.4f</span><span class="si">}</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="Fit_result-62"><a href="#Fit_result-62"><span class="linenos">62</span></a>        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;t2_p_value&#39;</span><span class="p">):</span>
</span><span id="Fit_result-63"><a href="#Fit_result-63"><span class="linenos">63</span></a>            <span class="n">my_str</span> <span class="o">+=</span> <span class="s1">&#39;t</span><span class="se">\u00B2</span><span class="s1">p-value = &#39;</span> <span class="o">+</span> <span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">t2_p_value</span><span class="si">:</span><span class="s1">2.4f</span><span class="si">}</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="Fit_result-64"><a href="#Fit_result-64"><span class="linenos">64</span></a>        <span class="n">my_str</span> <span class="o">+=</span> <span class="s1">&#39;Fit parameters:</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="Fit_result-65"><a href="#Fit_result-65"><span class="linenos">65</span></a>        <span class="k">for</span> <span class="n">i_par</span><span class="p">,</span> <span class="n">par</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fit_parameters</span><span class="p">):</span>
</span><span id="Fit_result-66"><a href="#Fit_result-66"><span class="linenos">66</span></a>            <span class="n">my_str</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">i_par</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\t</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">*</span> <span class="nb">int</span><span class="p">(</span><span class="n">par</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">par</span><span class="p">)</span><span class="o">.</span><span class="n">rjust</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">par</span> <span class="o">&lt;</span> <span class="mf">0.0</span><span class="p">))</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
</span><span id="Fit_result-67"><a href="#Fit_result-67"><span class="linenos">67</span></a>        <span class="k">return</span> <span class="n">my_str</span>
</span><span id="Fit_result-68"><a href="#Fit_result-68"><span class="linenos">68</span></a>
</span><span id="Fit_result-69"><a href="#Fit_result-69"><span class="linenos">69</span></a>    <span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
</span><span id="Fit_result-70"><a href="#Fit_result-70"><span class="linenos">70</span></a>        <span class="n">m</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">len</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">keys</span><span class="p">())))</span> <span class="o">+</span> <span class="mi">1</span>
</span><span id="Fit_result-71"><a href="#Fit_result-71"><span class="linenos">71</span></a>        <span class="k">return</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">key</span><span class="o">.</span><span class="n">rjust</span><span class="p">(</span><span class="n">m</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;: &#39;</span> <span class="o">+</span> <span class="nb">repr</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">items</span><span class="p">())])</span>
</span></pre></div>


            <div class="docstring"><p>Represents fit results.</p>

<h6 id="attributes">Attributes</h6>

<ul>
<li><strong>fit_parameters</strong> (list):
results for the individual fit parameters,
also accessible via indices.</li>
<li><strong>chisquare_by_dof</strong> (float):
reduced chisquare.</li>
<li><strong>p_value</strong> (float):
p-value of the fit</li>
<li><strong>t2_p_value</strong> (float):
Hotelling t-squared p-value for correlated fits.</li>
</ul>
</div>


                            <div id="Fit_result.fit_parameters" class="classattr">
                                <div class="attr variable">
            <span class="name">fit_parameters</span>

        
    </div>
    <a class="headerlink" href="#Fit_result.fit_parameters"></a>
    
    

                            </div>
                            <div id="Fit_result.gamma_method" class="classattr">
                                        <input id="Fit_result.gamma_method-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
            
        <span class="def">def</span>
        <span class="name">gamma_method</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">):</span></span>

                <label class="view-source-button" for="Fit_result.gamma_method-view-source"><span>View Source</span></label>

    </div>
    <a class="headerlink" href="#Fit_result.gamma_method"></a>
            <div class="pdoc-code codehilite"><pre><span></span><span id="Fit_result.gamma_method-46"><a href="#Fit_result.gamma_method-46"><span class="linenos">46</span></a>    <span class="k">def</span> <span class="nf">gamma_method</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="Fit_result.gamma_method-47"><a href="#Fit_result.gamma_method-47"><span class="linenos">47</span></a><span class="w">        </span><span class="sd">&quot;&quot;&quot;Apply the gamma method to all fit parameters&quot;&quot;&quot;</span>
</span><span id="Fit_result.gamma_method-48"><a href="#Fit_result.gamma_method-48"><span class="linenos">48</span></a>        <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">gamma_method</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fit_parameters</span><span class="p">]</span>
</span></pre></div>


            <div class="docstring"><p>Apply the gamma method to all fit parameters</p>
</div>


                            </div>
                            <div id="Fit_result.gm" class="classattr">
                                        <input id="Fit_result.gm-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
            
        <span class="def">def</span>
        <span class="name">gm</span><span class="signature pdoc-code condensed">(<span class="param"><span class="bp">self</span>, </span><span class="param"><span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">):</span></span>

                <label class="view-source-button" for="Fit_result.gm-view-source"><span>View Source</span></label>

    </div>
    <a class="headerlink" href="#Fit_result.gm"></a>
            <div class="pdoc-code codehilite"><pre><span></span><span id="Fit_result.gm-46"><a href="#Fit_result.gm-46"><span class="linenos">46</span></a>    <span class="k">def</span> <span class="nf">gamma_method</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="Fit_result.gm-47"><a href="#Fit_result.gm-47"><span class="linenos">47</span></a><span class="w">        </span><span class="sd">&quot;&quot;&quot;Apply the gamma method to all fit parameters&quot;&quot;&quot;</span>
</span><span id="Fit_result.gm-48"><a href="#Fit_result.gm-48"><span class="linenos">48</span></a>        <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">gamma_method</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fit_parameters</span><span class="p">]</span>
</span></pre></div>


            <div class="docstring"><p>Apply the gamma method to all fit parameters</p>
</div>


                            </div>
                            <div class="inherited">
                                <h5>Inherited Members</h5>
                                <dl>
                                    <div><dt>collections.abc.Sequence</dt>
                                <dd id="Fit_result.index" class="function">index</dd>
                <dd id="Fit_result.count" class="function">count</dd>

            </div>
                                </dl>
                            </div>
                </section>
                <section id="least_squares">
                            <input id="least_squares-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
            
        <span class="def">def</span>
        <span class="name">least_squares</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">x</span>, </span><span class="param"><span class="n">y</span>, </span><span class="param"><span class="n">func</span>, </span><span class="param"><span class="n">priors</span><span class="o">=</span><span class="kc">None</span>, </span><span class="param"><span class="n">silent</span><span class="o">=</span><span class="kc">False</span>, </span><span class="param"><span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">):</span></span>

                <label class="view-source-button" for="least_squares-view-source"><span>View Source</span></label>

    </div>
    <a class="headerlink" href="#least_squares"></a>
            <div class="pdoc-code codehilite"><pre><span></span><span id="least_squares-74"><a href="#least_squares-74"><span class="linenos"> 74</span></a><span class="k">def</span> <span class="nf">least_squares</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">priors</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="least_squares-75"><a href="#least_squares-75"><span class="linenos"> 75</span></a><span class="w">    </span><span class="sa">r</span><span class="sd">&#39;&#39;&#39;Performs a non-linear fit to y = func(x).</span>
</span><span id="least_squares-76"><a href="#least_squares-76"><span class="linenos"> 76</span></a><span class="sd">        ```</span>
</span><span id="least_squares-77"><a href="#least_squares-77"><span class="linenos"> 77</span></a>
</span><span id="least_squares-78"><a href="#least_squares-78"><span class="linenos"> 78</span></a><span class="sd">    Parameters</span>
</span><span id="least_squares-79"><a href="#least_squares-79"><span class="linenos"> 79</span></a><span class="sd">    ----------</span>
</span><span id="least_squares-80"><a href="#least_squares-80"><span class="linenos"> 80</span></a><span class="sd">    For an uncombined fit:</span>
</span><span id="least_squares-81"><a href="#least_squares-81"><span class="linenos"> 81</span></a>
</span><span id="least_squares-82"><a href="#least_squares-82"><span class="linenos"> 82</span></a><span class="sd">    x : list</span>
</span><span id="least_squares-83"><a href="#least_squares-83"><span class="linenos"> 83</span></a><span class="sd">        list of floats.</span>
</span><span id="least_squares-84"><a href="#least_squares-84"><span class="linenos"> 84</span></a><span class="sd">    y : list</span>
</span><span id="least_squares-85"><a href="#least_squares-85"><span class="linenos"> 85</span></a><span class="sd">        list of Obs.</span>
</span><span id="least_squares-86"><a href="#least_squares-86"><span class="linenos"> 86</span></a><span class="sd">    func : object</span>
</span><span id="least_squares-87"><a href="#least_squares-87"><span class="linenos"> 87</span></a><span class="sd">        fit function, has to be of the form</span>
</span><span id="least_squares-88"><a href="#least_squares-88"><span class="linenos"> 88</span></a>
</span><span id="least_squares-89"><a href="#least_squares-89"><span class="linenos"> 89</span></a><span class="sd">        ```python</span>
</span><span id="least_squares-90"><a href="#least_squares-90"><span class="linenos"> 90</span></a><span class="sd">        import autograd.numpy as anp</span>
</span><span id="least_squares-91"><a href="#least_squares-91"><span class="linenos"> 91</span></a>
</span><span id="least_squares-92"><a href="#least_squares-92"><span class="linenos"> 92</span></a><span class="sd">        def func(a, x):</span>
</span><span id="least_squares-93"><a href="#least_squares-93"><span class="linenos"> 93</span></a><span class="sd">            return a[0] + a[1] * x + a[2] * anp.sinh(x)</span>
</span><span id="least_squares-94"><a href="#least_squares-94"><span class="linenos"> 94</span></a><span class="sd">        ```</span>
</span><span id="least_squares-95"><a href="#least_squares-95"><span class="linenos"> 95</span></a>
</span><span id="least_squares-96"><a href="#least_squares-96"><span class="linenos"> 96</span></a><span class="sd">        For multiple x values func can be of the form</span>
</span><span id="least_squares-97"><a href="#least_squares-97"><span class="linenos"> 97</span></a>
</span><span id="least_squares-98"><a href="#least_squares-98"><span class="linenos"> 98</span></a><span class="sd">        ```python</span>
</span><span id="least_squares-99"><a href="#least_squares-99"><span class="linenos"> 99</span></a><span class="sd">        def func(a, x):</span>
</span><span id="least_squares-100"><a href="#least_squares-100"><span class="linenos">100</span></a><span class="sd">            (x1, x2) = x</span>
</span><span id="least_squares-101"><a href="#least_squares-101"><span class="linenos">101</span></a><span class="sd">            return a[0] * x1 ** 2 + a[1] * x2</span>
</span><span id="least_squares-102"><a href="#least_squares-102"><span class="linenos">102</span></a><span class="sd">        ```</span>
</span><span id="least_squares-103"><a href="#least_squares-103"><span class="linenos">103</span></a><span class="sd">        It is important that all numpy functions refer to autograd.numpy, otherwise the differentiation</span>
</span><span id="least_squares-104"><a href="#least_squares-104"><span class="linenos">104</span></a><span class="sd">        will not work.</span>
</span><span id="least_squares-105"><a href="#least_squares-105"><span class="linenos">105</span></a>
</span><span id="least_squares-106"><a href="#least_squares-106"><span class="linenos">106</span></a><span class="sd">    OR For a combined fit:</span>
</span><span id="least_squares-107"><a href="#least_squares-107"><span class="linenos">107</span></a>
</span><span id="least_squares-108"><a href="#least_squares-108"><span class="linenos">108</span></a><span class="sd">    x : dict</span>
</span><span id="least_squares-109"><a href="#least_squares-109"><span class="linenos">109</span></a><span class="sd">        dict of lists.</span>
</span><span id="least_squares-110"><a href="#least_squares-110"><span class="linenos">110</span></a><span class="sd">    y : dict</span>
</span><span id="least_squares-111"><a href="#least_squares-111"><span class="linenos">111</span></a><span class="sd">        dict of lists of Obs.</span>
</span><span id="least_squares-112"><a href="#least_squares-112"><span class="linenos">112</span></a><span class="sd">    funcs : dict</span>
</span><span id="least_squares-113"><a href="#least_squares-113"><span class="linenos">113</span></a><span class="sd">        dict of objects</span>
</span><span id="least_squares-114"><a href="#least_squares-114"><span class="linenos">114</span></a><span class="sd">        fit functions have to be of the form (here a[0] is the common fit parameter)</span>
</span><span id="least_squares-115"><a href="#least_squares-115"><span class="linenos">115</span></a><span class="sd">        ```python</span>
</span><span id="least_squares-116"><a href="#least_squares-116"><span class="linenos">116</span></a><span class="sd">        import autograd.numpy as anp</span>
</span><span id="least_squares-117"><a href="#least_squares-117"><span class="linenos">117</span></a><span class="sd">        funcs = {&quot;a&quot;: func_a,</span>
</span><span id="least_squares-118"><a href="#least_squares-118"><span class="linenos">118</span></a><span class="sd">                &quot;b&quot;: func_b}</span>
</span><span id="least_squares-119"><a href="#least_squares-119"><span class="linenos">119</span></a>
</span><span id="least_squares-120"><a href="#least_squares-120"><span class="linenos">120</span></a><span class="sd">        def func_a(a, x):</span>
</span><span id="least_squares-121"><a href="#least_squares-121"><span class="linenos">121</span></a><span class="sd">            return a[1] * anp.exp(-a[0] * x)</span>
</span><span id="least_squares-122"><a href="#least_squares-122"><span class="linenos">122</span></a>
</span><span id="least_squares-123"><a href="#least_squares-123"><span class="linenos">123</span></a><span class="sd">        def func_b(a, x):</span>
</span><span id="least_squares-124"><a href="#least_squares-124"><span class="linenos">124</span></a><span class="sd">            return a[2] * anp.exp(-a[0] * x)</span>
</span><span id="least_squares-125"><a href="#least_squares-125"><span class="linenos">125</span></a>
</span><span id="least_squares-126"><a href="#least_squares-126"><span class="linenos">126</span></a><span class="sd">        It is important that all numpy functions refer to autograd.numpy, otherwise the differentiation</span>
</span><span id="least_squares-127"><a href="#least_squares-127"><span class="linenos">127</span></a><span class="sd">        will not work.</span>
</span><span id="least_squares-128"><a href="#least_squares-128"><span class="linenos">128</span></a>
</span><span id="least_squares-129"><a href="#least_squares-129"><span class="linenos">129</span></a><span class="sd">    priors : dict or list, optional</span>
</span><span id="least_squares-130"><a href="#least_squares-130"><span class="linenos">130</span></a><span class="sd">        priors can either be a dictionary with integer keys and the corresponding priors as values or</span>
</span><span id="least_squares-131"><a href="#least_squares-131"><span class="linenos">131</span></a><span class="sd">        a list with an entry for every parameter in the fit. The entries can either be</span>
</span><span id="least_squares-132"><a href="#least_squares-132"><span class="linenos">132</span></a><span class="sd">        Obs (e.g. results from a previous fit) or strings containing a value and an error formatted like</span>
</span><span id="least_squares-133"><a href="#least_squares-133"><span class="linenos">133</span></a><span class="sd">        0.548(23), 500(40) or 0.5(0.4)</span>
</span><span id="least_squares-134"><a href="#least_squares-134"><span class="linenos">134</span></a><span class="sd">    silent : bool, optional</span>
</span><span id="least_squares-135"><a href="#least_squares-135"><span class="linenos">135</span></a><span class="sd">        If true all output to the console is omitted (default False).</span>
</span><span id="least_squares-136"><a href="#least_squares-136"><span class="linenos">136</span></a><span class="sd">    initial_guess : list</span>
</span><span id="least_squares-137"><a href="#least_squares-137"><span class="linenos">137</span></a><span class="sd">        can provide an initial guess for the input parameters. Relevant for</span>
</span><span id="least_squares-138"><a href="#least_squares-138"><span class="linenos">138</span></a><span class="sd">        non-linear fits with many parameters. In case of correlated fits the guess is used to perform</span>
</span><span id="least_squares-139"><a href="#least_squares-139"><span class="linenos">139</span></a><span class="sd">        an uncorrelated fit which then serves as guess for the correlated fit.</span>
</span><span id="least_squares-140"><a href="#least_squares-140"><span class="linenos">140</span></a><span class="sd">    method : str, optional</span>
</span><span id="least_squares-141"><a href="#least_squares-141"><span class="linenos">141</span></a><span class="sd">        can be used to choose an alternative method for the minimization of chisquare.</span>
</span><span id="least_squares-142"><a href="#least_squares-142"><span class="linenos">142</span></a><span class="sd">        The possible methods are the ones which can be used for scipy.optimize.minimize and</span>
</span><span id="least_squares-143"><a href="#least_squares-143"><span class="linenos">143</span></a><span class="sd">        migrad of iminuit. If no method is specified, Levenberg-Marquard is used.</span>
</span><span id="least_squares-144"><a href="#least_squares-144"><span class="linenos">144</span></a><span class="sd">        Reliable alternatives are migrad, Powell and Nelder-Mead.</span>
</span><span id="least_squares-145"><a href="#least_squares-145"><span class="linenos">145</span></a><span class="sd">    tol: float, optional</span>
</span><span id="least_squares-146"><a href="#least_squares-146"><span class="linenos">146</span></a><span class="sd">        can be used (only for combined fits and methods other than Levenberg-Marquard) to set the tolerance for convergence</span>
</span><span id="least_squares-147"><a href="#least_squares-147"><span class="linenos">147</span></a><span class="sd">        to a different value to either speed up convergence at the cost of a larger error on the fitted parameters (and possibly</span>
</span><span id="least_squares-148"><a href="#least_squares-148"><span class="linenos">148</span></a><span class="sd">        invalid estimates for parameter uncertainties) or smaller values to get more accurate parameter values</span>
</span><span id="least_squares-149"><a href="#least_squares-149"><span class="linenos">149</span></a><span class="sd">        The stopping criterion depends on the method, e.g. migrad: edm_max = 0.002 * tol * errordef (EDM criterion: edm &lt; edm_max)</span>
</span><span id="least_squares-150"><a href="#least_squares-150"><span class="linenos">150</span></a><span class="sd">    correlated_fit : bool</span>
</span><span id="least_squares-151"><a href="#least_squares-151"><span class="linenos">151</span></a><span class="sd">        If True, use the full inverse covariance matrix in the definition of the chisquare cost function.</span>
</span><span id="least_squares-152"><a href="#least_squares-152"><span class="linenos">152</span></a><span class="sd">        For details about how the covariance matrix is estimated see `pyerrors.obs.covariance`.</span>
</span><span id="least_squares-153"><a href="#least_squares-153"><span class="linenos">153</span></a><span class="sd">        In practice the correlation matrix is Cholesky decomposed and inverted (instead of the covariance matrix).</span>
</span><span id="least_squares-154"><a href="#least_squares-154"><span class="linenos">154</span></a><span class="sd">        This procedure should be numerically more stable as the correlation matrix is typically better conditioned (Jacobi preconditioning).</span>
</span><span id="least_squares-155"><a href="#least_squares-155"><span class="linenos">155</span></a><span class="sd">    expected_chisquare : bool</span>
</span><span id="least_squares-156"><a href="#least_squares-156"><span class="linenos">156</span></a><span class="sd">        If True estimates the expected chisquare which is</span>
</span><span id="least_squares-157"><a href="#least_squares-157"><span class="linenos">157</span></a><span class="sd">        corrected by effects caused by correlated input data (default False).</span>
</span><span id="least_squares-158"><a href="#least_squares-158"><span class="linenos">158</span></a><span class="sd">    resplot : bool</span>
</span><span id="least_squares-159"><a href="#least_squares-159"><span class="linenos">159</span></a><span class="sd">        If True, a plot which displays fit, data and residuals is generated (default False).</span>
</span><span id="least_squares-160"><a href="#least_squares-160"><span class="linenos">160</span></a><span class="sd">    qqplot : bool</span>
</span><span id="least_squares-161"><a href="#least_squares-161"><span class="linenos">161</span></a><span class="sd">        If True, a quantile-quantile plot of the fit result is generated (default False).</span>
</span><span id="least_squares-162"><a href="#least_squares-162"><span class="linenos">162</span></a><span class="sd">    num_grad : bool</span>
</span><span id="least_squares-163"><a href="#least_squares-163"><span class="linenos">163</span></a><span class="sd">        Use numerical differentation instead of automatic differentiation to perform the error propagation (default False).</span>
</span><span id="least_squares-164"><a href="#least_squares-164"><span class="linenos">164</span></a>
</span><span id="least_squares-165"><a href="#least_squares-165"><span class="linenos">165</span></a><span class="sd">    Returns</span>
</span><span id="least_squares-166"><a href="#least_squares-166"><span class="linenos">166</span></a><span class="sd">    -------</span>
</span><span id="least_squares-167"><a href="#least_squares-167"><span class="linenos">167</span></a><span class="sd">    output : Fit_result</span>
</span><span id="least_squares-168"><a href="#least_squares-168"><span class="linenos">168</span></a><span class="sd">        Parameters and information on the fitted result.</span>
</span><span id="least_squares-169"><a href="#least_squares-169"><span class="linenos">169</span></a><span class="sd">    &#39;&#39;&#39;</span>
</span><span id="least_squares-170"><a href="#least_squares-170"><span class="linenos">170</span></a>    <span class="n">output</span> <span class="o">=</span> <span class="n">Fit_result</span><span class="p">()</span>
</span><span id="least_squares-171"><a href="#least_squares-171"><span class="linenos">171</span></a>
</span><span id="least_squares-172"><a href="#least_squares-172"><span class="linenos">172</span></a>    <span class="k">if</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)):</span>
</span><span id="least_squares-173"><a href="#least_squares-173"><span class="linenos">173</span></a>        <span class="n">xd</span> <span class="o">=</span> <span class="p">{</span><span class="n">key</span><span class="p">:</span> <span class="n">anp</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">x</span><span class="p">}</span>
</span><span id="least_squares-174"><a href="#least_squares-174"><span class="linenos">174</span></a>        <span class="n">yd</span> <span class="o">=</span> <span class="n">y</span>
</span><span id="least_squares-175"><a href="#least_squares-175"><span class="linenos">175</span></a>        <span class="n">funcd</span> <span class="o">=</span> <span class="n">func</span>
</span><span id="least_squares-176"><a href="#least_squares-176"><span class="linenos">176</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">fit_function</span> <span class="o">=</span> <span class="n">func</span>
</span><span id="least_squares-177"><a href="#least_squares-177"><span class="linenos">177</span></a>    <span class="k">elif</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">func</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)):</span>
</span><span id="least_squares-178"><a href="#least_squares-178"><span class="linenos">178</span></a>        <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;All arguments have to be dictionaries in order to perform a combined fit.&quot;</span><span class="p">)</span>
</span><span id="least_squares-179"><a href="#least_squares-179"><span class="linenos">179</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="least_squares-180"><a href="#least_squares-180"><span class="linenos">180</span></a>        <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span><span id="least_squares-181"><a href="#least_squares-181"><span class="linenos">181</span></a>        <span class="n">xd</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;&quot;</span><span class="p">:</span> <span class="n">x</span><span class="p">}</span>
</span><span id="least_squares-182"><a href="#least_squares-182"><span class="linenos">182</span></a>        <span class="n">yd</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;&quot;</span><span class="p">:</span> <span class="n">y</span><span class="p">}</span>
</span><span id="least_squares-183"><a href="#least_squares-183"><span class="linenos">183</span></a>        <span class="n">funcd</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;&quot;</span><span class="p">:</span> <span class="n">func</span><span class="p">}</span>
</span><span id="least_squares-184"><a href="#least_squares-184"><span class="linenos">184</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">fit_function</span> <span class="o">=</span> <span class="n">func</span>
</span><span id="least_squares-185"><a href="#least_squares-185"><span class="linenos">185</span></a>
</span><span id="least_squares-186"><a href="#least_squares-186"><span class="linenos">186</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;num_grad&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="least_squares-187"><a href="#least_squares-187"><span class="linenos">187</span></a>        <span class="n">jacobian</span> <span class="o">=</span> <span class="n">num_jacobian</span>
</span><span id="least_squares-188"><a href="#least_squares-188"><span class="linenos">188</span></a>        <span class="n">hessian</span> <span class="o">=</span> <span class="n">num_hessian</span>
</span><span id="least_squares-189"><a href="#least_squares-189"><span class="linenos">189</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="least_squares-190"><a href="#least_squares-190"><span class="linenos">190</span></a>        <span class="n">jacobian</span> <span class="o">=</span> <span class="n">auto_jacobian</span>
</span><span id="least_squares-191"><a href="#least_squares-191"><span class="linenos">191</span></a>        <span class="n">hessian</span> <span class="o">=</span> <span class="n">auto_hessian</span>
</span><span id="least_squares-192"><a href="#least_squares-192"><span class="linenos">192</span></a>
</span><span id="least_squares-193"><a href="#least_squares-193"><span class="linenos">193</span></a>    <span class="n">key_ls</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">xd</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span>
</span><span id="least_squares-194"><a href="#least_squares-194"><span class="linenos">194</span></a>
</span><span id="least_squares-195"><a href="#least_squares-195"><span class="linenos">195</span></a>    <span class="k">if</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">yd</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span> <span class="o">!=</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="least_squares-196"><a href="#least_squares-196"><span class="linenos">196</span></a>        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;x and y dictionaries do not contain the same keys.&#39;</span><span class="p">)</span>
</span><span id="least_squares-197"><a href="#least_squares-197"><span class="linenos">197</span></a>
</span><span id="least_squares-198"><a href="#least_squares-198"><span class="linenos">198</span></a>    <span class="k">if</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">funcd</span><span class="o">.</span><span class="n">keys</span><span class="p">()))</span> <span class="o">!=</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="least_squares-199"><a href="#least_squares-199"><span class="linenos">199</span></a>        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;x and func dictionaries do not contain the same keys.&#39;</span><span class="p">)</span>
</span><span id="least_squares-200"><a href="#least_squares-200"><span class="linenos">200</span></a>
</span><span id="least_squares-201"><a href="#least_squares-201"><span class="linenos">201</span></a>    <span class="n">x_all</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">([</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">])</span>
</span><span id="least_squares-202"><a href="#least_squares-202"><span class="linenos">202</span></a>    <span class="n">y_all</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">([</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">yd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">])</span>
</span><span id="least_squares-203"><a href="#least_squares-203"><span class="linenos">203</span></a>
</span><span id="least_squares-204"><a href="#least_squares-204"><span class="linenos">204</span></a>    <span class="n">y_f</span> <span class="o">=</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y_all</span><span class="p">]</span>
</span><span id="least_squares-205"><a href="#least_squares-205"><span class="linenos">205</span></a>    <span class="n">dy_f</span> <span class="o">=</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">dvalue</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y_all</span><span class="p">]</span>
</span><span id="least_squares-206"><a href="#least_squares-206"><span class="linenos">206</span></a>
</span><span id="least_squares-207"><a href="#least_squares-207"><span class="linenos">207</span></a>    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x_all</span><span class="o">.</span><span class="n">shape</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="p">:</span>
</span><span id="least_squares-208"><a href="#least_squares-208"><span class="linenos">208</span></a>        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Unknown format for x values&quot;</span><span class="p">)</span>
</span><span id="least_squares-209"><a href="#least_squares-209"><span class="linenos">209</span></a>
</span><span id="least_squares-210"><a href="#least_squares-210"><span class="linenos">210</span></a>    <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">dy_f</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mf">0.0</span><span class="p">):</span>
</span><span id="least_squares-211"><a href="#least_squares-211"><span class="linenos">211</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;No y errors available, run the gamma method first.&quot;</span><span class="p">)</span>
</span><span id="least_squares-212"><a href="#least_squares-212"><span class="linenos">212</span></a>
</span><span id="least_squares-213"><a href="#least_squares-213"><span class="linenos">213</span></a>    <span class="c1"># number of fit parameters</span>
</span><span id="least_squares-214"><a href="#least_squares-214"><span class="linenos">214</span></a>    <span class="n">n_parms_ls</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="least_squares-215"><a href="#least_squares-215"><span class="linenos">215</span></a>    <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="least_squares-216"><a href="#least_squares-216"><span class="linenos">216</span></a>        <span class="k">if</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">]):</span>
</span><span id="least_squares-217"><a href="#least_squares-217"><span class="linenos">217</span></a>            <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;func (key=&#39;</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s1">&#39;) is not a function.&#39;</span><span class="p">)</span>
</span><span id="least_squares-218"><a href="#least_squares-218"><span class="linenos">218</span></a>        <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">yd</span><span class="p">[</span><span class="n">key</span><span class="p">]):</span>
</span><span id="least_squares-219"><a href="#least_squares-219"><span class="linenos">219</span></a>            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;x and y input (key=&#39;</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s1">&#39;) do not have the same length&#39;</span><span class="p">)</span>
</span><span id="least_squares-220"><a href="#least_squares-220"><span class="linenos">220</span></a>        <span class="k">for</span> <span class="n">n_loc</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">):</span>
</span><span id="least_squares-221"><a href="#least_squares-221"><span class="linenos">221</span></a>            <span class="k">try</span><span class="p">:</span>
</span><span id="least_squares-222"><a href="#least_squares-222"><span class="linenos">222</span></a>                <span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">](</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">n_loc</span><span class="p">),</span> <span class="n">x_all</span><span class="o">.</span><span class="n">T</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="least_squares-223"><a href="#least_squares-223"><span class="linenos">223</span></a>            <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
</span><span id="least_squares-224"><a href="#least_squares-224"><span class="linenos">224</span></a>                <span class="k">continue</span>
</span><span id="least_squares-225"><a href="#least_squares-225"><span class="linenos">225</span></a>            <span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
</span><span id="least_squares-226"><a href="#least_squares-226"><span class="linenos">226</span></a>                <span class="k">continue</span>
</span><span id="least_squares-227"><a href="#least_squares-227"><span class="linenos">227</span></a>            <span class="k">else</span><span class="p">:</span>
</span><span id="least_squares-228"><a href="#least_squares-228"><span class="linenos">228</span></a>                <span class="k">break</span>
</span><span id="least_squares-229"><a href="#least_squares-229"><span class="linenos">229</span></a>        <span class="k">else</span><span class="p">:</span>
</span><span id="least_squares-230"><a href="#least_squares-230"><span class="linenos">230</span></a>            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Fit function (key=&quot;</span> <span class="o">+</span> <span class="n">key</span> <span class="o">+</span> <span class="s2">&quot;) is not valid.&quot;</span><span class="p">)</span>
</span><span id="least_squares-231"><a href="#least_squares-231"><span class="linenos">231</span></a>        <span class="n">n_parms_ls</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">n_loc</span><span class="p">)</span>
</span><span id="least_squares-232"><a href="#least_squares-232"><span class="linenos">232</span></a>
</span><span id="least_squares-233"><a href="#least_squares-233"><span class="linenos">233</span></a>    <span class="n">n_parms</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">n_parms_ls</span><span class="p">)</span>
</span><span id="least_squares-234"><a href="#least_squares-234"><span class="linenos">234</span></a>
</span><span id="least_squares-235"><a href="#least_squares-235"><span class="linenos">235</span></a>    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">key_ls</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="least_squares-236"><a href="#least_squares-236"><span class="linenos">236</span></a>        <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="least_squares-237"><a href="#least_squares-237"><span class="linenos">237</span></a>            <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">yd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span><span class="o">.</span><span class="n">shape</span> <span class="o">!=</span> <span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">](</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">n_parms</span><span class="p">),</span> <span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span><span class="o">.</span><span class="n">shape</span><span class="p">:</span>
</span><span id="least_squares-238"><a href="#least_squares-238"><span class="linenos">238</span></a>                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Fit function </span><span class="si">{</span><span class="n">key</span><span class="si">}</span><span class="s2"> returns the wrong shape (</span><span class="si">{</span><span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">](</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">n_parms</span><span class="p">),</span><span class="w"> </span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span><span class="o">.</span><span class="n">shape</span><span class="si">}</span><span class="s2"> instead of </span><span class="si">{</span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="n">shape</span><span class="si">}</span><span class="s2">)</span><span class="se">\n</span><span class="s2">If the fit function is just a constant you could try adding x*0 to get the correct shape.&quot;</span><span class="p">)</span>
</span><span id="least_squares-239"><a href="#least_squares-239"><span class="linenos">239</span></a>
</span><span id="least_squares-240"><a href="#least_squares-240"><span class="linenos">240</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="least_squares-241"><a href="#least_squares-241"><span class="linenos">241</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Fit with&#39;</span><span class="p">,</span> <span class="n">n_parms</span><span class="p">,</span> <span class="s1">&#39;parameter&#39;</span> <span class="o">+</span> <span class="s1">&#39;s&#39;</span> <span class="o">*</span> <span class="p">(</span><span class="n">n_parms</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">))</span>
</span><span id="least_squares-242"><a href="#least_squares-242"><span class="linenos">242</span></a>
</span><span id="least_squares-243"><a href="#least_squares-243"><span class="linenos">243</span></a>    <span class="k">if</span> <span class="n">priors</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="least_squares-244"><a href="#least_squares-244"><span class="linenos">244</span></a>        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">priors</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">)):</span>
</span><span id="least_squares-245"><a href="#least_squares-245"><span class="linenos">245</span></a>            <span class="k">if</span> <span class="n">n_parms</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">priors</span><span class="p">):</span>
</span><span id="least_squares-246"><a href="#least_squares-246"><span class="linenos">246</span></a>                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;&#39;priors&#39; does not have the correct length.&quot;</span><span class="p">)</span>
</span><span id="least_squares-247"><a href="#least_squares-247"><span class="linenos">247</span></a>
</span><span id="least_squares-248"><a href="#least_squares-248"><span class="linenos">248</span></a>            <span class="n">loc_priors</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="least_squares-249"><a href="#least_squares-249"><span class="linenos">249</span></a>            <span class="k">for</span> <span class="n">i_n</span><span class="p">,</span> <span class="n">i_prior</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">priors</span><span class="p">):</span>
</span><span id="least_squares-250"><a href="#least_squares-250"><span class="linenos">250</span></a>                <span class="n">loc_priors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_construct_prior_obs</span><span class="p">(</span><span class="n">i_prior</span><span class="p">,</span> <span class="n">i_n</span><span class="p">))</span>
</span><span id="least_squares-251"><a href="#least_squares-251"><span class="linenos">251</span></a>
</span><span id="least_squares-252"><a href="#least_squares-252"><span class="linenos">252</span></a>            <span class="n">prior_mask</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">priors</span><span class="p">))</span>
</span><span id="least_squares-253"><a href="#least_squares-253"><span class="linenos">253</span></a>            <span class="n">output</span><span class="o">.</span><span class="n">priors</span> <span class="o">=</span> <span class="n">loc_priors</span>
</span><span id="least_squares-254"><a href="#least_squares-254"><span class="linenos">254</span></a>
</span><span id="least_squares-255"><a href="#least_squares-255"><span class="linenos">255</span></a>        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">priors</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
</span><span id="least_squares-256"><a href="#least_squares-256"><span class="linenos">256</span></a>            <span class="n">loc_priors</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="least_squares-257"><a href="#least_squares-257"><span class="linenos">257</span></a>            <span class="n">prior_mask</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="least_squares-258"><a href="#least_squares-258"><span class="linenos">258</span></a>            <span class="n">output</span><span class="o">.</span><span class="n">priors</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="least_squares-259"><a href="#least_squares-259"><span class="linenos">259</span></a>            <span class="k">for</span> <span class="n">pos</span><span class="p">,</span> <span class="n">prior</span> <span class="ow">in</span> <span class="n">priors</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
</span><span id="least_squares-260"><a href="#least_squares-260"><span class="linenos">260</span></a>                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
</span><span id="least_squares-261"><a href="#least_squares-261"><span class="linenos">261</span></a>                    <span class="n">prior_mask</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pos</span><span class="p">)</span>
</span><span id="least_squares-262"><a href="#least_squares-262"><span class="linenos">262</span></a>                <span class="k">else</span><span class="p">:</span>
</span><span id="least_squares-263"><a href="#least_squares-263"><span class="linenos">263</span></a>                    <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Prior position needs to be an integer.&quot;</span><span class="p">)</span>
</span><span id="least_squares-264"><a href="#least_squares-264"><span class="linenos">264</span></a>                <span class="n">loc_priors</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_construct_prior_obs</span><span class="p">(</span><span class="n">prior</span><span class="p">,</span> <span class="n">pos</span><span class="p">))</span>
</span><span id="least_squares-265"><a href="#least_squares-265"><span class="linenos">265</span></a>
</span><span id="least_squares-266"><a href="#least_squares-266"><span class="linenos">266</span></a>                <span class="n">output</span><span class="o">.</span><span class="n">priors</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">=</span> <span class="n">loc_priors</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span><span id="least_squares-267"><a href="#least_squares-267"><span class="linenos">267</span></a>            <span class="k">if</span> <span class="nb">max</span><span class="p">(</span><span class="n">prior_mask</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">n_parms</span><span class="p">:</span>
</span><span id="least_squares-268"><a href="#least_squares-268"><span class="linenos">268</span></a>                <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Prior position out of range.&quot;</span><span class="p">)</span>
</span><span id="least_squares-269"><a href="#least_squares-269"><span class="linenos">269</span></a>        <span class="k">else</span><span class="p">:</span>
</span><span id="least_squares-270"><a href="#least_squares-270"><span class="linenos">270</span></a>            <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;Unkown type for `priors`.&quot;</span><span class="p">)</span>
</span><span id="least_squares-271"><a href="#least_squares-271"><span class="linenos">271</span></a>
</span><span id="least_squares-272"><a href="#least_squares-272"><span class="linenos">272</span></a>        <span class="n">p_f</span> <span class="o">=</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">loc_priors</span><span class="p">]</span>
</span><span id="least_squares-273"><a href="#least_squares-273"><span class="linenos">273</span></a>        <span class="n">dp_f</span> <span class="o">=</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">dvalue</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">loc_priors</span><span class="p">]</span>
</span><span id="least_squares-274"><a href="#least_squares-274"><span class="linenos">274</span></a>        <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">dp_f</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mf">0.0</span><span class="p">):</span>
</span><span id="least_squares-275"><a href="#least_squares-275"><span class="linenos">275</span></a>            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;No prior errors available, run the gamma method first.&quot;</span><span class="p">)</span>
</span><span id="least_squares-276"><a href="#least_squares-276"><span class="linenos">276</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="least_squares-277"><a href="#least_squares-277"><span class="linenos">277</span></a>        <span class="n">p_f</span> <span class="o">=</span> <span class="n">dp_f</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([])</span>
</span><span id="least_squares-278"><a href="#least_squares-278"><span class="linenos">278</span></a>        <span class="n">prior_mask</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="least_squares-279"><a href="#least_squares-279"><span class="linenos">279</span></a>        <span class="n">loc_priors</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="least_squares-280"><a href="#least_squares-280"><span class="linenos">280</span></a>
</span><span id="least_squares-281"><a href="#least_squares-281"><span class="linenos">281</span></a>    <span class="k">if</span> <span class="s1">&#39;initial_guess&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
</span><span id="least_squares-282"><a href="#least_squares-282"><span class="linenos">282</span></a>        <span class="n">x0</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;initial_guess&#39;</span><span class="p">)</span>
</span><span id="least_squares-283"><a href="#least_squares-283"><span class="linenos">283</span></a>        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">)</span> <span class="o">!=</span> <span class="n">n_parms</span><span class="p">:</span>
</span><span id="least_squares-284"><a href="#least_squares-284"><span class="linenos">284</span></a>            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Initial guess does not have the correct length: </span><span class="si">%d</span><span class="s1"> vs. </span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">),</span> <span class="n">n_parms</span><span class="p">))</span>
</span><span id="least_squares-285"><a href="#least_squares-285"><span class="linenos">285</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="least_squares-286"><a href="#least_squares-286"><span class="linenos">286</span></a>        <span class="n">x0</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.1</span><span class="p">]</span> <span class="o">*</span> <span class="n">n_parms</span>
</span><span id="least_squares-287"><a href="#least_squares-287"><span class="linenos">287</span></a>
</span><span id="least_squares-288"><a href="#least_squares-288"><span class="linenos">288</span></a>    <span class="k">if</span> <span class="n">priors</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="least_squares-289"><a href="#least_squares-289"><span class="linenos">289</span></a>        <span class="k">def</span> <span class="nf">general_chisqfunc_uncorr</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">ivars</span><span class="p">,</span> <span class="n">pr</span><span class="p">):</span>
</span><span id="least_squares-290"><a href="#least_squares-290"><span class="linenos">290</span></a>            <span class="n">model</span> <span class="o">=</span> <span class="n">anp</span><span class="o">.</span><span class="n">concatenate</span><span class="p">([</span><span class="n">anp</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">](</span><span class="n">p</span><span class="p">,</span> <span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">])</span>
</span><span id="least_squares-291"><a href="#least_squares-291"><span class="linenos">291</span></a>            <span class="k">return</span> <span class="p">(</span><span class="n">ivars</span> <span class="o">-</span> <span class="n">model</span><span class="p">)</span> <span class="o">/</span> <span class="n">dy_f</span>
</span><span id="least_squares-292"><a href="#least_squares-292"><span class="linenos">292</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="least_squares-293"><a href="#least_squares-293"><span class="linenos">293</span></a>        <span class="k">def</span> <span class="nf">general_chisqfunc_uncorr</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">ivars</span><span class="p">,</span> <span class="n">pr</span><span class="p">):</span>
</span><span id="least_squares-294"><a href="#least_squares-294"><span class="linenos">294</span></a>            <span class="n">model</span> <span class="o">=</span> <span class="n">anp</span><span class="o">.</span><span class="n">concatenate</span><span class="p">([</span><span class="n">anp</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">](</span><span class="n">p</span><span class="p">,</span> <span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">])</span>
</span><span id="least_squares-295"><a href="#least_squares-295"><span class="linenos">295</span></a>            <span class="k">return</span> <span class="n">anp</span><span class="o">.</span><span class="n">concatenate</span><span class="p">(((</span><span class="n">ivars</span> <span class="o">-</span> <span class="n">model</span><span class="p">)</span> <span class="o">/</span> <span class="n">dy_f</span><span class="p">,</span> <span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="n">prior_mask</span><span class="p">]</span> <span class="o">-</span> <span class="n">pr</span><span class="p">)</span> <span class="o">/</span> <span class="n">dp_f</span><span class="p">))</span>
</span><span id="least_squares-296"><a href="#least_squares-296"><span class="linenos">296</span></a>
</span><span id="least_squares-297"><a href="#least_squares-297"><span class="linenos">297</span></a>    <span class="k">def</span> <span class="nf">chisqfunc_uncorr</span><span class="p">(</span><span class="n">p</span><span class="p">):</span>
</span><span id="least_squares-298"><a href="#least_squares-298"><span class="linenos">298</span></a>        <span class="k">return</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">general_chisqfunc_uncorr</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">y_f</span><span class="p">,</span> <span class="n">p_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="least_squares-299"><a href="#least_squares-299"><span class="linenos">299</span></a>
</span><span id="least_squares-300"><a href="#least_squares-300"><span class="linenos">300</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;correlated_fit&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="least_squares-301"><a href="#least_squares-301"><span class="linenos">301</span></a>        <span class="n">corr</span> <span class="o">=</span> <span class="n">covariance</span><span class="p">(</span><span class="n">y_all</span><span class="p">,</span> <span class="n">correlation</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="least_squares-302"><a href="#least_squares-302"><span class="linenos">302</span></a>        <span class="n">covdiag</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">diag</span><span class="p">(</span><span class="mi">1</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">dy_f</span><span class="p">))</span>
</span><span id="least_squares-303"><a href="#least_squares-303"><span class="linenos">303</span></a>        <span class="n">condn</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">cond</span><span class="p">(</span><span class="n">corr</span><span class="p">)</span>
</span><span id="least_squares-304"><a href="#least_squares-304"><span class="linenos">304</span></a>        <span class="k">if</span> <span class="n">condn</span> <span class="o">&gt;</span> <span class="mf">0.1</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="nb">float</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">:</span>
</span><span id="least_squares-305"><a href="#least_squares-305"><span class="linenos">305</span></a>            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Cannot invert correlation matrix as its condition number exceeds machine precision (</span><span class="si">{</span><span class="n">condn</span><span class="si">:</span><span class="s2">1.2e</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">)</span>
</span><span id="least_squares-306"><a href="#least_squares-306"><span class="linenos">306</span></a>        <span class="k">if</span> <span class="n">condn</span> <span class="o">&gt;</span> <span class="mf">1e13</span><span class="p">:</span>
</span><span id="least_squares-307"><a href="#least_squares-307"><span class="linenos">307</span></a>            <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">&quot;Correlation matrix may be ill-conditioned, condition number: {</span><span class="si">%1.2e</span><span class="s2">}&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">condn</span><span class="p">),</span> <span class="ne">RuntimeWarning</span><span class="p">)</span>
</span><span id="least_squares-308"><a href="#least_squares-308"><span class="linenos">308</span></a>        <span class="n">chol</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">cholesky</span><span class="p">(</span><span class="n">corr</span><span class="p">)</span>
</span><span id="least_squares-309"><a href="#least_squares-309"><span class="linenos">309</span></a>        <span class="n">chol_inv</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">solve_triangular</span><span class="p">(</span><span class="n">chol</span><span class="p">,</span> <span class="n">covdiag</span><span class="p">,</span> <span class="n">lower</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="least_squares-310"><a href="#least_squares-310"><span class="linenos">310</span></a>
</span><span id="least_squares-311"><a href="#least_squares-311"><span class="linenos">311</span></a>        <span class="k">def</span> <span class="nf">general_chisqfunc</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">ivars</span><span class="p">,</span> <span class="n">pr</span><span class="p">):</span>
</span><span id="least_squares-312"><a href="#least_squares-312"><span class="linenos">312</span></a>            <span class="n">model</span> <span class="o">=</span> <span class="n">anp</span><span class="o">.</span><span class="n">concatenate</span><span class="p">([</span><span class="n">anp</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">](</span><span class="n">p</span><span class="p">,</span> <span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">])</span>
</span><span id="least_squares-313"><a href="#least_squares-313"><span class="linenos">313</span></a>            <span class="k">return</span> <span class="n">anp</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">anp</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">chol_inv</span><span class="p">,</span> <span class="p">(</span><span class="n">ivars</span> <span class="o">-</span> <span class="n">model</span><span class="p">)),</span> <span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="n">prior_mask</span><span class="p">]</span> <span class="o">-</span> <span class="n">pr</span><span class="p">)</span> <span class="o">/</span> <span class="n">dp_f</span><span class="p">))</span>
</span><span id="least_squares-314"><a href="#least_squares-314"><span class="linenos">314</span></a>
</span><span id="least_squares-315"><a href="#least_squares-315"><span class="linenos">315</span></a>        <span class="k">def</span> <span class="nf">chisqfunc</span><span class="p">(</span><span class="n">p</span><span class="p">):</span>
</span><span id="least_squares-316"><a href="#least_squares-316"><span class="linenos">316</span></a>            <span class="k">return</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">general_chisqfunc</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">y_f</span><span class="p">,</span> <span class="n">p_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="least_squares-317"><a href="#least_squares-317"><span class="linenos">317</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="least_squares-318"><a href="#least_squares-318"><span class="linenos">318</span></a>        <span class="n">general_chisqfunc</span> <span class="o">=</span> <span class="n">general_chisqfunc_uncorr</span>
</span><span id="least_squares-319"><a href="#least_squares-319"><span class="linenos">319</span></a>        <span class="n">chisqfunc</span> <span class="o">=</span> <span class="n">chisqfunc_uncorr</span>
</span><span id="least_squares-320"><a href="#least_squares-320"><span class="linenos">320</span></a>
</span><span id="least_squares-321"><a href="#least_squares-321"><span class="linenos">321</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;method&#39;</span><span class="p">,</span> <span class="s1">&#39;Levenberg-Marquardt&#39;</span><span class="p">)</span>
</span><span id="least_squares-322"><a href="#least_squares-322"><span class="linenos">322</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="least_squares-323"><a href="#least_squares-323"><span class="linenos">323</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Method:&#39;</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">method</span><span class="p">)</span>
</span><span id="least_squares-324"><a href="#least_squares-324"><span class="linenos">324</span></a>
</span><span id="least_squares-325"><a href="#least_squares-325"><span class="linenos">325</span></a>    <span class="k">if</span> <span class="n">output</span><span class="o">.</span><span class="n">method</span> <span class="o">!=</span> <span class="s1">&#39;Levenberg-Marquardt&#39;</span><span class="p">:</span>
</span><span id="least_squares-326"><a href="#least_squares-326"><span class="linenos">326</span></a>        <span class="k">if</span> <span class="n">output</span><span class="o">.</span><span class="n">method</span> <span class="o">==</span> <span class="s1">&#39;migrad&#39;</span><span class="p">:</span>
</span><span id="least_squares-327"><a href="#least_squares-327"><span class="linenos">327</span></a>            <span class="n">tolerance</span> <span class="o">=</span> <span class="mf">1e-4</span>  <span class="c1"># default value of 1e-1 set by iminuit can be problematic</span>
</span><span id="least_squares-328"><a href="#least_squares-328"><span class="linenos">328</span></a>            <span class="k">if</span> <span class="s1">&#39;tol&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
</span><span id="least_squares-329"><a href="#least_squares-329"><span class="linenos">329</span></a>                <span class="n">tolerance</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;tol&#39;</span><span class="p">)</span>
</span><span id="least_squares-330"><a href="#least_squares-330"><span class="linenos">330</span></a>            <span class="n">fit_result</span> <span class="o">=</span> <span class="n">iminuit</span><span class="o">.</span><span class="n">minimize</span><span class="p">(</span><span class="n">chisqfunc_uncorr</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">tol</span><span class="o">=</span><span class="n">tolerance</span><span class="p">)</span>  <span class="c1"># Stopping criterion 0.002 * tol * errordef</span>
</span><span id="least_squares-331"><a href="#least_squares-331"><span class="linenos">331</span></a>            <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;correlated_fit&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="least_squares-332"><a href="#least_squares-332"><span class="linenos">332</span></a>                <span class="n">fit_result</span> <span class="o">=</span> <span class="n">iminuit</span><span class="o">.</span><span class="n">minimize</span><span class="p">(</span><span class="n">chisqfunc</span><span class="p">,</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">tol</span><span class="o">=</span><span class="n">tolerance</span><span class="p">)</span>
</span><span id="least_squares-333"><a href="#least_squares-333"><span class="linenos">333</span></a>            <span class="n">output</span><span class="o">.</span><span class="n">iterations</span> <span class="o">=</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">nfev</span>
</span><span id="least_squares-334"><a href="#least_squares-334"><span class="linenos">334</span></a>        <span class="k">else</span><span class="p">:</span>
</span><span id="least_squares-335"><a href="#least_squares-335"><span class="linenos">335</span></a>            <span class="n">tolerance</span> <span class="o">=</span> <span class="mf">1e-12</span>
</span><span id="least_squares-336"><a href="#least_squares-336"><span class="linenos">336</span></a>            <span class="k">if</span> <span class="s1">&#39;tol&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
</span><span id="least_squares-337"><a href="#least_squares-337"><span class="linenos">337</span></a>                <span class="n">tolerance</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;tol&#39;</span><span class="p">)</span>
</span><span id="least_squares-338"><a href="#least_squares-338"><span class="linenos">338</span></a>            <span class="n">fit_result</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">optimize</span><span class="o">.</span><span class="n">minimize</span><span class="p">(</span><span class="n">chisqfunc_uncorr</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;method&#39;</span><span class="p">),</span> <span class="n">tol</span><span class="o">=</span><span class="n">tolerance</span><span class="p">)</span>
</span><span id="least_squares-339"><a href="#least_squares-339"><span class="linenos">339</span></a>            <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;correlated_fit&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="least_squares-340"><a href="#least_squares-340"><span class="linenos">340</span></a>                <span class="n">fit_result</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">optimize</span><span class="o">.</span><span class="n">minimize</span><span class="p">(</span><span class="n">chisqfunc</span><span class="p">,</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;method&#39;</span><span class="p">),</span> <span class="n">tol</span><span class="o">=</span><span class="n">tolerance</span><span class="p">)</span>
</span><span id="least_squares-341"><a href="#least_squares-341"><span class="linenos">341</span></a>            <span class="n">output</span><span class="o">.</span><span class="n">iterations</span> <span class="o">=</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">nit</span>
</span><span id="least_squares-342"><a href="#least_squares-342"><span class="linenos">342</span></a>
</span><span id="least_squares-343"><a href="#least_squares-343"><span class="linenos">343</span></a>        <span class="n">chisquare</span> <span class="o">=</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">fun</span>
</span><span id="least_squares-344"><a href="#least_squares-344"><span class="linenos">344</span></a>
</span><span id="least_squares-345"><a href="#least_squares-345"><span class="linenos">345</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="least_squares-346"><a href="#least_squares-346"><span class="linenos">346</span></a>        <span class="k">if</span> <span class="s1">&#39;tol&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
</span><span id="least_squares-347"><a href="#least_squares-347"><span class="linenos">347</span></a>            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;tol cannot be set for Levenberg-Marquardt&#39;</span><span class="p">)</span>
</span><span id="least_squares-348"><a href="#least_squares-348"><span class="linenos">348</span></a>
</span><span id="least_squares-349"><a href="#least_squares-349"><span class="linenos">349</span></a>        <span class="k">def</span> <span class="nf">chisqfunc_residuals_uncorr</span><span class="p">(</span><span class="n">p</span><span class="p">):</span>
</span><span id="least_squares-350"><a href="#least_squares-350"><span class="linenos">350</span></a>            <span class="k">return</span> <span class="n">general_chisqfunc_uncorr</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">y_f</span><span class="p">,</span> <span class="n">p_f</span><span class="p">)</span>
</span><span id="least_squares-351"><a href="#least_squares-351"><span class="linenos">351</span></a>
</span><span id="least_squares-352"><a href="#least_squares-352"><span class="linenos">352</span></a>        <span class="n">fit_result</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">optimize</span><span class="o">.</span><span class="n">least_squares</span><span class="p">(</span><span class="n">chisqfunc_residuals_uncorr</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">&#39;lm&#39;</span><span class="p">,</span> <span class="n">ftol</span><span class="o">=</span><span class="mf">1e-15</span><span class="p">,</span> <span class="n">gtol</span><span class="o">=</span><span class="mf">1e-15</span><span class="p">,</span> <span class="n">xtol</span><span class="o">=</span><span class="mf">1e-15</span><span class="p">)</span>
</span><span id="least_squares-353"><a href="#least_squares-353"><span class="linenos">353</span></a>        <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;correlated_fit&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="least_squares-354"><a href="#least_squares-354"><span class="linenos">354</span></a>
</span><span id="least_squares-355"><a href="#least_squares-355"><span class="linenos">355</span></a>            <span class="k">def</span> <span class="nf">chisqfunc_residuals</span><span class="p">(</span><span class="n">p</span><span class="p">):</span>
</span><span id="least_squares-356"><a href="#least_squares-356"><span class="linenos">356</span></a>                <span class="k">return</span> <span class="n">general_chisqfunc</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">y_f</span><span class="p">,</span> <span class="n">p_f</span><span class="p">)</span>
</span><span id="least_squares-357"><a href="#least_squares-357"><span class="linenos">357</span></a>
</span><span id="least_squares-358"><a href="#least_squares-358"><span class="linenos">358</span></a>            <span class="n">fit_result</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">optimize</span><span class="o">.</span><span class="n">least_squares</span><span class="p">(</span><span class="n">chisqfunc_residuals</span><span class="p">,</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="s1">&#39;lm&#39;</span><span class="p">,</span> <span class="n">ftol</span><span class="o">=</span><span class="mf">1e-15</span><span class="p">,</span> <span class="n">gtol</span><span class="o">=</span><span class="mf">1e-15</span><span class="p">,</span> <span class="n">xtol</span><span class="o">=</span><span class="mf">1e-15</span><span class="p">)</span>
</span><span id="least_squares-359"><a href="#least_squares-359"><span class="linenos">359</span></a>
</span><span id="least_squares-360"><a href="#least_squares-360"><span class="linenos">360</span></a>        <span class="n">chisquare</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">fit_result</span><span class="o">.</span><span class="n">fun</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="least_squares-361"><a href="#least_squares-361"><span class="linenos">361</span></a>        <span class="k">assert</span> <span class="n">np</span><span class="o">.</span><span class="n">isclose</span><span class="p">(</span><span class="n">chisquare</span><span class="p">,</span> <span class="n">chisqfunc</span><span class="p">(</span><span class="n">fit_result</span><span class="o">.</span><span class="n">x</span><span class="p">),</span> <span class="n">atol</span><span class="o">=</span><span class="mf">1e-14</span><span class="p">)</span>
</span><span id="least_squares-362"><a href="#least_squares-362"><span class="linenos">362</span></a>
</span><span id="least_squares-363"><a href="#least_squares-363"><span class="linenos">363</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">iterations</span> <span class="o">=</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">nfev</span>
</span><span id="least_squares-364"><a href="#least_squares-364"><span class="linenos">364</span></a>
</span><span id="least_squares-365"><a href="#least_squares-365"><span class="linenos">365</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">success</span><span class="p">:</span>
</span><span id="least_squares-366"><a href="#least_squares-366"><span class="linenos">366</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;The minimization procedure did not converge.&#39;</span><span class="p">)</span>
</span><span id="least_squares-367"><a href="#least_squares-367"><span class="linenos">367</span></a>
</span><span id="least_squares-368"><a href="#least_squares-368"><span class="linenos">368</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">chisquare</span> <span class="o">=</span> <span class="n">chisquare</span>
</span><span id="least_squares-369"><a href="#least_squares-369"><span class="linenos">369</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">dof</span> <span class="o">=</span> <span class="n">y_all</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">n_parms</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">loc_priors</span><span class="p">)</span>
</span><span id="least_squares-370"><a href="#least_squares-370"><span class="linenos">370</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">p_value</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">scipy</span><span class="o">.</span><span class="n">stats</span><span class="o">.</span><span class="n">chi2</span><span class="o">.</span><span class="n">cdf</span><span class="p">(</span><span class="n">output</span><span class="o">.</span><span class="n">chisquare</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">dof</span><span class="p">)</span>
</span><span id="least_squares-371"><a href="#least_squares-371"><span class="linenos">371</span></a>    <span class="k">if</span> <span class="n">output</span><span class="o">.</span><span class="n">dof</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
</span><span id="least_squares-372"><a href="#least_squares-372"><span class="linenos">372</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_dof</span> <span class="o">=</span> <span class="n">output</span><span class="o">.</span><span class="n">chisquare</span> <span class="o">/</span> <span class="n">output</span><span class="o">.</span><span class="n">dof</span>
</span><span id="least_squares-373"><a href="#least_squares-373"><span class="linenos">373</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="least_squares-374"><a href="#least_squares-374"><span class="linenos">374</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_dof</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="s1">&#39;nan&#39;</span><span class="p">)</span>
</span><span id="least_squares-375"><a href="#least_squares-375"><span class="linenos">375</span></a>
</span><span id="least_squares-376"><a href="#least_squares-376"><span class="linenos">376</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">message</span>
</span><span id="least_squares-377"><a href="#least_squares-377"><span class="linenos">377</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="least_squares-378"><a href="#least_squares-378"><span class="linenos">378</span></a>        <span class="nb">print</span><span class="p">(</span><span class="n">fit_result</span><span class="o">.</span><span class="n">message</span><span class="p">)</span>
</span><span id="least_squares-379"><a href="#least_squares-379"><span class="linenos">379</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;chisquare/d.o.f.:&#39;</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_dof</span><span class="p">)</span>
</span><span id="least_squares-380"><a href="#least_squares-380"><span class="linenos">380</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;fit parameters&#39;</span><span class="p">,</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">x</span><span class="p">)</span>
</span><span id="least_squares-381"><a href="#least_squares-381"><span class="linenos">381</span></a>
</span><span id="least_squares-382"><a href="#least_squares-382"><span class="linenos">382</span></a>    <span class="k">def</span> <span class="nf">prepare_hat_matrix</span><span class="p">():</span>
</span><span id="least_squares-383"><a href="#least_squares-383"><span class="linenos">383</span></a>        <span class="n">hat_vector</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="least_squares-384"><a href="#least_squares-384"><span class="linenos">384</span></a>        <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="least_squares-385"><a href="#least_squares-385"><span class="linenos">385</span></a>            <span class="k">if</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">])</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">):</span>
</span><span id="least_squares-386"><a href="#least_squares-386"><span class="linenos">386</span></a>                <span class="n">hat_vector</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">jacobian</span><span class="p">(</span><span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">])(</span><span class="n">fit_result</span><span class="o">.</span><span class="n">x</span><span class="p">,</span> <span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">]))</span>
</span><span id="least_squares-387"><a href="#least_squares-387"><span class="linenos">387</span></a>        <span class="n">hat_vector</span> <span class="o">=</span> <span class="p">[</span><span class="n">item</span> <span class="k">for</span> <span class="n">sublist</span> <span class="ow">in</span> <span class="n">hat_vector</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">sublist</span><span class="p">]</span>
</span><span id="least_squares-388"><a href="#least_squares-388"><span class="linenos">388</span></a>        <span class="k">return</span> <span class="n">hat_vector</span>
</span><span id="least_squares-389"><a href="#least_squares-389"><span class="linenos">389</span></a>
</span><span id="least_squares-390"><a href="#least_squares-390"><span class="linenos">390</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;expected_chisquare&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="least_squares-391"><a href="#least_squares-391"><span class="linenos">391</span></a>        <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;correlated_fit&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="least_squares-392"><a href="#least_squares-392"><span class="linenos">392</span></a>            <span class="n">W</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">diag</span><span class="p">(</span><span class="mi">1</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">dy_f</span><span class="p">))</span>
</span><span id="least_squares-393"><a href="#least_squares-393"><span class="linenos">393</span></a>            <span class="n">cov</span> <span class="o">=</span> <span class="n">covariance</span><span class="p">(</span><span class="n">y_all</span><span class="p">)</span>
</span><span id="least_squares-394"><a href="#least_squares-394"><span class="linenos">394</span></a>            <span class="n">hat_vector</span> <span class="o">=</span> <span class="n">prepare_hat_matrix</span><span class="p">()</span>
</span><span id="least_squares-395"><a href="#least_squares-395"><span class="linenos">395</span></a>            <span class="n">A</span> <span class="o">=</span> <span class="n">W</span> <span class="o">@</span> <span class="n">hat_vector</span>
</span><span id="least_squares-396"><a href="#least_squares-396"><span class="linenos">396</span></a>            <span class="n">P_phi</span> <span class="o">=</span> <span class="n">A</span> <span class="o">@</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">pinv</span><span class="p">(</span><span class="n">A</span><span class="o">.</span><span class="n">T</span> <span class="o">@</span> <span class="n">A</span><span class="p">)</span> <span class="o">@</span> <span class="n">A</span><span class="o">.</span><span class="n">T</span>
</span><span id="least_squares-397"><a href="#least_squares-397"><span class="linenos">397</span></a>            <span class="n">expected_chisquare</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">trace</span><span class="p">((</span><span class="n">np</span><span class="o">.</span><span class="n">identity</span><span class="p">(</span><span class="n">y_all</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">-</span> <span class="n">P_phi</span><span class="p">)</span> <span class="o">@</span> <span class="n">W</span> <span class="o">@</span> <span class="n">cov</span> <span class="o">@</span> <span class="n">W</span><span class="p">)</span>
</span><span id="least_squares-398"><a href="#least_squares-398"><span class="linenos">398</span></a>            <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_expected_chisquare</span> <span class="o">=</span> <span class="n">output</span><span class="o">.</span><span class="n">chisquare</span> <span class="o">/</span> <span class="n">expected_chisquare</span>
</span><span id="least_squares-399"><a href="#least_squares-399"><span class="linenos">399</span></a>            <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="least_squares-400"><a href="#least_squares-400"><span class="linenos">400</span></a>                <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;chisquare/expected_chisquare:&#39;</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_expected_chisquare</span><span class="p">)</span>
</span><span id="least_squares-401"><a href="#least_squares-401"><span class="linenos">401</span></a>
</span><span id="least_squares-402"><a href="#least_squares-402"><span class="linenos">402</span></a>    <span class="n">fitp</span> <span class="o">=</span> <span class="n">fit_result</span><span class="o">.</span><span class="n">x</span>
</span><span id="least_squares-403"><a href="#least_squares-403"><span class="linenos">403</span></a>
</span><span id="least_squares-404"><a href="#least_squares-404"><span class="linenos">404</span></a>    <span class="k">try</span><span class="p">:</span>
</span><span id="least_squares-405"><a href="#least_squares-405"><span class="linenos">405</span></a>        <span class="n">hess</span> <span class="o">=</span> <span class="n">hessian</span><span class="p">(</span><span class="n">chisqfunc</span><span class="p">)(</span><span class="n">fitp</span><span class="p">)</span>
</span><span id="least_squares-406"><a href="#least_squares-406"><span class="linenos">406</span></a>    <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
</span><span id="least_squares-407"><a href="#least_squares-407"><span class="linenos">407</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;It is required to use autograd.numpy instead of numpy within fit functions, see the documentation for details.&quot;</span><span class="p">)</span> <span class="kn">from</span> <span class="kc">None</span>
</span><span id="least_squares-408"><a href="#least_squares-408"><span class="linenos">408</span></a>
</span><span id="least_squares-409"><a href="#least_squares-409"><span class="linenos">409</span></a>    <span class="n">len_y</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">y_f</span><span class="p">)</span>
</span><span id="least_squares-410"><a href="#least_squares-410"><span class="linenos">410</span></a>
</span><span id="least_squares-411"><a href="#least_squares-411"><span class="linenos">411</span></a>    <span class="k">def</span> <span class="nf">chisqfunc_compact</span><span class="p">(</span><span class="n">d</span><span class="p">):</span>
</span><span id="least_squares-412"><a href="#least_squares-412"><span class="linenos">412</span></a>        <span class="k">return</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">general_chisqfunc</span><span class="p">(</span><span class="n">d</span><span class="p">[:</span><span class="n">n_parms</span><span class="p">],</span> <span class="n">d</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:</span> <span class="n">n_parms</span> <span class="o">+</span> <span class="n">len_y</span><span class="p">],</span> <span class="n">d</span><span class="p">[</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">len_y</span><span class="p">:])</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="least_squares-413"><a href="#least_squares-413"><span class="linenos">413</span></a>
</span><span id="least_squares-414"><a href="#least_squares-414"><span class="linenos">414</span></a>    <span class="n">jac_jac_y</span> <span class="o">=</span> <span class="n">hessian</span><span class="p">(</span><span class="n">chisqfunc_compact</span><span class="p">)(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">fitp</span><span class="p">,</span> <span class="n">y_f</span><span class="p">,</span> <span class="n">p_f</span><span class="p">)))</span>
</span><span id="least_squares-415"><a href="#least_squares-415"><span class="linenos">415</span></a>
</span><span id="least_squares-416"><a href="#least_squares-416"><span class="linenos">416</span></a>    <span class="c1"># Compute hess^{-1} @ jac_jac_y[:n_parms + m, n_parms + m:] using LAPACK dgesv</span>
</span><span id="least_squares-417"><a href="#least_squares-417"><span class="linenos">417</span></a>    <span class="k">try</span><span class="p">:</span>
</span><span id="least_squares-418"><a href="#least_squares-418"><span class="linenos">418</span></a>        <span class="n">deriv_y</span> <span class="o">=</span> <span class="o">-</span><span class="n">scipy</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">solve</span><span class="p">(</span><span class="n">hess</span><span class="p">,</span> <span class="n">jac_jac_y</span><span class="p">[:</span><span class="n">n_parms</span><span class="p">,</span> <span class="n">n_parms</span><span class="p">:])</span>
</span><span id="least_squares-419"><a href="#least_squares-419"><span class="linenos">419</span></a>    <span class="k">except</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">LinAlgError</span><span class="p">:</span>
</span><span id="least_squares-420"><a href="#least_squares-420"><span class="linenos">420</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Cannot invert hessian matrix.&quot;</span><span class="p">)</span>
</span><span id="least_squares-421"><a href="#least_squares-421"><span class="linenos">421</span></a>
</span><span id="least_squares-422"><a href="#least_squares-422"><span class="linenos">422</span></a>    <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="least_squares-423"><a href="#least_squares-423"><span class="linenos">423</span></a>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n_parms</span><span class="p">):</span>
</span><span id="least_squares-424"><a href="#least_squares-424"><span class="linenos">424</span></a>        <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">derived_observable</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x_all</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="p">(</span><span class="n">x_all</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">y_all</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">)</span> <span class="o">*</span> <span class="n">fitp</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="nb">list</span><span class="p">(</span><span class="n">y_all</span><span class="p">)</span> <span class="o">+</span> <span class="n">loc_priors</span><span class="p">,</span> <span class="n">man_grad</span><span class="o">=</span><span class="nb">list</span><span class="p">(</span><span class="n">deriv_y</span><span class="p">[</span><span class="n">i</span><span class="p">])))</span>
</span><span id="least_squares-425"><a href="#least_squares-425"><span class="linenos">425</span></a>
</span><span id="least_squares-426"><a href="#least_squares-426"><span class="linenos">426</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">fit_parameters</span> <span class="o">=</span> <span class="n">result</span>
</span><span id="least_squares-427"><a href="#least_squares-427"><span class="linenos">427</span></a>
</span><span id="least_squares-428"><a href="#least_squares-428"><span class="linenos">428</span></a>    <span class="c1"># Hotelling t-squared p-value for correlated fits.</span>
</span><span id="least_squares-429"><a href="#least_squares-429"><span class="linenos">429</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;correlated_fit&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="least_squares-430"><a href="#least_squares-430"><span class="linenos">430</span></a>        <span class="n">n_cov</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">vectorize</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x_all</span><span class="p">:</span> <span class="n">x_all</span><span class="o">.</span><span class="n">N</span><span class="p">)(</span><span class="n">y_all</span><span class="p">))</span>
</span><span id="least_squares-431"><a href="#least_squares-431"><span class="linenos">431</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">t2_p_value</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">scipy</span><span class="o">.</span><span class="n">stats</span><span class="o">.</span><span class="n">f</span><span class="o">.</span><span class="n">cdf</span><span class="p">((</span><span class="n">n_cov</span> <span class="o">-</span> <span class="n">output</span><span class="o">.</span><span class="n">dof</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">output</span><span class="o">.</span><span class="n">dof</span> <span class="o">*</span> <span class="p">(</span><span class="n">n_cov</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span> <span class="o">*</span> <span class="n">output</span><span class="o">.</span><span class="n">chisquare</span><span class="p">,</span>
</span><span id="least_squares-432"><a href="#least_squares-432"><span class="linenos">432</span></a>                                                  <span class="n">output</span><span class="o">.</span><span class="n">dof</span><span class="p">,</span> <span class="n">n_cov</span> <span class="o">-</span> <span class="n">output</span><span class="o">.</span><span class="n">dof</span><span class="p">)</span>
</span><span id="least_squares-433"><a href="#least_squares-433"><span class="linenos">433</span></a>
</span><span id="least_squares-434"><a href="#least_squares-434"><span class="linenos">434</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;resplot&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="least_squares-435"><a href="#least_squares-435"><span class="linenos">435</span></a>        <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="least_squares-436"><a href="#least_squares-436"><span class="linenos">436</span></a>            <span class="n">residual_plot</span><span class="p">(</span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">yd</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">result</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
</span><span id="least_squares-437"><a href="#least_squares-437"><span class="linenos">437</span></a>
</span><span id="least_squares-438"><a href="#least_squares-438"><span class="linenos">438</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;qqplot&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="least_squares-439"><a href="#least_squares-439"><span class="linenos">439</span></a>        <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">key_ls</span><span class="p">:</span>
</span><span id="least_squares-440"><a href="#least_squares-440"><span class="linenos">440</span></a>            <span class="n">qqplot</span><span class="p">(</span><span class="n">xd</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">yd</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">funcd</span><span class="p">[</span><span class="n">key</span><span class="p">],</span> <span class="n">result</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="n">key</span><span class="p">)</span>
</span><span id="least_squares-441"><a href="#least_squares-441"><span class="linenos">441</span></a>
</span><span id="least_squares-442"><a href="#least_squares-442"><span class="linenos">442</span></a>    <span class="k">return</span> <span class="n">output</span>
</span></pre></div>


            <div class="docstring"><p>Performs a non-linear fit to y = func(x).
    ```</p>

<h6 id="parameters">Parameters</h6>

<ul>
<li><strong>For an uncombined fit:</strong></li>
<li><strong>x</strong> (list):
list of floats.</li>
<li><strong>y</strong> (list):
list of Obs.</li>
<li><p><strong>func</strong> (object):
fit function, has to be of the form</p>

<div class="pdoc-code codehilite">
<pre><span></span><code><span class="kn">import</span> <span class="nn">autograd.numpy</span> <span class="k">as</span> <span class="nn">anp</span>

<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span> <span class="o">+</span> <span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">*</span> <span class="n">anp</span><span class="o">.</span><span class="n">sinh</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</code></pre>
</div>

<p>For multiple x values func can be of the form</p>

<div class="pdoc-code codehilite">
<pre><span></span><code><span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
    <span class="p">(</span><span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">)</span> <span class="o">=</span> <span class="n">x</span>
    <span class="k">return</span> <span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">x1</span> <span class="o">**</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">x2</span>
</code></pre>
</div>

<p>It is important that all numpy functions refer to autograd.numpy, otherwise the differentiation
will not work.</p></li>
<li><strong>OR For a combined fit:</strong></li>
<li><strong>x</strong> (dict):
dict of lists.</li>
<li><strong>y</strong> (dict):
dict of lists of Obs.</li>
<li><p><strong>funcs</strong> (dict):
dict of objects
fit functions have to be of the form (here a[0] is the common fit parameter)
```python
import autograd.numpy as anp
funcs = {"a": func_a,
        "b": func_b}</p>

<p>def func_a(a, x):
    return a[1] * anp.exp(-a[0] * x)</p>

<p>def func_b(a, x):
    return a[2] * anp.exp(-a[0] * x)</p>

<p>It is important that all numpy functions refer to autograd.numpy, otherwise the differentiation
will not work.</p></li>
<li><strong>priors</strong> (dict or list, optional):
priors can either be a dictionary with integer keys and the corresponding priors as values or
a list with an entry for every parameter in the fit. The entries can either be
Obs (e.g. results from a previous fit) or strings containing a value and an error formatted like
0.548(23), 500(40) or 0.5(0.4)</li>
<li><strong>silent</strong> (bool, optional):
If true all output to the console is omitted (default False).</li>
<li><strong>initial_guess</strong> (list):
can provide an initial guess for the input parameters. Relevant for
non-linear fits with many parameters. In case of correlated fits the guess is used to perform
an uncorrelated fit which then serves as guess for the correlated fit.</li>
<li><strong>method</strong> (str, optional):
can be used to choose an alternative method for the minimization of chisquare.
The possible methods are the ones which can be used for scipy.optimize.minimize and
migrad of iminuit. If no method is specified, Levenberg-Marquard is used.
Reliable alternatives are migrad, Powell and Nelder-Mead.</li>
<li><strong>tol</strong> (float, optional):
can be used (only for combined fits and methods other than Levenberg-Marquard) to set the tolerance for convergence
to a different value to either speed up convergence at the cost of a larger error on the fitted parameters (and possibly
invalid estimates for parameter uncertainties) or smaller values to get more accurate parameter values
The stopping criterion depends on the method, e.g. migrad: edm_max = 0.002 * tol * errordef (EDM criterion: edm &lt; edm_max)</li>
<li><strong>correlated_fit</strong> (bool):
If True, use the full inverse covariance matrix in the definition of the chisquare cost function.
For details about how the covariance matrix is estimated see <code><a href="obs.html#covariance">pyerrors.obs.covariance</a></code>.
In practice the correlation matrix is Cholesky decomposed and inverted (instead of the covariance matrix).
This procedure should be numerically more stable as the correlation matrix is typically better conditioned (Jacobi preconditioning).</li>
<li><strong>expected_chisquare</strong> (bool):
If True estimates the expected chisquare which is
corrected by effects caused by correlated input data (default False).</li>
<li><strong>resplot</strong> (bool):
If True, a plot which displays fit, data and residuals is generated (default False).</li>
<li><strong>qqplot</strong> (bool):
If True, a quantile-quantile plot of the fit result is generated (default False).</li>
<li><strong>num_grad</strong> (bool):
Use numerical differentation instead of automatic differentiation to perform the error propagation (default False).</li>
</ul>

<h6 id="returns">Returns</h6>

<ul>
<li><strong>output</strong> (Fit_result):
Parameters and information on the fitted result.</li>
</ul>
</div>


                </section>
                <section id="total_least_squares">
                            <input id="total_least_squares-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
            
        <span class="def">def</span>
        <span class="name">total_least_squares</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">x</span>, </span><span class="param"><span class="n">y</span>, </span><span class="param"><span class="n">func</span>, </span><span class="param"><span class="n">silent</span><span class="o">=</span><span class="kc">False</span>, </span><span class="param"><span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">):</span></span>

                <label class="view-source-button" for="total_least_squares-view-source"><span>View Source</span></label>

    </div>
    <a class="headerlink" href="#total_least_squares"></a>
            <div class="pdoc-code codehilite"><pre><span></span><span id="total_least_squares-445"><a href="#total_least_squares-445"><span class="linenos">445</span></a><span class="k">def</span> <span class="nf">total_least_squares</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="total_least_squares-446"><a href="#total_least_squares-446"><span class="linenos">446</span></a><span class="w">    </span><span class="sa">r</span><span class="sd">&#39;&#39;&#39;Performs a non-linear fit to y = func(x) and returns a list of Obs corresponding to the fit parameters.</span>
</span><span id="total_least_squares-447"><a href="#total_least_squares-447"><span class="linenos">447</span></a>
</span><span id="total_least_squares-448"><a href="#total_least_squares-448"><span class="linenos">448</span></a><span class="sd">    Parameters</span>
</span><span id="total_least_squares-449"><a href="#total_least_squares-449"><span class="linenos">449</span></a><span class="sd">    ----------</span>
</span><span id="total_least_squares-450"><a href="#total_least_squares-450"><span class="linenos">450</span></a><span class="sd">    x : list</span>
</span><span id="total_least_squares-451"><a href="#total_least_squares-451"><span class="linenos">451</span></a><span class="sd">        list of Obs, or a tuple of lists of Obs</span>
</span><span id="total_least_squares-452"><a href="#total_least_squares-452"><span class="linenos">452</span></a><span class="sd">    y : list</span>
</span><span id="total_least_squares-453"><a href="#total_least_squares-453"><span class="linenos">453</span></a><span class="sd">        list of Obs. The dvalues of the Obs are used as x- and yerror for the fit.</span>
</span><span id="total_least_squares-454"><a href="#total_least_squares-454"><span class="linenos">454</span></a><span class="sd">    func : object</span>
</span><span id="total_least_squares-455"><a href="#total_least_squares-455"><span class="linenos">455</span></a><span class="sd">        func has to be of the form</span>
</span><span id="total_least_squares-456"><a href="#total_least_squares-456"><span class="linenos">456</span></a>
</span><span id="total_least_squares-457"><a href="#total_least_squares-457"><span class="linenos">457</span></a><span class="sd">        ```python</span>
</span><span id="total_least_squares-458"><a href="#total_least_squares-458"><span class="linenos">458</span></a><span class="sd">        import autograd.numpy as anp</span>
</span><span id="total_least_squares-459"><a href="#total_least_squares-459"><span class="linenos">459</span></a>
</span><span id="total_least_squares-460"><a href="#total_least_squares-460"><span class="linenos">460</span></a><span class="sd">        def func(a, x):</span>
</span><span id="total_least_squares-461"><a href="#total_least_squares-461"><span class="linenos">461</span></a><span class="sd">            return a[0] + a[1] * x + a[2] * anp.sinh(x)</span>
</span><span id="total_least_squares-462"><a href="#total_least_squares-462"><span class="linenos">462</span></a><span class="sd">        ```</span>
</span><span id="total_least_squares-463"><a href="#total_least_squares-463"><span class="linenos">463</span></a>
</span><span id="total_least_squares-464"><a href="#total_least_squares-464"><span class="linenos">464</span></a><span class="sd">        For multiple x values func can be of the form</span>
</span><span id="total_least_squares-465"><a href="#total_least_squares-465"><span class="linenos">465</span></a>
</span><span id="total_least_squares-466"><a href="#total_least_squares-466"><span class="linenos">466</span></a><span class="sd">        ```python</span>
</span><span id="total_least_squares-467"><a href="#total_least_squares-467"><span class="linenos">467</span></a><span class="sd">        def func(a, x):</span>
</span><span id="total_least_squares-468"><a href="#total_least_squares-468"><span class="linenos">468</span></a><span class="sd">            (x1, x2) = x</span>
</span><span id="total_least_squares-469"><a href="#total_least_squares-469"><span class="linenos">469</span></a><span class="sd">            return a[0] * x1 ** 2 + a[1] * x2</span>
</span><span id="total_least_squares-470"><a href="#total_least_squares-470"><span class="linenos">470</span></a><span class="sd">        ```</span>
</span><span id="total_least_squares-471"><a href="#total_least_squares-471"><span class="linenos">471</span></a>
</span><span id="total_least_squares-472"><a href="#total_least_squares-472"><span class="linenos">472</span></a><span class="sd">        It is important that all numpy functions refer to autograd.numpy, otherwise the differentiation</span>
</span><span id="total_least_squares-473"><a href="#total_least_squares-473"><span class="linenos">473</span></a><span class="sd">        will not work.</span>
</span><span id="total_least_squares-474"><a href="#total_least_squares-474"><span class="linenos">474</span></a><span class="sd">    silent : bool, optional</span>
</span><span id="total_least_squares-475"><a href="#total_least_squares-475"><span class="linenos">475</span></a><span class="sd">        If true all output to the console is omitted (default False).</span>
</span><span id="total_least_squares-476"><a href="#total_least_squares-476"><span class="linenos">476</span></a><span class="sd">    initial_guess : list</span>
</span><span id="total_least_squares-477"><a href="#total_least_squares-477"><span class="linenos">477</span></a><span class="sd">        can provide an initial guess for the input parameters. Relevant for non-linear</span>
</span><span id="total_least_squares-478"><a href="#total_least_squares-478"><span class="linenos">478</span></a><span class="sd">        fits with many parameters.</span>
</span><span id="total_least_squares-479"><a href="#total_least_squares-479"><span class="linenos">479</span></a><span class="sd">    expected_chisquare : bool</span>
</span><span id="total_least_squares-480"><a href="#total_least_squares-480"><span class="linenos">480</span></a><span class="sd">        If true prints the expected chisquare which is</span>
</span><span id="total_least_squares-481"><a href="#total_least_squares-481"><span class="linenos">481</span></a><span class="sd">        corrected by effects caused by correlated input data.</span>
</span><span id="total_least_squares-482"><a href="#total_least_squares-482"><span class="linenos">482</span></a><span class="sd">        This can take a while as the full correlation matrix</span>
</span><span id="total_least_squares-483"><a href="#total_least_squares-483"><span class="linenos">483</span></a><span class="sd">        has to be calculated (default False).</span>
</span><span id="total_least_squares-484"><a href="#total_least_squares-484"><span class="linenos">484</span></a><span class="sd">    num_grad : bool</span>
</span><span id="total_least_squares-485"><a href="#total_least_squares-485"><span class="linenos">485</span></a><span class="sd">        Use numerical differentation instead of automatic differentiation to perform the error propagation (default False).</span>
</span><span id="total_least_squares-486"><a href="#total_least_squares-486"><span class="linenos">486</span></a>
</span><span id="total_least_squares-487"><a href="#total_least_squares-487"><span class="linenos">487</span></a><span class="sd">    Notes</span>
</span><span id="total_least_squares-488"><a href="#total_least_squares-488"><span class="linenos">488</span></a><span class="sd">    -----</span>
</span><span id="total_least_squares-489"><a href="#total_least_squares-489"><span class="linenos">489</span></a><span class="sd">    Based on the orthogonal distance regression module of scipy.</span>
</span><span id="total_least_squares-490"><a href="#total_least_squares-490"><span class="linenos">490</span></a>
</span><span id="total_least_squares-491"><a href="#total_least_squares-491"><span class="linenos">491</span></a><span class="sd">    Returns</span>
</span><span id="total_least_squares-492"><a href="#total_least_squares-492"><span class="linenos">492</span></a><span class="sd">    -------</span>
</span><span id="total_least_squares-493"><a href="#total_least_squares-493"><span class="linenos">493</span></a><span class="sd">    output : Fit_result</span>
</span><span id="total_least_squares-494"><a href="#total_least_squares-494"><span class="linenos">494</span></a><span class="sd">        Parameters and information on the fitted result.</span>
</span><span id="total_least_squares-495"><a href="#total_least_squares-495"><span class="linenos">495</span></a><span class="sd">    &#39;&#39;&#39;</span>
</span><span id="total_least_squares-496"><a href="#total_least_squares-496"><span class="linenos">496</span></a>
</span><span id="total_least_squares-497"><a href="#total_least_squares-497"><span class="linenos">497</span></a>    <span class="n">output</span> <span class="o">=</span> <span class="n">Fit_result</span><span class="p">()</span>
</span><span id="total_least_squares-498"><a href="#total_least_squares-498"><span class="linenos">498</span></a>
</span><span id="total_least_squares-499"><a href="#total_least_squares-499"><span class="linenos">499</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">fit_function</span> <span class="o">=</span> <span class="n">func</span>
</span><span id="total_least_squares-500"><a href="#total_least_squares-500"><span class="linenos">500</span></a>
</span><span id="total_least_squares-501"><a href="#total_least_squares-501"><span class="linenos">501</span></a>    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span><span id="total_least_squares-502"><a href="#total_least_squares-502"><span class="linenos">502</span></a>
</span><span id="total_least_squares-503"><a href="#total_least_squares-503"><span class="linenos">503</span></a>    <span class="n">x_shape</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">shape</span>
</span><span id="total_least_squares-504"><a href="#total_least_squares-504"><span class="linenos">504</span></a>
</span><span id="total_least_squares-505"><a href="#total_least_squares-505"><span class="linenos">505</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;num_grad&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="total_least_squares-506"><a href="#total_least_squares-506"><span class="linenos">506</span></a>        <span class="n">jacobian</span> <span class="o">=</span> <span class="n">num_jacobian</span>
</span><span id="total_least_squares-507"><a href="#total_least_squares-507"><span class="linenos">507</span></a>        <span class="n">hessian</span> <span class="o">=</span> <span class="n">num_hessian</span>
</span><span id="total_least_squares-508"><a href="#total_least_squares-508"><span class="linenos">508</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="total_least_squares-509"><a href="#total_least_squares-509"><span class="linenos">509</span></a>        <span class="n">jacobian</span> <span class="o">=</span> <span class="n">auto_jacobian</span>
</span><span id="total_least_squares-510"><a href="#total_least_squares-510"><span class="linenos">510</span></a>        <span class="n">hessian</span> <span class="o">=</span> <span class="n">auto_hessian</span>
</span><span id="total_least_squares-511"><a href="#total_least_squares-511"><span class="linenos">511</span></a>
</span><span id="total_least_squares-512"><a href="#total_least_squares-512"><span class="linenos">512</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
</span><span id="total_least_squares-513"><a href="#total_least_squares-513"><span class="linenos">513</span></a>        <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;func has to be a function.&#39;</span><span class="p">)</span>
</span><span id="total_least_squares-514"><a href="#total_least_squares-514"><span class="linenos">514</span></a>
</span><span id="total_least_squares-515"><a href="#total_least_squares-515"><span class="linenos">515</span></a>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">42</span><span class="p">):</span>
</span><span id="total_least_squares-516"><a href="#total_least_squares-516"><span class="linenos">516</span></a>        <span class="k">try</span><span class="p">:</span>
</span><span id="total_least_squares-517"><a href="#total_least_squares-517"><span class="linenos">517</span></a>            <span class="n">func</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">i</span><span class="p">),</span> <span class="n">x</span><span class="o">.</span><span class="n">T</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="total_least_squares-518"><a href="#total_least_squares-518"><span class="linenos">518</span></a>        <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
</span><span id="total_least_squares-519"><a href="#total_least_squares-519"><span class="linenos">519</span></a>            <span class="k">continue</span>
</span><span id="total_least_squares-520"><a href="#total_least_squares-520"><span class="linenos">520</span></a>        <span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
</span><span id="total_least_squares-521"><a href="#total_least_squares-521"><span class="linenos">521</span></a>            <span class="k">continue</span>
</span><span id="total_least_squares-522"><a href="#total_least_squares-522"><span class="linenos">522</span></a>        <span class="k">else</span><span class="p">:</span>
</span><span id="total_least_squares-523"><a href="#total_least_squares-523"><span class="linenos">523</span></a>            <span class="k">break</span>
</span><span id="total_least_squares-524"><a href="#total_least_squares-524"><span class="linenos">524</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="total_least_squares-525"><a href="#total_least_squares-525"><span class="linenos">525</span></a>        <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">&quot;Fit function is not valid.&quot;</span><span class="p">)</span>
</span><span id="total_least_squares-526"><a href="#total_least_squares-526"><span class="linenos">526</span></a>
</span><span id="total_least_squares-527"><a href="#total_least_squares-527"><span class="linenos">527</span></a>    <span class="n">n_parms</span> <span class="o">=</span> <span class="n">i</span>
</span><span id="total_least_squares-528"><a href="#total_least_squares-528"><span class="linenos">528</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="total_least_squares-529"><a href="#total_least_squares-529"><span class="linenos">529</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Fit with&#39;</span><span class="p">,</span> <span class="n">n_parms</span><span class="p">,</span> <span class="s1">&#39;parameter&#39;</span> <span class="o">+</span> <span class="s1">&#39;s&#39;</span> <span class="o">*</span> <span class="p">(</span><span class="n">n_parms</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">))</span>
</span><span id="total_least_squares-530"><a href="#total_least_squares-530"><span class="linenos">530</span></a>
</span><span id="total_least_squares-531"><a href="#total_least_squares-531"><span class="linenos">531</span></a>    <span class="n">x_f</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vectorize</span><span class="p">(</span><span class="k">lambda</span> <span class="n">o</span><span class="p">:</span> <span class="n">o</span><span class="o">.</span><span class="n">value</span><span class="p">)(</span><span class="n">x</span><span class="p">)</span>
</span><span id="total_least_squares-532"><a href="#total_least_squares-532"><span class="linenos">532</span></a>    <span class="n">dx_f</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">vectorize</span><span class="p">(</span><span class="k">lambda</span> <span class="n">o</span><span class="p">:</span> <span class="n">o</span><span class="o">.</span><span class="n">dvalue</span><span class="p">)(</span><span class="n">x</span><span class="p">)</span>
</span><span id="total_least_squares-533"><a href="#total_least_squares-533"><span class="linenos">533</span></a>    <span class="n">y_f</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y</span><span class="p">])</span>
</span><span id="total_least_squares-534"><a href="#total_least_squares-534"><span class="linenos">534</span></a>    <span class="n">dy_f</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="n">o</span><span class="o">.</span><span class="n">dvalue</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y</span><span class="p">])</span>
</span><span id="total_least_squares-535"><a href="#total_least_squares-535"><span class="linenos">535</span></a>
</span><span id="total_least_squares-536"><a href="#total_least_squares-536"><span class="linenos">536</span></a>    <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">dx_f</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mf">0.0</span><span class="p">):</span>
</span><span id="total_least_squares-537"><a href="#total_least_squares-537"><span class="linenos">537</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;No x errors available, run the gamma method first.&#39;</span><span class="p">)</span>
</span><span id="total_least_squares-538"><a href="#total_least_squares-538"><span class="linenos">538</span></a>
</span><span id="total_least_squares-539"><a href="#total_least_squares-539"><span class="linenos">539</span></a>    <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">dy_f</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mf">0.0</span><span class="p">):</span>
</span><span id="total_least_squares-540"><a href="#total_least_squares-540"><span class="linenos">540</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;No y errors available, run the gamma method first.&#39;</span><span class="p">)</span>
</span><span id="total_least_squares-541"><a href="#total_least_squares-541"><span class="linenos">541</span></a>
</span><span id="total_least_squares-542"><a href="#total_least_squares-542"><span class="linenos">542</span></a>    <span class="k">if</span> <span class="s1">&#39;initial_guess&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
</span><span id="total_least_squares-543"><a href="#total_least_squares-543"><span class="linenos">543</span></a>        <span class="n">x0</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;initial_guess&#39;</span><span class="p">)</span>
</span><span id="total_least_squares-544"><a href="#total_least_squares-544"><span class="linenos">544</span></a>        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">)</span> <span class="o">!=</span> <span class="n">n_parms</span><span class="p">:</span>
</span><span id="total_least_squares-545"><a href="#total_least_squares-545"><span class="linenos">545</span></a>            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Initial guess does not have the correct length: </span><span class="si">%d</span><span class="s1"> vs. </span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">x0</span><span class="p">),</span> <span class="n">n_parms</span><span class="p">))</span>
</span><span id="total_least_squares-546"><a href="#total_least_squares-546"><span class="linenos">546</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="total_least_squares-547"><a href="#total_least_squares-547"><span class="linenos">547</span></a>        <span class="n">x0</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">n_parms</span>
</span><span id="total_least_squares-548"><a href="#total_least_squares-548"><span class="linenos">548</span></a>
</span><span id="total_least_squares-549"><a href="#total_least_squares-549"><span class="linenos">549</span></a>    <span class="n">data</span> <span class="o">=</span> <span class="n">RealData</span><span class="p">(</span><span class="n">x_f</span><span class="p">,</span> <span class="n">y_f</span><span class="p">,</span> <span class="n">sx</span><span class="o">=</span><span class="n">dx_f</span><span class="p">,</span> <span class="n">sy</span><span class="o">=</span><span class="n">dy_f</span><span class="p">)</span>
</span><span id="total_least_squares-550"><a href="#total_least_squares-550"><span class="linenos">550</span></a>    <span class="n">model</span> <span class="o">=</span> <span class="n">Model</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
</span><span id="total_least_squares-551"><a href="#total_least_squares-551"><span class="linenos">551</span></a>    <span class="n">odr</span> <span class="o">=</span> <span class="n">ODR</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">model</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">partol</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">)</span>
</span><span id="total_least_squares-552"><a href="#total_least_squares-552"><span class="linenos">552</span></a>    <span class="n">odr</span><span class="o">.</span><span class="n">set_job</span><span class="p">(</span><span class="n">fit_type</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">deriv</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="total_least_squares-553"><a href="#total_least_squares-553"><span class="linenos">553</span></a>    <span class="n">out</span> <span class="o">=</span> <span class="n">odr</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
</span><span id="total_least_squares-554"><a href="#total_least_squares-554"><span class="linenos">554</span></a>
</span><span id="total_least_squares-555"><a href="#total_least_squares-555"><span class="linenos">555</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">residual_variance</span> <span class="o">=</span> <span class="n">out</span><span class="o">.</span><span class="n">res_var</span>
</span><span id="total_least_squares-556"><a href="#total_least_squares-556"><span class="linenos">556</span></a>
</span><span id="total_least_squares-557"><a href="#total_least_squares-557"><span class="linenos">557</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">method</span> <span class="o">=</span> <span class="s1">&#39;ODR&#39;</span>
</span><span id="total_least_squares-558"><a href="#total_least_squares-558"><span class="linenos">558</span></a>
</span><span id="total_least_squares-559"><a href="#total_least_squares-559"><span class="linenos">559</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">out</span><span class="o">.</span><span class="n">stopreason</span>
</span><span id="total_least_squares-560"><a href="#total_least_squares-560"><span class="linenos">560</span></a>
</span><span id="total_least_squares-561"><a href="#total_least_squares-561"><span class="linenos">561</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">xplus</span> <span class="o">=</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span>
</span><span id="total_least_squares-562"><a href="#total_least_squares-562"><span class="linenos">562</span></a>
</span><span id="total_least_squares-563"><a href="#total_least_squares-563"><span class="linenos">563</span></a>    <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="total_least_squares-564"><a href="#total_least_squares-564"><span class="linenos">564</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Method: ODR&#39;</span><span class="p">)</span>
</span><span id="total_least_squares-565"><a href="#total_least_squares-565"><span class="linenos">565</span></a>        <span class="nb">print</span><span class="p">(</span><span class="o">*</span><span class="n">out</span><span class="o">.</span><span class="n">stopreason</span><span class="p">)</span>
</span><span id="total_least_squares-566"><a href="#total_least_squares-566"><span class="linenos">566</span></a>        <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Residual variance:&#39;</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">residual_variance</span><span class="p">)</span>
</span><span id="total_least_squares-567"><a href="#total_least_squares-567"><span class="linenos">567</span></a>
</span><span id="total_least_squares-568"><a href="#total_least_squares-568"><span class="linenos">568</span></a>    <span class="k">if</span> <span class="n">out</span><span class="o">.</span><span class="n">info</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">:</span>
</span><span id="total_least_squares-569"><a href="#total_least_squares-569"><span class="linenos">569</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;The minimization procedure did not converge.&#39;</span><span class="p">)</span>
</span><span id="total_least_squares-570"><a href="#total_least_squares-570"><span class="linenos">570</span></a>
</span><span id="total_least_squares-571"><a href="#total_least_squares-571"><span class="linenos">571</span></a>    <span class="n">m</span> <span class="o">=</span> <span class="n">x_f</span><span class="o">.</span><span class="n">size</span>
</span><span id="total_least_squares-572"><a href="#total_least_squares-572"><span class="linenos">572</span></a>
</span><span id="total_least_squares-573"><a href="#total_least_squares-573"><span class="linenos">573</span></a>    <span class="k">def</span> <span class="nf">odr_chisquare</span><span class="p">(</span><span class="n">p</span><span class="p">):</span>
</span><span id="total_least_squares-574"><a href="#total_least_squares-574"><span class="linenos">574</span></a>        <span class="n">model</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">p</span><span class="p">[:</span><span class="n">n_parms</span><span class="p">],</span> <span class="n">p</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">))</span>
</span><span id="total_least_squares-575"><a href="#total_least_squares-575"><span class="linenos">575</span></a>        <span class="n">chisq</span> <span class="o">=</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(((</span><span class="n">y_f</span> <span class="o">-</span> <span class="n">model</span><span class="p">)</span> <span class="o">/</span> <span class="n">dy_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(((</span><span class="n">x_f</span> <span class="o">-</span> <span class="n">p</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">))</span> <span class="o">/</span> <span class="n">dx_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="total_least_squares-576"><a href="#total_least_squares-576"><span class="linenos">576</span></a>        <span class="k">return</span> <span class="n">chisq</span>
</span><span id="total_least_squares-577"><a href="#total_least_squares-577"><span class="linenos">577</span></a>
</span><span id="total_least_squares-578"><a href="#total_least_squares-578"><span class="linenos">578</span></a>    <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;expected_chisquare&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="total_least_squares-579"><a href="#total_least_squares-579"><span class="linenos">579</span></a>        <span class="n">W</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">diag</span><span class="p">(</span><span class="mi">1</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">dy_f</span><span class="o">.</span><span class="n">ravel</span><span class="p">(),</span> <span class="n">dx_f</span><span class="o">.</span><span class="n">ravel</span><span class="p">()))))</span>
</span><span id="total_least_squares-580"><a href="#total_least_squares-580"><span class="linenos">580</span></a>
</span><span id="total_least_squares-581"><a href="#total_least_squares-581"><span class="linenos">581</span></a>        <span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;covariance&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="total_least_squares-582"><a href="#total_least_squares-582"><span class="linenos">582</span></a>            <span class="n">cov</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;covariance&#39;</span><span class="p">)</span>
</span><span id="total_least_squares-583"><a href="#total_least_squares-583"><span class="linenos">583</span></a>        <span class="k">else</span><span class="p">:</span>
</span><span id="total_least_squares-584"><a href="#total_least_squares-584"><span class="linenos">584</span></a>            <span class="n">cov</span> <span class="o">=</span> <span class="n">covariance</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="o">.</span><span class="n">ravel</span><span class="p">())))</span>
</span><span id="total_least_squares-585"><a href="#total_least_squares-585"><span class="linenos">585</span></a>
</span><span id="total_least_squares-586"><a href="#total_least_squares-586"><span class="linenos">586</span></a>        <span class="n">number_of_x_parameters</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">m</span> <span class="o">/</span> <span class="n">x_f</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
</span><span id="total_least_squares-587"><a href="#total_least_squares-587"><span class="linenos">587</span></a>
</span><span id="total_least_squares-588"><a href="#total_least_squares-588"><span class="linenos">588</span></a>        <span class="n">old_jac</span> <span class="o">=</span> <span class="n">jacobian</span><span class="p">(</span><span class="n">func</span><span class="p">)(</span><span class="n">out</span><span class="o">.</span><span class="n">beta</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="p">)</span>
</span><span id="total_least_squares-589"><a href="#total_least_squares-589"><span class="linenos">589</span></a>        <span class="n">fused_row1</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">old_jac</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">number_of_x_parameters</span> <span class="o">*</span> <span class="p">[</span><span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">old_jac</span><span class="o">.</span><span class="n">shape</span><span class="p">)]),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">0</span><span class="p">)))</span>
</span><span id="total_least_squares-590"><a href="#total_least_squares-590"><span class="linenos">590</span></a>        <span class="n">fused_row2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">jacobian</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">:</span> <span class="n">func</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">))(</span><span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">beta</span><span class="p">)</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_f</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">x_f</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">number_of_x_parameters</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">identity</span><span class="p">(</span><span class="n">number_of_x_parameters</span> <span class="o">*</span> <span class="n">old_jac</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">])))</span>
</span><span id="total_least_squares-591"><a href="#total_least_squares-591"><span class="linenos">591</span></a>        <span class="n">new_jac</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">fused_row1</span><span class="p">,</span> <span class="n">fused_row2</span><span class="p">),</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="total_least_squares-592"><a href="#total_least_squares-592"><span class="linenos">592</span></a>
</span><span id="total_least_squares-593"><a href="#total_least_squares-593"><span class="linenos">593</span></a>        <span class="n">A</span> <span class="o">=</span> <span class="n">W</span> <span class="o">@</span> <span class="n">new_jac</span>
</span><span id="total_least_squares-594"><a href="#total_least_squares-594"><span class="linenos">594</span></a>        <span class="n">P_phi</span> <span class="o">=</span> <span class="n">A</span> <span class="o">@</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">pinv</span><span class="p">(</span><span class="n">A</span><span class="o">.</span><span class="n">T</span> <span class="o">@</span> <span class="n">A</span><span class="p">)</span> <span class="o">@</span> <span class="n">A</span><span class="o">.</span><span class="n">T</span>
</span><span id="total_least_squares-595"><a href="#total_least_squares-595"><span class="linenos">595</span></a>        <span class="n">expected_chisquare</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">trace</span><span class="p">((</span><span class="n">np</span><span class="o">.</span><span class="n">identity</span><span class="p">(</span><span class="n">P_phi</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">-</span> <span class="n">P_phi</span><span class="p">)</span> <span class="o">@</span> <span class="n">W</span> <span class="o">@</span> <span class="n">cov</span> <span class="o">@</span> <span class="n">W</span><span class="p">)</span>
</span><span id="total_least_squares-596"><a href="#total_least_squares-596"><span class="linenos">596</span></a>        <span class="k">if</span> <span class="n">expected_chisquare</span> <span class="o">&lt;=</span> <span class="mf">0.0</span><span class="p">:</span>
</span><span id="total_least_squares-597"><a href="#total_least_squares-597"><span class="linenos">597</span></a>            <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">&quot;Negative expected_chisquare.&quot;</span><span class="p">,</span> <span class="ne">RuntimeWarning</span><span class="p">)</span>
</span><span id="total_least_squares-598"><a href="#total_least_squares-598"><span class="linenos">598</span></a>            <span class="n">expected_chisquare</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">expected_chisquare</span><span class="p">)</span>
</span><span id="total_least_squares-599"><a href="#total_least_squares-599"><span class="linenos">599</span></a>        <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_expected_chisquare</span> <span class="o">=</span> <span class="n">odr_chisquare</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">out</span><span class="o">.</span><span class="n">beta</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="o">.</span><span class="n">ravel</span><span class="p">())))</span> <span class="o">/</span> <span class="n">expected_chisquare</span>
</span><span id="total_least_squares-600"><a href="#total_least_squares-600"><span class="linenos">600</span></a>        <span class="k">if</span> <span class="ow">not</span> <span class="n">silent</span><span class="p">:</span>
</span><span id="total_least_squares-601"><a href="#total_least_squares-601"><span class="linenos">601</span></a>            <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;chisquare/expected_chisquare:&#39;</span><span class="p">,</span>
</span><span id="total_least_squares-602"><a href="#total_least_squares-602"><span class="linenos">602</span></a>                  <span class="n">output</span><span class="o">.</span><span class="n">chisquare_by_expected_chisquare</span><span class="p">)</span>
</span><span id="total_least_squares-603"><a href="#total_least_squares-603"><span class="linenos">603</span></a>
</span><span id="total_least_squares-604"><a href="#total_least_squares-604"><span class="linenos">604</span></a>    <span class="n">fitp</span> <span class="o">=</span> <span class="n">out</span><span class="o">.</span><span class="n">beta</span>
</span><span id="total_least_squares-605"><a href="#total_least_squares-605"><span class="linenos">605</span></a>    <span class="k">try</span><span class="p">:</span>
</span><span id="total_least_squares-606"><a href="#total_least_squares-606"><span class="linenos">606</span></a>        <span class="n">hess</span> <span class="o">=</span> <span class="n">hessian</span><span class="p">(</span><span class="n">odr_chisquare</span><span class="p">)(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">fitp</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="o">.</span><span class="n">ravel</span><span class="p">())))</span>
</span><span id="total_least_squares-607"><a href="#total_least_squares-607"><span class="linenos">607</span></a>    <span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
</span><span id="total_least_squares-608"><a href="#total_least_squares-608"><span class="linenos">608</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;It is required to use autograd.numpy instead of numpy within fit functions, see the documentation for details.&quot;</span><span class="p">)</span> <span class="kn">from</span> <span class="kc">None</span>
</span><span id="total_least_squares-609"><a href="#total_least_squares-609"><span class="linenos">609</span></a>
</span><span id="total_least_squares-610"><a href="#total_least_squares-610"><span class="linenos">610</span></a>    <span class="k">def</span> <span class="nf">odr_chisquare_compact_x</span><span class="p">(</span><span class="n">d</span><span class="p">):</span>
</span><span id="total_least_squares-611"><a href="#total_least_squares-611"><span class="linenos">611</span></a>        <span class="n">model</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">d</span><span class="p">[:</span><span class="n">n_parms</span><span class="p">],</span> <span class="n">d</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">))</span>
</span><span id="total_least_squares-612"><a href="#total_least_squares-612"><span class="linenos">612</span></a>        <span class="n">chisq</span> <span class="o">=</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(((</span><span class="n">y_f</span> <span class="o">-</span> <span class="n">model</span><span class="p">)</span> <span class="o">/</span> <span class="n">dy_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(((</span><span class="n">d</span><span class="p">[</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">:]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">)</span> <span class="o">-</span> <span class="n">d</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">))</span> <span class="o">/</span> <span class="n">dx_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="total_least_squares-613"><a href="#total_least_squares-613"><span class="linenos">613</span></a>        <span class="k">return</span> <span class="n">chisq</span>
</span><span id="total_least_squares-614"><a href="#total_least_squares-614"><span class="linenos">614</span></a>
</span><span id="total_least_squares-615"><a href="#total_least_squares-615"><span class="linenos">615</span></a>    <span class="n">jac_jac_x</span> <span class="o">=</span> <span class="n">hessian</span><span class="p">(</span><span class="n">odr_chisquare_compact_x</span><span class="p">)(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">fitp</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="o">.</span><span class="n">ravel</span><span class="p">(),</span> <span class="n">x_f</span><span class="o">.</span><span class="n">ravel</span><span class="p">())))</span>
</span><span id="total_least_squares-616"><a href="#total_least_squares-616"><span class="linenos">616</span></a>
</span><span id="total_least_squares-617"><a href="#total_least_squares-617"><span class="linenos">617</span></a>    <span class="c1"># Compute hess^{-1} @ jac_jac_x[:n_parms + m, n_parms + m:] using LAPACK dgesv</span>
</span><span id="total_least_squares-618"><a href="#total_least_squares-618"><span class="linenos">618</span></a>    <span class="k">try</span><span class="p">:</span>
</span><span id="total_least_squares-619"><a href="#total_least_squares-619"><span class="linenos">619</span></a>        <span class="n">deriv_x</span> <span class="o">=</span> <span class="o">-</span><span class="n">scipy</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">solve</span><span class="p">(</span><span class="n">hess</span><span class="p">,</span> <span class="n">jac_jac_x</span><span class="p">[:</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">,</span> <span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">:])</span>
</span><span id="total_least_squares-620"><a href="#total_least_squares-620"><span class="linenos">620</span></a>    <span class="k">except</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">LinAlgError</span><span class="p">:</span>
</span><span id="total_least_squares-621"><a href="#total_least_squares-621"><span class="linenos">621</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Cannot invert hessian matrix.&quot;</span><span class="p">)</span>
</span><span id="total_least_squares-622"><a href="#total_least_squares-622"><span class="linenos">622</span></a>
</span><span id="total_least_squares-623"><a href="#total_least_squares-623"><span class="linenos">623</span></a>    <span class="k">def</span> <span class="nf">odr_chisquare_compact_y</span><span class="p">(</span><span class="n">d</span><span class="p">):</span>
</span><span id="total_least_squares-624"><a href="#total_least_squares-624"><span class="linenos">624</span></a>        <span class="n">model</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">d</span><span class="p">[:</span><span class="n">n_parms</span><span class="p">],</span> <span class="n">d</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">))</span>
</span><span id="total_least_squares-625"><a href="#total_least_squares-625"><span class="linenos">625</span></a>        <span class="n">chisq</span> <span class="o">=</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(((</span><span class="n">d</span><span class="p">[</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">:]</span> <span class="o">-</span> <span class="n">model</span><span class="p">)</span> <span class="o">/</span> <span class="n">dy_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">anp</span><span class="o">.</span><span class="n">sum</span><span class="p">(((</span><span class="n">x_f</span> <span class="o">-</span> <span class="n">d</span><span class="p">[</span><span class="n">n_parms</span><span class="p">:</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">]</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">x_shape</span><span class="p">))</span> <span class="o">/</span> <span class="n">dx_f</span><span class="p">)</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span>
</span><span id="total_least_squares-626"><a href="#total_least_squares-626"><span class="linenos">626</span></a>        <span class="k">return</span> <span class="n">chisq</span>
</span><span id="total_least_squares-627"><a href="#total_least_squares-627"><span class="linenos">627</span></a>
</span><span id="total_least_squares-628"><a href="#total_least_squares-628"><span class="linenos">628</span></a>    <span class="n">jac_jac_y</span> <span class="o">=</span> <span class="n">hessian</span><span class="p">(</span><span class="n">odr_chisquare_compact_y</span><span class="p">)(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">fitp</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="o">.</span><span class="n">ravel</span><span class="p">(),</span> <span class="n">y_f</span><span class="p">)))</span>
</span><span id="total_least_squares-629"><a href="#total_least_squares-629"><span class="linenos">629</span></a>
</span><span id="total_least_squares-630"><a href="#total_least_squares-630"><span class="linenos">630</span></a>    <span class="c1"># Compute hess^{-1} @ jac_jac_y[:n_parms + m, n_parms + m:] using LAPACK dgesv</span>
</span><span id="total_least_squares-631"><a href="#total_least_squares-631"><span class="linenos">631</span></a>    <span class="k">try</span><span class="p">:</span>
</span><span id="total_least_squares-632"><a href="#total_least_squares-632"><span class="linenos">632</span></a>        <span class="n">deriv_y</span> <span class="o">=</span> <span class="o">-</span><span class="n">scipy</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">solve</span><span class="p">(</span><span class="n">hess</span><span class="p">,</span> <span class="n">jac_jac_y</span><span class="p">[:</span><span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">,</span> <span class="n">n_parms</span> <span class="o">+</span> <span class="n">m</span><span class="p">:])</span>
</span><span id="total_least_squares-633"><a href="#total_least_squares-633"><span class="linenos">633</span></a>    <span class="k">except</span> <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">LinAlgError</span><span class="p">:</span>
</span><span id="total_least_squares-634"><a href="#total_least_squares-634"><span class="linenos">634</span></a>        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&quot;Cannot invert hessian matrix.&quot;</span><span class="p">)</span>
</span><span id="total_least_squares-635"><a href="#total_least_squares-635"><span class="linenos">635</span></a>
</span><span id="total_least_squares-636"><a href="#total_least_squares-636"><span class="linenos">636</span></a>    <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="total_least_squares-637"><a href="#total_least_squares-637"><span class="linenos">637</span></a>    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n_parms</span><span class="p">):</span>
</span><span id="total_least_squares-638"><a href="#total_least_squares-638"><span class="linenos">638</span></a>        <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">derived_observable</span><span class="p">(</span><span class="k">lambda</span> <span class="n">my_var</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">:</span> <span class="p">(</span><span class="n">my_var</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">ravel</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">)</span> <span class="o">*</span> <span class="n">out</span><span class="o">.</span><span class="n">beta</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="nb">list</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">ravel</span><span class="p">())</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="n">y</span><span class="p">),</span> <span class="n">man_grad</span><span class="o">=</span><span class="nb">list</span><span class="p">(</span><span class="n">deriv_x</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="n">deriv_y</span><span class="p">[</span><span class="n">i</span><span class="p">])))</span>
</span><span id="total_least_squares-639"><a href="#total_least_squares-639"><span class="linenos">639</span></a>
</span><span id="total_least_squares-640"><a href="#total_least_squares-640"><span class="linenos">640</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">fit_parameters</span> <span class="o">=</span> <span class="n">result</span>
</span><span id="total_least_squares-641"><a href="#total_least_squares-641"><span class="linenos">641</span></a>
</span><span id="total_least_squares-642"><a href="#total_least_squares-642"><span class="linenos">642</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">odr_chisquare</span> <span class="o">=</span> <span class="n">odr_chisquare</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">concatenate</span><span class="p">((</span><span class="n">out</span><span class="o">.</span><span class="n">beta</span><span class="p">,</span> <span class="n">out</span><span class="o">.</span><span class="n">xplus</span><span class="o">.</span><span class="n">ravel</span><span class="p">())))</span>
</span><span id="total_least_squares-643"><a href="#total_least_squares-643"><span class="linenos">643</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">dof</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">n_parms</span>
</span><span id="total_least_squares-644"><a href="#total_least_squares-644"><span class="linenos">644</span></a>    <span class="n">output</span><span class="o">.</span><span class="n">p_value</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">scipy</span><span class="o">.</span><span class="n">stats</span><span class="o">.</span><span class="n">chi2</span><span class="o">.</span><span class="n">cdf</span><span class="p">(</span><span class="n">output</span><span class="o">.</span><span class="n">odr_chisquare</span><span class="p">,</span> <span class="n">output</span><span class="o">.</span><span class="n">dof</span><span class="p">)</span>
</span><span id="total_least_squares-645"><a href="#total_least_squares-645"><span class="linenos">645</span></a>
</span><span id="total_least_squares-646"><a href="#total_least_squares-646"><span class="linenos">646</span></a>    <span class="k">return</span> <span class="n">output</span>
</span></pre></div>


            <div class="docstring"><p>Performs a non-linear fit to y = func(x) and returns a list of Obs corresponding to the fit parameters.</p>

<h6 id="parameters">Parameters</h6>

<ul>
<li><strong>x</strong> (list):
list of Obs, or a tuple of lists of Obs</li>
<li><strong>y</strong> (list):
list of Obs. The dvalues of the Obs are used as x- and yerror for the fit.</li>
<li><p><strong>func</strong> (object):
func has to be of the form</p>

<div class="pdoc-code codehilite">
<pre><span></span><code><span class="kn">import</span> <span class="nn">autograd.numpy</span> <span class="k">as</span> <span class="nn">anp</span>

<span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span> <span class="o">+</span> <span class="n">a</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">*</span> <span class="n">anp</span><span class="o">.</span><span class="n">sinh</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</code></pre>
</div>

<p>For multiple x values func can be of the form</p>

<div class="pdoc-code codehilite">
<pre><span></span><code><span class="k">def</span> <span class="nf">func</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
    <span class="p">(</span><span class="n">x1</span><span class="p">,</span> <span class="n">x2</span><span class="p">)</span> <span class="o">=</span> <span class="n">x</span>
    <span class="k">return</span> <span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">x1</span> <span class="o">**</span> <span class="mi">2</span> <span class="o">+</span> <span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">x2</span>
</code></pre>
</div>

<p>It is important that all numpy functions refer to autograd.numpy, otherwise the differentiation
will not work.</p></li>
<li><strong>silent</strong> (bool, optional):
If true all output to the console is omitted (default False).</li>
<li><strong>initial_guess</strong> (list):
can provide an initial guess for the input parameters. Relevant for non-linear
fits with many parameters.</li>
<li><strong>expected_chisquare</strong> (bool):
If true prints the expected chisquare which is
corrected by effects caused by correlated input data.
This can take a while as the full correlation matrix
has to be calculated (default False).</li>
<li><strong>num_grad</strong> (bool):
Use numerical differentation instead of automatic differentiation to perform the error propagation (default False).</li>
</ul>

<h6 id="notes">Notes</h6>

<p>Based on the orthogonal distance regression module of scipy.</p>

<h6 id="returns">Returns</h6>

<ul>
<li><strong>output</strong> (Fit_result):
Parameters and information on the fitted result.</li>
</ul>
</div>


                </section>
                <section id="fit_lin">
                            <input id="fit_lin-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
            
        <span class="def">def</span>
        <span class="name">fit_lin</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">x</span>, </span><span class="param"><span class="n">y</span>, </span><span class="param"><span class="o">**</span><span class="n">kwargs</span></span><span class="return-annotation">):</span></span>

                <label class="view-source-button" for="fit_lin-view-source"><span>View Source</span></label>

    </div>
    <a class="headerlink" href="#fit_lin"></a>
            <div class="pdoc-code codehilite"><pre><span></span><span id="fit_lin-649"><a href="#fit_lin-649"><span class="linenos">649</span></a><span class="k">def</span> <span class="nf">fit_lin</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
</span><span id="fit_lin-650"><a href="#fit_lin-650"><span class="linenos">650</span></a><span class="w">    </span><span class="sd">&quot;&quot;&quot;Performs a linear fit to y = n + m * x and returns two Obs n, m.</span>
</span><span id="fit_lin-651"><a href="#fit_lin-651"><span class="linenos">651</span></a>
</span><span id="fit_lin-652"><a href="#fit_lin-652"><span class="linenos">652</span></a><span class="sd">    Parameters</span>
</span><span id="fit_lin-653"><a href="#fit_lin-653"><span class="linenos">653</span></a><span class="sd">    ----------</span>
</span><span id="fit_lin-654"><a href="#fit_lin-654"><span class="linenos">654</span></a><span class="sd">    x : list</span>
</span><span id="fit_lin-655"><a href="#fit_lin-655"><span class="linenos">655</span></a><span class="sd">        Can either be a list of floats in which case no xerror is assumed, or</span>
</span><span id="fit_lin-656"><a href="#fit_lin-656"><span class="linenos">656</span></a><span class="sd">        a list of Obs, where the dvalues of the Obs are used as xerror for the fit.</span>
</span><span id="fit_lin-657"><a href="#fit_lin-657"><span class="linenos">657</span></a><span class="sd">    y : list</span>
</span><span id="fit_lin-658"><a href="#fit_lin-658"><span class="linenos">658</span></a><span class="sd">        List of Obs, the dvalues of the Obs are used as yerror for the fit.</span>
</span><span id="fit_lin-659"><a href="#fit_lin-659"><span class="linenos">659</span></a>
</span><span id="fit_lin-660"><a href="#fit_lin-660"><span class="linenos">660</span></a><span class="sd">    Returns</span>
</span><span id="fit_lin-661"><a href="#fit_lin-661"><span class="linenos">661</span></a><span class="sd">    -------</span>
</span><span id="fit_lin-662"><a href="#fit_lin-662"><span class="linenos">662</span></a><span class="sd">    fit_parameters : list[Obs]</span>
</span><span id="fit_lin-663"><a href="#fit_lin-663"><span class="linenos">663</span></a><span class="sd">        LIist of fitted observables.</span>
</span><span id="fit_lin-664"><a href="#fit_lin-664"><span class="linenos">664</span></a><span class="sd">    &quot;&quot;&quot;</span>
</span><span id="fit_lin-665"><a href="#fit_lin-665"><span class="linenos">665</span></a>
</span><span id="fit_lin-666"><a href="#fit_lin-666"><span class="linenos">666</span></a>    <span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
</span><span id="fit_lin-667"><a href="#fit_lin-667"><span class="linenos">667</span></a>        <span class="n">y</span> <span class="o">=</span> <span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">a</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span>
</span><span id="fit_lin-668"><a href="#fit_lin-668"><span class="linenos">668</span></a>        <span class="k">return</span> <span class="n">y</span>
</span><span id="fit_lin-669"><a href="#fit_lin-669"><span class="linenos">669</span></a>
</span><span id="fit_lin-670"><a href="#fit_lin-670"><span class="linenos">670</span></a>    <span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">Obs</span><span class="p">)</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">x</span><span class="p">):</span>
</span><span id="fit_lin-671"><a href="#fit_lin-671"><span class="linenos">671</span></a>        <span class="n">out</span> <span class="o">=</span> <span class="n">total_least_squares</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="fit_lin-672"><a href="#fit_lin-672"><span class="linenos">672</span></a>        <span class="k">return</span> <span class="n">out</span><span class="o">.</span><span class="n">fit_parameters</span>
</span><span id="fit_lin-673"><a href="#fit_lin-673"><span class="linenos">673</span></a>    <span class="k">elif</span> <span class="nb">all</span><span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="nb">float</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">x</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">ndarray</span><span class="p">):</span>
</span><span id="fit_lin-674"><a href="#fit_lin-674"><span class="linenos">674</span></a>        <span class="n">out</span> <span class="o">=</span> <span class="n">least_squares</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</span><span id="fit_lin-675"><a href="#fit_lin-675"><span class="linenos">675</span></a>        <span class="k">return</span> <span class="n">out</span><span class="o">.</span><span class="n">fit_parameters</span>
</span><span id="fit_lin-676"><a href="#fit_lin-676"><span class="linenos">676</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="fit_lin-677"><a href="#fit_lin-677"><span class="linenos">677</span></a>        <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;Unsupported types for x&#39;</span><span class="p">)</span>
</span></pre></div>


            <div class="docstring"><p>Performs a linear fit to y = n + m * x and returns two Obs n, m.</p>

<h6 id="parameters">Parameters</h6>

<ul>
<li><strong>x</strong> (list):
Can either be a list of floats in which case no xerror is assumed, or
a list of Obs, where the dvalues of the Obs are used as xerror for the fit.</li>
<li><strong>y</strong> (list):
List of Obs, the dvalues of the Obs are used as yerror for the fit.</li>
</ul>

<h6 id="returns">Returns</h6>

<ul>
<li><strong>fit_parameters</strong> (list[Obs]):
LIist of fitted observables.</li>
</ul>
</div>


                </section>
                <section id="qqplot">
                            <input id="qqplot-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
            
        <span class="def">def</span>
        <span class="name">qqplot</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">x</span>, </span><span class="param"><span class="n">o_y</span>, </span><span class="param"><span class="n">func</span>, </span><span class="param"><span class="n">p</span>, </span><span class="param"><span class="n">title</span><span class="o">=</span><span class="s1">&#39;&#39;</span></span><span class="return-annotation">):</span></span>

                <label class="view-source-button" for="qqplot-view-source"><span>View Source</span></label>

    </div>
    <a class="headerlink" href="#qqplot"></a>
            <div class="pdoc-code codehilite"><pre><span></span><span id="qqplot-680"><a href="#qqplot-680"><span class="linenos">680</span></a><span class="k">def</span> <span class="nf">qqplot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">o_y</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
</span><span id="qqplot-681"><a href="#qqplot-681"><span class="linenos">681</span></a><span class="w">    </span><span class="sd">&quot;&quot;&quot;Generates a quantile-quantile plot of the fit result which can be used to</span>
</span><span id="qqplot-682"><a href="#qqplot-682"><span class="linenos">682</span></a><span class="sd">       check if the residuals of the fit are gaussian distributed.</span>
</span><span id="qqplot-683"><a href="#qqplot-683"><span class="linenos">683</span></a>
</span><span id="qqplot-684"><a href="#qqplot-684"><span class="linenos">684</span></a><span class="sd">    Returns</span>
</span><span id="qqplot-685"><a href="#qqplot-685"><span class="linenos">685</span></a><span class="sd">    -------</span>
</span><span id="qqplot-686"><a href="#qqplot-686"><span class="linenos">686</span></a><span class="sd">    None</span>
</span><span id="qqplot-687"><a href="#qqplot-687"><span class="linenos">687</span></a><span class="sd">    &quot;&quot;&quot;</span>
</span><span id="qqplot-688"><a href="#qqplot-688"><span class="linenos">688</span></a>
</span><span id="qqplot-689"><a href="#qqplot-689"><span class="linenos">689</span></a>    <span class="n">residuals</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="qqplot-690"><a href="#qqplot-690"><span class="linenos">690</span></a>    <span class="k">for</span> <span class="n">i_x</span><span class="p">,</span> <span class="n">i_y</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">o_y</span><span class="p">):</span>
</span><span id="qqplot-691"><a href="#qqplot-691"><span class="linenos">691</span></a>        <span class="n">residuals</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">i_y</span> <span class="o">-</span> <span class="n">func</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">i_x</span><span class="p">))</span> <span class="o">/</span> <span class="n">i_y</span><span class="o">.</span><span class="n">dvalue</span><span class="p">)</span>
</span><span id="qqplot-692"><a href="#qqplot-692"><span class="linenos">692</span></a>    <span class="n">residuals</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">residuals</span><span class="p">)</span>
</span><span id="qqplot-693"><a href="#qqplot-693"><span class="linenos">693</span></a>    <span class="n">my_y</span> <span class="o">=</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">residuals</span><span class="p">]</span>
</span><span id="qqplot-694"><a href="#qqplot-694"><span class="linenos">694</span></a>    <span class="n">probplot</span> <span class="o">=</span> <span class="n">scipy</span><span class="o">.</span><span class="n">stats</span><span class="o">.</span><span class="n">probplot</span><span class="p">(</span><span class="n">my_y</span><span class="p">)</span>
</span><span id="qqplot-695"><a href="#qqplot-695"><span class="linenos">695</span></a>    <span class="n">my_x</span> <span class="o">=</span> <span class="n">probplot</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
</span><span id="qqplot-696"><a href="#qqplot-696"><span class="linenos">696</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span> <span class="o">/</span> <span class="mf">1.618</span><span class="p">))</span>
</span><span id="qqplot-697"><a href="#qqplot-697"><span class="linenos">697</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">errorbar</span><span class="p">(</span><span class="n">my_x</span><span class="p">,</span> <span class="n">my_y</span><span class="p">,</span> <span class="n">fmt</span><span class="o">=</span><span class="s1">&#39;o&#39;</span><span class="p">)</span>
</span><span id="qqplot-698"><a href="#qqplot-698"><span class="linenos">698</span></a>    <span class="n">fit_start</span> <span class="o">=</span> <span class="n">my_x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
</span><span id="qqplot-699"><a href="#qqplot-699"><span class="linenos">699</span></a>    <span class="n">fit_stop</span> <span class="o">=</span> <span class="n">my_x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
</span><span id="qqplot-700"><a href="#qqplot-700"><span class="linenos">700</span></a>    <span class="n">samples</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">fit_start</span><span class="p">,</span> <span class="n">fit_stop</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">)</span>
</span><span id="qqplot-701"><a href="#qqplot-701"><span class="linenos">701</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">samples</span><span class="p">,</span> <span class="n">samples</span><span class="p">,</span> <span class="s1">&#39;k--&#39;</span><span class="p">,</span> <span class="n">zorder</span><span class="o">=</span><span class="mi">11</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;Standard normal distribution&#39;</span><span class="p">)</span>
</span><span id="qqplot-702"><a href="#qqplot-702"><span class="linenos">702</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">samples</span><span class="p">,</span> <span class="n">probplot</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">samples</span> <span class="o">+</span> <span class="n">probplot</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">],</span> <span class="n">zorder</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;Least squares fit, r=&#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">around</span><span class="p">(</span><span class="n">probplot</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">2</span><span class="p">],</span> <span class="mi">3</span><span class="p">)),</span> <span class="n">marker</span><span class="o">=</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">ls</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
</span><span id="qqplot-703"><a href="#qqplot-703"><span class="linenos">703</span></a>
</span><span id="qqplot-704"><a href="#qqplot-704"><span class="linenos">704</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s1">&#39;Theoretical quantiles&#39;</span><span class="p">)</span>
</span><span id="qqplot-705"><a href="#qqplot-705"><span class="linenos">705</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s1">&#39;Ordered Values&#39;</span><span class="p">)</span>
</span><span id="qqplot-706"><a href="#qqplot-706"><span class="linenos">706</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="n">title</span><span class="p">)</span>
</span><span id="qqplot-707"><a href="#qqplot-707"><span class="linenos">707</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
</span></pre></div>


            <div class="docstring"><p>Generates a quantile-quantile plot of the fit result which can be used to
   check if the residuals of the fit are gaussian distributed.</p>

<h6 id="returns">Returns</h6>

<ul>
<li><strong>None</strong></li>
</ul>
</div>


                </section>
                <section id="residual_plot">
                            <input id="residual_plot-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
            
        <span class="def">def</span>
        <span class="name">residual_plot</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">x</span>, </span><span class="param"><span class="n">y</span>, </span><span class="param"><span class="n">func</span>, </span><span class="param"><span class="n">fit_res</span>, </span><span class="param"><span class="n">title</span><span class="o">=</span><span class="s1">&#39;&#39;</span></span><span class="return-annotation">):</span></span>

                <label class="view-source-button" for="residual_plot-view-source"><span>View Source</span></label>

    </div>
    <a class="headerlink" href="#residual_plot"></a>
            <div class="pdoc-code codehilite"><pre><span></span><span id="residual_plot-710"><a href="#residual_plot-710"><span class="linenos">710</span></a><span class="k">def</span> <span class="nf">residual_plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">fit_res</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="s2">&quot;&quot;</span><span class="p">):</span>
</span><span id="residual_plot-711"><a href="#residual_plot-711"><span class="linenos">711</span></a><span class="w">    </span><span class="sd">&quot;&quot;&quot;Generates a plot which compares the fit to the data and displays the corresponding residuals</span>
</span><span id="residual_plot-712"><a href="#residual_plot-712"><span class="linenos">712</span></a>
</span><span id="residual_plot-713"><a href="#residual_plot-713"><span class="linenos">713</span></a><span class="sd">    For uncorrelated data the residuals are expected to be distributed ~N(0,1).</span>
</span><span id="residual_plot-714"><a href="#residual_plot-714"><span class="linenos">714</span></a>
</span><span id="residual_plot-715"><a href="#residual_plot-715"><span class="linenos">715</span></a><span class="sd">    Returns</span>
</span><span id="residual_plot-716"><a href="#residual_plot-716"><span class="linenos">716</span></a><span class="sd">    -------</span>
</span><span id="residual_plot-717"><a href="#residual_plot-717"><span class="linenos">717</span></a><span class="sd">    None</span>
</span><span id="residual_plot-718"><a href="#residual_plot-718"><span class="linenos">718</span></a><span class="sd">    &quot;&quot;&quot;</span>
</span><span id="residual_plot-719"><a href="#residual_plot-719"><span class="linenos">719</span></a>    <span class="n">sorted_x</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span><span id="residual_plot-720"><a href="#residual_plot-720"><span class="linenos">720</span></a>    <span class="n">xstart</span> <span class="o">=</span> <span class="n">sorted_x</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">sorted_x</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">sorted_x</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="residual_plot-721"><a href="#residual_plot-721"><span class="linenos">721</span></a>    <span class="n">xstop</span> <span class="o">=</span> <span class="n">sorted_x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">sorted_x</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">sorted_x</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">])</span>
</span><span id="residual_plot-722"><a href="#residual_plot-722"><span class="linenos">722</span></a>    <span class="n">x_samples</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">xstart</span><span class="p">,</span> <span class="n">xstop</span> <span class="o">+</span> <span class="mf">0.01</span><span class="p">,</span> <span class="mf">0.01</span><span class="p">)</span>
</span><span id="residual_plot-723"><a href="#residual_plot-723"><span class="linenos">723</span></a>
</span><span id="residual_plot-724"><a href="#residual_plot-724"><span class="linenos">724</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="mi">8</span> <span class="o">/</span> <span class="mf">1.618</span><span class="p">))</span>
</span><span id="residual_plot-725"><a href="#residual_plot-725"><span class="linenos">725</span></a>    <span class="n">gs</span> <span class="o">=</span> <span class="n">gridspec</span><span class="o">.</span><span class="n">GridSpec</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">height_ratios</span><span class="o">=</span><span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="n">wspace</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">hspace</span><span class="o">=</span><span class="mf">0.0</span><span class="p">)</span>
</span><span id="residual_plot-726"><a href="#residual_plot-726"><span class="linenos">726</span></a>    <span class="n">ax0</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="n">gs</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span id="residual_plot-727"><a href="#residual_plot-727"><span class="linenos">727</span></a>    <span class="n">ax0</span><span class="o">.</span><span class="n">errorbar</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y</span><span class="p">],</span> <span class="n">yerr</span><span class="o">=</span><span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">dvalue</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y</span><span class="p">],</span> <span class="n">ls</span><span class="o">=</span><span class="s1">&#39;none&#39;</span><span class="p">,</span> <span class="n">fmt</span><span class="o">=</span><span class="s1">&#39;o&#39;</span><span class="p">,</span> <span class="n">capsize</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">markersize</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;Data&#39;</span><span class="p">)</span>
</span><span id="residual_plot-728"><a href="#residual_plot-728"><span class="linenos">728</span></a>    <span class="n">ax0</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x_samples</span><span class="p">,</span> <span class="n">func</span><span class="p">([</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">fit_res</span><span class="p">],</span> <span class="n">x_samples</span><span class="p">),</span> <span class="n">label</span><span class="o">=</span><span class="s1">&#39;Fit&#39;</span><span class="p">,</span> <span class="n">zorder</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">ls</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="n">ms</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
</span><span id="residual_plot-729"><a href="#residual_plot-729"><span class="linenos">729</span></a>    <span class="n">ax0</span><span class="o">.</span><span class="n">set_xticklabels</span><span class="p">([])</span>
</span><span id="residual_plot-730"><a href="#residual_plot-730"><span class="linenos">730</span></a>    <span class="n">ax0</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">([</span><span class="n">xstart</span><span class="p">,</span> <span class="n">xstop</span><span class="p">])</span>
</span><span id="residual_plot-731"><a href="#residual_plot-731"><span class="linenos">731</span></a>    <span class="n">ax0</span><span class="o">.</span><span class="n">set_xticklabels</span><span class="p">([])</span>
</span><span id="residual_plot-732"><a href="#residual_plot-732"><span class="linenos">732</span></a>    <span class="n">ax0</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="n">title</span><span class="p">)</span>
</span><span id="residual_plot-733"><a href="#residual_plot-733"><span class="linenos">733</span></a>
</span><span id="residual_plot-734"><a href="#residual_plot-734"><span class="linenos">734</span></a>    <span class="n">residuals</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y</span><span class="p">])</span> <span class="o">-</span> <span class="n">func</span><span class="p">([</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">fit_res</span><span class="p">],</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">x</span><span class="p">)))</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">asarray</span><span class="p">([</span><span class="n">o</span><span class="o">.</span><span class="n">dvalue</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">y</span><span class="p">])</span>
</span><span id="residual_plot-735"><a href="#residual_plot-735"><span class="linenos">735</span></a>    <span class="n">ax1</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplot</span><span class="p">(</span><span class="n">gs</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
</span><span id="residual_plot-736"><a href="#residual_plot-736"><span class="linenos">736</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">residuals</span><span class="p">,</span> <span class="s1">&#39;ko&#39;</span><span class="p">,</span> <span class="n">ls</span><span class="o">=</span><span class="s1">&#39;none&#39;</span><span class="p">,</span> <span class="n">markersize</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
</span><span id="residual_plot-737"><a href="#residual_plot-737"><span class="linenos">737</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">tick_params</span><span class="p">(</span><span class="n">direction</span><span class="o">=</span><span class="s1">&#39;out&#39;</span><span class="p">)</span>
</span><span id="residual_plot-738"><a href="#residual_plot-738"><span class="linenos">738</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">tick_params</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="s2">&quot;x&quot;</span><span class="p">,</span> <span class="n">bottom</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">top</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">labelbottom</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="residual_plot-739"><a href="#residual_plot-739"><span class="linenos">739</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">axhline</span><span class="p">(</span><span class="n">y</span><span class="o">=</span><span class="mf">0.0</span><span class="p">,</span> <span class="n">ls</span><span class="o">=</span><span class="s1">&#39;--&#39;</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">&#39;k&#39;</span><span class="p">,</span> <span class="n">marker</span><span class="o">=</span><span class="s2">&quot; &quot;</span><span class="p">)</span>
</span><span id="residual_plot-740"><a href="#residual_plot-740"><span class="linenos">740</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">fill_between</span><span class="p">(</span><span class="n">x_samples</span><span class="p">,</span> <span class="o">-</span><span class="mf">1.0</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="s1">&#39;k&#39;</span><span class="p">)</span>
</span><span id="residual_plot-741"><a href="#residual_plot-741"><span class="linenos">741</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">([</span><span class="n">xstart</span><span class="p">,</span> <span class="n">xstop</span><span class="p">])</span>
</span><span id="residual_plot-742"><a href="#residual_plot-742"><span class="linenos">742</span></a>    <span class="n">ax1</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s1">&#39;Residuals&#39;</span><span class="p">)</span>
</span><span id="residual_plot-743"><a href="#residual_plot-743"><span class="linenos">743</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">subplots_adjust</span><span class="p">(</span><span class="n">wspace</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">hspace</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</span><span id="residual_plot-744"><a href="#residual_plot-744"><span class="linenos">744</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
</span></pre></div>


            <div class="docstring"><p>Generates a plot which compares the fit to the data and displays the corresponding residuals</p>

<p>For uncorrelated data the residuals are expected to be distributed ~N(0,1).</p>

<h6 id="returns">Returns</h6>

<ul>
<li><strong>None</strong></li>
</ul>
</div>


                </section>
                <section id="error_band">
                            <input id="error_band-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
            
        <span class="def">def</span>
        <span class="name">error_band</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">x</span>, </span><span class="param"><span class="n">func</span>, </span><span class="param"><span class="n">beta</span></span><span class="return-annotation">):</span></span>

                <label class="view-source-button" for="error_band-view-source"><span>View Source</span></label>

    </div>
    <a class="headerlink" href="#error_band"></a>
            <div class="pdoc-code codehilite"><pre><span></span><span id="error_band-747"><a href="#error_band-747"><span class="linenos">747</span></a><span class="k">def</span> <span class="nf">error_band</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">beta</span><span class="p">):</span>
</span><span id="error_band-748"><a href="#error_band-748"><span class="linenos">748</span></a><span class="w">    </span><span class="sd">&quot;&quot;&quot;Calculate the error band for an array of sample values x, for given fit function func with optimized parameters beta.</span>
</span><span id="error_band-749"><a href="#error_band-749"><span class="linenos">749</span></a>
</span><span id="error_band-750"><a href="#error_band-750"><span class="linenos">750</span></a><span class="sd">    Returns</span>
</span><span id="error_band-751"><a href="#error_band-751"><span class="linenos">751</span></a><span class="sd">    -------</span>
</span><span id="error_band-752"><a href="#error_band-752"><span class="linenos">752</span></a><span class="sd">    err : np.array(Obs)</span>
</span><span id="error_band-753"><a href="#error_band-753"><span class="linenos">753</span></a><span class="sd">        Error band for an array of sample values x</span>
</span><span id="error_band-754"><a href="#error_band-754"><span class="linenos">754</span></a><span class="sd">    &quot;&quot;&quot;</span>
</span><span id="error_band-755"><a href="#error_band-755"><span class="linenos">755</span></a>    <span class="n">cov</span> <span class="o">=</span> <span class="n">covariance</span><span class="p">(</span><span class="n">beta</span><span class="p">)</span>
</span><span id="error_band-756"><a href="#error_band-756"><span class="linenos">756</span></a>    <span class="k">if</span> <span class="n">np</span><span class="o">.</span><span class="n">any</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">cov</span> <span class="o">-</span> <span class="n">cov</span><span class="o">.</span><span class="n">T</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1000</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">):</span>
</span><span id="error_band-757"><a href="#error_band-757"><span class="linenos">757</span></a>        <span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s2">&quot;Covariance matrix is not symmetric within floating point precision&quot;</span><span class="p">,</span> <span class="ne">RuntimeWarning</span><span class="p">)</span>
</span><span id="error_band-758"><a href="#error_band-758"><span class="linenos">758</span></a>
</span><span id="error_band-759"><a href="#error_band-759"><span class="linenos">759</span></a>    <span class="n">deriv</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="error_band-760"><a href="#error_band-760"><span class="linenos">760</span></a>    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">item</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
</span><span id="error_band-761"><a href="#error_band-761"><span class="linenos">761</span></a>        <span class="n">deriv</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">egrad</span><span class="p">(</span><span class="n">func</span><span class="p">)([</span><span class="n">o</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">beta</span><span class="p">],</span> <span class="n">item</span><span class="p">)))</span>
</span><span id="error_band-762"><a href="#error_band-762"><span class="linenos">762</span></a>
</span><span id="error_band-763"><a href="#error_band-763"><span class="linenos">763</span></a>    <span class="n">err</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="error_band-764"><a href="#error_band-764"><span class="linenos">764</span></a>    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">item</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
</span><span id="error_band-765"><a href="#error_band-765"><span class="linenos">765</span></a>        <span class="n">err</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">deriv</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">@</span> <span class="n">cov</span> <span class="o">@</span> <span class="n">deriv</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span>
</span><span id="error_band-766"><a href="#error_band-766"><span class="linenos">766</span></a>    <span class="n">err</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
</span><span id="error_band-767"><a href="#error_band-767"><span class="linenos">767</span></a>
</span><span id="error_band-768"><a href="#error_band-768"><span class="linenos">768</span></a>    <span class="k">return</span> <span class="n">err</span>
</span></pre></div>


            <div class="docstring"><p>Calculate the error band for an array of sample values x, for given fit function func with optimized parameters beta.</p>

<h6 id="returns">Returns</h6>

<ul>
<li><strong>err</strong> (np.array(Obs)):
Error band for an array of sample values x</li>
</ul>
</div>


                </section>
                <section id="ks_test">
                            <input id="ks_test-view-source" class="view-source-toggle-state" type="checkbox" aria-hidden="true" tabindex="-1">
<div class="attr function">
            
        <span class="def">def</span>
        <span class="name">ks_test</span><span class="signature pdoc-code condensed">(<span class="param"><span class="n">objects</span><span class="o">=</span><span class="kc">None</span></span><span class="return-annotation">):</span></span>

                <label class="view-source-button" for="ks_test-view-source"><span>View Source</span></label>

    </div>
    <a class="headerlink" href="#ks_test"></a>
            <div class="pdoc-code codehilite"><pre><span></span><span id="ks_test-771"><a href="#ks_test-771"><span class="linenos">771</span></a><span class="k">def</span> <span class="nf">ks_test</span><span class="p">(</span><span class="n">objects</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
</span><span id="ks_test-772"><a href="#ks_test-772"><span class="linenos">772</span></a><span class="w">    </span><span class="sd">&quot;&quot;&quot;Performs a Kolmogorov–Smirnov test for the p-values of all fit object.</span>
</span><span id="ks_test-773"><a href="#ks_test-773"><span class="linenos">773</span></a>
</span><span id="ks_test-774"><a href="#ks_test-774"><span class="linenos">774</span></a><span class="sd">    Parameters</span>
</span><span id="ks_test-775"><a href="#ks_test-775"><span class="linenos">775</span></a><span class="sd">    ----------</span>
</span><span id="ks_test-776"><a href="#ks_test-776"><span class="linenos">776</span></a><span class="sd">    objects : list</span>
</span><span id="ks_test-777"><a href="#ks_test-777"><span class="linenos">777</span></a><span class="sd">        List of fit results to include in the analysis (optional).</span>
</span><span id="ks_test-778"><a href="#ks_test-778"><span class="linenos">778</span></a>
</span><span id="ks_test-779"><a href="#ks_test-779"><span class="linenos">779</span></a><span class="sd">    Returns</span>
</span><span id="ks_test-780"><a href="#ks_test-780"><span class="linenos">780</span></a><span class="sd">    -------</span>
</span><span id="ks_test-781"><a href="#ks_test-781"><span class="linenos">781</span></a><span class="sd">    None</span>
</span><span id="ks_test-782"><a href="#ks_test-782"><span class="linenos">782</span></a><span class="sd">    &quot;&quot;&quot;</span>
</span><span id="ks_test-783"><a href="#ks_test-783"><span class="linenos">783</span></a>
</span><span id="ks_test-784"><a href="#ks_test-784"><span class="linenos">784</span></a>    <span class="k">if</span> <span class="n">objects</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="ks_test-785"><a href="#ks_test-785"><span class="linenos">785</span></a>        <span class="n">obs_list</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="ks_test-786"><a href="#ks_test-786"><span class="linenos">786</span></a>        <span class="k">for</span> <span class="n">obj</span> <span class="ow">in</span> <span class="n">gc</span><span class="o">.</span><span class="n">get_objects</span><span class="p">():</span>
</span><span id="ks_test-787"><a href="#ks_test-787"><span class="linenos">787</span></a>            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">Fit_result</span><span class="p">):</span>
</span><span id="ks_test-788"><a href="#ks_test-788"><span class="linenos">788</span></a>                <span class="n">obs_list</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
</span><span id="ks_test-789"><a href="#ks_test-789"><span class="linenos">789</span></a>    <span class="k">else</span><span class="p">:</span>
</span><span id="ks_test-790"><a href="#ks_test-790"><span class="linenos">790</span></a>        <span class="n">obs_list</span> <span class="o">=</span> <span class="n">objects</span>
</span><span id="ks_test-791"><a href="#ks_test-791"><span class="linenos">791</span></a>
</span><span id="ks_test-792"><a href="#ks_test-792"><span class="linenos">792</span></a>    <span class="n">p_values</span> <span class="o">=</span> <span class="p">[</span><span class="n">o</span><span class="o">.</span><span class="n">p_value</span> <span class="k">for</span> <span class="n">o</span> <span class="ow">in</span> <span class="n">obs_list</span><span class="p">]</span>
</span><span id="ks_test-793"><a href="#ks_test-793"><span class="linenos">793</span></a>
</span><span id="ks_test-794"><a href="#ks_test-794"><span class="linenos">794</span></a>    <span class="n">bins</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">p_values</span><span class="p">)</span>
</span><span id="ks_test-795"><a href="#ks_test-795"><span class="linenos">795</span></a>    <span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">1.001</span><span class="p">,</span> <span class="mf">0.001</span><span class="p">)</span>
</span><span id="ks_test-796"><a href="#ks_test-796"><span class="linenos">796</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="s1">&#39;k&#39;</span><span class="p">,</span> <span class="n">zorder</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
</span><span id="ks_test-797"><a href="#ks_test-797"><span class="linenos">797</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">xlim</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span><span id="ks_test-798"><a href="#ks_test-798"><span class="linenos">798</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">ylim</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
</span><span id="ks_test-799"><a href="#ks_test-799"><span class="linenos">799</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s1">&#39;p-value&#39;</span><span class="p">)</span>
</span><span id="ks_test-800"><a href="#ks_test-800"><span class="linenos">800</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s1">&#39;Cumulative probability&#39;</span><span class="p">)</span>
</span><span id="ks_test-801"><a href="#ks_test-801"><span class="linenos">801</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">bins</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; p-values&#39;</span><span class="p">)</span>
</span><span id="ks_test-802"><a href="#ks_test-802"><span class="linenos">802</span></a>
</span><span id="ks_test-803"><a href="#ks_test-803"><span class="linenos">803</span></a>    <span class="n">n</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">bins</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="n">np</span><span class="o">.</span><span class="n">float64</span><span class="p">(</span><span class="n">bins</span><span class="p">)</span>
</span><span id="ks_test-804"><a href="#ks_test-804"><span class="linenos">804</span></a>    <span class="n">Xs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">p_values</span><span class="p">)</span>
</span><span id="ks_test-805"><a href="#ks_test-805"><span class="linenos">805</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="n">Xs</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span>
</span><span id="ks_test-806"><a href="#ks_test-806"><span class="linenos">806</span></a>    <span class="n">diffs</span> <span class="o">=</span> <span class="n">n</span> <span class="o">-</span> <span class="n">Xs</span>
</span><span id="ks_test-807"><a href="#ks_test-807"><span class="linenos">807</span></a>    <span class="n">loc_max_diff</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">abs</span><span class="p">(</span><span class="n">diffs</span><span class="p">))</span>
</span><span id="ks_test-808"><a href="#ks_test-808"><span class="linenos">808</span></a>    <span class="n">loc</span> <span class="o">=</span> <span class="n">Xs</span><span class="p">[</span><span class="n">loc_max_diff</span><span class="p">]</span>
</span><span id="ks_test-809"><a href="#ks_test-809"><span class="linenos">809</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">annotate</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">xy</span><span class="o">=</span><span class="p">(</span><span class="n">loc</span><span class="p">,</span> <span class="n">loc</span><span class="p">),</span> <span class="n">xytext</span><span class="o">=</span><span class="p">(</span><span class="n">loc</span><span class="p">,</span> <span class="n">loc</span> <span class="o">+</span> <span class="n">diffs</span><span class="p">[</span><span class="n">loc_max_diff</span><span class="p">]),</span> <span class="n">arrowprops</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">arrowstyle</span><span class="o">=</span><span class="s1">&#39;&lt;-&gt;&#39;</span><span class="p">,</span> <span class="n">shrinkA</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">shrinkB</span><span class="o">=</span><span class="mi">0</span><span class="p">))</span>
</span><span id="ks_test-810"><a href="#ks_test-810"><span class="linenos">810</span></a>    <span class="n">plt</span><span class="o">.</span><span class="n">draw</span><span class="p">()</span>
</span><span id="ks_test-811"><a href="#ks_test-811"><span class="linenos">811</span></a>
</span><span id="ks_test-812"><a href="#ks_test-812"><span class="linenos">812</span></a>    <span class="nb">print</span><span class="p">(</span><span class="n">scipy</span><span class="o">.</span><span class="n">stats</span><span class="o">.</span><span class="n">kstest</span><span class="p">(</span><span class="n">p_values</span><span class="p">,</span> <span class="s1">&#39;uniform&#39;</span><span class="p">))</span>
</span></pre></div>


            <div class="docstring"><p>Performs a Kolmogorov–Smirnov test for the p-values of all fit object.</p>

<h6 id="parameters">Parameters</h6>

<ul>
<li><strong>objects</strong> (list):
List of fit results to include in the analysis (optional).</li>
</ul>

<h6 id="returns">Returns</h6>

<ul>
<li><strong>None</strong></li>
</ul>
</div>


                </section>
    </main>
<script>
    function escapeHTML(html) {
        return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
    }

    const originalContent = document.querySelector("main.pdoc");
    let currentContent = originalContent;

    function setContent(innerHTML) {
        let elem;
        if (innerHTML) {
            elem = document.createElement("main");
            elem.classList.add("pdoc");
            elem.innerHTML = innerHTML;
        } else {
            elem = originalContent;
        }
        if (currentContent !== elem) {
            currentContent.replaceWith(elem);
            currentContent = elem;
        }
    }

    function getSearchTerm() {
        return (new URL(window.location)).searchParams.get("search");
    }

    const searchBox = document.querySelector(".pdoc input[type=search]");
    searchBox.addEventListener("input", function () {
        let url = new URL(window.location);
        if (searchBox.value.trim()) {
            url.hash = "";
            url.searchParams.set("search", searchBox.value);
        } else {
            url.searchParams.delete("search");
        }
        history.replaceState("", "", url.toString());
        onInput();
    });
    window.addEventListener("popstate", onInput);


    let search, searchErr;

    async function initialize() {
        try {
            search = await new Promise((resolve, reject) => {
                const script = document.createElement("script");
                script.type = "text/javascript";
                script.async = true;
                script.onload = () => resolve(window.pdocSearch);
                script.onerror = (e) => reject(e);
                script.src = "../search.js";
                document.getElementsByTagName("head")[0].appendChild(script);
            });
        } catch (e) {
            console.error("Cannot fetch pdoc search index");
            searchErr = "Cannot fetch search index.";
        }
        onInput();

        document.querySelector("nav.pdoc").addEventListener("click", e => {
            if (e.target.hash) {
                searchBox.value = "";
                searchBox.dispatchEvent(new Event("input"));
            }
        });
    }

    function onInput() {
        setContent((() => {
            const term = getSearchTerm();
            if (!term) {
                return null
            }
            if (searchErr) {
                return `<h3>Error: ${searchErr}</h3>`
            }
            if (!search) {
                return "<h3>Searching...</h3>"
            }

            window.scrollTo({top: 0, left: 0, behavior: 'auto'});

            const results = search(term);

            let html;
            if (results.length === 0) {
                html = `No search results for '${escapeHTML(term)}'.`
            } else {
                html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
            }
            for (let result of results.slice(0, 10)) {
                let doc = result.doc;
                let url = `../${doc.modulename.replaceAll(".", "/")}.html`;
                if (doc.qualname) {
                    url += `#${doc.qualname}`;
                }

                let heading;
                switch (result.doc.kind) {
                    case "function":
                        if (doc.fullname.endsWith(".__init__")) {
                            heading = `<span class="name">${doc.fullname.replace(/\.__init__$/, "")}</span>${doc.signature}`;
                        } else {
                            heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span>${doc.signature}`;
                        }
                        break;
                    case "class":
                        heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
                        if (doc.bases)
                            heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
                        heading += `:`;
                        break;
                    case "variable":
                        heading = `<span class="name">${doc.fullname}</span>`;
                        if (doc.annotation)
                            heading += `<span class="annotation">${doc.annotation}</span>`;
                        if (doc.default_value)
                            heading += `<span class="default_value"> = ${doc.default_value}</span>`;
                        break;
                    default:
                        heading = `<span class="name">${doc.fullname}</span>`;
                        break;
                }
                html += `
                        <section class="search-result">
                        <a href="${url}" class="attr ${doc.kind}">${heading}</a>
                        <div class="docstring">${doc.doc}</div>
                        </section>
                    `;

            }
            return html;
        })());
    }

    if (getSearchTerm()) {
        initialize();
        searchBox.value = getSearchTerm();
        onInput();
    } else {
        searchBox.addEventListener("focus", initialize, {once: true});
    }

    searchBox.addEventListener("keydown", e => {
        if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
            let focused = currentContent.querySelector(".search-result.focused");
            if (!focused) {
                currentContent.querySelector(".search-result").classList.add("focused");
            } else if (
                e.key === "ArrowDown"
                && focused.nextElementSibling
                && focused.nextElementSibling.classList.contains("search-result")
            ) {
                focused.classList.remove("focused");
                focused.nextElementSibling.classList.add("focused");
                focused.nextElementSibling.scrollIntoView({
                    behavior: "smooth",
                    block: "nearest",
                    inline: "nearest"
                });
            } else if (
                e.key === "ArrowUp"
                && focused.previousElementSibling
                && focused.previousElementSibling.classList.contains("search-result")
            ) {
                focused.classList.remove("focused");
                focused.previousElementSibling.classList.add("focused");
                focused.previousElementSibling.scrollIntoView({
                    behavior: "smooth",
                    block: "nearest",
                    inline: "nearest"
                });
            } else if (
                e.key === "Enter"
            ) {
                focused.querySelector("a").click();
            }
        }
    });
</script></body>
</html>