[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