| Re: [eigen] Using custom scalar types | 
[ Thread Index | 
Date Index
| More lists.tuxfamily.org/eigen Archives
] 
On Sat, 16 Jun 2012, Brad Bell wrote:
Looking at the example in
http://eigen.tuxfamily.org/dox/TopicCustomizingEigen.html#CustomScalarType
one sees
    ... snip ...
    IsInteger = 0,
    IsSigned,
    ReadCost = 1,
I suspect that IsSigned should be 1 for this example ?
Based on unstable/Eigen/AdolcForward, I'd say that you are right.
Furthermore, one also sees
    ... snip ...
    inline adouble internal::sin(const adouble& x) { return sin(x); }
inline adouble internal::cos(const adouble& x) { return cos(x); }
inline adouble internal::pow(const adouble& x, adouble y) { return
pow(x, y); }
    ... snip ...
Is this a typo, or should the argument y be passed by value instead of
by const reference ?
I suppose this is a typo.
It looks like 
https://bitbucket.org/eigen/eigen/src/tip/unsupported/Eigen/AdolcForward 
is severely out-of-date. I don't think it even compiles. I replaced it 
with the version at the end of this message, which is hopefully more 
correct.
Thanks for your report,
Jitse
---------------------------------------
#ifndef ADOLCSUPPORT_H
#define ADOLCSUPPORT_H
#define ADOLC_TAPELESS
#include <adolc/adouble.h>
#include <Eigen/Core>
namespace Eigen {
template<> struct NumTraits<adtl::adouble>
{
  typedef adtl::adouble Real;
  typedef adtl::adouble NonInteger;
  typedef adtl::adouble Nested;
  enum {
    IsComplex = 0,
    IsInteger = 0,
    IsSigned = 1,
    RequireInitialization = 1,
    ReadCost = 1,
    AddCost = 1,
    MulCost = 1
  };
};
}
namespace Eigen {
  namespace internal {
    inline const adtl::adouble& conj(const adtl::adouble& x)  { return x; }
    inline const adtl::adouble& real(const adtl::adouble& x)  { return x; }
    inline adtl::adouble imag(const adtl::adouble&)    { return 0.; }
    inline adtl::adouble abs(const adtl::adouble&  x)  { return adtl::fabs(x); }
    inline adtl::adouble abs2(const adtl::adouble& x)  { return x*x; }
    using adtl::sqrt;
    using adtl::exp;
    using adtl::log;
    using adtl::sin;
    using adtl::cos;
    using adtl::pow;
  }
}
#endif // ADOLCSUPPORT_H