| 365 | } |
| 366 | |
| 367 | TEST_P(TopKParams, CPP) { |
| 368 | topk_params params = GetParam(); |
| 369 | int d0 = params.d0; |
| 370 | int d1 = params.d1; |
| 371 | int k = params.k; |
| 372 | int dim = params.dim; |
| 373 | topkFunction order = params.order; |
| 374 | |
| 375 | array in = iota(dim4(d0, d1)); |
| 376 | |
| 377 | // reverse the array if the order is ascending |
| 378 | if (order == AF_TOPK_MIN) { in = -in + (d0 * d1 - 1); } |
| 379 | array val, idx; |
| 380 | topk(val, idx, in, k, dim, order); |
| 381 | |
| 382 | vector<float> hval(k * d1); |
| 383 | vector<unsigned> hidx(k * d1); |
| 384 | val.host(&hval[0]); |
| 385 | idx.host(&hidx[0]); |
| 386 | |
| 387 | if (order == AF_TOPK_MIN) { |
| 388 | for (int j = d1 - 1, i = 0; j > 0; j--) { |
| 389 | for (int kidx = 0, goldidx = d0 - 1; kidx < k; |
| 390 | i++, kidx++, goldidx--) { |
| 391 | float gold = static_cast<float>(j * d0 + kidx); |
| 392 | ASSERT_FLOAT_EQ(gold, hval[i]) |
| 393 | << print_context(i, kidx, hval, hidx); |
| 394 | ASSERT_EQ(goldidx, hidx[i]) |
| 395 | << print_context(i, kidx, hval, hidx); |
| 396 | } |
| 397 | } |
| 398 | } else { |
| 399 | for (int ii = 0, i = 0; ii < d1; ii++) { |
| 400 | for (int j = d0 - 1; j >= d0 - k; --j, i++) { |
| 401 | float gold = static_cast<float>(ii * d0 + j); |
| 402 | int goldidx = j; |
| 403 | ASSERT_FLOAT_EQ(gold, hval[i]) |
| 404 | << print_context(i, j, hval, hidx); |
| 405 | ASSERT_EQ(goldidx, hidx[i]) << print_context(i, j, hval, hidx); |
| 406 | } |
| 407 | } |
| 408 | } |
| 409 | } |
| 410 | |
| 411 | TEST(TopK, KGreaterThan256) { |
| 412 | af::array a = af::randu(500); |
nothing calls this directly
no test coverage detected