Re: [eigen] Re: "overloaded operator '*' is ambiguous..." in Eigen 3.3 ffa8356 |
[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]
Hi,a simpler failing example is:Eigen::Matrix<stan::math::fvar<double>, Eigen::Dynamic, Eigen::Dynamic> m(2, 2); m * m;the problem is that stan::math::fvar exposes a generic implicit constructor making it as if it can be converted from everything. More precisely, std::is_convertible<X,fvar> thus returns true for any type X, including an Eigen::Matrix<fvar>. In m * m, one of the factor can thus be interpreted as a compatible scalar.This has to be fixed in fvar, for instance using SFINAE to enable the generic ctor only for valid types.gaelOn Mon, Oct 31, 2016 at 4:09 PM, Daniel Lee <bearlee@xxxxxxxxxxxx> wrote:And thanks! I accidentally hit send before finishing.Any help making it more minimal or if you know how operators have changed would probably be enough for me to create a simpler example.DanielOn Mon, Oct 31, 2016 at 11:08 AM, Daniel Lee <bearlee@xxxxxxxxxxxx> wrote:Hi all,First, thanks Gael for fixing the last bug! I missed the notification from the list when you first posted it.On to the current bug. I want to apologize: I don't have a minimal working example demonstrating this issue. It would help me to figure out how to trap / create a minimal example out of this for future reference.I'm using the Stan Math library (https://github.com/stan-dev/math.git ) on this branch: feature/0187-eigen-3.3The example I'm working with right now is this and it fails to compile (if you put this in test/tmp_test.cpp, it's easy to run using: ./runTests.py test/tmp_test.cpp).#include <stan/math/fwd/mat.hpp>#include <gtest/gtest.h>TEST(int, main) {Eigen::Matrix<stan::math::fvar<double>, Eigen::Dynamic, Eigen::Dynamic> m(2, 2); m << 4, 1, 1, 4;Eigen::LLT<Eigen::Matrix<stan::math::fvar<double>, Eigen::Dynamic, Eigen::Dynamic> > llt(m.rows());llt.compute(m);}That last line, llt.compute(m), creates a slew of compiler messages. Any suggestions on how to trap this? This code works with Eigen 3.2.9. The only things that changed within the Stan Math library pertaining to the type stan::math::fvar<double> is the implementation of static int digits10() for printing.clang++ -I . -isystem lib/eigen_3.3.ffa8356 -isystem lib/boost_1.60.0 -isystemlib/cvodes_2.9.0/include -Wall -DBOOST_RESULT_OF_USE_TR1 -DBOOST_NO_DECLTYPE -DBOOST_DISABLE_ASSERTS -DNO_FPRINTF_OUTPUT -pipe -I/usr/local/opt/llvm/include -Wno-unknown-warning-option -Wno-unused-function -Wno-tautological-compare -Wno-c++11-long-long -Wsign-compare -Wno-unused-local-typedef -ftemplate-depth=256 -c -O3 -DGTEST_USE_OWN_TR1_TUPLE -Wc++11-extensions -Wno-c++11-long-long -isystem lib/gtest_1.7.0/include -isystem lib/gtest_1.7.0 test/tmp_test.cpp -o test/tmp_test.o In file included from test/tmp_test.cpp:2:In file included from ./stan/math/fwd/mat.hpp:8:In file included from ./stan/math/fwd/mat/vectorize/apply_scalar_unary.hpp:4: In file included from ./stan/math/prim/mat/vectorize/apply_scalar_unary.hpp:4: In file included from lib/eigen_3.3.ffa8356/Eigen/Dense:3: In file included from lib/eigen_3.3.ffa8356/Eigen/Cholesky:31: lib/eigen_3.3.ffa8356/Eigen/src/Cholesky/LLT.h:321:45: error: use of overloaded operator '*' is ambiguous (with operand types 'Block<Eigen::Matrix<stan::math::fvar<double>, -1, -1, 0, -1, -1>, Dynamic, Dynamic>' and 'const AdjointReturnType' (aka 'const Eigen::Transpose<constEigen::Block<Eigen::Matrix<stan::math::fvar<double>, -1, -1, 0, -1, -1>, 1, -1, false> >')) if (k>0 && rs>0) A21.noalias() -= A20 * A10.adjoint();~~~ ^ ~~~~~~~~~~~~~lib/eigen_3.3.ffa8356/Eigen/src/Cholesky/LLT.h:333:14: note: in instantiation of function template specialization 'Eigen::internal::llt_inplace<stan::math::fvar<double>, 1>::unblocked<Eigen::Matrix<stan::math::fvar<double>, -1, -1, 0, -1, -1> >' requested here return unblocked(m);^lib/eigen_3.3.ffa8356/Eigen/src/Cholesky/LLT.h:397:61: note: in instantiation of function template specialization 'Eigen::internal::llt_inplace<stan::math::fvar<double>, 1>::blocked<Eigen::Matrix<stan::math::fvar<double>, -1, -1, 0, -1, -1> >' requested here { return llt_inplace<typename MatrixType::Scalar, Lower>::blocked(m)==-1; }^lib/eigen_3.3.ffa8356/Eigen/src/Cholesky/LLT.h:444:21: note: in instantiation of member function 'Eigen::internal::LLT_Traits<Eigen::Matrix<stan::math::fvar< double>, -1, -1, 0, -1, -1>, 1>::inplace_decomposition' requested herebool ok = Traits::inplace_decomposition(m_matrix); ^test/tmp_test.cpp:12:7: note: in instantiation of function template specialization'Eigen::LLT<Eigen::Matrix<stan::math::fvar<double>, -1, -1, 0, -1, -1>, 1>::compute<Eigen::Matrix<stan::math::fvar<double>, -1, -1, 0, -1, -1> >' requested here llt.compute(m);^lib/eigen_3.3.ffa8356/Eigen/src/SparseCore/../plugins/Common CwiseBinaryOps.h:50:29: note: candidate function [with T = Eigen::Block<Eigen::Matrix<stan::math::fvar<double>, -1, -1, 0, -1, -1>, -1, -1, false>]EIGEN_MAKE_SCALAR_BINARY_OP(operator*,product) ^lib/eigen_3.3.ffa8356/Eigen/src/SparseCore/../plugins/Common CwiseBinaryOps.h:50:29: note: candidate function [with T = Eigen::Transpose<const Eigen::Block<Eigen::Matrix<stan::math::fvar<double>, -1, -1, 0, -1, -1>, 1, -1, false> >]lib/eigen_3.3.ffa8356/Eigen/src/Core/MatrixBase.h:173:5: note: candidate function [with OtherDerived = Eigen::Transpose<const Eigen::Block<Eigen::Matrix<stan::math::fvar<double>, -1, -1, 0, -1, -1>, 1, -1, false> >]operator*(const MatrixBase<OtherDerived> &other) const;^In file included from test/tmp_test.cpp:2:In file included from ./stan/math/fwd/mat.hpp:8:In file included from ./stan/math/fwd/mat/vectorize/apply_scalar_unary.hpp:4: In file included from ./stan/math/prim/mat/vectorize/apply_scalar_unary.hpp:4: In file included from lib/eigen_3.3.ffa8356/Eigen/Dense:3: In file included from lib/eigen_3.3.ffa8356/Eigen/Cholesky:31: lib/eigen_3.3.ffa8356/Eigen/src/Cholesky/LLT.h:321:45: error: use of overloaded operator '*' is ambiguous (with operand types 'Block<Eigen::Block<Eigen::Matrix<stan::math::fvar<double>, -1, -1, 0, -1, -1>, -1, -1, false>, Dynamic, Dynamic>' and 'const AdjointReturnType' (aka 'constEigen::Transpose<const Eigen::Block<Eigen::Block<Eigen::Matrix<stan::math::fvar<dou ble>, -1, -1, 0, -1, -1>, -1, -1, false>, 1, -1, false> >'))if (k>0 && rs>0) A21.noalias() -= A20 * A10.adjoint();~~~ ^ ~~~~~~~~~~~~~lib/eigen_3.3.ffa8356/Eigen/src/Cholesky/LLT.h:352:15: note: in instantiation of function template specialization 'Eigen::internal::llt_inplace<stan::math::fvar<double>, 1>::unblocked<Eigen::Block<Eigen::Matrix<stan::math::fvar<do uble>, -1, -1, 0, -1, -1>, -1, -1, false> >' requested hereif((ret=unblocked(A11))>=0) return k+ret;^lib/eigen_3.3.ffa8356/Eigen/src/Cholesky/LLT.h:397:61: note: in instantiation of function template specialization 'Eigen::internal::llt_inplace<stan::math::fvar<double>, 1>::blocked<Eigen::Matrix<stan::math::fvar<double>, -1, -1, 0, -1, -1> >' requested here { return llt_inplace<typename MatrixType::Scalar, Lower>::blocked(m)==-1; }^lib/eigen_3.3.ffa8356/Eigen/src/Cholesky/LLT.h:444:21: note: in instantiation of member function 'Eigen::internal::LLT_Traits<Eigen::Matrix<stan::math::fvar< double>, -1, -1, 0, -1, -1>, 1>::inplace_decomposition' requested herebool ok = Traits::inplace_decomposition(m_matrix); ^test/tmp_test.cpp:12:7: note: in instantiation of function template specialization'Eigen::LLT<Eigen::Matrix<stan::math::fvar<double>, -1, -1, 0, -1, -1>, 1>::compute<Eigen::Matrix<stan::math::fvar<double>, -1, -1, 0, -1, -1> >' requested here llt.compute(m);^lib/eigen_3.3.ffa8356/Eigen/src/SparseCore/../plugins/Common CwiseBinaryOps.h:50:29: note: candidate function [with T = Eigen::Block<Eigen::Block<Eigen::Matrix<stan::math::fvar<dou ble>, -1, -1, 0, -1, -1>, -1, -1, false>, -1, -1, false>]EIGEN_MAKE_SCALAR_BINARY_OP(operator*,product) ^lib/eigen_3.3.ffa8356/Eigen/src/SparseCore/../plugins/Common CwiseBinaryOps.h:50:29: note: candidate function [with T = Eigen::Transpose<constEigen::Block<Eigen::Block<Eigen::Matrix<stan::math::fvar<dou ble>, -1, -1, 0, -1, -1>, -1, -1, false>, 1, -1, false> >]lib/eigen_3.3.ffa8356/Eigen/src/Core/MatrixBase.h:173:5: note: candidate function [with OtherDerived = Eigen::Transpose<const Eigen::Block<Eigen::Block<Eigen::Matrix<stan::math::fvar<dou ble>, -1, -1, 0, -1, -1>, -1, -1, false>, 1, -1, false> >]operator*(const MatrixBase<OtherDerived> &other) const;^2 errors generated.make: *** [test/tmp_test.o] Error 1make test/tmp_test failedexit now (10/31/16 11:04:33 EDT)
Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |