diff --git a/examples/undocumented/libshogun/converter_sobi_bss.cpp b/examples/undocumented/libshogun/converter_sobi_bss.cpp index 14f663d3f4a..fc021817dc7 100644 --- a/examples/undocumented/libshogun/converter_sobi_bss.cpp +++ b/examples/undocumented/libshogun/converter_sobi_bss.cpp @@ -91,7 +91,9 @@ void test() std::cout << "Separation error: " << sep_error << std::endl; SG_UNREF(sobi); + SG_UNREF(mixed_signals); SG_UNREF(signals); + return; } diff --git a/src/shogun/mathematics/ajd/ApproxJointDiagonalizer.h b/src/shogun/mathematics/ajd/ApproxJointDiagonalizer.h index 689ccad61aa..3d84d71c3a9 100644 --- a/src/shogun/mathematics/ajd/ApproxJointDiagonalizer.h +++ b/src/shogun/mathematics/ajd/ApproxJointDiagonalizer.h @@ -54,8 +54,8 @@ class CApproxJointDiagonalizer : public CSGObject * @param itermax maximum number of iterations * @return V the matrix that best diagonalizes C */ - virtual SGMatrix compute(SGNDArray &C, - SGMatrix V0= SGMatrix(NULL,0,0), + virtual SGMatrix compute(SGNDArray C, + SGMatrix V0 = SGMatrix(NULL,0,0), double eps=CMath::MACHINE_EPSILON, int itermax=200) = 0; diff --git a/src/shogun/mathematics/ajd/FFDiag.cpp b/src/shogun/mathematics/ajd/FFDiag.cpp index 4b0a74fc221..365ede1d0a4 100644 --- a/src/shogun/mathematics/ajd/FFDiag.cpp +++ b/src/shogun/mathematics/ajd/FFDiag.cpp @@ -16,7 +16,7 @@ using namespace shogun; void getW(double *C, int *ptN, int *ptK, double *W); -SGMatrix CFFDiag::diagonalize(SGNDArray &C0, SGMatrix V0, +SGMatrix CFFDiag::diagonalize(SGNDArray C0, SGMatrix V0, double eps, int itermax) { int n = C0.dims[0]; diff --git a/src/shogun/mathematics/ajd/FFDiag.h b/src/shogun/mathematics/ajd/FFDiag.h index 9a172e4352c..a9678c22ac5 100644 --- a/src/shogun/mathematics/ajd/FFDiag.h +++ b/src/shogun/mathematics/ajd/FFDiag.h @@ -53,8 +53,8 @@ class CFFDiag : public CApproxJointDiagonalizer * @param itermax maximum number of iterations * @return V the matrix that best diagonalizes C */ - static SGMatrix diagonalize(SGNDArray &C, - SGMatrix V0= SGMatrix(NULL,0,0), + static SGMatrix diagonalize(SGNDArray C, + SGMatrix V0 = SGMatrix(NULL,0,0), double eps=CMath::MACHINE_EPSILON, int itermax=200); @@ -65,8 +65,8 @@ class CFFDiag : public CApproxJointDiagonalizer * @param itermax maximum number of iterations * @return V the matrix that best diagonalizes C */ - virtual SGMatrix compute(SGNDArray &C, - SGMatrix V0= SGMatrix(NULL,0,0), + virtual SGMatrix compute(SGNDArray C, + SGMatrix V0 = SGMatrix(NULL,0,0), double eps=CMath::MACHINE_EPSILON, int itermax=200) { diff --git a/src/shogun/mathematics/ajd/JADiag.cpp b/src/shogun/mathematics/ajd/JADiag.cpp index a6641ebdc84..256cb975ddd 100644 --- a/src/shogun/mathematics/ajd/JADiag.cpp +++ b/src/shogun/mathematics/ajd/JADiag.cpp @@ -17,7 +17,7 @@ using namespace shogun; void jadiagw(double c[], double w[], int *ptn, int *ptm, double a[], double *logdet, double *decr, double *result); -SGMatrix CJADiag::diagonalize(SGNDArray &C, SGMatrix V0, +SGMatrix CJADiag::diagonalize(SGNDArray C, SGMatrix V0, double eps, int itermax) { int d = C.dims[0]; diff --git a/src/shogun/mathematics/ajd/JADiag.h b/src/shogun/mathematics/ajd/JADiag.h index 5783ca9c02d..db36337cfda 100644 --- a/src/shogun/mathematics/ajd/JADiag.h +++ b/src/shogun/mathematics/ajd/JADiag.h @@ -53,8 +53,8 @@ class CJADiag : public CApproxJointDiagonalizer * @param itermax maximum number of iterations * @return V the matrix that best diagonalizes C */ - static SGMatrix diagonalize(SGNDArray &C, - SGMatrix V0= SGMatrix(NULL,0,0), + static SGMatrix diagonalize(SGNDArray C, + SGMatrix V0 = SGMatrix(NULL,0,0), double eps=CMath::MACHINE_EPSILON, int itermax=200); @@ -65,8 +65,8 @@ class CJADiag : public CApproxJointDiagonalizer * @param itermax maximum number of iterations * @return V the matrix that best diagonalizes C */ - virtual SGMatrix compute(SGNDArray &C, - SGMatrix V0= SGMatrix(NULL,0,0), + virtual SGMatrix compute(SGNDArray C, + SGMatrix V0 = SGMatrix(NULL,0,0), double eps=CMath::MACHINE_EPSILON, int itermax=200) { diff --git a/src/shogun/mathematics/ajd/JADiagOrth.cpp b/src/shogun/mathematics/ajd/JADiagOrth.cpp index aed3c8ca8a8..fc60180d82c 100644 --- a/src/shogun/mathematics/ajd/JADiagOrth.cpp +++ b/src/shogun/mathematics/ajd/JADiagOrth.cpp @@ -19,11 +19,11 @@ void left_rot_stack(double *A, int M, int N, int K, int p, int q, double c, doub void right_rot_stack(double *A, int M, int N, int K, int p, int q, double c, double s); void left_rot_simple(double *A, int m, int n, int p, int q, double c, double s); -SGMatrix CJADiagOrth::diagonalize(SGNDArray &C, SGMatrix V0, +SGMatrix CJADiagOrth::diagonalize(SGNDArray C, SGMatrix V0, double eps, int itermax) -{ +{ int m = C.dims[0]; - int L = C.dims[2]; + int L = C.dims[2]; SGMatrix V; if (V0.num_rows != 0) @@ -40,28 +40,28 @@ SGMatrix CJADiagOrth::diagonalize(SGNDArray &C, SGMatrix eps) - { - double c = cos(theta); - double s = sin(theta); - left_rot_stack (C.array, m, m, L, p, q, c, s); - right_rot_stack(C.array, m, m, L, p, q, c, s); - left_rot_simple(V.matrix, m, m, p, q, c, s); - rots++; - more = true; - } - } - } + more = false; + + for (int p = 0; p < m; p++) + { + for (int q = p+1; q < m; q++) + { + // computation of Givens angle + double theta = givens_stack(C.array, m, L, p, q); + + // Givens update + if (fabs(theta) > eps) + { + double c = cos(theta); + double s = sin(theta); + left_rot_stack (C.array, m, m, L, p, q, c, s); + right_rot_stack(C.array, m, m, L, p, q, c, s); + left_rot_simple(V.matrix, m, m, p, q, c, s); + rots++; + more = true; + } + } + } } return V; @@ -70,33 +70,33 @@ SGMatrix CJADiagOrth::diagonalize(SGNDArray &C, SGMatrix Ak(mxn) x R where R rotates the (p,q) columns R =[ c s ; -s c ] and Ak is the k-th M*N matrix in the stack */ void right_rot_stack(double *A, int M, int N, int K, int p, int q, double c, double s ) { - int k, ix, iy, cpt, kMN; - int pM = p*M; - int qM = q*M; - double nx, ny; - - for (k=0, kMN=0; k diagonalize(SGNDArray &C, - SGMatrix V0= SGMatrix(NULL,0,0), + static SGMatrix diagonalize(SGNDArray C, + SGMatrix V0 = SGMatrix(NULL,0,0), double eps=CMath::MACHINE_EPSILON, int itermax=200); @@ -65,8 +65,8 @@ class CJADiagOrth : public CApproxJointDiagonalizer * @param itermax maximum number of iterations * @return V the matrix that best diagonalizes C */ - virtual SGMatrix compute(SGNDArray &C, - SGMatrix V0= SGMatrix(NULL,0,0), + virtual SGMatrix compute(SGNDArray C, + SGMatrix V0 = SGMatrix(NULL,0,0), double eps=CMath::MACHINE_EPSILON, int itermax=200) { diff --git a/src/shogun/mathematics/ajd/UWedge.cpp b/src/shogun/mathematics/ajd/UWedge.cpp index e3702382166..629894fc846 100644 --- a/src/shogun/mathematics/ajd/UWedge.cpp +++ b/src/shogun/mathematics/ajd/UWedge.cpp @@ -14,7 +14,7 @@ typedef Matrix< float64_t, Dynamic, Dynamic, ColMajor > EMatrix; using namespace shogun; -SGMatrix CUWedge::diagonalize(SGNDArray &C, SGMatrix V0, +SGMatrix CUWedge::diagonalize(SGNDArray C, SGMatrix V0, double eps, int itermax) { int d = C.dims[0]; diff --git a/src/shogun/mathematics/ajd/UWedge.h b/src/shogun/mathematics/ajd/UWedge.h index a46edc44a04..c0443be8472 100644 --- a/src/shogun/mathematics/ajd/UWedge.h +++ b/src/shogun/mathematics/ajd/UWedge.h @@ -52,8 +52,8 @@ class CUWedge : public CApproxJointDiagonalizer * @param itermax maximum number of iterations * @return V the matrix that best diagonalizes C */ - static SGMatrix diagonalize(SGNDArray &C, - SGMatrix V0= SGMatrix(NULL,0,0), + static SGMatrix diagonalize(SGNDArray C, + SGMatrix V0 = SGMatrix(NULL,0,0), double eps=1e-12, int itermax=200); @@ -64,8 +64,8 @@ class CUWedge : public CApproxJointDiagonalizer * @param itermax maximum number of iterations * @return V the matrix that best diagonalizes C */ - virtual SGMatrix compute(SGNDArray &C, - SGMatrix V0= SGMatrix(NULL,0,0), + virtual SGMatrix compute(SGNDArray C, + SGMatrix V0 = SGMatrix(NULL,0,0), double eps=1e-12, int itermax=200) { diff --git a/tests/unit/converter/ica/Jade_unittest.cc b/tests/unit/converter/ica/Jade_unittest.cc index 76269a8e1b6..05009ce46df 100644 --- a/tests/unit/converter/ica/Jade_unittest.cc +++ b/tests/unit/converter/ica/Jade_unittest.cc @@ -61,6 +61,7 @@ TEST(CJade, blind_source_separation) EXPECT_EQ(isperm,true); SG_UNREF(jade); + SG_UNREF(mixed_signals); SG_UNREF(signals); } diff --git a/tests/unit/converter/ica/SOBI_unittest.cc b/tests/unit/converter/ica/SOBI_unittest.cc index 09c75f3b301..8e0939d3879 100644 --- a/tests/unit/converter/ica/SOBI_unittest.cc +++ b/tests/unit/converter/ica/SOBI_unittest.cc @@ -56,6 +56,7 @@ TEST(CSOBI, blind_source_separation) EXPECT_LE(sep_error, 1e-6); SG_UNREF(sobi); + SG_UNREF(mixed_signals); SG_UNREF(signals); }