#include #include #include using namespace std; using namespace Eigen; using namespace Eigen; #ifndef SIZE #define SIZE 1024 #endif #ifndef DENSITY #define DENSITY 0.01 #endif #ifndef SCALAR #define SCALAR double #endif typedef SCALAR Scalar; typedef Matrix DenseMatrix; typedef Matrix DenseVector; typedef SparseMatrix EigenSparseMatrix; void fillMatrix(float density, int rows, int cols, EigenSparseMatrix& dst) { dst.reserve(double(rows) * cols * density); for (int j = 0; j < cols; j++) { for (int i = 0; i < rows; i++) { Scalar v = (internal::random(0, 1) < density) ? internal::random() : 0; if (v != 0) dst.insert(i, j) = v; } } dst.finalize(); } void fillMatrix2(int nnzPerCol, int rows, int cols, EigenSparseMatrix& dst) { // std::cout << "alloc " << nnzPerCol*cols << "\n"; dst.reserve(nnzPerCol * cols); for (int j = 0; j < cols; j++) { std::set aux; for (int i = 0; i < nnzPerCol; i++) { int k = internal::random(0, rows - 1); while (aux.find(k) != aux.end()) k = internal::random(0, rows - 1); aux.insert(k); dst.insert(k, j) = internal::random(); } } dst.finalize(); } void eiToDense(const EigenSparseMatrix& src, DenseMatrix& dst) { dst.setZero(); for (int j = 0; j < src.cols(); ++j) for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it) dst(it.index(), j) = it.value(); } #ifndef NOGMM #include "gmm/gmm.h" typedef gmm::csc_matrix GmmSparse; typedef gmm::col_matrix > GmmDynSparse; void eiToGmm(const EigenSparseMatrix& src, GmmSparse& dst) { GmmDynSparse tmp(src.rows(), src.cols()); for (int j = 0; j < src.cols(); ++j) for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it) tmp(it.index(), j) = it.value(); gmm::copy(tmp, dst); } #endif #ifndef NOMTL #include typedef mtl::compressed2D > MtlSparse; typedef mtl::compressed2D > MtlSparseRowMajor; void eiToMtl(const EigenSparseMatrix& src, MtlSparse& dst) { mtl::matrix::inserter ins(dst); for (int j = 0; j < src.cols(); ++j) for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it) ins[it.index()][j] = it.value(); } #endif #ifdef CSPARSE extern "C" { #include "cs.h" } void eiToCSparse(const EigenSparseMatrix& src, cs*& dst) { cs* aux = cs_spalloc(0, 0, 1, 1, 1); for (int j = 0; j < src.cols(); ++j) for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it) if (!cs_entry(aux, it.index(), j, it.value())) { std::cout << "cs_entry error\n"; exit(2); } dst = cs_compress(aux); // cs_spfree(aux); } #endif // CSPARSE #ifndef NOUBLAS #include #include #include #include #include #include #include #include typedef boost::numeric::ublas::compressed_matrix UBlasSparse; void eiToUblas(const EigenSparseMatrix& src, UBlasSparse& dst) { dst.resize(src.rows(), src.cols(), false); for (int j = 0; j < src.cols(); ++j) for (EigenSparseMatrix::InnerIterator it(src.derived(), j); it; ++it) dst(it.index(), j) = it.value(); } template void eiToUblasVec(const EigenType& src, UblasType& dst) { dst.resize(src.size()); for (int j = 0; j < src.size(); ++j) dst[j] = src.coeff(j); } #endif #ifdef OSKI extern "C" { #include } #endif