/*******************************************************
* 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 Grad : 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(Grad, TestTypes);
template
void gradTest(string pTestFile, const unsigned resultIdx0,
const unsigned resultIdx1, bool isSubRef = false,
const vector* seqv = NULL) {
SUPPORTED_TYPE_CHECK(T);
vector numDims;
vector in;
vector tests;
readTests(pTestFile, numDims, in, tests);
dim4 idims = numDims[0];
af_array inArray = 0;
af_array tempArray = 0;
af_array g0Array = 0;
af_array g1Array = 0;
if (isSubRef) {
ASSERT_SUCCESS(af_create_array(&tempArray, &(in[0].front()),
idims.ndims(), idims.get(),
(af_dtype)dtype_traits::af_type));
ASSERT_SUCCESS(
af_index(&inArray, tempArray, seqv->size(), &seqv->front()));
} else {
ASSERT_SUCCESS(af_create_array(&inArray, &(in[0].front()),
idims.ndims(), idims.get(),
(af_dtype)dtype_traits::af_type));
}
ASSERT_SUCCESS(af_gradient(&g0Array, &g1Array, inArray));
size_t nElems = tests[resultIdx0].size();
// Get result
T* grad0Data = new T[tests[resultIdx0].size()];
ASSERT_SUCCESS(af_get_data_ptr((void*)grad0Data, g0Array));
// Compare result
for (size_t elIter = 0; elIter < nElems; ++elIter) {
ASSERT_EQ(tests[resultIdx0][elIter], grad0Data[elIter])