/** * @brief A C++ function with object arguments that broadcasts its arguments before * passing them to the underlying C++ functor. */ static object call(TUnaryFunctor & self, object const & input, object const & output) { dtype in_dtype = dtype::get_builtin<TArgument>(); dtype out_dtype = dtype::get_builtin<TResult>(); ndarray in_array = from_object(input, in_dtype, ndarray::ALIGNED); ndarray out_array = (output != object()) ? from_object(output, out_dtype, ndarray::ALIGNED | ndarray::WRITEABLE) : zeros(in_array.get_nd(), in_array.get_shape(), out_dtype); multi_iter iter = make_multi_iter(in_array, out_array); while (iter.not_done()) { TArgument * argument = reinterpret_cast<TArgument*>(iter.get_data(0)); TResult * result = reinterpret_cast<TResult*>(iter.get_data(1)); *result = self(*argument); iter.next(); } return out_array.scalarize(); }
static python::object call(TBinaryFunctor & self, python::object const & input1, python::object const & input2, python::object const & output) { dtype in1_dtype = dtype::get_builtin<TArgument1>(); dtype in2_dtype = dtype::get_builtin<TArgument2>(); dtype out_dtype = dtype::get_builtin<TResult>(); ndarray in1_array = from_object(input1, in1_dtype, ndarray::ALIGNED); ndarray in2_array = from_object(input2, in2_dtype, ndarray::ALIGNED); multi_iter iter = make_multi_iter(in1_array, in2_array); ndarray out_array = (output != python::object()) ? from_object(output, out_dtype, ndarray::ALIGNED | ndarray::WRITEABLE) : zeros(iter.get_nd(), iter.get_shape(), out_dtype); iter = make_multi_iter(in1_array, in2_array, out_array); while (iter.not_done()) { TArgument1 * argument1 = reinterpret_cast<TArgument1*>(iter.get_data(0)); TArgument2 * argument2 = reinterpret_cast<TArgument2*>(iter.get_data(1)); TResult * result = reinterpret_cast<TResult*>(iter.get_data(2)); *result = self(*argument1, *argument2); iter.next(); } return out_array.scalarize(); }
inline ndarray from_object(python::object const & obj, ndarray::bitflag flags=ndarray::NONE) { return from_object(obj, 0, 0, flags); }
inline ndarray from_object(python::object const & obj, dtype const & dt, int nd, ndarray::bitflag flags=ndarray::NONE) { return from_object(obj, dt, nd, nd, flags); }