Timer unit: 1e-06 s

Total time: 39.8024 s
File: /home/krm58/Desktop/OneDrive/Documents/Duke/Statistics/Biclustering-SSVD/Biclustering-SSVD/ssvd_fast.py
Function: ssvd at line 63

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
    63                                           def ssvd(X,param=None):
    64         1            8      8.0      0.0      n, d = X.shape
    65         1            4      4.0      0.0      threu = 1
    66         1            3      3.0      0.0      threv = 1
    67         1            3      3.0      0.0      gamu = 0
    68         1            4      4.0      0.0      gamv = 0
    69         1      9413134 9413134.0     23.6      t1, t2, t3 = np.linalg.svd(X)
    70         1            8      8.0      0.0      t3 = t3.T
    71         1            6      6.0      0.0      u0 = t1[:,0]
    72         1            3      3.0      0.0      v0 = t3[:,0]
    73         1            2      2.0      0.0      merr = 10**-4
    74         1            3      3.0      0.0      niter = 100
    75         1            2      2.0      0.0      ud = 1
    76         1            2      2.0      0.0      vd = 1
    77         1            2      2.0      0.0      iters = 0
    78         1         1666   1666.0      0.0      SST = np.sum(X**2)
    79         1            3      3.0      0.0      a = 3.7
    80         7           17      2.4      0.0      while (ud > merr or vd > merr):
    81         6           11      1.8      0.0          iters = iters + 1
    82         6         2107    351.2      0.0          z = np.matmul(X.T,u0)
    83         6           39      6.5      0.0          winv = np.abs(z)**gamv
    84         6          109     18.2      0.0          sigsq = (SST - np.sum(z**2))/(n*d-d)
    85         6          213     35.5      0.0          tv = np.sort(np.append(np.abs(z**winv),0))
    86         6          103     17.2      0.0          rv = np.sum(tv>0)
    87         6          105     17.5      0.0          Bv = np.ones((d+1))*np.Inf
    88         6           38      6.3      0.0          tmpI = np.arange(d-1,-1,-1)
    89         6       113983  18997.2      0.3          Bv = updateV(Bv,tmpI,n,d,rv,tv,winv,z,u0,X,sigsq)
    90         6          134     22.3      0.0          Iv = np.argmin(Bv) + 1
    91         6          253     42.2      0.0          temp = np.sort(np.append(np.abs(np.multiply(z, winv)),0))
    92         6           27      4.5      0.0          lv = temp[d-Iv]
    93         6           80     13.3      0.0          paralambda = np.multiply(lv, winv[winv!=0])        
    94         6          101     16.8      0.0          tmp= np.multiply(np.sign(z[winv!=0]),gt(np.abs(z[winv!=0]),paralambda))  
    95         6           45      7.5      0.0          v1 = np.multiply(tmp, np.abs(z[winv!=0])-paralambda)   
    96         6          165     27.5      0.0          v1 = v1/np.sqrt(np.sum(v1**2)) #v_new
    97         6          744    124.0      0.0          z = np.matmul(X, v1)
    98         6          158     26.3      0.0          winu = np.abs(z)**gamu
    99         6          189     31.5      0.0          sigsq = (SST - np.sum(z**2))/(n*d-n)
   100         6         4490    748.3      0.0          tu = np.sort(np.append(np.abs(np.multiply(z, winu)),0))
   101         6          307     51.2      0.0          ru = np.sum((tu>0).astype('int'))
   102         6          194     32.3      0.0          Bu = np.ones((n+1))*np.Inf
   103         6          139     23.2      0.0          tmpI = np.arange(n-1,-1,-1)
   104         6     30255898 5042649.7     76.0          Bu = updateU(Bu,tmpI,n,d,ru,tu,winu,z,X,v1,sigsq)
   105         6          488     81.3      0.0          Iu = np.argmin(Bu)+1
   106         6         4500    750.0      0.0          temp = np.sort(np.append(np.abs(np.multiply(z, winu)),0))
   107         6           30      5.0      0.0          lu = temp[n-Iu]
   108         6          343     57.2      0.0          paralambda = lu/winu[winu!=0]        
   109         6          939    156.5      0.0          tmp= np.multiply(np.sign(z[winu!=0]),gt(np.abs(z[winu!=0]),paralambda))  
   110         6          324     54.0      0.0          u1 = np.multiply(tmp, np.abs(z[winu!=0])-paralambda)    
   111         6          407     67.8      0.0          u1 = u1/np.sqrt(np.sum(u1**2)) #u_new
   112         6          800    133.3      0.0          ud = np.sqrt(np.sum((u0-u1)**2))
   113         6           73     12.2      0.0          vd = np.sqrt(np.sum((v0-v1)**2)) 
   114         6           12      2.0      0.0          if iters > niter:
   115                                                       print('Fail to converge! Increase the niter!')
   116                                                       break
   117         6           11      1.8      0.0          u0 = u1
   118         6           12      2.0      0.0          v0 = v1
   119         1            1      1.0      0.0      u = u1
   120         1            2      2.0      0.0      v = v1
   121         1            1      1.0      0.0      return u,v,iters