#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <assert.h>
#include <limits.h>
#include <stdlib.h>
#include <mpi.h>
#include <yaxt.h>
#define VERBOSE
#include "tests.h"
#include "test_idxlist_utils.h"
static void
struct Xt_stripe * ref_stripes,
int ref_num_stripes);
int main(void) {
{
int num_dimensions = 1;
int local_size [1] = {5};
local_size, local_start);
Xt_int ref_indices[5] = {3,4,5,6,7};
struct Xt_stripe ref_stripes[1] = {{.
start = 3, .stride = 1, .nstrides = 5}};
do_tests(idxsection, ref_indices, 5, ref_stripes, 1);
}
{
int num_dimensions = 2;
Xt_int global_size[2] = {5,6};
int local_size [2] = {3,2};
Xt_int local_start[2] = {1,2};
local_size, local_start);
Xt_int ref_indices[6] = {8,9,14,15,20,21};
struct Xt_stripe ref_stripes[3] = {{.
start = 8, .stride = 1, .nstrides = 2},
{.start = 14, .stride = 1, .nstrides = 2},
{.start = 20, .stride = 1, .nstrides = 2}};
do_tests(idxsection, ref_indices, 6, ref_stripes, 3);
}
{
int num_dimensions = 3;
Xt_int global_size[3] = {4,4,4};
int local_size[3] = {4,2,2};
Xt_int local_start[3] = {0,1,1};
local_size, local_start);
Xt_int ref_indices[16] = {5,6,9,10, 21,22,25,26, 37,38,41,42, 53,54,57,58};
struct Xt_stripe ref_stripes[8] = {{.
start = 5, .stride = 1, .nstrides = 2},
{.start = 9, .stride = 1, .nstrides = 2},
{.start = 21, .stride = 1, .nstrides = 2},
{.start = 25, .stride = 1, .nstrides = 2},
{.start = 37, .stride = 1, .nstrides = 2},
{.start = 41, .stride = 1, .nstrides = 2},
{.start = 53, .stride = 1, .nstrides = 2},
{.start = 57, .stride = 1, .nstrides = 2}};
do_tests(idxsection, ref_indices, 16, ref_stripes, 8);
}
{
int num_dimensions = 3;
Xt_int global_size[3] = {3,4,5};
int local_size[3] = {2,2,3};
Xt_int local_start[3] = {1,1,1};
local_size, local_start);
Xt_int ref_indices[12] = {26,27,28,31,32,33,46,47,48,51,52,53};
struct Xt_stripe ref_stripes[4] = {{.
start = 26, .stride = 1, .nstrides = 3},
{.start = 31, .stride = 1, .nstrides = 3},
{.start = 46, .stride = 1, .nstrides = 3},
{.start = 51, .stride = 1, .nstrides = 3}};
do_tests(idxsection, ref_indices, 12, ref_stripes, 4);
}
{
int num_dimensions = 4;
Xt_int global_size[4] = {3,4,4,3};
int local_size[4] = {2,3,3,2};
Xt_int local_start[4] = {0,1,1,1};
local_size, local_start);
Xt_int ref_indices[36] = {16,17,19,20,22,23, 28,29,31,32,34,35, 40,41,43,44,46,47,
64,65,67,68,70,71, 76,77,79,80,82,83, 88,89,91,92,94,95};
struct Xt_stripe ref_stripes[18] = {{.
start = 16, .stride = 1, .nstrides = 2},
{.start = 19, .stride = 1, .nstrides = 2},
{.start = 22, .stride = 1, .nstrides = 2},
{.start = 28, .stride = 1, .nstrides = 2},
{.start = 31, .stride = 1, .nstrides = 2},
{.start = 34, .stride = 1, .nstrides = 2},
{.start = 40, .stride = 1, .nstrides = 2},
{.start = 43, .stride = 1, .nstrides = 2},
{.start = 46, .stride = 1, .nstrides = 2},
{.start = 64, .stride = 1, .nstrides = 2},
{.start = 67, .stride = 1, .nstrides = 2},
{.start = 70, .stride = 1, .nstrides = 2},
{.start = 76, .stride = 1, .nstrides = 2},
{.start = 79, .stride = 1, .nstrides = 2},
{.start = 82, .stride = 1, .nstrides = 2},
{.start = 88, .stride = 1, .nstrides = 2},
{.start = 91, .stride = 1, .nstrides = 2},
{.start = 94, .stride = 1, .nstrides = 2}};
do_tests(idxsection, ref_indices, 36, ref_stripes, 18);
}
{
int num_dimensions = 2;
Xt_int global_size[2] = {5,10};
int local_size [2] = {3,4};
Xt_int local_start[2] = {1,2};
local_size, local_start);
Xt_int ref_indices[12] = {12,13,14,15,22,23,24,25,32,33,34,35};
check_idxlist(idxsection, ref_indices, 12);
}
{
int num_dimensions = 1;
Xt_int global_size_a[1] = {10};
int local_size_a [1] = {5};
Xt_int local_start_a[1] = {4};
Xt_int global_size_b[1] = {15};
int local_size_b [1] = {6};
Xt_int local_start_b[1] = {7};
local_size_a, local_start_a);
local_size_b, local_start_b);
Xt_int ref_indices[2] = {7,8};
struct Xt_stripe ref_stripes[1] = {{.
start = 7, .stride = 1, .nstrides = 2}};
do_tests(intersection, ref_indices, 2, ref_stripes, 1);
}
{
int num_dimensions = 1;
Xt_int global_size_a[1] = {10};
int local_size_a [1] = {1};
Xt_int local_start_a[1] = {3};
Xt_int global_size_b[1] = {10};
int local_size_b [1] = {5};
Xt_int local_start_b[1] = {4};
local_size_a, local_start_a);
local_size_b, local_start_b);
struct Xt_stripe ref_stripes[1] = {{.
start = 0, .stride = 1, .nstrides = 1}};
do_tests(intersection, ref_indices, 0, ref_stripes, 0);
}
{
int num_dimensions = 2;
Xt_int global_size_a[2] = {6,6};
int local_size_a [2] = {4,2};
Xt_int local_start_a[2] = {1,1};
Xt_int global_size_b[2] = {6,6};
int local_size_b [2] = {3,3};
Xt_int local_start_b[2] = {3,2};
local_size_a, local_start_a);
local_size_b, local_start_b);
Xt_int ref_indices[2] = {20,26};
struct Xt_stripe ref_stripes[2] = {{.
start = 20, .stride = 1, .nstrides = 1},
{.start = 26, .stride = 1, .nstrides = 1}};
do_tests(intersection, ref_indices, 2, ref_stripes, 2);
}
{
int num_dimensions = 2;
Xt_int global_size[2] = {4,4};
int local_size [2] = {2,2};
Xt_int local_start[2] = {0,2};
local_size, local_start);
Xt_int ref_indices[4] = {2,3,6,7};
check_idxlist(idxsection, ref_indices, 4);
}
{
int num_dimensions = 2;
Xt_int global_size[2] = {4,4};
int local_size [2] = {2,2};
Xt_int local_start[2] = {0,2};
local_size, local_start);
Xt_int ref_indices[4] = {3,4,7,8};
check_idxlist(idxsection, ref_indices, 4);
}
{
int num_dimensions = 2;
Xt_int global_size[2] = {4,4};
int local_size [2] = {2,2};
Xt_int local_start[2] = {0,2};
local_size, local_start);
Xt_int selection[] = {1,2,5,6,7,8};
int num_selection = (int)(sizeof(selection) / sizeof(*selection));
int positions[num_selection];
int ref_positions[] = {1*0-1, 2*0+0, 5*0-1, 6*0+2, 7*0+3, 8*0-1};
PUT_ERR("xt_idxlist_get_position_of_indices returned incorrect"
" num_unmatched\n");
for (int i=0; i<num_selection; i++) {
if (positions[i] != ref_positions[i])
PUT_ERR("xt_idxlist_get_position_of_indices returned incorrect"
" position\n");
}
}
{
int num_dimensions = 2;
Xt_int global_size[2] = {4,4};
int local_size [2] = {2,2};
Xt_int local_start[2] = {0,2};
local_size, local_start);
Xt_int selection[] = {2,1,5,7,6,7,7,6,8};
int num_selection = (int)(sizeof(selection) / sizeof(*selection));
int positions[num_selection];
int ref_positions[] = {2*0+0, 1*0-1, 5*0-1, 7*0+3, 6*0+2, 7*0+3, 7*0+3, 6*0+2, 8*0-1};
int single_match_only = 0;
PUT_ERR("xt_idxlist_get_position_of_indices did not return correct num_unmatched\n");
for (int i=0; i<num_selection; i++) {
int p;
if (p != ref_positions[i])
PUT_ERR("xt_idxlist_get_position_of_index did not return correct position\n");
if (positions[i] != ref_positions[i])
PUT_ERR("xt_idxlist_get_positions_of_indices did not return correct position\n");
}
}
{
int num_dimensions = 2;
Xt_int global_size[2] = {4,4};
int local_size [2] = {2,2};
Xt_int local_start[2] = {0,2};
local_size, local_start);
Xt_int selection[] = {2,1,5,7,6,7,7,6,8};
int num_selection = (int)(sizeof(selection) / sizeof(*selection));
int positions[num_selection];
int ref_positions[] = {2*0+0, 1*0-1, 5*0-1, 7*0+3, 6*0+2, 7*0-1, 7*0-1, 6*0-1, 8*0-1};
int single_match_only = 1;
PUT_ERR("xt_idxlist_get_position_of_indices did not return correct num_unmatched\n");
for (int i=0; i<num_selection; i++) {
if (positions[i] != ref_positions[i])
PUT_ERR("xt_idxlist_get_positions_of_indices did not return correct position\n");
}
}
{
int num_dimensions = 2;
Xt_int global_size[2] = {4,4};
int local_size [2] = {2,2};
Xt_int local_start[2] = {0,2};
local_size, local_start);
Xt_int sel_idx[] = {2,1,5,7,6,7,7,6,8};
int num_sel_idx = sizeof(sel_idx) / sizeof(*sel_idx);
Xt_int ref_inter_idx[] = {2,6,6,7,7,7};
int num_ref_inter_idx = (int)(sizeof(ref_inter_idx) / sizeof(*ref_inter_idx));
check_idxlist(inter_idxlist, ref_inter_idx, num_ref_inter_idx);
}
{
for (int i = 0; i < 16; ++i) {
int num_dimensions = 2;
Xt_int global_size[4][2] = {{5,10},{5,-10},{-5,10},{-5,-10}};
int local_size [4][2] = {{3,4},{3,-4},{-3,4},{-3,-4}};
Xt_int local_start[2] = {1,2};
local_size[i & 3], local_start);
{{12, 13, 14, 15, 22, 23, 24, 25, 32, 33, 34, 35},
{15, 14, 13, 12, 25, 24, 23, 22, 35, 34, 33, 32},
{32, 33, 34, 35, 22, 23, 24, 25, 12, 13, 14, 15},
{35, 34, 33, 32, 25, 24, 23, 22, 15, 14, 13, 12},
{17, 16, 15, 14, 27, 26, 25, 24, 37, 36, 35, 34},
{14, 15, 16, 17, 24, 25, 26, 27, 34, 35, 36, 37},
{37, 36, 35, 34, 27, 26, 25, 24, 17, 16, 15, 14},
{34, 35, 36, 37, 24, 25, 26, 27, 14, 15, 16, 17},
{32, 33, 34, 35, 22, 23, 24, 25, 12, 13, 14, 15},
{35, 34, 33, 32, 25, 24, 23, 22, 15, 14, 13, 12},
{12, 13, 14, 15, 22, 23, 24, 25, 32, 33, 34, 35},
{15, 14, 13, 12, 25, 24, 23, 22, 35, 34, 33, 32},
{37, 36, 35, 34, 27, 26, 25, 24, 17, 16, 15, 14},
{34, 35, 36, 37, 24, 25, 26, 27, 14, 15, 16, 17},
{17, 16, 15, 14, 27, 26, 25, 24, 37, 36, 35, 34},
{14, 15, 16, 17, 24, 25, 26, 27, 34, 35, 36, 37}};
check_idxlist(idxsection, ref_indices[i], 12);
}
}
{
for (int i = 0; i < 16; ++i) {
int num_dimensions = 2;
Xt_int global_size[4][2] = {{5,6},{5,-6},{-5,6},{-5,-6}};
int local_size [4][2] = {{2,3},{2,-3},{-2,3},{-2,-3}};
Xt_int local_start[2] = {1,2};
local_size[i & 3], local_start);
{{8,9,10,14,15,16},
{10,9,8,16,15,14},
{14,15,16,8,9,10},
{16,15,14,10,9,8},
{9,8,7,15,14,13},
{7,8,9,13,14,15},
{15,14,13,9,8,7},
{13,14,15,7,8,9},
{20,21,22,14,15,16},
{22,21,20,16,15,14},
{14,15,16,20,21,22},
{16,15,14,22,21,20},
{21,20,19,15,14,13},
{19,20,21,13,14,15},
{15,14,13,21,20,19},
{13,14,15,19,20,21}};
check_idxlist(idxsection, ref_indices[i], 6);
}
}
{
for (int i = 0; i < 16; ++i) {
for (int j = 0; j < 16; ++j) {
int num_dimensions = 2;
Xt_int global_size[4][2] = {{5,10},{5,-10},{-5,10},{-5,-10}};
int local_size [4][2] = {{3,4},{3,-4},{-3,4},{-3,-4}};
Xt_int local_start[2] = {1,2};
{{12, 13, 14, 15, 22, 23, 24, 25, 32, 33, 34, 35},
{15, 14, 13, 12, 25, 24, 23, 22, 35, 34, 33, 32},
{32, 33, 34, 35, 22, 23, 24, 25, 12, 13, 14, 15},
{35, 34, 33, 32, 25, 24, 23, 22, 15, 14, 13, 12},
{17, 16, 15, 14, 27, 26, 25, 24, 37, 36, 35, 34},
{14, 15, 16, 17, 24, 25, 26, 27, 34, 35, 36, 37},
{37, 36, 35, 34, 27, 26, 25, 24, 17, 16, 15, 14},
{34, 35, 36, 37, 24, 25, 26, 27, 14, 15, 16, 17},
{32, 33, 34, 35, 22, 23, 24, 25, 12, 13, 14, 15},
{35, 34, 33, 32, 25, 24, 23, 22, 15, 14, 13, 12},
{12, 13, 14, 15, 22, 23, 24, 25, 32, 33, 34, 35},
{15, 14, 13, 12, 25, 24, 23, 22, 35, 34, 33, 32},
{37, 36, 35, 34, 27, 26, 25, 24, 17, 16, 15, 14},
{34, 35, 36, 37, 24, 25, 26, 27, 14, 15, 16, 17},
{17, 16, 15, 14, 27, 26, 25, 24, 37, 36, 35, 34},
{14, 15, 16, 17, 24, 25, 26, 27, 34, 35, 36, 37}};
local_size[i & 3], local_start);
local_size[j & 3], local_start);
idxvec_b);
check_idxlist(idxsection_intersection,
check_idxlist(idxsection_intersection_other,
}
}
}
{
int num_dimensions = 2;
Xt_int global_size[2] = {-5,6};
int local_size [2] = {-2,-3};
Xt_int local_start[2] = {1,2};
local_size, local_start);
Xt_int ref_indices[6] = {16,15,14,22,21,20};
check_idxlist(idxsection, ref_indices, 6);
Xt_int indices[34] = {-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,16,17,18,19,
20,20,21,22,23,24,25,26,27,28,29,30};
int ref_positions[34] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,1,-1,0,-1,-1,-1,
5,-1,4,3,-1,-1,-1,-1,-1,-1,-1,-1};
int positions[34];
PUT_ERR("error in xt_idxlist_get_positions_of_indices"
" (wrong number of unmatched indices)\n");
for (int i = 0; i < 34; ++i)
if (ref_positions[i] != positions[i])
PUT_ERR("error in xt_idxlist_get_positions_of_indices (wrong position)\n");
}
{
int num_dimensions = 3;
Xt_int global_size[3] = {5,5,2};
int local_size [3] = {3,4,1};
Xt_int local_start[3] = {2,0,1};
local_size, local_start);
Xt_int ref_indices[12] = {21, 23, 25, 27, 31, 33, 35, 37, 41, 43, 45, 47};
check_idxlist(idxsection, ref_indices, 12);
}
{
int num_dimensions = 4;
Xt_int global_size[4] = {3,2,5,2};
int local_size [4] = {3,1,4,1};
Xt_int local_start[4] = {0,1,1,0};
local_size, local_start);
Xt_int ref_indices[12] = {12, 14, 16, 18, 32, 34, 36, 38, 52, 54, 56, 58};
check_idxlist(idxsection, ref_indices, 12);
}
{
int num_dimensions = 3;
Xt_int global_size[3] = {4,4,4};
int local_size [3] = {0,0,0};
Xt_int local_start[3] = {2,0,1};
local_size, local_start);
unsigned ndim = 3;
Xt_int global_start_index = 0;
for (unsigned i = 0; i < ndim; ++i)
global_size_bb[i] = 4;
global_start_index, bounds);
for (unsigned i = 0; i < ndim; ++i)
PUT_ERR("ERROR: xt_idxlist_get_bounding_box\n");
}
{
int num_dimensions = 3;
Xt_int global_size[3] = {5,4,3};
int local_size [3] = {2,2,2};
Xt_int local_start[3] = {2,2,1};
local_size, local_start);
unsigned ndim = 3;
Xt_int global_start_index = 1;
global_size_bb[0] = 5;
global_size_bb[1] = 4;
global_size_bb[2] = 3;
global_start_index, bounds);
Xt_int ref_start[3] = {2,2,1};
for (unsigned i = 0; i < ndim; ++i)
if (bounds[i].
size != 2 || bounds[i].start != ref_start[i])
PUT_ERR("ERROR: xt_idxlist_get_bounding_box\n");
}
{
int num_dimensions = 4;
Xt_int global_size[4] = {5,2,2,3};
int local_size [4] = {2,2,1,2};
Xt_int local_start[4] = {2,0,1,1};
local_size, local_start);
unsigned ndim = 3;
Xt_int global_start_index = 1;
global_size_bb[0] = 5;
global_size_bb[1] = 4;
global_size_bb[2] = 3;
global_start_index, bounds);
Xt_int ref_start[3] = {2,1,1};
for (unsigned i = 0; i < ndim; ++i)
if (bounds[i].
size != ref_size[i] || bounds[i].start != ref_start[i])
PUT_ERR("ERROR: xt_idxlist_get_bounding_box\n");
}
MPI_Finalize();
return TEST_EXIT_CODE;
}
static void
struct Xt_stripe * ref_stripes,
int ref_num_stripes) {
check_idxlist(idxlist, ref_indices, num_indices);
int num_stripes;
check_stripes(stripes, num_stripes, ref_stripes, ref_num_stripes);
free(stripes);
{
= idxlist_pack_unpack_copy(idxlist);
check_idxlist(idxlist_copy, ref_indices, num_indices);
}
{
check_idxlist(idxlist_copy, ref_indices, num_indices);
}
}