mailr5189 - in /1.3/specific_fns/model_free: mf_minimise.py model_free.py


Others Months | Index by Date | Thread Index
>>   [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Header


Content

Posted by edward on March 23, 2008 - 15:23:
Author: bugman
Date: Sun Mar 23 15:05:06 2008
New Revision: 5189

URL: http://svn.gna.org/viewcvs/relax?rev=5189&view=rev
Log:
Converted the model-free linear_constraints() method to the new relax design.


Modified:
    1.3/specific_fns/model_free/mf_minimise.py
    1.3/specific_fns/model_free/model_free.py

Modified: 1.3/specific_fns/model_free/mf_minimise.py
URL: 
http://svn.gna.org/viewcvs/relax/1.3/specific_fns/model_free/mf_minimise.py?rev=5189&r1=5188&r2=5189&view=diff
==============================================================================
--- 1.3/specific_fns/model_free/mf_minimise.py (original)
+++ 1.3/specific_fns/model_free/mf_minimise.py Sun Mar 23 15:05:06 2008
@@ -482,7 +482,7 @@
                                     The number of elements in the array must 
equal to the number of
                                     parameters in the model.
         @type inc:                  array of int
-        @keyword scaling_matrix:    The diagonal scaling matrix.
+        @keyword scaling_matrix:    The diagonal, square scaling matrix.
         @type scaling_matrix:       numpy diagonal matrix
         """
 
@@ -888,7 +888,7 @@
 
             # Linear constraints.
             if constraints:
-                A, b = self.linear_constraints(index=index)
+                A, b = self.linear_constraints(num_params, 
param_set=param_set, spin=spin, scaling_matrix=scaling_matrix)
 
             # Print out.
             if verbosity >= 1:

Modified: 1.3/specific_fns/model_free/model_free.py
URL: 
http://svn.gna.org/viewcvs/relax/1.3/specific_fns/model_free/model_free.py?rev=5189&r1=5188&r2=5189&view=diff
==============================================================================
--- 1.3/specific_fns/model_free/model_free.py (original)
+++ 1.3/specific_fns/model_free/model_free.py Sun Mar 23 15:05:06 2008
@@ -1130,25 +1130,25 @@
             return True
 
 
-    def linear_constraints(self, index=None):
-        """Function for setting up the model-free linear constraint matrices 
A and b.
+    def linear_constraints(self, num_params, param_set=None, spin=None, 
spin_id=None, scaling_matrix=None):
+        """Set up the model-free linear constraint matrices A and b.
 
         Standard notation
-        ~~~~~~~~~~~~~~~~~
-
-        The order parameter constraints are:
+        =================
+
+        The order parameter constraints are::
 
             0 <= S2 <= 1
             0 <= S2f <= 1
             0 <= S2s <= 1
 
         By substituting the formula S2 = S2f.S2s into the above 
inequalities, the additional two
-        inequalities can be derived:
+        inequalities can be derived::
 
             S2 <= S2f
             S2 <= S2s
 
-        Correlation time constraints are:
+        Correlation time constraints are::
 
             te >= 0
             tf >= 0
@@ -1158,7 +1158,7 @@
 
             te, tf, ts <= 2 * tm
 
-        Additional constraints used include:
+        Additional constraints used include::
 
             Rex >= 0
             0.9e-10 <= r <= 2e-10
@@ -1166,8 +1166,9 @@
 
 
         Rearranged notation
-        ~~~~~~~~~~~~~~~~~~~
-        The above ineqality constraints can be rearranged into:
+        ===================
+
+        The above inequality constraints can be rearranged into::
 
             S2 >= 0
             -S2 >= -1
@@ -1189,10 +1190,10 @@
 
 
         Matrix notation
-        ~~~~~~~~~~~~~~~
+        ===============
 
         In the notation A.x >= b, where A is an matrix of coefficients, x is 
an array of parameter
-        values, and b is a vector of scalars, these inequality constraints 
are:
+        values, and b is a vector of scalars, these inequality constraints 
are::
 
             | 1  0  0  0  0  0  0  0  0 |                  |    0    |
             |                           |                  |         |
@@ -1228,7 +1229,22 @@
             |                           |                  |         |
             | 0  0  0  0  0  0  0  0 -1 |                  |    0    |
 
+
+        @param num_params:          The number of parameters in the model.
+        @type num_params:           int
+        @keyword param_set:         The parameter set, one of 'all', 'diff', 
'mf', or 'local_tm'.
+        @type param_set:            str
+        @keyword spin:              The spin data container.  If this 
argument is supplied, then the
+                                    spin_id argument will be ignored.
+        @type spin:                 SpinContainer instance
+        @keyword spin_id:           The spin identification string.
+        @type spin_id:              str
+        @keyword scaling_matrix:    The diagonal, square scaling matrix.
+        @type scaling_matrix:       numpy diagonal matrix
         """
+
+        # Alias the current data pipe.
+        cdp = relax_data_store[relax_data_store.current_pipe]
 
         # Upper limit flag for correlation times.
         upper_time_limit = 1
@@ -1236,42 +1252,41 @@
         # Initialisation (0..j..m).
         A = []
         b = []
-        n = len(self.param_vector)
-        zero_array = zeros(n, float64)
+        zero_array = zeros(num_params, float64)
         i = 0
         j = 0
 
         # Diffusion tensor parameters.
-        if self.param_set != 'mf' and 
relax_data_store.diff.has_key(self.run):
+        if param_set != 'mf' and diffusion_tensor.diff_data_exists():
             # Spherical diffusion.
-            if relax_data_store.diff[self.run].type == 'sphere':
+            if cdp.diff_tensor.type == 'sphere':
                 # 0 <= tm <= 200 ns.
                 A.append(zero_array * 0.0)
                 A.append(zero_array * 0.0)
                 A[j][i] = 1.0
                 A[j+1][i] = -1.0
-                b.append(0.0 / self.scaling_matrix[i, i])
-                b.append(-200.0 * 1e-9 / self.scaling_matrix[i, i])
+                b.append(0.0 / scaling_matrix[i, i])
+                b.append(-200.0 * 1e-9 / scaling_matrix[i, i])
                 i = i + 1
                 j = j + 2
 
             # Spheroidal diffusion.
-            elif relax_data_store.diff[self.run].type == 'spheroid':
+            elif cdp.diff_tensor.type == 'spheroid':
                 # 0 <= tm <= 200 ns.
                 A.append(zero_array * 0.0)
                 A.append(zero_array * 0.0)
                 A[j][i] = 1.0
                 A[j+1][i] = -1.0
-                b.append(0.0 / self.scaling_matrix[i, i])
-                b.append(-200.0 * 1e-9 / self.scaling_matrix[i, i])
+                b.append(0.0 / scaling_matrix[i, i])
+                b.append(-200.0 * 1e-9 / scaling_matrix[i, i])
                 i = i + 1
                 j = j + 2
 
                 # Prolate diffusion, Da >= 0.
-                if relax_data_store.diff[self.run].spheroid_type == 
'prolate':
+                if cdp.diff_tensor.spheroid_type == 'prolate':
                     A.append(zero_array * 0.0)
                     A[j][i] = 1.0
-                    b.append(0.0 / self.scaling_matrix[i, i])
+                    b.append(0.0 / scaling_matrix[i, i])
                     i = i + 1
                     j = j + 1
 
@@ -1279,10 +1294,10 @@
                     i = i + 2
 
                 # Oblate diffusion, Da <= 0.
-                elif relax_data_store.diff[self.run].spheroid_type == 
'oblate':
+                elif cdp.diff_tensor.spheroid_type == 'oblate':
                     A.append(zero_array * 0.0)
                     A[j][i] = -1.0
-                    b.append(0.0 / self.scaling_matrix[i, i])
+                    b.append(0.0 / scaling_matrix[i, i])
                     i = i + 1
                     j = j + 1
 
@@ -1294,21 +1309,21 @@
                     i = i + 3
 
             # Ellipsoidal diffusion.
-            elif relax_data_store.diff[self.run].type == 'ellipsoid':
+            elif cdp.diff_tensor.type == 'ellipsoid':
                 # 0 <= tm <= 200 ns.
                 A.append(zero_array * 0.0)
                 A.append(zero_array * 0.0)
                 A[j][i] = 1.0
                 A[j+1][i] = -1.0
-                b.append(0.0 / self.scaling_matrix[i, i])
-                b.append(-200.0 * 1e-9 / self.scaling_matrix[i, i])
+                b.append(0.0 / scaling_matrix[i, i])
+                b.append(-200.0 * 1e-9 / scaling_matrix[i, i])
                 i = i + 1
                 j = j + 2
 
                 # Da >= 0.
                 A.append(zero_array * 0.0)
                 A[j][i] = 1.0
-                b.append(0.0 / self.scaling_matrix[i, i])
+                b.append(0.0 / scaling_matrix[i, i])
                 i = i + 1
                 j = j + 1
 
@@ -1317,8 +1332,8 @@
                 A.append(zero_array * 0.0)
                 A[j][i] = 1.0
                 A[j+1][i] = -1.0
-                b.append(0.0 / self.scaling_matrix[i, i])
-                b.append(-1.0 / self.scaling_matrix[i, i])
+                b.append(0.0 / scaling_matrix[i, i])
+                b.append(-1.0 / scaling_matrix[i, i])
                 i = i + 1
                 j = j + 2
 
@@ -1326,55 +1341,57 @@
                 i = i + 3
 
         # Model-free parameters.
-        if self.param_set != 'diff':
-            # Loop over all residues.
-            for k in xrange(len(relax_data_store.res[self.run])):
-                # Skip unselected residues.
-                if not relax_data_store.res[self.run][k].select:
-                    continue
-
-                # Only add parameters for a single residue if index has a 
value.
-                if index != None and k != index:
+        if param_set != 'diff':
+            # The loop.
+            if spin:
+                loop = [spin]
+            else:
+                loop = spin_loop(spin_id)
+
+            # Loop over the spins.
+            for spin in loop:
+                # Skip unselected spins.
+                if not spin.select:
                     continue
 
                 # Save current value of i.
                 old_i = i
 
                 # Loop over the model-free parameters.
-                for l in 
xrange(len(relax_data_store.res[self.run][k].params)):
+                for l in xrange(len(spin.params)):
                     # Local tm.
-                    if relax_data_store.res[self.run][k].params[l] == 
'local_tm':
+                    if spin.params[l] == 'local_tm':
                         if upper_time_limit:
                             # 0 <= tm <= 200 ns.
                             A.append(zero_array * 0.0)
                             A.append(zero_array * 0.0)
                             A[j][i] = 1.0
                             A[j+1][i] = -1.0
-                            b.append(0.0 / self.scaling_matrix[i, i])
-                            b.append(-200.0 * 1e-9 / self.scaling_matrix[i, 
i])
+                            b.append(0.0 / scaling_matrix[i, i])
+                            b.append(-200.0 * 1e-9 / scaling_matrix[i, i])
                             j = j + 2
                         else:
                             # 0 <= tm.
                             A.append(zero_array * 0.0)
                             A[j][i] = 1.0
-                            b.append(0.0 / self.scaling_matrix[i, i])
+                            b.append(0.0 / scaling_matrix[i, i])
                             j = j + 1
 
                     # Order parameters {S2, S2f, S2s}.
-                    elif match('S2', 
relax_data_store.res[self.run][k].params[l]):
+                    elif match('S2', spin.params[l]):
                         # 0 <= S2 <= 1.
                         A.append(zero_array * 0.0)
                         A.append(zero_array * 0.0)
                         A[j][i] = 1.0
                         A[j+1][i] = -1.0
-                        b.append(0.0 / self.scaling_matrix[i, i])
-                        b.append(-1.0 / self.scaling_matrix[i, i])
+                        b.append(0.0 / scaling_matrix[i, i])
+                        b.append(-1.0 / scaling_matrix[i, i])
                         j = j + 2
 
                         # S2 <= S2f and S2 <= S2s.
-                        if relax_data_store.res[self.run][k].params[l] == 
'S2':
-                            for m in 
xrange(len(relax_data_store.res[self.run][k].params)):
-                                if 
relax_data_store.res[self.run][k].params[m] == 'S2f' or 
relax_data_store.res[self.run][k].params[m] == 'S2s':
+                        if spin.params[l] == 'S2':
+                            for m in xrange(len(spin.params)):
+                                if spin.params[m] == 'S2f' or spin.params[m] 
== 'S2s':
                                     A.append(zero_array * 0.0)
                                     A[j][i] = -1.0
                                     A[j][old_i+m] = 1.0
@@ -1382,17 +1399,17 @@
                                     j = j + 1
 
                     # Correlation times {te, tf, ts}.
-                    elif match('t[efs]', 
relax_data_store.res[self.run][k].params[l]):
+                    elif match('t[efs]', spin.params[l]):
                         # te, tf, ts >= 0.
                         A.append(zero_array * 0.0)
                         A[j][i] = 1.0
-                        b.append(0.0 / self.scaling_matrix[i, i])
+                        b.append(0.0 / scaling_matrix[i, i])
                         j = j + 1
 
                         # tf <= ts.
-                        if relax_data_store.res[self.run][k].params[l] == 
'ts':
-                            for m in 
xrange(len(relax_data_store.res[self.run][k].params)):
-                                if 
relax_data_store.res[self.run][k].params[m] == 'tf':
+                        if spin.params[l] == 'ts':
+                            for m in xrange(len(spin.params)):
+                                if spin.params[m] == 'tf':
                                     A.append(zero_array * 0.0)
                                     A[j][i] = 1.0
                                     A[j][old_i+m] = -1.0
@@ -1401,11 +1418,11 @@
 
                         # te, tf, ts <= 2 * tm.  (tf not needed because tf 
<= ts).
                         if upper_time_limit:
-                            if not 
relax_data_store.res[self.run][k].params[l] == 'tf':
-                                if self.param_set == 'mf':
+                            if not spin.params[l] == 'tf':
+                                if param_set == 'mf':
                                     A.append(zero_array * 0.0)
                                     A[j][i] = -1.0
-                                    b.append(-2.0 * 
relax_data_store.diff[self.run].tm / self.scaling_matrix[i, i])
+                                    b.append(-2.0 * cdp.diff_tensor.tm / 
scaling_matrix[i, i])
                                 else:
                                     A.append(zero_array * 0.0)
                                     A[j][0] = 2.0
@@ -1415,38 +1432,38 @@
                                 j = j + 1
 
                     # Rex.
-                    elif relax_data_store.res[self.run][k].params[l] == 
'Rex':
+                    elif spin.params[l] == 'Rex':
                         A.append(zero_array * 0.0)
                         A[j][i] = 1.0
-                        b.append(0.0 / self.scaling_matrix[i, i])
+                        b.append(0.0 / scaling_matrix[i, i])
                         j = j + 1
 
                     # Bond length.
-                    elif relax_data_store.res[self.run][k].params[l] == 'r':
+                    elif spin.params[l] == 'r':
                         # 0.9e-10 <= r <= 2e-10.
                         A.append(zero_array * 0.0)
                         A.append(zero_array * 0.0)
                         A[j][i] = 1.0
                         A[j+1][i] = -1.0
-                        b.append(0.9e-10 / self.scaling_matrix[i, i])
-                        b.append(-2e-10 / self.scaling_matrix[i, i])
+                        b.append(0.9e-10 / scaling_matrix[i, i])
+                        b.append(-2e-10 / scaling_matrix[i, i])
                         j = j + 2
 
                     # CSA.
-                    elif relax_data_store.res[self.run][k].params[l] == 
'CSA':
+                    elif spin.params[l] == 'CSA':
                         # -300e-6 <= CSA <= 0.
                         A.append(zero_array * 0.0)
                         A.append(zero_array * 0.0)
                         A[j][i] = 1.0
                         A[j+1][i] = -1.0
-                        b.append(-300e-6 / self.scaling_matrix[i, i])
-                        b.append(0.0 / self.scaling_matrix[i, i])
+                        b.append(-300e-6 / scaling_matrix[i, i])
+                        b.append(0.0 / scaling_matrix[i, i])
                         j = j + 2
 
                     # Increment i.
                     i = i + 1
 
-        # Convert to Numeric data structures.
+        # Convert to numpy data structures.
         A = array(A, float64)
         b = array(b, float64)
 




Related Messages


Powered by MHonArc, Updated Sun Mar 23 16:00:24 2008