-
Notifications
You must be signed in to change notification settings - Fork 237
Open
Description
Currently, the templated copy constructor for autodiff::fvar
interferes with Eigen's lazy evaluation, and, in my experience, produces two types of errors:
- Ambiguous operators
- Example error:
ambiguous overload for ‘operator*’ (operand types are ‘Eigen::Transpose<Eigen::Matrix<boost::math::differentiation::autodiff_v1::detail::fvar<double, 1>, 4, 1> >’ and ‘Eigen::Matrix<boost::math::differentiation::autodiff_v1::detail::fvar<double, 1>, 4, 1>’)
- Failed attempts to
static_cast
a matrix into an fvar
- Example error:
error: invalid ‘static_cast’ from type ‘const Eigen::CwiseUnaryOp<Eigen::internal::scalar_cast_op<double, boost::math::differentiation::autodiff_v1::detail::fvar<double, 1> >, const Eigen::Matrix<double, 4, 4> >’ to type ‘double’
A solution would be to only define the constructor for types that are convertible to the fvar's RealType. A colleague and I worked out a potential fix using SFINAE that I'm currently testing against the existing test_autodiff
files. Tests 1-3 have succeeded with the existing travis configuration, but I'm having issues in test_autodiff_4 with boost::has_right_shift
as called from boost::lexical_cast
.
Is there any interest in merging a solution to this problem? I can post the work I've done so far.
Activity
NAThompson commentedon Aug 26, 2020
@wgledbetter : Yes, we're interested.
@pulver : Can your review the PR when it shows up?
pulver commentedon Aug 26, 2020
The build errors @wgledbetter forewarned of are on https://travis-ci.org/github/boostorg/math/builds/721216811
In case this helps someone diagnose this, the larger context in
boost/lexical_cast/detail/converter_lexical.hpp
where this is called is:This appears to be called when the RealType is a multiprecision:
../../../boost/lexical_cast/detail/converter_lexical.hpp: In instantiation of ‘struct boost::detail::deduce_target_char_impl<boost::detail::deduce_character_type_later<boost::math::differentiation::autodiff_v1::detail::fvar<boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50u> >, 5ul> > >’
wgledbetter commentedon Aug 26, 2020
I was able to solve this problem by creating an
operator>>
for fvar that behaves likeoperator=
. Now I'm getting all autodiff tests to pass.Just a side note, I got this same has_right_shift error with RealType = double on my personal machine with clang-10 and gcc-10 and c++-17, but the new update on #425 fixes it, too.