#ifndef PYTHONIC_NUMPY_FROMFUNCTION_HPP #define PYTHONIC_NUMPY_FROMFUNCTION_HPP #include "pythonic/include/numpy/fromfunction.hpp" #include "pythonic/utils/functor.hpp" #include "pythonic/types/ndarray.hpp" #include "pythonic/builtins/None.hpp" #include "pythonic/utils/tags.hpp" PYTHONIC_NS_BEGIN namespace numpy { template struct fromfunction_helper; template template types::ndarray::type>::type>::type, pS> fromfunction_helper:: operator()(F &&f, pS const &shape, dtype d) { types::ndarray::type>::type>::type, pS> out(shape, builtins::None); long n = out.template shape<0>(); #ifdef _OPENMP if (std::is_same::value && n >= PYTHRAN_OPENMP_MIN_ITERATION_COUNT) #pragma omp parallel for for (long i = 0; i < n; ++i) out[i] = f(i); else #endif for (long i = 0; i < n; ++i) out[i] = f(i); return out; } template template types::ndarray< typename std::remove_cv::type>::type>::type, pS> fromfunction_helper:: operator()(F &&f, pS const &shape, dtype d) { types::ndarray< typename std::remove_cv::type>::type>::type, pS> out(shape, builtins::None); long n = out.template shape<0>(); long m = out.template shape<1>(); #ifdef _OPENMP if (std::is_same::value && (m * n) >= PYTHRAN_OPENMP_MIN_ITERATION_COUNT) #pragma omp parallel for collapse(2) for (long i = 0; i < n; ++i) for (long j = 0; j < m; ++j) out[i][j] = f(i, j); else #endif for (long i = 0; i < n; ++i) for (long j = 0; j < m; ++j) out[i][j] = f(i, j); return out; } template auto fromfunction(F &&f, pS const &shape, dtype d) -> decltype(fromfunction_helper::value, dtype, typename pythonic::purity_of::type>()( std::forward(f), shape)) { return fromfunction_helper::value, dtype, typename pythonic::purity_of::type>()( std::forward(f), shape); } /* TODO: must specialize for higher order */ } PYTHONIC_NS_END #endif