[CppAD] cout problem with AD<double> based Eigen vector
Brad Bell
bradbell at seanet.com
Sat Apr 20 00:48:38 EDT 2013
I am able to recreate this problem below with eigen-3.1.3 and the
current CppAD trunk
https://projects.coin-or.org/CppAD/browser/trunk
using the code:
---------------------------------------
# include <cppad/cppad.hpp>
# include <cppad/example/cppad_eigen.hpp>
int main()
{
typedef Eigen::Matrix< CppAD::AD<double>, 1, 1> MatrixAD;
MatrixAD X;
X(0, 0) = 1;
std::cout << X << std::endl;
return 0;
}
--------------------------------------------------
The corresponding error message is:
.../Eigen/src/Core/IO.h:132:97: error: no matching function for call to
‘ceil(CppAD::AD<double>)’
Looking at the code in IO.h, line 132, we have:
return
cast<RealScalar,int>(ceil(-log(NumTraits<RealScalar>::epsilon())/log(RealScalar(10))));
So it appears that Eigen requires its scalar types to support the ceil
function as well as casting to integer values, but I do not see any
reference to how one is supposed to support the cast under the heading
Using Custom Scalar Types
on the page
http://eigen.tuxfamily.org/dox-devel/TopicCustomizingEigen.html
but it appears to require
static_cast<int>( AD<double> )
AD<double> only has the explicit Integer function
http://www.coin-or.org/CppAD/Doc/integer.xml
instead of the casting operator so as to make it explicit that the
corresponding AD information is lost. It appears that
static_cast<int>( AD<double> )
must be added to in order to get Eigen to work.
On 04/19/2013 01:29 PM, Di Liu wrote:
> Hello,
>
> I am trying to do "cout << X", where X is of
> Eigen::Matrix<AD<double>,Dynamic,Dynamic> . However, the GNU g++
> compiler gives me errors such as:" lib/eigen/Eigen/src/Core/IO.h:132:
> error: no matching function for call to ‘ceil(CppAD::AD<double>)"
>
> The original code is:
>
> #include <cppad/cppad.hpp>
> #include <cppad/example/cppad_eigen.hpp>
> #include <iostream>
>
> using CppAD::AD;
> using namespace Eigen;
> using std::cout;
> using std::endl;
>
> int main()
> {
> size_t n=2;
> typedef Matrix< AD<double>,Dynamic,Dynamic > MatrixXAD;
> MatrixXAD X(2,2);
> X<< 1, 2,
> 3,4;
> /*
> for (int i=0;i<4;++i)
> cout << X(i)<<endl;
> */
> cout << X;
> }
>
> Thank you very much.
>
> Di
>
> _______________________________________________
> CppAD mailing list
> CppAD at list.coin-or.org
> http://list.coin-or.org/mailman/listinfo/cppad
>
More information about the CppAD
mailing list