[shark] 69/79: various bugfixes

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Thu Nov 26 15:41:26 UTC 2015


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to branch master
in repository shark.

commit cd733f55ded98d1d9a0058d02ec2fa5851f3418f
Author: Oswin <oswin.krause at di.ku.dk>
Date:   Thu Oct 29 10:09:50 2015 +0100

    various bugfixes
---
 include/shark/LinAlg/BLAS/assignment.hpp        | 12 ++---
 include/shark/LinAlg/BLAS/detail/iterator.hpp   |  2 +-
 include/shark/LinAlg/BLAS/matrix_expression.hpp | 60 ++++++++++++++++++++++---
 include/shark/LinAlg/Impl/pivotingRQ.inl        |  2 +-
 include/shark/LinAlg/Impl/solveSystem.inl       |  8 +---
 src/Algorithms/PCA.cpp                          |  4 +-
 6 files changed, 65 insertions(+), 23 deletions(-)

diff --git a/include/shark/LinAlg/BLAS/assignment.hpp b/include/shark/LinAlg/BLAS/assignment.hpp
index 79175ab..76ad075 100644
--- a/include/shark/LinAlg/BLAS/assignment.hpp
+++ b/include/shark/LinAlg/BLAS/assignment.hpp
@@ -603,13 +603,13 @@ namespace detail{
 /// the expression is assigned, which is then returned, otherwise the expression itself
 /// is returned
 template<class E>
-typename boost::mpl::if_<
+typename boost::mpl::eval_if<
 	boost::is_same<
 		typename E::evaluation_category,
 		blockwise_tag
 	>,
-	typename vector_temporary<E>::type,
-	E const&
+	vector_temporary<E>,
+	boost::mpl::identity<E const&>
 >::type
 eval_block(blas::vector_expression<E> const& e){
 	return detail::evaluate_block(e,typename E::evaluation_category());
@@ -620,13 +620,13 @@ eval_block(blas::vector_expression<E> const& e){
 /// the expression is assigned, which is then returned, otherwise the expression itself
 /// is returned
 template<class E>
-typename boost::mpl::if_<
+typename boost::mpl::eval_if<
 	boost::is_same<
 		typename E::evaluation_category,
 		blockwise_tag
 	>,
-	typename matrix_temporary<E>::type,
-	E const&
+	matrix_temporary<E>,
+	boost::mpl::identity<E const&>
 >::type
 eval_block(blas::matrix_expression<E> const& e){
 	return detail::evaluate_block(e,typename E::evaluation_category());
diff --git a/include/shark/LinAlg/BLAS/detail/iterator.hpp b/include/shark/LinAlg/BLAS/detail/iterator.hpp
index c7190c5..002c242 100644
--- a/include/shark/LinAlg/BLAS/detail/iterator.hpp
+++ b/include/shark/LinAlg/BLAS/detail/iterator.hpp
@@ -933,7 +933,7 @@ private:
 			}else
 				++ m_iterator1;
 		}
-		size_type index1 = index1 = m_iterator1.index();
+		size_type index1 = m_iterator1.index();
 		size_type index2 = std::numeric_limits<size_type>::max();
 		if(m_iterator2 != m_end2)
 			index2 = m_iterator2.index();
diff --git a/include/shark/LinAlg/BLAS/matrix_expression.hpp b/include/shark/LinAlg/BLAS/matrix_expression.hpp
index 5e98e1c..00756ad 100644
--- a/include/shark/LinAlg/BLAS/matrix_expression.hpp
+++ b/include/shark/LinAlg/BLAS/matrix_expression.hpp
@@ -931,12 +931,24 @@ void sum_rows_impl(MatA const& matA, VecB& vecB, row_major){
 	}
 }
 
+template<class MatA,class VecB>
+void sum_rows_impl(MatA const& matA, VecB& vecB, unknown_orientation){
+	sum_rows_impl(matA,vecB,row_major());
+}
+
 //dispatcher for triangular matrix
 template<class MatA,class VecB,class Orientation,class Triangular>
 void sum_rows_impl(MatA const& matA, VecB& vecB, packed<Orientation,Triangular>){
 	sum_rows_impl(matA,vecB,Orientation());
 }
 
+
+//dispatcher 
+template<class MatA,class VecB>
+void sum_rows_impl(MatA const& matA, VecB& vecB){
+	sum_rows_impl(matA,vecB,typename MatA::orientation());
+}
+
 template<class MatA>
 typename MatA::value_type sum_impl(MatA const& matA, column_major){
 	typename MatA::value_type totalSum = 0;
@@ -955,17 +967,29 @@ typename MatA::value_type sum_impl(MatA const& matA, row_major){
 	return totalSum;
 }
 
+template<class MatA>
+typename MatA::value_type sum_impl(MatA const& matA, unknown_orientation){
+	return sum_impl(matA,row_major());
+}
+
+
 //dispatcher for triangular matrix
 template<class MatA,class Orientation,class Triangular>
 typename MatA::value_type sum_impl(MatA const& matA, packed<Orientation,Triangular>){
 	return sum_impl(matA,Orientation());
 }
 
+//dispatcher
+template<class MatA>
+typename MatA::value_type sum_impl(MatA const& matA){
+	return sum_impl(matA,typename MatA::orientation());
+}
+
 template<class MatA>
 typename MatA::value_type max_impl(MatA const& matA, column_major){
 	typename MatA::value_type maximum = 0;
 	for(std::size_t j = 0; j != matA.size2(); ++j){
-		maximum= std::max(maximum, max(column(matA,j)));
+		maximum = std::max(maximum, max(column(matA,j)));
 	}
 	return maximum;
 }
@@ -979,12 +1003,23 @@ typename MatA::value_type max_impl(MatA const& matA, row_major){
 	return maximum;
 }
 
+template<class MatA>
+typename MatA::value_type max_impl(MatA const& matA, unknown_orientation){
+	return max_impl(matA,row_major());
+}
+
 //dispatcher for triangular matrix
 template<class MatA,class Orientation,class Triangular>
 typename MatA::value_type max_impl(MatA const& matA, packed<Orientation,Triangular>){
 	return std::max(max_impl(matA,Orientation()),0.0);
 }
 
+//dispatcher
+template<class MatA>
+typename MatA::value_type max_impl(MatA const& matA){
+	return max_impl(matA,typename MatA::orientation());
+}
+
 template<class MatA>
 typename MatA::value_type min_impl(MatA const& matA, column_major){
 	typename MatA::value_type minimum = 0;
@@ -1003,10 +1038,21 @@ typename MatA::value_type min_impl(MatA const& matA, row_major){
 	return minimum;
 }
 
+template<class MatA>
+typename MatA::value_type min_impl(MatA const& matA, unknown_orientation){
+	return min_impl(matA,row_major());
+}
+
 //dispatcher for triangular matrix
 template<class MatA,class Orientation,class Triangular>
 typename MatA::value_type min_impl(MatA const& matA, packed<Orientation,Triangular>){
-	return std::max(min_impl(matA,Orientation()),0.0);
+	return std::min(min_impl(matA,Orientation()),0.0);
+}
+
+//dispatcher
+template<class MatA>
+typename MatA::value_type min_impl(MatA const& matA){
+	return min_impl(matA,typename MatA::orientation());
 }
 
 }//end detail
@@ -1022,7 +1068,7 @@ sum_rows(matrix_expression<MatA> const& A){
 		typename MatA::value_type,
 		dense_random_access_iterator_tag
 	>::type result(A().size2(),0.0);
-	detail::sum_rows_impl(A(),result,typename MatA::orientation());
+	detail::sum_rows_impl(eval_block(A),result);
 	return result;
 }
 
@@ -1037,24 +1083,24 @@ sum_columns(matrix_expression<MatA> const& A){
 		typename MatA::value_type,
 		dense_random_access_iterator_tag
 	>::type result(A().size1(),0);
-	detail::sum_rows_impl(trans(A),result,typename MatA::orientation::transposed_orientation());
+	detail::sum_rows_impl(eval_block(trans(A)),result);
 	return result;
 }
 
 
 template<class MatA>
 typename MatA::value_type sum(matrix_expression<MatA> const& A){
-	return detail::sum_impl(eval_block(A),typename matrix_temporary<MatA>::type::orientation());
+	return detail::sum_impl(eval_block(A));
 }
 
 template<class MatA>
 typename MatA::value_type max(matrix_expression<MatA> const& A){
-	return detail::max_impl(eval_block(A),typename matrix_temporary<MatA>::type::orientation());
+	return detail::max_impl(eval_block(A));
 }
 
 template<class MatA>
 typename MatA::value_type min(matrix_expression<MatA> const& A){
-	return detail::min_impl(eval_block(A),typename matrix_temporary<MatA>::type::orientation());
+	return detail::min_impl(eval_block(A));
 }
 
 /// \brief Returns the frobenius inner-product between matrices exprssions 1 and e2.
diff --git a/include/shark/LinAlg/Impl/pivotingRQ.inl b/include/shark/LinAlg/Impl/pivotingRQ.inl
index 52415c2..2ede7ec 100644
--- a/include/shark/LinAlg/Impl/pivotingRQ.inl
+++ b/include/shark/LinAlg/Impl/pivotingRQ.inl
@@ -162,7 +162,7 @@ std::size_t shark::blas::pivotingRQ
 	matrixQ().resize(n,n);
 	//now Compute U^T temp = U^T T^-1 U
 	noalias(matrixQ) = -prod(trans(rows(U,0,rank)),InvTU);
-	diag(matrixQ) += n;
+	diag(matrixQ) += 1;
 
 	//testing algorithm
 //	matrixQ().resize(n,n);
diff --git a/include/shark/LinAlg/Impl/solveSystem.inl b/include/shark/LinAlg/Impl/solveSystem.inl
index 6bc7897..8a6c7dd 100644
--- a/include/shark/LinAlg/Impl/solveSystem.inl
+++ b/include/shark/LinAlg/Impl/solveSystem.inl
@@ -317,9 +317,6 @@ void shark::blas::generalSolveSystemInPlace(
 	matrix_expression<MatT> const& A, 
 	vector_expression<VecT>& b
 ){
-	std::size_t m = A().size1();
-	std::size_t n = A().size2();
-	
 	if( System::left){
 		SIZE_CHECK(A().size1() == b().size());
 		//reduce to the case of quadratic A
@@ -356,10 +353,7 @@ template<class System,class MatA,class MatB>
 void shark::blas::generalSolveSystemInPlace(
 	matrix_expression<MatA> const& A, 
 	matrix_expression<MatB>& B
-){
-	std::size_t m = A().size1();
-	std::size_t n = A().size2();
-	
+){	
 	if( System::left){
 		SIZE_CHECK(A().size1() == B().size1());
 		//reduce to the case of quadratic A
diff --git a/src/Algorithms/PCA.cpp b/src/Algorithms/PCA.cpp
index b77d9a5..d5b4aa9 100644
--- a/src/Algorithms/PCA.cpp
+++ b/src/Algorithms/PCA.cpp
@@ -90,6 +90,8 @@ void PCA::setData(UnlabeledData<RealVector> const& inputs) {
 		}
 		S /= m_l;
 		m_eigenvalues.resize(m_l);
+		m_eigenvectors.resize(m_n,m_l);
+		m_eigenvectors.clear();
 		RealMatrix U(m_l, m_l);
 		eigensymm(S, U, m_eigenvalues);
 		// compute true eigenvectors
@@ -99,7 +101,7 @@ void PCA::setData(UnlabeledData<RealVector> const& inputs) {
 			std::size_t batchSize = inputs.batch(b).size1();
 			std::size_t batchEnd = batchStart+batchSize;
 			RealMatrix X = inputs.batch(b)-repeat(m_mean,batchSize);
-			m_eigenvectors = prod(trans(X),rows(U,batchStart,batchEnd));
+			noalias(m_eigenvectors) += prod(trans(X),rows(U,batchStart,batchEnd));
 			batchStart = batchEnd;
 		}
 		//normalize

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/shark.git



More information about the debian-science-commits mailing list