source: sasview/_modules/park/model.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: 56.4 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.model &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.model</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">Define a park fitting model.</span>
54
55<span class="sd">Usage</span>
56<span class="sd">-----</span>
57
58<span class="sd">The simplest sort of fitting model is something like the following::</span>
59
60<span class="sd">    import numpy</span>
61<span class="sd">    import park</span>
62<span class="sd">    def G(x,mu,sigma):</span>
63<span class="sd">        return numpy.exp(-0.5*(x-mu)**2/sigma**2)</span>
64
65<span class="sd">    class Gauss(park.Model):</span>
66<span class="sd">        parameters = [&#39;center&#39;,&#39;width&#39;,&#39;scale&#39;]</span>
67<span class="sd">        def eval(self,x):</span>
68<span class="sd">            return self.scale * G(x,self.center,self.width)</span>
69
70<span class="sd">It has a function which is evaluated at a series of x values and</span>
71<span class="sd">a set of adjustable parameters controlling the shape of f(x).</span>
72
73<span class="sd">You can check your module with something like the following::</span>
74
75<span class="sd">    $ ipython -pylab</span>
76
77<span class="sd">    from gauss import Gauss</span>
78
79<span class="sd">    g = Gauss(center=5,width=1,scale=10)</span>
80<span class="sd">    x = asarray([1,2,3,4,5])</span>
81<span class="sd">    y = g(x)</span>
82<span class="sd">    plot(x,y)</span>
83
84<span class="sd">This should produce a plot of the Gaussian peak.</span>
85
86<span class="sd">You will then want to try your model with some data.  Create a file</span>
87<span class="sd">with some dummy data, such as gauss.dat::</span>
88
89<span class="sd">    # x y</span>
90<span class="sd">    4 2</span>
91<span class="sd">    5 6</span>
92<span class="sd">    6 7</span>
93<span class="sd">    7 3</span>
94
95<span class="sd">In order to match the model to data, you need to define a fitness</span>
96<span class="sd">object.  This shows the difference between the model and the data,</span>
97<span class="sd">which you can then plot or sum to create a weighted chisq value::</span>
98
99<span class="sd">    f = park.Fitness(g, &#39;gauss.dat&#39;)</span>
100<span class="sd">    plot(f.data.fit_x, f.residuals())</span>
101
102<span class="sd">The data file can have up to four columns, either x,y or x,y,dy</span>
103<span class="sd">or x,dx,y,dy where x,y are the measurement points and values,</span>
104<span class="sd">dx is the instrument resolution in x and dy is the uncertainty</span>
105<span class="sd">in the measurement value y.  You can pass any keyword arguments</span>
106<span class="sd">to data.load that are accepted by numpy.loadtxt.  For example,</span>
107<span class="sd">you can reorder columns or skip rows.  Additionally, you can modify</span>
108<span class="sd">data attributes directly x,y,dx,dy and calc_x.  See help on park.Data1D</span>
109<span class="sd">for details.</span>
110
111<span class="sd">Once you have your model debugged you can use it in a fit::</span>
112
113<span class="sd">    g = Gauss(center=[3,5],scale=7.2,width=[1,3])</span>
114<span class="sd">    result = park.fit((g, &#39;gauss.dat&#39;))</span>
115<span class="sd">    result.plot()</span>
116
117<span class="sd">In this example, center and width are allowed to vary but scale is fixed.</span>
118
119<span class="sd">Existing models can be readily adapted to Park::</span>
120
121<span class="sd">    class Gauss(object):</span>
122<span class="sd">        &quot;Existing model&quot;</span>
123<span class="sd">        center,width,scale = 0,1,1</span>
124<span class="sd">        def __init__(self,**kw):</span>
125<span class="sd">            for k,v in kw.items(): setattr(self,k,v)</span>
126<span class="sd">        def eval(self,x):</span>
127<span class="sd">            return self.scale *G(x,self.center,self.width)</span>
128
129<span class="sd">    class GaussAdaptor(Gauss,Model):</span>
130<span class="sd">        &quot;PARK adaptor&quot;</span>
131<span class="sd">        parameters = [&#39;center&#39;,&#39;width&#39;,&#39;scale&#39;]</span>
132<span class="sd">        def __init__(self,*args,**kw):</span>
133<span class="sd">            Model.__init__(self,*args)</span>
134<span class="sd">            Gauss.__init__(self,**kw)</span>
135
136<span class="sd">    g = GaussAdaptor(center=[3,5],scale=7.2,width=[1,3])</span>
137<span class="sd">    result = park.fit((g, &#39;gauss.dat&#39;))</span>
138<span class="sd">    result.plot()</span>
139
140<span class="sd">Models can become much more complex than the ones described above,</span>
141<span class="sd">including multilevel models where fitting parameters can be added</span>
142<span class="sd">and removed dynamically.</span>
143
144<span class="sd">In many cases the park optimizer will need an adaptor for pre-existing</span>
145<span class="sd">models.  The adaptor above relies on python properties to translate</span>
146<span class="sd">model.par access into model._par.get() and model._par.set() where _par</span>
147<span class="sd">is the internal name for par.  This technique works for simple static</span>
148<span class="sd">models, but will not work well for sophisticated models which have,</span>
149<span class="sd">for example, a dynamic parameter set where the model parameters cannot</span>
150<span class="sd">be set as properties.  A solution to this problem is to subclass the</span>
151<span class="sd">park.Parameter and override the value attribute as a property.</span>
152
153<span class="sd">Once models are defined they can be used in a variety of contexts, such</span>
154<span class="sd">as simultaneous fitting with constraints between the parameters.  With</span>
155<span class="sd">some care in defining the model, computationally intensive fits can</span>
156<span class="sd">be distributed across multiple processors.  We provide a simple user</span>
157<span class="sd">interface for interacting with the model parameters and managing fits.</span>
158<span class="sd">This can be extended with model specialized model editors which format</span>
159<span class="sd">the parameters in a sensible way for the model, or allow direct manipulation</span>
160<span class="sd">of the model structure.  The underlying fitting engine can also be</span>
161<span class="sd">used directly from your own user interface.</span>
162
163<span class="sd">&quot;&quot;&quot;</span>
164
165<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;Model&#39;</span><span class="p">]</span>
166
167<span class="kn">import</span> <span class="nn">park</span>
168<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>
169<span class="kn">from</span> <span class="nn">copy</span> <span class="kn">import</span> <span class="n">copy</span><span class="p">,</span> <span class="n">deepcopy</span>
170
171
172<span class="k">class</span> <span class="nc">ParameterProperty</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
173    <span class="sd">&quot;&quot;&quot;</span>
174<span class="sd">    Attribute accessor for a named parameter.</span>
175
176<span class="sd">    Objects of class ParameterProperty act similarly to normal property</span>
177<span class="sd">    objects in that assignment to object.attr triggers the __set__</span>
178<span class="sd">    method of ParameterProperty and queries of the value object.attr</span>
179<span class="sd">    triggers the __get__ method.  These methods look up the actual</span>
180<span class="sd">    parameter in the dictionary model.parameterset, delegating the</span>
181<span class="sd">    the set/get methods of the underlying parameter object.</span>
182
183<span class="sd">    For example::</span>
184
185<span class="sd">        model.P1 = 5</span>
186<span class="sd">        print model.P1</span>
187
188<span class="sd">    is equivalent to::</span>
189
190<span class="sd">        model.parameterset[&#39;P1&#39;].set(5)</span>
191<span class="sd">        print model.parameterset[&#39;P1&#39;].get()</span>
192
193<span class="sd">    To enable this behaviour, the model developer must assign a</span>
194<span class="sd">    ParameterProperty object to a class attribute of the model.  It</span>
195<span class="sd">    must be a class attribute.  Properties assigned as an instance</span>
196<span class="sd">    attribute in the __init__ of the class will not be recognized</span>
197<span class="sd">    as properties.</span>
198
199<span class="sd">    An example model will look something like the following::</span>
200
201<span class="sd">        class MyModel:</span>
202<span class="sd">            # A property must be assigned as a class attribute!</span>
203<span class="sd">            P1 = ParameterProperty(&#39;P1&#39;)</span>
204<span class="sd">            P2 = ParameterProperty(&#39;P2&#39;)</span>
205<span class="sd">            def __init__(self, P1=None, P2=None):</span>
206<span class="sd">                parP1 = Parameter(&#39;P1&#39;)</span>
207<span class="sd">                if P1 is not None: parP1.set(P1)</span>
208<span class="sd">                parP2 = Parameter(&#39;P2&#39;)</span>
209<span class="sd">                if P2 is not None: parP2.set(P2)</span>
210<span class="sd">                self.parameterset = { &#39;P1&#39;: parP1, &#39;P2&#39;: parP2 }</span>
211
212<span class="sd">    This work is done implicitly by MetaModel, and by subclassing</span>
213<span class="sd">    the class Model, the model developer does not ever need to</span>
214<span class="sd">    use ParameterProperty.</span>
215<span class="sd">    &quot;&quot;&quot;</span>
216    <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="p">,</span><span class="o">**</span><span class="n">kw</span><span class="p">):</span>
217        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
218    <span class="k">def</span> <span class="nf">__get__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">instance</span><span class="p">,</span><span class="n">cls</span><span class="p">):</span>
219        <span class="k">return</span> <span class="n">instance</span><span class="o">.</span><span class="n">parameterset</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="o">.</span><span class="n">get</span><span class="p">()</span>
220    <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">instance</span><span class="p">,</span><span class="n">value</span><span class="p">):</span>
221        <span class="n">instance</span><span class="o">.</span><span class="n">parameterset</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="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
222
223
224<span class="k">class</span> <span class="nc">MetaModel</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
225    <span class="sd">&quot;&quot;&quot;</span>
226<span class="sd">    Interpret parameters.</span>
227
228<span class="sd">    This is a meta class, and the usual meta class rules apply.  That is,</span>
229<span class="sd">    the Model base class should be defined like::</span>
230
231<span class="sd">        class Model(object):</span>
232<span class="sd">            __metaclass__ = MetaModel</span>
233<span class="sd">            ...</span>
234
235<span class="sd">    The MetaModel.__new__ method is called whenever a new Model</span>
236<span class="sd">    class is created.  The name of the model, its superclasses and</span>
237<span class="sd">    its attributes are passed to MetaModel.__new__ which creates the</span>
238<span class="sd">    actual class.  It is not called for new instances of the model.</span>
239
240<span class="sd">    MetaModel is designed to simplify the definition of parameters for</span>
241<span class="sd">    the model.  When processing the class, MetaModel defines</span>
242<span class="sd">    parameters which is a list of names of all the parameters in the</span>
243<span class="sd">    model, and parameterset, which is a dictionary of the actual</span>
244<span class="sd">    parameters and any parameter sets in the model.</span>
245
246<span class="sd">    Parameters can be defined using a list of names in the parameter</span>
247<span class="sd">    attribute, or by defining the individual parameters as separate</span>
248<span class="sd">    attributes of class Parameter.</span>
249
250<span class="sd">    For example, the following defines parameters P1, P2, and P3::</span>
251
252<span class="sd">        class MyModel(Model):</span>
253<span class="sd">            parameters = [&#39;P1&#39;,&#39;P2&#39;]</span>
254<span class="sd">            P2 = Parameter(range=[0,inf])</span>
255<span class="sd">            P3 = Parameter()</span>
256
257<span class="sd">    For each parameter, MetaModel will define a parameter accessor,</span>
258<span class="sd">    and add the parameter definition to the parameter set. The accessor</span>
259<span class="sd">    delegates query and assignment to the Parameter get/set methods. The</span>
260<span class="sd">    attributes of the particular parameter instance can be</span>
261<span class="sd">    adjusted using model.parameterset[&#39;name&#39;].attribute = value.</span>
262<span class="sd">    &quot;&quot;&quot;</span>
263    <span class="k">def</span> <span class="nf">__new__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="nb">vars</span><span class="p">):</span>
264        <span class="c">#print &#39;calling model meta&#39;,vars</span>
265
266        <span class="c"># Find all the parameters for the model.  The listed parameters</span>
267        <span class="c"># are defined using::</span>
268        <span class="c">#    parameters = [&#39;P1&#39;, &#39;P2&#39;, ...]</span>
269        <span class="c"># The remaining parameters are defined individually::</span>
270        <span class="c">#    P3 = Parameter()</span>
271        <span class="c">#    P4 = Parameter()</span>
272        <span class="c"># The undefined parameters are those that are listed but not defined.</span>
273        <span class="n">listed</span> <span class="o">=</span> <span class="nb">vars</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;parameters&#39;</span><span class="p">,[])</span>
274        <span class="n">defined</span> <span class="o">=</span> <span class="p">[</span><span class="n">k</span> <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">vars</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span><span class="n">Parameter</span><span class="p">)]</span>
275        <span class="n">undefined</span> <span class="o">=</span> <span class="p">[</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">listed</span> <span class="k">if</span> <span class="n">k</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">defined</span><span class="p">]</span>
276        <span class="c">#print listed,defined,undefined</span>
277
278        <span class="c"># Define a getter/setter for every parameter so that the user</span>
279        <span class="c"># can say model.name to access parameter name.</span>
280        <span class="c">#</span>
281        <span class="c"># Create a parameter object for every undefined parameter.</span>
282        <span class="c"># Check if the base class defines a default value, and use</span>
283        <span class="c"># that for the initial value.  We don&#39;t want to do this for</span>
284        <span class="c"># parameters explicitly defined since the user may have</span>
285        <span class="c"># given them a default value already.</span>
286        <span class="c">#</span>
287        <span class="c"># For predefined parameters we must set the name explicitly.</span>
288        <span class="c"># This saves the user from having to use, e.g.::</span>
289        <span class="c">#     P1 = Parameter(&#39;P1&#39;)</span>
290        <span class="n">pars</span> <span class="o">=</span> <span class="p">[]</span>
291        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">undefined</span><span class="p">:</span>
292            <span class="c"># Check if the attribute value is initialized in a base class</span>
293            <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">bases</span><span class="p">:</span>
294                <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">b</span><span class="p">,</span><span class="n">p</span><span class="p">):</span>
295                    <span class="n">value</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">b</span><span class="p">,</span><span class="n">p</span><span class="p">)</span>
296                    <span class="k">break</span>
297            <span class="k">else</span><span class="p">:</span>
298                <span class="n">value</span> <span class="o">=</span> <span class="mf">0.</span>
299            <span class="c">#print &quot;looking up value in base as&quot;,value</span>
300            <span class="n">pars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">Parameter</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">p</span><span class="p">,</span><span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">))</span>
301            <span class="nb">vars</span><span class="p">[</span><span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">ParameterProperty</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
302        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">defined</span><span class="p">:</span>
303            <span class="c"># Make sure parameter name is correct.  Note that we are using</span>
304            <span class="c"># _name rather than .name to access the name attribute since</span>
305            <span class="c"># name is a read-only parameter.</span>
306            <span class="nb">vars</span><span class="p">[</span><span class="n">p</span><span class="p">]</span><span class="o">.</span><span class="n">_name</span> <span class="o">=</span> <span class="n">p</span>
307            <span class="n">pars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">vars</span><span class="p">[</span><span class="n">p</span><span class="p">])</span>
308            <span class="nb">vars</span><span class="p">[</span><span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">ParameterProperty</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
309
310        <span class="c"># Construct the class attributes &#39;parameters&#39; and &#39;parameterset&#39;.</span>
311        <span class="c"># Listed parameters are given first, with unlisted parameters</span>
312        <span class="c"># following alphabetically.  For hierarchical parameter sets,</span>
313        <span class="c"># we also need to include the defined sets.</span>
314        <span class="n">unlisted</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">defined</span><span class="o">+</span><span class="n">undefined</span><span class="p">)</span> <span class="o">-</span> <span class="nb">set</span><span class="p">(</span><span class="n">listed</span><span class="p">))</span>
315        <span class="n">unlisted</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
316        <span class="n">parameters</span> <span class="o">=</span> <span class="n">listed</span> <span class="o">+</span> <span class="n">unlisted</span>
317        <span class="n">parsets</span> <span class="o">=</span> <span class="p">[</span><span class="n">k</span> <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">vars</span><span class="o">.</span><span class="n">items</span><span class="p">()</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span><span class="n">ParameterSet</span><span class="p">)]</span>
318        <span class="nb">vars</span><span class="p">[</span><span class="s">&#39;parameters&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">parameters</span>
319        <span class="nb">vars</span><span class="p">[</span><span class="s">&#39;parameterset&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ParameterSet</span><span class="p">(</span><span class="n">pars</span><span class="o">=</span><span class="n">pars</span><span class="o">+</span><span class="n">parsets</span><span class="p">)</span>
320        <span class="c">#print &#39;pars&#39;,vars[&#39;parameters&#39;]</span>
321        <span class="c">#print &#39;parset&#39;,vars[&#39;parameterset&#39;]</span>
322
323        <span class="c"># Return a new specialized instance of the class with parameters</span>
324        <span class="c"># and parameterset made explicit.</span>
325        <span class="k">return</span> <span class="nb">type</span><span class="o">.</span><span class="n">__new__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">bases</span><span class="p">,</span> <span class="nb">vars</span><span class="p">)</span>
326
327<div class="viewcode-block" id="Model"><a class="viewcode-back" href="../../dev/api/park.html#park.model.Model">[docs]</a><span class="k">class</span> <span class="nc">Model</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
328    <span class="sd">&quot;&quot;&quot;</span>
329<span class="sd">    Model definition.</span>
330
331<span class="sd">    The model manages attribute access to the fitting parameters and</span>
332<span class="sd">    also manages the dataset.</span>
333
334<span class="sd">    derivatives [&#39;p1&#39;,&#39;p2&#39;,...]</span>
335<span class="sd">        List of parameters for which the model can calculate</span>
336<span class="sd">        derivatives.  The derivs</span>
337<span class="sd">        The model function can compute the derivative with respect</span>
338<span class="sd">        to this parameter.  The function model.derivs(x,[p1,p2,...])</span>
339<span class="sd">        will return (f(x),df/dp1(x), ...).  The parameters and their</span>
340<span class="sd">        order are determined by the fitting engine.</span>
341
342<span class="sd">        Note: This is a property of the model, not the fit.</span>
343<span class="sd">        Numerical derivatives will be used if the parameter is</span>
344<span class="sd">        used in an expression or if no analytic derivative is</span>
345<span class="sd">        available for the parameter.  Automatic differentiation</span>
346<span class="sd">        on parameter expressions is possible, but beyond the scope</span>
347<span class="sd">        of this project.</span>
348
349<span class="sd">    eval(x)</span>
350<span class="sd">        Evaluate the model at x.  This must be defined by the subclass.</span>
351
352<span class="sd">    eval_deriv(x,pars=[])</span>
353<span class="sd">        Evaluate the model and the derivatives at x.  This must be</span>
354<span class="sd">        defined by the subclass.</span>
355
356<span class="sd">    parameters</span>
357<span class="sd">        The names of the model parameters.  If this is not provided, then</span>
358<span class="sd">        the model will search the subclass for park.Parameter attributes</span>
359<span class="sd">        and construct the list of names from that.  Any parameters in the</span>
360<span class="sd">        list not already defined as park.Parameter attributes will be</span>
361<span class="sd">        defined as parameters with a default of 0.</span>
362
363<span class="sd">    parameterset</span>
364<span class="sd">        The set of parameters defined by the model.  These are the</span>
365<span class="sd">        parameters themselves, gathered into a park.ParameterSet.</span>
366
367<span class="sd">    The minimum fittng model if you choose not to subclass park.Model</span>
368<span class="sd">    requires parameterset and a residuals() method.</span>
369<span class="sd">    &quot;&quot;&quot;</span>
370    <span class="n">__metaclass__</span> <span class="o">=</span> <span class="n">MetaModel</span>
371    <span class="n">derivatives</span> <span class="o">=</span> <span class="p">[]</span>
372    <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="o">*</span><span class="n">args</span><span class="p">,</span><span class="o">**</span><span class="n">kw</span><span class="p">):</span>
373        <span class="sd">&quot;&quot;&quot;</span>
374<span class="sd">        Initialize the model.</span>
375
376<span class="sd">        Model(&#39;name&#39;,P1=value, P2=Value, ...)</span>
377
378<span class="sd">        When overriding __init__ in the subclass be sure to call</span>
379<span class="sd">        Model.__init__(self, *args, **kw).  This makes a private</span>
380<span class="sd">        copy of the parameterset for the model and initializes</span>
381<span class="sd">        any parameters set using keyword arguments.</span>
382<span class="sd">        &quot;&quot;&quot;</span>
383        <span class="c">#print &#39;calling model init on&#39;,id(self)</span>
384        <span class="c"># To avoid trashing the Model.parname = Parameter() template</span>
385        <span class="c"># when we create an instance and accessor for the parameter</span>
386        <span class="c"># we need to make sure that we are using our own copy of the</span>
387        <span class="c"># model dictionary stored in vars</span>
388        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span><span class="o">&gt;</span><span class="mi">1</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s">&quot;expect name as model parameter&quot;</span><span class="p">)</span>
389        <span class="n">name</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span><span class="o">&gt;=</span><span class="mi">1</span> <span class="k">else</span> <span class="s">&#39;unknown&#39;</span>
390        <span class="bp">self</span><span class="o">.</span><span class="n">parameterset</span> <span class="o">=</span> <span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">parameterset</span><span class="p">)</span>
391        <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>
392            <span class="bp">self</span><span class="o">.</span><span class="n">parameterset</span><span class="p">[</span><span class="n">k</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
393        <span class="bp">self</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="n">name</span>
394        <span class="c">#print &#39;done&#39;,id(self)</span>
395
396    <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">x</span><span class="p">,</span> <span class="n">pars</span><span class="o">=</span><span class="p">[]):</span>
397        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
398
399<div class="viewcode-block" id="Model.eval"><a class="viewcode-back" href="../../dev/api/park.html#park.model.Model.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> <span class="n">x</span><span class="p">):</span>
400        <span class="sd">&quot;&quot;&quot;</span>
401<span class="sd">        Evaluate the model at x.</span>
402
403<span class="sd">        This method needs to be specialized in the model to evaluate the</span>
404<span class="sd">        model function.  Alternatively, the model can implement is own</span>
405<span class="sd">        version of residuals which calculates the residuals directly</span>
406<span class="sd">        instead of calling eval.</span>
407<span class="sd">        &quot;&quot;&quot;</span>
408        <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">&#39;Model needs to implement eval&#39;</span><span class="p">)</span>
409</div>
410<div class="viewcode-block" id="Model.eval_derivs"><a class="viewcode-back" href="../../dev/api/park.html#park.model.Model.eval_derivs">[docs]</a>    <span class="k">def</span> <span class="nf">eval_derivs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">pars</span><span class="o">=</span><span class="p">[]):</span>
411        <span class="sd">&quot;&quot;&quot;</span>
412<span class="sd">        Evaluate the model and derivatives wrt pars at x.</span>
413
414<span class="sd">        pars is a list of the names of the parameters for which derivatives</span>
415<span class="sd">        are desired.</span>
416
417<span class="sd">        This method needs to be specialized in the model to evaluate the</span>
418<span class="sd">        model function.  Alternatively, the model can implement is own</span>
419<span class="sd">        version of residuals which calculates the residuals directly</span>
420<span class="sd">        instead of calling eval.</span>
421<span class="sd">        &quot;&quot;&quot;</span>
422        <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s">&#39;Model needs to implement eval_derivs&#39;</span><span class="p">)</span>
423</div>
424<div class="viewcode-block" id="Model.set"><a class="viewcode-back" href="../../dev/api/park.html#park.model.Model.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>
425        <span class="sd">&quot;&quot;&quot;</span>
426<span class="sd">        Set the initial value for a set of parameters.</span>
427
428<span class="sd">        E.g., model.set(width=3,center=5)</span>
429<span class="sd">        &quot;&quot;&quot;</span>
430        <span class="c"># This is a convenience funciton for the user.</span>
431        <span class="c">#</span>
432        <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>
433            <span class="bp">self</span><span class="o">.</span><span class="n">parameterset</span><span class="p">[</span><span class="n">k</span><span class="p">]</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
434
435</div></div>
436<span class="k">def</span> <span class="nf">add_parameter</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
437    <span class="sd">&quot;&quot;&quot;</span>
438<span class="sd">    Add a parameter to an existing park model.</span>
439
440<span class="sd">    Note: this may not work if it is operating on a BaseModel.</span>
441<span class="sd">    &quot;&quot;&quot;</span>
442    <span class="nb">setattr</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">__class__</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">park</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">ParameterProperty</span><span class="p">(</span><span class="n">name</span><span class="p">))</span>
443    <span class="n">model</span><span class="o">.</span><span class="n">parameterset</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">park</span><span class="o">.</span><span class="n">Parameter</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">))</span>
444
445
446<span class="k">def</span> <span class="nf">test</span><span class="p">():</span>
447    <span class="c"># Gauss theory function</span>
448    <span class="kn">import</span> <span class="nn">numpy</span>
449    <span class="n">eps</span><span class="p">,</span><span class="n">inf</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">finfo</span><span class="p">(</span><span class="s">&#39;d&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">eps</span><span class="p">,</span><span class="n">numpy</span><span class="o">.</span><span class="n">inf</span>
450    <span class="k">def</span> <span class="nf">G</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">mu</span><span class="p">,</span><span class="n">sigma</span><span class="p">):</span>
451        <span class="n">mu</span><span class="p">,</span><span class="n">sigma</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">mu</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">sigma</span><span class="p">)</span>
452        <span class="k">return</span> <span class="n">numpy</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="mf">0.5</span><span class="o">*</span><span class="p">(</span><span class="n">x</span><span class="o">-</span><span class="n">mu</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="o">/</span><span class="n">sigma</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
453
454    <span class="c"># === Minimal model ===</span>
455    <span class="c"># just list the fitting parameters and define the function.</span>
456    <span class="k">class</span> <span class="nc">Gauss</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
457        <span class="n">parameters</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;center&#39;</span><span class="p">,</span><span class="s">&#39;width&#39;</span><span class="p">,</span><span class="s">&#39;scale&#39;</span><span class="p">]</span>
458        <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>
459            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">scale</span> <span class="o">*</span> <span class="n">G</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">center</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">)</span>
460
461    <span class="c"># Create a couple of models and make sure they don&#39;t conflict</span>
462    <span class="n">g1</span> <span class="o">=</span> <span class="n">Gauss</span><span class="p">(</span><span class="n">center</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span><span class="n">width</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span><span class="n">scale</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
463    <span class="k">assert</span> <span class="n">g1</span><span class="o">.</span><span class="n">center</span> <span class="o">==</span> <span class="mi">5</span>
464    <span class="n">g2</span> <span class="o">=</span> <span class="n">Gauss</span><span class="p">(</span><span class="n">center</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span><span class="n">width</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
465    <span class="k">assert</span> <span class="n">g1</span><span class="o">.</span><span class="n">center</span> <span class="o">==</span> <span class="mi">5</span>
466    <span class="k">assert</span> <span class="n">g2</span><span class="o">.</span><span class="n">center</span> <span class="o">==</span> <span class="mi">6</span>
467    <span class="k">assert</span> <span class="n">g1</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span>
468    <span class="k">assert</span> <span class="n">g2</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span>
469
470    <span class="c"># === explore parameters ===</span>
471    <span class="c"># dedicated model using park parameters directly, and defining derivatives</span>
472    <span class="k">class</span> <span class="nc">Gauss</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
473        <span class="n">center</span> <span class="o">=</span> <span class="n">Parameter</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
474                           <span class="n">tip</span><span class="o">=</span><span class="s">&#39;Peak center&#39;</span><span class="p">)</span>
475        <span class="n">width</span> <span class="o">=</span> <span class="n">Parameter</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
476                          <span class="n">limits</span><span class="o">=</span><span class="p">(</span><span class="n">eps</span><span class="p">,</span><span class="n">inf</span><span class="p">),</span>
477                          <span class="n">tip</span><span class="o">=</span><span class="s">&#39;Peak width (1-sigma)&#39;</span><span class="p">)</span>
478        <span class="n">scale</span> <span class="o">=</span> <span class="n">Parameter</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
479                          <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>
480                          <span class="n">tip</span><span class="o">=</span><span class="s">&#39;Peak scale (&gt;0)&#39;</span><span class="p">)</span>
481        <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>
482            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">scale</span> <span class="o">*</span> <span class="n">G</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">center</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">)</span>
483
484        <span class="c"># Derivatives</span>
485        <span class="n">derivatives</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;center&#39;</span><span class="p">,</span><span class="s">&#39;width&#39;</span><span class="p">,</span><span class="s">&#39;scale&#39;</span><span class="p">]</span>
486        <span class="k">def</span> <span class="nf">dscale</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
487            <span class="k">return</span> <span class="n">g</span><span class="o">/</span><span class="bp">self</span><span class="o">.</span><span class="n">scale</span>
488        <span class="k">def</span> <span class="nf">dcenter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
489            <span class="k">return</span> <span class="mi">2</span><span class="o">*</span><span class="p">(</span><span class="n">x</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">center</span><span class="p">)</span><span class="o">/</span><span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="o">*</span><span class="n">g</span>
490        <span class="k">def</span> <span class="nf">dwidth</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
491            <span class="k">return</span> <span class="mi">2</span><span class="o">*</span><span class="p">(</span><span class="n">x</span><span class="o">-</span><span class="bp">self</span><span class="o">.</span><span class="n">center</span><span class="p">)</span><span class="o">/</span><span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="o">**</span><span class="mi">3</span><span class="o">*</span><span class="n">g</span>
492        <span class="n">dmap</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">scale</span><span class="o">=</span><span class="n">dscale</span><span class="p">,</span><span class="n">center</span><span class="o">=</span><span class="n">dcenter</span><span class="p">,</span><span class="n">width</span><span class="o">=</span><span class="n">dwidth</span><span class="p">)</span>
493        <span class="k">def</span> <span class="nf">eval_derivs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">x</span><span class="p">,</span><span class="n">pars</span><span class="o">=</span><span class="p">[]):</span>
494            <span class="sd">&quot;&quot;&quot;</span>
495<span class="sd">            Calculate function value and derivatives wrt to the parameters.</span>
496
497<span class="sd">            pars is a list of parameter names, possibly consisting of any</span>
498<span class="sd">            parameter with deriv=True.</span>
499<span class="sd">            &quot;&quot;&quot;</span>
500            <span class="n">g</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">eval</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
501            <span class="n">dg</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">dmap</span><span class="p">[</span><span class="n">p</span><span class="p">](</span><span class="bp">self</span><span class="p">,</span><span class="n">g</span><span class="p">,</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">pars</span><span class="p">]</span>
502            <span class="k">return</span> <span class="p">[</span><span class="n">g</span><span class="p">]</span><span class="o">+</span><span class="n">dg</span>
503
504    <span class="n">g1</span> <span class="o">=</span> <span class="n">Gauss</span><span class="p">(</span><span class="n">center</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
505    <span class="n">g1</span><span class="o">.</span><span class="n">parameterset</span><span class="p">[</span><span class="s">&#39;center&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">tip</span> <span class="o">=</span> <span class="s">&#39;This is the center&#39;</span>
506    <span class="k">assert</span> <span class="n">g1</span><span class="o">.</span><span class="n">center</span> <span class="o">==</span> <span class="mi">5</span>
507    <span class="n">g2</span> <span class="o">=</span> <span class="n">Gauss</span><span class="p">(</span><span class="n">center</span><span class="o">=</span><span class="mi">6</span><span class="p">)</span>
508    <span class="k">assert</span> <span class="n">g1</span><span class="o">.</span><span class="n">center</span> <span class="o">==</span> <span class="mi">5</span>
509    <span class="k">assert</span> <span class="n">g2</span><span class="o">.</span><span class="n">center</span> <span class="o">==</span> <span class="mi">6</span>
510    <span class="k">assert</span> <span class="n">g1</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span>
511    <span class="k">assert</span> <span class="n">g2</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span>
512
513    <span class="c"># ====== Test wrapper =======</span>
514    <span class="c"># delegate to existing model via inheritence</span>
515    <span class="k">class</span> <span class="nc">Gauss</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
516        <span class="sd">&quot;&quot;&quot;Pre-existing model&quot;&quot;&quot;</span>
517        <span class="n">center</span><span class="p">,</span><span class="n">width</span><span class="p">,</span><span class="n">scale</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span>
518        <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="o">**</span><span class="n">kw</span><span class="p">):</span>
519            <span class="c">#print &quot;calling BaseGauss init on&quot;,id(self)</span>
520            <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> <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>
521            <span class="c">#print &quot;done&quot;,id(self)</span>
522        <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>
523            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">scale</span> <span class="o">*</span><span class="n">G</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">center</span><span class="p">,</span><span class="bp">self</span><span class="o">.</span><span class="n">width</span><span class="p">)</span>
524
525    <span class="k">class</span> <span class="nc">GaussAdaptor</span><span class="p">(</span><span class="n">Gauss</span><span class="p">,</span><span class="n">Model</span><span class="p">):</span>
526        <span class="sd">&quot;&quot;&quot;PARK wrapper&quot;&quot;&quot;</span>
527        <span class="n">parameters</span> <span class="o">=</span> <span class="p">[</span><span class="s">&#39;center&#39;</span><span class="p">,</span><span class="s">&#39;width&#39;</span><span class="p">,</span><span class="s">&#39;scale&#39;</span><span class="p">]</span>
528        <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="o">*</span><span class="n">args</span><span class="p">,</span><span class="o">**</span><span class="n">kw</span><span class="p">):</span>
529            <span class="c">#print &quot;calling Gauss init on&quot;,id(self)</span>
530            <span class="n">Model</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
531            <span class="n">Gauss</span><span class="o">.</span><span class="n">__init__</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>
532            <span class="c">#print &quot;done&quot;,id(self)</span>
533
534    <span class="n">g1</span> <span class="o">=</span> <span class="n">GaussAdaptor</span><span class="p">(</span><span class="n">center</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
535    <span class="n">g2</span> <span class="o">=</span> <span class="n">GaussAdaptor</span><span class="p">(</span><span class="n">center</span><span class="o">=</span><span class="mi">6</span><span class="p">)</span>
536    <span class="n">g3</span> <span class="o">=</span> <span class="n">GaussAdaptor</span><span class="p">()</span>
537    <span class="k">assert</span> <span class="n">g1</span><span class="o">.</span><span class="n">center</span> <span class="o">==</span> <span class="mi">5</span>
538    <span class="k">assert</span> <span class="n">g2</span><span class="o">.</span><span class="n">center</span> <span class="o">==</span> <span class="mi">6</span>
539    <span class="k">assert</span> <span class="n">g3</span><span class="o">.</span><span class="n">scale</span> <span class="o">==</span> <span class="mi">1</span>
540    <span class="k">assert</span> <span class="n">g1</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span>
541    <span class="k">assert</span> <span class="n">g2</span><span class="p">(</span><span class="mi">6</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span>
542
543    <span class="n">g4</span> <span class="o">=</span> <span class="n">GaussAdaptor</span><span class="p">(</span><span class="s">&#39;M3&#39;</span><span class="p">,</span><span class="n">center</span><span class="o">=</span><span class="mi">6</span><span class="p">)</span>
544    <span class="k">assert</span> <span class="n">g4</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;M3&#39;</span>
545
546    <span class="c"># dedicated multilevel model using park parameters directly</span>
547    <span class="k">class</span> <span class="nc">MultiGauss</span><span class="p">(</span><span class="n">Model</span><span class="p">):</span>
548        <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">name</span><span class="p">,</span><span class="n">model</span><span class="p">):</span>
549            <span class="k">pass</span>
550
551    <span class="c"># wrapped model using park parameters indirectly</span>
552    <span class="k">class</span> <span class="nc">BaseMultiGauss</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
553        <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
554            <span class="bp">self</span><span class="o">.</span><span class="n">models</span> <span class="o">=</span> <span class="p">[]</span>
555        <span class="k">def</span> <span class="nf">add</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>
556            <span class="bp">self</span><span class="o">.</span><span class="n">models</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">BaseGauss</span><span class="p">(</span><span class="o">**</span><span class="n">kw</span><span class="p">))</span>
557    <span class="k">class</span> <span class="nc">WrapMultiGauss</span><span class="p">(</span><span class="n">BaseMultiGauss</span><span class="p">,</span><span class="n">Model</span><span class="p">):</span>
558        <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
559            <span class="k">pass</span>
560
561<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>
562</pre></div>
563
564          </div>
565        </div>
566      </div>
567      <div class="sphinxsidebar">
568        <div class="sphinxsidebarwrapper">
569<div id="searchbox" style="display: none">
570  <h3>Quick search</h3>
571    <form class="search" action="../../search.html" method="get">
572      <input type="text" name="q" />
573      <input type="submit" value="Go" />
574      <input type="hidden" name="check_keywords" value="yes" />
575      <input type="hidden" name="area" value="default" />
576    </form>
577    <p class="searchtip" style="font-size: 90%">
578    Enter search terms or a module, class or function name.
579    </p>
580</div>
581<script type="text/javascript">$('#searchbox').show(0);</script>
582        </div>
583      </div>
584      <div class="clearer"></div>
585    </div>
586    <div class="related">
587      <h3>Navigation</h3>
588      <ul>
589        <li class="right" style="margin-right: 10px">
590          <a href="../../genindex.html" title="General Index"
591             >index</a></li>
592        <li class="right" >
593          <a href="../../py-modindex.html" title="Python Module Index"
594             >modules</a> |</li>
595        <li><a href="../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
596          <li><a href="../index.html" >Module code</a> &raquo;</li> 
597      </ul>
598    </div>
599    <div class="footer">
600        &copy; Copyright 2013, The SasView Project.
601      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
602    </div>
603  </body>
604</html>
Note: See TracBrowser for help on using the repository browser.