source: sasview/_modules/sas/fit/ScipyFitting.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: 41.8 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>sas.fit.ScipyFitting &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 sas.fit.ScipyFitting</h1><div class="highlight"><pre>
51<span class="sd">&quot;&quot;&quot;</span>
52<span class="sd">ScipyFitting module contains FitArrange , ScipyFit,</span>
53<span class="sd">Parameter classes.All listed classes work together to perform a </span>
54<span class="sd">simple fit with scipy optimizer.</span>
55<span class="sd">&quot;&quot;&quot;</span>
56<span class="kn">import</span> <span class="nn">sys</span>
57<span class="kn">import</span> <span class="nn">copy</span>
58
59<span class="kn">import</span> <span class="nn">numpy</span> 
60
61<span class="kn">from</span> <span class="nn">sas.fit.AbstractFitEngine</span> <span class="kn">import</span> <span class="n">FitEngine</span>
62<span class="kn">from</span> <span class="nn">sas.fit.AbstractFitEngine</span> <span class="kn">import</span> <span class="n">FResult</span>
63
64<span class="n">_SMALLVALUE</span> <span class="o">=</span> <span class="mf">1.0e-10</span>
65
66<div class="viewcode-block" id="SasAssembly"><a class="viewcode-back" href="../../../dev/api/sas.fit.html#sas.fit.ScipyFitting.SasAssembly">[docs]</a><span class="k">class</span> <span class="nc">SasAssembly</span><span class="p">:</span>
67    <span class="sd">&quot;&quot;&quot;</span>
68<span class="sd">    Sas Assembly class a class wrapper to be call in optimizer.leastsq method</span>
69<span class="sd">    &quot;&quot;&quot;</span>
70    <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">paramlist</span><span class="p">,</span> <span class="n">model</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">fitresult</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
71                 <span class="n">handler</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">curr_thread</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">msg_q</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
72        <span class="sd">&quot;&quot;&quot;</span>
73<span class="sd">        :param Model: the model wrapper fro sas -model</span>
74<span class="sd">        :param Data: the data wrapper for sas data</span>
75
76<span class="sd">        &quot;&quot;&quot;</span>
77        <span class="bp">self</span><span class="o">.</span><span class="n">model</span> <span class="o">=</span> <span class="n">model</span>
78        <span class="bp">self</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">data</span>
79        <span class="bp">self</span><span class="o">.</span><span class="n">paramlist</span> <span class="o">=</span> <span class="n">paramlist</span>
80        <span class="bp">self</span><span class="o">.</span><span class="n">msg_q</span> <span class="o">=</span> <span class="n">msg_q</span>
81        <span class="bp">self</span><span class="o">.</span><span class="n">curr_thread</span> <span class="o">=</span> <span class="n">curr_thread</span>
82        <span class="bp">self</span><span class="o">.</span><span class="n">handler</span> <span class="o">=</span> <span class="n">handler</span>
83        <span class="bp">self</span><span class="o">.</span><span class="n">fitresult</span> <span class="o">=</span> <span class="n">fitresult</span>
84        <span class="bp">self</span><span class="o">.</span><span class="n">res</span> <span class="o">=</span> <span class="p">[]</span>
85        <span class="bp">self</span><span class="o">.</span><span class="n">true_res</span> <span class="o">=</span> <span class="p">[]</span>
86        <span class="bp">self</span><span class="o">.</span><span class="n">func_name</span> <span class="o">=</span> <span class="s">&quot;Functor&quot;</span>
87        <span class="bp">self</span><span class="o">.</span><span class="n">theory</span> <span class="o">=</span> <span class="bp">None</span>
88
89<div class="viewcode-block" id="SasAssembly.chisq"><a class="viewcode-back" href="../../../dev/api/sas.fit.html#sas.fit.ScipyFitting.SasAssembly.chisq">[docs]</a>    <span class="k">def</span> <span class="nf">chisq</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
90        <span class="sd">&quot;&quot;&quot;</span>
91<span class="sd">        Calculates chi^2</span>
92
93<span class="sd">        :param params: list of parameter values</span>
94
95<span class="sd">        :return: chi^2</span>
96
97<span class="sd">        &quot;&quot;&quot;</span>
98        <span class="n">total</span> <span class="o">=</span> <span class="mi">0</span>
99        <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">true_res</span><span class="p">:</span>
100            <span class="n">total</span> <span class="o">+=</span> <span class="n">item</span> <span class="o">*</span> <span class="n">item</span>
101        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">true_res</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
102            <span class="k">return</span> <span class="bp">None</span>
103        <span class="k">return</span> <span class="n">total</span> <span class="o">/</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">true_res</span><span class="p">)</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">paramlist</span><span class="p">))</span>
104</div>
105    <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">params</span><span class="p">):</span>
106        <span class="sd">&quot;&quot;&quot;</span>
107<span class="sd">            Compute residuals</span>
108<span class="sd">            :param params: value of parameters to fit</span>
109<span class="sd">        &quot;&quot;&quot;</span>
110        <span class="c">#import thread</span>
111        <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">set_params</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">paramlist</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span>
112        <span class="c">#print &quot;params&quot;, params</span>
113        <span class="bp">self</span><span class="o">.</span><span class="n">true_res</span><span class="p">,</span> <span class="n">theory</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">residuals</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">eval</span><span class="p">)</span>
114        <span class="bp">self</span><span class="o">.</span><span class="n">theory</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">theory</span><span class="p">)</span>
115        <span class="c"># check parameters range</span>
116        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">check_param_range</span><span class="p">():</span>
117            <span class="c"># if the param value is outside of the bound</span>
118            <span class="c"># just silent return res = inf</span>
119            <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">res</span>
120        <span class="bp">self</span><span class="o">.</span><span class="n">res</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">true_res</span>
121
122        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fitresult</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
123            <span class="bp">self</span><span class="o">.</span><span class="n">fitresult</span><span class="o">.</span><span class="n">set_model</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
124            <span class="bp">self</span><span class="o">.</span><span class="n">fitresult</span><span class="o">.</span><span class="n">residuals</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">true_res</span>
125            <span class="bp">self</span><span class="o">.</span><span class="n">fitresult</span><span class="o">.</span><span class="n">iterations</span> <span class="o">+=</span> <span class="mi">1</span>
126            <span class="bp">self</span><span class="o">.</span><span class="n">fitresult</span><span class="o">.</span><span class="n">theory</span> <span class="o">=</span> <span class="n">theory</span>
127
128            <span class="c">#fitness = self.chisq(params=params)</span>
129            <span class="n">fitness</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">chisq</span><span class="p">()</span>
130            <span class="bp">self</span><span class="o">.</span><span class="n">fitresult</span><span class="o">.</span><span class="n">pvec</span> <span class="o">=</span> <span class="n">params</span>
131            <span class="bp">self</span><span class="o">.</span><span class="n">fitresult</span><span class="o">.</span><span class="n">set_fitness</span><span class="p">(</span><span class="n">fitness</span><span class="o">=</span><span class="n">fitness</span><span class="p">)</span>
132            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg_q</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
133                <span class="bp">self</span><span class="o">.</span><span class="n">msg_q</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">fitresult</span><span class="p">)</span>
134
135            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">handler</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
136                <span class="bp">self</span><span class="o">.</span><span class="n">handler</span><span class="o">.</span><span class="n">set_result</span><span class="p">(</span><span class="n">result</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">fitresult</span><span class="p">)</span>
137                <span class="bp">self</span><span class="o">.</span><span class="n">handler</span><span class="o">.</span><span class="n">update_fit</span><span class="p">()</span>
138
139            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">curr_thread</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
140                <span class="k">try</span><span class="p">:</span>
141                    <span class="bp">self</span><span class="o">.</span><span class="n">curr_thread</span><span class="o">.</span><span class="n">isquit</span><span class="p">()</span>
142                <span class="k">except</span><span class="p">:</span>
143                    <span class="c">#msg = &quot;Fitting: Terminated...       Note: Forcing to stop &quot;</span>
144                    <span class="c">#msg += &quot;fitting may cause a &#39;Functor error message&#39; &quot;</span>
145                    <span class="c">#msg += &quot;being recorded in the log file.....&quot;</span>
146                    <span class="c">#self.handler.stop(msg)</span>
147                    <span class="k">raise</span>
148
149        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">res</span>
150
151<div class="viewcode-block" id="SasAssembly.check_param_range"><a class="viewcode-back" href="../../../dev/api/sas.fit.html#sas.fit.ScipyFitting.SasAssembly.check_param_range">[docs]</a>    <span class="k">def</span> <span class="nf">check_param_range</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
152        <span class="sd">&quot;&quot;&quot;</span>
153<span class="sd">        Check the lower and upper bound of the parameter value</span>
154<span class="sd">        and set res to the inf if the value is outside of the</span>
155<span class="sd">        range</span>
156<span class="sd">        :limitation: the initial values must be within range.</span>
157<span class="sd">        &quot;&quot;&quot;</span>
158
159        <span class="c">#time.sleep(0.01)</span>
160        <span class="n">is_outofbound</span> <span class="o">=</span> <span class="bp">False</span>
161        <span class="c"># loop through the fit parameters</span>
162        <span class="n">model</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">model</span>
163        <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">paramlist</span><span class="p">:</span>
164            <span class="n">value</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">getParam</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
165            <span class="n">low</span><span class="p">,</span><span class="n">high</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">details</span><span class="p">[</span><span class="n">p</span><span class="p">][</span><span class="mi">1</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span>
166            <span class="k">if</span> <span class="n">low</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">low</span><span class="p">):</span>
167                <span class="k">if</span> <span class="n">p</span><span class="o">.</span><span class="n">value</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
168                    <span class="c"># This value works on Scipy</span>
169                    <span class="c"># Do not change numbers below</span>
170                    <span class="n">value</span> <span class="o">=</span> <span class="n">_SMALLVALUE</span>
171                <span class="c"># For leastsq, it needs a bit step back from the boundary</span>
172                <span class="n">val</span> <span class="o">=</span> <span class="n">low</span> <span class="o">-</span> <span class="n">value</span> <span class="o">*</span> <span class="n">_SMALLVALUE</span>
173                <span class="k">if</span> <span class="n">value</span> <span class="o">&lt;</span> <span class="n">val</span><span class="p">:</span>
174                    <span class="bp">self</span><span class="o">.</span><span class="n">res</span> <span class="o">*=</span> <span class="mf">1e+6</span>
175                    <span class="n">is_outofbound</span> <span class="o">=</span> <span class="bp">True</span>
176                    <span class="k">break</span>
177            <span class="k">if</span> <span class="n">high</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">high</span><span class="p">):</span>
178                <span class="c"># This value works on Scipy</span>
179                <span class="c"># Do not change numbers below</span>
180                <span class="k">if</span> <span class="n">value</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
181                    <span class="n">value</span> <span class="o">=</span> <span class="n">_SMALLVALUE</span>
182                <span class="c"># For leastsq, it needs a bit step back from the boundary</span>
183                <span class="n">val</span> <span class="o">=</span> <span class="n">high</span> <span class="o">+</span> <span class="n">value</span> <span class="o">*</span> <span class="n">_SMALLVALUE</span>
184                <span class="k">if</span> <span class="n">value</span> <span class="o">&gt;</span> <span class="n">val</span><span class="p">:</span>
185                    <span class="bp">self</span><span class="o">.</span><span class="n">res</span> <span class="o">*=</span> <span class="mf">1e+6</span>
186                    <span class="n">is_outofbound</span> <span class="o">=</span> <span class="bp">True</span>
187                    <span class="k">break</span>
188
189        <span class="k">return</span> <span class="n">is_outofbound</span>
190</div></div>
191<div class="viewcode-block" id="ScipyFit"><a class="viewcode-back" href="../../../dev/api/sas.fit.html#sas.fit.ScipyFitting.ScipyFit">[docs]</a><span class="k">class</span> <span class="nc">ScipyFit</span><span class="p">(</span><span class="n">FitEngine</span><span class="p">):</span>
192    <span class="sd">&quot;&quot;&quot; </span>
193<span class="sd">    ScipyFit performs the Fit.This class can be used as follow:</span>
194<span class="sd">    #Do the fit SCIPY</span>
195<span class="sd">    create an engine: engine = ScipyFit()</span>
196<span class="sd">    Use data must be of type plottable</span>
197<span class="sd">    Use a sas model</span>
198<span class="sd">    </span>
199<span class="sd">    Add data with a dictionnary of FitArrangeDict where Uid is a key and data</span>
200<span class="sd">    is saved in FitArrange object.</span>
201<span class="sd">    engine.set_data(data,Uid)</span>
202<span class="sd">    </span>
203<span class="sd">    Set model parameter &quot;M1&quot;= model.name add {model.parameter.name:value}.</span>
204<span class="sd">    </span>
205<span class="sd">    :note: Set_param() if used must always preceded set_model()</span>
206<span class="sd">         for the fit to be performed.In case of Scipyfit set_param is called in</span>
207<span class="sd">         fit () automatically.</span>
208<span class="sd">    </span>
209<span class="sd">    engine.set_param( model,&quot;M1&quot;, {&#39;A&#39;:2,&#39;B&#39;:4})</span>
210<span class="sd">    </span>
211<span class="sd">    Add model with a dictionnary of FitArrangeDict{} where Uid is a key and model</span>
212<span class="sd">    is save in FitArrange object.</span>
213<span class="sd">    engine.set_model(model,Uid)</span>
214<span class="sd">    </span>
215<span class="sd">    engine.fit return chisqr,[model.parameter 1,2,..],[[err1....][..err2...]]</span>
216<span class="sd">    chisqr1, out1, cov1=engine.fit({model.parameter.name:value},qmin,qmax)</span>
217<span class="sd">    &quot;&quot;&quot;</span>
218    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
219        <span class="sd">&quot;&quot;&quot;</span>
220<span class="sd">        Creates a dictionary (self.fit_arrange_dict={})of FitArrange elements</span>
221<span class="sd">        with Uid as keys</span>
222<span class="sd">        &quot;&quot;&quot;</span>
223        <span class="n">FitEngine</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
224        <span class="bp">self</span><span class="o">.</span><span class="n">curr_thread</span> <span class="o">=</span> <span class="bp">None</span>
225    <span class="c">#def fit(self, *args, **kw):</span>
226    <span class="c">#    return profile(self._fit, *args, **kw)</span>
227
228<div class="viewcode-block" id="ScipyFit.fit"><a class="viewcode-back" href="../../../dev/api/sas.fit.html#sas.fit.ScipyFitting.ScipyFit.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">msg_q</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span>
229            <span class="n">q</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> <span class="n">curr_thread</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> 
230            <span class="n">ftol</span><span class="o">=</span><span class="mf">1.49012e-8</span><span class="p">,</span> <span class="n">reset_flag</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
231        <span class="sd">&quot;&quot;&quot;</span>
232<span class="sd">        &quot;&quot;&quot;</span>
233        <span class="n">fitproblem</span> <span class="o">=</span> <span class="p">[]</span>
234        <span class="k">for</span> <span class="n">fproblem</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fit_arrange_dict</span><span class="o">.</span><span class="n">itervalues</span><span class="p">():</span>
235            <span class="k">if</span> <span class="n">fproblem</span><span class="o">.</span><span class="n">get_to_fit</span><span class="p">()</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
236                <span class="n">fitproblem</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fproblem</span><span class="p">)</span>
237        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">fitproblem</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="p">:</span> 
238            <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Scipy can&#39;t fit more than a single fit problem at a time.&quot;</span>
239            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="n">msg</span>
240        <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">fitproblem</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">:</span>
241            <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">,</span> <span class="s">&quot;No Assembly scheduled for Scipy fitting.&quot;</span>
242        <span class="n">model</span> <span class="o">=</span> <span class="n">fitproblem</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">get_model</span><span class="p">()</span>
243        <span class="n">pars</span> <span class="o">=</span> <span class="n">fitproblem</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">pars</span>
244        <span class="k">if</span> <span class="n">reset_flag</span><span class="p">:</span>
245            <span class="c"># reset the initial value; useful for batch</span>
246            <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">fitproblem</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">pars</span><span class="p">:</span>
247                <span class="n">ind</span> <span class="o">=</span> <span class="n">fitproblem</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">pars</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
248                <span class="n">model</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">setParam</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">fitproblem</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">vals</span><span class="p">[</span><span class="n">ind</span><span class="p">])</span>
249        <span class="n">listdata</span> <span class="o">=</span> <span class="p">[]</span>
250        <span class="n">listdata</span> <span class="o">=</span> <span class="n">fitproblem</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">get_data</span><span class="p">()</span>
251        <span class="c"># Concatenate dList set (contains one or more data)before fitting</span>
252        <span class="n">data</span> <span class="o">=</span> <span class="n">listdata</span>
253       
254        <span class="bp">self</span><span class="o">.</span><span class="n">curr_thread</span> <span class="o">=</span> <span class="n">curr_thread</span>
255        <span class="n">ftol</span> <span class="o">=</span> <span class="n">ftol</span>
256       
257        <span class="c"># Check the initial value if it is within range</span>
258        <span class="n">_check_param_range</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">pars</span><span class="p">)</span>
259       
260        <span class="n">result</span> <span class="o">=</span> <span class="n">FResult</span><span class="p">(</span><span class="n">model</span><span class="o">=</span><span class="n">model</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span> <span class="n">param_list</span><span class="o">=</span><span class="n">pars</span><span class="p">)</span>
261        <span class="n">result</span><span class="o">.</span><span class="n">fitter_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">fitter_id</span>
262        <span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
263            <span class="n">handler</span><span class="o">.</span><span class="n">set_result</span><span class="p">(</span><span class="n">result</span><span class="o">=</span><span class="n">result</span><span class="p">)</span>
264        <span class="n">functor</span> <span class="o">=</span> <span class="n">SasAssembly</span><span class="p">(</span><span class="n">paramlist</span><span class="o">=</span><span class="n">pars</span><span class="p">,</span>
265                               <span class="n">model</span><span class="o">=</span><span class="n">model</span><span class="p">,</span>
266                               <span class="n">data</span><span class="o">=</span><span class="n">data</span><span class="p">,</span>
267                               <span class="n">handler</span><span class="o">=</span><span class="n">handler</span><span class="p">,</span>
268                               <span class="n">fitresult</span><span class="o">=</span><span class="n">result</span><span class="p">,</span>
269                               <span class="n">curr_thread</span><span class="o">=</span><span class="n">curr_thread</span><span class="p">,</span>
270                               <span class="n">msg_q</span><span class="o">=</span><span class="n">msg_q</span><span class="p">)</span>
271        <span class="k">try</span><span class="p">:</span>
272            <span class="c"># This import must be here; otherwise it will be confused when more</span>
273            <span class="c"># than one thread exist.</span>
274            <span class="kn">from</span> <span class="nn">scipy</span> <span class="kn">import</span> <span class="n">optimize</span>
275           
276            <span class="n">out</span><span class="p">,</span> <span class="n">cov_x</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">mesg</span><span class="p">,</span> <span class="n">success</span> <span class="o">=</span> <span class="n">optimize</span><span class="o">.</span><span class="n">leastsq</span><span class="p">(</span><span class="n">functor</span><span class="p">,</span>
277                                            <span class="n">model</span><span class="o">.</span><span class="n">get_params</span><span class="p">(</span><span class="n">pars</span><span class="p">),</span>
278                                            <span class="n">ftol</span><span class="o">=</span><span class="n">ftol</span><span class="p">,</span>
279                                            <span class="n">full_output</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
280        <span class="k">except</span><span class="p">:</span>
281            <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="s">&#39;last_type&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">sys</span><span class="o">.</span><span class="n">last_type</span> <span class="o">==</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
282                <span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
283                    <span class="n">msg</span> <span class="o">=</span> <span class="s">&quot;Fitting: Terminated!!!&quot;</span>
284                    <span class="n">handler</span><span class="o">.</span><span class="n">stop</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
285                    <span class="k">raise</span> <span class="ne">KeyboardInterrupt</span><span class="p">,</span> <span class="n">msg</span>
286            <span class="k">else</span><span class="p">:</span>
287                <span class="k">raise</span>
288        <span class="n">chisqr</span> <span class="o">=</span> <span class="n">functor</span><span class="o">.</span><span class="n">chisq</span><span class="p">()</span>
289
290        <span class="k">if</span> <span class="n">cov_x</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">numpy</span><span class="o">.</span><span class="n">isfinite</span><span class="p">(</span><span class="n">cov_x</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">():</span>
291            <span class="n">stderr</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">diag</span><span class="p">(</span><span class="n">cov_x</span><span class="p">))</span>
292        <span class="k">else</span><span class="p">:</span>
293            <span class="n">stderr</span> <span class="o">=</span> <span class="p">[]</span>
294           
295        <span class="n">result</span><span class="o">.</span><span class="n">index</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">idx</span>
296        <span class="n">result</span><span class="o">.</span><span class="n">fitness</span> <span class="o">=</span> <span class="n">chisqr</span>
297        <span class="n">result</span><span class="o">.</span><span class="n">stderr</span>  <span class="o">=</span> <span class="n">stderr</span>
298        <span class="n">result</span><span class="o">.</span><span class="n">pvec</span> <span class="o">=</span> <span class="n">out</span>
299        <span class="n">result</span><span class="o">.</span><span class="n">success</span> <span class="o">=</span> <span class="n">success</span>
300        <span class="n">result</span><span class="o">.</span><span class="n">theory</span> <span class="o">=</span> <span class="n">functor</span><span class="o">.</span><span class="n">theory</span>
301        <span class="k">if</span> <span class="n">handler</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
302            <span class="n">handler</span><span class="o">.</span><span class="n">set_result</span><span class="p">(</span><span class="n">result</span><span class="o">=</span><span class="n">result</span><span class="p">)</span>
303            <span class="n">handler</span><span class="o">.</span><span class="n">update_fit</span><span class="p">(</span><span class="n">last</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
304        <span class="k">if</span> <span class="n">q</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
305            <span class="n">q</span><span class="o">.</span><span class="n">put</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
306            <span class="k">return</span> <span class="n">q</span>
307        <span class="k">if</span> <span class="n">success</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="ow">or</span> <span class="n">success</span> <span class="o">&gt;</span> <span class="mi">5</span><span class="p">:</span>
308            <span class="n">result</span><span class="o">.</span><span class="n">fitness</span> <span class="o">=</span> <span class="bp">None</span>
309        <span class="k">return</span> <span class="p">[</span><span class="n">result</span><span class="p">]</span>
310
311        </div></div>
312<span class="k">def</span> <span class="nf">_check_param_range</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">pars</span><span class="p">):</span>
313    <span class="sd">&quot;&quot;&quot;</span>
314<span class="sd">    Check parameter range and set the initial value inside</span>
315<span class="sd">    if it is out of range.</span>
316
317<span class="sd">    : model: park model object</span>
318<span class="sd">    &quot;&quot;&quot;</span>
319    <span class="c"># loop through parameterset</span>
320    <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">pars</span><span class="p">:</span>
321        <span class="n">value</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">getParam</span><span class="p">(</span><span class="n">p</span><span class="p">)</span>
322        <span class="n">low</span><span class="p">,</span><span class="n">high</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">details</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">p</span><span class="p">,[</span><span class="s">&quot;&quot;</span><span class="p">,</span><span class="bp">None</span><span class="p">,</span><span class="bp">None</span><span class="p">])[</span><span class="mi">1</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span>
323        <span class="c"># if the range was defined, check the range</span>
324        <span class="k">if</span> <span class="n">low</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">value</span> <span class="o">&lt;=</span> <span class="n">low</span><span class="p">:</span>
325            <span class="n">value</span> <span class="o">=</span> <span class="n">low</span> <span class="o">+</span> <span class="n">_get_zero_shift</span><span class="p">(</span><span class="n">low</span><span class="p">)</span>
326        <span class="k">if</span> <span class="n">high</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">value</span> <span class="o">&gt;</span> <span class="n">high</span><span class="p">:</span>
327            <span class="n">value</span> <span class="o">=</span> <span class="n">high</span> <span class="o">-</span> <span class="n">_get_zero_shift</span><span class="p">(</span><span class="n">high</span><span class="p">)</span>
328            <span class="c"># Check one more time if the new value goes below</span>
329            <span class="c"># the low bound, If so, re-evaluate the value</span>
330            <span class="c"># with the mean of the range.</span>
331            <span class="k">if</span> <span class="n">low</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">value</span> <span class="o">&lt;</span> <span class="n">low</span><span class="p">:</span>
332                <span class="n">value</span> <span class="o">=</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">low</span><span class="o">+</span><span class="n">high</span><span class="p">)</span>
333        <span class="n">model</span><span class="o">.</span><span class="n">setParam</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
334
335<span class="k">def</span> <span class="nf">_get_zero_shift</span><span class="p">(</span><span class="n">limit</span><span class="p">):</span>
336    <span class="sd">&quot;&quot;&quot;</span>
337<span class="sd">    Get 10% shift of the param value = 0 based on the range value</span>
338
339<span class="sd">    : param range: min or max value of the bounds</span>
340<span class="sd">    &quot;&quot;&quot;</span>
341    <span class="k">return</span> <span class="mf">0.1</span> <span class="o">*</span> <span class="p">(</span><span class="n">limit</span> <span class="k">if</span> <span class="n">limit</span> <span class="o">!=</span> <span class="mf">0.0</span> <span class="k">else</span> <span class="mf">1.0</span><span class="p">)</span>
342
343   
344<span class="c">#def profile(fn, *args, **kw):</span>
345<span class="c">#    import cProfile, pstats, os</span>
346<span class="c">#    global call_result</span>
347<span class="c">#   def call():</span>
348<span class="c">#        global call_result</span>
349<span class="c">#        call_result = fn(*args, **kw)</span>
350<span class="c">#    cProfile.runctx(&#39;call()&#39;, dict(call=call), {}, &#39;profile.out&#39;)</span>
351<span class="c">#    stats = pstats.Stats(&#39;profile.out&#39;)</span>
352<span class="c">#    stats.sort_stats(&#39;time&#39;)</span>
353<span class="c">#    stats.sort_stats(&#39;calls&#39;)</span>
354<span class="c">#    stats.print_stats()</span>
355<span class="c">#    os.unlink(&#39;profile.out&#39;)</span>
356<span class="c">#    return call_result</span>
357
358     
359</pre></div>
360
361          </div>
362        </div>
363      </div>
364      <div class="sphinxsidebar">
365        <div class="sphinxsidebarwrapper">
366<div id="searchbox" style="display: none">
367  <h3>Quick search</h3>
368    <form class="search" action="../../../search.html" method="get">
369      <input type="text" name="q" />
370      <input type="submit" value="Go" />
371      <input type="hidden" name="check_keywords" value="yes" />
372      <input type="hidden" name="area" value="default" />
373    </form>
374    <p class="searchtip" style="font-size: 90%">
375    Enter search terms or a module, class or function name.
376    </p>
377</div>
378<script type="text/javascript">$('#searchbox').show(0);</script>
379        </div>
380      </div>
381      <div class="clearer"></div>
382    </div>
383    <div class="related">
384      <h3>Navigation</h3>
385      <ul>
386        <li class="right" style="margin-right: 10px">
387          <a href="../../../genindex.html" title="General Index"
388             >index</a></li>
389        <li class="right" >
390          <a href="../../../py-modindex.html" title="Python Module Index"
391             >modules</a> |</li>
392        <li><a href="../../../index.html">SasView 3.0.0 documentation</a> &raquo;</li>
393          <li><a href="../../index.html" >Module code</a> &raquo;</li> 
394      </ul>
395    </div>
396    <div class="footer">
397        &copy; Copyright 2013, The SasView Project.
398      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2.3.
399    </div>
400  </body>
401</html>
Note: See TracBrowser for help on using the repository browser.