[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/arrayfire/arrayfire/feature/optional-graphics/test/iota.cpp [Back]  [Original]

/*******************************************************
 * Copyright (c) 2014, ArrayFire
 * All rights reserved.
 *
 * This file is distributed under 3-clause BSD license.
 * The complete license agreement can be obtained at:
 * http://arrayfire.com/licenses/BSD-3-Clause
 ********************************************************/

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using af::cdouble;
using af::cfloat;
using af::dim4;
using af::dtype_traits;
using std::endl;
using std::string;
using std::vector;

template
class Iota : public ::testing::Test {
   public:
    virtual void SetUp() {
        subMat0.push_back(af_make_seq(0, 4, 1));
        subMat0.push_back(af_make_seq(2, 6, 1));
        subMat0.push_back(af_make_seq(0, 2, 1));
    }
    vector subMat0;
};

// create a list of types to be tested
typedef ::testing::Types
    TestTypes;

// register the type list
TYPED_TEST_SUITE(Iota, TestTypes);

template
void iotaTest(const dim4 idims, const dim4 tdims) {
    SUPPORTED_TYPE_CHECK(T);

    af_array outArray = 0;

    ASSERT_SUCCESS(af_iota(&outArray, idims.ndims(), idims.get(), tdims.ndims(),
                           tdims.get(), (af_dtype)dtype_traits::af_type));

    af_array temp0 = 0, temp1 = 0, temp2 = 0;
    dim4 tempdims(idims.elements());
    dim4 fulldims;
    for (unsigned i = 0; i < 4; i++) { fulldims[i] = idims[i] * tdims[i]; }
    ASSERT_SUCCESS(af_range(&temp2, tempdims.ndims(), tempdims.get(), 0,
                            (af_dtype)dtype_traits::af_type));
    ASSERT_SUCCESS(af_moddims(&temp1, temp2, idims.ndims(), idims.get()));
    ASSERT_SUCCESS(
        af_tile(&temp0, temp1, tdims[0], tdims[1], tdims[2], tdims[3]));

    ASSERT_ARRAYS_EQ(temp0, outArray);

    if (outArray != 0) af_release_array(outArray);
    if (temp0 != 0) af_release_array(temp0);
    if (temp1 != 0) af_release_array(temp1);
    if (temp2 != 0) af_release_array(temp2);
}

#define IOTA_INIT(desc, x, y, z, w, a, b, c, d)                  \
    TYPED_TEST(Iota, desc) {                                     \
        iotaTest(dim4(x, y, z, w), dim4(a, b, c, d)); \
    }

IOTA_INIT(Iota1D0, 100, 1, 1, 1, 2, 3, 1, 1);

IOTA_INIT(Iota2D0, 10, 20, 1, 1, 3, 1, 2, 1);
IOTA_INIT(Iota2D1, 100, 5, 1, 1, 1, 2, 4, 2);

IOTA_INIT(Iota3D0, 20, 6, 3, 1, 1, 1, 1, 1);
IOTA_INIT(Iota3D1, 10, 12, 5, 1, 2, 3, 4, 5);
IOTA_INIT(Iota3D2, 25, 30, 2, 1, 1, 2, 2, 1);

IOTA_INIT(Iota4D0, 20, 6, 3, 2, 2, 3, 1, 2);
IOTA_INIT(Iota4D1, 10, 12, 5, 2, 1, 2, 2, 2);
IOTA_INIT(Iota4D2, 25, 30, 2, 2, 3, 2, 1, 1);
IOTA_INIT(Iota4D3, 25, 30, 2, 2, 4, 2, 4, 2);

IOTA_INIT(IotaMaxDimY, 1, 65535 * 32 + 1, 1, 1, 1, 1, 1, 1);
IOTA_INIT(IotaMaxDimZ, 1, 1, 65535 * 32 + 1, 1, 1, 1, 1, 1);
IOTA_INIT(IotaMaxDimW, 1, 1, 1, 65535 * 32 + 1, 1, 1, 1, 1);

///////////////////////////////// CPP ////////////////////////////////////
//

using af::array;
using af::iota;

TEST(Iota, CPP) {
    dim4 idims(23, 15, 1, 1);
    dim4 tdims(2, 2, 1, 1);
    dim4 fulldims;
    for (unsigned i = 0; i < 4; i++) { fulldims[i] = idims[i] * tdims[i]; }

    array output = iota(idims, tdims);
    array tileArray =
        tile(moddims(range(dim4(idims.elements()), 0), idims), tdims);

    ASSERT_ARRAYS_EQ(tileArray, output);
}

Web Proxy Viewer  |  New URL  |  Original Page