mailRe: r23935 - /branches/frame_order_cleanup/test_suite/shared_data/frame_order/timings/


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

Header


Content

Posted by Troels Emtekær Linnet on June 13, 2014 - 14:19:
Seems like I am not the only one having fun with higher dimensions. ;-)

is timeit better than profiling?

How about the model_free analysis?

Is that in for loops?

best
Troels


2014-06-13 14:03 GMT+02:00 <edward@xxxxxxxxxxxxx>:

Author: bugman
Date: Fri Jun 13 14:03:44 2014
New Revision: 23935

URL: http://svn.gna.org/viewcvs/relax?rev=23935&view=rev
Log:
Added a script for timing different ways to calculate PCSs and RDCs for
multiple vectors.

This uses the timeit module rather than profile to demonstrate the speed
of 7 different ways to
calculate the RDCs or PCSs for an array of vectors using numpy.  In the
frame order analysis, this
is the bottleneck for the quasi-random numerical integration of the PCS.

The log file shows a potential 1 order of magnitude speed up between the
1st technique, which is
currently used in the frame order analysis, and the 7th and last
technique.  The first technique
loops over each vector, calculating the PCS.  The last expands the PCS/RDC
equation of the
projection of the vector into the alignment tensor, and calculates all
PCSs simultaneously.


Added:

branches/frame_order_cleanup/test_suite/shared_data/frame_order/timings/

branches/frame_order_cleanup/test_suite/shared_data/frame_order/timings/tensor_projections.log

branches/frame_order_cleanup/test_suite/shared_data/frame_order/timings/tensor_projections.py

Added:
branches/frame_order_cleanup/test_suite/shared_data/frame_order/timings/tensor_projections.log
URL:
http://svn.gna.org/viewcvs/relax/branches/frame_order_cleanup/test_suite/shared_data/frame_order/timings/tensor_projections.log?rev=23935&view=auto

==============================================================================
---
branches/frame_order_cleanup/test_suite/shared_data/frame_order/timings/tensor_projections.log
     (added)
+++
branches/frame_order_cleanup/test_suite/shared_data/frame_order/timings/tensor_projections.log
     Fri Jun 13 14:03:44 2014
@@ -0,0 +1,38 @@
+Original vectors:
+[[ 1.  2.  3.]
+ [ 2.  2.  2.]]
+Shape: (200, 3)
+
+Tensor:
+[[ 1.42219822 -7.07796212 -6.01619494]
+ [-7.07796212 -1.44543002  2.02008007]
+ [-6.01619494  2.02008007  0.02323179]]
+
+
+1st projection - element by element r[i].A.r[i].
+Proj: [-44.31849296 -88.59261589]
+Timing (s): 3.90826106071
+
+2nd projection - diag of double tensordot.
+Proj: [-44.31849296 -88.59261589]
+Timing (s): 2.68392705917
+
+3rd projection - diag of double tensordot, no transpose.
+Proj: [-44.31849296 -88.59261589]
+Timing (s): 2.58908486366
+
+4th projection - mixed tensordot() and per-vector dot().
+Proj: [-44.31849296 -88.59261589]
+Timing (s): 5.47785592079
+
+5th projection - expansion and sum.
+Proj: [-44.31849296 -88.59261589]
+Timing (s): 10.7986190319
+
+6th projection - expansion.
+Proj: [-44.31849296 -88.59261589]
+Timing (s): 0.54491686821
+
+7th projection - expansion with pre-calculation.
+Proj: [-44.31849296 -88.59261589]
+Timing (s): 0.395635128021

Added:
branches/frame_order_cleanup/test_suite/shared_data/frame_order/timings/tensor_projections.py
URL:
http://svn.gna.org/viewcvs/relax/branches/frame_order_cleanup/test_suite/shared_data/frame_order/timings/tensor_projections.py?rev=23935&view=auto

==============================================================================
---
branches/frame_order_cleanup/test_suite/shared_data/frame_order/timings/tensor_projections.py
      (added)
+++
branches/frame_order_cleanup/test_suite/shared_data/frame_order/timings/tensor_projections.py
      Fri Jun 13 14:03:44 2014
@@ -0,0 +1,127 @@
+# Python module imports.
+from numpy import *
+from numpy.linalg import norm
+from os import pardir, sep
+import sys
+from time import sleep
+from timeit import timeit
+
+# Modify the system path.
+sys.path.append(pardir+sep+pardir+sep+pardir+sep+pardir+sep)
+
+# relax module imports.
+from lib.geometry.rotations import euler_to_R_zyz
+
+
+def proj1(vect, A, N=1, verb=True):
+    d = zeros(len(vect), float64)
+    for i in range(N):
+        for j in xrange(len(vect)):
+            d[j] = dot(vect[j], dot(A, vect[j]))
+    if verb:
+        print("\n1st projection - element by element r[i].A.r[i].")
+        print("Proj: %s" % d[:2])
+
+
+def proj2(vect, A, N=1, verb=True):
+    for i in range(N):
+        d = diagonal(tensordot(vect, tensordot(A, transpose(vect),
axes=1), axes=1))
+    if verb:
+        print("\n2nd projection - diag of double tensordot.")
+        print("Proj: %s" % d[:2])
+
+
+def proj3(vect, A, N=1, verb=True):
+    for i in range(N):
+        d = diagonal(tensordot(tensordot(A, vect, axes=([0],[1])), vect,
axes=([0],[1])))
+    if verb:
+        print("\n3rd projection - diag of double tensordot, no
transpose.")
+        print("Proj: %s" % d[:2])
+
+
+def proj4(vect, A, N=1, verb=True):
+    d = zeros(len(vect), float64)
+    for i in range(N):
+        a = tensordot(A, vect, axes=([0],[1]))
+        for j in range(len(vect)):
+            d[j] = dot(vect[j], a[:,j])
+    if verb:
+        print("\n4th projection - mixed tensordot() and per-vector
dot().")
+        print("Proj: %s" % d[:2])
+
+
+def proj5(vect, A, N=1, verb=True):
+    d = zeros(len(vect), float64)
+    for i in range(N):
+        vect2 = vect**2
+        double_vect = 2.0 * vect
+        for j in xrange(len(vect)):
+            d[j] = vect2[j][0]*A[0, 0] + vect2[j][1]*A[1, 1] +
vect2[j][2]*(A[2, 2]) + double_vect[j][0]*vect[j][1]*A[0, 1] +
double_vect[j][0]*vect[j][2]*A[0, 2] + double_vect[j][1]*vect[j][2]*A[1, 2]
+    if verb:
+        print("\n5th projection - expansion and sum.")
+        print("Proj: %s" % d[:2])
+
+
+def proj6(vect, A, N=1, verb=True):
+    d = zeros(len(vect), float64)
+    for i in range(N):
+        d = vect[:,0]**2*A[0, 0] + vect[:,1]**2*A[1, 1] +
vect[:,2]**2*(A[2, 2]) + 2.0*vect[:,0]*vect[:,1]*A[0, 1] +
2.0*vect[:,0]*vect[:,2]*A[0, 2] + 2.0*vect[:,1]*vect[:,2]*A[1, 2]
+    if verb:
+        print("\n6th projection - expansion.")
+        print("Proj: %s" % d[:2])
+
+
+def proj7(vect, A, N=1, verb=True):
+    d = zeros(len(vect), float64)
+    for i in range(N):
+        vect2 = vect**2
+        double_vect = 2.0 * vect
+        d = vect2[:,0]*A[0, 0] + vect2[:,1]*A[1, 1] + vect2[:,2]*(A[2,
2]) + double_vect[:,0]*vect[:,1]*A[0, 1] + double_vect[:,0]*vect[:,2]*A[0,
2] + double_vect[:,1]*vect[:,2]*A[1, 2]
+    if verb:
+        print("\n7th projection - expansion with pre-calculation.")
+        print("Proj: %s" % d[:2])
+
+
+# Some 200 vectors.
+vect = array([[1, 2, 3], [2, 2, 2]], float64)
+vect = tile(vect, (100, 1))
+if __name__ == '__main__':
+    print("Original vectors:\n%s\nShape: %s" % (vect[:2], vect.shape))
+
+# Init the alignment tensor.
+A = zeros((3, 3), float64)
+A_5D = [1.42219822168827662867e-04, -1.44543001566521341940e-04,
-7.07796211648713973798e-04, -6.01619494082773244303e-04,
2.02008007072950861996e-04]
+A[0, 0] = A_5D[0]
+A[1, 1] = A_5D[1]
+A[2, 2] = -A_5D[0] -A_5D[1]
+A[0, 1] = A[1, 0] = A_5D[2]
+A[0, 2] = A[2, 0] = A_5D[3]
+A[1, 2] = A[2, 1] = A_5D[4]
+A *= 1e4
+if __name__ == '__main__':
+    print("\nTensor:\n%s\n" % A)
+
+# Projections.
+N = 100
+M = 100
+if __name__ == '__main__':
+    proj1(vect=vect, A=A, N=1, verb=True)
+    print("Timing (s): %s" % timeit("proj1(vect=vect, A=A, N=N,
verb=False)", setup="from tensor_projections import proj1, vect, A, N",
number=M))
+
+    proj2(vect=vect, A=A, N=1, verb=True)
+    print("Timing (s): %s" % timeit("proj2(vect=vect, A=A, N=N,
verb=False)", setup="from tensor_projections import proj2, vect, A, N",
number=M))
+
+    proj3(vect=vect, A=A, N=1, verb=True)
+    print("Timing (s): %s" % timeit("proj3(vect=vect, A=A, N=N,
verb=False)", setup="from tensor_projections import proj3, vect, A, N",
number=M))
+
+    proj4(vect=vect, A=A, N=1, verb=True)
+    print("Timing (s): %s" % timeit("proj4(vect=vect, A=A, N=N,
verb=False)", setup="from tensor_projections import proj4, vect, A, N",
number=M))
+
+    proj5(vect=vect, A=A, N=1, verb=True)
+    print("Timing (s): %s" % timeit("proj5(vect=vect, A=A, N=N,
verb=False)", setup="from tensor_projections import proj5, vect, A, N",
number=M))
+
+    proj6(vect=vect, A=A, N=1, verb=True)
+    print("Timing (s): %s" % timeit("proj6(vect=vect, A=A, N=N,
verb=False)", setup="from tensor_projections import proj6, vect, A, N",
number=M))
+
+    proj7(vect=vect, A=A, N=1, verb=True)
+    print("Timing (s): %s" % timeit("proj7(vect=vect, A=A, N=N,
verb=False)", setup="from tensor_projections import proj7, vect, A, N",
number=M))


_______________________________________________
relax (http://www.nmr-relax.com)

This is the relax-commits mailing list
relax-commits@xxxxxxx

To unsubscribe from this list, get a password
reminder, or change your subscription options,
visit the list information page at
https://mail.gna.org/listinfo/relax-commits



Related Messages


Powered by MHonArc, Updated Fri Jun 13 18:40:12 2014