/******************************************************* * Copyright (c) 2015, 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 namespace std; using namespace af; template class StandardDev : public ::testing::Test { public: virtual void SetUp() {} }; // create a list of types to be tested typedef ::testing::Types TestTypes; // register the type list TYPED_TEST_CASE(StandardDev, TestTypes); template struct f32HelperType { typedef typename cond_type::value, double, float>::type type; }; template struct c32HelperType { typedef typename cond_type::value, cfloat, typename f32HelperType::type >::type type; }; template struct elseType { typedef typename cond_type< is_same_type::value || is_same_type ::value, double, T>::type type; }; template struct sdOutType { typedef typename cond_type< is_same_type ::value || is_same_type ::value || is_same_type ::value || is_same_type ::value || is_same_type ::value || is_same_type ::value || is_same_type ::value, float, typename elseType::type>::type type; }; template void stdevDimTest(string pFileName, dim_t dim=-1) { typedef typename sdOutType::type outType; if (noDoubleTests()) return; if (noDoubleTests()) return; vector numDims; vector > in; vector > tests; readTestsFromFile(pFileName, numDims, in, tests); af::dim4 dims = numDims[0]; vector input(in[0].begin(), in[0].end()); af::array a(dims, &(input.front())); af::array b = stdev(a, dim); vector currGoldBar(tests[0].begin(), tests[0].end()); size_t nElems = currGoldBar.size(); outType *outData = new outType[nElems]; b.host((void*)outData); for (size_t elIter=0; elIter(string(TEST_DIR "/stdev/mat_10x10_dim0.test"), 0); } TYPED_TEST(StandardDev, Dim1) { stdevDimTest(string(TEST_DIR "/stdev/mat_10x10_dim1.test"), 1); } TYPED_TEST(StandardDev, Dim2) { stdevDimTest(string(TEST_DIR "/stdev/hypercube_10x10x5x5_dim2.test"), 2); } TYPED_TEST(StandardDev, Dim3) { stdevDimTest(string(TEST_DIR "/stdev/hypercube_10x10x5x5_dim3.test"), 3); } TEST(StandardDev, InvalidDim) { ASSERT_THROW(af::stdev(af::array(), 5), af::exception); } TEST(StandardDev, InvalidType) { ASSERT_THROW(af::stdev(constant(cdouble(1.0, -1.0), 10)), af::exception); } template void stdevDimIndexTest(string pFileName, dim_t dim=-1) { typedef typename sdOutType::type outType; if (noDoubleTests()) return; if (noDoubleTests()) return; vector numDims; vector > in; vector > tests; readTestsFromFile(pFileName, numDims, in, tests); af::dim4 dims = numDims[0]; vector input(in[0].begin(), in[0].end()); af::array a(dims, &(input.front())); af::array b = a(seq(2,6), seq(1,7)); af::array c = stdev(b, dim); vector currGoldBar(tests[0].begin(), tests[0].end()); size_t nElems = currGoldBar.size(); outType *outData = new outType[nElems]; c.host((void*)outData); for (size_t elIter=0; elIter(string(TEST_DIR "/stdev/mat_10x10_seq2_6x1_7_dim0.test"), 0); } TYPED_TEST(StandardDev, IndexedArrayDim1) { stdevDimIndexTest(string(TEST_DIR "/stdev/mat_10x10_seq2_6x1_7_dim1.test"), 1); } TYPED_TEST(StandardDev, All) { typedef typename sdOutType::type outType; if (noDoubleTests()) return; if (noDoubleTests()) return; vector numDims; vector > in; vector > tests; readTestsFromFile(string(TEST_DIR "/stdev/mat_10x10_scalar.test"), numDims, in, tests); af::dim4 dims = numDims[0]; vector input(in[0].begin(), in[0].end()); af::array a(dims, &(input.front())); outType b = stdev(a); vector currGoldBar(tests[0].begin(), tests[0].end()); ASSERT_NEAR(::real(currGoldBar[0]), ::real(b), 1.0e-3); ASSERT_NEAR(::imag(currGoldBar[0]), ::imag(b), 1.0e-3); }