source: sphinxdocs/build/html/_modules/GSASIImapvars.html @ 1709

Last change on this file since 1709 was 1709, checked in by toby, 8 years ago

change sphinx docs links; rebuild & fixing minor formatting

  • Property svn:mime-type set to text/html
File size: 176.9 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>GSASIImapvars &mdash; GSAS-II 0.2.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:     '0.2.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="GSAS-II 0.2.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">GSAS-II 0.2.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 GSASIImapvars</h1><div class="highlight"><pre>
51<span class="c"># -*- coding: utf-8 -*-</span>
52<span class="c">########### SVN repository information ###################</span>
53<span class="c"># $Date: 2015-02-28 12:46:37 +0900 (Sat, 28 Feb 2015) $</span>
54<span class="c"># $Author: toby $</span>
55<span class="c"># $Revision: 1676 $</span>
56<span class="c"># $URL: https://subversion.xray.aps.anl.gov/pyGSAS/trunk/GSASIImapvars.py $</span>
57<span class="c"># $Id: GSASIImapvars.py 1676 2015-02-28 03:46:37Z toby $</span>
58<span class="c">########### SVN repository information ###################</span>
59<span class="sd">&quot;&quot;&quot;</span>
60<span class="sd">*GSASIImapvars: Parameter constraints*</span>
61<span class="sd">======================================</span>
62
63<span class="sd">Module to implements algebraic contraints, parameter redefinition</span>
64<span class="sd">and parameter simplification contraints.</span>
65
66<span class="sd">Parameter redefinition (new vars) is done by creating one or more relationships</span>
67<span class="sd">between a set of parameters</span>
68
69<span class="sd">::</span>
70
71<span class="sd">   Mx1 * Px + My1 * Py +...</span>
72<span class="sd">   Mx2 * Px + Mz2 * Pz + ...</span>
73
74<span class="sd">where Pj is a parameter name and Mjk is a constant.</span>
75
76<span class="sd">Constant constraint Relations can also be supplied in the form of an equation:</span>
77
78<span class="sd">::</span>
79
80<span class="sd">  nx1 * Px + ny1 * Py +... = C1</span>
81
82<span class="sd">where Cn is a constant. These equations define an algebraic</span>
83<span class="sd">constrant.</span>
84
85<span class="sd">Parameters can also be &quot;fixed&quot; (held), which prevents them from being refined.</span>
86
87<span class="sd">All of the above three cases are input using routines</span>
88<span class="sd">GroupConstraints and GenerateConstraints. The input consists of a list of</span>
89<span class="sd">relationship dictionaries:</span>
90
91<span class="sd">.. code-block:: python</span>
92
93<span class="sd">    constrDict = [</span>
94<span class="sd">         {&#39;0:12:Scale&#39;: 2.0, &#39;0:14:Scale&#39;: 4.0, &#39;0:13:Scale&#39;: 3.0, &#39;0:0:Scale&#39;: 0.5},</span>
95<span class="sd">         {&#39;2::C(10,6,1)&#39;: 1.0, &#39;1::C(10,6,1)&#39;: 1.0},</span>
96<span class="sd">         {&#39;0::A0&#39;: 0.0}]</span>
97<span class="sd">    fixedList = [&#39;5.0&#39;, None, &#39;0&#39;]</span>
98
99<span class="sd">Where the dictionary defines the first part of an expression and the corresponding fixedList</span>
100<span class="sd">item is either None (for parameter redefinition) or the constant value, for a constant</span>
101<span class="sd">constraint equation. A dictionary that contains a single term defines a variable that</span>
102<span class="sd">will be fixed (held). The multiplier and the fixedList value in this case are ignored.</span>
103
104<span class="sd">Parameters can also be equivalenced or &quot;slaved&quot; to another parameter, such that one</span>
105<span class="sd">(independent) parameter is equated to several (now dependent) parameters. In</span>
106<span class="sd">algebraic form this is:</span>
107
108<span class="sd">::</span>
109
110<span class="sd">   P0 = M1 * P1 = M2 * P2 = ...</span>
111
112<span class="sd">Thus parameters P0, P1 and P2,... are linearly equivalent. Routine StoreEquivalence is</span>
113<span class="sd">used to specify these equivalences.</span>
114
115<span class="sd">Parameter redefinition (new vars) describes a new, independent, parameter, which</span>
116<span class="sd">is defined in terms of dependent parameters that are defined in the</span>
117<span class="sd">Model, while fixed constrained relations effectively reduce the complexity</span>
118<span class="sd">of the Model by removing a degree of freedom. It is possible for a parameter to appear</span>
119<span class="sd">in both a parameter redefinition expression and a fixed constraint equation, but a</span>
120<span class="sd">parameter cannot be used a parameter equivalance cannot be used elsewhere (not fixed,</span>
121<span class="sd">constrained or redefined). Likewise a fixed parameter cannot be used elsewhere (not</span>
122<span class="sd">equivalanced, constrained or redefined).</span>
123
124<span class="sd">Relationships are grouped so that a set of dependent parameters appear</span>
125<span class="sd">in only one group (done in routine GroupConstraints.) Note that if a</span>
126<span class="sd">group contains relationships/equations that involve N dependent</span>
127<span class="sd">parameters, there must exist N-C new parameters, where C is the number</span>
128<span class="sd">of contraint equations in the group. Routine GenerateConstraints takes</span>
129<span class="sd">the output from GroupConstraints and generates the</span>
130<span class="sd">&quot;missing&quot; relationships and saves that information in the module&#39;s</span>
131<span class="sd">global variables. Each generated parameter is named sequentially using paramPrefix.</span>
132
133<span class="sd">A list of parameters that will be varied is specified as input to GenerateConstraints</span>
134<span class="sd">(varyList). A fixed parameter will simply be removed from this list preventing that</span>
135<span class="sd">parameter from being varied. Note that all parameters in a constraint relationship</span>
136<span class="sd">must specified as varied (appear in varyList) or none can be varied. This is</span>
137<span class="sd">checked in GenerateConstraints. Likewise, if all parameters in a constraint are</span>
138<span class="sd">not referenced in a refinement, the constraint is ignored, but if some parameters</span>
139<span class="sd">in a constraint group are not referenced in a refinement, but others are this</span>
140<span class="sd">constitutes and error. </span>
141
142<span class="sd">* When a new variable is created, the variable is assigned the name associated</span>
143<span class="sd">  in the constraint definition or it is assigned a default name of form</span>
144<span class="sd">  ``::constr&lt;n&gt;`` (see paramPrefix). The vary setting for variables used in the</span>
145<span class="sd">  constraint are ignored.</span>
146<span class="sd">  Note that any generated &quot;missing&quot; relations are not varied. Only</span>
147<span class="sd">  the input relations can be are varied.</span>
148<span class="sd">  </span>
149<span class="sd">* If all parameters in a fixed constraint equation are varied, the generated &quot;missing&quot;</span>
150<span class="sd">  relations in the group are all varied. This provides the N-C degrees of freedom. </span>
151
152<span class="sd">*External Routines*</span>
153<span class="sd">-------------------</span>
154
155<span class="sd">To define a set of constrained and unconstrained relations, one</span>
156<span class="sd">defines a list of dictionary defining constraint parameters and their</span>
157<span class="sd">values, a list of fixed values for each constraint and a list of</span>
158<span class="sd">parameters to be varied. In addition, one uses</span>
159<span class="sd">:func:`StoreEquivalence` to define parameters that are equivalent. One</span>
160<span class="sd">can then use :func:`CheckConstraints` to check that the input is</span>
161<span class="sd">internally consistent and finally :func:`GroupConstraints` and</span>
162<span class="sd">:func:`GenerateConstraints` to generate the internally used</span>
163<span class="sd">tables. Routines :func:`Map2Dict` is used to initialize the parameter</span>
164<span class="sd">dictionary and :func:`Dict2Map`, :func:`Dict2Deriv`, and</span>
165<span class="sd">:func:`ComputeDepESD` are used to apply constraints. Routine</span>
166<span class="sd">:func:`VarRemapShow` is used to print out the constraint information,</span>
167<span class="sd">as stored by :func:`GenerateConstraints`.</span>
168
169<span class="sd">:func:`InitVars`</span>
170<span class="sd">  This is optionally used to clear out all defined previously defined constraint information</span>
171<span class="sd">  </span>
172<span class="sd">:func:`StoreEquivalence`</span>
173<span class="sd">  To implement parameter redefinition, one calls StoreEquivalence. This should be called for every set of</span>
174<span class="sd">  equivalence relationships. There is no harm in using StoreEquivalence with the same independent variable:</span>
175
176<span class="sd">  .. code-block:: python</span>
177
178<span class="sd">       StoreEquivalence(&#39;x&#39;,(&#39;y&#39;,))</span>
179<span class="sd">       StoreEquivalence(&#39;x&#39;,(&#39;z&#39;,))</span>
180
181<span class="sd">  or equivalently </span>
182
183<span class="sd">  .. code-block:: python</span>
184
185<span class="sd">       StoreEquivalence(&#39;x&#39;,(&#39;y&#39;,&#39;z&#39;))</span>
186
187<span class="sd">  The latter will run more efficiently. Note that mixing independent and dependent variables is</span>
188<span class="sd">  problematic. This is not allowed:</span>
189
190<span class="sd">  .. code-block:: python</span>
191
192<span class="sd">        StoreEquivalence(&#39;x&#39;,(&#39;y&#39;,))</span>
193<span class="sd">        StoreEquivalence(&#39;y&#39;,(&#39;z&#39;,))</span>
194<span class="sd">        </span>
195<span class="sd">  Use StoreEquivalence before calling GenerateConstraints or CheckConstraints</span>
196
197<span class="sd">:func:`CheckConstraints`</span>
198<span class="sd">   To check that input in internally consistent, use CheckConstraints</span>
199
200<span class="sd">:func:`Map2Dict`</span>
201<span class="sd">   To determine values for the parameters created in this module, one</span>
202<span class="sd">   calls Map2Dict. This will not apply contraints.</span>
203
204<span class="sd">:func:`Dict2Map`</span>
205<span class="sd">   To take values from the new independent parameters and constraints,</span>
206<span class="sd">   one calls Dict2Map. This will apply contraints.</span>
207
208<span class="sd">:func:`Dict2Deriv`</span>
209<span class="sd">   Use Dict2Deriv to determine derivatives on independent parameters</span>
210<span class="sd">   from those on dependent ones</span>
211
212<span class="sd">:func:`ComputeDepESD`      </span>
213<span class="sd">   Use ComputeDepESD to compute uncertainties on dependent variables</span>
214
215<span class="sd">:func:`VarRemapShow`</span>
216<span class="sd">   To show a summary of the parameter remapping, one calls VarRemapShow</span>
217
218<span class="sd">*Global Variables*</span>
219<span class="sd">------------------</span>
220
221<span class="sd">dependentParmList:</span>
222<span class="sd">   contains a list by group of lists of</span>
223<span class="sd">   parameters used in the group. Note that parameters listed in</span>
224<span class="sd">   dependentParmList should not be refined as they will not affect</span>
225<span class="sd">   the model</span>
226
227<span class="sd">indParmList:</span>
228<span class="sd">     a list of groups of Independent parameters defined in</span>
229<span class="sd">     each group. This contains both parameters used in parameter</span>
230<span class="sd">     redefinitions as well as names of generated new parameters.</span>
231
232<span class="sd">fixedVarList:</span>
233<span class="sd">     a list of variables that have been &#39;fixed&#39;</span>
234<span class="sd">     by defining them as equal to a constant (::var: = 0). Note that</span>
235<span class="sd">     the constant value is ignored at present. These variables are</span>
236<span class="sd">     later removed from varyList which prevents them from being refined. </span>
237<span class="sd">     Unlikely to be used externally.</span>
238
239<span class="sd">arrayList:</span>
240<span class="sd">     a list by group of relationship matrices to relate</span>
241<span class="sd">     parameters in dependentParmList to those in indParmList. Unlikely</span>
242<span class="sd">     to be used externally.</span>
243
244<span class="sd">invarrayList:</span>
245<span class="sd">     a list by group of relationship matrices to relate</span>
246<span class="sd">     parameters in indParmList to those in dependentParmList. Unlikely</span>
247<span class="sd">     to be used externally.</span>
248
249<span class="sd">fixedDict:</span>
250<span class="sd">     a dictionary containing the fixed values corresponding</span>
251<span class="sd">     to parameter equations.  The dict key is an ascii string, but the</span>
252<span class="sd">     dict value is a float.  Unlikely to be used externally.</span>
253
254<span class="sd">*Routines*</span>
255<span class="sd">----------</span>
256
257<span class="sd">Note that parameter names in GSAS-II are strings of form ``&lt;ph&gt;:&lt;hst&gt;:&lt;nam&gt;``</span>
258
259<span class="sd">&quot;&quot;&quot;</span>
260
261<span class="kn">import</span> <span class="nn">numpy</span> <span class="kn">as</span> <span class="nn">np</span>
262<span class="kn">import</span> <span class="nn">GSASIIpath</span>
263<span class="n">GSASIIpath</span><span class="o">.</span><span class="n">SetVersionNumber</span><span class="p">(</span><span class="s">&quot;$Revision: 1676 $&quot;</span><span class="p">)</span>
264<span class="c"># data used for constraints; </span>
265<span class="n">debug</span> <span class="o">=</span> <span class="bp">False</span> <span class="c"># turns on printing as constraint input is processed</span>
266<span class="c"># note that constraints are stored listed by contraint groups, where each constraint</span>
267<span class="c"># group contains those parameters that must be handled together</span>
268<span class="n">dependentParmList</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># contains a list of parameters in each group</span>
269<span class="c"># note that parameters listed in dependentParmList should not be refined </span>
270<span class="n">arrayList</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># a list of of relationship matrices </span>
271<span class="n">invarrayList</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># a list of inverse relationship matrices </span>
272<span class="n">indParmList</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># a list of names for the new parameters</span>
273<span class="n">fixedDict</span> <span class="o">=</span> <span class="p">{}</span> <span class="c"># a dictionary containing the fixed values corresponding to defined parameter equations</span>
274               <span class="c"># key is original ascii string, value is float</span>
275<span class="n">fixedVarList</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># List of variables that should not be refined</span>
276
277<span class="c"># prefix for parameter names</span>
278<span class="n">paramPrefix</span> <span class="o">=</span> <span class="s">&quot;::constr&quot;</span>
279<span class="n">consNum</span> <span class="o">=</span> <span class="mi">0</span> <span class="c"># number of the next constraint to be created</span>
280
281<div class="viewcode-block" id="InitVars"><a class="viewcode-back" href="../GSASIImapvars.html#GSASIImapvars.InitVars">[docs]</a><span class="k">def</span> <span class="nf">InitVars</span><span class="p">():</span>
282    <span class="sd">&#39;&#39;&#39;Initializes all constraint information&#39;&#39;&#39;</span>
283    <span class="k">global</span> <span class="n">dependentParmList</span><span class="p">,</span><span class="n">arrayList</span><span class="p">,</span><span class="n">invarrayList</span><span class="p">,</span><span class="n">indParmList</span><span class="p">,</span><span class="n">fixedDict</span><span class="p">,</span><span class="n">consNum</span>
284    <span class="n">dependentParmList</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># contains a list of parameters in each group</span>
285    <span class="n">arrayList</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># a list of of relationship matrices </span>
286    <span class="n">invarrayList</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># a list of inverse relationship matrices </span>
287    <span class="n">indParmList</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># a list of names for the new parameters</span>
288    <span class="n">fixedDict</span> <span class="o">=</span> <span class="p">{}</span> <span class="c"># a dictionary containing the fixed values corresponding to defined parameter equations</span>
289    <span class="n">consNum</span> <span class="o">=</span> <span class="mi">0</span> <span class="c"># number of the next constraint to be created</span>
290    <span class="n">fixedVarList</span> <span class="o">=</span> <span class="p">[]</span>
291</div>
292<div class="viewcode-block" id="VarKeys"><a class="viewcode-back" href="../GSASIImapvars.html#GSASIImapvars.VarKeys">[docs]</a><span class="k">def</span> <span class="nf">VarKeys</span><span class="p">(</span><span class="n">constr</span><span class="p">):</span>
293    <span class="sd">&quot;&quot;&quot;Finds the keys in a constraint that represent variables</span>
294<span class="sd">    e.g. eliminates any that start with &#39;_&#39;</span>
295
296<span class="sd">    :param dict constr: a single constraint entry of form::</span>
297
298<span class="sd">        {&#39;var1&#39;: mult1, &#39;var2&#39;: mult2,... &#39;_notVar&#39;: val,...}</span>
299
300<span class="sd">        (see :func:`GroupConstraints`)</span>
301<span class="sd">    :returns: a list of keys where any keys beginning with &#39;_&#39; are</span>
302<span class="sd">      removed.</span>
303<span class="sd">    &quot;&quot;&quot;</span>
304    <span class="k">return</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">constr</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">i</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">)]</span>
305
306</div>
307<div class="viewcode-block" id="GroupConstraints"><a class="viewcode-back" href="../GSASIImapvars.html#GSASIImapvars.GroupConstraints">[docs]</a><span class="k">def</span> <span class="nf">GroupConstraints</span><span class="p">(</span><span class="n">constrDict</span><span class="p">):</span>
308    <span class="sd">&quot;&quot;&quot;divide the constraints into groups that share no parameters.</span>
309
310<span class="sd">    :param dict constrDict: a list of dicts defining relationships/constraints</span>
311
312<span class="sd">    ::</span>
313<span class="sd">    </span>
314<span class="sd">       constrDict = [{&lt;constr1&gt;}, {&lt;constr2&gt;}, ...]</span>
315
316<span class="sd">    where {&lt;constr1&gt;} is {&#39;var1&#39;: mult1, &#39;var2&#39;: mult2,... }</span>
317
318<span class="sd">    :returns: two lists of lists:</span>
319<span class="sd">    </span>
320<span class="sd">      * a list of grouped contraints where each constraint grouped containts a list</span>
321<span class="sd">        of indices for constraint constrDict entries</span>
322<span class="sd">      * a list containing lists of parameter names contained in each group</span>
323<span class="sd">      </span>
324<span class="sd">      &quot;&quot;&quot;</span>
325    <span class="n">assignedlist</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># relationships that have been used</span>
326    <span class="n">groups</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># contains a list of grouplists</span>
327    <span class="n">ParmList</span> <span class="o">=</span> <span class="p">[]</span>
328    <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">consi</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">constrDict</span><span class="p">):</span>
329        <span class="k">if</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">assignedlist</span><span class="p">:</span> <span class="k">continue</span> <span class="c"># already in a group, skip</span>
330        <span class="c"># starting a new group</span>
331        <span class="n">grouplist</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span><span class="p">,]</span>
332        <span class="n">assignedlist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
333        <span class="n">groupset</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">VarKeys</span><span class="p">(</span><span class="n">consi</span><span class="p">))</span>
334        <span class="n">changes</span> <span class="o">=</span> <span class="bp">True</span> <span class="c"># always loop at least once</span>
335        <span class="k">while</span><span class="p">(</span><span class="n">changes</span><span class="p">):</span> <span class="c"># loop until we can&#39;t find anything to add to the current group</span>
336            <span class="n">changes</span> <span class="o">=</span> <span class="bp">False</span> <span class="c"># but don&#39;t loop again unless we find something</span>
337            <span class="k">for</span> <span class="n">j</span><span class="p">,</span><span class="n">consj</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">constrDict</span><span class="p">):</span>
338                <span class="k">if</span> <span class="n">j</span> <span class="ow">in</span> <span class="n">assignedlist</span><span class="p">:</span> <span class="k">continue</span> <span class="c"># already in a group, skip</span>
339                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">VarKeys</span><span class="p">(</span><span class="n">consj</span><span class="p">))</span> <span class="o">&amp;</span> <span class="n">groupset</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> <span class="c"># true if this needs to be added</span>
340                    <span class="n">changes</span> <span class="o">=</span> <span class="bp">True</span>
341                    <span class="n">grouplist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">j</span><span class="p">)</span>
342                    <span class="n">assignedlist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">j</span><span class="p">)</span>
343                    <span class="n">groupset</span> <span class="o">=</span> <span class="n">groupset</span> <span class="o">|</span> <span class="nb">set</span><span class="p">(</span><span class="n">VarKeys</span><span class="p">(</span><span class="n">consj</span><span class="p">))</span>
344        <span class="n">group</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">grouplist</span><span class="p">)</span>
345        <span class="n">varlist</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">groupset</span><span class="p">))</span>
346        <span class="n">groups</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">group</span><span class="p">)</span>
347        <span class="n">ParmList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">varlist</span><span class="p">)</span>
348    <span class="k">return</span> <span class="n">groups</span><span class="p">,</span><span class="n">ParmList</span>
349</div>
350<div class="viewcode-block" id="CheckConstraints"><a class="viewcode-back" href="../GSASIImapvars.html#GSASIImapvars.CheckConstraints">[docs]</a><span class="k">def</span> <span class="nf">CheckConstraints</span><span class="p">(</span><span class="n">varyList</span><span class="p">,</span><span class="n">constrDict</span><span class="p">,</span><span class="n">fixedList</span><span class="p">):</span>
351    <span class="sd">&#39;&#39;&#39;Takes a list of relationship entries comprising a group of</span>
352<span class="sd">    constraints and checks for inconsistencies such as conflicts in</span>
353<span class="sd">    parameter/variable definitions and or inconsistently varied parameters.</span>
354
355<span class="sd">    :param list varyList: a list of parameters names that will be varied</span>
356
357<span class="sd">    :param dict constrDict: a list of dicts defining relationships/constraints</span>
358<span class="sd">      (as created in :func:`GSASIIstrIO.ProcessConstraints` and</span>
359<span class="sd">      documented in :func:`GroupConstraints`)</span>
360
361<span class="sd">    :param list fixedList: a list of values specifying a fixed value for each</span>
362<span class="sd">      dict in constrDict. Values are either strings that can be converted to</span>
363<span class="sd">      floats or ``None`` if the constraint defines a new parameter rather</span>
364<span class="sd">      than a constant.</span>
365
366<span class="sd">    :returns: two strings: </span>
367
368<span class="sd">      * the first lists conflicts internal to the specified constraints</span>
369<span class="sd">      * the second lists conflicts where the varyList specifies some</span>
370<span class="sd">        parameters in a constraint, but not all</span>
371<span class="sd">        </span>
372<span class="sd">      If there are no errors, both strings will be empty</span>
373<span class="sd">    &#39;&#39;&#39;</span>
374    <span class="kn">import</span> <span class="nn">re</span>
375    <span class="k">global</span> <span class="n">dependentParmList</span><span class="p">,</span><span class="n">arrayList</span><span class="p">,</span><span class="n">invarrayList</span><span class="p">,</span><span class="n">indParmList</span><span class="p">,</span><span class="n">consNum</span>
376    <span class="n">errmsg</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
377    <span class="n">warnmsg</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
378    <span class="n">fixVlist</span> <span class="o">=</span> <span class="p">[]</span>
379    <span class="c"># process fixed variables (holds)</span>
380    <span class="k">for</span> <span class="n">cdict</span> <span class="ow">in</span> <span class="n">constrDict</span><span class="p">:</span>
381        <span class="c"># N.B. No &quot;_&quot; names in holds</span>
382        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
383            <span class="n">fixVlist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cdict</span><span class="o">.</span><span class="n">keys</span><span class="p">()[</span><span class="mi">0</span><span class="p">])</span>
384   
385    <span class="c"># process equivalences: make a list of dependent and independent vars</span>
386    <span class="c">#    and check for repeated uses (repetition of a parameter as an</span>
387    <span class="c">#    independent var is OK)</span>
388    <span class="n">indepVarList</span> <span class="o">=</span> <span class="p">[]</span>
389    <span class="n">depVarList</span> <span class="o">=</span> <span class="p">[]</span>
390    <span class="n">multdepVarList</span> <span class="o">=</span> <span class="p">[]</span>
391    <span class="k">for</span> <span class="n">varlist</span><span class="p">,</span><span class="n">mapvars</span><span class="p">,</span><span class="n">multarr</span><span class="p">,</span><span class="n">invmultarr</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span>
392        <span class="n">dependentParmList</span><span class="p">,</span><span class="n">indParmList</span><span class="p">,</span><span class="n">arrayList</span><span class="p">,</span><span class="n">invarrayList</span><span class="p">):</span>
393        <span class="k">if</span> <span class="n">multarr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="c"># an equivalence</span>
394            <span class="n">zeromult</span> <span class="o">=</span> <span class="bp">False</span>
395            <span class="k">for</span> <span class="n">mv</span> <span class="ow">in</span> <span class="n">mapvars</span><span class="p">:</span>
396                <span class="n">varied</span> <span class="o">=</span> <span class="mi">0</span>
397                <span class="n">notvaried</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
398                <span class="k">if</span> <span class="n">mv</span> <span class="ow">in</span> <span class="n">varyList</span><span class="p">:</span>
399                    <span class="n">varied</span> <span class="o">+=</span> <span class="mi">1</span>
400                <span class="k">else</span><span class="p">:</span>
401                    <span class="k">if</span> <span class="n">notvaried</span><span class="p">:</span> <span class="n">notvaried</span> <span class="o">+=</span> <span class="s">&#39;, &#39;</span>
402                    <span class="n">notvaried</span> <span class="o">+=</span> <span class="n">mv</span>
403                <span class="k">if</span> <span class="n">mv</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">indepVarList</span><span class="p">:</span> <span class="n">indepVarList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">mv</span><span class="p">)</span>
404                <span class="k">for</span> <span class="n">v</span><span class="p">,</span><span class="n">m</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">varlist</span><span class="p">,</span><span class="n">invmultarr</span><span class="p">):</span>
405                    <span class="k">if</span> <span class="n">m</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="n">zeromult</span> <span class="o">=</span> <span class="bp">True</span>
406                    <span class="k">if</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">varyList</span><span class="p">:</span>
407                        <span class="n">varied</span> <span class="o">+=</span> <span class="mi">1</span>
408                    <span class="k">else</span><span class="p">:</span>
409                        <span class="k">if</span> <span class="n">notvaried</span><span class="p">:</span> <span class="n">notvaried</span> <span class="o">+=</span> <span class="s">&#39;, &#39;</span>
410                        <span class="n">notvaried</span> <span class="o">+=</span> <span class="n">v</span>
411                    <span class="k">if</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">depVarList</span><span class="p">:</span>
412                        <span class="n">multdepVarList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
413                    <span class="k">else</span><span class="p">:</span>
414                        <span class="n">depVarList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
415            <span class="k">if</span> <span class="n">varied</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">varied</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">varlist</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">:</span>
416                <span class="n">warnmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Not all variables refined in equivalence:</span><span class="se">\n\t</span><span class="s">&quot;</span>
417                <span class="n">s</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
418                <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">varlist</span><span class="p">:</span>
419                    <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">s</span><span class="o">+=</span> <span class="s">&quot; &amp; &quot;</span>
420                    <span class="n">s</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>           
421                <span class="n">warnmsg</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">mv</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot; =&gt; &quot;</span> <span class="o">+</span> <span class="n">s</span>
422                <span class="n">warnmsg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">Not refined: &#39;</span> <span class="o">+</span> <span class="n">notvaried</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
423            <span class="k">if</span> <span class="n">zeromult</span><span class="p">:</span>
424                <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Zero multiplier is invalid in equivalence:</span><span class="se">\n\t</span><span class="s">&quot;</span>
425                <span class="n">s</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
426                <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">varlist</span><span class="p">:</span>
427                    <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">s</span><span class="o">+=</span> <span class="s">&quot; &amp; &quot;</span>
428                    <span class="n">s</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>           
429                <span class="n">errmsg</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">mv</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot; =&gt; &quot;</span> <span class="o">+</span> <span class="n">s</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
430
431    <span class="c"># check for errors:</span>
432    <span class="n">inboth</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">indepVarList</span><span class="p">)</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">depVarList</span><span class="p">))</span>
433    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">inboth</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
434        <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">The following parameters(s) are used as both dependent and independent variables in Equivalence relations:</span><span class="se">\n</span><span class="s">&quot;</span>
435        <span class="n">s</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
436        <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">inboth</span><span class="p">):</span>
437            <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">s</span><span class="o">+=</span> <span class="s">&quot;, &quot;</span>
438            <span class="n">s</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
439        <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\t</span><span class="s">&#39;</span><span class="o">+</span> <span class="n">s</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
440    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">multdepVarList</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
441        <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">The following parameters(s) are used in multiple Equivalence relations as dependent variables:</span><span class="se">\n</span><span class="s">&quot;</span>
442        <span class="n">s</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
443        <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">multdepVarList</span><span class="p">)):</span>
444            <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">s</span><span class="o">+=</span> <span class="s">&quot;, &quot;</span>
445            <span class="n">s</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>           
446        <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\t</span><span class="s">&#39;</span><span class="o">+</span> <span class="n">s</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
447    <span class="n">equivVarList</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">indepVarList</span><span class="p">)</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">depVarList</span><span class="p">)))</span>
448    <span class="k">if</span> <span class="n">debug</span><span class="p">:</span> <span class="k">print</span> <span class="s">&#39;equivVarList&#39;</span><span class="p">,</span><span class="n">equivVarList</span>
449    <span class="n">inboth</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">fixVlist</span><span class="p">)</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">equivVarList</span><span class="p">))</span>
450    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">inboth</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
451        <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">The following parameter(s) are used in both Equivalence and Fixed constraints:</span><span class="se">\n</span><span class="s">&quot;</span>
452        <span class="n">s</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
453        <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">inboth</span><span class="p">):</span>
454            <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">s</span><span class="o">+=</span> <span class="s">&quot;, &quot;</span>
455            <span class="n">s</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
456        <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\t</span><span class="s">&#39;</span><span class="o">+</span> <span class="n">s</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
457
458    <span class="n">groups</span><span class="p">,</span><span class="n">parmlist</span> <span class="o">=</span> <span class="n">GroupConstraints</span><span class="p">(</span><span class="n">constrDict</span><span class="p">)</span>
459    <span class="c"># scan through parameters in each relationship. Are all varied? If only some are</span>
460    <span class="c"># varied, create a warning message.</span>
461    <span class="k">for</span> <span class="n">group</span><span class="p">,</span><span class="n">varlist</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">groups</span><span class="p">,</span><span class="n">parmlist</span><span class="p">):</span>
462        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">varlist</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">continue</span>
463        <span class="k">for</span> <span class="n">rel</span> <span class="ow">in</span> <span class="n">group</span><span class="p">:</span>
464            <span class="n">varied</span> <span class="o">=</span> <span class="mi">0</span>
465            <span class="n">notvaried</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
466            <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">]:</span>
467                <span class="k">if</span> <span class="n">var</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">):</span> <span class="k">continue</span>
468                <span class="k">if</span> <span class="ow">not</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s">&#39;[0-9]*:[0-9\*]*:&#39;</span><span class="p">,</span><span class="n">var</span><span class="p">):</span>
469                    <span class="n">warnmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Variable &quot;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">var</span><span class="p">)</span><span class="o">+</span><span class="s">&quot; does not begin with a &#39;:&#39;&quot;</span>
470                <span class="k">if</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">varyList</span><span class="p">:</span>
471                    <span class="n">varied</span> <span class="o">+=</span> <span class="mi">1</span>
472                <span class="k">else</span><span class="p">:</span>
473                    <span class="k">if</span> <span class="n">notvaried</span><span class="p">:</span> <span class="n">notvaried</span> <span class="o">+=</span> <span class="s">&#39;, &#39;</span>
474                    <span class="n">notvaried</span> <span class="o">+=</span> <span class="n">var</span>
475                <span class="k">if</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">fixVlist</span><span class="p">:</span>
476                    <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">Parameter &#39;</span><span class="o">+</span><span class="n">var</span><span class="o">+</span><span class="s">&quot; is Fixed and used in a constraint:</span><span class="se">\n\t</span><span class="s">&quot;</span>
477                    <span class="n">errmsg</span> <span class="o">+=</span> <span class="n">_FormatConstraint</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">],</span><span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">])</span><span class="o">+</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span>
478            <span class="k">if</span> <span class="n">varied</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">varied</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">VarKeys</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">])):</span>
479                <span class="n">warnmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Not all variables refined in constraint:</span><span class="se">\n\t</span><span class="s">&quot;</span>
480                <span class="n">warnmsg</span> <span class="o">+=</span> <span class="n">_FormatConstraint</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">],</span><span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">])</span>
481                <span class="n">warnmsg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">Not refined: &#39;</span> <span class="o">+</span> <span class="n">notvaried</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
482    <span class="k">if</span> <span class="n">errmsg</span> <span class="ow">or</span> <span class="n">warnmsg</span><span class="p">:</span>
483        <span class="k">return</span> <span class="n">errmsg</span><span class="p">,</span><span class="n">warnmsg</span>
484
485    <span class="c"># now look for process each group and create the relations that are needed to form</span>
486    <span class="c"># non-singular square matrix</span>
487    <span class="k">for</span> <span class="n">group</span><span class="p">,</span><span class="n">varlist</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">groups</span><span class="p">,</span><span class="n">parmlist</span><span class="p">):</span>
488        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">varlist</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">continue</span> <span class="c"># a constraint group with a single variable can be ignored</span>
489        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">varlist</span><span class="p">)</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">group</span><span class="p">):</span> <span class="c"># too many relationships -- no can do</span>
490            <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Over-constrained input. &quot;</span>
491            <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;There are more constraints &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">group</span><span class="p">))</span>
492            <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n\t</span><span class="s">than variables &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">varlist</span><span class="p">))</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span>
493            <span class="k">for</span> <span class="n">rel</span> <span class="ow">in</span> <span class="n">group</span><span class="p">:</span>
494                <span class="n">errmsg</span> <span class="o">+=</span> <span class="n">_FormatConstraint</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">],</span><span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">])</span>
495                <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span>
496                <span class="k">continue</span>
497        <span class="k">try</span><span class="p">:</span>
498            <span class="n">multarr</span> <span class="o">=</span> <span class="n">_FillArray</span><span class="p">(</span><span class="n">group</span><span class="p">,</span><span class="n">constrDict</span><span class="p">,</span><span class="n">varlist</span><span class="p">)</span>
499            <span class="n">_RowEchelon</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">group</span><span class="p">),</span><span class="n">multarr</span><span class="p">,</span><span class="n">varlist</span><span class="p">)</span>
500        <span class="k">except</span><span class="p">:</span>
501            <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Singular input. &quot;</span>
502            <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;There are internal inconsistencies in these constraints</span><span class="se">\n</span><span class="s">&quot;</span>
503            <span class="k">for</span> <span class="n">rel</span> <span class="ow">in</span> <span class="n">group</span><span class="p">:</span>
504                <span class="n">errmsg</span> <span class="o">+=</span> <span class="n">_FormatConstraint</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">],</span><span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">])</span>
505                <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span>
506            <span class="k">continue</span>
507        <span class="k">try</span><span class="p">:</span>
508            <span class="n">multarr</span> <span class="o">=</span> <span class="n">_FillArray</span><span class="p">(</span><span class="n">group</span><span class="p">,</span><span class="n">constrDict</span><span class="p">,</span><span class="n">varlist</span><span class="p">,</span><span class="n">FillDiagonals</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
509            <span class="n">GramSchmidtOrtho</span><span class="p">(</span><span class="n">multarr</span><span class="p">,</span><span class="nb">len</span><span class="p">(</span><span class="n">group</span><span class="p">))</span>
510        <span class="k">except</span><span class="p">:</span>
511            <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Unexpected singularity with constraints (in Gram-Schmidt)</span><span class="se">\n</span><span class="s">&quot;</span>
512            <span class="k">for</span> <span class="n">rel</span> <span class="ow">in</span> <span class="n">group</span><span class="p">:</span>
513                <span class="n">errmsg</span> <span class="o">+=</span> <span class="n">_FormatConstraint</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">],</span><span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">])</span>
514                <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span>
515            <span class="k">continue</span>
516        <span class="n">mapvar</span> <span class="o">=</span> <span class="p">[]</span>
517        <span class="n">group</span> <span class="o">=</span> <span class="n">group</span><span class="p">[:]</span>
518        <span class="c"># scan through all generated and input variables</span>
519        <span class="c"># Check again for inconsistent variable use</span>
520        <span class="c"># for new variables -- where varied and unvaried parameters get grouped</span>
521        <span class="c"># together. I don&#39;t think this can happen when not flagged before, but</span>
522        <span class="c"># it does not hurt to check again. </span>
523        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">varlist</span><span class="p">)):</span>
524            <span class="n">varied</span> <span class="o">=</span> <span class="mi">0</span>
525            <span class="n">notvaried</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
526            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">group</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
527                <span class="n">rel</span> <span class="o">=</span> <span class="n">group</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
528                <span class="n">fixedval</span> <span class="o">=</span> <span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">]</span>
529                <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">VarKeys</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">]):</span>
530                    <span class="k">if</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">varyList</span><span class="p">:</span>
531                        <span class="n">varied</span> <span class="o">+=</span> <span class="mi">1</span>
532                    <span class="k">else</span><span class="p">:</span>
533                        <span class="k">if</span> <span class="n">notvaried</span><span class="p">:</span> <span class="n">notvaried</span> <span class="o">+=</span> <span class="s">&#39;, &#39;</span>
534                        <span class="n">notvaried</span> <span class="o">+=</span> <span class="n">var</span>
535            <span class="k">else</span><span class="p">:</span>
536                <span class="n">fixedval</span> <span class="o">=</span> <span class="bp">None</span>
537            <span class="k">if</span> <span class="n">fixedval</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
538                <span class="n">varname</span> <span class="o">=</span> <span class="n">paramPrefix</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">consNum</span><span class="p">)</span> <span class="c"># assign a name to a variable</span>
539                <span class="n">mapvar</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">varname</span><span class="p">)</span>
540                <span class="n">consNum</span> <span class="o">+=</span> <span class="mi">1</span>
541            <span class="k">else</span><span class="p">:</span>
542                <span class="n">mapvar</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fixedval</span><span class="p">)</span>
543            <span class="k">if</span> <span class="n">varied</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">notvaried</span> <span class="o">!=</span> <span class="s">&#39;&#39;</span><span class="p">:</span>
544                <span class="n">warnmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Not all variables refined in generated constraint&quot;</span>
545                <span class="n">warnmsg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">Please report this unexpected error</span><span class="se">\n</span><span class="s">&#39;</span>
546                <span class="k">for</span> <span class="n">rel</span> <span class="ow">in</span> <span class="n">group</span><span class="p">:</span>
547                    <span class="n">warnmsg</span> <span class="o">+=</span> <span class="n">_FormatConstraint</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">],</span><span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">])</span>
548                    <span class="n">warnmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span>
549                <span class="n">warnmsg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n\t</span><span class="s">Not refined: &#39;</span> <span class="o">+</span> <span class="n">notvaried</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
550        <span class="k">try</span><span class="p">:</span>
551            <span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">inv</span><span class="p">(</span><span class="n">multarr</span><span class="p">)</span>           
552        <span class="k">except</span><span class="p">:</span>
553            <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Singular input. &quot;</span>
554            <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;The following constraints are not &quot;</span>
555            <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;linearly independent</span><span class="se">\n\t</span><span class="s">or do not &quot;</span>
556            <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;allow for generation of a non-singular set</span><span class="se">\n</span><span class="s">&quot;</span>
557            <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&#39;Please report this unexpected error</span><span class="se">\n</span><span class="s">&#39;</span>
558            <span class="k">for</span> <span class="n">rel</span> <span class="ow">in</span> <span class="n">group</span><span class="p">:</span>
559                <span class="n">errmsg</span> <span class="o">+=</span> <span class="n">_FormatConstraint</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">],</span><span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">])</span>
560                <span class="n">errmsg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span>
561    <span class="k">return</span> <span class="n">errmsg</span><span class="p">,</span><span class="n">warnmsg</span>
562</div>
563<div class="viewcode-block" id="GenerateConstraints"><a class="viewcode-back" href="../GSASIImapvars.html#GSASIImapvars.GenerateConstraints">[docs]</a><span class="k">def</span> <span class="nf">GenerateConstraints</span><span class="p">(</span><span class="n">groups</span><span class="p">,</span><span class="n">parmlist</span><span class="p">,</span><span class="n">varyList</span><span class="p">,</span><span class="n">constrDict</span><span class="p">,</span><span class="n">fixedList</span><span class="p">,</span><span class="n">parmDict</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span><span class="n">SeqHist</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
564    <span class="sd">&#39;&#39;&#39;Takes a list of relationship entries comprising a group of</span>
565<span class="sd">    constraints and builds the relationship lists and their inverse</span>
566<span class="sd">    and stores them in global variables Also checks for internal</span>
567<span class="sd">    conflicts or inconsistencies in parameter/variable definitions.</span>
568
569<span class="sd">    :param list groups: a list of grouped contraints where each constraint</span>
570<span class="sd">      grouped containts a list of indices for constraint constrDict entries,</span>
571<span class="sd">      created in :func:`GroupConstraints` (returned as 1st value)</span>
572
573<span class="sd">    :param list parmlist: a list containing lists of parameter names</span>
574<span class="sd">      contained in each group, created in :func:`GroupConstraints`</span>
575<span class="sd">      (returned as 2nd value)</span>
576
577<span class="sd">    :param list varyList: a list of parameters names (strings of form</span>
578<span class="sd">      ``&lt;ph&gt;:&lt;hst&gt;:&lt;nam&gt;``) that will be varied. Note that this is changed here. </span>
579<span class="sd">    </span>
580<span class="sd">    :param dict constrDict: a list of dicts defining relationships/constraints</span>
581<span class="sd">      (as defined in :func:`GroupConstraints`)</span>
582
583<span class="sd">    :param list fixedList: a list of values specifying a fixed value for each</span>
584<span class="sd">      dict in constrDict. Values are either strings that can be converted to</span>
585<span class="sd">      floats, float values or None if the constraint defines a new parameter.</span>
586<span class="sd">      </span>
587<span class="sd">    :param dict parmDict: a dict containing all parameters defined in current</span>
588<span class="sd">      refinement.</span>
589
590<span class="sd">    :param int SeqHist: number of current histogram, when used in a sequential</span>
591<span class="sd">      refinement. None (default) otherwise. Wildcard variable names are</span>
592<span class="sd">      set to the current histogram, when found if not None.</span>
593<span class="sd">    &#39;&#39;&#39;</span>
594    <span class="k">global</span> <span class="n">dependentParmList</span><span class="p">,</span><span class="n">arrayList</span><span class="p">,</span><span class="n">invarrayList</span><span class="p">,</span><span class="n">indParmList</span><span class="p">,</span><span class="n">consNum</span>
595    <span class="n">msg</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
596
597    <span class="c"># process fixed (held) variables</span>
598    <span class="k">for</span> <span class="n">cdict</span> <span class="ow">in</span> <span class="n">constrDict</span><span class="p">:</span>
599        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">cdict</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
600            <span class="n">fixedVarList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cdict</span><span class="o">.</span><span class="n">keys</span><span class="p">()[</span><span class="mi">0</span><span class="p">])</span>
601   
602    <span class="c"># process equivalences: make a list of dependent and independent vars</span>
603    <span class="c">#    and check for repeated uses (repetition of a parameter as an</span>
604    <span class="c">#    independent var is OK [A=B; A=C], but chaining: [A=B; B=C] is not good)</span>
605    <span class="n">indepVarList</span> <span class="o">=</span> <span class="p">[]</span>
606    <span class="n">depVarList</span> <span class="o">=</span> <span class="p">[]</span>
607    <span class="n">multdepVarList</span> <span class="o">=</span> <span class="p">[]</span>
608    <span class="n">translateTable</span> <span class="o">=</span> <span class="p">{}</span> <span class="c"># lookup table for wildcard referenced variables</span>
609    <span class="k">for</span> <span class="n">varlist</span><span class="p">,</span><span class="n">mapvars</span><span class="p">,</span><span class="n">multarr</span><span class="p">,</span><span class="n">invmultarr</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span>       <span class="c"># process equivalences</span>
610        <span class="n">dependentParmList</span><span class="p">,</span><span class="n">indParmList</span><span class="p">,</span><span class="n">arrayList</span><span class="p">,</span><span class="n">invarrayList</span><span class="p">):</span>
611        <span class="k">if</span> <span class="n">multarr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="c"># true only if an equivalence</span>
612            <span class="n">zeromult</span> <span class="o">=</span> <span class="bp">False</span>
613            <span class="k">for</span> <span class="n">mv</span> <span class="ow">in</span> <span class="n">mapvars</span><span class="p">:</span>
614                <span class="c">#s = &#39;&#39;</span>
615                <span class="n">varied</span> <span class="o">=</span> <span class="mi">0</span>
616                <span class="n">notvaried</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
617                <span class="k">if</span> <span class="n">mv</span> <span class="ow">in</span> <span class="n">varyList</span><span class="p">:</span>
618                    <span class="n">varied</span> <span class="o">+=</span> <span class="mi">1</span>
619                <span class="k">else</span><span class="p">:</span>
620                    <span class="k">if</span> <span class="n">notvaried</span><span class="p">:</span> <span class="n">notvaried</span> <span class="o">+=</span> <span class="s">&#39;, &#39;</span>
621                    <span class="n">notvaried</span> <span class="o">+=</span> <span class="n">mv</span>
622                <span class="k">if</span> <span class="n">parmDict</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">mv</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">parmDict</span><span class="p">:</span>
623                    <span class="k">print</span> <span class="s">&quot;Dropping equivalence for variable &quot;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">mv</span><span class="p">)</span><span class="o">+</span><span class="s">&quot;. Not defined in this refinement&quot;</span>
624                    <span class="c">#msg += &quot;\nCannot equivalence to variable &quot;+str(mv)+&quot;. Not defined in this refinement&quot;</span>
625                    <span class="c">#continue</span>
626                <span class="k">else</span><span class="p">:</span> 
627                    <span class="k">if</span> <span class="n">mv</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">indepVarList</span><span class="p">:</span> <span class="n">indepVarList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">mv</span><span class="p">)</span>
628                <span class="k">for</span> <span class="n">v</span><span class="p">,</span><span class="n">m</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">varlist</span><span class="p">,</span><span class="n">invmultarr</span><span class="p">):</span>
629                    <span class="k">if</span> <span class="n">parmDict</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">v</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">parmDict</span><span class="p">:</span>
630                        <span class="k">print</span> <span class="s">&quot;Dropping equivalence for variable &quot;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span><span class="o">+</span><span class="s">&quot;. Not defined in this refinement&quot;</span>
631                        <span class="k">continue</span>
632                    <span class="k">if</span> <span class="n">m</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="n">zeromult</span> <span class="o">=</span> <span class="bp">True</span>
633                    <span class="k">if</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">varyList</span><span class="p">:</span>
634                        <span class="n">varied</span> <span class="o">+=</span> <span class="mi">1</span>
635                    <span class="k">else</span><span class="p">:</span>
636                        <span class="k">if</span> <span class="n">notvaried</span><span class="p">:</span> <span class="n">notvaried</span> <span class="o">+=</span> <span class="s">&#39;, &#39;</span>
637                        <span class="n">notvaried</span> <span class="o">+=</span> <span class="n">v</span>
638                    <span class="k">if</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">depVarList</span><span class="p">:</span>
639                        <span class="n">multdepVarList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
640                    <span class="k">else</span><span class="p">:</span>
641                        <span class="n">depVarList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
642            <span class="k">if</span> <span class="n">varied</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">varied</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">varlist</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">:</span>
643                <span class="n">msg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Not all variables refined in equivalence:</span><span class="se">\n\t</span><span class="s">&quot;</span>
644                <span class="n">s</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
645                <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">varlist</span><span class="p">:</span>
646                    <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">s</span><span class="o">+=</span> <span class="s">&quot; &amp; &quot;</span>
647                    <span class="n">s</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>           
648                <span class="n">msg</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">mv</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot; =&gt; &quot;</span> <span class="o">+</span> <span class="n">s</span>
649                <span class="n">msg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">Not refined: &#39;</span> <span class="o">+</span> <span class="n">notvaried</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
650            <span class="k">if</span> <span class="n">zeromult</span><span class="p">:</span>
651                <span class="n">msg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Zero multiplier is invalid in equivalence:</span><span class="se">\n\t</span><span class="s">&quot;</span>
652                <span class="n">s</span> <span class="o">=</span> <span class="s">&quot;&quot;</span>
653                <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">varlist</span><span class="p">:</span>
654                    <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">s</span><span class="o">+=</span> <span class="s">&quot; &amp; &quot;</span>
655                    <span class="n">s</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>           
656                <span class="n">msg</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">mv</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot; =&gt; &quot;</span> <span class="o">+</span> <span class="n">s</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
657
658    <span class="k">if</span> <span class="n">debug</span><span class="p">:</span> <span class="k">print</span> <span class="s">&#39;indepVarList&#39;</span><span class="p">,</span><span class="n">indepVarList</span>
659    <span class="k">if</span> <span class="n">debug</span><span class="p">:</span> <span class="k">print</span> <span class="s">&#39;depVarList&#39;</span><span class="p">,</span><span class="n">depVarList</span>
660    <span class="c"># check for errors:</span>
661    <span class="n">inboth</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="n">indepVarList</span><span class="p">)</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">depVarList</span><span class="p">))</span>
662    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">inboth</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
663        <span class="n">msg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">The following parameters(s) are used as both dependent and independent variables in Equivalence relations:</span><span class="se">\n</span><span class="s">&quot;</span>
664        <span class="n">s</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
665        <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">inboth</span><span class="p">):</span>
666            <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">s</span><span class="o">+=</span> <span class="s">&quot;, &quot;</span>
667            <span class="n">s</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
668        <span class="n">msg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\t</span><span class="s">&#39;</span><span class="o">+</span> <span class="n">s</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
669    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">multdepVarList</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
670        <span class="n">msg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">The following parameters(s) are used in multiple Equivalence relations as dependent variables:</span><span class="se">\n</span><span class="s">&quot;</span>
671        <span class="n">s</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
672        <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">multdepVarList</span><span class="p">)):</span>
673            <span class="k">if</span> <span class="n">s</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span> <span class="n">s</span><span class="o">+=</span> <span class="s">&quot;, &quot;</span>
674            <span class="n">s</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>           
675        <span class="n">msg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\t</span><span class="s">&#39;</span><span class="o">+</span> <span class="n">s</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
676    <span class="n">equivVarList</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">indepVarList</span><span class="p">)</span><span class="o">.</span><span class="n">union</span><span class="p">(</span><span class="nb">set</span><span class="p">(</span><span class="n">depVarList</span><span class="p">)))</span>
677
678    <span class="c"># scan through parameters in each relationship. Are all varied? If only some are</span>
679    <span class="c"># varied, create an error message. </span>
680    <span class="k">for</span> <span class="n">group</span><span class="p">,</span><span class="n">varlist</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">groups</span><span class="p">,</span><span class="n">parmlist</span><span class="p">):</span>
681        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">varlist</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">continue</span>
682        <span class="k">for</span> <span class="n">rel</span> <span class="ow">in</span> <span class="n">group</span><span class="p">:</span>
683            <span class="n">varied</span> <span class="o">=</span> <span class="mi">0</span>
684            <span class="n">notvaried</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
685            <span class="n">unused</span> <span class="o">=</span> <span class="mi">0</span>
686            <span class="n">notused</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
687            <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">]:</span>
688                <span class="k">if</span> <span class="n">var</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">):</span> <span class="k">continue</span>
689                <span class="k">if</span> <span class="n">var</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;:&#39;</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;*&#39;</span> <span class="ow">and</span> <span class="n">SeqHist</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
690                    <span class="c"># convert wildcard var to reference current histogram; save translation in table</span>
691                    <span class="n">sv</span> <span class="o">=</span> <span class="n">var</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&#39;:&#39;</span><span class="p">)</span>
692                    <span class="n">sv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">SeqHist</span><span class="p">)</span>
693                    <span class="n">translateTable</span><span class="p">[</span><span class="n">var</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;:&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">sv</span><span class="p">)</span>
694                    <span class="n">var</span> <span class="o">=</span> <span class="n">translateTable</span><span class="p">[</span><span class="n">var</span><span class="p">]</span>
695                <span class="k">if</span> <span class="n">parmDict</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">var</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">parmDict</span><span class="p">:</span>
696                    <span class="n">unused</span> <span class="o">+=</span> <span class="mi">1</span>
697                    <span class="k">if</span> <span class="n">notvaried</span><span class="p">:</span> <span class="n">notused</span> <span class="o">+=</span> <span class="s">&#39;, &#39;</span>
698                    <span class="n">notused</span> <span class="o">+=</span> <span class="n">var</span>
699                <span class="k">if</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">varyList</span><span class="p">:</span>
700                    <span class="n">varied</span> <span class="o">+=</span> <span class="mi">1</span>
701                <span class="k">else</span><span class="p">:</span>
702                    <span class="k">if</span> <span class="n">notvaried</span><span class="p">:</span> <span class="n">notvaried</span> <span class="o">+=</span> <span class="s">&#39;, &#39;</span>
703                    <span class="n">notvaried</span> <span class="o">+=</span> <span class="n">var</span>
704                <span class="k">if</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">fixedVarList</span><span class="p">:</span>
705                    <span class="n">msg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">Error: parameter &#39;</span><span class="o">+</span><span class="n">var</span><span class="o">+</span><span class="s">&quot; is Fixed and used in a constraint:</span><span class="se">\n\t</span><span class="s">&quot;</span>
706                    <span class="n">msg</span> <span class="o">+=</span> <span class="n">_FormatConstraint</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">],</span><span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">])</span><span class="o">+</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span>
707            <span class="c">#if unused &gt; 0:# and unused != len(VarKeys(constrDict[rel])):</span>
708            <span class="k">if</span> <span class="n">unused</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">unused</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">VarKeys</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">])):</span>
709                <span class="n">msg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Some (but not all) variables in constraint are not defined:</span><span class="se">\n\t</span><span class="s">&quot;</span>
710                <span class="n">msg</span> <span class="o">+=</span> <span class="n">_FormatConstraint</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">],</span><span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">])</span>
711                <span class="n">msg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">Not used: &#39;</span> <span class="o">+</span> <span class="n">notused</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
712            <span class="k">if</span> <span class="n">varied</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">varied</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">VarKeys</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">])):</span>
713                <span class="n">msg</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">Not all variables refined in constraint:</span><span class="se">\n\t</span><span class="s">&quot;</span>
714                <span class="n">msg</span> <span class="o">+=</span> <span class="n">_FormatConstraint</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">],</span><span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">])</span>
715                <span class="n">msg</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">Not refined: &#39;</span> <span class="o">+</span> <span class="n">notvaried</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
716    <span class="c"># if there were errors found, go no farther</span>
717    <span class="k">if</span> <span class="n">msg</span><span class="p">:</span>
718        <span class="k">print</span> <span class="s">&#39; *** ERROR in constraint definitions! ***&#39;</span>
719        <span class="k">print</span> <span class="n">msg</span>
720        <span class="k">raise</span> <span class="ne">Exception</span>
721               
722    <span class="c"># now process each group and create the relations that are needed to form</span>
723    <span class="c"># a non-singular square matrix</span>
724    <span class="c"># If all are varied and this is a constraint equation, then set VaryFree flag</span>
725    <span class="c"># so that the newly created relationships will be varied</span>
726    <span class="k">for</span> <span class="n">group</span><span class="p">,</span><span class="n">varlist</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">groups</span><span class="p">,</span><span class="n">parmlist</span><span class="p">):</span>
727        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">varlist</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span> <span class="k">continue</span>
728        <span class="c"># for constraints, if all included variables are refined,</span>
729        <span class="c"># set the VaryFree flag, and remaining degrees of freedom will be</span>
730        <span class="c"># varied (since consistency was checked, if any one variable is</span>
731        <span class="c"># refined, then assume that all are)</span>
732        <span class="n">varsList</span> <span class="o">=</span> <span class="p">[]</span> <span class="c"># make a list of all the referenced variables as well</span>
733        <span class="n">VaryFree</span> <span class="o">=</span> <span class="bp">False</span>
734        <span class="k">for</span> <span class="n">rel</span> <span class="ow">in</span> <span class="n">group</span><span class="p">:</span>
735            <span class="n">varied</span> <span class="o">=</span> <span class="mi">0</span>
736            <span class="n">unused</span> <span class="o">=</span> <span class="mi">0</span>
737            <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">VarKeys</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">]):</span>
738                <span class="n">var</span> <span class="o">=</span> <span class="n">translateTable</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">var</span><span class="p">,</span><span class="n">var</span><span class="p">)</span> <span class="c"># replace wildcards</span>
739                <span class="k">if</span> <span class="n">parmDict</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">var</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">parmDict</span><span class="p">:</span>
740                    <span class="n">unused</span> <span class="o">+=</span> <span class="mi">1</span>                   
741                <span class="k">if</span> <span class="n">var</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">varsList</span><span class="p">:</span> <span class="n">varsList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
742                <span class="k">if</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">varyList</span><span class="p">:</span> <span class="n">varied</span> <span class="o">+=</span> <span class="mi">1</span>
743            <span class="k">if</span> <span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">varied</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
744                <span class="n">VaryFree</span> <span class="o">=</span> <span class="bp">True</span>
745        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">varlist</span><span class="p">)</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">group</span><span class="p">):</span> <span class="c"># too many relationships -- no can do</span>
746            <span class="n">msg</span> <span class="o">=</span> <span class="s">&#39;too many relationships&#39;</span>
747            <span class="k">break</span>
748        <span class="c"># Since we checked before, if any variables are unused, then all must be. </span>
749        <span class="c"># If so, this set of relationships can be ignored</span>
750        <span class="k">if</span> <span class="n">unused</span><span class="p">:</span>
751            <span class="k">if</span> <span class="n">debug</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&#39;Constraint ignored (all variables undefined)&#39;</span><span class="p">)</span>
752            <span class="k">if</span> <span class="n">debug</span><span class="p">:</span> <span class="k">print</span> <span class="p">(</span><span class="s">&#39;    &#39;</span><span class="o">+</span><span class="n">_FormatConstraint</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">],</span><span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">]))</span>
753            <span class="k">continue</span>
754        <span class="c"># fill in additional degrees of freedom</span>
755        <span class="k">try</span><span class="p">:</span>
756            <span class="n">arr</span> <span class="o">=</span> <span class="n">_FillArray</span><span class="p">(</span><span class="n">group</span><span class="p">,</span><span class="n">constrDict</span><span class="p">,</span><span class="n">varlist</span><span class="p">)</span>
757            <span class="n">_RowEchelon</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">group</span><span class="p">),</span><span class="n">arr</span><span class="p">,</span><span class="n">varlist</span><span class="p">)</span>
758            <span class="n">constrArr</span> <span class="o">=</span> <span class="n">_FillArray</span><span class="p">(</span><span class="n">group</span><span class="p">,</span><span class="n">constrDict</span><span class="p">,</span><span class="n">varlist</span><span class="p">,</span><span class="n">FillDiagonals</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
759            <span class="n">GramSchmidtOrtho</span><span class="p">(</span><span class="n">constrArr</span><span class="p">,</span><span class="nb">len</span><span class="p">(</span><span class="n">group</span><span class="p">))</span>
760        <span class="k">except</span><span class="p">:</span>
761            <span class="n">msg</span> <span class="o">=</span> <span class="s">&#39;Singular relationships&#39;</span>
762            <span class="k">break</span>
763        <span class="n">mapvar</span> <span class="o">=</span> <span class="p">[]</span>
764        <span class="n">group</span> <span class="o">=</span> <span class="n">group</span><span class="p">[:]</span>
765        <span class="c"># scan through all generated and input relationships, we need to add to the varied list</span>
766        <span class="c"># all the new parameters where VaryFree has been set or where a New Var is varied.</span>
767        <span class="c">#</span>
768        <span class="c"># If a group does not contain any fixed values (constraint equations)</span>
769        <span class="c"># and nothing in the group is varied, drop this group, so that the </span>
770        <span class="c"># dependent parameters can be refined individually.</span>
771        <span class="n">unused</span> <span class="o">=</span> <span class="bp">True</span>
772        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">varlist</span><span class="p">)):</span>
773            <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">group</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> <span class="c"># get the original equation reference</span>
774                <span class="n">rel</span> <span class="o">=</span> <span class="n">group</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
775                <span class="n">fixedval</span> <span class="o">=</span> <span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">]</span>
776                <span class="n">varyflag</span> <span class="o">=</span> <span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_vary&#39;</span><span class="p">,</span><span class="bp">False</span><span class="p">)</span>
777                <span class="n">varname</span> <span class="o">=</span> <span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">&#39;_name&#39;</span><span class="p">,</span><span class="s">&#39;&#39;</span><span class="p">)</span>
778            <span class="k">else</span><span class="p">:</span> <span class="c"># this relationship has been generated</span>
779                <span class="n">varyflag</span> <span class="o">=</span> <span class="bp">False</span>
780                <span class="n">varname</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
781                <span class="n">fixedval</span> <span class="o">=</span> <span class="bp">None</span>
782            <span class="k">if</span> <span class="n">fixedval</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="c"># this is a new variable, not a constraint</span>
783                <span class="k">if</span> <span class="ow">not</span> <span class="n">varname</span><span class="p">:</span>
784                    <span class="n">varname</span> <span class="o">=</span> <span class="n">paramPrefix</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">consNum</span><span class="p">)</span> <span class="c"># no assigned name, create one</span>
785                    <span class="n">consNum</span> <span class="o">+=</span> <span class="mi">1</span>
786                <span class="n">mapvar</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">varname</span><span class="p">)</span>
787                <span class="c"># vary the new relationship if it is a degree of freedom in</span>
788                <span class="c"># a set of contraint equations or if a New Var is flagged to be varied.</span>
789                <span class="k">if</span> <span class="n">VaryFree</span> <span class="ow">or</span> <span class="n">varyflag</span><span class="p">:</span> 
790                    <span class="n">unused</span> <span class="o">=</span> <span class="bp">False</span>
791                    <span class="n">varyList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">varname</span><span class="p">)</span>
792                    <span class="c"># fix (prevent varying) of all the variables inside the constraint group</span>
793                    <span class="c"># (dependent vars)</span>
794                    <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">varsList</span><span class="p">:</span>
795                        <span class="k">if</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">varyList</span><span class="p">:</span> <span class="n">varyList</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
796            <span class="k">else</span><span class="p">:</span>
797                <span class="n">unused</span> <span class="o">=</span> <span class="bp">False</span>
798                <span class="n">mapvar</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">fixedval</span><span class="p">)</span>
799        <span class="k">if</span> <span class="n">unused</span><span class="p">:</span> <span class="c"># skip over constraints that don&#39;t matter (w/o fixed value or any refined variables)</span>
800            <span class="k">if</span> <span class="n">debug</span><span class="p">:</span> <span class="k">print</span><span class="p">(</span><span class="s">&#39;Constraint ignored (all variables unrefined)&#39;</span><span class="p">)</span>
801            <span class="k">if</span> <span class="n">debug</span><span class="p">:</span> <span class="k">print</span> <span class="p">(</span><span class="s">&#39;   &#39;</span><span class="o">+</span><span class="n">_FormatConstraint</span><span class="p">(</span><span class="n">constrDict</span><span class="p">[</span><span class="n">rel</span><span class="p">],</span><span class="n">fixedList</span><span class="p">[</span><span class="n">rel</span><span class="p">]))</span>
802            <span class="k">continue</span> 
803        <span class="n">dependentParmList</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">translateTable</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">var</span><span class="p">,</span><span class="n">var</span><span class="p">)</span> <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">varlist</span><span class="p">])</span>
804        <span class="n">arrayList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">constrArr</span><span class="p">)</span>
805        <span class="n">invarrayList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">linalg</span><span class="o">.</span><span class="n">inv</span><span class="p">(</span><span class="n">constrArr</span><span class="p">))</span>
806        <span class="n">indParmList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">mapvar</span><span class="p">)</span>
807    <span class="k">if</span> <span class="n">msg</span><span class="p">:</span>
808        <span class="k">print</span> <span class="s">&#39; *** ERROR in constraint definitions! ***&#39;</span>
809        <span class="k">print</span> <span class="n">msg</span>
810        <span class="k">print</span> <span class="n">VarRemapShow</span><span class="p">(</span><span class="n">varyList</span><span class="p">)</span>
811        <span class="k">raise</span> <span class="ne">Exception</span>
812    <span class="c"># setup dictionary containing the fixed values</span>
813    <span class="k">global</span> <span class="n">fixedDict</span> 
814    <span class="c"># key is original ascii string, value is float</span>
815    <span class="k">for</span> <span class="n">fixedval</span> <span class="ow">in</span> <span class="n">fixedList</span><span class="p">:</span>
816        <span class="k">if</span> <span class="n">fixedval</span><span class="p">:</span>
817            <span class="n">fixedDict</span><span class="p">[</span><span class="n">fixedval</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">fixedval</span><span class="p">)</span>
818
819    <span class="k">if</span> <span class="n">debug</span><span class="p">:</span> <span class="c"># on debug, show what is parsed &amp; generated, semi-readable</span>
820        <span class="k">print</span> <span class="mi">50</span><span class="o">*</span><span class="s">&#39;-&#39;</span>
821        <span class="k">print</span> <span class="n">VarRemapShow</span><span class="p">(</span><span class="n">varyList</span><span class="p">)</span>
822        <span class="k">print</span> <span class="s">&#39;Varied: &#39;</span><span class="p">,</span><span class="n">varyList</span>
823        <span class="k">print</span> <span class="s">&#39;Not Varied: &#39;</span><span class="p">,</span><span class="n">fixedVarList</span>
824</div>
825<div class="viewcode-block" id="StoreEquivalence"><a class="viewcode-back" href="../GSASIImapvars.html#GSASIImapvars.StoreEquivalence">[docs]</a><span class="k">def</span> <span class="nf">StoreEquivalence</span><span class="p">(</span><span class="n">independentVar</span><span class="p">,</span><span class="n">dependentList</span><span class="p">):</span>
826    <span class="sd">&#39;&#39;&#39;Takes a list of dependent parameter(s) and stores their</span>
827<span class="sd">    relationship to a single independent parameter (independentVar)</span>
828
829<span class="sd">    :param str independentVar: name of master parameter that will be used to determine the value</span>
830<span class="sd">      to set the dependent variables</span>
831
832<span class="sd">    :param list dependentList: a list of parameters that will set from</span>
833<span class="sd">         independentVar. Each item in the list can be a string with the parameter</span>
834<span class="sd">         name or a tuple containing a name and multiplier:</span>
835<span class="sd">         ``[&#39;parm1&#39;,(&#39;parm2&#39;,.5),]``</span>
836
837<span class="sd">    &#39;&#39;&#39;</span>
838   
839    <span class="k">global</span> <span class="n">dependentParmList</span><span class="p">,</span><span class="n">arrayList</span><span class="p">,</span><span class="n">invarrayList</span><span class="p">,</span><span class="n">indParmList</span>
840    <span class="n">mapList</span> <span class="o">=</span> <span class="p">[]</span>
841    <span class="n">multlist</span> <span class="o">=</span> <span class="p">[]</span>
842    <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">dependentList</span><span class="p">:</span>
843        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">var</span><span class="p">,</span> <span class="nb">basestring</span><span class="p">):</span>
844            <span class="n">mult</span> <span class="o">=</span> <span class="mf">1.0</span>
845        <span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">var</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
846            <span class="n">var</span><span class="p">,</span><span class="n">mult</span> <span class="o">=</span> <span class="n">var</span>
847        <span class="k">else</span><span class="p">:</span>
848            <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s">&quot;Cannot parse &quot;</span><span class="o">+</span><span class="nb">repr</span><span class="p">(</span><span class="n">var</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot; as var or (var,multiplier)&quot;</span><span class="p">)</span>
849        <span class="n">mapList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">var</span><span class="p">)</span>
850        <span class="n">multlist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">tuple</span><span class="p">((</span><span class="n">mult</span><span class="p">,)))</span>
851    <span class="c"># added relationships to stored values</span>
852    <span class="n">arrayList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">None</span><span class="p">)</span>
853    <span class="n">invarrayList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">multlist</span><span class="p">))</span>
854    <span class="n">indParmList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">tuple</span><span class="p">((</span><span class="n">independentVar</span><span class="p">,)))</span>
855    <span class="n">dependentParmList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">mapList</span><span class="p">)</span>
856    <span class="k">return</span>
857</div>
858<div class="viewcode-block" id="GetDependentVars"><a class="viewcode-back" href="../GSASIImapvars.html#GSASIImapvars.GetDependentVars">[docs]</a><span class="k">def</span> <span class="nf">GetDependentVars</span><span class="p">():</span>
859    <span class="sd">&#39;&#39;&#39;Return a list of dependent variables: e.g. variables that are</span>
860<span class="sd">    constrained in terms of other variables</span>
861
862<span class="sd">    :returns: a list of variable names</span>
863
864<span class="sd">    &#39;&#39;&#39;</span>
865    <span class="n">dependentVars</span> <span class="o">=</span> <span class="p">[]</span>
866    <span class="k">global</span> <span class="n">dependentParmList</span>
867    <span class="k">for</span> <span class="n">lst</span> <span class="ow">in</span> <span class="n">dependentParmList</span><span class="p">:</span>
868        <span class="k">for</span> <span class="n">itm</span> <span class="ow">in</span> <span class="n">lst</span><span class="p">:</span> <span class="n">dependentVars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">itm</span><span class="p">)</span>
869    <span class="k">return</span> <span class="n">dependentVars</span>
870</div>
871<div class="viewcode-block" id="GetIndependentVars"><a class="viewcode-back" href="../GSASIImapvars.html#GSASIImapvars.GetIndependentVars">[docs]</a><span class="k">def</span> <span class="nf">GetIndependentVars</span><span class="p">():</span>
872    <span class="sd">&#39;&#39;&#39;Return a list of independent variables: e.g. variables that are</span>
873<span class="sd">    created by constraints of other variables</span>
874
875<span class="sd">    :returns: a list of variable names</span>
876
877<span class="sd">    &#39;&#39;&#39;</span>
878    <span class="n">independentVars</span> <span class="o">=</span> <span class="p">[]</span>
879    <span class="k">global</span> <span class="n">indParmList</span><span class="p">,</span><span class="n">fixedDict</span>
880    <span class="k">for</span> <span class="n">lst</span> <span class="ow">in</span> <span class="n">indParmList</span><span class="p">:</span>
881        <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">lst</span><span class="p">:</span>
882            <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">fixedDict</span><span class="p">:</span> <span class="k">continue</span>
883            <span class="n">independentVars</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
884    <span class="k">return</span> <span class="n">independentVars</span>
885</div>
886<div class="viewcode-block" id="PrintIndependentVars"><a class="viewcode-back" href="../GSASIImapvars.html#GSASIImapvars.PrintIndependentVars">[docs]</a><span class="k">def</span> <span class="nf">PrintIndependentVars</span><span class="p">(</span><span class="n">parmDict</span><span class="p">,</span><span class="n">varyList</span><span class="p">,</span><span class="n">sigDict</span><span class="p">,</span><span class="n">PrintAll</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span><span class="n">pFile</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
887    <span class="sd">&#39;&#39;&#39;Print the values and uncertainties on the independent variables&#39;&#39;&#39;</span>
888    <span class="k">global</span> <span class="n">dependentParmList</span><span class="p">,</span><span class="n">arrayList</span><span class="p">,</span><span class="n">invarrayList</span><span class="p">,</span><span class="n">indParmList</span><span class="p">,</span><span class="n">fixedDict</span>
889    <span class="n">printlist</span> <span class="o">=</span> <span class="p">[]</span>
890    <span class="n">mapvars</span> <span class="o">=</span> <span class="n">GetIndependentVars</span><span class="p">()</span>
891    <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">name</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">mapvars</span><span class="p">):</span>
892        <span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">fixedDict</span><span class="p">:</span> <span class="k">continue</span>
893        <span class="k">if</span> <span class="n">PrintAll</span> <span class="ow">or</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">varyList</span><span class="p">:</span>
894            <span class="n">sig</span> <span class="o">=</span> <span class="n">sigDict</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
895            <span class="n">printlist</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">name</span><span class="p">,</span><span class="n">parmDict</span><span class="p">[</span><span class="n">name</span><span class="p">],</span><span class="n">sig</span><span class="p">])</span>
896    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">printlist</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span>
897    <span class="n">s1</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
898    <span class="k">print</span> <span class="o">&gt;&gt;</span><span class="n">pFile</span><span class="p">,</span><span class="mi">130</span><span class="o">*</span><span class="s">&#39;-&#39;</span>
899    <span class="k">print</span> <span class="o">&gt;&gt;</span><span class="n">pFile</span><span class="p">,</span><span class="s">&quot;Variables generated by constraints&quot;</span>
900    <span class="n">printlist</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="mi">3</span><span class="o">*</span><span class="p">[</span><span class="bp">None</span><span class="p">])</span>
901    <span class="k">for</span> <span class="n">name</span><span class="p">,</span><span class="n">val</span><span class="p">,</span><span class="n">esd</span> <span class="ow">in</span> <span class="n">printlist</span><span class="p">:</span>
902        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">s1</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">120</span> <span class="ow">or</span> <span class="n">name</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
903            <span class="k">print</span> <span class="o">&gt;&gt;</span><span class="n">pFile</span><span class="p">,</span><span class="s">&#39;&#39;</span>
904            <span class="k">print</span> <span class="o">&gt;&gt;</span><span class="n">pFile</span><span class="p">,</span><span class="n">s1</span>
905            <span class="k">print</span> <span class="o">&gt;&gt;</span><span class="n">pFile</span><span class="p">,</span><span class="n">s2</span>
906            <span class="k">print</span> <span class="o">&gt;&gt;</span><span class="n">pFile</span><span class="p">,</span><span class="n">s3</span>
907            <span class="n">s1</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
908            <span class="k">if</span> <span class="n">name</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> <span class="k">break</span>
909        <span class="k">if</span> <span class="n">s1</span> <span class="o">==</span> <span class="s">&quot;&quot;</span><span class="p">:</span>
910            <span class="n">s1</span> <span class="o">=</span> <span class="s">&#39; name  :&#39;</span>
911            <span class="n">s2</span> <span class="o">=</span> <span class="s">&#39; value :&#39;</span>
912            <span class="n">s3</span> <span class="o">=</span> <span class="s">&#39; sig   :&#39;</span>
913        <span class="n">s1</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="si">%15s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">)</span>
914        <span class="n">s2</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="si">%15.4f</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">val</span><span class="p">)</span>
915        <span class="k">if</span> <span class="n">esd</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
916            <span class="n">s3</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="si">%15s</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="s">&#39;n/a&#39;</span><span class="p">)</span>
917        <span class="k">else</span><span class="p">:</span>   
918            <span class="n">s3</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="si">%15.4f</span><span class="s">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">esd</span><span class="p">)</span>
919</div>
920<div class="viewcode-block" id="ComputeDepESD"><a class="viewcode-back" href="../GSASIImapvars.html#GSASIImapvars.ComputeDepESD">[docs]</a><span class="k">def</span> <span class="nf">ComputeDepESD</span><span class="p">(</span><span class="n">covMatrix</span><span class="p">,</span><span class="n">varyList</span><span class="p">,</span><span class="n">parmDict</span><span class="p">):</span>
921    <span class="sd">&#39;&#39;&#39;Compute uncertainties for dependent parameters from independent ones</span>
922<span class="sd">    returns a dictionary containing the esd values for dependent parameters</span>
923<span class="sd">    &#39;&#39;&#39;</span>
924    <span class="n">sigmaDict</span> <span class="o">=</span> <span class="p">{}</span>
925    <span class="k">for</span> <span class="n">varlist</span><span class="p">,</span><span class="n">mapvars</span><span class="p">,</span><span class="n">invmultarr</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">dependentParmList</span><span class="p">,</span><span class="n">indParmList</span><span class="p">,</span><span class="n">invarrayList</span><span class="p">):</span>
926        <span class="c">#if invmultarr is None: continue # probably not needed</span>
927        <span class="k">try</span><span class="p">:</span> 
928            <span class="n">valuelist</span> <span class="o">=</span> <span class="p">[</span><span class="n">parmDict</span><span class="p">[</span><span class="n">var</span><span class="p">]</span> <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">mapvars</span><span class="p">]</span>
929        <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
930            <span class="k">continue</span>
931        <span class="c"># get the v-covar matrix for independent parameters </span>
932        <span class="n">vcov</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">((</span><span class="nb">len</span><span class="p">(</span><span class="n">mapvars</span><span class="p">),</span><span class="nb">len</span><span class="p">(</span><span class="n">mapvars</span><span class="p">)))</span>
933        <span class="k">for</span> <span class="n">i1</span><span class="p">,</span><span class="n">name1</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">mapvars</span><span class="p">):</span>
934            <span class="k">if</span> <span class="n">name1</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">varyList</span><span class="p">:</span> <span class="k">continue</span>
935            <span class="n">iv1</span> <span class="o">=</span> <span class="n">varyList</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">name1</span><span class="p">)</span>
936            <span class="k">for</span> <span class="n">i2</span><span class="p">,</span><span class="n">name2</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">mapvars</span><span class="p">):</span>
937                <span class="k">if</span> <span class="n">name2</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">varyList</span><span class="p">:</span> <span class="k">continue</span>
938                <span class="n">iv2</span> <span class="o">=</span> <span class="n">varyList</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">name2</span><span class="p">)</span>
939                <span class="n">vcov</span><span class="p">[</span><span class="n">i1</span><span class="p">][</span><span class="n">i2</span><span class="p">]</span> <span class="o">=</span> <span class="n">covMatrix</span><span class="p">[</span><span class="n">iv1</span><span class="p">][</span><span class="n">iv2</span><span class="p">]</span>
940        <span class="c"># vec is the vector that multiplies each of the independent values</span>
941        <span class="k">for</span> <span class="n">v</span><span class="p">,</span><span class="n">vec</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">varlist</span><span class="p">,</span><span class="n">invmultarr</span><span class="p">):</span>
942            <span class="n">sigmaDict</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">inner</span><span class="p">(</span><span class="n">vec</span><span class="o">.</span><span class="n">T</span><span class="p">,</span><span class="n">np</span><span class="o">.</span><span class="n">inner</span><span class="p">(</span><span class="n">vcov</span><span class="p">,</span><span class="n">vec</span><span class="p">)))</span>
943    <span class="k">return</span> <span class="n">sigmaDict</span>
944</div>
945<span class="k">def</span> <span class="nf">_FormatConstraint</span><span class="p">(</span><span class="n">RelDict</span><span class="p">,</span><span class="n">RelVal</span><span class="p">):</span>
946    <span class="sd">&#39;&#39;&#39;Formats a Constraint or Function for use in a convenient way&#39;&#39;&#39;</span>
947    <span class="n">linelen</span> <span class="o">=</span> <span class="mi">45</span>
948    <span class="n">s</span> <span class="o">=</span> <span class="p">[</span><span class="s">&quot;&quot;</span><span class="p">]</span>
949    <span class="k">for</span> <span class="n">var</span><span class="p">,</span><span class="n">val</span> <span class="ow">in</span> <span class="n">RelDict</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
950        <span class="k">if</span> <span class="n">var</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">&#39;_&#39;</span><span class="p">):</span> <span class="k">continue</span>
951        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">&gt;</span> <span class="n">linelen</span><span class="p">:</span> <span class="n">s</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">)</span>
952        <span class="n">m</span> <span class="o">=</span> <span class="n">val</span>
953        <span class="k">if</span> <span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span> <span class="ow">and</span> <span class="n">m</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">:</span>
954            <span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="s">&#39; + &#39;</span>
955        <span class="k">elif</span> <span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&quot;&quot;</span><span class="p">:</span>
956            <span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="s">&#39; - &#39;</span>
957            <span class="n">m</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
958        <span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="si">%.3f</span><span class="s">*</span><span class="si">%s</span><span class="s"> &#39;</span><span class="o">%</span><span class="p">(</span><span class="n">m</span><span class="p">,</span><span class="n">var</span><span class="p">)</span>
959    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">&gt;</span> <span class="n">linelen</span><span class="p">:</span> <span class="n">s</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">&#39; &#39;</span><span class="p">)</span>
960    <span class="k">if</span> <span class="n">RelVal</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
961        <span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="s">&#39; = New variable&#39;</span>
962    <span class="k">else</span><span class="p">:</span>
963        <span class="n">s</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="s">&#39; = &#39;</span> <span class="o">+</span> <span class="n">RelVal</span>
964    <span class="n">s1</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
965    <span class="k">for</span> <span class="n">s2</span> <span class="ow">in</span> <span class="n">s</span><span class="p">:</span>
966        <span class="k">if</span> <span class="n">s1</span> <span class="o">!=</span> <span class="s">&#39;&#39;</span><span class="p">:</span> <span class="n">s1</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n\t</span><span class="s">&#39;</span>
967        <span class="n">s1</span> <span class="o">+=</span> <span class="n">s2</span>
968    <span class="k">return</span> <span class="n">s1</span>
969
970<div class="viewcode-block" id="VarRemapShow"><a class="viewcode-back" href="../GSASIImapvars.html#GSASIImapvars.VarRemapShow">[docs]</a><span class="k">def</span> <span class="nf">VarRemapShow</span><span class="p">(</span><span class="n">varyList</span><span class="p">):</span>
971    <span class="sd">&#39;&#39;&#39;List out the saved relationships. This should be done after the constraints have been</span>
972<span class="sd">    defined using :func:`StoreEquivalence`, :func:`GroupConstraints` and :func:`GenerateConstraints`.</span>
973
974<span class="sd">    :returns: a string containing the details of the contraint relationships</span>
975<span class="sd">    &#39;&#39;&#39;</span>
976    <span class="n">s</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
977    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">fixedVarList</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
978        <span class="n">s</span> <span class="o">+=</span> <span class="s">&#39;Fixed Variables:</span><span class="se">\n</span><span class="s">&#39;</span>
979        <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">fixedVarList</span><span class="p">:</span>
980            <span class="n">s</span> <span class="o">+=</span> <span class="s">&#39;    &#39;</span> <span class="o">+</span> <span class="n">v</span> <span class="o">+</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
981    <span class="n">s</span> <span class="o">+=</span> <span class="s">&#39;Variable mapping relations:</span><span class="se">\n</span><span class="s">&#39;</span>
982    <span class="k">global</span> <span class="n">dependentParmList</span><span class="p">,</span><span class="n">arrayList</span><span class="p">,</span><span class="n">invarrayList</span><span class="p">,</span><span class="n">indParmList</span><span class="p">,</span><span class="n">fixedDict</span>
983    <span class="k">for</span> <span class="n">varlist</span><span class="p">,</span><span class="n">mapvars</span><span class="p">,</span><span class="n">multarr</span><span class="p">,</span><span class="n">invmultarr</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span>
984        <span class="n">dependentParmList</span><span class="p">,</span><span class="n">indParmList</span><span class="p">,</span><span class="n">arrayList</span><span class="p">,</span><span class="n">invarrayList</span><span class="p">):</span>
985        <span class="k">for</span> <span class="n">i</span><span class="p">,</span><span class="n">mv</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">mapvars</span><span class="p">):</span>
986            <span class="k">if</span> <span class="n">multarr</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
987                <span class="n">s</span> <span class="o">+=</span> <span class="s">&#39;  &#39;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">mv</span><span class="p">)</span> <span class="o">+</span> <span class="s">&#39; is equivalent to parameter(s): &#39;</span>
988                <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span>
989                <span class="k">for</span> <span class="n">v</span><span class="p">,</span><span class="n">m</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">varlist</span><span class="p">,</span><span class="n">invmultarr</span><span class="p">):</span>
990                    <span class="k">if</span> <span class="n">debug</span><span class="p">:</span> <span class="k">print</span> <span class="s">&#39;v,m[0]: &#39;</span><span class="p">,</span><span class="n">v</span><span class="p">,</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
991                    <span class="k">if</span> <span class="n">j</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span> <span class="n">s</span> <span class="o">+=</span> <span class="s">&#39;  &amp; &#39;</span>
992                    <span class="n">j</span> <span class="o">+=</span> <span class="mi">1</span>
993                    <span class="n">s</span> <span class="o">+=</span> <span class="nb">str</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
994                    <span class="k">if</span> <span class="n">m</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
995                        <span class="n">s</span> <span class="o">+=</span> <span class="s">&quot; / &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>                       
996                <span class="n">s</span> <span class="o">+=</span> <span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span>
997                <span class="k">continue</span>
998            <span class="n">s</span> <span class="o">+=</span> <span class="s">&#39;  </span><span class="si">%s</span><span class="s"> = &#39;</span> <span class="o">%</span> <span class="n">mv</span>
999            <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span>
1000            <span class="k">for</span> <span class="n">m</span><span class="p">,</span><span class="n">v</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">multarr</span><s