Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

compilation error using pmax with + #1488

Open
paciorek opened this issue Aug 19, 2024 · 1 comment
Open

compilation error using pmax with + #1488

paciorek opened this issue Aug 19, 2024 · 1 comment
Labels

Comments

@paciorek
Copy link
Contributor

If I try to add the result of pmax to another vector, I get a compilation error. I suspect it has something to do with the type of the output of pmax, but I haven't investigated further. As seen below, passing the result of pmax into sum is fine.

nf <- nimbleFunction(
    run = function(x = double(1), z = double(1)) {
        returnType(double())
        ## return(sum(pmax(x, z)) + sum(log1p(exp(-abs(x)))))  # succeeds
        return(sum(pmax(x,z) + log1p(exp(-abs(x)))))           # compilation error
    }
)
cnf <- compileNimble(nf, showCompilerOutput = TRUE)
cnf(rnorm(20), rep(0,20))
Compiling
  [Note] This may take a minute.
  [Note] On some systems there may be some compiler warnings that can be safely ignored.
Error: Failed to create the shared library.
g++ -std=gnu++17 -I"/usr/share/R/include" -DNDEBUG -DR_NO_REMAP   -DEIGEN_MPL2_ONLY=1 -I"/accounts/vis/paciorek/R/x86_64-pc-linux-gnu-library-ubuntu-22.04/4.4/nimble/include" -Wno-misleading-indentation -Wno-ignored-attributes -Wno-deprecated-declarations      -fpic  -g -O2 -ffile-prefix-map=/build/r-base-H8urij/r-base-4.4.0=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2   -c P_4_rcFun_R_GlobalEnv6.cpp -o P_4_rcFun_R_GlobalEnv6.o
using C++ compiler: ‘g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0’
P_4_rcFun_R_GlobalEnv6.cpp: In function ‘double rcFun_R_GlobalEnv6(NimArr<1, double>&, NimArr<1, double>&)’:
P_4_rcFun_R_GlobalEnv6.cpp:29:85: error: no match for ‘operator+’ (operand types are ‘const Eigen::CwiseBinaryOp<Eigen::internal::scalar_max_op<double, double, 0>, const Eigen::ArrayWrapper<Eigen::Map<Eigen::Matrix<double, -1, -1>, 0, Eigen::Stride<-1, -1> > >, const Eigen::ArrayWrapper<Eigen::Map<Eigen::Matrix<double, -1, -1>, 0, Eigen::Stride<-1, -1> > > >’ and ‘const Eigen::MatrixWrapper<const Eigen::CwiseUnaryOp<std::function<double(double)>, const Eigen::CwiseUnaryOp<Eigen::internal::scalar_exp_op<double>, const Eigen::ArrayWrapper<const Eigen::CwiseUnaryOp<Eigen::internal::scalar_opposite_op<double>, const Eigen::CwiseUnaryOp<Eigen::internal::scalar_abs_op<double>, const Eigen::Map<Eigen::Matrix<double, -1, -1>, 0, Eigen::Stride<-1, -1> > > > > > > >’)
   29 | Interm_99 = (((Eig_ARG1_x_Interm_100).array()).max((Eig_ARG2_z_Interm_101).array()) + ((((-((Eig_ARG1_x_Interm_102).cwiseAbs())).array()).exp()).unaryExpr(std::function< double(double) >( static_cast<double (*)(double)>(&log1p)))).matrix()).sum();
      |              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                                                   |                                                                                                                                                                                          |
      |                                                   |                                                                                                                                                                                          const Eigen::MatrixWrapper<const Eigen::CwiseUnaryOp<std::function<double(double)>, const Eigen::CwiseUnaryOp<Eigen::internal::scalar_exp_op<double>, const Eigen::ArrayWrapper<const Eigen::CwiseUnaryOp<Eigen::internal::scalar_opposite_op<double>, const Eigen::CwiseUnaryOp<Eigen::internal::scalar_abs_op<double>, const Eigen::Map<Eigen::Matrix<double, -1, -1>, 0, Eigen::Stride<-1, -1> > > > > > > >
      |                                                   const Eigen::CwiseBinaryOp<Eigen::internal::scalar_max_op<double, double, 0>, const Eigen::ArrayWrapper<Eigen::Map<Eigen::Matrix<double, -1, -1>, 0, Eigen::Stride<-1, -1> > >, const Eigen::ArrayWrapper<Eigen::Map<Eigen::Matrix<double, -1, -1>, 0, Eigen::Stride<-1, -1> > > >
In file included from /accounts/vis/paciorek/R/x86_64-pc-linux-gnu-library-ubuntu-22.04/4.4/nimble/include/Eigen/Core:19,
                 from /accounts/vis/paciorek/R/x86_64-pc-linux-gnu-library-ubuntu-22.04/4.4/nimble/include/Eigen/Dense:1,
                 from /accounts/vis/paciorek/R/x86_64-pc-linux-gnu-library-ubuntu-22.04/4.4/nimble/include/nimble/EigenTypedefs.h:24,
                 from P_4_rcFun_R_GlobalEnv6.cpp:8:
/accounts/vis/paciorek/R/x86_64-pc-linux-gnu-library-ubuntu-22.04/4.4/nimble/include/Eigen/src/Core/../plugins/CommonCwiseBinaryOps.h:27:28: note: candidate: ‘template<class OtherDerived> const Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, typename Eigen::internal::traits<OtherDerived>::Scalar>, const Derived, const OtherDerived> Eigen::ArrayBase<Derived>::operator+(const Eigen::ArrayBase<OtherDerived>&) const [with OtherDerived = OtherDerived; Derived = Eigen::CwiseBinaryOp<Eigen::internal::scalar_max_op<double, double, 0>, const Eigen::ArrayWrapper<Eigen::Map<Eigen::Matrix<double, -1, -1>, 0, Eigen::Stride<-1, -1> > >, const Eigen::ArrayWrapper<Eigen::Map<Eigen::Matrix<double, -1, -1>, 0, Eigen::Stride<-1, -1> > > >]’
   27 | EIGEN_MAKE_CWISE_BINARY_OP(operator+,sum)
      |                            ^~~~~~~~
/accounts/vis/paciorek/R/x86_64-pc-linux-gnu-library-ubuntu-22.04/4.4/nimble/include/Eigen/src/Core/util/Macros.h:1339:4: note: in definition of macro ‘EIGEN_MAKE_CWISE_BINARY_OP’
 1339 |   (METHOD)(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const \
      |    ^~~~~~
/accounts/vis/paciorek/R/x86_64-pc-linux-gnu-library-ubuntu-22.04/4.4/nimble/include/Eigen/src/Core/../plugins/CommonCwiseBinaryOps.h:27:28: note:   template argument deduction/substitution failed:
   27 | EIGEN_MAKE_CWISE_BINARY_OP(operator+,sum)
      |                            ^~~~~~~~
/accounts/vis/paciorek/R/x86_64-pc-linux-gnu-library-ubuntu-22.04/4.4/nimble/include/Eigen/src/Core/util/Macros.h:1339:4: note: in definition of macro ‘EIGEN_MAKE_CWISE_BINARY_OP’
 1339 |   (METHOD)(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const \
      |    ^~~~~~
P_4_rcFun_R_GlobalEnv6.cpp:29:239: note:   ‘const Eigen::MatrixWrapper<const Eigen::CwiseUnaryOp<std::function<double(double)>, const Eigen::CwiseUnaryOp<Eigen::internal::scalar_exp_op<double>, const Eigen::ArrayWrapper<const Eigen::CwiseUnaryOp<Eigen::internal::scalar_opposite_op<double>, const Eigen::CwiseUnaryOp<Eigen::internal::scalar_abs_op<double>, const Eigen::Map<Eigen::Matrix<double, -1, -1>, 0, Eigen::Stride<-1, -1> > > > > > > >’ is not derived from ‘const Eigen::ArrayBase<Derived>’
   29 | Interm_99 = (((Eig_ARG1_x_Interm_100).array()).max((Eig_ARG2_z_Interm_101).array()) + ((((-((Eig_ARG1_x_Interm_102).cwiseAbs())).array()).exp()).unaryExpr(std::function< double(double) >( static_cast<double (*)(double)>(&log1p)))).matrix()).sum();
      |                                                                                                                                                                                                                                               ^
In file included from /accounts/vis/paciorek/R/x86_64-pc-linux-gnu-library-ubuntu-22.04/4.4/nimble/include/Eigen/Core:19,
                 from /accounts/vis/paciorek/R/x86_64-pc-linux-gnu-library-ubuntu-22.04/4.4/nimble/include/Eigen/Dense:1,
                 from /accounts/vis/paciorek/R/x86_64-pc-linux-gnu-library-ubuntu-22.04/4.4/nimble/include/nimble/EigenTypedefs.h:24,
                 from P_4_rcFun_R_GlobalEnv6.cpp:8:
/accounts/vis/paciorek/R/x86_64-pc-linux-gnu-library-ubuntu-22.04/4.4/nimble/include/Eigen/src/Core/../plugins/ArrayCwiseBinaryOps.h:241:29: note: candidate: ‘template<class T> const Eigen::CwiseBinaryOp<Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type>, const Derived, const typename Eigen::internal::plain_constant_type<Derived, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_sum_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type>::type> Eigen::ArrayBase<Derived>::operator+(const T&) const [with T = T; Derived = Eigen::CwiseBinaryOp<Eigen::internal::scalar_max_op<double, double, 0>, const Eigen::ArrayWrapper<Eigen::Map<Eigen::Matrix<d
@paciorek paciorek added the bug label Aug 19, 2024
@paciorek
Copy link
Contributor Author

Narrowing this down a bit further to show that it's the use of an operator in a vectorized operation with pmin or pmax as one of the arguments:

myfun = nimbleFunction(
    run = function(x = double(1)) {
        zeros <- nimNumeric(length(x))
        out <- log1p(x) - pmax(x, zeros)   # fails compilation
        ## out <- log1p(x) - pmax(x, zeros)   # fails compilation
        ## out <- sum(log1p(x))  - sum(pmax(x, zeros)) # succeeds
        out <- pmax(x, zeros) - pmin(x,zeros)   # succeeds
        return(0)
        returnType(double())
    }
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant