source: sasview/_modules/park/assembly.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: 80.2 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.assembly &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.assembly</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">An assembly is a collection of fitting functions.  This provides</span>
54<span class="sd">the model representation that is the basis of the park fitting engine.</span>
55
56<span class="sd">Models can range from very simple one dimensional theory functions</span>
57<span class="sd">to complex assemblies of multidimensional datasets from different</span>
58<span class="sd">experimental techniques, each with their own theory function and</span>
59<span class="sd">a common underlying physical model.</span>
60
61<span class="sd">Usage</span>
62<span class="sd">=====</span>
63
64<span class="sd">First define the models you want to work with.  In the example</span>
65<span class="sd">below we will use an example of a simple multilayer system measured by</span>
66<span class="sd">specular reflection of xrays and neutrons.  The gold depth is the only</span>
67<span class="sd">fitting parameter, ranging from 10-30 A.  The interface depths are</span>
68<span class="sd">tied together using expressions.  In this case the expression is</span>
69<span class="sd">a simple copy, but any standard math functions can be used.  Some</span>
70<span class="sd">model developers may provide additional functions for use with the</span>
71<span class="sd">expression.</span>
72
73<span class="sd">Example models::</span>
74
75<span class="sd">    import reflectometry.model1d as refl</span>
76<span class="sd">    xray = refl.model(&#39;xray&#39;)</span>
77<span class="sd">    xray.incident(&#39;Air&#39;,rho=0)</span>
78<span class="sd">    xray.interface(&#39;iAu&#39;,sigma=5)</span>
79<span class="sd">    xray.layer(&#39;Au&#39;,rho=124.68,depth=[10,30])</span>
80<span class="sd">    xray.interface(&#39;iSi&#39;,sigma=5)</span>
81<span class="sd">    xray.substrate(&#39;Si&#39;,rho=20.07)</span>
82<span class="sd">    datax = refl.data(&#39;xray.dat&#39;)</span>
83
84<span class="sd">    neutron = refl.model(&#39;neutron&#39;)</span>
85<span class="sd">    neutron.incident(&#39;Air&#39;,rho=0)</span>
86<span class="sd">    neutron.interface(&#39;iAu&#39;,sigma=&#39;xray.iAu&#39;)</span>
87<span class="sd">    neutron.layer(&#39;Au&#39;,rho=4.66,depth=&#39;xray.Au.depth&#39;)</span>
88<span class="sd">    neutron.interface(&#39;iSi&#39;,sigma=&#39;xray.iSi&#39;)</span>
89<span class="sd">    neutron.substrate(&#39;Si&#39;,rho=2.07)</span>
90<span class="sd">    datan = refl.data(&#39;neutron.dat&#39;)</span>
91
92<span class="sd">As you can see from the above, parameters can be set to a value if</span>
93<span class="sd">the parameter is fixed, to a range if the parametemr is fitted, or</span>
94<span class="sd">to a string expression if the parameter is calculated from other</span>
95<span class="sd">parameters.  See park.Parameter.set for further details.</span>
96
97<span class="sd">Having constructed the models, we can now create an assembly::</span>
98
99<span class="sd">    import park</span>
100<span class="sd">    assembly = park.Assembly([(xray,datax), (neutron,datan)])</span>
101
102<span class="sd">Note: this would normally be done in the context of a fit</span>
103<span class="sd">using fit = park.Fit([(xray,datax), (neutron,datan)]), and later referenced</span>
104<span class="sd">using fit.assembly.</span>
105
106<span class="sd">Individual parts of the assembly are accessable using the</span>
107<span class="sd">model number 0, 1, 2... or by the model name.  In the above,</span>
108<span class="sd">assembly[0] and assembly[&#39;xray&#39;] refer to the same model.</span>
109<span class="sd">Assemblies have insert and append functions for adding new</span>
110<span class="sd">models, and &quot;del model[idx]&quot; for removing them.</span>
111
112<span class="sd">Once the assembly is created computing the values for the system</span>
113<span class="sd">is a matter of calling::</span>
114
115<span class="sd">    assembly.eval()</span>
116<span class="sd">    print &quot;Chi**2&quot;,assembly.chisq</span>
117<span class="sd">    print &quot;Reduced chi**2&quot;,assembly.chisq/assembly.degrees_of_freedom</span>
118<span class="sd">    plot(arange(len(assembly.residuals)), assembly.residuals)</span>
119
120<span class="sd">This defines the attributes residuals, degrees_of_freedom and chisq,</span>
121<span class="sd">which is what the optimizer uses as the cost function to minimize.</span>
122
123<span class="sd">assembly.eval uses the current values for the parameters in the</span>
124<span class="sd">individual models.  These parameters can be changed directly</span>
125<span class="sd">in the model.  In the reflectometry example above, you could</span>
126<span class="sd">set the gold thickness using xray.layer.Au.depth=156, or</span>
127<span class="sd">something similar (the details are model specific).  Parameters</span>
128<span class="sd">can also be changed through the assembly parameter set.  In the same</span>
129<span class="sd">example, this would be assembly.parameterset[&#39;xray&#39;][&#39;Au&#39;][&#39;depth&#39;].</span>
130<span class="sd">See parameter set for details.</span>
131
132<span class="sd">In the process of modeling data, particularly with multiple</span>
133<span class="sd">datasets, you will sometimes want to temporarily ignore</span>
134<span class="sd">how well one of the datasets matches so that you</span>
135<span class="sd">can more quickly refine the model for the other datasets,</span>
136<span class="sd">or see how particular models are influencing the fit.  To</span>
137<span class="sd">temporarily ignore the xray data in the example above use::</span>
138
139<span class="sd">    assembly.parts[0].isfitted = False</span>
140
141<span class="sd">The model itself isn&#39;t ignored since its parameters may be</span>
142<span class="sd">needed to compute the parameters for other models.  To</span>
143<span class="sd">reenable checking against the xray data, you would assign</span>
144<span class="sd">a True value instead.  More subtle weighting of the models</span>
145<span class="sd">can be controlled using assembly.parts[idx].weight, but</span>
146<span class="sd">see below for a note on model weighting.</span>
147
148<span class="sd">A note on model weighting</span>
149<span class="sd">-------------------------</span>
150
151<span class="sd">Changing the weight is equivalent to scaling the error bars</span>
152<span class="sd">on the given model by a factor of weight/n where n is the</span>
153<span class="sd">number of data points.  It is better to set the correct error</span>
154<span class="sd">bars on your data in the first place than to adjust the weights.</span>
155<span class="sd">If you have the correct error bars, then you should expect</span>
156<span class="sd">roughly 2/3 of the data points to lie within one error bar of</span>
157<span class="sd">the theory curve.  If consecutive data points have largely</span>
158<span class="sd">overlapping errorbars, then your uncertainty is overestimated.</span>
159
160<span class="sd">Another case where weights are adjusted (abused?) is to</span>
161<span class="sd">compensate for systematic errors in the data by forcing the</span>
162<span class="sd">errorbars to be large enough to cover the systematic bias.</span>
163<span class="sd">This is a poor approach to the problem.  A better strategy</span>
164<span class="sd">is to capture the systematic effects in the model, and treat</span>
165<span class="sd">the measurement of the independent variable as an additional</span>
166<span class="sd">data point in the fit.  This is still not statistically sound</span>
167<span class="sd">as there is likely to be a large correlation between the</span>
168<span class="sd">uncertainty of the measurement and the values of all the</span>
169<span class="sd">other variables.</span>
170
171<span class="sd">That said, adjusting the weight on a dataset is a quick way</span>
172<span class="sd">of reducing its influence on the entire fit.  Please use it</span>
173<span class="sd">with care.</span>
174<span class="sd">&quot;&quot;&quot;</span>
175
176<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;Assembly&#39;</span><span class="p">,</span> <span class="s">&#39;Fitness&#39;</span><span class="p">]</span>
177<span class="kn">import</span> <span class="nn">numpy</span>
178
179<span class="kn">import</span> <span class="nn">park</span>
180<span class="kn">from</span> <span class="nn">park.parameter</span> <span class="kn">import</span> <span class="n">Parameter</span><span class="p">,</span><span class="n">ParameterSet</span>
181<span class="kn">from</span> <span class="nn">park.fitresult</span> <span class="kn">import</span> <span class="n">FitParameter</span>
182<span class="kn">import</span> <span class="nn">park.expression</span>
183
184
185
186<div class="viewcode-block" id="Fitness"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Fitness">[docs]</a><span class="k">class</span> <span class="nc">Fitness</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
187    <span class="sd">&quot;&quot;&quot;</span>
188<span class="sd">    Container for theory and data.</span>
189
190<span class="sd">    The fit object compares theory with data.</span>
191
192<span class="sd">    TODO: what to do with fittable metadata (e.g., footprint correction)?</span>
193<span class="sd">    &quot;&quot;&quot;</span>
194    <span class="n">data</span> <span class="o">=</span> <span class="bp">None</span>
195    <span class="n">model</span> <span class="o">=</span> <span class="bp">None</span>
196    <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">model</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
197        <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="n">data</span><span class="p">,</span><span class="n">model</span>
198    <span class="k">def</span> <span class="nf">_parameterset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
199        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">parameterset</span>
200    <span class="n">parameterset</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_parameterset</span><span class="p">)</span>
201<div class="viewcode-block" id="Fitness.residuals"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Fitness.residuals">[docs]</a>    <span class="k">def</span> <span class="nf">residuals</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
202        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">residuals</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">eval</span><span class="p">)</span></div>
203<div class="viewcode-block" id="Fitness.residuals_deriv"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Fitness.residuals_deriv">[docs]</a>    <span class="k">def</span> <span class="nf">residuals_deriv</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pars</span><span class="o">=</span><span class="p">[]):</span>
204        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">residuals_deriv</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">eval_derivs</span><span class="p">,</span><span class="n">pars</span><span class="o">=</span><span class="n">pars</span><span class="p">)</span></div>
205<div class="viewcode-block" id="Fitness.set"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Fitness.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="o">**</span><span class="n">kw</span><span class="p">):</span>
206        <span class="sd">&quot;&quot;&quot;</span>
207<span class="sd">        Set parameters in the model.</span>
208
209<span class="sd">        User convenience function.  This allows a user with an assembly</span>
210<span class="sd">        of models in a script to for example set the fit range for</span>
211<span class="sd">        parameter &#39;a&#39; of the model::</span>
212
213<span class="sd">            assembly[0].set(a=[5,6])</span>
214
215<span class="sd">        Raises KeyError if the parameter is not in parameterset.</span>
216<span class="sd">        &quot;&quot;&quot;</span>
217        <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="o">**</span><span class="n">kw</span><span class="p">)</span></div>
218<div class="viewcode-block" id="Fitness.abort"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Fitness.abort">[docs]</a>    <span class="k">def</span> <span class="nf">abort</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
219        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">,</span><span class="s">&#39;abort&#39;</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">abort</span><span class="p">()</span>
220</div></div>
221<span class="k">class</span> <span class="nc">Part</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
222    <span class="sd">&quot;&quot;&quot;</span>
223<span class="sd">    Part of a fitting assembly.  Part holds the model itself and</span>
224<span class="sd">    associated data.  The part can be initialized with a fitness</span>
225<span class="sd">    object or with a pair (model,data) for the default fitness function.</span>
226
227<span class="sd">    fitness (Fitness)</span>
228<span class="sd">        object implementing the `park.assembly.Fitness` interface.  In</span>
229<span class="sd">        particular, fitness should provide a parameterset attribute</span>
230<span class="sd">        containing a ParameterSet and a residuals method returning a vector</span>
231<span class="sd">        of residuals.</span>
232<span class="sd">    weight (dimensionless)</span>
233<span class="sd">        weight for the model.  See comments in assembly.py for details.</span>
234<span class="sd">    isfitted (boolean)</span>
235<span class="sd">        True if the model residuals should be included in the fit.</span>
236<span class="sd">        The model parameters may still be used in parameter</span>
237<span class="sd">        expressions, but there will be no comparison to the data.</span>
238<span class="sd">    residuals (vector)</span>
239<span class="sd">        Residuals for the model if they have been calculated, or None</span>
240<span class="sd">    degrees_of_freedom</span>
241<span class="sd">        Number of residuals minus number of fitted parameters.</span>
242<span class="sd">        Degrees of freedom for individual models does not make</span>
243<span class="sd">        sense in the presence of expressions combining models,</span>
244<span class="sd">        particularly in the case where a model has many parameters</span>
245<span class="sd">        but no data or many computed parameters.  The degrees of</span>
246<span class="sd">        freedom for the model is set to be at least one.</span>
247<span class="sd">    chisq</span>
248<span class="sd">        sum(residuals**2); use chisq/degrees_of_freedom to</span>
249<span class="sd">        get the reduced chisq value.</span>
250
251<span class="sd">        Get/set the weight on the given model.</span>
252
253<span class="sd">        assembly.weight(3) returns the weight on model 3 (0-origin)</span>
254<span class="sd">        assembly.weight(3,0.5) sets the weight on model 3 (0-origin)</span>
255<span class="sd">    &quot;&quot;&quot;</span>
256
257    <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">fitness</span><span class="p">,</span> <span class="n">weight</span><span class="o">=</span><span class="mf">1.</span><span class="p">,</span> <span class="n">isfitted</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
258        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">fitness</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
259            <span class="n">fitness</span> <span class="o">=</span> <span class="n">park</span><span class="o">.</span><span class="n">Fitness</span><span class="p">(</span><span class="o">*</span><span class="n">fitness</span><span class="p">)</span>
260        <span class="bp">self</span><span class="o">.</span><span class="n">fitness</span> <span class="o">=</span> <span class="n">fitness</span>
261        <span class="bp">self</span><span class="o">.</span><span class="n">weight</span> <span class="o">=</span> <span class="n">weight</span>
262        <span class="bp">self</span><span class="o">.</span><span class="n">isfitted</span> <span class="o">=</span> <span class="n">isfitted</span>
263        <span class="bp">self</span><span class="o">.</span><span class="n">residuals</span> <span class="o">=</span> <span class="bp">None</span>
264        <span class="bp">self</span><span class="o">.</span><span class="n">chisq</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">Inf</span>
265        <span class="bp">self</span><span class="o">.</span><span class="n">degrees_of_freedom</span> <span class="o">=</span> <span class="mi">1</span>
266
267
268<div class="viewcode-block" id="Assembly"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly">[docs]</a><span class="k">class</span> <span class="nc">Assembly</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
269    <span class="sd">&quot;&quot;&quot;</span>
270<span class="sd">    Collection of fit models.</span>
271
272<span class="sd">    Assembly implements the `park.fit.Objective` interface.</span>
273
274<span class="sd">    See `park.assembly` for usage.</span>
275
276<span class="sd">    Instance variables:</span>
277
278<span class="sd">    residuals : array</span>
279<span class="sd">        a vector of residuals spanning all models, with model</span>
280<span class="sd">        weights applied as appropriate.</span>
281<span class="sd">    degrees_of_freedom : integer</span>
282<span class="sd">        length of the residuals - number of fitted parameters</span>
283<span class="sd">    chisq : float</span>
284<span class="sd">        sum squared residuals; this is not the reduced chisq, which</span>
285<span class="sd">        you can get using chisq/degrees_of_freedom</span>
286
287<span class="sd">    These fields are defined for the individual models as well, with</span>
288<span class="sd">    degrees of freedom adjusted to the length of the individual data</span>
289<span class="sd">    set.  If the model is not fitted or the weight is zero, the residual</span>
290<span class="sd">    will not be calculated.</span>
291
292<span class="sd">    The residuals fields are available only after the model has been</span>
293<span class="sd">    evaluated.</span>
294<span class="sd">    &quot;&quot;&quot;</span>
295
296    <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">models</span><span class="o">=</span><span class="p">[]):</span>
297        <span class="sd">&quot;&quot;&quot;Build an assembly from a list of models.&quot;&quot;&quot;</span>
298        <span class="bp">self</span><span class="o">.</span><span class="n">parts</span> <span class="o">=</span> <span class="p">[]</span>
299        <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">models</span><span class="p">:</span>
300            <span class="bp">self</span><span class="o">.</span><span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Part</span><span class="p">(</span><span class="n">m</span><span class="p">))</span>
301        <span class="bp">self</span><span class="o">.</span><span class="n">_reset</span><span class="p">()</span>
302
303    <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
304        <span class="sd">&quot;&quot;&quot;Iterate through the models in order&quot;&quot;&quot;</span>
305        <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">parts</span><span class="p">:</span> <span class="k">yield</span> <span class="n">m</span>
306
307    <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">n</span><span class="p">):</span>
308        <span class="sd">&quot;&quot;&quot;Return the nth model&quot;&quot;&quot;</span>
309        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parts</span><span class="p">[</span><span class="n">n</span><span class="p">]</span><span class="o">.</span><span class="n">fitness</span>
310
311    <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">fitness</span><span class="p">):</span>
312        <span class="sd">&quot;&quot;&quot;Replace the nth model&quot;&quot;&quot;</span>
313        <span class="bp">self</span><span class="o">.</span><span class="n">parts</span><span class="p">[</span><span class="n">n</span><span class="p">]</span><span class="o">.</span><span class="n">fitness</span> <span class="o">=</span> <span class="n">fitness</span>
314        <span class="bp">self</span><span class="o">.</span><span class="n">_reset</span><span class="p">()</span>
315
316    <span class="k">def</span> <span class="nf">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
317        <span class="sd">&quot;&quot;&quot;Delete the nth model&quot;&quot;&quot;</span>
318        <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">parts</span><span class="p">[</span><span class="n">n</span><span class="p">]</span>
319        <span class="bp">self</span><span class="o">.</span><span class="n">_reset</span><span class="p">()</span>
320
321<div class="viewcode-block" id="Assembly.weight"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.weight">[docs]</a>    <span class="k">def</span> <span class="nf">weight</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
322        <span class="sd">&quot;&quot;&quot;</span>
323<span class="sd">        Query the weight on a particular model.</span>
324
325<span class="sd">        Set weight to value if value is supplied.</span>
326
327<span class="sd">        :Parameters:</span>
328<span class="sd">         idx : integer</span>
329<span class="sd">           model number</span>
330<span class="sd">         value : float</span>
331<span class="sd">           model weight</span>
332<span class="sd">        :return: model weight</span>
333<span class="sd">        &quot;&quot;&quot;</span>
334        <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
335            <span class="bp">self</span><span class="o">.</span><span class="n">parts</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span><span class="o">.</span><span class="n">weight</span> <span class="o">=</span> <span class="n">value</span>
336        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parts</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span><span class="o">.</span><span class="n">weight</span>
337</div>
338<div class="viewcode-block" id="Assembly.isfitted"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.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="n">idx</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
339        <span class="sd">&quot;&quot;&quot;</span>
340<span class="sd">        Query if a particular model is fitted.</span>
341
342<span class="sd">        Set isfitted to value if value is supplied.</span>
343
344<span class="sd">        :param idx: model number</span>
345<span class="sd">        :type idx: integer</span>
346<span class="sd">        :param value:</span>
347<span class="sd">        &quot;&quot;&quot;</span>
348        <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
349            <span class="bp">self</span><span class="o">.</span><span class="n">parts</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span><span class="o">.</span><span class="n">isfitted</span> <span class="o">=</span> <span class="n">value</span>
350        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">parts</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span><span class="o">.</span><span class="n">isfitted</span>
351</div>
352<div class="viewcode-block" id="Assembly.append"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.append">[docs]</a>    <span class="k">def</span> <span class="nf">append</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fitness</span><span class="p">,</span> <span class="n">weight</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">isfitted</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
353        <span class="sd">&quot;&quot;&quot;</span>
354<span class="sd">        Add a model to the end of set.</span>
355
356<span class="sd">        :param fitness: the fitting model</span>
357<span class="sd">            The fitting model can be an instance of `park.assembly.Fitness`,</span>
358<span class="sd">            or a tuple of (`park.model.Model`,`park.data.Data1D`)</span>
359<span class="sd">        :param weight: model weighting (usually 1.0)</span>
360<span class="sd">        :param isfitted: whether model should be fit (equivalent to weight 0.)</span>
361<span class="sd">        &quot;&quot;&quot;</span>
362        <span class="bp">self</span><span class="o">.</span><span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Part</span><span class="p">(</span><span class="n">fitness</span><span class="p">,</span><span class="n">weight</span><span class="p">,</span><span class="n">isfitted</span><span class="p">))</span>
363        <span class="bp">self</span><span class="o">.</span><span class="n">_reset</span><span class="p">()</span>
364</div>
365<div class="viewcode-block" id="Assembly.insert"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.insert">[docs]</a>    <span class="k">def</span> <span class="nf">insert</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">,</span> <span class="n">fitness</span><span class="p">,</span> <span class="n">weight</span><span class="o">=</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">isfitted</span><span class="o">=</span><span class="bp">True</span><span class="p">):</span>
366        <span class="sd">&quot;&quot;&quot;Add a model to a particular position in the set.&quot;&quot;&quot;</span>
367        <span class="bp">self</span><span class="o">.</span><span class="n">parts</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="n">idx</span><span class="p">,</span><span class="n">Part</span><span class="p">(</span><span class="n">fitness</span><span class="p">,</span><span class="n">weight</span><span class="p">,</span><span class="n">isfitted</span><span class="p">))</span>
368        <span class="bp">self</span><span class="o">.</span><span class="n">_reset</span><span class="p">()</span>
369</div>
370    <span class="k">def</span> <span class="nf">_reset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
371        <span class="sd">&quot;&quot;&quot;Adjust the parameter set after the addition of a new model.&quot;&quot;&quot;</span>
372        <span class="n">subsets</span> <span class="o">=</span> <span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">fitness</span><span class="o">.</span><span class="n">parameterset</span> <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">]</span>
373        <span class="bp">self</span><span class="o">.</span><span class="n">parameterset</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">subsets</span><span class="p">)</span>
374        <span class="bp">self</span><span class="o">.</span><span class="n">parameterset</span><span class="o">.</span><span class="n">setprefix</span><span class="p">()</span>
375        <span class="c">#print [p.path for p in self.parameterset.flatten()]</span>
376
377<div class="viewcode-block" id="Assembly.eval"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.eval">[docs]</a>    <span class="k">def</span> <span class="nf">eval</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
378        <span class="sd">&quot;&quot;&quot;</span>
379<span class="sd">        Recalculate the theory functions, and from them, the</span>
380<span class="sd">        residuals and chisq.</span>
381
382<span class="sd">        :note: Call this after the parameters have been updated.</span>
383<span class="sd">        &quot;&quot;&quot;</span>
384        <span class="c"># Handle abort from a separate thread.</span>
385        <span class="bp">self</span><span class="o">.</span><span class="n">_cancel</span> <span class="o">=</span> <span class="bp">False</span>
386
387        <span class="c"># Evaluate the computed parameters</span>
388        <span class="bp">self</span><span class="o">.</span><span class="n">_fitexpression</span><span class="p">()</span>
389
390        <span class="c"># Check that the resulting parameters are in a feasible region.</span>
391        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">isfeasible</span><span class="p">():</span> <span class="k">return</span> <span class="n">numpy</span><span class="o">.</span><span class="n">inf</span>
392
393        <span class="n">resid</span> <span class="o">=</span> <span class="p">[]</span>
394        <span class="n">k</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_fitparameters</span><span class="p">)</span>
395        <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">parts</span><span class="p">:</span>
396            <span class="c"># In order to support abort, need to be able to propagate an</span>
397            <span class="c"># external abort signal from self.abort() into an abort signal</span>
398            <span class="c"># for the particular model.  Can&#39;t see a way to do this which</span>
399            <span class="c"># doesn&#39;t involve setting a state variable.</span>
400            <span class="bp">self</span><span class="o">.</span><span class="n">_current_model</span> <span class="o">=</span> <span class="n">m</span>
401            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cancel</span><span class="p">:</span> <span class="k">return</span> <span class="n">numpy</span><span class="o">.</span><span class="n">inf</span>
402            <span class="k">if</span> <span class="n">m</span><span class="o">.</span><span class="n">isfitted</span> <span class="ow">and</span> <span class="n">m</span><span class="o">.</span><span class="n">weight</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
403                <span class="n">m</span><span class="o">.</span><span class="n">residuals</span> <span class="o">=</span> <span class="n">m</span><span class="o">.</span><span class="n">fitness</span><span class="o">.</span><span class="n">residuals</span><span class="p">()</span>
404                <span class="n">N</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">residuals</span><span class="p">)</span>
405                <span class="n">m</span><span class="o">.</span><span class="n">degrees_of_freedom</span> <span class="o">=</span> <span class="n">N</span><span class="o">-</span><span class="n">k</span> <span class="k">if</span> <span class="n">N</span><span class="o">&gt;</span><span class="n">k</span> <span class="k">else</span> <span class="mi">1</span>
406                <span class="n">m</span><span class="o">.</span><span class="n">chisq</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">residuals</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
407                <span class="n">resid</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">weight</span><span class="o">*</span><span class="n">m</span><span class="o">.</span><span class="n">residuals</span><span class="p">)</span>
408        <span class="bp">self</span><span class="o">.</span><span class="n">residuals</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">hstack</span><span class="p">(</span><span class="n">resid</span><span class="p">)</span>
409        <span class="n">N</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">residuals</span><span class="p">)</span>
410        <span class="bp">self</span><span class="o">.</span><span class="n">degrees_of_freedom</span> <span class="o">=</span> <span class="n">N</span><span class="o">-</span><span class="n">k</span> <span class="k">if</span> <span class="n">N</span><span class="o">&gt;</span><span class="n">k</span> <span class="k">else</span> <span class="mi">1</span>
411        <span class="bp">self</span><span class="o">.</span><span class="n">chisq</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sum</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">residuals</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
412        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">chisq</span>
413</div>
414<div class="viewcode-block" id="Assembly.jacobian"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.jacobian">[docs]</a>    <span class="k">def</span> <span class="nf">jacobian</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pvec</span><span class="p">,</span> <span class="n">step</span><span class="o">=</span><span class="mf">1e-8</span><span class="p">):</span>
415        <span class="sd">&quot;&quot;&quot;</span>
416<span class="sd">        Returns the derivative wrt the fit parameters at point p.</span>
417
418<span class="sd">        Numeric derivatives are calculated based on step, where step is</span>
419<span class="sd">        the portion of the total range for parameter j, or the portion of</span>
420<span class="sd">        point value p_j if the range on parameter j is infinite.</span>
421<span class="sd">        &quot;&quot;&quot;</span>
422        <span class="c"># Make sure the input vector is an array</span>
423        <span class="n">pvec</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">pvec</span><span class="p">)</span>
424        <span class="c"># We are being lazy here.  We can precompute the bounds, we can</span>
425        <span class="c"># use the residuals_deriv from the sub-models which have analytic</span>
426        <span class="c"># derivatives and we need only recompute the models which depend</span>
427        <span class="c"># on the varying parameters.</span>
428        <span class="c"># Meanwhile, let&#39;s compute the numeric derivative using the</span>
429        <span class="c"># three point formula.</span>
430        <span class="c"># We are not checking that the varied parameter in numeric</span>
431        <span class="c"># differentiation is indeed feasible in the interval of interest.</span>
432        <span class="nb">range</span> <span class="o">=</span> <span class="nb">zip</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">p</span><span class="o">.</span><span class="n">range</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">_fitparameters</span><span class="p">])</span>
433        <span class="n">lo</span><span class="p">,</span><span class="n">hi</span> <span class="o">=</span> <span class="p">[</span><span class="n">numpy</span><span class="o">.</span><span class="n">asarray</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">]</span>
434        <span class="n">delta</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><span class="o">*</span><span class="n">step</span>
435        <span class="c"># For infinite ranges, use p*1e-8 for the step size</span>
436        <span class="n">idx</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isinf</span><span class="p">(</span><span class="n">delta</span><span class="p">)</span>
437        <span class="c">#print &quot;J&quot;,idx,delta,pvec,type(idx),type(delta),type(pvec)</span>
438        <span class="n">delta</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="o">=</span> <span class="n">pvec</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span><span class="o">*</span><span class="n">step</span>
439        <span class="n">delta</span><span class="p">[</span><span class="n">delta</span><span class="o">==</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">step</span>
440
441        <span class="c"># Set the initial value</span>
442        <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="nb">enumerate</span><span class="p">(</span><span class="n">pvec</span><span class="p">):</span>
443            <span class="bp">self</span><span class="o">.</span><span class="n">_fitparameters</span><span class="p">[</span><span class="n">k</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">v</span>
444        <span class="c"># Gather the residuals</span>
445        <span class="n">r</span> <span class="o">=</span> <span class="p">[]</span>
446        <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="nb">enumerate</span><span class="p">(</span><span class="n">pvec</span><span class="p">):</span>
447            <span class="c"># Center point formula:</span>
448            <span class="c">#     df/dv = lim_{h-&gt;0} ( f(v+h)-f(v-h) ) / ( 2h )</span>
449            <span class="n">h</span> <span class="o">=</span> <span class="n">delta</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>
450            <span class="bp">self</span><span class="o">.</span><span class="n">_fitparameters</span><span class="p">[</span><span class="n">k</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">v</span> <span class="o">+</span> <span class="n">h</span>
451            <span class="bp">self</span><span class="o">.</span><span class="n">eval</span><span class="p">()</span>
452            <span class="n">rk</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">residuals</span>
453            <span class="bp">self</span><span class="o">.</span><span class="n">_fitparameters</span><span class="p">[</span><span class="n">k</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">v</span> <span class="o">-</span> <span class="n">h</span>
454            <span class="bp">self</span><span class="o">.</span><span class="n">eval</span><span class="p">()</span>
455            <span class="n">rk</span> <span class="o">-=</span> <span class="bp">self</span><span class="o">.</span><span class="n">residuals</span>
456            <span class="bp">self</span><span class="o">.</span><span class="n">_fitparameters</span><span class="p">[</span><span class="n">k</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">v</span>
457            <span class="n">r</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rk</span><span class="o">/</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">h</span><span class="p">))</span>
458        <span class="c"># return the jacobian</span>
459        <span class="k">return</span> <span class="n">numpy</span><span class="o">.</span><span class="n">vstack</span><span class="p">(</span><span class="n">r</span><span class="p">)</span><span class="o">.</span><span class="n">T</span>
460
461</div>
462<div class="viewcode-block" id="Assembly.cov"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.cov">[docs]</a>    <span class="k">def</span> <span class="nf">cov</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pvec</span><span class="p">):</span>
463        <span class="sd">&quot;&quot;&quot;</span>
464<span class="sd">        Return the covariance matrix inv(J&#39;J) at point p.</span>
465<span class="sd">        &quot;&quot;&quot;</span>
466
467        <span class="c"># Find cov of f at p</span>
468        <span class="c">#     cov(f,p) = inv(J&#39;J)</span>
469        <span class="c"># Use SVD</span>
470        <span class="c">#     J = U S V&#39;</span>
471        <span class="c">#     J&#39;J = (U S V&#39;)&#39; (U S V&#39;)</span>
472        <span class="c">#         = V S&#39; U&#39; U S V&#39;</span>
473        <span class="c">#         = V S S V&#39;</span>
474        <span class="c">#     inv(J&#39;J) = inv(V S S V&#39;)</span>
475        <span class="c">#              = inv(V&#39;) inv(S S) inv(V)</span>
476        <span class="c">#              = V inv (S S) V&#39;</span>
477        <span class="n">J</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">jacobian</span><span class="p">(</span><span class="n">pvec</span><span class="p">)</span>
478        <span class="n">u</span><span class="p">,</span><span class="n">s</span><span class="p">,</span><span class="n">vh</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">svd</span><span class="p">(</span><span class="n">J</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
479        <span class="n">JTJinv</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">vh</span><span class="o">.</span><span class="n">T</span><span class="o">.</span><span class="n">conj</span><span class="p">()</span><span class="o">/</span><span class="n">s</span><span class="o">**</span><span class="mi">2</span><span class="p">,</span><span class="n">vh</span><span class="p">)</span>
480        <span class="k">return</span> <span class="n">JTJinv</span>
481</div>
482<div class="viewcode-block" id="Assembly.stderr"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.stderr">[docs]</a>    <span class="k">def</span> <span class="nf">stderr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pvec</span><span class="p">):</span>
483        <span class="sd">&quot;&quot;&quot;</span>
484<span class="sd">        Return parameter uncertainty.</span>
485
486<span class="sd">        This is just the sqrt diagonal of covariance matrix inv(J&#39;J) at point p.</span>
487<span class="sd">        &quot;&quot;&quot;</span>
488        <span class="k">return</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">diag</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">cov</span><span class="p">(</span><span class="n">pvec</span><span class="p">)))</span>
489</div>
490<div class="viewcode-block" id="Assembly.isfeasible"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.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>
491        <span class="sd">&quot;&quot;&quot;</span>
492<span class="sd">        Returns true if the parameter set is in a feasible region of the</span>
493<span class="sd">        modeling space.</span>
494<span class="sd">        &quot;&quot;&quot;</span>
495        <span class="k">return</span> <span class="bp">True</span>
496
497    <span class="c"># Fitting service interface</span></div>
498<div class="viewcode-block" id="Assembly.fit_parameters"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.fit_parameters">[docs]</a>    <span class="k">def</span> <span class="nf">fit_parameters</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
499        <span class="sd">&quot;&quot;&quot;</span>
500<span class="sd">        Return an alphabetical list of the fitting parameters.</span>
501
502<span class="sd">        This function is called once at the beginning of a fit,</span>
503<span class="sd">        and serves as a convenient place to precalculate what</span>
504<span class="sd">        can be precalculated such as the set of fitting parameters</span>
505<span class="sd">        and the parameter expressions evaluator.</span>
506<span class="sd">        &quot;&quot;&quot;</span>
507        <span class="bp">self</span><span class="o">.</span><span class="n">parameterset</span><span class="o">.</span><span class="n">setprefix</span><span class="p">()</span>
508        <span class="bp">self</span><span class="o">.</span><span class="n">_fitparameters</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parameterset</span><span class="o">.</span><span class="n">fitted</span>
509        <span class="bp">self</span><span class="o">.</span><span class="n">_restraints</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parameterset</span><span class="o">.</span><span class="n">restrained</span>
510        <span class="n">pars</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parameterset</span><span class="o">.</span><span class="n">flatten</span><span class="p">()</span>
511        <span class="n">context</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parameterset</span><span class="o">.</span><span class="n">gather_context</span><span class="p">()</span>
512        <span class="bp">self</span><span class="o">.</span><span class="n">_fitexpression</span> <span class="o">=</span> <span class="n">park</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">pars</span><span class="p">,</span><span class="n">context</span><span class="p">)</span>
513        <span class="c">#print &quot;constraints&quot;,self._fitexpression.__doc__</span>
514
515        <span class="bp">self</span><span class="o">.</span><span class="n">_fitparameters</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="k">lambda</span> <span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">:</span> <span class="nb">cmp</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">path</span><span class="p">,</span><span class="n">b</span><span class="o">.</span><span class="n">path</span><span class="p">))</span>
516        <span class="c"># Convert to fitparameter a object</span>
517        <span class="n">fitpars</span> <span class="o">=</span> <span class="p">[</span><span class="n">FitParameter</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">path</span><span class="p">,</span><span class="n">p</span><span class="o">.</span><span class="n">range</span><span class="p">,</span><span class="n">p</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
518                   <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">_fitparameters</span><span class="p">]</span>
519        <span class="k">return</span> <span class="n">fitpars</span>
520</div>
521<div class="viewcode-block" id="Assembly.set_result"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.set_result">[docs]</a>    <span class="k">def</span> <span class="nf">set_result</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
522        <span class="sd">&quot;&quot;&quot;</span>
523<span class="sd">        Set the parameters resulting from the fit into the parameter set,</span>
524<span class="sd">        and update the calculated expression.</span>
525
526<span class="sd">        The parameter values may be retrieved by walking the assembly.parameterset</span>
527<span class="sd">        tree, checking each parameter for isfitted, iscomputed, or isfixed.</span>
528<span class="sd">        For example::</span>
529
530<span class="sd">            assembly.set_result(result)</span>
531<span class="sd">            for p in assembly.parameterset.flatten():</span>
532<span class="sd">                if p.isfitted():</span>
533<span class="sd">                    print &quot;%s %g in [%g,%g]&quot;%(p.path,p.value,p.range[0],p.range[1])</span>
534<span class="sd">                elif p.iscomputed():</span>
535<span class="sd">                    print &quot;%s computed as %g&quot;%(p.path.p.value)</span>
536
537<span class="sd">        This does not calculate the function or the residuals for these parameters.</span>
538<span class="sd">        You can call assembly.eval() to do this.  The residuals will be set in</span>
539<span class="sd">        assembly[i].residuals.  The theory and data are model specific, and can</span>
540<span class="sd">        be found in assembly[i].fitness.data.</span>
541<span class="sd">        &quot;&quot;&quot;</span>
542        <span class="k">for</span> <span class="n">n</span><span class="p">,</span><span class="n">p</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">parameters</span><span class="p">):</span>
543            <span class="bp">self</span><span class="o">.</span><span class="n">_fitparameters</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span><span class="o">.</span><span class="n">value</span>
544        <span class="bp">self</span><span class="o">.</span><span class="n">_fitexpression</span><span class="p">()</span>
545</div>
546<div class="viewcode-block" id="Assembly.all_results"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.all_results">[docs]</a>    <span class="k">def</span> <span class="nf">all_results</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">result</span><span class="p">):</span>
547        <span class="sd">&quot;&quot;&quot;</span>
548<span class="sd">        Extend result from the fit with the calculated parameters.</span>
549<span class="sd">        &quot;&quot;&quot;</span>
550        <span class="n">calcpars</span> <span class="o">=</span> <span class="p">[</span><span class="n">FitParameter</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">path</span><span class="p">,</span><span class="n">p</span><span class="o">.</span><span class="n">range</span><span class="p">,</span><span class="n">p</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
551                    <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">parameterset</span><span class="o">.</span><span class="n">computed</span><span class="p">]</span>
552        <span class="n">result</span><span class="o">.</span><span class="n">parameters</span> <span class="o">+=</span> <span class="n">calcpars</span>
553</div>
554<div class="viewcode-block" id="Assembly.result"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.result">[docs]</a>    <span class="k">def</span> <span class="nf">result</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="s">&#39;step&#39;</span><span class="p">):</span>
555        <span class="sd">&quot;&quot;&quot;</span>
556<span class="sd">        Details to send back to the fitting client on an improved fit.</span>
557
558<span class="sd">        status is &#39;start&#39;, &#39;step&#39; or &#39;end&#39; depending if this is the</span>
559<span class="sd">        first result to return, an improved result, or the final result.</span>
560
561<span class="sd">        [Not implemented]</span>
562<span class="sd">        &quot;&quot;&quot;</span>
563        <span class="k">return</span> <span class="bp">None</span>
564</div>
565<div class="viewcode-block" id="Assembly.fresiduals"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.fresiduals">[docs]</a>    <span class="k">def</span> <span class="nf">fresiduals</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pvec</span><span class="p">):</span>
566        <span class="n">chisq</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__call__</span><span class="p">(</span><span class="n">pvec</span><span class="p">)</span>
567        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">residuals</span>
568</div>
569    <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">pvec</span><span class="p">):</span>
570        <span class="sd">&quot;&quot;&quot;</span>
571<span class="sd">        Cost function.</span>
572
573<span class="sd">        Evaluate the system for the parameter vector pvec, returning chisq</span>
574<span class="sd">        as the cost function to be minimized.</span>
575
576<span class="sd">        Raises a runtime error if the number of fit parameters is</span>
577<span class="sd">        different than the length of the vector.</span>
578<span class="sd">        &quot;&quot;&quot;</span>
579        <span class="c"># Plug fit parameters into model</span>
580        <span class="c">#print &quot;Trying&quot;,pvec</span>
581        <span class="n">pars</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fitparameters</span>
582        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">pvec</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">pars</span><span class="p">):</span>
583            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">&quot;Unexpected number of parameters&quot;</span><span class="p">)</span>
584        <span class="k">for</span> <span class="n">n</span><span class="p">,</span><span class="n">value</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">pvec</span><span class="p">):</span>
585            <span class="n">pars</span><span class="p">[</span><span class="n">n</span><span class="p">]</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">value</span>
586        <span class="c"># Evaluate model</span>
587        <span class="n">chisq</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval</span><span class="p">()</span>
588        <span class="c"># Evaluate additional restraints based on parameter value</span>
589        <span class="c"># likelihood</span>
590        <span class="n">restraints_penalty</span> <span class="o">=</span> <span class="mi">0</span>
591        <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">_restraints</span><span class="p">:</span>
592            <span class="n">restraints_penalty</span> <span class="o">+=</span> <span class="n">p</span><span class="o">.</span><span class="n">likelihood</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
593        <span class="c"># Return total cost function</span>
594        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">chisq</span> <span class="o">+</span> <span class="n">restraints_penalty</span>
595
596<div class="viewcode-block" id="Assembly.abort"><a class="viewcode-back" href="../../dev/api/park.html#park.assembly.Assembly.abort">[docs]</a>    <span class="k">def</span> <span class="nf">abort</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
597        <span class="sd">&quot;&quot;&quot;</span>
598<span class="sd">        Interrupt the current function evaluation.</span>
599
600<span class="sd">        Forward this to the currently executing model if possible.</span>
601<span class="sd">        &quot;&quot;&quot;</span>
602        <span class="bp">self</span><span class="o">.</span><span class="n">_cancel</span> <span class="o">=</span> <span class="bp">True</span>
603        <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_current_model</span><span class="p">,</span><span class="s">&#39;abort&#39;</span><span class="p">):</span>
604            <span class="bp">self</span><span class="o">.</span><span class="n">_current_model</span><span class="o">.</span><span class="n">abort</span><span class="p">()</span>
605</div></div>
606<span class="k">class</span> <span class="nc">_Exp</span><span class="p">(</span><span class="n">park</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
607    <span class="sd">&quot;&quot;&quot;</span>
608<span class="sd">    Sample model for testing assembly.</span>
609<span class="sd">    &quot;&quot;&quot;</span>
610    <span class="n">parameters</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;a&#39;</span><span class="p">,</span><span class="s">&#39;c&#39;</span><span class="p">]</span>
611    <span class="k">def</span> <span class="nf">eval</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">):</span>
612        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">a</span><span class="o">*</span><span class="n">numpy</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">c</span><span class="o">*</span><span class="n">x</span><span class="p">)</span>
613<span class="k">class</span> <span class="nc">_Linear</span><span class="p">(</span><span class="n">park</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
614    <span class="n">parameters</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;a&#39;</span><span class="p">,</span><span class="s">&#39;c&#39;</span><span class="p">]</span>
615    <span class="k">def</span> <span class="nf">eval</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">):</span>
616        <span class="c">#print &quot;eval&quot;,self.a,self.c,x,self.a*x+self.c</span>
617        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">a</span><span class="o">*</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">c</span>
618<span class="k">def</span> <span class="nf">example</span><span class="p">():</span>
619    <span class="sd">&quot;&quot;&quot;</span>
620<span class="sd">    Return an example assembly consisting of a pair of functions,</span>
621<span class="sd">        M1.a*exp(M1.c*x), M2.a*exp(2*M1.c*x)</span>
622<span class="sd">    and ideal data for</span>
623<span class="sd">        M1.a=1, M1.c=1.5, M2.a=2.5</span>
624<span class="sd">    &quot;&quot;&quot;</span>
625    <span class="kn">import</span> <span class="nn">numpy</span>
626    <span class="kn">import</span> <span class="nn">park</span>
627    <span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">inf</span>
628    <span class="c"># Make some fake data</span>
629    <span class="n">x1</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">11</span><span class="p">)</span>
630    <span class="n">x2</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">12</span><span class="p">)</span>
631    <span class="c"># Define a shared model</span>
632    <span class="k">if</span> <span class="bp">True</span><span class="p">:</span> <span class="c"># Exp model</span>
633        <span class="n">y1</span><span class="p">,</span><span class="n">y2</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="mf">1.5</span><span class="o">*</span><span class="n">x1</span><span class="p">),</span><span class="mf">2.5</span><span class="o">*</span><span class="n">numpy</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="mi">3</span><span class="o">*</span><span class="n">x2</span><span class="p">)</span>
634        <span class="n">M1</span> <span class="o">=</span> <span class="n">_Exp</span><span class="p">(</span><span class="s">&#39;M1&#39;</span><span class="p">,</span><span class="n">a</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">],</span><span class="n">c</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">])</span>
635        <span class="n">M2</span> <span class="o">=</span> <span class="n">_Exp</span><span class="p">(</span><span class="s">&#39;M2&#39;</span><span class="p">,</span><span class="n">a</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">],</span><span class="n">c</span><span class="o">=</span><span class="s">&#39;2*M1.c&#39;</span><span class="p">)</span>
636        <span class="c">#M2 = _Exp(&#39;M2&#39;,a=[1,3],c=3)</span>
637    <span class="k">else</span><span class="p">:</span>  <span class="c"># Linear model</span>
638        <span class="n">y1</span><span class="p">,</span><span class="n">y2</span> <span class="o">=</span> <span class="n">x1</span><span class="o">+</span><span class="mf">1.5</span><span class="p">,</span> <span class="mf">2.5</span><span class="o">*</span><span class="n">x2</span><span class="o">+</span><span class="mi">3</span>
639        <span class="n">M1</span> <span class="o">=</span> <span class="n">_Linear</span><span class="p">(</span><span class="s">&#39;M1&#39;</span><span class="p">,</span><span class="n">a</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">],</span><span class="n">c</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">])</span>
640        <span class="n">M2</span> <span class="o">=</span> <span class="n">_Linear</span><span class="p">(</span><span class="s">&#39;M2&#39;</span><span class="p">,</span><span class="n">a</span><span class="o">=</span><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">],</span><span class="n">c</span><span class="o">=</span><span class="s">&#39;2*M1.c&#39;</span><span class="p">)</span>
641    <span class="k">if</span> <span class="bp">False</span><span class="p">:</span> <span class="c"># Unbounded</span>
642        <span class="n">M1</span><span class="o">.</span><span class="n">a</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>
643        <span class="n">M1</span><span class="o">.</span><span class="n">c</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>
644        <span class="n">M2</span><span class="o">.</span><span class="n">a</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>
645    <span class="n">D1</span> <span class="o">=</span> <span class="n">park</span><span class="o">.</span><span class="n">Data1D</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">x1</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">y1</span><span class="p">)</span>
646    <span class="n">D2</span> <span class="o">=</span> <span class="n">park</span><span class="o">.</span><span class="n">Data1D</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">x2</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">y2</span><span class="p">)</span>
647    <span class="c"># Construct the assembly</span>
648    <span class="n">assembly</span> <span class="o">=</span> <span class="n">park</span><span class="o">.</span><span class="n">Assembly</span><span class="p">([(</span><span class="n">M1</span><span class="p">,</span><span class="n">D1</span><span class="p">),(</span><span class="n">M2</span><span class="p">,</span><span class="n">D2</span><span class="p">)])</span>
649    <span class="k">return</span> <span class="n">assembly</span>
650
651<span class="k">class</span> <span class="nc">_Sphere</span><span class="p">(</span><span class="n">park</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
652    <span class="n">parameters</span> <span class="o">=</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><span class="s">&#39;d&#39;</span><span class="p">,</span><span class="s">&#39;e&#39;</span><span class="p">]</span>
653    <span class="k">def</span> <span class="nf">eval</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">):</span>
654        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">a</span><span class="o">*</span><span class="n">x</span><span class="o">**</span><span class="mi">2</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">b</span><span class="o">*</span><span class="n">x</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">c</span> <span class="o">+</span> <span class="n">exp</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">d</span><span class="p">)</span> <span class="o">-</span> <span class="mi">3</span><span class="o">*</span><span class="n">sin</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">e</span><span class="p">)</span>
655
656<span class="k">def</span> <span class="nf">example5</span><span class="p">():</span>
657    <span class="kn">import</span> <span class="nn">numpy</span>
658    <span class="kn">import</span> <span class="nn">park</span>
659    <span class="kn">from</span> <span class="nn">numpy</span> <span class="kn">import</span> <span class="n">inf</span>
660    <span class="c"># Make some fake data</span>
661    <span class="n">x</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">11</span><span class="p">)</span>
662    <span class="c"># Define a shared model</span>
663    <span class="n">S</span> <span class="o">=</span> <span class="n">_Sphere</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="n">b</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="n">c</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span><span class="n">d</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span><span class="n">e</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
664    <span class="n">y</span> <span class="o">=</span> <span class="n">S</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">x1</span><span class="p">)</span>
665    <span class="n">Sfit</span> <span class="o">=</span> <span class="n">_Sphere</span><span class="p">(</span><span class="n">a</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><span class="n">b</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><span class="n">c</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><span class="n">d</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><span class="n">e</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>
666    <span class="n">D</span> <span class="o">=</span> <span class="n">park</span><span class="o">.</span><span class="n">Data1D</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">y</span><span class="p">)</span>
667    <span class="c"># Construct the assembly</span>
668    <span class="n">assembly</span> <span class="o">=</span> <span class="n">park</span><span class="o">.</span><span class="n">Assembly</span><span class="p">([(</span><span class="n">Sfit</span><span class="p">,</span><span class="n">D</span><span class="p">)])</span>
669    <span class="k">return</span> <span class="n">assembly</span>
670
671<span class="k">def</span> <span class="nf">test</span><span class="p">():</span>
672    <span class="n">assembly</span> <span class="o">=</span> <span class="n">example</span><span class="p">()</span>
673    <span class="k">assert</span> <span class="n">assembly</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">parameterset</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="s">&#39;M1&#39;</span>
674
675    <span class="c"># extract the fitting parameters</span>
676    <span class="n">pars</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">assembly</span><span class="o">.</span><span class="n">fit_parameters</span><span class="p">()]</span>
677    <span class="k">assert</span> <span class="nb">set</span><span class="p">(</span><span class="n">pars</span><span class="p">)</span> <span class="o">==</span> <span class="nb">set</span><span class="p">([</span><span class="s">&#39;M1.a&#39;</span><span class="p">,</span><span class="s">&#39;M1.c&#39;</span><span class="p">,</span><span class="s">&#39;M2.a&#39;</span><span class="p">])</span>
678    <span class="c"># Compute chisq and verify constraints are updated properly</span>
679    <span class="k">assert</span> <span class="n">assembly</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mf">1.5</span><span class="p">,</span><span class="mf">2.5</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span>
680    <span class="k">assert</span> <span class="n">assembly</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">c</span> <span class="o">==</span> <span class="mf">1.5</span> <span class="ow">and</span> <span class="n">assembly</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">c</span> <span class="o">==</span> <span class="mi">3</span>
681
682    <span class="c"># Try without constraints</span>
683    <span class="n">assembly</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">c</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
684    <span class="n">assembly</span><span class="o">.</span><span class="n">fit_parameters</span><span class="p">()</span>  <span class="c"># Fit parameters have changed</span>
685    <span class="k">assert</span> <span class="n">assembly</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mf">1.5</span><span class="p">,</span><span class="mf">2.5</span><span class="p">])</span> <span class="o">==</span> <span class="mi">0</span>
686
687    <span class="c"># Check that assembly.cov runs ... still need to check that it is correct!</span>
688    <span class="n">C</span> <span class="o">=</span> <span class="n">assembly</span><span class="o">.</span><span class="n">cov</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span><span class="mf">1.5</span><span class="p">,</span><span class="mf">2.5</span><span class="p">]))</span>
689
690<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>
691</pre></div>
692
693          </div>
694        </div>
695      </div>
696      <div class="sphinxsidebar">
697        <div class="sphinxsidebarwrapper">
698<div id="searchbox" style="display: none">
699  <h3>Quick search</h3>
700    <form class="search" action="../../search.html" method="get">
701      <input type="text" name="q" />
702      <input type="submit" value="Go" />
703      <input type="hidden" name="check_keywords" value="yes" />
704      <input type="hidden" name="area" value="default" />
705    </form>
706    <p class="searchtip" style="font-size: 90%">
707    Enter search terms or a module, class or function name.
708    </p>
709</div>
710<script type="text/javascript">$('#searchbox').show(0);</script>
711        </div>
712      </div>
713      <div class="clearer"></div>
714    </div>
715    <div class="related">
716      <h3>Navigation</h3>
717      <ul>
718        <li class="right" style="margin-right: 10px">
719          <a href="../../genindex.html" title="General Index"
720             >index</a></li>
721        <li class="right" >
722          <a href="../../py-modindex.html" title="Python Module Index"
723             >modules</a> |</li>
724        <li><a href="../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
725          <li><a href="../index.html" >Module code</a> &raquo;</li> 
726      </ul>
727    </div>
728    <div class="footer">
729        &copy; Copyright 2013, The SasView Project.
730      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
731    </div>
732  </body>
733</html>
Note: See TracBrowser for help on using the repository browser.