예제 #1
0
void stdevDimIndexTest(string pFileName, dim_t dim=-1)
{
    typedef typename sdOutType<T>::type outType;
    if (noDoubleTests<T>()) return;
    if (noDoubleTests<outType>()) return;

    vector<dim4>      numDims;
    vector<vector<int> >       in;
    vector<vector<float> >  tests;

    readTestsFromFile<int,float>(pFileName, numDims, in, tests);

    dim4 dims = numDims[0];
    vector<T> input(in[0].begin(), in[0].end());

    array a(dims, &(input.front()));
    array b = a(seq(2,6), seq(1,7));

    array c = stdev(b, dim);

    vector<outType> currGoldBar(tests[0].begin(), tests[0].end());

    size_t nElems    = currGoldBar.size();
    vector<outType> outData(nElems);

    c.host((void*)outData.data());

    for (size_t elIter=0; elIter<nElems; ++elIter) {
        ASSERT_NEAR(::real(currGoldBar[elIter]), ::real(outData[elIter]), 1.0e-3)<< "at: " << elIter<< endl;
        ASSERT_NEAR(::imag(currGoldBar[elIter]), ::imag(outData[elIter]), 1.0e-3)<< "at: " << elIter<< endl;
    }
}
예제 #2
0
TEST(JIT, NonLinearBuffers2)
{
    array a = randu(100, 310);
    array b = randu(10, 10);
    for (int i = 0; i < 300; i++) {
        b += a(seq(10), seq(i, i+9)) * randu(10, 10);
    }
    b.eval();
}
예제 #3
0
TEST(JIT, CPP_common_node)
{
    array r = seq(-3, 3, 0.5);

    int n = r.dims(0);

    array x = tile(r, 1, r.dims(0));
    array y = tile(r.T(), r.dims(0), 1);
    x.eval();
    y.eval();


    vector<float> hx(x.elements());
    vector<float> hy(y.elements());
    vector<float> hr(r.elements());

    x.host(&hx[0]);
    y.host(&hy[0]);
    r.host(&hr[0]);

    for (int j = 0; j < n; j++) {
        for (int i = 0; i < n; i++) {
            ASSERT_EQ(hx[j * n + i], hr[i]);
            ASSERT_EQ(hy[j * n + i], hr[j]);
        }
    }
}
예제 #4
0
TEST(Accum, MaxDim)
{
    const size_t largeDim = 65535 * 32 + 1;

    //first dimension kernel tests
    array input = constant(0, 2, largeDim, 2, 2);
    input(span, seq(0, 9999), span, span) = 1;

    array gold_first = constant(0, 2, largeDim, 2, 2);
    gold_first(span, seq(0, 9999), span, span) = range(2, 10000, 2, 2) + 1;

    array output_first = accum(input, 0);
    ASSERT_ARRAYS_EQ(gold_first, output_first);


    input = constant(0, 2, 2, 2, largeDim);
    input(span, span, span, seq(0, 9999)) = 1;

    gold_first = constant(0, 2, 2, 2, largeDim);
    gold_first(span, span, span, seq(0, 9999)) = range(2, 2, 2, 10000) + 1;

    output_first = accum(input, 0);
    ASSERT_ARRAYS_EQ(gold_first, output_first);


    //other dimension kernel tests
    input = constant(0, 2, largeDim, 2, 2);
    input(span, seq(0, 9999), span, span) = 1;

    array gold_dim = constant(10000, 2, largeDim, 2, 2);
    gold_dim(span, seq(0, 9999), span, span) = range(dim4(2, 10000, 2, 2), 1) + 1;

    array output_dim = accum(input, 1);
    ASSERT_ARRAYS_EQ(gold_dim, output_dim);


    input = constant(0, 2, 2, 2, largeDim);
    input(span, span, span, seq(0, 9999)) = 1;

    gold_dim = constant(0, 2, 2, 2, largeDim);
    gold_dim(span, span, span, seq(0, 9999)) = range(dim4(2, 2, 2, 10000), 1) + 1;

    output_dim = accum(input, 1);
    ASSERT_ARRAYS_EQ(gold_dim, output_dim);

}
예제 #5
0
TEST(Select, NaN)
{
    dim4 dims(1000, 1250);
    dtype ty = f32;

    array a = randu(dims, ty);
    a(seq(a.dims(0) / 2), span, span, span) = NaN;
    float b = 0;
    array c = select(isNaN(a), b, a);

    int num = (int)a.elements();

    vector<float> ha(num);
    vector<float> hc(num);

    a.host(&ha[0]);
    c.host(&hc[0]);

    for (int i = 0; i < num; i++) {
        ASSERT_FLOAT_EQ(hc[i], std::isnan(ha[i]) ? b : ha[i]);
    }
}
예제 #6
0
void fftconvolveTestLarge(int sDim, int fDim, int sBatch, int fBatch, bool expand)
{
    if (noDoubleTests<T>()) return;

    using af::dim4;
    using af::seq;
    using af::array;

    int outDim = sDim + fDim - 1;
    int fftDim = (int)pow(2, ceil(log2(outDim)));

    int sd[4], fd[4];
    for (int k = 0; k < 4; k++) {
        if (k < baseDim) {
            sd[k] = sDim;
            fd[k] = fDim;
        }
        else if (k == baseDim) {
            sd[k] = sBatch;
            fd[k] = fBatch;
        }
        else {
            sd[k] = 1;
            fd[k] = 1;
        }
    }

    const dim4 signalDims(sd[0], sd[1], sd[2], sd[3]);
    const dim4 filterDims(fd[0], fd[1], fd[2], fd[3]);

    array signal = randu(signalDims, (af_dtype) af::dtype_traits<T>::af_type);
    array filter = randu(filterDims, (af_dtype) af::dtype_traits<T>::af_type);

    array out = fftConvolve(signal, filter, expand ? AF_CONV_EXPAND : AF_CONV_DEFAULT);

    array gold;
    switch(baseDim) {
    case 1:
        gold = real(af::ifft(af::fft(signal, fftDim) * af::fft(filter, fftDim)));
        break;
    case 2:
        gold = real(af::ifft2(af::fft2(signal, fftDim, fftDim) * af::fft2(filter, fftDim, fftDim)));
        break;
    case 3:
        gold = real(af::ifft3(af::fft3(signal, fftDim, fftDim, fftDim) * af::fft3(filter, fftDim, fftDim, fftDim)));
        break;
    default:
        ASSERT_LT(baseDim, 4);
    }

    int cropMin = 0, cropMax = 0;
    if (expand) {
        cropMin = 0;
        cropMax = outDim - 1;
    }
    else {
        cropMin = fDim/2;
        cropMax = outDim - fDim/2 - 1;
    }

    switch(baseDim) {
    case 1:
        gold = gold(seq(cropMin, cropMax));
        break;
    case 2:
        gold = gold(seq(cropMin, cropMax), seq(cropMin, cropMax));
        break;
    case 3:
        gold = gold(seq(cropMin, cropMax), seq(cropMin, cropMax), seq(cropMin, cropMax));
        break;
    }

    size_t outElems  = out.elements();
    size_t goldElems = gold.elements();

    ASSERT_EQ(goldElems, outElems);

    T *goldData = new T[goldElems];
    gold.host(goldData);

    T *outData = new T[outElems];
    out.host(outData);

    for (size_t elIter=0; elIter<outElems; ++elIter) {
        ASSERT_NEAR(goldData[elIter], outData[elIter], 5e-2) << "at: " << elIter << std::endl;
    }

    delete[] goldData;
    delete[] outData;
}