| 46 | } |
| 47 | |
| 48 | void af_approx1_common(af_array *yo, const af_array yi, const af_array xo, |
| 49 | const int xdim, const double xi_beg, |
| 50 | const double xi_step, const af_interp_type method, |
| 51 | const float offGrid, const bool allocate_yo) { |
| 52 | ARG_ASSERT(0, yo != 0); // *yo (the af_array) can be null, but not yo |
| 53 | ARG_ASSERT(1, yi != 0); |
| 54 | ARG_ASSERT(2, xo != 0); |
| 55 | |
| 56 | const ArrayInfo &yi_info = getInfo(yi); |
| 57 | const ArrayInfo &xo_info = getInfo(xo); |
| 58 | |
| 59 | const dim4 &yi_dims = yi_info.dims(); |
| 60 | const dim4 &xo_dims = xo_info.dims(); |
| 61 | dim4 yo_dims = yi_dims; |
| 62 | yo_dims[xdim] = xo_dims[xdim]; |
| 63 | |
| 64 | ARG_ASSERT(1, yi_info.isFloating()); // Only floating and complex types |
| 65 | ARG_ASSERT(2, xo_info.isRealFloating()); // Only floating types |
| 66 | ARG_ASSERT(1, yi_info.isSingle() == |
| 67 | xo_info.isSingle()); // Must have same precision |
| 68 | ARG_ASSERT(1, yi_info.isDouble() == |
| 69 | xo_info.isDouble()); // Must have same precision |
| 70 | ARG_ASSERT(3, xdim >= 0 && xdim < 4); |
| 71 | |
| 72 | // POS should either be (x, 1, 1, 1) or (1, yi_dims[1], yi_dims[2], |
| 73 | // yi_dims[3]) |
| 74 | if (xo_dims[xdim] != xo_dims.elements()) { |
| 75 | for (int i = 0; i < 4; i++) { |
| 76 | if (xdim != i) { DIM_ASSERT(2, xo_dims[i] == yi_dims[i]); } |
| 77 | } |
| 78 | } |
| 79 | |
| 80 | ARG_ASSERT(5, xi_step != 0); |
| 81 | ARG_ASSERT( |
| 82 | 6, (method == AF_INTERP_CUBIC || method == AF_INTERP_CUBIC_SPLINE || |
| 83 | method == AF_INTERP_LINEAR || method == AF_INTERP_LINEAR_COSINE || |
| 84 | method == AF_INTERP_LOWER || method == AF_INTERP_NEAREST)); |
| 85 | |
| 86 | if (yi_dims.ndims() == 0 || xo_dims.ndims() == 0) { |
| 87 | af_create_handle(yo, 0, nullptr, yi_info.getType()); |
| 88 | return; |
| 89 | } |
| 90 | |
| 91 | if (allocate_yo) { *yo = createHandle(yo_dims, yi_info.getType()); } |
| 92 | |
| 93 | DIM_ASSERT(0, getInfo(*yo).dims() == yo_dims); |
| 94 | |
| 95 | switch (yi_info.getType()) { |
| 96 | case f32: |
| 97 | approx1<float, float>(yo, yi, xo, xdim, xi_beg, xi_step, method, |
| 98 | offGrid); |
| 99 | break; |
| 100 | case f64: |
| 101 | approx1<double, double>(yo, yi, xo, xdim, xi_beg, xi_step, method, |
| 102 | offGrid); |
| 103 | break; |
| 104 | case c32: |
| 105 | approx1<cfloat, float>(yo, yi, xo, xdim, xi_beg, xi_step, method, |
no test coverage detected