%PDF- %PDF-
Direktori : /lib/python3/dist-packages/pythran/pythonic/numpy/ |
Current File : //lib/python3/dist-packages/pythran/pythonic/numpy/setdiff1d.hpp |
#ifndef PYTHONIC_NUMPY_SETDIFF1D_HPP #define PYTHONIC_NUMPY_SETDIFF1D_HPP #include "pythonic/include/numpy/setdiff1d.hpp" #include "pythonic/utils/functor.hpp" #include "pythonic/types/ndarray.hpp" #include "pythonic/numpy/asarray.hpp" #include "pythonic/utils/pdqsort.hpp" #include <set> #include <algorithm> PYTHONIC_NS_BEGIN namespace numpy { namespace impl { template <typename InputIterator1, typename InputIterator2, typename OutputIterator> OutputIterator set_difference_unique(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { while (first1 != last1 && first2 != last2) { auto const t1 = *first1; auto const t2 = *first2; if (t1 < t2) { *result = t1; while (*++first1 == t1) ; ++result; } else if (t2 < t1) while (*++first2 == t2) ; else { while (*++first1 == t1) ; while (*++first2 == t2) ; } } while (first1 != last1) { auto const t1 = *first1; *result = t1; while (*++first1 == t1) ; ++result; } return result; } } // namespace impl template <class T, class U> types::ndarray<typename __combined<typename types::dtype_of<T>::type, typename types::dtype_of<U>::type>::type, types::pshape<long>> setdiff1d(T const &ar1, U const &ar2, bool assume_unique) { using dtype = typename __combined<typename types::dtype_of<T>::type, typename types::dtype_of<U>::type>::type; auto far1 = numpy::functor::array{}(ar1); auto far2 = numpy::functor::array{}(ar2); if (assume_unique) { pdqsort(far1.fbegin(), far1.fend()); pdqsort(far2.fbegin(), far2.fend()); dtype *out = (dtype *)malloc(far1.flat_size() * far2.flat_size() * sizeof(dtype)); dtype *out_last = std::set_difference(far1.fbegin(), far1.fend(), far2.fbegin(), far2.fend(), out); auto size = out_last - out; out = (dtype *)realloc(out, size * sizeof(dtype)); return {out, types::pshape<long>(size), types::ownership::owned}; } else { pdqsort(far1.fbegin(), far1.fend()); pdqsort(far2.fbegin(), far2.fend()); dtype *out = (dtype *)malloc(far1.flat_size() * far2.flat_size() * sizeof(dtype)); dtype *out_last = impl::set_difference_unique( far1.fbegin(), far1.fend(), far2.fbegin(), far2.fend(), out); auto size = out_last - out; out = (dtype *)realloc(out, size * sizeof(dtype)); return {out, types::pshape<long>(size), types::ownership::owned}; } } } PYTHONIC_NS_END #endif