Removed some extraneous comments from eigen transition
							parent
							
								
									8f417150f5
								
							
						
					
					
						commit
						2e942f08ac
					
				|  | @ -70,10 +70,6 @@ public: | |||
| 	 */ | ||||
| 	inline static FixedVector repeat(double value) { | ||||
| 		return FixedVector(Base::Constant(value)); | ||||
| //		FixedVector v;
 | ||||
| //		for (size_t i=0; i<N; ++i)
 | ||||
| //			v(i) = value;
 | ||||
| //		return v;
 | ||||
| 	} | ||||
| 
 | ||||
| 	/**
 | ||||
|  | @ -85,9 +81,6 @@ public: | |||
| 	 */ | ||||
| 	inline static FixedVector delta(size_t i, double value) { | ||||
| 		return FixedVector(Base::Unit(i) * value); | ||||
| //		FixedVector v = zero();
 | ||||
| //		v(i) = value;
 | ||||
| //		return v;
 | ||||
| 	} | ||||
| 
 | ||||
| 	/**
 | ||||
|  |  | |||
|  | @ -40,7 +40,7 @@ check_PROGRAMS += tests/testBTree tests/testDSF tests/testDSFVector | |||
| 
 | ||||
| # Timing tests
 | ||||
| noinst_PROGRAMS = tests/timeMatrix tests/timeVirtual tests/timeTest | ||||
| #noinst_PROGRAMS += tests/timeublas 
 | ||||
| noinst_PROGRAMS += tests/timeMatrixOps  | ||||
| 
 | ||||
| #----------------------------------------------------------------------------------------------------
 | ||||
| # Create a libtool library that is not installed
 | ||||
|  |  | |||
|  | @ -187,55 +187,12 @@ bool linear_dependent(const Matrix& A, const Matrix& B, double tol) { | |||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| void multiplyAdd(double alpha, const Matrix& A, const Vector& x, Vector& e) { | ||||
| 	// eigen call to exploit template optimizations
 | ||||
| 	e += alpha * A * x; | ||||
| //
 | ||||
| //#if defined GT_USE_CBLAS
 | ||||
| //
 | ||||
| //	// get sizes
 | ||||
| //	const size_t m = A.rows(), n = A.cols();
 | ||||
| //
 | ||||
| //	// get pointers
 | ||||
| //	const double * Aptr = A.data();
 | ||||
| //	const double * Xptr = x.data();
 | ||||
| //	double * Eptr = e.data();
 | ||||
| //
 | ||||
| //	// fill in parameters
 | ||||
| //	const double beta = 1.0;
 | ||||
| //	const size_t incx = 1, incy = 1, ida = n;
 | ||||
| //
 | ||||
| //	// execute blas call
 | ||||
| //	cblas_dgemv(CblasRowMajor, CblasNoTrans, m, n, alpha, Aptr, ida, Xptr, incx, beta, Eptr, incy);
 | ||||
| //
 | ||||
| //#else
 | ||||
| //
 | ||||
| //	size_t m = A.rows(), n = A.cols();
 | ||||
| //	double * ei = e.data();
 | ||||
| //	const double * aij = A.data();
 | ||||
| //	for(size_t i = 0; i < m; i++, ei++) {
 | ||||
| //		const double * xj = x.data();
 | ||||
| //		for(size_t j = 0; j < n; j++, aij++, xj++)
 | ||||
| //			(*ei) += alpha * (*aij) * (*xj);
 | ||||
| //	}
 | ||||
| //#endif
 | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| void multiplyAdd(const Matrix& A, const Vector& x, Vector& e) { | ||||
| 	e += A * x; | ||||
| 
 | ||||
| //#ifdef GT_USE_CBLAS
 | ||||
| //	multiplyAdd(1.0, A, x, e);
 | ||||
| //#else
 | ||||
| //	size_t m = A.rows(), n = A.cols();
 | ||||
| //	double * ei = e.data();
 | ||||
| //	const double * aij = A.data();
 | ||||
| //	for(size_t i = 0; i < m; i++, ei++) {
 | ||||
| //		const double * xj = x.data();
 | ||||
| //		for(size_t j = 0; j < n; j++, aij++, xj++)
 | ||||
| //			(*ei) += (*aij) * (*xj);
 | ||||
| //	}
 | ||||
| //#endif
 | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  | @ -251,67 +208,16 @@ Vector operator^(const Matrix& A, const Vector & v) { | |||
| /* ************************************************************************* */ | ||||
| void transposeMultiplyAdd(double alpha, const Matrix& A, const Vector& e, Vector& x) { | ||||
| 	x += alpha * A.transpose() * e; | ||||
| //
 | ||||
| //#if defined GT_USE_CBLAS
 | ||||
| //
 | ||||
| //	// get sizes
 | ||||
| //	const size_t m = A.rows(), n = A.cols();
 | ||||
| //
 | ||||
| //	// get pointers
 | ||||
| //	const double * Aptr = A.data();
 | ||||
| //	const double * Eptr = e.data();
 | ||||
| //	double * Xptr = x.data();
 | ||||
| //
 | ||||
| //	// fill in parameters
 | ||||
| //	const double beta = 1.0;
 | ||||
| //	const size_t incx = 1, incy = 1, ida = n;
 | ||||
| //
 | ||||
| //	// execute blas call
 | ||||
| //	cblas_dgemv(CblasRowMajor, CblasTrans, m, n, alpha, Aptr, ida, Eptr, incx, beta, Xptr, incy);
 | ||||
| //
 | ||||
| //#else
 | ||||
| //
 | ||||
| //	// TODO: use BLAS
 | ||||
| //	size_t m = A.rows(), n = A.cols();
 | ||||
| //	double * xj = x.data();
 | ||||
| //	for(size_t j = 0; j < n; j++,xj++) {
 | ||||
| //		const double * ei = e.data();
 | ||||
| //		const double * aij = A.data() + j;
 | ||||
| //		for(size_t i = 0; i < m; i++, aij+=n, ei++)
 | ||||
| //			(*xj) += alpha * (*aij) * (*ei);
 | ||||
| //	}
 | ||||
| //#endif
 | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| void transposeMultiplyAdd(const Matrix& A, const Vector& e, Vector& x) { | ||||
| 	x += A.transpose() * e; | ||||
| //#ifdef GT_USE_CBLAS
 | ||||
| //	transposeMultiplyAdd(1.0, A, e, x);
 | ||||
| //#else
 | ||||
| //	size_t m = A.rows(), n = A.cols();
 | ||||
| //	double * xj = x.data();
 | ||||
| //	for(size_t j = 0; j < n; j++,xj++) {
 | ||||
| //		const double * ei = e.data();
 | ||||
| //		const double * aij = A.data() + j;
 | ||||
| //		for(size_t i = 0; i < m; i++, aij+=n, ei++)
 | ||||
| //			(*xj) += (*aij) * (*ei);
 | ||||
| //	}
 | ||||
| //#endif
 | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| void transposeMultiplyAdd(double alpha, const Matrix& A, const Vector& e, SubVector x) { | ||||
| 	x += alpha * A.transpose() * e; | ||||
| 
 | ||||
| //	// TODO: use BLAS
 | ||||
| //	size_t m = A.rows(), n = A.cols();
 | ||||
| //	for (size_t j = 0; j < n; j++) {
 | ||||
| //		const double * ei = e.data();
 | ||||
| //		const double * aij = A.data() + j;
 | ||||
| //		for (size_t i = 0; i < m; i++, aij+=n, ei++)
 | ||||
| //			x(j) += alpha * (*aij) * (*ei);
 | ||||
| //	}
 | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  | @ -472,28 +378,6 @@ pair<Matrix,Matrix> qr(const Matrix& A) { | |||
|  * on a number of different matrices for which all columns change. | ||||
|  */ | ||||
| /* ************************************************************************* */ | ||||
| //void householder_update(Matrix &A, size_t j, double beta, const Vector& vjm) {
 | ||||
| //	const size_t m = A.rows(), n = A.cols();
 | ||||
| //
 | ||||
| //	Vector w(n);
 | ||||
| //	for( size_t c = 0; c < n; c++) {
 | ||||
| //		w(c) = 0.0;
 | ||||
| //		// dangerous as relies on row-major scheme
 | ||||
| //		const double *a = &A(j,c), * const v = &vjm(0);
 | ||||
| //		for( size_t r=j, s=0 ; r < m ; r++, s++, a+=n )
 | ||||
| //
 | ||||
| //			w(c) += (*a) * v[s];
 | ||||
| //		w(c) *= beta;
 | ||||
| //	}
 | ||||
| //
 | ||||
| //	// rank 1 update A(j:m,:) -= v(j:m)*w'
 | ||||
| //	for( size_t c = 0 ; c < n; c++) {
 | ||||
| //		double wc = w(c);
 | ||||
| //		double *a = &A(j,c); const double * const v =&vjm(0);
 | ||||
| //		for( size_t r=j, s=0 ; r < m ; r++, s++, a+=n )
 | ||||
| //			(*a) -= v[s] * wc;
 | ||||
| //	}
 | ||||
| //}
 | ||||
| 
 | ||||
| /**
 | ||||
|  * Perform updates of system matrices | ||||
|  | @ -585,29 +469,6 @@ void householder_(Matrix &A, size_t k) | |||
| 		// the Householder vector is copied in the zeroed out part
 | ||||
| 		A.col(j).segment(j+1, m-(j+1)) = vjm.segment(1, m-(j+1)); | ||||
| 	} // column j
 | ||||
| 
 | ||||
| //	const size_t m = A.rows(), n = A.cols(), kprime = min(k,min(m,n));
 | ||||
| //	// loop over the kprime first columns
 | ||||
| //	for(size_t j=0; j < kprime; j++){
 | ||||
| //		// below, the indices r,c always refer to original A
 | ||||
| //
 | ||||
| //		// copy column from matrix to xjm, i.e. x(j:m) = A(j:m,j)
 | ||||
| //		Vector xjm(m-j);
 | ||||
| //		for(size_t r = j ; r < m; r++)
 | ||||
| //			xjm(r-j) = A(r,j);
 | ||||
| //
 | ||||
| //		// calculate the Householder vector, in place
 | ||||
| //		double beta = houseInPlace(xjm);
 | ||||
| //		Vector& vjm = xjm;
 | ||||
| //
 | ||||
| //		// do outer product update A = (I-beta vv')*A = A - v*(beta*A'*v)' = A - v*w'
 | ||||
| //		householder_update(A, j, beta, vjm);
 | ||||
| //
 | ||||
| //		// the Householder vector is copied in the zeroed out part
 | ||||
| //		for( size_t r = j+1 ; r < m ; r++ )
 | ||||
| //			A(r,j) = vjm(r-j);
 | ||||
| //
 | ||||
| //	} // column j
 | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  | @ -617,8 +478,6 @@ void householder(Matrix &A, size_t k) { | |||
| 	const size_t m = A.rows(), n = A.cols(), kprime = min(k,min(m,n)); | ||||
| 	for(size_t j=0; j < kprime; j++) | ||||
| 		A.col(j).segment(j+1, m-(j+1)).setZero(); | ||||
| //		for( size_t i = j+1 ; i < m ; i++ )
 | ||||
| //			A(i,j) = 0.0;
 | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  |  | |||
|  | @ -307,11 +307,6 @@ void inplace_QR(MATRIX& A, bool clear_below_diagonal=true) { | |||
| 	zeroBelowDiagonal(A); | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
|  * Imperative version of Householder rank 1 update | ||||
|  */ | ||||
| //void householder_update(Matrix &A, size_t j, double beta, const Vector& vjm);
 | ||||
| 
 | ||||
| /**
 | ||||
|  * Imperative algorithm for in-place full elimination with | ||||
|  * weights and constraint handling | ||||
|  | @ -358,25 +353,6 @@ void householder_(MatrixColMajor& A, size_t k, bool copy_vectors=true); | |||
|  */ | ||||
| void householder(MatrixColMajor& A, size_t k); | ||||
| 
 | ||||
| //#ifdef GT_USE_LAPACK
 | ||||
| //#ifdef USE_LAPACK_QR
 | ||||
| ///**
 | ||||
| // * Householder tranformation, zeros below diagonal
 | ||||
| // * @return nothing: in place !!!
 | ||||
| // */
 | ||||
| //void householder(Matrix& A);
 | ||||
| //
 | ||||
| ///**
 | ||||
| // * Householder tranformation directly on a column-major matrix.  Does not zero
 | ||||
| // * below the diagonal, so it will contain Householder vectors.
 | ||||
| // * @return nothing: in place !!!
 | ||||
| // * FIXME: this uses the LAPACK QR function, so it cannot be used on Ubuntu (without
 | ||||
| // * lots of hacks, at least)
 | ||||
| // */
 | ||||
| //void householderColMajor(MatrixColMajor& A);
 | ||||
| //#endif
 | ||||
| //#endif
 | ||||
| 
 | ||||
| /**
 | ||||
|  * backSubstitute U*x=b | ||||
|  * @param U an upper triangular matrix | ||||
|  |  | |||
|  | @ -209,7 +209,7 @@ bool assert_equal(const Vector& expected, const Vector& actual, double tol) { | |||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| bool assert_equal(SubVector expected, SubVector actual, double tol) { | ||||
| bool assert_equal(const SubVector& expected, const SubVector& actual, double tol) { | ||||
| 	if (equal_with_abs_tol(expected,actual,tol)) return true; | ||||
| 	cout << "not equal:" << endl; | ||||
| 	print(expected, "expected"); | ||||
|  | @ -217,14 +217,14 @@ bool assert_equal(SubVector expected, SubVector actual, double tol) { | |||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| ///* ************************************************************************* */
 | ||||
| //bool assert_equal(ConstSubVector expected, ConstSubVector actual, double tol) {
 | ||||
| //	if (equal_with_abs_tol(Vector(expected),Vector(actual),tol)) return true;
 | ||||
| //	cout << "not equal:" << endl;
 | ||||
| //	print(Vector(expected), "expected");
 | ||||
| //	print(Vector(actual), "actual");
 | ||||
| //	return false;
 | ||||
| //}
 | ||||
| /* ************************************************************************* */ | ||||
| bool assert_equal(const ConstSubVector& expected, const ConstSubVector& actual, double tol) { | ||||
| 	if (equal_with_abs_tol(Vector(expected),Vector(actual),tol)) return true; | ||||
| 	cout << "not equal:" << endl; | ||||
| 	print(Vector(expected), "expected"); | ||||
| 	print(Vector(actual), "actual"); | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| bool linear_dependent(const Vector& vec1, const Vector& vec2, double tol) { | ||||
|  | @ -281,11 +281,6 @@ Vector ediv_(const Vector &a, const Vector &b) { | |||
| /* ************************************************************************* */ | ||||
| double sum(const Vector &a) { | ||||
| 	return a.sum(); | ||||
| //	double result = 0.0;
 | ||||
| //	size_t n = a.size();
 | ||||
| //	for( size_t i = 0; i < n; i++ )
 | ||||
| //		result += a(i);
 | ||||
| //	return result;
 | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  | @ -305,9 +300,6 @@ Vector reciprocal(const Vector &a) { | |||
| /* ************************************************************************* */ | ||||
| Vector esqrt(const Vector& v) { | ||||
| 	return v.cwiseSqrt(); | ||||
| //	Vector s(v.size());
 | ||||
| //	transform(v.begin(), v.end(), s.begin(), ::sqrt);
 | ||||
| //	return s;
 | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  | @ -335,18 +327,12 @@ void scal(double alpha, Vector& x) { | |||
| void axpy(double alpha, const Vector& x, Vector& y) { | ||||
| 	assert (y.size()==x.size()); | ||||
| 	y += alpha * x; | ||||
| //	size_t n = x.size();
 | ||||
| //	for (size_t i = 0; i < n; i++)
 | ||||
| //		y[i] += alpha * x[i];
 | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| void axpy(double alpha, const Vector& x, SubVector y) { | ||||
| 	assert (y.size()==x.size()); | ||||
| 	y += alpha * x; | ||||
| //	size_t n = x.size();
 | ||||
| //	for (size_t i = 0; i < n; i++)
 | ||||
| //		y[i] += alpha * x[i];
 | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  |  | |||
|  | @ -167,8 +167,8 @@ bool assert_equal(const Vector& vec1, const Vector& vec2, double tol=1e-9); | |||
|  * @param tol 1e-9 | ||||
|  * @return bool | ||||
|  */ | ||||
| bool assert_equal(SubVector vec1, SubVector vec2, double tol=1e-9); | ||||
| //bool assert_equal(ConstSubVector vec1, ConstSubVector vec2, double tol=1e-9);
 | ||||
| bool assert_equal(const SubVector& vec1, const SubVector& vec2, double tol=1e-9); | ||||
| bool assert_equal(const ConstSubVector& vec1, const ConstSubVector& vec2, double tol=1e-9); | ||||
| 
 | ||||
| /**
 | ||||
|  * check whether two vectors are linearly dependent | ||||
|  |  | |||
|  | @ -313,11 +313,10 @@ public: | |||
|   typedef Eigen::Block<MATRIX> Block; | ||||
|   typedef Eigen::Block<const MATRIX> constBlock; | ||||
| 
 | ||||
| //  typedef typename MATRIX::ColXpr Column;
 | ||||
| //  typedef typename MATRIX::ConstColXpr constColumn;
 | ||||
| private: | ||||
|   static FullMatrix matrixTemp_; // just for finding types
 | ||||
| 
 | ||||
| protected: | ||||
|   static FullMatrix matrixTemp_; // the reference to the full matrix
 | ||||
|   FullMatrix& matrix_; // the reference to the full matrix
 | ||||
|   std::vector<size_t> variableColOffsets_; // the starting columns of each block (0-based)
 | ||||
| 
 | ||||
|  | @ -426,11 +425,6 @@ public: | |||
| 
 | ||||
|   Column column(size_t i_block, size_t j_block, size_t columnOffset) { | ||||
|   	assertInvariants(); | ||||
| //    size_t j_actualBlock = j_block + blockStart_;
 | ||||
| //    assert(variableColOffsets_[j_actualBlock] + columnOffset < variableColOffsets_[j_actualBlock+1]);
 | ||||
| //    Block blockMat(operator()(i_block, j_block));
 | ||||
| //    return blockMat.col(columnOffset);
 | ||||
| 
 | ||||
|   	size_t i_actualBlock = i_block + blockStart_; | ||||
|   	size_t j_actualBlock = j_block + blockStart_; | ||||
|   	checkBlock(i_actualBlock); | ||||
|  | @ -468,12 +462,6 @@ public: | |||
|     		variableColOffsets_[j_actualStartBlock] + columnOffset).segment( | ||||
|     				variableColOffsets_[i_actualStartBlock], | ||||
|     				variableColOffsets_[i_actualEndBlock]-variableColOffsets_[i_actualStartBlock]); | ||||
| 
 | ||||
|     // column of a block approach
 | ||||
| //    size_t j_actualBlock = j_block + blockStart_;
 | ||||
| //    assert(variableColOffsets_[j_actualBlock] + columnOffset < variableColOffsets_[j_actualBlock+1]);
 | ||||
| //    Block blockMat = this->range(i_startBlock, i_endBlock, j_block, j_block+1);
 | ||||
| //    return Column(blockMat, columnOffset);
 | ||||
|   } | ||||
| 
 | ||||
|   constColumn rangeColumn(size_t i_startBlock, size_t i_endBlock, size_t j_block, size_t columnOffset) const { | ||||
|  | @ -491,12 +479,6 @@ public: | |||
|     		variableColOffsets_[j_actualStartBlock] + columnOffset).segment( | ||||
|     				variableColOffsets_[i_actualStartBlock], | ||||
|     				variableColOffsets_[i_actualEndBlock]-variableColOffsets_[i_actualStartBlock]); | ||||
| 
 | ||||
|     // column of a block approach
 | ||||
| //    size_t j_actualBlock = j_block + blockStart_;
 | ||||
| //    assert(variableColOffsets_[j_actualBlock] + columnOffset < variableColOffsets_[j_actualBlock+1]);
 | ||||
| //    constBlock blockMat = this->range(i_startBlock, i_endBlock, j_block, j_block+1);
 | ||||
| //    return constColumn(blockMat, columnOffset);
 | ||||
|   } | ||||
| 
 | ||||
|   size_t offset(size_t block) const { | ||||
|  |  | |||
|  | @ -25,8 +25,6 @@ | |||
| 
 | ||||
| #include <boost/format.hpp> | ||||
| 
 | ||||
| //namespace ublas = boost::numeric::ublas;
 | ||||
| 
 | ||||
| using namespace std; | ||||
| 
 | ||||
| namespace gtsam { | ||||
|  | @ -58,17 +56,12 @@ static inline bool choleskyStep(MatrixColMajor& ATA, size_t k, size_t order) { | |||
|     ATA(k,k) = beta; | ||||
| 
 | ||||
|     if(k < (order-1)) { | ||||
| //      ublas::matrix_row<MatrixColMajor> Vf(ublas::row(ATA, k));
 | ||||
| //      ublas::vector_range<typeof(Vf)> V(ublas::subrange(Vf, k+1,order));
 | ||||
| 
 | ||||
|       // Update A(k,k+1:end) <- A(k,k+1:end) / beta
 | ||||
|     	typedef typeof(ATA.row(k).segment(k+1, order-(k+1))) BlockRow; | ||||
|     	BlockRow V = ATA.row(k).segment(k+1, order-(k+1)); | ||||
|     	V *= betainv; | ||||
| 
 | ||||
|       // Update A(k+1:end, k+1:end) <- A(k+1:end, k+1:end) - v*v' / alpha
 | ||||
| //      ublas::matrix_range<MatrixColMajor> L(ublas::subrange(ATA, k+1,order, k+1,order));
 | ||||
| //      L -= ublas::outer_prod(V, V);
 | ||||
|       ATA.block(k+1, k+1, order-(k+1), order-(k+1)) -= V.transpose() * V; | ||||
|     } | ||||
| 
 | ||||
|  | @ -123,8 +116,6 @@ void choleskyPartial(MatrixColMajor& ABC, size_t nFrontal) { | |||
| 
 | ||||
|   const bool debug = ISDEBUG("choleskyPartial"); | ||||
| 
 | ||||
| //  Eigen::Map<Eigen::MatrixXd> ABC(&ABCublas(0,0), ABCublas.rows(), ABCublas.cols());
 | ||||
| 
 | ||||
|   assert(ABC.rows() == ABC.cols()); | ||||
|   assert(ABC.rows() >= 0 && nFrontal <= size_t(ABC.rows())); | ||||
| 
 | ||||
|  |  | |||
|  | @ -758,31 +758,6 @@ TEST( matrix, eigen_QR ) | |||
| 	EXPECT(assert_equal(expected, A, 1e-3)); | ||||
| } | ||||
| 
 | ||||
| ///* ************************************************************************* */
 | ||||
| //// unit tests for householder transformation
 | ||||
| ///* ************************************************************************* */
 | ||||
| //#ifdef GT_USE_LAPACK
 | ||||
| //#ifdef YA_BLAS
 | ||||
| //TEST( matrix, houseHolder2 )
 | ||||
| //{
 | ||||
| //	double data[] = { -5, 0, 5, 0, 0, 0, -1,
 | ||||
| //			00,-5, 0, 5, 0, 0, 1.5,
 | ||||
| //			10, 0, 0,	0,-10,0,   2,
 | ||||
| //			00, 10,0, 0, 0, -10, -1 };
 | ||||
| //
 | ||||
| //	// check in-place householder, with v vectors below diagonal
 | ||||
| //	double data1[] = { 11.1803, 0, -2.2361, 0, -8.9443, 0, 2.236,
 | ||||
| //			0, 11.1803,	0, -2.2361, 0, -8.9443, -1.565,
 | ||||
| //			0, 0, 4.4721, 0, -4.4721,	0, 0,
 | ||||
| //			0, 0, 0, 4.4721, 0, -4.4721, 0.894 };
 | ||||
| //	Matrix expected1 = Matrix_(4, 7, data1);
 | ||||
| //	Matrix A1 = Matrix_(4, 7, data);
 | ||||
| //	householder(A1);
 | ||||
| //	EXPECT(assert_equal(expected1, A1, 1e-3));
 | ||||
| //}
 | ||||
| //#endif
 | ||||
| //#endif
 | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| // unit test for qr factorization (and hence householder)
 | ||||
| // This behaves the same as QR in matlab: [Q,R] = qr(A), except for signs
 | ||||
|  | @ -840,24 +815,6 @@ TEST( matrix, row_major_access ) | |||
| 	DOUBLES_EQUAL(3,a[2],1e-9); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| // update A, b
 | ||||
| // A' \define A_{S}-ar and b'\define b-ad
 | ||||
| // __attribute__ ((noinline))	// uncomment to prevent inlining when profiling
 | ||||
| //static void updateAb(Matrix& A, Vector& b, int j, const Vector& a,
 | ||||
| //		const Vector& r, double d) {
 | ||||
| //	const size_t m = A.rows(), n = A.cols();
 | ||||
| //	for (int i = 0; i < m; i++) { // update all rows
 | ||||
| //		double ai = a(i);
 | ||||
| //		b(i) -= ai * d;
 | ||||
| //		double *Aij = A.data().begin() + i * n + j + 1;
 | ||||
| //		const double *rptr = r.data().begin() + j + 1;
 | ||||
| //		// A(i,j+1:end) -= ai*r(j+1:end)
 | ||||
| //		for (int j2 = j + 1; j2 < n; j2++, Aij++, rptr++)
 | ||||
| //			*Aij -= ai * (*rptr);
 | ||||
| //	}
 | ||||
| //}
 | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| TEST( matrix, weighted_elimination ) | ||||
| { | ||||
|  |  | |||
|  | @ -11,41 +11,47 @@ | |||
| 
 | ||||
| /**
 | ||||
|  * @file    timeublas.cpp | ||||
|  * @brief   Tests to help determine which way of accomplishing something in ublas is faster | ||||
|  * @brief   Tests to help determine which way of accomplishing something with Eigen is faster | ||||
|  * @author  Richard Roberts | ||||
|  * @created Sep 18, 2010 | ||||
|  */ | ||||
| 
 | ||||
| #include <boost/numeric/ublas/matrix.hpp> | ||||
| #include <boost/numeric/ublas/matrix_proxy.hpp> | ||||
| #include <boost/numeric/ublas/triangular.hpp> | ||||
| #include <boost/numeric/ublas/io.hpp> | ||||
| //#include <boost/numeric/ublas/matrix.hpp>
 | ||||
| //#include <boost/numeric/ublas/matrix_proxy.hpp>
 | ||||
| //#include <boost/numeric/ublas/triangular.hpp>
 | ||||
| //#include <boost/numeric/ublas/io.hpp>
 | ||||
| #include <boost/random.hpp> | ||||
| #include <boost/timer.hpp> | ||||
| #include <boost/format.hpp> | ||||
| #include <boost/lambda/lambda.hpp> | ||||
| #include <boost/foreach.hpp> | ||||
| 
 | ||||
| #include <gtsam/base/Matrix.h> | ||||
| 
 | ||||
| #include <iostream> | ||||
| #include <vector> | ||||
| #include <utility> | ||||
| 
 | ||||
| using namespace std; | ||||
| namespace ublas = boost::numeric::ublas; | ||||
| //namespace ublas = boost::numeric::ublas;
 | ||||
| //using namespace Eigen;
 | ||||
| using boost::timer; | ||||
| using boost::format; | ||||
| using namespace boost::lambda; | ||||
| 
 | ||||
| static boost::variate_generator<boost::mt19937, boost::uniform_real<> > rng(boost::mt19937(), boost::uniform_real<>(-1.0, 0.0)); | ||||
| typedef ublas::matrix<double> matrix; | ||||
| typedef ublas::matrix_range<matrix> matrix_range; | ||||
| using ublas::range; | ||||
| using ublas::triangular_matrix; | ||||
| //typedef ublas::matrix<double> matrix;
 | ||||
| //typedef ublas::matrix_range<matrix> matrix_range;
 | ||||
| typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix; | ||||
| typedef Eigen::Block<matrix> matrix_block; | ||||
| 
 | ||||
| //using ublas::range;
 | ||||
| //using ublas::triangular_matrix;
 | ||||
| 
 | ||||
| int main(int argc, char* argv[]) { | ||||
| 
 | ||||
|   if(false) { | ||||
|     cout << "\nTiming matrix_range:" << endl; | ||||
|   if(true) { | ||||
|     cout << "\nTiming matrix_block:" << endl; | ||||
| 
 | ||||
|     // We use volatile here to make these appear to the optimizing compiler as
 | ||||
|     // if their values are only known at run-time.
 | ||||
|  | @ -56,9 +62,9 @@ int main(int argc, char* argv[]) { | |||
|     boost::variate_generator<boost::mt19937, boost::uniform_int<size_t> > rni(boost::mt19937(), boost::uniform_int<size_t>(0,m-1)); | ||||
|     boost::variate_generator<boost::mt19937, boost::uniform_int<size_t> > rnj(boost::mt19937(), boost::uniform_int<size_t>(0,n-1)); | ||||
|     matrix mat(m,n); | ||||
|     matrix_range full(mat, range(0,m), range(0,n)); | ||||
|     matrix_range top(mat, range(0,n), range(0,n)); | ||||
|     matrix_range block(mat, range(m/4, m-m/4), range(n/4, n-n/4)); | ||||
|     matrix_block full = mat.block(0, 0, m, n); | ||||
|     matrix_block top = mat.block(0, 0, n, n); | ||||
|     matrix_block block = mat.block(m/4, n/4, m-m/2, n-n/2); | ||||
| 
 | ||||
|     cout << format("  Basic: %1%x%2%\n") % m % n; | ||||
|     cout << format("  Full:  mat(%1%:%2%, %3%:%4%)\n") % 0 % m % 0 % n; | ||||
|  | @ -74,41 +80,41 @@ int main(int argc, char* argv[]) { | |||
| 
 | ||||
|       // Do a few initial assignments to let any cache effects stabilize
 | ||||
|       for(size_t rep=0; rep<1000; ++rep) | ||||
|         for(size_t i=0; i<mat.size1(); ++i) | ||||
|           for(size_t j=0; j<mat.size2(); ++j) | ||||
|         for(size_t i=0; i<(size_t)mat.rows(); ++i) | ||||
|           for(size_t j=0; j<(size_t)mat.cols(); ++j) | ||||
|             mat(i,j) = rng(); | ||||
| 
 | ||||
|       tim.restart(); | ||||
|       for(size_t rep=0; rep<nReps; ++rep) | ||||
|         for(size_t i=0; i<mat.size1(); ++i) | ||||
|           for(size_t j=0; j<mat.size2(); ++j) | ||||
|         for(size_t i=0; i<(size_t)mat.rows(); ++i) | ||||
|           for(size_t j=0; j<(size_t)mat.cols(); ++j) | ||||
|             mat(i,j) = rng(); | ||||
|       basicTime = tim.elapsed(); | ||||
|       cout << format("  Basic: %1% mus/element") % double(1000000 * basicTime / double(mat.size1()*mat.size2()*nReps)) << endl; | ||||
|       cout << format("  Basic: %1% mus/element") % double(1000000 * basicTime / double(mat.rows()*mat.cols()*nReps)) << endl; | ||||
| 
 | ||||
|       tim.restart(); | ||||
|       for(size_t rep=0; rep<nReps; ++rep) | ||||
|         for(size_t i=0; i<full.size1(); ++i) | ||||
|           for(size_t j=0; j<full.size2(); ++j) | ||||
|         for(size_t i=0; i<(size_t)full.rows(); ++i) | ||||
|           for(size_t j=0; j<(size_t)full.cols(); ++j) | ||||
|             full(i,j) = rng(); | ||||
|       fullTime = tim.elapsed(); | ||||
|       cout << format("  Full:  %1% mus/element") % double(1000000 * fullTime / double(full.size1()*full.size2()*nReps)) << endl; | ||||
|       cout << format("  Full:  %1% mus/element") % double(1000000 * fullTime / double(full.rows()*full.cols()*nReps)) << endl; | ||||
| 
 | ||||
|       tim.restart(); | ||||
|       for(size_t rep=0; rep<nReps; ++rep) | ||||
|         for(size_t i=0; i<top.size1(); ++i) | ||||
|           for(size_t j=0; j<top.size2(); ++j) | ||||
|         for(size_t i=0; i<(size_t)top.rows(); ++i) | ||||
|           for(size_t j=0; j<(size_t)top.cols(); ++j) | ||||
|             top(i,j) = rng(); | ||||
|       topTime = tim.elapsed(); | ||||
|       cout << format("  Top:   %1% mus/element") % double(1000000 * topTime / double(top.size1()*top.size2()*nReps)) << endl; | ||||
|       cout << format("  Top:   %1% mus/element") % double(1000000 * topTime / double(top.rows()*top.cols()*nReps)) << endl; | ||||
| 
 | ||||
|       tim.restart(); | ||||
|       for(size_t rep=0; rep<nReps; ++rep) | ||||
|         for(size_t i=0; i<block.size1(); ++i) | ||||
|           for(size_t j=0; j<block.size2(); ++j) | ||||
|         for(size_t i=0; i<(size_t)block.rows(); ++i) | ||||
|           for(size_t j=0; j<(size_t)block.cols(); ++j) | ||||
|             block(i,j) = rng(); | ||||
|       blockTime = tim.elapsed(); | ||||
|       cout << format("  Block: %1% mus/element") % double(1000000 * blockTime / double(block.size1()*block.size2()*nReps)) << endl; | ||||
|       cout << format("  Block: %1% mus/element") % double(1000000 * blockTime / double(block.rows()*block.cols()*nReps)) << endl; | ||||
| 
 | ||||
|       cout << endl; | ||||
|     } | ||||
|  | @ -121,41 +127,41 @@ int main(int argc, char* argv[]) { | |||
| 
 | ||||
|       // Do a few initial assignments to let any cache effects stabilize
 | ||||
|       for(size_t rep=0; rep<1000; ++rep) | ||||
|         for(size_t j=0; j<mat.size2(); ++j) | ||||
|           for(size_t i=0; i<mat.size1(); ++i) | ||||
|         for(size_t j=0; j<(size_t)mat.cols(); ++j) | ||||
|           for(size_t i=0; i<(size_t)mat.rows(); ++i) | ||||
|             mat(i,j) = rng(); | ||||
| 
 | ||||
|       tim.restart(); | ||||
|       for(size_t rep=0; rep<nReps; ++rep) | ||||
|         for(size_t j=0; j<mat.size2(); ++j) | ||||
|           for(size_t i=0; i<mat.size1(); ++i) | ||||
|         for(size_t j=0; j<(size_t)mat.cols(); ++j) | ||||
|           for(size_t i=0; i<(size_t)mat.rows(); ++i) | ||||
|             mat(i,j) = rng(); | ||||
|       basicTime = tim.elapsed(); | ||||
|       cout << format("  Basic: %1% mus/element") % double(1000000 * basicTime / double(mat.size1()*mat.size2()*nReps)) << endl; | ||||
|       cout << format("  Basic: %1% mus/element") % double(1000000 * basicTime / double(mat.rows()*mat.cols()*nReps)) << endl; | ||||
| 
 | ||||
|       tim.restart(); | ||||
|       for(size_t rep=0; rep<nReps; ++rep) | ||||
|         for(size_t j=0; j<full.size2(); ++j) | ||||
|           for(size_t i=0; i<full.size1(); ++i) | ||||
|         for(size_t j=0; j<(size_t)full.cols(); ++j) | ||||
|           for(size_t i=0; i<(size_t)full.rows(); ++i) | ||||
|             full(i,j) = rng(); | ||||
|       fullTime = tim.elapsed(); | ||||
|       cout << format("  Full:  %1% mus/element") % double(1000000 * fullTime / double(full.size1()*full.size2()*nReps)) << endl; | ||||
|       cout << format("  Full:  %1% mus/element") % double(1000000 * fullTime / double(full.rows()*full.cols()*nReps)) << endl; | ||||
| 
 | ||||
|       tim.restart(); | ||||
|       for(size_t rep=0; rep<nReps; ++rep) | ||||
|         for(size_t j=0; j<top.size2(); ++j) | ||||
|           for(size_t i=0; i<top.size1(); ++i) | ||||
|         for(size_t j=0; j<(size_t)top.cols(); ++j) | ||||
|           for(size_t i=0; i<(size_t)top.rows(); ++i) | ||||
|             top(i,j) = rng(); | ||||
|       topTime = tim.elapsed(); | ||||
|       cout << format("  Top:   %1% mus/element") % double(1000000 * topTime / double(top.size1()*top.size2()*nReps)) << endl; | ||||
|       cout << format("  Top:   %1% mus/element") % double(1000000 * topTime / double(top.rows()*top.cols()*nReps)) << endl; | ||||
| 
 | ||||
|       tim.restart(); | ||||
|       for(size_t rep=0; rep<nReps; ++rep) | ||||
|         for(size_t j=0; j<block.size2(); ++j) | ||||
|           for(size_t i=0; i<block.size1(); ++i) | ||||
|         for(size_t j=0; j<(size_t)block.cols(); ++j) | ||||
|           for(size_t i=0; i<(size_t)block.rows(); ++i) | ||||
|             block(i,j) = rng(); | ||||
|       blockTime = tim.elapsed(); | ||||
|       cout << format("  Block: %1% mus/element") % double(1000000 * blockTime / double(block.size1()*block.size2()*nReps)) << endl; | ||||
|       cout << format("  Block: %1% mus/element") % double(1000000 * blockTime / double(block.rows()*block.cols()*nReps)) << endl; | ||||
| 
 | ||||
|       cout << endl; | ||||
|     } | ||||
|  | @ -185,13 +191,13 @@ int main(int argc, char* argv[]) { | |||
|       fullTime = tim.elapsed(); | ||||
|       cout << format("  Full:  %1% mus/element") % double(1000000 * fullTime / double(ijs.size()*nReps)) << endl; | ||||
| 
 | ||||
|       for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni()%top.size1(),rnj())); | ||||
|       for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni()%top.rows(),rnj())); | ||||
|       for(size_t rep=0; rep<1000; ++rep) | ||||
|         BOOST_FOREACH(const ij_t& ij, ijs) { top(ij.first, ij.second) = rng(); } | ||||
|       topTime = tim.elapsed(); | ||||
|       cout << format("  Top:   %1% mus/element") % double(1000000 * topTime / double(ijs.size()*nReps)) << endl; | ||||
| 
 | ||||
|       for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni()%block.size1(),rnj()%block.size2())); | ||||
|       for_each(ijs.begin(), ijs.end(), _1 = make_pair(rni()%block.rows(),rnj()%block.cols())); | ||||
|       for(size_t rep=0; rep<1000; ++rep) | ||||
|         BOOST_FOREACH(const ij_t& ij, ijs) { block(ij.first, ij.second) = rng(); } | ||||
|       blockTime = tim.elapsed(); | ||||
|  | @ -201,82 +207,83 @@ int main(int argc, char* argv[]) { | |||
|     } | ||||
|   } | ||||
| 
 | ||||
|   if(true) { | ||||
|     cout << "\nTesting square triangular matrices:" << endl; | ||||
| //  if(true) {
 | ||||
| //    cout << "\nTesting square triangular matrices:" << endl;
 | ||||
| //
 | ||||
| ////    typedef triangular_matrix<double, ublas::upper, ublas::column_major> triangular;
 | ||||
| ////    typedef ublas::matrix<double, ublas::column_major> matrix;
 | ||||
| //    typedef MatrixXd matrix; // default col major
 | ||||
| //
 | ||||
| ////    triangular tri(5,5);
 | ||||
| //
 | ||||
| //    matrix mat(5,5);
 | ||||
| //    for(size_t j=0; j<(size_t)mat.cols(); ++j)
 | ||||
| //      for(size_t i=0; i<(size_t)mat.rows(); ++i)
 | ||||
| //        mat(i,j) = rng();
 | ||||
| //
 | ||||
| //    tri = ublas::triangular_adaptor<matrix, ublas::upper>(mat);
 | ||||
| //    cout << "  Assigned from triangular adapter: " << tri << endl;
 | ||||
| //
 | ||||
| //    cout << "  Triangular adapter of mat: " << ublas::triangular_adaptor<matrix, ublas::upper>(mat) << endl;
 | ||||
| //
 | ||||
| //    for(size_t j=0; j<(size_t)mat.cols(); ++j)
 | ||||
| //      for(size_t i=0; i<(size_t)mat.rows(); ++i)
 | ||||
| //        mat(i,j) = rng();
 | ||||
| //    mat = tri;
 | ||||
| //    cout << "  Assign matrix from triangular: " << mat << endl;
 | ||||
| //
 | ||||
| //    for(size_t j=0; j<(size_t)mat.cols(); ++j)
 | ||||
| //      for(size_t i=0; i<(size_t)mat.rows(); ++i)
 | ||||
| //        mat(i,j) = rng();
 | ||||
| //    (ublas::triangular_adaptor<matrix, ublas::upper>(mat)) = tri;
 | ||||
| //    cout << "  Assign triangular adaptor from triangular: " << mat << endl;
 | ||||
| //  }
 | ||||
| 
 | ||||
|     typedef triangular_matrix<double, ublas::upper, ublas::column_major> triangular; | ||||
|     typedef ublas::matrix<double, ublas::column_major> matrix; | ||||
| //  {
 | ||||
| //    cout << "\nTesting wide triangular matrices:" << endl;
 | ||||
| //
 | ||||
| //    typedef triangular_matrix<double, ublas::upper, ublas::column_major> triangular;
 | ||||
| //    typedef ublas::matrix<double, ublas::column_major> matrix;
 | ||||
| //
 | ||||
| //    triangular tri(5,7);
 | ||||
| //
 | ||||
| //    matrix mat(5,7);
 | ||||
| //    for(size_t j=0; j<(size_t)mat.cols(); ++j)
 | ||||
| //      for(size_t i=0; i<(size_t)mat.rows(); ++i)
 | ||||
| //        mat(i,j) = rng();
 | ||||
| //
 | ||||
| //    tri = ublas::triangular_adaptor<matrix, ublas::upper>(mat);
 | ||||
| //    cout << "  Assigned from triangular adapter: " << tri << endl;
 | ||||
| //
 | ||||
| //    cout << "  Triangular adapter of mat: " << ublas::triangular_adaptor<matrix, ublas::upper>(mat) << endl;
 | ||||
| //
 | ||||
| //    for(size_t j=0; j<(size_t)mat.cols(); ++j)
 | ||||
| //      for(size_t i=0; i<(size_t)mat.rows(); ++i)
 | ||||
| //        mat(i,j) = rng();
 | ||||
| //    mat = tri;
 | ||||
| //    cout << "  Assign matrix from triangular: " << mat << endl;
 | ||||
| //
 | ||||
| //    for(size_t j=0; j<(size_t)mat.cols(); ++j)
 | ||||
| //      for(size_t i=0; i<(size_t)mat.rows(); ++i)
 | ||||
| //        mat(i,j) = rng();
 | ||||
| //    mat = ublas::triangular_adaptor<matrix, ublas::upper>(mat);
 | ||||
| //    cout << "  Assign matrix from triangular adaptor of self: " << mat << endl;
 | ||||
| //  }
 | ||||
| 
 | ||||
|     triangular tri(5,5); | ||||
| 
 | ||||
|     matrix mat(5,5); | ||||
|     for(size_t j=0; j<mat.size2(); ++j) | ||||
|       for(size_t i=0; i<mat.size1(); ++i) | ||||
|         mat(i,j) = rng(); | ||||
| 
 | ||||
|     tri = ublas::triangular_adaptor<matrix, ublas::upper>(mat); | ||||
|     cout << "  Assigned from triangular adapter: " << tri << endl; | ||||
| 
 | ||||
|     cout << "  Triangular adapter of mat: " << ublas::triangular_adaptor<matrix, ublas::upper>(mat) << endl; | ||||
| 
 | ||||
|     for(size_t j=0; j<mat.size2(); ++j) | ||||
|       for(size_t i=0; i<mat.size1(); ++i) | ||||
|         mat(i,j) = rng(); | ||||
|     mat = tri; | ||||
|     cout << "  Assign matrix from triangular: " << mat << endl; | ||||
| 
 | ||||
|     for(size_t j=0; j<mat.size2(); ++j) | ||||
|       for(size_t i=0; i<mat.size1(); ++i) | ||||
|         mat(i,j) = rng(); | ||||
|     (ublas::triangular_adaptor<matrix, ublas::upper>(mat)) = tri; | ||||
|     cout << "  Assign triangular adaptor from triangular: " << mat << endl; | ||||
|   } | ||||
| 
 | ||||
|   { | ||||
|     cout << "\nTesting wide triangular matrices:" << endl; | ||||
| 
 | ||||
|     typedef triangular_matrix<double, ublas::upper, ublas::column_major> triangular; | ||||
|     typedef ublas::matrix<double, ublas::column_major> matrix; | ||||
| 
 | ||||
|     triangular tri(5,7); | ||||
| 
 | ||||
|     matrix mat(5,7); | ||||
|     for(size_t j=0; j<mat.size2(); ++j) | ||||
|       for(size_t i=0; i<mat.size1(); ++i) | ||||
|         mat(i,j) = rng(); | ||||
| 
 | ||||
|     tri = ublas::triangular_adaptor<matrix, ublas::upper>(mat); | ||||
|     cout << "  Assigned from triangular adapter: " << tri << endl; | ||||
| 
 | ||||
|     cout << "  Triangular adapter of mat: " << ublas::triangular_adaptor<matrix, ublas::upper>(mat) << endl; | ||||
| 
 | ||||
|     for(size_t j=0; j<mat.size2(); ++j) | ||||
|       for(size_t i=0; i<mat.size1(); ++i) | ||||
|         mat(i,j) = rng(); | ||||
|     mat = tri; | ||||
|     cout << "  Assign matrix from triangular: " << mat << endl; | ||||
| 
 | ||||
|     for(size_t j=0; j<mat.size2(); ++j) | ||||
|       for(size_t i=0; i<mat.size1(); ++i) | ||||
|         mat(i,j) = rng(); | ||||
|     mat = ublas::triangular_adaptor<matrix, ublas::upper>(mat); | ||||
|     cout << "  Assign matrix from triangular adaptor of self: " << mat << endl; | ||||
|   } | ||||
| 
 | ||||
|   { | ||||
|     cout << "\nTesting subvectors:" << endl; | ||||
| 
 | ||||
|     typedef ublas::matrix<double, ublas::column_major> matrix; | ||||
|     matrix mat(4,4); | ||||
| 
 | ||||
|     for(size_t j=0; j<mat.size2(); ++j) | ||||
|       for(size_t i=0; i<mat.size1(); ++i) | ||||
|         mat(i,j) = i*mat.size1() + j; | ||||
|     cout << "  mat = " << mat; | ||||
| 
 | ||||
|     cout << "  vec(1:4, 2:2) = " << ublas::matrix_vector_range<matrix>(mat, ublas::range(1,4), ublas::range(2,2)); | ||||
| 
 | ||||
|   } | ||||
| //  {
 | ||||
| //    cout << "\nTesting subvectors:" << endl;
 | ||||
| //
 | ||||
| //    typedef MatrixXd matrix;
 | ||||
| //    matrix mat(4,4);
 | ||||
| //
 | ||||
| //    for(size_t j=0; j<(size_t)mat.cols(); ++j)
 | ||||
| //      for(size_t i=0; i<(size_t)mat.rows(); ++i)
 | ||||
| //        mat(i,j) = i*mat.rows() + j;
 | ||||
| //    cout << "  mat = " << mat;
 | ||||
| //
 | ||||
| //    cout << "  vec(1:4, 2:2) = " << mat.block(1,2, ), ublas::range(1,4), ublas::range(2,2));
 | ||||
| //
 | ||||
| //  }
 | ||||
| 
 | ||||
|   return 0; | ||||
| 
 | ||||
|  | @ -163,10 +163,8 @@ Vector GaussianConditional::solve(const VectorValues& x) const { | |||
| /* ************************************************************************* */ | ||||
| Vector GaussianConditional::solve(const Permuted<VectorValues>& x) const { | ||||
|   Vector rhs(get_d()); | ||||
|   for (const_iterator parent = beginParents(); parent != endParents(); ++parent) { | ||||
|   for (const_iterator parent = beginParents(); parent != endParents(); ++parent) | ||||
|   	rhs += -get_S(parent) * x[*parent]; | ||||
| //    ublas::axpy_prod(-get_S(parent), x[*parent], rhs, false);
 | ||||
|   } | ||||
|   return backSubstituteUpper(get_R(), rhs, false); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -125,15 +125,6 @@ HessianFactor::HessianFactor(const GaussianFactor& gf) : info_(matrix_) { | |||
| 			info_.copyStructureFrom(jf.Ab_); | ||||
| 			BlockInfo::constBlock A = jf.Ab_.full(); | ||||
| 			matrix_.noalias() = A.transpose() * invsigmas.asDiagonal() * A; | ||||
| 
 | ||||
| 			//        typedef Eigen::Map<Eigen::MatrixXd> EigenMap;
 | ||||
| 			//        typedef typeof(EigenMap(&jf.matrix_(0,0),0,0).block(0,0,0,0)) EigenBlock;
 | ||||
| 			//        EigenBlock A(EigenMap(&jf.matrix_(0,0),jf.matrix_.rows(),jf.matrix_.cols()).block(jf.Ab_.rowStart(),jf.Ab_.offset(0), jf.Ab_.full().rows(), jf.Ab_.full().cols()));
 | ||||
| 			//        typedef typeof(Eigen::Map<Eigen::VectorXd>(&invsigmas(0),0).asDiagonal()) EigenDiagonal;
 | ||||
| 			//        EigenDiagonal R(Eigen::Map<Eigen::VectorXd>(&invsigmas(0),jf.model_->dim()).asDiagonal());
 | ||||
| 			//        info_.copyStructureFrom(jf.Ab_);
 | ||||
| 			//        EigenMap L(EigenMap(&matrix_(0,0), matrix_.rows(), matrix_.cols()));
 | ||||
| 			//        L.noalias() = A.transpose() * R * R * A;
 | ||||
| 		} | ||||
| 	} else if(dynamic_cast<const HessianFactor*>(&gf)) { | ||||
| 		const HessianFactor& hf(static_cast<const HessianFactor&>(gf)); | ||||
|  | @ -217,15 +208,6 @@ HessianFactor::constColumn HessianFactor::linear_term() const { | |||
| /* ************************************************************************* */ | ||||
| double HessianFactor::error(const VectorValues& c) const { | ||||
| 	// error 0.5*(f - 2*x'*g + x'*G*x)
 | ||||
| 
 | ||||
| 	//  	  return 0.5 * (ublas::inner_prod(c.vector(),
 | ||||
| 	//  	      ublas::prod(
 | ||||
| 	//  	          ublas::symmetric_adaptor<const constBlock,ublas::upper>(info_.range(0, this->size(), 0, this->size())),
 | ||||
| 	//  	          c.vector())) -
 | ||||
| 	//  	      2.0*ublas::inner_prod(c.vector(), info_.rangeColumn(0, this->size(), this->size(), 0)) +
 | ||||
| 	//  	      info_(this->size(), this->size())(0,0));
 | ||||
| 
 | ||||
| //	double expected_manual = 0.5 * (f - 2.0 * dxv.dot(g) + dxv.transpose() * G.selfadjointView<Eigen::Upper>() * dxv);
 | ||||
| 	const double f = constant_term(); | ||||
| 	const double xtg = c.vector().dot(linear_term()); | ||||
| 	const double xGx = c.vector().transpose() * info_.range(0, this->size(), 0, this->size()).selfadjointView<Eigen::Upper>() *	c.vector(); | ||||
|  | @ -257,9 +239,6 @@ void HessianFactor::updateATA(const HessianFactor& update, const Scatter& scatte | |||
| 		update.print("with: "); | ||||
| 	} | ||||
| 
 | ||||
| 	//  Eigen::Map<Eigen::MatrixXd> information(&matrix_(0,0), matrix_.rows(), matrix_.cols());
 | ||||
| 	//  Eigen::Map<Eigen::MatrixXd> updateInform(&update.matrix_(0,0), update.matrix_.rows(), update.matrix_.cols());
 | ||||
| 
 | ||||
| 	// Apply updates to the upper triangle
 | ||||
| 	tic(3, "update"); | ||||
| 	assert(this->info_.nBlocks() - 1 == scatter.size()); | ||||
|  | @ -318,8 +297,6 @@ void HessianFactor::updateATA(const JacobianFactor& update, const Scatter& scatt | |||
| 		update.print("with: "); | ||||
| 	} | ||||
| 
 | ||||
| 	//  Eigen::Map<Eigen::MatrixXd> information(&matrix_(0,0), matrix_.rows(), matrix_.cols());
 | ||||
| 	//  Eigen::Map<Eigen::MatrixXd> updateAf(&update.matrix_(0,0), update.matrix_.rows(), update.matrix_.cols());
 | ||||
| 	Eigen::Block<typeof(update.matrix_)> updateA(update.matrix_.block( | ||||
| 			update.Ab_.rowStart(),update.Ab_.offset(0), update.Ab_.full().rows(), update.Ab_.full().cols())); | ||||
| 
 | ||||
|  | @ -463,11 +440,6 @@ HessianFactor::splitEliminatedFactor(size_t nrFrontals, const vector<Index>& key | |||
| 			tic(1, "zero"); | ||||
| 			BlockAb::Block remainingMatrix(Ab.range(0, Ab.nBlocks())); | ||||
| 			zeroBelowDiagonal(remainingMatrix); | ||||
| //				for(size_t j = 0; j < (size_t) remainingMatrix.rows() - 1; ++j) {
 | ||||
| //					remainingMatrix.col(j).tail(remainingMatrix.rows() - (j+1)).setZero();
 | ||||
| 					//          ublas::matrix_column<BlockAb::Block> col(ublas::column(remainingMatrix, j));
 | ||||
| 					//          std::fill(col.begin() + j+1, col.end(), 0.0);
 | ||||
| //				}
 | ||||
| 			toc(1, "zero"); | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
|  | @ -256,11 +256,9 @@ namespace gtsam { | |||
|     j = 0; | ||||
|     BOOST_FOREACH(const SourceSlots::value_type& sourceSlot, sourceSlots) { | ||||
|       keys_[j] = sourceSlot.first; | ||||
|       Ab_(j++) = oldAb(sourceSlot.second); | ||||
| //      ublas::noalias(Ab_(j++)) = oldAb(sourceSlot.second);
 | ||||
|       Ab_(j++).noalias() = oldAb(sourceSlot.second); | ||||
|     } | ||||
|     Ab_(j) = oldAb(j); | ||||
| //    ublas::noalias(Ab_(j)) = oldAb(j);
 | ||||
|     Ab_(j).noalias() = oldAb(j); | ||||
| 
 | ||||
|     // Since we're permuting the variables, ensure that entire rows from this
 | ||||
|     // factor are copied when Combine is called
 | ||||
|  | @ -378,6 +376,8 @@ namespace gtsam { | |||
|     if(debug) cout << "Eliminating " << nrFrontals << " frontal variables" << endl; | ||||
|     if(debug) this->print("Eliminating JacobianFactor: "); | ||||
| 
 | ||||
|     // NOTE: stairs are not currently used in the Eigen QR implementation
 | ||||
|     // add this back if DenseQR is ever reimplemented
 | ||||
| //    tic(1, "stairs");
 | ||||
| //    // Translate the left-most nonzero column indices into top-most zero row indices
 | ||||
| //    vector<int> firstZeroRows(Ab_.cols());
 | ||||
|  | @ -441,7 +441,6 @@ namespace gtsam { | |||
|       size_t varDim = Ab_(0).cols(); | ||||
|       Ab_.rowEnd() = Ab_.rowStart() + varDim; | ||||
|       const Eigen::VectorBlock<const Vector> sigmas = noiseModel->sigmas().segment(Ab_.rowStart(), Ab_.rowEnd()-Ab_.rowStart()); | ||||
| //      const ublas::vector_range<const Vector> sigmas(noiseModel->sigmas(), ublas::range(Ab_.rowStart(), Ab_.rowEnd()));
 | ||||
|       conditionals->push_back(boost::make_shared<ConditionalType>(begin()+j, end(), 1, Ab_, sigmas)); | ||||
|       if(debug) conditionals->back()->print("Extracted conditional: "); | ||||
|       Ab_.rowStart() += varDim; | ||||
|  | @ -521,14 +520,11 @@ namespace gtsam { | |||
| 			if (source.firstNonzeroBlocks_[sourceRow] <= sourceSlot) { | ||||
| 				const constABlock sourceBlock(source.Ab_(sourceSlot)); | ||||
| 				combinedBlock.row(row).noalias() = sourceBlock.row(sourceRow); | ||||
| //				ublas::noalias(ublas::row(combinedBlock, row)) = ublas::row(sourceBlock, sourceRow);
 | ||||
| 			} else { | ||||
| 				combinedBlock.row(row).setZero(); | ||||
| //				ublas::noalias(ublas::row(combinedBlock, row)) = ublas::zero_vector<double>(combinedBlock.cols());
 | ||||
| 			} | ||||
| 		} else { | ||||
| 			combinedBlock.row(row).setZero(); | ||||
| //			ublas::noalias(ublas::row(combinedBlock, row)) = ublas::zero_vector<double>(combinedBlock.cols());
 | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -35,16 +35,7 @@ | |||
| static double inf = std::numeric_limits<double>::infinity(); | ||||
| using namespace std; | ||||
| 
 | ||||
| /** implement the export code for serialization */ | ||||
| // FIXME: doesn't work outside of the library
 | ||||
| //BOOST_CLASS_EXPORT_IMPLEMENT(gtsam::noiseModel::Constrained);
 | ||||
| //BOOST_CLASS_EXPORT_IMPLEMENT(gtsam::noiseModel::Diagonal);
 | ||||
| //BOOST_CLASS_EXPORT_IMPLEMENT(gtsam::noiseModel::Gaussian);
 | ||||
| //BOOST_CLASS_EXPORT_IMPLEMENT(gtsam::noiseModel::Unit);
 | ||||
| //BOOST_CLASS_EXPORT_IMPLEMENT(gtsam::noiseModel::Isotropic);
 | ||||
| 
 | ||||
| namespace gtsam { | ||||
| 
 | ||||
| namespace noiseModel { | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  | @ -57,15 +48,6 @@ template<class MATRIX> | |||
| void updateAb(MATRIX& Ab, int j, const Vector& a, const Vector& rd) { | ||||
| 	size_t n = Ab.cols()-1; | ||||
| 	Ab.middleCols(j+1,n-j) -= a * rd.segment(j+1, n-j).transpose(); | ||||
| //	size_t m = Ab.rows(), n = Ab.cols()-1;
 | ||||
| //	for (size_t i = 0; i < m; i++) { // update all rows
 | ||||
| //		double ai = a(i);
 | ||||
| //		double *Aij = Ab.data() + i * (n+1) + j + 1;
 | ||||
| //		const double *rptr = rd.data() + j + 1;
 | ||||
| //		// Ab(i,j+1:end) -= ai*rd(j+1:end)
 | ||||
| //		for (size_t j2 = j + 1; j2 < n+1; j2++, Aij++, rptr++)
 | ||||
| //			*Aij -= ai * (*rptr);
 | ||||
| //	}
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -504,14 +504,4 @@ namespace gtsam { | |||
| 
 | ||||
| } // namespace gtsam
 | ||||
| 
 | ||||
| /** Export keys for serialization */ | ||||
| // FIXME: doesn't actually work outside of the library
 | ||||
| //#include <boost/serialization/export.hpp>
 | ||||
| //#include <boost/serialization/extended_type_info.hpp>
 | ||||
| //BOOST_CLASS_EXPORT_KEY2(gtsam::noiseModel::Constrained, "gtsam_noiseModel_Constrained");
 | ||||
| //BOOST_CLASS_EXPORT_KEY2(gtsam::noiseModel::Diagonal, "gtsam_noiseModel_Diagonal");
 | ||||
| //BOOST_CLASS_EXPORT_KEY2(gtsam::noiseModel::Gaussian, "gtsam_noiseModel_Gaussian");
 | ||||
| //BOOST_CLASS_EXPORT_KEY2(gtsam::noiseModel::Unit, "gtsam_noiseModel_Unit");
 | ||||
| //BOOST_CLASS_EXPORT_KEY2(gtsam::noiseModel::Isotropic, "gtsam_noiseModel_Isotropic");
 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -36,7 +36,7 @@ | |||
| 
 | ||||
| #include <gtsam/nonlinear/Ordering.h> | ||||
| 
 | ||||
| // FIXME: is this necessary? These don't even fit the right format
 | ||||
| // FIXME: is this necessary?
 | ||||
| #define INSTANTIATE_NONLINEAR_FACTOR1(C,J) \ | ||||
|   template class gtsam::NonlinearFactor1<C,J>; | ||||
| #define INSTANTIATE_NONLINEAR_FACTOR2(C,J1,J2) \ | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue