source: sasview/_modules/park/parameter.html @ a462c6a

gh-pages
Last change on this file since a462c6a was a462c6a, checked in by ajj, 9 years ago

Rebuild to fix index and modules docs

  • Property mode set to 100644
File size: 75.0 KB
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4
5<html xmlns="http://www.w3.org/1999/xhtml">
6  <head>
7    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8   
9    <title>park.parameter &mdash; SasView 3.0.0 documentation</title>
10   
11    <link rel="stylesheet" href="../../_static/default.css" type="text/css" />
12    <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
13   
14    <script type="text/javascript">
15      var DOCUMENTATION_OPTIONS = {
16        URL_ROOT:    '../../',
17        VERSION:     '3.0.0',
18        COLLAPSE_INDEX: false,
19        FILE_SUFFIX: '.html',
20        HAS_SOURCE:  true
21      };
22    </script>
23    <script type="text/javascript" src="../../_static/jquery.js"></script>
24    <script type="text/javascript" src="../../_static/underscore.js"></script>
25    <script type="text/javascript" src="../../_static/doctools.js"></script>
26    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
27    <link rel="top" title="SasView 3.0.0 documentation" href="../../index.html" />
28    <link rel="up" title="Module code" href="../index.html" /> 
29  </head>
30  <body>
31    <div class="related">
32      <h3>Navigation</h3>
33      <ul>
34        <li class="right" style="margin-right: 10px">
35          <a href="../../genindex.html" title="General Index"
36             accesskey="I">index</a></li>
37        <li class="right" >
38          <a href="../../py-modindex.html" title="Python Module Index"
39             >modules</a> |</li>
40        <li><a href="../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
41          <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</li> 
42      </ul>
43    </div> 
44
45    <div class="document">
46      <div class="documentwrapper">
47        <div class="bodywrapper">
48          <div class="body">
49           
50  <h1>Source code for park.parameter</h1><div class="highlight"><pre>
51<span class="c"># This program is public domain</span>
52<span class="sd">&quot;&quot;&quot;</span>
53<span class="sd">Parameters and parameter sets.</span>
54
55<span class="sd">Parameter defines an individual parameter, and ParameterSet groups them</span>
56<span class="sd">into a hierarchy.</span>
57
58<span class="sd">Individual models need to provide a parameter set with the correct</span>
59<span class="sd">properties, either by using park.ParameterSet in their model definition,</span>
60<span class="sd">or by providing a wrapper which can translate assignment to parameter.value</span>
61<span class="sd">into the appropriate change in the wrapped model.  See wrapper.py for</span>
62<span class="sd">an example.</span>
63<span class="sd">&quot;&quot;&quot;</span>
64
65<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;Parameter&#39;</span><span class="p">,</span> <span class="s">&#39;ParameterSet&#39;</span><span class="p">]</span>
66
67<span class="kn">import</span> <span class="nn">math</span>
68<span class="kn">import</span> <span class="nn">numpy</span>
69<span class="kn">import</span> <span class="nn">expression</span>       
70
71<span class="k">class</span> <span class="nc">Pnormal</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
72    <span class="sd">&quot;&quot;&quot;</span>
73<span class="sd">    Negative log likelihood function for a parameter from a Gaussian</span>
74<span class="sd">    distribution.</span>
75<span class="sd">    </span>
76<span class="sd">    Given P(v;mu,sigma) = exp(-1/2 (mu-v)^2/sigma^2)/sqrt(2 pi sigma^2)</span>
77<span class="sd">    then -log(P) = 1/2 (mu-v)^2/sigma^2 + 1/2 log(2*pi*sigma^2)</span>
78<span class="sd">    </span>
79<span class="sd">    Assuming that parameter P is selected from a normal distribution,</span>
80<span class="sd">    then P.likelihood = Pnormal(mu,sigma)</span>
81<span class="sd">    &quot;&quot;&quot;</span>
82    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mean</span><span class="p">,</span> <span class="n">std</span><span class="p">):</span>
83        <span class="bp">self</span><span class="o">.</span><span class="n">mean</span> <span class="o">=</span> <span class="n">mean</span>
84        <span class="bp">self</span><span class="o">.</span><span class="n">std</span> <span class="o">=</span> <span class="n">std</span>
85        <span class="bp">self</span><span class="o">.</span><span class="n">const</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="o">*</span><span class="n">std</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span>
86    <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
87        <span class="k">return</span> <span class="p">((</span><span class="n">value</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">mean</span><span class="p">)</span><span class="o">/</span><span class="bp">self</span><span class="o">.</span><span class="n">std</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="o">/</span><span class="mi">2</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">const</span>
88   
89<span class="n">inf</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">inf</span>
90<div class="viewcode-block" id="Parameter"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.Parameter">[docs]</a><span class="k">class</span> <span class="nc">Parameter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
91    <span class="sd">&quot;&quot;&quot;</span>
92<span class="sd">    A parameter is a box for communicating with the fitting service.</span>
93<span class="sd">    Parameters can have a number of properties, </span>
94<span class="sd">    </span>
95<span class="sd">    Parameters have a number of properties:</span>
96<span class="sd">    </span>
97<span class="sd">    name &quot;string&quot;</span>
98<span class="sd">        name of the parameter within the parameter set.  </span>
99<span class="sd">        </span>
100<span class="sd">        The name is read only.  You can rename a parameter but only </span>
101<span class="sd">        in the context of the parameter set which contains it, using</span>
102<span class="sd">        parameterset.rename(par,name).  This will change all expressions</span>
103<span class="sd">        containing the named parameter.</span>
104<span class="sd">    </span>
105<span class="sd">    path</span>
106<span class="sd">        dotted name of the parameter within the set of models.  The</span>
107<span class="sd">        dotted name is automatically generated by the parameter set</span>
108<span class="sd">        before expressions are parsed and evaluated.  There are</span>
109<span class="sd">        some operations on parameter sets (such as renaming the</span>
110<span class="sd">        layer containing a parameter) which will force an adjustment</span>
111<span class="sd">        of all the underlying parameter names, as well as any</span>
112<span class="sd">        expressions in which they are referenced.</span>
113<span class="sd">    </span>
114<span class="sd">    limits (low, high)</span>
115<span class="sd">        hard limits on the range of allowed parameter values, dictated</span>
116<span class="sd">        by physics rather than by knowledge of the particular system.</span>
117<span class="sd">        For example, thickness parameters would have limits (0,inf)</span>
118<span class="sd">        because negative thicknesses are unphysical.  These limits</span>
119<span class="sd">        are enforced when setting range for the fit.</span>
120
121<span class="sd">    units &quot;string&quot;</span>
122<span class="sd">        units for the parameter.  This should be a string, but</span>
123<span class="sd">        be parsable by whatever units package your application</span>
124<span class="sd">        supports.</span>
125
126<span class="sd">    tip &quot;string&quot;</span>
127<span class="sd">        parameter description, suitable for use in a tooltip</span>
128<span class="sd">    </span>
129<span class="sd">    value double</span>
130<span class="sd">        current value of the parameter, either fixed, fitted or computed</span>
131<span class="sd">    </span>
132<span class="sd">    range (low, high)</span>
133<span class="sd">        range of expected values for the parameter in the model</span>
134<span class="sd">    </span>
135<span class="sd">    expression &quot;string&quot;</span>
136<span class="sd">        expression for the parameter in the model.  This is a string</span>
137<span class="sd">        containing a formula for updating the parameter value based</span>
138<span class="sd">        on the values of other parameters in the system.  The expression</span>
139<span class="sd">        is ignored if &#39;calculated&#39; is False.</span>
140
141<span class="sd">        Note: the list of symbols available to the expression evaluator</span>
142<span class="sd">        defaults to the contents of the math module.  The caller will be</span>
143<span class="sd">        able to override this within the fitting fitting class.</span>
144<span class="sd">    </span>
145<span class="sd">    status &#39;fixed&#39;|&#39;computed&#39;|&#39;fitted&#39;</span>
146<span class="sd">        the parameter type.  Choose &#39;fixed&#39; if the values is to</span>
147<span class="sd">        remain fixed throughout the fit, even if a range and an</span>
148<span class="sd">        expression have been specified.  Choose &#39;computed&#39; if the</span>
149<span class="sd">        value of the parameter is to be computed each time the</span>
150<span class="sd">        parameters are updated.  Choose &#39;fitted&#39; if an optimization</span>
151<span class="sd">        algorithm is supposed to search the parameter space.</span>
152
153<span class="sd">    likelihood</span>
154<span class="sd">        function to return the negative log likelihood of seeing a</span>
155<span class="sd">        particular parameter value.  2*likelihood(value) will be added</span>
156<span class="sd">        to the total cost function for the particular parameter set</span>
157<span class="sd">        during the fit.  This will be on par with the probabilty</span>
158<span class="sd">        of seeing the particular theory function given the observed</span>
159<span class="sd">        datapoints when performing the fit (the residual term is</span>
160<span class="sd">        closely related to the log likelihood of the normal distribution).</span>
161<span class="sd">        </span>
162<span class="sd">        Note: we are minimizing chi^2 = sum [ ((y-f(x;p))/dy)^2 ] rather </span>
163<span class="sd">        than  -log P = sum [ ((y-f(x;p))/dy)^2/2 + log(2 pi dy^2) ],</span>
164<span class="sd">        where P is the probability of seeing f(x;p) given y,dy as the</span>
165<span class="sd">        mean and standard deviation of a normal distribution.  Because</span>
166<span class="sd">        chi^2_p = - 2 * log P_p + constant, the minima of p are the same</span>
167<span class="sd">        for chi^2 and negative log likelihood.  However, to weight the</span>
168<span class="sd">        likelihood properly when adding likelihood values to chisq, we</span>
169<span class="sd">        need the extra factor of 2 mentioned above.  The usual statistical</span>
170<span class="sd">        implications of normalized chi^2 will of course be suspect, both</span>
171<span class="sd">        because the assumption of independence between the points in</span>
172<span class="sd">        chi^2 (which definitely do not hold for the new &#39;point&#39; p_k), and</span>
173<span class="sd">        because of the additional 2 log(2 pi dp_k^2) constant, but given</span>
174<span class="sd">        the uncertainty in the estimate of the distribution parameters,</span>
175<span class="sd">        this is likely a minor point.</span>
176<span class="sd">    &quot;&quot;&quot;</span>
177    <span class="c"># Protect parameter name from user modification</span>
178    <span class="n">_name</span> <span class="o">=</span> <span class="s">&quot;unknown&quot;</span>
179    <span class="k">def</span> <span class="nf">_getname</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span>
180    <span class="n">name</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_getname</span><span class="p">,</span><span class="n">doc</span><span class="o">=</span><span class="s">&quot;parameter name&quot;</span><span class="p">)</span>
181   
182    <span class="c"># Do checking on the parameter range to make sure the model stays physical</span>
183    <span class="n">_range</span> <span class="o">=</span> <span class="p">(</span><span class="o">-</span><span class="n">inf</span><span class="p">,</span><span class="n">inf</span><span class="p">)</span>
184    <span class="k">def</span> <span class="nf">_setrange</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">r</span><span class="p">):</span>
185        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">limits</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">&lt;=</span><span class="n">r</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">&lt;=</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&lt;=</span><span class="bp">self</span><span class="o">.</span><span class="n">limits</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
186            <span class="bp">self</span><span class="o">.</span><span class="n">_range</span> <span class="o">=</span> <span class="n">r</span>
187        <span class="k">else</span><span class="p">:</span>
188            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s">&quot;invalid range </span><span class="si">%s</span><span class="s"> for </span><span class="si">%s</span><span class="s">&quot;</span><span class="o">%</span><span class="p">(</span><span class="n">r</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
189    <span class="k">def</span> <span class="nf">_getrange</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_range</span>
190    <span class="nb">range</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_getrange</span><span class="p">,</span><span class="n">_setrange</span><span class="p">,</span><span class="n">doc</span><span class="o">=</span><span class="s">&quot;parameter range&quot;</span><span class="p">)</span>
191
192    <span class="n">path</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
193    <span class="n">value</span> <span class="o">=</span> <span class="mf">0.</span>
194    <span class="n">limits</span> <span class="o">=</span> <span class="p">(</span><span class="o">-</span><span class="n">inf</span><span class="p">,</span><span class="n">inf</span><span class="p">)</span>
195    <span class="n">expression</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
196    <span class="n">status</span> <span class="o">=</span> <span class="s">&#39;fixed&#39;</span> <span class="c"># fixed, computed or fitted</span>
197    <span class="n">likelihood</span> <span class="o">=</span> <span class="bp">None</span>
198    <span class="n">units</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
199    <span class="n">tip</span> <span class="o">=</span> <span class="s">&quot;Fitting parameter&quot;</span>
200    <span class="n">deriv</span> <span class="o">=</span> <span class="bp">False</span>
201    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&quot;unknown&quot;</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
202        <span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="n">name</span>
203        <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="n">kw</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
204            <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="n">k</span><span class="p">):</span> <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">v</span><span class="p">)</span>
205            <span class="k">else</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="s">&quot;Unknown attribute </span><span class="si">%s</span><span class="s">&quot;</span><span class="o">%</span><span class="n">k</span><span class="p">)</span>
206    <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">!=</span> <span class="s">&#39;&#39;</span> <span class="k">else</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span>
207    <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="s">&quot;Parameter(&#39;</span><span class="si">%s</span><span class="s">&#39;)&quot;</span><span class="o">%</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span>
208<div class="viewcode-block" id="Parameter.summarize"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.Parameter.summarize">[docs]</a>    <span class="k">def</span> <span class="nf">summarize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
209        <span class="sd">&quot;&quot;&quot;</span>
210<span class="sd">        Return parameter range string.</span>
211<span class="sd">        </span>
212<span class="sd">        E.g.,  &quot;       Gold .....|.... 5.2043 in [2,7]&quot;</span>
213<span class="sd">        &quot;&quot;&quot;</span>
214        <span class="nb">range</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;.&#39;</span><span class="p">]</span><span class="o">*</span><span class="mi">10</span>
215        <span class="n">lo</span><span class="p">,</span><span class="n">hi</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">range</span>
216        <span class="n">portion</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="o">-</span><span class="n">lo</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="n">hi</span><span class="o">-</span><span class="n">lo</span><span class="p">)</span>
217        <span class="k">if</span> <span class="n">portion</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">portion</span> <span class="o">=</span> <span class="mf">0.</span>
218        <span class="k">elif</span> <span class="n">portion</span> <span class="o">&gt;=</span> <span class="mi">1</span><span class="p">:</span> <span class="n">portion</span> <span class="o">=</span> <span class="mf">0.99999999</span>
219        <span class="n">bar</span> <span class="o">=</span> <span class="n">math</span><span class="o">.</span><span class="n">floor</span><span class="p">(</span><span class="n">portion</span><span class="o">*</span><span class="nb">len</span><span class="p">(</span><span class="nb">range</span><span class="p">))</span>
220        <span class="nb">range</span><span class="p">[</span><span class="n">bar</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;|&#39;</span>
221        <span class="nb">range</span> <span class="o">=</span> <span class="s">&quot;&quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">range</span><span class="p">)</span>
222        <span class="k">return</span> <span class="s">&quot;</span><span class="si">%25s</span><span class="s"> </span><span class="si">%s</span><span class="s"> </span><span class="si">%g</span><span class="s"> in [</span><span class="si">%g</span><span class="s">,</span><span class="si">%g</span><span class="s">]&quot;</span>  <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span><span class="nb">range</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">,</span><span class="n">lo</span><span class="p">,</span><span class="n">hi</span><span class="p">)</span>
223</div>
224<div class="viewcode-block" id="Parameter.isfitted"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.Parameter.isfitted">[docs]</a>    <span class="k">def</span> <span class="nf">isfitted</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="s">&#39;fitted&#39;</span></div>
225<div class="viewcode-block" id="Parameter.iscomputed"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.Parameter.iscomputed">[docs]</a>    <span class="k">def</span> <span class="nf">iscomputed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="s">&#39;computed&#39;</span></div>
226<div class="viewcode-block" id="Parameter.isfixed"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.Parameter.isfixed">[docs]</a>    <span class="k">def</span> <span class="nf">isfixed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="s">&#39;fixed&#39;</span></div>
227<div class="viewcode-block" id="Parameter.isrestrained"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.Parameter.isrestrained">[docs]</a>    <span class="k">def</span> <span class="nf">isrestrained</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">likelihood</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span></div>
228<div class="viewcode-block" id="Parameter.isfeasible"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.Parameter.isfeasible">[docs]</a>    <span class="k">def</span> <span class="nf">isfeasible</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
229        <span class="sd">&quot;&quot;&quot;Return true if the value is in the range&quot;&quot;&quot;</span>
230        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_range</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">value</span> <span class="o">&lt;=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_range</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span></div>
231<div class="viewcode-block" id="Parameter.setprefix"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.Parameter.setprefix">[docs]</a>    <span class="k">def</span> <span class="nf">setprefix</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">prefix</span><span class="p">):</span>
232        <span class="sd">&quot;&quot;&quot;</span>
233<span class="sd">        Set the full path to the parameter as used in expressions involving</span>
234<span class="sd">        the parameter name.</span>
235<span class="sd">        &quot;&quot;&quot;</span>
236        <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">prefix</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span></div>
237<div class="viewcode-block" id="Parameter.get"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.Parameter.get">[docs]</a>    <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
238        <span class="sd">&quot;&quot;&quot;</span>
239<span class="sd">        Return the current value for a parameter.</span>
240<span class="sd">        &quot;&quot;&quot;</span>
241        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span></div>
242<div class="viewcode-block" id="Parameter.set"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.Parameter.set">[docs]</a>    <span class="k">def</span> <span class="nf">set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
243        <span class="sd">&quot;&quot;&quot;</span>
244<span class="sd">        Set a parameter to a value, a range or an expression.  If it is a value,</span>
245<span class="sd">        the parameter will be fixed for the fit.  If it is a range, the value</span>
246<span class="sd">        will be varying for the fit.  If it is an expression, the parameter will</span>
247<span class="sd">        be calculated from the values of other parameters in the fit.</span>
248
249<span class="sd">        Raises ValueError if the value could not be interpreted.</span>
250<span class="sd">        &quot;&quot;&quot;</span>
251       
252        <span class="c"># Expression</span>
253        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span><span class="nb">basestring</span><span class="p">):</span>
254            <span class="bp">self</span><span class="o">.</span><span class="n">expression</span> <span class="o">=</span> <span class="n">value</span>
255            <span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">&#39;computed&#39;</span>
256            <span class="k">return</span>
257       
258        <span class="c"># Fixed value</span>
259        <span class="k">if</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isscalar</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
260            <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">value</span>
261            <span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">&#39;fixed&#39;</span>
262            <span class="k">return</span>
263       
264        <span class="c"># Likelihood</span>
265        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">value</span><span class="p">,</span><span class="s">&#39;__call__&#39;</span><span class="p">):</span>
266            <span class="bp">self</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">range</span>
267            <span class="bp">self</span><span class="o">.</span><span class="n">likelihood</span> <span class="o">=</span> <span class="n">value</span>
268            <span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">&#39;fitted&#39;</span>
269            <span class="k">return</span>
270       
271        <span class="c"># Range</span>
272        <span class="k">try</span><span class="p">:</span>
273            <span class="n">lo</span><span class="p">,</span><span class="n">hi</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
274            <span class="k">if</span> <span class="ow">not</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isscalar</span><span class="p">(</span><span class="n">lo</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isscalar</span><span class="p">(</span><span class="n">hi</span><span class="p">):</span>
275                <span class="k">raise</span> <span class="ne">Exception</span>
276            <span class="bp">self</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="p">(</span><span class="n">lo</span><span class="p">,</span><span class="n">hi</span><span class="p">)</span>
277            <span class="bp">self</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="s">&#39;fitted&#39;</span>
278            <span class="k">return</span>
279        <span class="k">except</span><span class="p">:</span>
280            <span class="k">pass</span>
281       
282        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">,</span>\
283            <span class="s">&quot;parameter </span><span class="si">%s</span><span class="s"> expects value, expression or range: </span><span class="si">%s</span><span class="s">&quot;</span><span class="o">%</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span><span class="n">value</span><span class="p">)</span>
284</div></div>
285<div class="viewcode-block" id="ParameterSet"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.ParameterSet">[docs]</a><span class="k">class</span> <span class="nc">ParameterSet</span><span class="p">(</span><span class="nb">list</span><span class="p">):</span>
286    <span class="sd">&quot;&quot;&quot;</span>
287<span class="sd">    The set of parameters used to fit theory to data.</span>
288<span class="sd">    </span>
289<span class="sd">    ParameterSet forms a hierarchy of parameters.  The parameters themselves</span>
290<span class="sd">    are referred to by the path through the hierarchy, usually::</span>
291<span class="sd">    </span>
292<span class="sd">         fitname.component.parameter</span>
293<span class="sd">         </span>
294<span class="sd">    Though more or fewer levels are permitted.  Parameters are assumed to</span>
295<span class="sd">    have a unique label throughout the fit.  This is required so that</span>
296<span class="sd">    expressions tying the results of one fit to another can uniquely</span>
297<span class="sd">    reference a parameter.</span>
298<span class="sd">    </span>
299<span class="sd">    Attributes:</span>
300<span class="sd">    </span>
301<span class="sd">    name</span>
302<span class="sd">        the name of the parameter set</span>
303<span class="sd">    path</span>
304<span class="sd">        the full dotted name of the parameter set</span>
305<span class="sd">    context</span>
306<span class="sd">        a dictionary providing additional context for evaluating parameters;</span>
307<span class="sd">        Note that this namespace is shared with other theory functions, so</span>
308<span class="sd">        populate it carefully.</span>
309<span class="sd">    &quot;&quot;&quot;</span>
310    <span class="c"># Protect parameter set name from user modification</span>
311    <span class="k">def</span> <span class="nf">_getname</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name</span>
312    <span class="k">def</span> <span class="nf">_setname</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span> 
313        <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">&quot;parameter.name is protected; use fit.rename_parameter() to change it&quot;</span><span class="p">)</span>
314    <span class="n">name</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_getname</span><span class="p">,</span><span class="n">doc</span><span class="o">=</span><span class="s">&quot;parameter name&quot;</span><span class="p">)</span>
315    <span class="n">path</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
316    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="s">&quot;unknown&quot;</span><span class="p">,</span> <span class="n">pars</span><span class="o">=</span><span class="p">[]):</span>
317        <span class="nb">super</span><span class="p">(</span><span class="n">ParameterSet</span><span class="p">,</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="n">pars</span><span class="p">)</span>
318        <span class="bp">self</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="n">name</span>
319        <span class="bp">self</span><span class="o">.</span><span class="n">context</span> <span class="o">=</span> <span class="p">{}</span>
320
321    <span class="k">def</span> <span class="nf">_byname</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parts</span><span class="p">):</span>
322        <span class="sd">&quot;&quot;&quot;byname recursion function&quot;&quot;&quot;</span>
323        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">return</span> <span class="bp">self</span>
324        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
325            <span class="k">if</span> <span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">p</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
326                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
327                    <span class="k">return</span> <span class="n">p</span>
328                <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">ParameterSet</span><span class="p">):</span>
329                    <span class="k">return</span> <span class="n">p</span><span class="o">.</span><span class="n">_byname</span><span class="p">(</span><span class="n">parts</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
330                <span class="k">else</span><span class="p">:</span>
331                    <span class="k">raise</span>
332        <span class="k">return</span> <span class="bp">None</span>
333
334<div class="viewcode-block" id="ParameterSet.byname"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.ParameterSet.byname">[docs]</a>    <span class="k">def</span> <span class="nf">byname</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
335        <span class="sd">&quot;&quot;&quot;Lookup parameter from dotted path&quot;&quot;&quot;</span>
336        <span class="n">parts</span> <span class="o">=</span> <span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">)</span>
337        <span class="k">if</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">:</span>
338            <span class="n">p</span> <span class="o">=</span>  <span class="bp">self</span><span class="o">.</span><span class="n">_byname</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;.&#39;</span><span class="p">))</span>
339            <span class="k">if</span> <span class="n">p</span><span class="p">:</span> <span class="k">return</span> <span class="n">p</span>
340        <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="s">&quot;parameter </span><span class="si">%s</span><span class="s"> not in parameter set&quot;</span><span class="o">%</span><span class="n">name</span><span class="p">)</span>
341    </div>
342    <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
343        <span class="sd">&quot;&quot;&quot;Allow indexing by name or by number&quot;&quot;&quot;</span>
344        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span><span class="nb">basestring</span><span class="p">):</span>
345            <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
346                <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">idx</span><span class="p">:</span> 
347                    <span class="k">return</span> <span class="n">p</span>
348            <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="s">&quot;</span><span class="si">%s</span><span class="s"> is not in the parameter set&quot;</span><span class="o">%</span><span class="n">idx</span><span class="p">)</span>
349        <span class="k">else</span><span class="p">:</span>
350            <span class="k">return</span> <span class="nb">super</span><span class="p">(</span><span class="n">ParameterSet</span><span class="p">,</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">__getitem__</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span>
351
352<div class="viewcode-block" id="ParameterSet.flatten"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.ParameterSet.flatten">[docs]</a>    <span class="k">def</span> <span class="nf">flatten</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
353        <span class="sd">&quot;&quot;&quot;</span>
354<span class="sd">        Iterate over the elements in depth first order.</span>
355<span class="sd">        &quot;&quot;&quot;</span>
356        <span class="kn">import</span> <span class="nn">park</span>
357        <span class="n">L</span> <span class="o">=</span> <span class="p">[]</span>
358        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
359            <span class="c"># Yuck! I really only want to try flattening if p is a</span>
360            <span class="c"># ParameterSet but it seems we have parameter.ParameterSet</span>
361            <span class="c"># and park.parameter.ParameterSet as separate entities,</span>
362            <span class="c"># depending on how things were included.  The solution is</span>
363            <span class="c"># probably to force absolute include paths always.</span>
364            <span class="k">try</span><span class="p">:</span>
365                <span class="n">L</span> <span class="o">+=</span> <span class="n">p</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
366            <span class="k">except</span><span class="p">:</span>
367                <span class="n">L</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
368        <span class="k">return</span> <span class="n">L</span>
369        <span class="sd">&quot;&quot;&quot;</span>
370<span class="sd">        # Iterators are cute but too hard to use since you can</span>
371<span class="sd">        # only use them in a [p for p in generator()] once.</span>
372<span class="sd">        for p in self:</span>
373<span class="sd">            if isinstance(p, ParameterSet):</span>
374<span class="sd">                for subp in p.flatten(): </span>
375<span class="sd">                    yield subp</span>
376<span class="sd">            else: </span>
377<span class="sd">                yield p</span>
378<span class="sd">        &quot;&quot;&quot;</span>
379</div>
380    <span class="k">def</span> <span class="nf">_fixed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
381        <span class="sd">&quot;&quot;&quot;</span>
382<span class="sd">        Return the subset of the parameters which are fixed</span>
383<span class="sd">        &quot;&quot;&quot;</span>
384        <span class="k">return</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span> <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">isfixed</span><span class="p">()]</span>
385    <span class="n">fixed</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_fixed</span><span class="p">,</span><span class="n">doc</span><span class="o">=</span><span class="n">_fixed</span><span class="o">.</span><span class="n">__doc__</span><span class="p">)</span>
386
387    <span class="k">def</span> <span class="nf">_fitted</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
388        <span class="sd">&quot;&quot;&quot;</span>
389<span class="sd">        Return the subset of the paramters which are varying</span>
390<span class="sd">        &quot;&quot;&quot;</span>
391        <span class="k">return</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span> <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">isfitted</span><span class="p">()]</span>
392    <span class="n">fitted</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_fitted</span><span class="p">,</span><span class="n">doc</span><span class="o">=</span><span class="n">_fitted</span><span class="o">.</span><span class="n">__doc__</span><span class="p">)</span>
393
394    <span class="k">def</span> <span class="nf">_computed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
395        <span class="sd">&quot;&quot;&quot;</span>
396<span class="sd">        Return the subset of the parameters which are calculated</span>
397<span class="sd">        &quot;&quot;&quot;</span>
398        <span class="k">return</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span> <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">iscomputed</span><span class="p">()]</span>
399    <span class="n">computed</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_computed</span><span class="p">,</span><span class="n">doc</span><span class="o">=</span><span class="n">_computed</span><span class="o">.</span><span class="n">__doc__</span><span class="p">)</span>
400
401    <span class="k">def</span> <span class="nf">_restrained</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
402        <span class="sd">&quot;&quot;&quot;</span>
403<span class="sd">        Return the subset of the parameters which have a likelihood</span>
404<span class="sd">        function associated with them.</span>
405<span class="sd">        &quot;&quot;&quot;</span>
406        <span class="k">return</span> <span class="p">[</span><span class="n">p</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span> <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">isrestrained</span><span class="p">()]</span>
407    <span class="n">restrained</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_restrained</span><span class="p">,</span><span class="n">doc</span><span class="o">=</span><span class="n">_restrained</span><span class="o">.</span><span class="n">__doc__</span><span class="p">)</span>
408
409<div class="viewcode-block" id="ParameterSet.setprefix"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.ParameterSet.setprefix">[docs]</a>    <span class="k">def</span> <span class="nf">setprefix</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">prefix</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
410        <span class="sd">&quot;&quot;&quot;</span>
411<span class="sd">        Fill in the full path name for all the parameters in the tree.</span>
412<span class="sd">        </span>
413<span class="sd">        Note: this function must be called from the root parameter set</span>
414<span class="sd">        to build proper path names.</span>
415<span class="sd">        </span>
416<span class="sd">        This is required before converting parameter expressions into</span>
417<span class="sd">        function calls.</span>
418<span class="sd">        &quot;&quot;&quot;</span>
419        <span class="k">if</span> <span class="n">prefix</span> <span class="o">==</span> <span class="bp">None</span><span class="p">:</span>
420            <span class="c"># We are called from root, so we don&#39;t have a path</span>
421            <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
422            <span class="n">prefix</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
423        <span class="k">else</span><span class="p">:</span>
424            <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">=</span> <span class="n">prefix</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span>
425            <span class="n">prefix</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span><span class="o">+</span><span class="s">&#39;.&#39;</span>
426        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
427            <span class="c">#print &quot;setting prefix for&quot;,p,prefix</span>
428            <span class="n">p</span><span class="o">.</span><span class="n">setprefix</span><span class="p">(</span><span class="n">prefix</span><span class="p">)</span>
429</div>
430<div class="viewcode-block" id="ParameterSet.rename"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.ParameterSet.rename">[docs]</a>    <span class="k">def</span> <span class="nf">rename</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">par</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
431        <span class="sd">&quot;&quot;&quot;</span>
432<span class="sd">        Rename the parameter to something new.</span>
433<span class="sd">        Called from root of the parameter hierarchy, rename the particular</span>
434<span class="sd">        parameter object to something else.</span>
435
436<span class="sd">        This changes the internal name of the parameter, as well as all</span>
437<span class="sd">        expressions in which it occurs.  If the parameter is actually</span>
438<span class="sd">        a parameter set, then it renames all parameters in the set.</span>
439<span class="sd">        &quot;&quot;&quot;</span>
440       
441        <span class="c"># Must run from root for self.setprefix and self.computed to work</span>
442        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">path</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> 
443            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span><span class="s">&quot;rename must be called from root parameter set&quot;</span>
444
445        <span class="c"># Change the name of the node</span>
446        <span class="n">par</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="n">name</span>
447       
448        <span class="c"># Determine which nodes (self and children) are affected</span>
449        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">par</span><span class="p">,</span><span class="n">ParameterSet</span><span class="p">):</span>
450            <span class="n">changeset</span> <span class="o">=</span> <span class="n">par</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
451        <span class="k">else</span><span class="p">:</span>
452            <span class="n">changeset</span> <span class="o">=</span> <span class="p">[</span><span class="n">par</span><span class="p">]</span>
453       
454        <span class="c">#  Map the old names into the new names</span>
455        <span class="n">old</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span><span class="o">.</span><span class="n">path</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">changeset</span><span class="p">]</span>
456        <span class="bp">self</span><span class="o">.</span><span class="n">setprefix</span><span class="p">()</span> <span class="c"># Reset the path names of all parameters</span>
457        <span class="n">new</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span><span class="o">.</span><span class="n">path</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">changeset</span><span class="p">]</span>
458        <span class="n">mapping</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">old</span><span class="p">,</span><span class="n">new</span><span class="p">))</span>
459
460        <span class="c"># Perform the substitution into all of the expressions</span>
461        <span class="n">exprs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">computed</span>
462        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">exprs</span><span class="p">:</span>
463            <span class="n">p</span><span class="o">.</span><span class="n">expression</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">substitute</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">expression</span><span class="p">,</span> <span class="n">mapping</span><span class="p">)</span>
464</div>
465<div class="viewcode-block" id="ParameterSet.gather_context"><a class="viewcode-back" href="../../dev/api/park.html#park.parameter.ParameterSet.gather_context">[docs]</a>    <span class="k">def</span> <span class="nf">gather_context</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
466        <span class="sd">&quot;&quot;&quot;</span>
467<span class="sd">        Gather all additional symbols that can be used in expressions.</span>
468<span class="sd">        </span>
469<span class="sd">        For example, if reflectometry provides a volume fraction</span>
470<span class="sd">        function volfrac(rho1,rho2,frac) to compute densities, then</span>
471<span class="sd">        this function can be added as a context dictionary to the</span>
472<span class="sd">        reflectometry parameter set.  Note that there is no guarantee</span>
473<span class="sd">        which function will be used if the same function exists in</span>
474<span class="sd">        two separate contexts.</span>
475<span class="sd">        &quot;&quot;&quot;</span>
476        <span class="n">context</span> <span class="o">=</span> <span class="p">{}</span> <span class="c"># Create a new dictionary</span>
477        <span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">context</span><span class="p">)</span>
478        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
479            <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">p</span><span class="p">,</span><span class="s">&#39;gather_context&#39;</span><span class="p">):</span>
480                <span class="n">context</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">gather_context</span><span class="p">())</span>
481        <span class="k">return</span> <span class="n">context</span>
482
483</div></div>
484<span class="k">def</span> <span class="nf">test</span><span class="p">():</span>
485    <span class="c"># Check single parameter</span>
486    <span class="n">a</span> <span class="o">=</span> <span class="n">Parameter</span><span class="p">(</span><span class="s">&#39;a&#39;</span><span class="p">)</span>
487    <span class="k">assert</span> <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s">&#39;a&#39;</span>
488    <span class="n">a</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="mi">5</span>
489    <span class="k">assert</span> <span class="n">a</span><span class="o">.</span><span class="n">value</span> <span class="o">==</span> <span class="mi">5</span>
490    <span class="c"># Check the setters</span>
491    <span class="n">a</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span>
492    <span class="k">assert</span> <span class="n">a</span><span class="o">.</span><span class="n">value</span> <span class="o">==</span> <span class="mi">7</span> <span class="ow">and</span> <span class="n">a</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="s">&#39;fixed&#39;</span> <span class="ow">and</span> <span class="n">a</span><span class="o">.</span><span class="n">isfixed</span><span class="p">()</span>
493    <span class="n">a</span><span class="o">.</span><span class="n">set</span><span class="p">([</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">])</span>
494    <span class="k">assert</span> <span class="n">a</span><span class="o">.</span><span class="n">value</span> <span class="o">==</span> <span class="mi">7</span> <span class="ow">and</span> <span class="n">a</span><span class="o">.</span><span class="n">range</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">3</span> <span class="ow">and</span> <span class="n">a</span><span class="o">.</span><span class="n">range</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">==</span><span class="mi">5</span> <span class="ow">and</span> <span class="n">a</span><span class="o">.</span><span class="n">isfitted</span><span class="p">()</span>
495    <span class="n">a</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s">&#39;3*M.b&#39;</span><span class="p">)</span>
496    <span class="k">assert</span> <span class="n">a</span><span class="o">.</span><span class="n">iscomputed</span><span class="p">()</span> <span class="ow">and</span> <span class="n">a</span><span class="o">.</span><span class="n">expression</span> <span class="o">==</span> <span class="s">&#39;3*M.b&#39;</span>
497
498    <span class="c"># Check limits</span>
499    <span class="n">a</span><span class="o">.</span><span class="n">limits</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">inf</span><span class="p">)</span>
500    <span class="k">try</span><span class="p">:</span> 
501        <span class="n">a</span><span class="o">.</span><span class="n">range</span> <span class="o">=</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span>
502        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">,</span><span class="s">&quot;Failed to check range in limits&quot;</span>
503    <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span> <span class="k">pass</span> <span class="c"># Correct failure</span>
504   
505    <span class="c"># Check that we can&#39;t change name directly</span>
506    <span class="k">try</span><span class="p">:</span>
507        <span class="n">a</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">&#39;Q&#39;</span>
508        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">,</span><span class="s">&quot;Failed to protect name&quot;</span>
509    <span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span> <span class="k">pass</span> <span class="c"># Correct failure</span>
510
511    <span class="k">assert</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">==</span> <span class="s">&#39;a&#39;</span>  <span class="c"># Before setpath, just print name</span>
512    <span class="n">a</span><span class="o">.</span><span class="n">setprefix</span><span class="p">(</span><span class="s">&#39;M.&#39;</span><span class="p">)</span>
513    <span class="k">assert</span> <span class="n">a</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="s">&#39;M.a&#39;</span>
514    <span class="k">assert</span> <span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">==</span> <span class="s">&#39;M.a&#39;</span>  <span class="c"># After setpath, print path</span>
515    <span class="k">assert</span> <span class="n">a</span><span class="o">.</span><span class="n">units</span> <span class="o">==</span> <span class="s">&#39;&#39;</span>
516    <span class="n">a</span><span class="o">.</span><span class="n">units</span> <span class="o">=</span> <span class="s">&#39;kg&#39;</span>
517    <span class="k">assert</span> <span class="n">a</span><span class="o">.</span><span class="n">units</span> <span class="o">==</span> <span class="s">&#39;kg&#39;</span>
518    <span class="k">assert</span> <span class="nb">repr</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">==</span> <span class="s">&quot;Parameter(&#39;a&#39;)&quot;</span>
519
520    <span class="c"># Check parameter set</span>
521    <span class="n">b</span><span class="p">,</span><span class="n">c</span> <span class="o">=</span> <span class="n">Parameter</span><span class="p">(</span><span class="s">&#39;b&#39;</span><span class="p">),</span><span class="n">Parameter</span><span class="p">(</span><span class="s">&#39;c&#39;</span><span class="p">)</span>
522    <span class="n">M1</span> <span class="o">=</span> <span class="n">ParameterSet</span><span class="p">(</span><span class="s">&#39;M1&#39;</span><span class="p">,[</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span><span class="p">])</span>
523    <span class="k">assert</span> <span class="n">M1</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">is</span> <span class="n">a</span>
524    <span class="k">assert</span> <span class="n">M1</span><span class="p">[</span><span class="s">&#39;a&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="n">a</span>
525    <span class="n">a</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="c"># one value</span>
526    <span class="n">b</span><span class="o">.</span><span class="n">set</span><span class="p">([</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">])</span>
527    <span class="n">c</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s">&#39;3*M1.a&#39;</span><span class="p">)</span>
528    <span class="k">assert</span> <span class="n">M1</span><span class="o">.</span><span class="n">computed</span> <span class="o">==</span> <span class="p">[</span><span class="n">c</span><span class="p">]</span>
529    <span class="k">assert</span> <span class="n">M1</span><span class="o">.</span><span class="n">fitted</span> <span class="o">==</span> <span class="p">[</span><span class="n">b</span><span class="p">]</span>
530    <span class="k">assert</span> <span class="n">M1</span><span class="o">.</span><span class="n">fixed</span> <span class="o">==</span> <span class="p">[</span><span class="n">a</span><span class="p">]</span>
531    <span class="n">d</span> <span class="o">=</span> <span class="n">Parameter</span><span class="p">(</span><span class="s">&#39;d&#39;</span><span class="p">)</span>
532    <span class="n">M1</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">d</span><span class="p">)</span>
533    <span class="k">assert</span> <span class="n">M1</span><span class="o">.</span><span class="n">fixed</span> <span class="o">==</span> <span class="p">[</span><span class="n">d</span><span class="p">,</span><span class="n">a</span><span class="p">]</span>
534    <span class="n">e</span> <span class="o">=</span> <span class="n">Parameter</span><span class="p">(</span><span class="s">&#39;e&#39;</span><span class="p">)</span>
535    <span class="n">M1</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
536    <span class="k">assert</span> <span class="n">M1</span><span class="o">.</span><span class="n">fixed</span> <span class="o">==</span> <span class="p">[</span><span class="n">d</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">e</span><span class="p">]</span>
537
538    <span class="n">a2</span><span class="p">,</span><span class="n">b2</span><span class="p">,</span><span class="n">c2</span> <span class="o">=</span> <span class="p">[</span><span class="n">Parameter</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="p">(</span><span class="s">&#39;a&#39;</span><span class="p">,</span><span class="s">&#39;b&#39;</span><span class="p">,</span><span class="s">&#39;c&#39;</span><span class="p">)]</span>
539    <span class="n">a2</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="mi">15</span><span class="p">)</span>
540    <span class="n">M2</span> <span class="o">=</span> <span class="n">ParameterSet</span><span class="p">(</span><span class="s">&#39;M2&#39;</span><span class="p">,[</span><span class="n">a2</span><span class="p">,</span><span class="n">b2</span><span class="p">,</span><span class="n">c2</span><span class="p">])</span>
541    <span class="c"># Adjust parameter in set</span>
542    <span class="n">b2</span><span class="o">.</span><span class="n">set</span><span class="p">([</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">])</span>
543    <span class="k">assert</span> <span class="n">M2</span><span class="o">.</span><span class="n">fitted</span> <span class="o">==</span> <span class="p">[</span><span class="n">b2</span><span class="p">]</span>
544   
545    <span class="c"># Hierarchical parameter sets</span>
546    <span class="n">r</span> <span class="o">=</span> <span class="n">Parameter</span><span class="p">(</span><span class="s">&#39;r&#39;</span><span class="p">)</span>
547    <span class="n">root</span> <span class="o">=</span> <span class="n">ParameterSet</span><span class="p">(</span><span class="s">&#39;root&#39;</span><span class="p">,[</span><span class="n">M1</span><span class="p">,</span><span class="n">r</span><span class="p">,</span><span class="n">M2</span><span class="p">])</span>
548    <span class="k">assert</span> <span class="n">root</span><span class="o">.</span><span class="n">fixed</span> <span class="o">==</span> <span class="p">[</span><span class="n">d</span><span class="p">,</span><span class="n">a</span><span class="p">,</span><span class="n">e</span><span class="p">,</span><span class="n">r</span><span class="p">,</span><span class="n">a2</span><span class="p">,</span><span class="n">c2</span><span class="p">]</span>
549    <span class="k">assert</span> <span class="n">root</span><span class="o">.</span><span class="n">fitted</span> <span class="o">==</span> <span class="p">[</span><span class="n">b</span><span class="p">,</span><span class="n">b2</span><span class="p">]</span>
550    <span class="k">assert</span> <span class="n">root</span><span class="o">.</span><span class="n">computed</span> <span class="o">==</span> <span class="p">[</span><span class="n">c</span><span class="p">]</span>
551    <span class="n">root</span><span class="o">.</span><span class="n">setprefix</span><span class="p">()</span>
552    <span class="k">assert</span> <span class="n">a2</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="s">&quot;M2.a&quot;</span>
553    <span class="c"># Rename individual parameter</span>
554    <span class="n">root</span><span class="o">.</span><span class="n">rename</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="s">&#39;a1&#39;</span><span class="p">)</span>
555    <span class="k">assert</span> <span class="n">a</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="s">&quot;M1.a1&quot;</span>
556    <span class="k">assert</span> <span class="n">c</span><span class="o">.</span><span class="n">expression</span> <span class="o">==</span> <span class="s">&quot;3*M1.a1&quot;</span>
557    <span class="c"># Rename parameter set</span>
558    <span class="n">root</span><span class="o">.</span><span class="n">rename</span><span class="p">(</span><span class="n">M1</span><span class="p">,</span><span class="s">&#39;m1&#39;</span><span class="p">)</span>
559    <span class="k">assert</span> <span class="n">c</span><span class="o">.</span><span class="n">path</span> <span class="o">==</span> <span class="s">&quot;m1.c&quot;</span>
560    <span class="k">assert</span> <span class="n">c</span><span class="o">.</span><span class="n">expression</span> <span class="o">==</span> <span class="s">&quot;3*m1.a1&quot;</span>
561
562    <span class="c"># Integration test: parameter and expression working together.</span>
563    <span class="n">fn</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">build_eval</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">flatten</span><span class="p">(),</span> <span class="n">root</span><span class="o">.</span><span class="n">gather_context</span><span class="p">())</span>
564    <span class="c">#import dis; dis.dis(fn)</span>
565    <span class="n">fn</span><span class="p">()</span>
566    <span class="k">assert</span> <span class="n">c</span><span class="o">.</span><span class="n">value</span> <span class="o">==</span> <span class="mi">3</span><span class="o">*</span><span class="n">a</span><span class="o">.</span><span class="n">value</span>
567
568    <span class="c"># Test context</span>
569    <span class="n">M2</span><span class="o">.</span><span class="n">context</span><span class="p">[</span><span class="s">&#39;plus2&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">+</span><span class="mi">2</span>
570    <span class="n">c2</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s">&#39;plus2(M2.a)&#39;</span><span class="p">)</span>
571    <span class="k">assert</span> <span class="nb">set</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">computed</span><span class="p">)</span> <span class="o">==</span> <span class="nb">set</span><span class="p">([</span><span class="n">c</span><span class="p">,</span><span class="n">c2</span><span class="p">])</span>
572    <span class="n">fn</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">build_eval</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">flatten</span><span class="p">(),</span> <span class="n">root</span><span class="o">.</span><span class="n">gather_context</span><span class="p">())</span>
573    <span class="c">#print dis.dis(fn)</span>
574    <span class="n">fn</span><span class="p">()</span>
575    <span class="k">assert</span> <span class="n">c2</span><span class="o">.</span><span class="n">value</span> <span class="o">==</span> <span class="n">a2</span><span class="o">.</span><span class="n">value</span><span class="o">+</span><span class="mi">2</span>
576
577    <span class="c"># Multilevel hierarchy</span>
578    <span class="c"># Forming M3.a.x, M3.a.y, M3.b with M3.a.y = 2*M3.b+M3.a.x</span>
579    <span class="n">x</span> <span class="o">=</span> <span class="n">Parameter</span><span class="p">(</span><span class="s">&#39;x&#39;</span><span class="p">);</span> <span class="n">x</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="mi">15</span><span class="p">)</span>
580    <span class="n">y</span> <span class="o">=</span> <span class="n">Parameter</span><span class="p">(</span><span class="s">&#39;y&#39;</span><span class="p">);</span> <span class="n">y</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s">&#39;2*M3.b+M3.a.x&#39;</span><span class="p">)</span>
581    <span class="n">b</span> <span class="o">=</span> <span class="n">Parameter</span><span class="p">(</span><span class="s">&#39;b&#39;</span><span class="p">);</span> <span class="n">b</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
582    <span class="n">a</span> <span class="o">=</span> <span class="n">ParameterSet</span><span class="p">(</span><span class="s">&#39;a&#39;</span><span class="p">,[</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">])</span>
583    <span class="n">M3</span> <span class="o">=</span> <span class="n">ParameterSet</span><span class="p">(</span><span class="s">&#39;M3&#39;</span><span class="p">,[</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">])</span>
584    <span class="n">root</span> <span class="o">=</span> <span class="n">ParameterSet</span><span class="p">(</span><span class="s">&#39;root&#39;</span><span class="p">,[</span><span class="n">M3</span><span class="p">])</span>
585    <span class="n">root</span><span class="o">.</span><span class="n">setprefix</span><span class="p">()</span>
586    <span class="n">fn</span> <span class="o">=</span> <span class="n">expression</span><span class="o">.</span><span class="n">build_eval</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">flatten</span><span class="p">(),</span> <span class="n">root</span><span class="o">.</span><span class="n">gather_context</span><span class="p">())</span>
587    <span class="c">#import dis; dis.dis(fn)</span>
588    <span class="n">fn</span><span class="p">()</span>
589    <span class="c">#print &quot;y-value:&quot;,y.value</span>
590    <span class="k">assert</span> <span class="n">y</span><span class="o">.</span><span class="n">value</span> <span class="o">==</span> <span class="mi">35</span>
591   
592
593
594
595<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">&quot;__main__&quot;</span><span class="p">:</span> <span class="n">test</span><span class="p">()</span>
596</pre></div>
597
598          </div>
599        </div>
600      </div>
601      <div class="sphinxsidebar">
602        <div class="sphinxsidebarwrapper">
603<div id="searchbox" style="display: none">
604  <h3>Quick search</h3>
605    <form class="search" action="../../search.html" method="get">
606      <input type="text" name="q" />
607      <input type="submit" value="Go" />
608      <input type="hidden" name="check_keywords" value="yes" />
609      <input type="hidden" name="area" value="default" />
610    </form>
611    <p class="searchtip" style="font-size: 90%">
612    Enter search terms or a module, class or function name.
613    </p>
614</div>
615<script type="text/javascript">$('#searchbox').show(0);</script>
616        </div>
617      </div>
618      <div class="clearer"></div>
619    </div>
620    <div class="related">
621      <h3>Navigation</h3>
622      <ul>
623        <li class="right" style="margin-right: 10px">
624          <a href="../../genindex.html" title="General Index"
625             >index</a></li>
626        <li class="right" >
627          <a href="../../py-modindex.html" title="Python Module Index"
628             >modules</a> |</li>
629        <li><a href="../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
630          <li><a href="../index.html" >Module code</a> &raquo;</li> 
631      </ul>
632    </div>
633    <div class="footer">
634        &copy; Copyright 2013, The SasView Project.
635      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
636    </div>
637  </body>
638</html>
Note: See TracBrowser for help on using the repository browser.