Codebase list cppad / upstream/2014.03.01 test_more / cppad_eigen.cpp
upstream/2014.03.01

Tree @upstream/2014.03.01 (Download .tar.gz)

cppad_eigen.cpp @upstream/2014.03.01raw · history · blame

/* $Id: cppad_eigen.cpp 3070 2013-12-31 15:09:11Z bradbell $ */
/* --------------------------------------------------------------------------
CppAD: C++ Algorithmic Differentiation: Copyright (C) 2003-13 Bradley M. Bell

CppAD is distributed under multiple licenses. This distribution is under
the terms of the 
                    Eclipse Public License Version 1.0.

A copy of this license is included in the COPYING file of this distribution.
Please visit http://www.coin-or.org/CppAD/ for information on other licenses.
-------------------------------------------------------------------------- */

/*
Test of Eigen Interface to CppAD Scalar Types
$end
*/
# include <cppad/example/cppad_eigen.hpp>

bool cppad_eigen(void)
{	bool ok = true;
	using CppAD::AD;
	using Eigen::Dynamic;
	using Eigen::Matrix;

	typedef Eigen::NumTraits<AD<double> >         traits;

	ok &= traits::IsComplex              == 0;
	ok &= traits::IsInteger              == 0;
	ok &= traits::IsSigned               == 1;
	ok &= traits::RequireInitialization  == 1;
	ok &= traits::ReadCost               == 1;
	ok &= traits::AddCost                == 2;
	ok &= traits::MulCost                == 2;

	ok &= traits::epsilon() == 
		std::numeric_limits<double>::epsilon();
	ok &= traits::dummy_precision() == 
		100.* std::numeric_limits<double>::epsilon();
	ok &= traits::highest() == 
		std::numeric_limits<double>::max();
	ok &= traits::lowest() == 
		std::numeric_limits<double>::min();

	AD<double> x = 2.0;
	ok  &= conj(x)  == x;
	ok  &= real(x)  == x;
	ok  &= imag(x)  == 0.0;
	ok  &= abs2(x)  == 4.0;

	// Outputing a matrix used to fail before partial specialization of
	// struct significant_decimals_default_impl in cppad_eigen.hpp. 
	Matrix< AD<double>, 1, 1> X;
	X(0, 0) = AD<double>(1);
	std::stringstream stream_out;
	stream_out << X;
	ok &= "1" == stream_out.str();

# if ! CPPAD_IMPLICIT_CTOR_FROM_ANY_TYPE 
	// multiplying three matrices together used to cause warning
	// before making ctor from arbitrary type to AD<Base> explicit.
	typedef CppAD::AD<double> AScalar;
	Matrix<AScalar, Dynamic, Dynamic> A(1,1), B(1,1), C(1,1), D(1,1);
	A(0,0) = 1.0;
	B(0,0) = 2.0;
	C(0,0) = 3.0;
	D      = A * B * C; 
	ok    &= D(0,0) == 6.0 ;
# endif
	
	return ok;
}