about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPjotr Prins2015-03-18 11:05:39 +0300
committerPjotr Prins2015-03-18 11:05:39 +0300
commit178cdbbd1a52cfcab975ab27b36e148009cc3577 (patch)
tree8804154ca6fc281e7f6895b48480b268fd93a0e2
parente6e3b12eeb3fc57b9652468304c1fd14a0a816d0 (diff)
downloadgenenetwork2-178cdbbd1a52cfcab975ab27b36e148009cc3577.tar.gz
Introducing callbacks
-rw-r--r--wqflask/wqflask/my_pylmm/pyLMM/gn2.py17
-rw-r--r--wqflask/wqflask/my_pylmm/pyLMM/kinship.py17
-rw-r--r--wqflask/wqflask/my_pylmm/pyLMM/lmm.py5
-rw-r--r--wqflask/wqflask/my_pylmm/pyLMM/lmm2.py12
-rw-r--r--wqflask/wqflask/my_pylmm/pyLMM/standalone.py34
5 files changed, 71 insertions, 14 deletions
diff --git a/wqflask/wqflask/my_pylmm/pyLMM/gn2.py b/wqflask/wqflask/my_pylmm/pyLMM/gn2.py
index e0c6c8a7..4702c670 100644
--- a/wqflask/wqflask/my_pylmm/pyLMM/gn2.py
+++ b/wqflask/wqflask/my_pylmm/pyLMM/gn2.py
@@ -5,13 +5,25 @@
 
 from __future__ import absolute_import, print_function, division
 
+import numpy as np
 import sys
 import logging
 
 # logging.basicConfig(level=logging.DEBUG)
+# np.set_printoptions()
 
 def progress(location, count, total):
-    print("Progress: %s %i %i @%d%%" % (location,count,total,round(count*100.0/total)))
+    """
+    Progress update
+    """
+    logging.info("Progress: %s %d%%" % (location,round(count*100.0/total)))
+
+def mprint(msg,data):
+    """
+    Array/matrix print function
+    """
+    m = np.array(data)
+    print(msg,m.shape,"=\n",m)
 
 def callbacks():
     return dict(
@@ -22,7 +34,8 @@ def callbacks():
         warning = logging.warning,
         error = logging.error,
         critical = logging.critical,
-        progress = progress
+        progress = progress,
+        mprint = mprint
     )
     
 # ----- Minor test cases:
diff --git a/wqflask/wqflask/my_pylmm/pyLMM/kinship.py b/wqflask/wqflask/my_pylmm/pyLMM/kinship.py
index 0c43587e..43e7fe36 100644
--- a/wqflask/wqflask/my_pylmm/pyLMM/kinship.py
+++ b/wqflask/wqflask/my_pylmm/pyLMM/kinship.py
@@ -155,20 +155,21 @@ def kinship(G,computeSize=1000,numThreads=None,useBLAS=False,verbose=True):
    #    np.savetxt(outFile+".kve",Kve)
    return K      
 
-def kvakve(K, verbose=True):
+def kvakve(K, callbacks):
    """
    Obtain eigendecomposition for K and return Kva,Kve where Kva is cleaned
    of small values < 1e-6 (notably smaller than zero)
    """
-   if verbose: sys.stderr.write("Obtaining eigendecomposition for %dx%d matrix\n" % (K.shape[0],K.shape[1]) )
-   
+   info = callbacks()['info']
+   mprint = callbacks()['mprint']
+
+   info("Obtaining eigendecomposition for %dx%d matrix" % (K.shape[0],K.shape[1]) )
    Kva,Kve = linalg.eigh(K)
-   if verbose:
-      print("Kva is: ", Kva.shape, Kva)
-      print("Kve is: ", Kve.shape, Kve)
+   mprint("Kva",Kva)
+   mprint("Kve",Kve)
 
-   if sum(Kva < 1e-6):
-      if verbose: sys.stderr.write("Cleaning %d eigen values (Kva<0)\n" % (sum(Kva < 0)))
+   if sum(Kva < 0):
+      info("Cleaning %d eigen values (Kva<0)" % (sum(Kva < 0)))
       Kva[Kva < 1e-6] = 1e-6
    return Kva,Kve
 
diff --git a/wqflask/wqflask/my_pylmm/pyLMM/lmm.py b/wqflask/wqflask/my_pylmm/pyLMM/lmm.py
index 8a24d98b..5ad644e2 100644
--- a/wqflask/wqflask/my_pylmm/pyLMM/lmm.py
+++ b/wqflask/wqflask/my_pylmm/pyLMM/lmm.py
@@ -54,11 +54,14 @@ import genotype
 import phenotype
 import gwas
 
+# ---- A trick to decide on the environment:
 try:
     from wqflask.my_pylmm.pyLMM import chunks
+    from gn2 import callbacks
 except ImportError:
     print("WARNING: Standalone version missing the Genenetwork2 environment\n")
     has_gn2=False
+    from standalone import callbacks
     pass
 
 #np.seterr('raise')
@@ -594,7 +597,7 @@ class LMM:
           # if self.verbose: sys.stderr.write("Obtaining eigendecomposition for %dx%d matrix\n" % (K.shape[0],K.shape[1]) )
           begin = time.time()
           # Kva,Kve = linalg.eigh(K)
-          Kva,Kve = kvakve(K)
+          Kva,Kve = kvakve(K,callbacks)
           end = time.time()
           if self.verbose: sys.stderr.write("Total time: %0.3f\n" % (end - begin))
           print("sum(Kva),sum(Kve)=",sum(Kva),sum(Kve))
diff --git a/wqflask/wqflask/my_pylmm/pyLMM/lmm2.py b/wqflask/wqflask/my_pylmm/pyLMM/lmm2.py
index d4b3ac82..6aefb9d3 100644
--- a/wqflask/wqflask/my_pylmm/pyLMM/lmm2.py
+++ b/wqflask/wqflask/my_pylmm/pyLMM/lmm2.py
@@ -24,6 +24,16 @@ from scipy import optimize
 from optmatrix import matrixMult
 import kinship
 
+# A trick to decide on the environment:
+try:
+    from wqflask.my_pylmm.pyLMM import chunks
+    from gn2 import callbacks
+except ImportError:
+    print("WARNING: Standalone version missing the Genenetwork2 environment\n")
+    has_gn2=False
+    from standalone import callbacks
+    pass
+
 def calculateKinship(W,center=False):
       """
 	 W is an n x m matrix encoding SNP minor alleles.
@@ -184,7 +194,7 @@ class LMM2:
           # if self.verbose: sys.stderr.write("Obtaining eigendecomposition for %dx%d matrix\n" % (K.shape[0],K.shape[1]) )
           begin = time.time()
           # Kva,Kve = linalg.eigh(K)
-          Kva,Kve = kinship.kvakve(K)
+          Kva,Kve = kinship.kvakve(K,callbacks)
           end = time.time()
           if self.verbose: sys.stderr.write("Total time: %0.3f\n" % (end - begin))
           print("sum(Kva),sum(Kve)=",sum(Kva),sum(Kve))
diff --git a/wqflask/wqflask/my_pylmm/pyLMM/standalone.py b/wqflask/wqflask/my_pylmm/pyLMM/standalone.py
index a806729e..bbee3cd7 100644
--- a/wqflask/wqflask/my_pylmm/pyLMM/standalone.py
+++ b/wqflask/wqflask/my_pylmm/pyLMM/standalone.py
@@ -8,13 +8,29 @@
 
 from __future__ import absolute_import, print_function, division
 
+import numpy as np
 import sys
 import logging
 
 logging.basicConfig(level=logging.DEBUG)
+np.set_printoptions(precision=3,suppress=True)
 
 def progress(location, count, total):
-    logging.info("Progress: %s %i %i @%d%%" % (location,count,total,round(count*100.0/total)))
+    logging.info("Progress: %s %d%%" % (location,round(count*100.0/total)))
+
+def mprint(msg,data):
+    """
+    Array/matrix print function
+    """
+    m = np.array(data)
+    if m.ndim == 1:
+        print(msg,m.shape,"=\n",m[0:3]," ... ",m[-3:])
+    if m.ndim == 2:
+        print(msg,m.shape,"=\n[",
+              m[0][0:3]," ... ",m[0][-3:],"\n ",
+              m[1][0:3]," ... ",m[1][-3:],"\n  ...\n ",
+              m[-2][0:3]," ... ",m[-2][-3:],"\n ",
+              m[-1][0:3]," ... ",m[-1][-3:],"]")
 
 def callbacks():
     return dict(
@@ -25,7 +41,8 @@ def callbacks():
         warning = logging.warning,
         error = logging.error,
         critical = logging.critical,
-        progress = progress
+        progress = progress,
+        mprint = mprint
     )
     
 # ----- Minor test cases:
@@ -39,3 +56,16 @@ if __name__ == '__main__':
     wrln("Hello %i" % 34)
     progress = callbacks()['progress']
     progress("I am half way",50,100)
+    list = [0.5,0.6096595 , -0.31559815, -0.52793285, 1.16573418e-15,
+            0.5,0.6096595 , -0.31559815, -0.52793285, 1.16573418e-15,
+            0.5,0.6096595 , -0.31559815, -0.52793285, 1.16573418e-15,
+            0.5,0.6096595 , -0.31559815, -0.52793285, 1.16573418e-15,
+            0.5,0.6096595 , -0.31559815, -0.52793285, 1.16573418e-15]
+    mprint("list",list)
+    matrix = [[1,0.5,0.6096595 , -0.31559815, -0.52793285, 1.16573418e-15],
+            [2,0.5,0.6096595 , -0.31559815, -0.52793285, 1.16573418e-15],
+            [3,0.5,0.6096595 , -0.31559815, -0.52793285, 1.16573418e-15],
+            [4,0.5,0.6096595 , -0.31559815, -0.52793285, 1.16573418e-15],
+            [5,0.5,0.6096595 , -0.31559815, -0.52793285, 1.16573418e-15],
+            [6,0.5,0.6096595 , -0.31559815, -0.52793285, 1.16573418e-15]]
+    mprint("matrix",matrix)