source: sasview/_modules/park/fit.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: 39.0 KB
Line 
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
4
5<html xmlns="http://www.w3.org/1999/xhtml">
6  <head>
7    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8   
9    <title>park.fit &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.fit</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">Fitting service interface.</span>
54
55<span class="sd">A fit consists of a set of models and a fitting engine.  The models are</span>
56<span class="sd">collected in an assembly, which manages the parameter set and the</span>
57<span class="sd">constraints between them.  The models themselves are tightly coupled</span>
58<span class="sd">to the data that they are modeling and the data is invisible to the fit.</span>
59
60<span class="sd">The fitting engine can use a variety of methods depending on model.</span>
61
62
63<span class="sd">Usage</span>
64<span class="sd">=====</span>
65
66<span class="sd">The fitter can be run directly on the local machine::</span>
67
68<span class="sd">    import park</span>
69<span class="sd">    M1 = park.models.Peaks(datafile=park.sampledata(&#39;peak.dat&#39;))</span>
70<span class="sd">    M1.add_peak(&#39;P1&#39;, &#39;gaussian&#39;, A=[4,6], mu=[0.2, 0.5], sigma=0.1)</span>
71<span class="sd">    result = park.fit(models=[M1])</span>
72<span class="sd">    print result</span>
73
74<span class="sd">The default settings print results every time the fit improves, and</span>
75<span class="sd">print a global result when the fit is complete.  This is a suitable</span>
76<span class="sd">interface for a fitting script.</span>
77
78<span class="sd">For larger fit jobs you will want to run the fit on a remote server.</span>
79<span class="sd">The model setup is identical, but the fit call is different::</span>
80
81<span class="sd">    service = park.FitService(&#39;server:port&#39;)</span>
82<span class="sd">    result = park.fit(models=[M1], service=service)</span>
83<span class="sd">    print result</span>
84
85<span class="sd">Again, the default settings print results every time the fit improves,</span>
86<span class="sd">and print a global result when the fit is complete.</span>
87
88<span class="sd">For long running fit jobs, you want to be able to disconnect from</span>
89<span class="sd">the server after submitting the job, and later reconnect to fetch</span>
90<span class="sd">the results.  An additional email field will send notification by</span>
91<span class="sd">email when the fit starts and ends, and daily updates on the status</span>
92<span class="sd">of all fits::</span>
93
94<span class="sd">    service = park.FitService(&#39;server:port&#39;)</span>
95<span class="sd">    service.notify(email=&#39;me@my.email.address&#39;,update=&#39;daily&#39;)</span>
96<span class="sd">    fit = park.Fit(models=[M1])</span>
97<span class="sd">    id = service.submit_job(fit, jobname=&#39;peaks&#39;)</span>
98<span class="sd">    print id</span>
99
100<span class="sd">The results can be retrieved either by id returned from the server,</span>
101<span class="sd">or by the given jobname::</span>
102
103<span class="sd">    import park</span>
104<span class="sd">    service = park.FitService(&#39;server:port&#39;,user=&#39;userid&#39;)</span>
105<span class="sd">    fitlist = service.retrieve(&#39;peaks&#39;)</span>
106<span class="sd">    for fit in fitlist:</span>
107<span class="sd">        print fit.summary()</span>
108
109<span class="sd">The fit itself is a complicated object, including the model, the</span>
110<span class="sd">optimizer, and the type of uncertainty analysis to perform.</span>
111
112<span class="sd">GUI Usage</span>
113<span class="sd">=========</span>
114
115<span class="sd">When used from a graphical user interface, a different programming</span>
116<span class="sd">interface is needed.  In this case, the user may want to watch</span>
117<span class="sd">the progress of the fit and perhaps stop it.  Also, as fits can</span>
118<span class="sd">take some time to complete, the user would like to be able to</span>
119<span class="sd">set up additional fits and run them at the same time, switching</span>
120<span class="sd">between them as necessary to monitor progress.</span>
121
122<span class="sd">&quot;&quot;&quot;</span>
123<span class="kn">import</span> <span class="nn">time</span><span class="o">,</span> <span class="nn">thread</span>
124
125<span class="kn">import</span> <span class="nn">numpy</span>
126
127<span class="kn">import</span> <span class="nn">assembly</span><span class="o">,</span> <span class="nn">fitresult</span>
128
129<div class="viewcode-block" id="Objective"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.Objective">[docs]</a><span class="k">class</span> <span class="nc">Objective</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
130    <span class="sd">&quot;&quot;&quot;</span>
131<span class="sd">    Abstract interface to the fitness function for the park minimizer</span>
132<span class="sd">    classes.</span>
133
134<span class="sd">    Park provides a specific implementation `park.assembly.Assembly`.</span>
135
136<span class="sd">    TODO: add a results() method to return model specific info to the</span>
137<span class="sd">    TODO: fit handler.</span>
138<span class="sd">    &quot;&quot;&quot;</span>
139<div class="viewcode-block" id="Objective.residuals"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.Objective.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> <span class="n">p</span><span class="p">):</span>
140        <span class="sd">&quot;&quot;&quot;</span>
141<span class="sd">        Some fitters, notably Levenberg-Marquardt, operate directly on the</span>
142<span class="sd">        residuals vector.  If the individual residuals are not available,</span>
143<span class="sd">        then LM cannot be used.</span>
144
145<span class="sd">        This method is optional.</span>
146<span class="sd">        &quot;&quot;&quot;</span>
147        <span class="k">raise</span> <span class="ne">NotImplementedError</span>
148</div>
149<div class="viewcode-block" id="Objective.residuals_deriv"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.Objective.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">p</span><span class="p">):</span>
150        <span class="sd">&quot;&quot;&quot;</span>
151<span class="sd">        Returns residuals and derivatives with respect to the given</span>
152<span class="sd">        parameters.</span>
153
154<span class="sd">        If these are unavailable in the model, then they can be approximated</span>
155<span class="sd">        by numerical derivatives, though it is generally better to use a</span>
156<span class="sd">        derivative free optimizer such as coliny or cobyla which can use the</span>
157<span class="sd">        function evaluations more efficiently.  In any case, your objective</span>
158<span class="sd">        function is responsible for calculating these.</span>
159
160<span class="sd">        This method is optional.</span>
161<span class="sd">        &quot;&quot;&quot;</span>
162        <span class="k">raise</span> <span class="ne">NotImplementedError</span>
163</div>
164<div class="viewcode-block" id="Objective.fit_parameters"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.Objective.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>
165        <span class="sd">&quot;&quot;&quot;</span>
166<span class="sd">        Returns a list of fit parameters.  Each parameter has a name,</span>
167<span class="sd">        an initial value and a range.</span>
168
169<span class="sd">        See `park.fitresult.FitParameter` for an example.</span>
170
171<span class="sd">        On each function evaluation a new parameter set will be passed</span>
172<span class="sd">        to the fitter, with values in the same order as the list of</span>
173<span class="sd">        parameters.</span>
174<span class="sd">        &quot;&quot;&quot;</span>
175        <span class="k">raise</span> <span class="ne">NotImplementedError</span>
176</div>
177    <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">p</span><span class="p">):</span>
178        <span class="sd">&quot;&quot;&quot;</span>
179<span class="sd">        Returns the objective value for parameter set p .</span>
180<span class="sd">        &quot;&quot;&quot;</span>
181        <span class="k">raise</span> <span class="ne">NotImplementedError</span>
182
183<div class="viewcode-block" id="Objective.abort"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.Objective.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>
184        <span class="sd">&quot;&quot;&quot;</span>
185<span class="sd">        Halts the current function evaluation, and has it return inf.</span>
186<span class="sd">        This will be called from a separate thread.  If the function</span>
187<span class="sd">        contains an expensive calculation, it should reset an abort</span>
188<span class="sd">        flag before each evaluation and test it periodically.</span>
189
190<span class="sd">        This method is optional.</span>
191<span class="sd">        &quot;&quot;&quot;</span>
192</div></div>
193<div class="viewcode-block" id="Fitter"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.Fitter">[docs]</a><span class="k">class</span> <span class="nc">Fitter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
194    <span class="sd">&quot;&quot;&quot;Abstract interface for a fitness optimizer.</span>
195
196<span class="sd">    A fitter has a single method, fit, which takes an objective</span>
197<span class="sd">    function (`park.fit.Objective`) and a handler.</span>
198
199<span class="sd">    For a concrete instance see `park.fitmc.FitMC`.</span>
200<span class="sd">    &quot;&quot;&quot;</span>
201    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
202        <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>
203            <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">k</span><span class="p">):</span>
204                <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="n">v</span><span class="p">)</span>
205            <span class="k">else</span><span class="p">:</span>
206                <span class="k">raise</span> <span class="ne">AttributeError</span><span class="p">(</span><span class="n">k</span><span class="o">+</span><span class="s">&quot; is not an attribute of &quot;</span><span class="o">+</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span>
207
208    <span class="k">def</span> <span class="nf">_threaded</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fn</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>
209        <span class="n">thread</span><span class="o">.</span><span class="n">start_new_thread</span><span class="p">(</span><span class="n">fn</span><span class="p">,</span><span class="n">args</span><span class="p">,</span><span class="n">kw</span><span class="p">)</span>
210
211
212    <span class="k">def</span> <span class="nf">_fit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">objective</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">bounds</span><span class="p">):</span>
213        <span class="sd">&quot;&quot;&quot;</span>
214<span class="sd">        Run the actual fit in a separate thread</span>
215
216<span class="sd">        Each cycle k of n:</span>
217<span class="sd">            self.handler.progress(k,n)</span>
218<span class="sd">        Each improvement:</span>
219<span class="sd">            self.handler.result.update(x,fx,ncalls)</span>
220<span class="sd">            self.handler.improvement()</span>
221<span class="sd">        On completion (if not already performed):</span>
222<span class="sd">            self.hander.result.update(x,fx,ncalls)</span>
223<span class="sd">            self.handler.done</span>
224<span class="sd">            self.handler.finalize()</span>
225<span class="sd">        &quot;&quot;&quot;</span>
226        <span class="k">raise</span> <span class="ne">NotImplementedError</span>
227
228<div class="viewcode-block" id="Fitter.fit"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.Fitter.fit">[docs]</a>    <span class="k">def</span> <span class="nf">fit</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">handler</span><span class="p">):</span>
229        <span class="sd">&quot;&quot;&quot;</span>
230<span class="sd">        Global optimizer.</span>
231
232<span class="sd">        This function should return immediately</span>
233<span class="sd">        &quot;&quot;&quot;</span>
234        <span class="c"># Determine initial value and bounds</span>
235        <span class="n">pars</span> <span class="o">=</span> <span class="n">fitness</span><span class="o">.</span><span class="n">fit_parameters</span><span class="p">()</span>
236        <span class="n">bounds</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</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="n">pars</span><span class="p">])</span><span class="o">.</span><span class="n">T</span>
237        <span class="n">x0</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span><span class="o">.</span><span class="n">value</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>
238
239        <span class="c"># Initialize the monitor and results.</span>
240        <span class="c"># Need to make our own copy of the fit results so that the</span>
241        <span class="c"># values don&#39;t get stomped on by the next fit iteration.</span>
242        <span class="n">handler</span><span class="o">.</span><span class="n">done</span> <span class="o">=</span> <span class="bp">False</span>
243        <span class="bp">self</span><span class="o">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handler</span>
244        <span class="n">fitpars</span> <span class="o">=</span> <span class="p">[</span><span class="n">fitresult</span><span class="o">.</span><span class="n">FitParameter</span><span class="p">(</span><span class="n">pars</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">name</span><span class="p">,</span><span class="n">pars</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">range</span><span class="p">,</span><span class="n">v</span><span class="p">)</span>
245                   <span class="k">for</span> <span class="n">i</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">x0</span><span class="p">)]</span>
246        <span class="n">handler</span><span class="o">.</span><span class="n">result</span> <span class="o">=</span> <span class="n">fitresult</span><span class="o">.</span><span class="n">FitResult</span><span class="p">(</span><span class="n">fitpars</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">numpy</span><span class="o">.</span><span class="n">NaN</span><span class="p">)</span>
247
248        <span class="c"># Run the fit (fit should perform _progress and _improvement updates)</span>
249        <span class="c"># This function may return before the fit is complete.</span>
250        <span class="bp">self</span><span class="o">.</span><span class="n">_fit</span><span class="p">(</span><span class="n">fitness</span><span class="p">,</span> <span class="n">x0</span><span class="p">,</span> <span class="n">bounds</span><span class="p">)</span>
251</div></div>
252<div class="viewcode-block" id="FitJob"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.FitJob">[docs]</a><span class="k">class</span> <span class="nc">FitJob</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
253    <span class="sd">&quot;&quot;&quot;</span>
254<span class="sd">    Fit job.</span>
255
256<span class="sd">    This implements `park.job.Job`.</span>
257<span class="sd">    &quot;&quot;&quot;</span>
258    <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">objective</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">fitter</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
259        <span class="bp">self</span><span class="o">.</span><span class="n">fitter</span> <span class="o">=</span> <span class="n">fitter</span>
260        <span class="bp">self</span><span class="o">.</span><span class="n">objective</span> <span class="o">=</span> <span class="n">objective</span>
261        <span class="bp">self</span><span class="o">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handler</span>
262<div class="viewcode-block" id="FitJob.run"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.FitJob.run">[docs]</a>    <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
263        <span class="bp">self</span><span class="o">.</span><span class="n">fitter</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">objective</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">handler</span><span class="p">)</span>
264</div></div>
265<div class="viewcode-block" id="LocalQueue"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.LocalQueue">[docs]</a><span class="k">class</span> <span class="nc">LocalQueue</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
266    <span class="sd">&quot;&quot;&quot;</span>
267<span class="sd">    Simple interface to the local job queue.  Currently supports start and</span>
268<span class="sd">    wait.  Needs to support stop and status.  Also, needs to be a proper queue,</span>
269<span class="sd">    and needs to allow jobs to run in separate processes according to priority,</span>
270<span class="sd">    etc.  All the essentials of the remote queuing system without the remote</span>
271<span class="sd">    calls.</span>
272
273<span class="sd">    Unlike the remote queue, the local queue need not maintain persistence.</span>
274<span class="sd">    &quot;&quot;&quot;</span>
275    <span class="n">running</span> <span class="o">=</span> <span class="bp">False</span>
276<div class="viewcode-block" id="LocalQueue.start"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.LocalQueue.start">[docs]</a>    <span class="k">def</span> <span class="nf">start</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">job</span><span class="p">):</span>
277        <span class="bp">self</span><span class="o">.</span><span class="n">job</span> <span class="o">=</span> <span class="n">job</span>
278        <span class="n">job</span><span class="o">.</span><span class="n">run</span><span class="p">()</span>
279        <span class="k">return</span> <span class="nb">id</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
280</div>
281<div class="viewcode-block" id="LocalQueue.wait"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.LocalQueue.wait">[docs]</a>    <span class="k">def</span> <span class="nf">wait</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interval</span><span class="o">=.</span><span class="mi">1</span><span class="p">):</span>
282        <span class="sd">&quot;&quot;&quot;</span>
283<span class="sd">        Wait for the job to complete.  This is used in scripts to impose</span>
284<span class="sd">        a synchronous interface to the fitting service.</span>
285<span class="sd">        &quot;&quot;&quot;</span>
286        <span class="k">while</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">job</span><span class="o">.</span><span class="n">handler</span><span class="o">.</span><span class="n">done</span><span class="p">:</span>
287            <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="n">interval</span><span class="p">)</span>
288        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">job</span><span class="o">.</span><span class="n">handler</span><span class="o">.</span><span class="n">result</span>
289</div></div>
290<div class="viewcode-block" id="fit"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.fit">[docs]</a><span class="k">def</span> <span class="nf">fit</span><span class="p">(</span><span class="n">models</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">fitter</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">service</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">handler</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
291    <span class="sd">&quot;&quot;&quot;</span>
292<span class="sd">    Start a fit with a set of models.  The model set must be</span>
293<span class="sd">    in a form accepted by `park.assembly.Assembly`.</span>
294
295<span class="sd">    This is a convenience function which sets up the default</span>
296<span class="sd">    optimizer and uses the local fitting engine to do the work.</span>
297<span class="sd">    Progress reports are printed as they are received.</span>
298
299<span class="sd">    The choice of fitter, service and handler can be specified</span>
300<span class="sd">    by the caller.</span>
301
302<span class="sd">    The default fitter is FitMC, which is a monte carlo Nelder-Mead</span>
303<span class="sd">    simplex local optimizer with 100 random start points.</span>
304
305<span class="sd">    The default handler does nothing.  Instead, ConsoleUpdate could</span>
306<span class="sd">    be used to report progress during the fit.</span>
307
308<span class="sd">    The default service is to run in a separate thread with FitThread.</span>
309<span class="sd">    Note that this will change soon to run in a separate process on</span>
310<span class="sd">    the local machine so that python&#39;s global interpreter lock does</span>
311<span class="sd">    not interfere with parallelism.</span>
312<span class="sd">    &quot;&quot;&quot;</span>
313    <span class="k">if</span> <span class="n">models</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s">&#39;fit expected a list of models&#39;</span><span class="p">)</span>
314    <span class="k">if</span> <span class="n">service</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="n">service</span> <span class="o">=</span> <span class="n">LocalQueue</span><span class="p">()</span>
315    <span class="k">if</span> <span class="n">fitter</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
316        <span class="kn">import</span> <span class="nn">fitmc</span>
317        <span class="n">fitter</span> <span class="o">=</span> <span class="n">fitmc</span><span class="o">.</span><span class="n">FitMC</span><span class="p">()</span>
318    <span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="n">handler</span> <span class="o">=</span> <span class="n">fitresult</span><span class="o">.</span><span class="n">FitHandler</span><span class="p">()</span>
319
320    <span class="n">objective</span> <span class="o">=</span> <span class="n">assembly</span><span class="o">.</span><span class="n">Assembly</span><span class="p">(</span><span class="n">models</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">models</span><span class="p">,</span><span class="nb">list</span><span class="p">)</span> <span class="k">else</span> <span class="n">models</span>
321    <span class="n">job</span> <span class="o">=</span> <span class="n">FitJob</span><span class="p">(</span><span class="n">objective</span><span class="p">,</span><span class="n">fitter</span><span class="p">,</span><span class="n">handler</span><span class="p">)</span>
322    <span class="n">service</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="n">job</span><span class="p">)</span>
323    <span class="k">return</span> <span class="n">service</span><span class="o">.</span><span class="n">wait</span><span class="p">()</span>
324
325</div>
326<div class="viewcode-block" id="assembly_example"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.assembly_example">[docs]</a><span class="k">def</span> <span class="nf">assembly_example</span><span class="p">():</span>
327    <span class="kn">import</span> <span class="nn">park</span><span class="o">,</span> <span class="nn">time</span>
328    <span class="n">problem</span> <span class="o">=</span> <span class="n">park</span><span class="o">.</span><span class="n">assembly</span><span class="o">.</span><span class="n">example</span><span class="p">()</span>
329    <span class="c">#result = fit(problem)</span>
330    <span class="c">#result.print_summary()</span>
331    <span class="n">handler</span><span class="o">=</span><span class="n">fitresult</span><span class="o">.</span><span class="n">ConsoleUpdate</span><span class="p">(</span><span class="n">improvement_delta</span><span class="o">=</span><span class="mf">0.1</span><span class="p">,</span><span class="n">progress_delta</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
332    <span class="c">#result = fit(problem, handler=handler)</span>
333    <span class="n">result</span> <span class="o">=</span> <span class="n">fit</span><span class="p">(</span><span class="n">problem</span><span class="p">)</span>
334    <span class="k">print</span> <span class="s">&quot;=== Fit complete ===&quot;</span>
335    <span class="n">result</span><span class="o">.</span><span class="n">print_summary</span><span class="p">()</span>
336    <span class="k">print</span> <span class="s">&quot;=== Target values ===&quot;</span>
337    <span class="k">print</span> <span class="s">&quot;M1: a=1, c=1.5&quot;</span>
338    <span class="k">print</span> <span class="s">&quot;M2: a=2.5, c=3&quot;</span>
339
340    <span class="k">if</span> <span class="bp">False</span><span class="p">:</span>  <span class="c"># Detailed results</span>
341        <span class="k">print</span> <span class="s">&quot;parameter vector&quot;</span><span class="p">,</span><span class="n">result</span><span class="o">.</span><span class="n">pvec</span>
342        <span class="n">problem</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">pvec</span><span class="p">)</span>
343        <span class="k">print</span> <span class="s">&quot;residuals&quot;</span><span class="p">,</span><span class="n">problem</span><span class="o">.</span><span class="n">residuals</span>
344        <span class="k">for</span> <span class="n">k</span><span class="p">,</span><span class="n">m</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">problem</span><span class="o">.</span><span class="n">parts</span><span class="p">):</span>
345            <span class="k">print</span> <span class="s">&quot;Model&quot;</span><span class="p">,</span><span class="n">k</span><span class="p">,</span><span class="s">&quot;chisq&quot;</span><span class="p">,</span><span class="n">m</span><span class="o">.</span><span class="n">chisq</span><span class="p">,</span><span class="s">&quot;weight&quot;</span><span class="p">,</span><span class="n">m</span><span class="o">.</span><span class="n">weight</span>
346            <span class="k">print</span> <span class="s">&quot;pars&quot;</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">model</span><span class="o">.</span><span class="n">a</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">model</span><span class="o">.</span><span class="n">c</span>
347            <span class="k">print</span> <span class="s">&quot;x&quot;</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">data</span><span class="o">.</span><span class="n">fit_x</span>
348            <span class="k">print</span> <span class="s">&quot;y&quot;</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">data</span><span class="o">.</span><span class="n">fit_y</span>
349            <span class="k">print</span> <span class="s">&quot;f(x)&quot;</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">data</span><span class="o">.</span><span class="n">fx</span>
350            <span class="k">print</span> <span class="s">&quot;(y-f(x))/dy&quot;</span><span class="p">,</span><span class="n">m</span><span class="o">.</span><span class="n">residuals</span>
351
352</div>
353<div class="viewcode-block" id="demo"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.demo">[docs]</a><span class="k">def</span> <span class="nf">demo</span><span class="p">(</span><span class="n">fitter</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
354    <span class="sd">&quot;&quot;&quot;Multiple minima example&quot;&quot;&quot;</span>
355    <span class="kn">import</span> <span class="nn">time</span><span class="o">,</span> <span class="nn">math</span>
356    <span class="k">class</span> <span class="nc">MultiMin</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
357        <span class="k">def</span> <span class="nf">fit_parameters</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
358            <span class="k">return</span> <span class="p">[</span><span class="n">fitresult</span><span class="o">.</span><span class="n">FitParameter</span><span class="p">(</span><span class="s">&#39;x1&#39;</span><span class="p">,[</span><span class="o">-</span><span class="mi">5</span><span class="p">,</span><span class="mi">5</span><span class="p">],</span><span class="mi">1</span><span class="p">)]</span>
359        <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">p</span><span class="p">):</span>
360            <span class="n">x</span><span class="o">=</span><span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
361            <span class="n">fx</span> <span class="o">=</span> <span class="n">x</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="o">*</span><span class="n">x</span><span class="o">+</span><span class="mi">3</span><span class="o">*</span><span class="n">math</span><span class="o">.</span><span class="n">pi</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span>
362            <span class="k">return</span> <span class="n">fx</span>
363    <span class="n">handler</span> <span class="o">=</span> <span class="n">fitresult</span><span class="o">.</span><span class="n">ConsoleUpdate</span><span class="p">()</span> <span class="c"># Show updates on the console</span>
364    <span class="n">handler</span><span class="o">.</span><span class="n">progress_delta</span> <span class="o">=</span> <span class="mi">1</span>          <span class="c"># Update user every second</span>
365    <span class="n">handler</span><span class="o">.</span><span class="n">improvement_delta</span> <span class="o">=</span> <span class="mf">0.1</span>     <span class="c"># Show improvements almost immediately</span>
366    <span class="n">fitter</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">MultiMin</span><span class="p">(),</span> <span class="n">handler</span><span class="p">)</span>
367    <span class="k">while</span> <span class="ow">not</span> <span class="n">handler</span><span class="o">.</span><span class="n">done</span><span class="p">:</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
368</div>
369<div class="viewcode-block" id="demo2"><a class="viewcode-back" href="../../dev/api/park.html#park.fit.demo2">[docs]</a><span class="k">def</span> <span class="nf">demo2</span><span class="p">(</span><span class="n">fitter</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
370    <span class="kn">import</span> <span class="nn">park</span><span class="o">,</span> <span class="nn">time</span>
371    <span class="n">problem</span> <span class="o">=</span> <span class="n">park</span><span class="o">.</span><span class="n">assembly</span><span class="o">.</span><span class="n">example</span><span class="p">()</span>
372    <span class="n">handler</span> <span class="o">=</span> <span class="n">fitresult</span><span class="o">.</span><span class="n">ConsoleUpdate</span><span class="p">()</span> <span class="c"># Show updates on the console</span>
373    <span class="n">handler</span><span class="o">.</span><span class="n">progress_delta</span> <span class="o">=</span> <span class="mi">1</span>          <span class="c"># Update user every second</span>
374    <span class="n">handler</span><span class="o">.</span><span class="n">improvement_delta</span> <span class="o">=</span> <span class="mi">1</span>       <span class="c"># Show improvements at the same rate</span>
375    <span class="n">fitter</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">problem</span><span class="p">,</span> <span class="n">handler</span><span class="p">)</span>
376    <span class="k">while</span> <span class="ow">not</span> <span class="n">handler</span><span class="o">.</span><span class="n">done</span><span class="p">:</span> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
377
378
379</div>
380<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>
381    <span class="c">#main()</span>
382    <span class="n">assembly_example</span><span class="p">()</span>
383</pre></div>
384
385          </div>
386        </div>
387      </div>
388      <div class="sphinxsidebar">
389        <div class="sphinxsidebarwrapper">
390<div id="searchbox" style="display: none">
391  <h3>Quick search</h3>
392    <form class="search" action="../../search.html" method="get">
393      <input type="text" name="q" />
394      <input type="submit" value="Go" />
395      <input type="hidden" name="check_keywords" value="yes" />
396      <input type="hidden" name="area" value="default" />
397    </form>
398    <p class="searchtip" style="font-size: 90%">
399    Enter search terms or a module, class or function name.
400    </p>
401</div>
402<script type="text/javascript">$('#searchbox').show(0);</script>
403        </div>
404      </div>
405      <div class="clearer"></div>
406    </div>
407    <div class="related">
408      <h3>Navigation</h3>
409      <ul>
410        <li class="right" style="margin-right: 10px">
411          <a href="../../genindex.html" title="General Index"
412             >index</a></li>
413        <li class="right" >
414          <a href="../../py-modindex.html" title="Python Module Index"
415             >modules</a> |</li>
416        <li><a href="../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
417          <li><a href="../index.html" >Module code</a> &raquo;</li> 
418      </ul>
419    </div>
420    <div class="footer">
421        &copy; Copyright 2013, The SasView Project.
422      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
423    </div>
424  </body>
425</html>
Note: See TracBrowser for help on using the repository browser.