//Strong Exception Guarantee af_err af_copy_array(af_array *out, const af_array in) { ArrayInfo info = getInfo(in); const unsigned ndims = info.ndims(); const af::dim4 dims = info.dims(); const af_dtype type = info.getType(); af_err ret = AF_ERR_ARG; ret = af_create_handle(out, ndims, dims.get(), type); if(ret != AF_SUCCESS) { return ret; } try { switch(type) { case f32: copyArray<float >(out, in); break; case c32: copyArray<cfloat >(out, in); break; case f64: copyArray<double >(out, in); break; case c64: copyArray<cdouble >(out, in); break; case b8: copyArray<char >(out, in); break; case s32: copyArray<int >(out, in); break; case u32: copyArray<unsigned>(out, in); break; case u8: copyArray<uchar >(out, in); break; default: ret = AF_ERR_NOT_SUPPORTED; break; } } CATCHALL return ret; }
void randnTest<unsigned char>(af::dim4 &dims) { if (noDoubleTests<unsigned char>()) return; af_array outArray = 0; ASSERT_EQ(AF_ERR_NOT_SUPPORTED, af_randn(&outArray, dims.ndims(), dims.get(), (af_dtype) af::dtype_traits<unsigned char>::af_type)); if(outArray != 0) af_destroy_array(outArray); }
void randnTest(af::dim4 &dims) { if (noDoubleTests<T>()) return; af_array outArray = 0; ASSERT_EQ(AF_SUCCESS, af_randn(&outArray, dims.ndims(), dims.get(), (af_dtype) af::dtype_traits<T>::af_type)); if(outArray != 0) af_destroy_array(outArray); }
af_err af_scale(af_array *out, const af_array in, const float scale0, const float scale1, const dim_t odim0, const dim_t odim1, const af_interp_type method) { try { ArrayInfo i_info = getInfo(in); af::dim4 idims = i_info.dims(); dim_t _odim0 = odim0, _odim1 = odim1; float sx, sy; if(_odim0 == 0 || _odim1 == 0) { DIM_ASSERT(2, scale0 != 0); DIM_ASSERT(3, scale1 != 0); sx = 1.f / scale0, sy = 1.f / scale1; _odim0 = idims[0] / sx; _odim1 = idims[1] / sy; } else if (scale0 == 0 || scale1 == 0) { DIM_ASSERT(4, odim0 != 0); DIM_ASSERT(5, odim1 != 0); sx = idims[0] / (float)_odim0; sy = idims[1] / (float)_odim1; } else { sx = 1.f / scale0, sy = 1.f / scale1; } static float trans_mat[6] = {1, 0, 0, 0, 1, 0}; trans_mat[0] = sx; trans_mat[4] = sy; static af::dim4 tdims(3, 2, 1, 1); af_array t = 0; AF_CHECK(af_create_array(&t, trans_mat, tdims.ndims(), tdims.get(), f32)); AF_CHECK(af_transform(out, in, t, _odim0, _odim1, method, true)); AF_CHECK(af_release_array(t)); } CATCHALL; return AF_SUCCESS; }
af_err af_translate(af_array *out, const af_array in, const float trans0, const float trans1, const dim_t odim0, const dim_t odim1, const af_interp_type method) { try { static float trans_mat[6] = {1, 0, 0, 0, 1, 0}; trans_mat[2] = trans0; trans_mat[5] = trans1; static af::dim4 tdims(3, 2, 1, 1); af_array t = 0; AF_CHECK(af_create_array(&t, trans_mat, tdims.ndims(), tdims.get(), f32)); AF_CHECK(af_transform(out, in, t, odim0, odim1, method, true)); AF_CHECK(af_release_array(t)); } CATCHALL; return AF_SUCCESS; }
af_err af_skew(af_array *out, const af_array in, const float skew0, const float skew1, const dim_t odim0, const dim_t odim1, const af_interp_type method, const bool inverse) { try { float tx = std::tan(skew0); float ty = std::tan(skew1); static float trans_mat[6] = {1, 0, 0, 0, 1, 0}; trans_mat[1] = ty; trans_mat[3] = tx; if(inverse) { if(tx == 0 || ty == 0) { trans_mat[1] = tx; trans_mat[3] = ty; } else { //calc_tranform_inverse(trans_mat); //short cut of calc_transform_inverse float d = 1.0f / (1.0f - tx * ty); trans_mat[0] = d; trans_mat[1] = ty * d; trans_mat[3] = tx * d; trans_mat[4] = d; } } static af::dim4 tdims(3, 2, 1, 1); af_array t = 0; AF_CHECK(af_create_array(&t, trans_mat, tdims.ndims(), tdims.get(), f32)); AF_CHECK(af_transform(out, in, t, odim0, odim1, method, true)); AF_CHECK(af_release_array(t)); } CATCHALL; return AF_SUCCESS; }