NnmfPack  2.1
Functions
bdiv_mic.h File Reference

Header file for using the betadivergence functions with MIC/MIC. More...

Go to the source code of this file.

Functions

int dbdiv_mic (const int m, const int n, const int k, const double *A, double *W, double *H, const double beta, const int uType, const int nIter)
 dbdiv_mic is a wrapper that calls the adequate function to performs NNMF using betadivergence using double precision with MIC More...
 
int sbdiv_mic (const int m, const int n, const int k, const float *A, float *W, float *H, const float beta, const int uType, const int nIter)
 
int dbdivg_mic (const int m, const int n, const int k, const double *A, double *W, double *H, const double beta, const int uType, const int nIter)
 dbdivg_mic performs the NNMF using beta-divergence when beta is != 1 and !=2, using double precision More...
 
int sbdivg_mic (const int m, const int n, const int k, const float *A, float *W, float *H, const float beta, const int uType, const int nIter)
 sbdivg_mic performs NNMF using betadivergence for general case (beta <> 1 and 2) using simple precision More...
 
int dmlsa_mic (const int m, const int n, const int k, const double *A, double *W, double *H, const int uType, const int nIter)
 dmlsa_mic performs NNMF using betadivergence when beta=2 using double precision More...
 
int smlsa_mic (const int m, const int n, const int k, const float *A, float *W, float *H, const int uType, const int nIter)
 smlsa_mic performs NNMF using betadivergence when beta=2 using simple precision More...
 
int dbdivone_mic (const int m, const int n, const int k, const double *A, double *W, double *H, const int uType, const int nIter)
 dbdivone_mic performs NNMF using betadivergence when beta=1 using double precision More...
 
int sbdivone_mic (const int m, const int n, const int k, const float *A, float *W, float *H, const int uType, const int nIter)
 sbdivone_mic performs NNMF using betadivergence when beta=1 using simple precision More...
 

Detailed Description

Header file for using the betadivergence functions with MIC/MIC.

Author
Information Retrieval and Parallel Computing Group (IRPCG)
University of Oviedo, Spain
Interdisciplinary Computation and Communication Group (INCO2)
Universitat Politecnica de Valencia, Spain.
Contact: nnmfp.nosp@m.ack@.nosp@m.gmail.nosp@m..com
Date
04/11/14

Definition in file bdiv_mic.h.

Function Documentation

◆ dbdiv_mic()

int dbdiv_mic ( const int  m,
const int  n,
const int  k,
const double *  A,
double *  W,
double *  H,
const double  beta,
const int  uType,
const int  nIter 
)

dbdiv_mic is a wrapper that calls the adequate function to performs NNMF using betadivergence using double precision with MIC

Parameters
m(input) Number of rows of matrix A and matrix W
n(input) Number of columns of matrix A and matrix H
k(input) Number of columns of matrix W and rows of H
A(input) Double precision input matrix of (m * n) number of elements stored using 1D column-major
W(inout) Double precision input/output matrix of (m * k) number of elements stored using 1D column-major
H(inout) Double precision input/output matrix of (k * n) number of elements stored using 1D column-major
beta(input) Double precision value. The parameter beta of betadivergence method
uType(input) It can be UpdateAll (W and H are updated), UpdateW (only H is updated) or UpdateH (only W is updated)
nIter(input) Number of iterations
Returns
: 0 if all is OK, -1 otherwise

Definition at line 274 of file bdiv_mic.c.

◆ dbdivg_mic()

int dbdivg_mic ( const int  m,
const int  n,
const int  k,
const double *  A,
double *  W,
double *  H,
const double  expo,
const int  uType,
const int  nIter 
)

dbdivg_mic performs the NNMF using beta-divergence when beta is != 1 and !=2, using double precision

The algorithm is
  repit nIter times
    STEP 1
      L=W*H
      L1=L(.^)(beta-2)
      L2=L1(.*)A
      L1=L1(.*)L
      B=W'L2
      C=W'*L1
      H=H(.
)B(./)C

    STEP 2
      L=W*H
      L1=L(.^)(beta-2)
      L2=L1(.*)A
      L1=L1(.*)L
      D=L2*H'
      E=L1*H'
      W=W(.*)D(./)E
  end repit
End algorithm

   In real live L1 and L2 are (m*n) matrices used in STEP 1 and 2. For performance
   reasons only one 1D colum-mayor buffer, named R in next code, of size 2*m*n is used
   In STEP 1, first part of R (m*n positions) is L2 and the second part is L1.
   In STEP 2, fisrt column of R (2*m positions) is composed by the first column of L2
   following first column of L1. Second column of R (2*m positions) is composed by the
   sencond column of L2 following second column of L1. 3rd column of R ... and so on

   In real live B and C are (k*n) matrices used in STEP 1, and D and E are (m*k)
   matrices used in STEP 2. B/C and D/E are independent. However we do not have L1
   and L2, we have R, and we can do B=W'*L2 and C=W'*L1 (or D=L2*H' and E=L1*H') at
   the same time. For this reason only one matrix is declared to save space. This is
   matrix M with size 2*max(m,n)*k
Parameters
m(input) Number of rows of matrix A and matrix W
n(input) Number of columns of matrix A and matrix H
k(input) Number of columns of matrix W and rows of H
A(input) Double precision input matrix of (m * n) number of elements stored using 1D column-major
W(inout) Double precision input/output matrix of (m * k) number of elements stored using 1D column-major
H(inout) Double precision input/output matrix of (k * n) number of elements stored using 1D column-major
expo(input) Double precision value. The exponent beta of betadivergence method
uType(input) It can be UpdateAll (W and H are updated), UpdateW (only H is updated) or UpdateH (only W is updated)
nIter(input) Number of iterations

It returns 0 if all is OK.

Definition at line 88 of file bdiv_mic.c.

◆ dbdivone_mic()

int dbdivone_mic ( const int  m,
const int  n,
const int  k,
const double *  A,
double *  W,
double *  H,
const int  uType,
const int  nIter 
)

dbdivone_mic performs NNMF using betadivergence when beta=1 using double precision

The algorithm is
  repit nIter times
    STEP 1
      y(i)=sum(W(j,i) for all j in range) for all i in range
      L=W*H
      L=A(./)L
      B=W'L
      B(i,j)=B(i,j) / y(i) for all B elements
      H=H(.
)B

    STEP 2
      y(i)=sum(H(i,j) for all j in range) for all i in range
      L=W*H
      L=A(./)L
      D=L*H'
      B(i,j)=B(i,j) / y(j) for all B elements
      W=W(.*)D
    end repit
End algorithm

In real live B is a (k*n) matrix used in STEP 1, and D is a (m*k) matrix used in STEP 2. B and D are independent. For this reason only 1 matrix of size max(m,n)*k is declared/used

Parameters
m(input) Number of rows of matrix A and matrix W
n(input) Number of columns of matrix A and matrix H
k(input) Number of columns of matrix W and rows of H
A(input) Double precision input matrix of (m * n) number of elements stored using 1D column-major
W(inout) Double precision input/output matrix of (m * k) number of elements stored using 1D column-major
H(inout) Double precision input/output matrix of (k * n) number of elements stored using 1D column-major
uType(input) It can be UpdateAll (W and H are updated), UpdateW (only H is updated) or UpdateH (only W is updated)
nIter(input) Number of iterations
Returns
: 0 if all is OK, -1 otherwise

Definition at line 195 of file bdiv_mic.c.

◆ dmlsa_mic()

int dmlsa_mic ( const int  m,
const int  n,
const int  k,
const double *  A,
double *  W,
double *  H,
const int  uType,
const int  nIter 
)

dmlsa_mic performs NNMF using betadivergence when beta=2 using double precision

The algorithm is
  repit nIter times
    STEP 1
      L=W*H
      B=W'A
      C=W'*L
      H=H(.
)B(./)C

    STEP 2
      L=W*H
      D=A*H'
      E=L*H'
      W=W(.*)D(./)E
    end repit
End algorithm

To save some FLOPs and RAM a modified Lee and Seung version is used, so we have Step 1: L=W'*W, C=L*H and then B=W'*A; Step 2: L=H*H', E=W*L and D=A*H'. W'*W (H*H') and L*H (W*L) can do in parallel with W'*A (A*H'). Because dgemm works fine we don't use threads to do in parallel.

In real live B and C are (k*n) matrices used in STEP 1, and D and E are (m*k) matrices used in STEP 2. B/C and D/E are independent. For this reason only 2 matrices are declared to save space. They are matrices B and C with size max(m,n)*k

Parameters
m(input) Number of rows of matrix A and matrix W
n(input) Number of columns of matrix A and matrix H
k(input) Number of columns of matrix W and rows of H
A(input) Double precision input matrix of (m * n) number of elements stored using 1D column-major
W(inout) Double precision input/output matrix of (m * k) number of elements stored using 1D column-major
H(inout) Double precision input/output matrix of (k * n) number of elements stored using 1D column-major
uType(input) It can be UpdateAll (W and H are updated), UpdateW (only H is updated) or UpdateH (only W is updated)
nIter(input) Number of iterations
Returns
: 0 if all is OK, -1 otherwise

Definition at line 72 of file mlsa_mic.c.

◆ sbdiv_mic()

int sbdiv_mic ( const int  m,
const int  n,
const int  k,
const float *  A,
float *  W,
float *  H,
const float  beta,
const int  uType,
const int  nIter 
)

Definition at line 304 of file bdiv_mic.c.

◆ sbdivg_mic()

int sbdivg_mic ( const int  m,
const int  n,
const int  k,
const float *  A,
float *  W,
float *  H,
const float  expo,
const int  uType,
const int  nIter 
)

sbdivg_mic performs NNMF using betadivergence for general case (beta <> 1 and 2) using simple precision

Parameters
m(input) Number of rows of matrix A and matrix W
n(input) Number of columns of matrix A and matrix H
k(input) Number of columns of matrix W and rows of H
A(input) Simple precision input matrix of (m * n) number of elements stored using 1D column-major
W(inout) Simple precision input/output matrix of (m * k) number of elements stored using 1D column-major
H(inout) Simple precision input/output matrix of (k * n) number of elements stored using 1D column-major
expo(input) Double precision value. The exponent beta of betadivergence method
uType(input) It can be UpdateAll (W and H are updated), UpdateW (only H is updated) or UpdateH (only W is updated)
nIter(input) Number of iterations
Returns
: 0 if all is OK, -1 otherwise

Definition at line 128 of file bdiv_mic.c.

◆ sbdivone_mic()

int sbdivone_mic ( const int  m,
const int  n,
const int  k,
const float *  A,
float *  W,
float *  H,
const int  uType,
const int  nIter 
)

sbdivone_mic performs NNMF using betadivergence when beta=1 using simple precision

Parameters
m(input) Number of rows of matrix A and matrix W
n(input) Number of columns of matrix A and matrix H
k(input) Number of columns of matrix W and rows of H
A(input) Simple precision input matrix of (m * n) number of elements stored using 1D column-major
W(inout) Simple precision input/output matrix of (m * k) number of elements stored using 1D column-major
H(inout) Simple precision input/output matrix of (k * n) number of elements stored using 1D column-major
uType(input) It can be UpdateAll (W and H are updated), UpdateW (only H is updated) or UpdateH (only W is updated)
nIter(input) Number of iterations
Returns
: 0 if all is OK, -1 otherwise

Definition at line 234 of file bdiv_mic.c.

◆ smlsa_mic()

int smlsa_mic ( const int  m,
const int  n,
const int  k,
const float *  A,
float *  W,
float *  H,
const int  uType,
const int  nIter 
)

smlsa_mic performs NNMF using betadivergence when beta=2 using simple precision

Parameters
m(input) Number of rows of matrix A and matrix W
n(input) Number of columns of matrix A and matrix H
k(input) Number of columns of matrix W and rows of H
A(input) Simple precision input matrix of (m * n) number of elements stored using 1D column-major
W(inout) Simple precision input/output matrix of (m * k) number of elements stored using 1D column-major
H(inout) Simple precision input/output matrix of (k * n) number of elements stored using 1D column-major
uType(input) It can be UpdateAll (W and H are updated), UpdateW (only H is updated) or UpdateH (only W is updated)
nIter(input) Number of iterations
Returns
: 0 if all is OK, -1 otherwise

Definition at line 111 of file mlsa_mic.c.