Example #1
0
    static Array<T> diff(const Array<T> &in, const int dim)
    {
        const af::dim4 iDims = in.dims();
        af::dim4 oDims = iDims;
        oDims[dim] -= (isDiff2 + 1);

        if(iDims.elements() == 0 || oDims.elements() == 0) {
            throw std::runtime_error("Elements are 0");
        }

        Array<T> out = createEmptyArray<T>(oDims);

        switch (dim) {

            case (0):    kernel::diff<T, 0, isDiff2>(out, in, in.ndims());
                         break;

            case (1):    kernel::diff<T, 1, isDiff2>(out, in, in.ndims());
                         break;

            case (2):    kernel::diff<T, 2, isDiff2>(out, in, in.ndims());
                         break;

            case (3):    kernel::diff<T, 3, isDiff2>(out, in, in.ndims());
                         break;
        }

        return out;
    }
Example #2
0
    void ireduce(Array<T> &out, Array<uint> &loc,
                 const Array<T> &in, const int dim)
    {
        dim4 odims = in.dims();
        odims[dim] = 1;

        switch (in.ndims()) {
        case 1:
            ireduce_dim<op, T, 1>()(out.get(), out.strides(), out.dims(),
                                    loc.get(),
                                    in.get(), in.strides(), in.dims(), dim);
            break;

        case 2:
            ireduce_dim<op, T, 2>()(out.get(), out.strides(), out.dims(),
                                    loc.get(),
                                    in.get(), in.strides(), in.dims(), dim);
            break;

        case 3:
            ireduce_dim<op, T, 3>()(out.get(), out.strides(), out.dims(),
                                    loc.get(),
                                    in.get(), in.strides(), in.dims(), dim);
            break;

        case 4:
            ireduce_dim<op, T, 4>()(out.get(), out.strides(), out.dims(),
                                    loc.get(),
                                    in.get(), in.strides(), in.dims(), dim);
            break;
        }
    }
Example #3
0
    Array<To> scan(const Array<Ti>& in, const int dim)
    {
        dim4 dims = in.dims();

        Array<To> out = createValueArray<To>(dims, 0);

        switch (in.ndims()) {
        case 1:
            scan_dim<op, Ti, To, 1>()(out.get(), out.strides(), out.dims(),
                                      in.get(), in.strides(), in.dims(), dim);
            break;

        case 2:
            scan_dim<op, Ti, To, 2>()(out.get(), out.strides(), out.dims(),
                                      in.get(), in.strides(), in.dims(), dim);
            break;

        case 3:
            scan_dim<op, Ti, To, 3>()(out.get(), out.strides(), out.dims(),
                                      in.get(), in.strides(), in.dims(), dim);
            break;

        case 4:
            scan_dim<op, Ti, To, 4>()(out.get(), out.strides(), out.dims(),
                                      in.get(), in.strides(), in.dims(), dim);
            break;
        }

        return out;
    }
Example #4
0
Array<To> scan(const Array<Ti>& in, const int dim)
{
    dim4 dims     = in.dims();
    Array<To> out = createEmptyArray<To>(dims);
    in.eval();

    switch (in.ndims()) {
        case 1:
            kernel::scan_dim<op, Ti, To, 1> func1;
            getQueue().enqueue(func1, out, 0, in, 0, dim);
            break;
        case 2:
            kernel::scan_dim<op, Ti, To, 2> func2;
            getQueue().enqueue(func2, out, 0, in, 0, dim);
            break;
        case 3:
            kernel::scan_dim<op, Ti, To, 3> func3;
            getQueue().enqueue(func3, out, 0, in, 0, dim);
            break;
        case 4:
            kernel::scan_dim<op, Ti, To, 4> func4;
            getQueue().enqueue(func4, out, 0, in, 0, dim);
            break;
    }

    return out;
}
Example #5
0
 void copyData(T *to, const Array<T> &from)
 {
     if(from.isOwner()) {
         // FIXME: Check for errors / exceptions
         memcpy(to, from.get(), from.elements()*sizeof(T));
     } else {
         stridedCopy<T>(to, from.get(), from.dims(), from.strides(), from.ndims() - 1);
     }
 }
Example #6
0
    Array<T> iir(const Array<T> &b, const Array<T> &a, const Array<T> &x)
    {
        try {

            AF_BATCH_KIND type = x.ndims() == 1 ? AF_BATCH_NONE : AF_BATCH_SAME;
            if (x.ndims() != b.ndims()) {
                type = (x.ndims() < b.ndims()) ?  AF_BATCH_RHS  : AF_BATCH_LHS;
            }

            // Extract the first N elements
            Array<T> c = convolve<T, T, 1, true>(x, b, type);
            dim4 cdims = c.dims();
            cdims[0] = x.dims()[0];
            c.resetDims(cdims);

            int num_a = a.dims()[0];

            if (num_a == 1) return c;

            dim4 ydims = c.dims();
            Array<T> y = createEmptyArray<T>(ydims);

            if (a.ndims() > 1) {
                kernel::iir<T,  true>(y, c, a);
            } else {
                kernel::iir<T, false>(y, c, a);
            }

            return y;
        } catch (cl::Error &err) {
            CL_TO_AF_ERROR(err);
        }
    }
Example #7
0
static
void assign(Array<Tout> &out, const unsigned &ndims, const af_seq *index, const Array<Tin> &in_)
{
    dim4 const outDs = out.dims();
    dim4 const iDims = in_.dims();

    DIM_ASSERT(0, (outDs.ndims()>=iDims.ndims()));
    DIM_ASSERT(0, (outDs.ndims()>=(dim_t)ndims));

    out.eval();

    vector<af_seq> index_(index, index+ndims);

    dim4 oDims = toDims(index_, outDs);

    bool is_vector = true;
    for (int i = 0; is_vector && i < (int)oDims.ndims() - 1; i++) {
        is_vector &= oDims[i] == 1;
    }

    is_vector &= in_.isVector() || in_.isScalar();

    for (dim_t i = ndims; i < (int)in_.ndims(); i++) {
        oDims[i] = 1;
    }


    if (is_vector) {
        if (oDims.elements() != (dim_t)in_.elements() &&
            in_.elements() != 1) {
            AF_ERROR("Size mismatch between input and output", AF_ERR_SIZE);
        }

        // If both out and in are vectors of equal elements, reshape in to out dims
        Array<Tin> in = in_.elements() == 1 ? tile(in_, oDims) : modDims(in_, oDims);
        Array<Tout> dst = createSubArray<Tout>(out, index_, false);

        copyArray<Tin , Tout>(dst, in);
    } else {
        for (int i = 0; i < 4; i++) {
            if (oDims[i] != iDims[i]) {
                AF_ERROR("Size mismatch between input and output", AF_ERR_SIZE);
            }
        }
        Array<Tout> dst = createSubArray<Tout>(out, index_, false);

        copyArray<Tin , Tout>(dst, in_);
    }
}
Example #8
0
    Array<To> reduce(const Array<Ti> &in, const int dim)
    {
        dim4 odims = in.dims();
        odims[dim] = 1;

        Array<To> out = createEmptyArray<To>(odims);
        static reduce_dim_func<op, Ti, To>  reduce_funcs[4] = { reduce_dim<op, Ti, To, 1>()
                                                              , reduce_dim<op, Ti, To, 2>()
                                                              , reduce_dim<op, Ti, To, 3>()
                                                              , reduce_dim<op, Ti, To, 4>()};

        reduce_funcs[in.ndims() - 1](out.get(), out.strides(), out.dims(),
                                    in.get(), in.strides(), in.dims(), dim);

        return out;
    }
Example #9
0
Array<To> reduce(const Array<Ti> &in, const int dim, bool change_nan,
                 double nanval) {
    dim4 odims = in.dims();
    odims[dim] = 1;
    in.eval();

    Array<To> out = createEmptyArray<To>(odims);
    static const reduce_dim_func<op, Ti, To> reduce_funcs[4] = {
        kernel::reduce_dim<op, Ti, To, 1>(),
        kernel::reduce_dim<op, Ti, To, 2>(),
        kernel::reduce_dim<op, Ti, To, 3>(),
        kernel::reduce_dim<op, Ti, To, 4>()};

    getQueue().enqueue(reduce_funcs[in.ndims() - 1], out, 0, in, 0, dim,
                       change_nan, nanval);

    return out;
}
Example #10
0
static void assign(Array<Tout>& out, const vector<af_seq> seqs,
                   const Array<Tin>& in) {
    size_t ndims      = seqs.size();
    const dim4& outDs = out.dims();
    const dim4& iDims = in.dims();

    if (iDims.elements() == 0) return;

    out.eval();

    dim4 oDims = toDims(seqs, outDs);

    bool isVec = true;
    for (int i = 0; isVec && i < (int)oDims.ndims() - 1; i++) {
        isVec &= oDims[i] == 1;
    }

    isVec &= in.isVector() || in.isScalar();

    for (dim_t i = ndims; i < (int)in.ndims(); i++) { oDims[i] = 1; }

    if (isVec) {
        if (oDims.elements() != (dim_t)in.elements() && in.elements() != 1) {
            AF_ERROR("Size mismatch between input and output", AF_ERR_SIZE);
        }

        // If both out and in are vectors of equal elements,
        // reshape in to out dims
        Array<Tin> in_ =
            in.elements() == 1 ? tile(in, oDims) : modDims(in, oDims);
        auto dst = createSubArray<Tout>(out, seqs, false);

        copyArray<Tin, Tout>(dst, in_);
    } else {
        for (int i = 0; i < AF_MAX_DIMS; i++) {
            if (oDims[i] != iDims[i])
                AF_ERROR("Size mismatch between input and output", AF_ERR_SIZE);
        }
        Array<Tout> dst = createSubArray<Tout>(out, seqs, false);

        copyArray<Tin, Tout>(dst, in);
    }
}
Example #11
0
 void select_scalar(Array<T> &out, const Array<char> &cond, const Array<T> &a, const double &b)
 {
     kernel::select_scalar<T, flip>(out, cond, a, b, out.ndims());
 }
Example #12
0
 void select(Array<T> &out, const Array<char> &cond, const Array<T> &a, const Array<T> &b)
 {
     kernel::select<T>(out, cond, a, b, out.ndims());
 }
Example #13
0
	CHECK(a0.ndims() == 1);
	CHECK(a0.size() == make_array(0));
	CHECK(a0.strides() == make_array(1));
	CHECK(a0.raw_ptr() == nullptr);

	CHECK(empty(a0));
	CHECK(byteSize(a0) == 0);
}

TEST_CASE("DeclareArrayWithSize", "Array")
{
	Array<int> a1(5);

	CHECK(a1.itemSize() == sizeof(int));
	CHECK(a1.length() == 5);
	CHECK(a1.ndims() == 1);
	CHECK(a1.size(0) == 5);
	CHECK(a1.stride(0) == 1);
    CHECK(a1.raw_ptr() != nullptr); 

	CHECK_FALSE(empty(a1));
    CHECK(byteSize(a1) == 5 * sizeof(int));

	Array<float, 2> a2(2, 3);

	CHECK(a2.itemSize() == sizeof(float));
	CHECK(a2.length() == 2 * 3);
	CHECK(a2.ndims() == 2);
	CHECK(a2.size(0) == 2);
	CHECK(a2.size(1) == 3);
	CHECK(a2.stride(0) == 1);