| 75 | |
| 76 | template<typename To, typename Ti, int dim> |
| 77 | void median_test(int nx, int ny = 1, int nz = 1, int nw = 1) { |
| 78 | SUPPORTED_TYPE_CHECK(Ti); |
| 79 | |
| 80 | array a = generateArray<Ti>(nx, ny, nz, nw); |
| 81 | |
| 82 | // If selected dim is higher than input ndims, then return |
| 83 | if (dim >= a.dims().ndims()) return; |
| 84 | |
| 85 | array verify; |
| 86 | |
| 87 | // Verification |
| 88 | array sa = sort(a, dim); |
| 89 | |
| 90 | double mid = (a.dims(dim) + 1) / 2; |
| 91 | seq mSeq[4] = {span, span, span, span}; |
| 92 | mSeq[dim] = seq(mid, mid, 1.0); |
| 93 | |
| 94 | if (sa.dims(dim) % 2 == 1) { |
| 95 | mSeq[dim] = mSeq[dim] - 1.0; |
| 96 | sa = sa.as((af_dtype)dtype_traits<To>::af_type); |
| 97 | verify = sa(mSeq[0], mSeq[1], mSeq[2], mSeq[3]); |
| 98 | } else { |
| 99 | dim_t sdim[4] = {0}; |
| 100 | sdim[dim] = 1; |
| 101 | sa = sa.as((af_dtype)dtype_traits<To>::af_type); |
| 102 | array sas = shift(sa, sdim[0], sdim[1], sdim[2], sdim[3]); |
| 103 | verify = ((sa + sas) / To(2))(mSeq[0], mSeq[1], mSeq[2], mSeq[3]); |
| 104 | } |
| 105 | |
| 106 | // Test Part |
| 107 | array out = median(a, dim); |
| 108 | |
| 109 | ASSERT_EQ(out.dims() == verify.dims(), true); |
| 110 | ASSERT_ARRAYS_EQ(verify, out); |
| 111 | } |
| 112 | |
| 113 | #define MEDIAN_FLAT(To, Ti) \ |
| 114 | TEST(MedianFlat, Ti##_flat_even) { median_flat<To, Ti>(1000); } \ |