diff --git a/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h b/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h index 2db914765..88edd6b72 100755 --- a/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h +++ b/unsupported/Eigen/src/AutoDiff/AutoDiffScalar.h @@ -453,6 +453,24 @@ struct auto_diff_special_op<_DerType, false> void operator+() const; }; +template +void make_coherent_expression(CwiseBinaryOp xpr, const RefType &ref) +{ + make_coherent(xpr.const_cast_derived().lhs(), ref); + make_coherent(xpr.const_cast_derived().rhs(), ref); +} + +template +void make_coherent_expression(const CwiseUnaryOp &xpr, const RefType &ref) +{ + make_coherent(xpr.nestedExpression().const_cast_derived(), ref); +} + +// needed for compilation only +template +void make_coherent_expression(const CwiseNullaryOp &, const RefType &) +{} + template struct make_coherent_impl, B> { typedef Matrix A; @@ -462,6 +480,10 @@ struct make_coherent_impl struct make_coherent_impl, - Matrix > { + Matrix > { typedef Matrix A; typedef Matrix B; static void run(A& a, B& b) { diff --git a/unsupported/test/autodiff.cpp b/unsupported/test/autodiff.cpp index bafea6ae9..2cea56ba5 100644 --- a/unsupported/test/autodiff.cpp +++ b/unsupported/test/autodiff.cpp @@ -352,6 +352,21 @@ double bug_1264() { return v2(0).value(); } +// check with expressions on constants +double bug_1281() { + int n = 2; + typedef AutoDiffScalar AD; + const AD c = 1.; + AD x0(2,n,0); + AD y1 = (AD(c)+AD(c))*x0; + y1 = x0 * (AD(c)+AD(c)); + AD y2 = (-AD(c))+x0; + y2 = x0+(-AD(c)); + AD y3 = (AD(c)*(-AD(c))+AD(c))*x0; + y3 = x0 * (AD(c)*(-AD(c))+AD(c)); + return (y1+y2+y3).value(); +} + #endif EIGEN_DECLARE_TEST(autodiff) @@ -367,5 +382,6 @@ EIGEN_DECLARE_TEST(autodiff) CALL_SUBTEST_5( bug_1223() ); CALL_SUBTEST_5( bug_1260() ); CALL_SUBTEST_5( bug_1261() ); + CALL_SUBTEST_5( bug_1281() ); }