7 #define TIMPI_UNIT_ASSERT(expr) \    11 using namespace TIMPI;
    23     for (
int d=0; d != M; ++d)
    25         int diffsize = std::abs(d-rank);
    26         int diffsqrt = std::sqrt(diffsize);
    27         if (diffsqrt*diffsqrt == diffsize)
    28           for (
int i=-1; i != diffsqrt; ++i)
    43     for (
int d=0; d != M; ++d)
    45         int diffsize = std::abs(d-rank);
    46         int diffsqrt = std::sqrt(diffsize);
    47         if (diffsqrt*diffsqrt == diffsize)
    49             std::vector<unsigned int> v;
    50             for (
int i=-1; i != diffsqrt; ++i)
    69     for (
int d=0; d != M; ++d)
    71         int diffsize = std::abs(d-rank);
    72         int diffsqrt = std::sqrt(diffsize);
    73         if (diffsqrt*diffsqrt == diffsize)
    76             for (
int i=-1; i != diffsqrt; ++i)
    77               data[d][0].push_back(d);
    78             data[d][1].push_back(d);
    94     for (
int d=0; d != M; ++d)
    96         int diffsize = std::abs(d-rank);
    97         int diffsqrt = std::sqrt(diffsize);
    98         if (diffsqrt*diffsqrt == diffsize)
   100             std::vector<std::vector<unsigned int>> vv(2);
   101             for (
int i=-1; i != diffsqrt; ++i)
   118     std::map<processor_id_type, std::vector<unsigned int> > data, received_data;
   125        const typename std::vector<unsigned int> & vec_received)
   127         auto & vec = received_data[pid];
   128         vec.insert(vec.end(), vec_received.begin(), vec_received.end());
   135     std::vector<std::size_t> checked_sizes(size, 0);
   136     for (
int p=rank; p < M; p += size)
   137       for (
int srcp=0; srcp != size; ++srcp)
   139           int diffsize = std::abs(srcp-p);
   140           int diffsqrt = std::sqrt(diffsize);
   141           if (diffsqrt*diffsqrt != diffsize)
   143               if (received_data.count(srcp))
   145                   const std::vector<unsigned int> & datum = received_data[srcp];
   146                   TIMPI_UNIT_ASSERT(std::count(datum.begin(), datum.end(), p) == std::ptrdiff_t(0));
   151           TIMPI_UNIT_ASSERT(received_data.count(srcp) == std::size_t(1));
   152           const std::vector<unsigned int> & datum = received_data[srcp];
   153           TIMPI_UNIT_ASSERT(std::count(datum.begin(), datum.end(), p) == std::ptrdiff_t(diffsqrt+1));
   154           checked_sizes[srcp] += diffsqrt+1;
   157     for (
int srcp=0; srcp != size; ++srcp)
   158       TIMPI_UNIT_ASSERT(checked_sizes[srcp] == received_data[srcp].size());
   179     std::map<processor_id_type, std::vector<unsigned int>> data, received_data;
   187        typename std::vector<unsigned int> && vec_received)
   189         auto & vec = received_data[pid];
   190         for (
auto & val : vec_received)
   191           vec.emplace_back(std::move(val));
   198     std::vector<std::size_t> checked_sizes(size, 0);
   199     for (
int p=rank; p < M; p += size)
   200       for (
int srcp=0; srcp != size; ++srcp)
   202           int diffsize = std::abs(srcp-p);
   203           int diffsqrt = std::sqrt(diffsize);
   204           if (diffsqrt*diffsqrt != diffsize)
   206               if (received_data.count(srcp))
   208                   const std::vector<unsigned int> & datum = received_data[srcp];
   209                   TIMPI_UNIT_ASSERT(std::count(datum.begin(), datum.end(), p) == std::ptrdiff_t(0));
   214           TIMPI_UNIT_ASSERT(received_data.count(srcp) == std::size_t(1));
   215           const std::vector<unsigned int> & datum = received_data[srcp];
   216           TIMPI_UNIT_ASSERT(std::count(datum.begin(), datum.end(), p) == std::ptrdiff_t(diffsqrt+1));
   217           checked_sizes[srcp] += diffsqrt+1;
   220     for (
int srcp=0; srcp != size; ++srcp)
   221       TIMPI_UNIT_ASSERT(checked_sizes[srcp] == received_data[srcp].size());
   236     std::map<processor_id_type, std::vector<unsigned int> > data, received_data;
   240     auto compose_replies =
   243        const std::vector<unsigned int> & query,
   244        std::vector<unsigned int> & response)
   246         const std::size_t query_size = query.size();
   247         response.resize(query_size);
   248         for (
unsigned int i=0; i != query_size; ++i)
   249           response[i] = query[i]*query[i];
   253     auto collect_replies =
   256        const std::vector<unsigned int> & query,
   257        const std::vector<unsigned int> & response)
   259         const std::size_t query_size = query.size();
   260         TIMPI_UNIT_ASSERT(query_size == response.size());
   261         for (
unsigned int i=0; i != query_size; ++i)
   263             TIMPI_UNIT_ASSERT(query[i]*query[i] == response[i]);
   265         received_data[pid] = response;
   269     unsigned int * ex = 
nullptr;
   271       (*
TestCommWorld, data, compose_replies, collect_replies, ex);
   274     for (
int p=0; p != M; ++p)
   276         TIMPI_UNIT_ASSERT(data[p].size() == received_data[p].size());
   277         for (std::size_t i = 0; i != data[p].size(); ++i)
   278           TIMPI_UNIT_ASSERT(data[p][i]*data[p][i] == received_data[p][i]);
   300     std::map<processor_id_type, std::vector<std::vector<unsigned int>>> data;
   301     std::map<processor_id_type, std::vector<unsigned int>> received_data;
   308        const typename std::vector<std::vector<unsigned int>> & vecvec_received)
   310         TIMPI_UNIT_ASSERT(vecvec_received.size() == std::size_t(2));
   311         TIMPI_UNIT_ASSERT(vecvec_received[1].size() == std::size_t(1));
   312         TIMPI_UNIT_ASSERT(vecvec_received[0][0] == vecvec_received[1][0]);
   313         auto & vec = received_data[pid];
   314         vec.insert(vec.end(), vecvec_received[0].begin(), vecvec_received[0].end());
   321     std::vector<std::size_t> checked_sizes(size, 0);
   322     for (
int p=rank; p < M; p += size)
   323       for (
int srcp=0; srcp != size; ++srcp)
   325           int diffsize = std::abs(srcp-p);
   326           int diffsqrt = std::sqrt(diffsize);
   327           if (diffsqrt*diffsqrt != diffsize)
   329               if (received_data.count(srcp))
   331                   const std::vector<unsigned int> & datum = received_data[srcp];
   332                   TIMPI_UNIT_ASSERT(std::count(datum.begin(), datum.end(), p) == std::ptrdiff_t(0));
   337           TIMPI_UNIT_ASSERT(received_data.count(srcp) == std::size_t(1));
   338           const std::vector<unsigned int> & datum = received_data[srcp];
   339           TIMPI_UNIT_ASSERT(std::count(datum.begin(), datum.end(), p) == std::ptrdiff_t(diffsqrt+1));
   340           checked_sizes[srcp] += diffsqrt+1;
   343     for (
int srcp=0; srcp != size; ++srcp)
   344       TIMPI_UNIT_ASSERT(checked_sizes[srcp] == received_data[srcp].size());
   371     std::map<processor_id_type, std::vector<std::vector<unsigned int>>> data;
   372     std::map<processor_id_type, std::vector<std::vector<unsigned int>>> received_data;
   376     auto compose_replies =
   379        const std::vector<std::vector<unsigned int>> & query,
   380        std::vector<std::vector<unsigned int>> & response)
   382         const std::size_t query_size = query.size();
   383         response.resize(query_size);
   384         for (
unsigned int i=0; i != query_size; ++i)
   386             const std::size_t query_i_size = query[i].size();
   387             response[i].resize(query_i_size);
   388             for (
unsigned int j=0; j != query_i_size; ++j)
   389             response[i][j] = query[i][j]*query[i][j];
   394     auto collect_replies =
   397        const std::vector<std::vector<unsigned int>> & query,
   398        const std::vector<std::vector<unsigned int>> & response)
   400         const std::size_t query_size = query.size();
   401         TIMPI_UNIT_ASSERT(query_size == response.size());
   402         for (
unsigned int i=0; i != query_size; ++i)
   404             const std::size_t query_i_size = query[i].size();
   405             TIMPI_UNIT_ASSERT(query_i_size == response[i].size());
   406             for (
unsigned int j=0; j != query_i_size; ++j)
   407               TIMPI_UNIT_ASSERT(query[i][j]*query[i][j] == response[i][j]);
   409         auto & vec = received_data[pid];
   410         vec.emplace_back(response[0].begin(), response[0].end());
   411         TIMPI_UNIT_ASSERT(response[1].size() == std::size_t(1));
   412         TIMPI_UNIT_ASSERT(response[1][0] == response[0][0]);
   413         vec.emplace_back(response[1].begin(), response[1].end());
   417     std::vector<unsigned int> * ex = 
nullptr;
   419       (*
TestCommWorld, data, compose_replies, collect_replies, ex);
   422     for (
int p=0; p != M; ++p)
   424         TIMPI_UNIT_ASSERT(data[p].size() == received_data[p].size());
   425         for (std::size_t i = 0; i != data[p].size(); ++i)
   426           for (std::size_t j = 0; j != data[p][i].size(); ++j)
   427             TIMPI_UNIT_ASSERT(data[p][i][j]*data[p][i][j] == received_data[p][i][j]);
   457     std::multimap<processor_id_type, std::vector<unsigned int> > data, received_data;
   464        const typename std::vector<unsigned int> & vec_received)
   466         received_data.emplace(pid, vec_received);
   473     std::vector<std::size_t> checked_sizes(size, 0);
   474     for (
int p=rank; p < M; p += size)
   475       for (
int srcp=0; srcp != size; ++srcp)
   477           int diffsize = std::abs(srcp-p);
   478           int diffsqrt = std::sqrt(diffsize);
   479           auto rng = received_data.equal_range(srcp);
   480           if (diffsqrt*diffsqrt != diffsize)
   482               for (
auto pv_it = rng.first; pv_it != rng.second; ++pv_it)
   484                   TIMPI_UNIT_ASSERT(std::count(pv_it->second.begin(), pv_it->second.end(), p) == std::ptrdiff_t(0));
   489           TIMPI_UNIT_ASSERT(rng.first != rng.second);
   490           for (
auto pv_it = rng.first; pv_it != rng.second; ++pv_it)
   492               std::ptrdiff_t cnt = std::count(pv_it->second.begin(), pv_it->second.end(), p);
   495                   TIMPI_UNIT_ASSERT(cnt == std::ptrdiff_t(diffsqrt+1));
   496                   auto pv_it2 = pv_it; ++pv_it2;
   497                   TIMPI_UNIT_ASSERT(pv_it2 != rng.second);
   498                   std::ptrdiff_t cnt2 = std::count(pv_it2->second.begin(), pv_it2->second.end(), p);
   499                   TIMPI_UNIT_ASSERT(cnt2 == std::ptrdiff_t(1));
   500                   checked_sizes[srcp] += cnt + cnt2;
   506     for (
int srcp=0; srcp != size; ++srcp)
   508         std::size_t total_size = 0;
   509         auto rng = received_data.equal_range(srcp);
   510         for (
auto pv_it = rng.first; pv_it != rng.second; ++pv_it)
   511           total_size += pv_it->second.size();
   512         TIMPI_UNIT_ASSERT(checked_sizes[srcp] == total_size);
   542     std::multimap<processor_id_type, std::vector<std::vector<unsigned int>>> data, received_data;
   549        const typename std::vector<std::vector<unsigned int>> & vecvec_received)
   551         received_data.emplace(pid, vecvec_received);
   558     std::vector<std::size_t> checked_sizes(size, 0);
   559     for (
int p=rank; p < M; p += size)
   560       for (
int srcp=0; srcp != size; ++srcp)
   562           int diffsize = std::abs(srcp-p);
   563           int diffsqrt = std::sqrt(diffsize);
   564           auto rng = received_data.equal_range(srcp);
   565           if (diffsqrt*diffsqrt != diffsize)
   567               for (
auto pvv = rng.first; pvv != rng.second; ++pvv)
   569                   for (
auto & v : pvv->second)
   570                   TIMPI_UNIT_ASSERT(std::count(v.begin(), v.end(), p) == std::ptrdiff_t(0));
   575           TIMPI_UNIT_ASSERT(rng.first != rng.second);
   576           for (
auto pvv_it = rng.first; pvv_it != rng.second; ++pvv_it)
   578               if(pvv_it->second.size() != std::size_t(2))
   580               TIMPI_UNIT_ASSERT(pvv_it->second.size() == std::size_t(2));
   581               std::ptrdiff_t cnt = std::count(pvv_it->second[0].begin(), pvv_it->second[0].end(), p);
   584                   TIMPI_UNIT_ASSERT(cnt == std::ptrdiff_t(diffsqrt+1));
   585                   std::ptrdiff_t cnt2 = std::count(pvv_it->second[1].begin(), pvv_it->second[1].end(), p);
   586                   TIMPI_UNIT_ASSERT(cnt2 == std::ptrdiff_t(1));
   587                   auto pvv_it2 = pvv_it; ++pvv_it2;
   588                   TIMPI_UNIT_ASSERT(pvv_it2 != rng.second);
   589                   TIMPI_UNIT_ASSERT(pvv_it2->second.size() == std::size_t(1));
   590                   std::ptrdiff_t cnt3 = std::count(pvv_it2->second[0].begin(), pvv_it2->second[0].end(), p);
   591                   TIMPI_UNIT_ASSERT(cnt3 == std::ptrdiff_t(1));
   592                   checked_sizes[srcp] += cnt + cnt2 + cnt3;
   596               timpi_assert(pvv_it != rng.second);
   600     for (
int srcp=0; srcp != size; ++srcp)
   602         std::size_t total_size = 0;
   603         auto rng = received_data.equal_range(srcp);
   604         for (
auto pvv = rng.first; pvv != rng.second; ++pvv)
   605           for (
auto & v : pvv->second)
   606             total_size += v.size();
   607         TIMPI_UNIT_ASSERT(checked_sizes[srcp] == total_size);
   632     std::map<processor_id_type, std::vector<unsigned int> > data, received_data;
   637     for (
int i=0; i != M; ++i)
   644        const typename std::vector<unsigned int> & vec_received)
   647         TIMPI_UNIT_ASSERT (!vec_received.empty())
   649         auto & vec = received_data[pid];
   650         vec.insert(vec.end(), vec_received.begin(), vec_received.end());
   654     bool caught_exception = 
false;
   660     catch (std::logic_error & e) {
   661       caught_exception = 
true;
   662       std::regex msg_regex(
"empty data");
   663       TIMPI_UNIT_ASSERT(std::regex_search(e.what(), msg_regex));
   668       TIMPI_UNIT_ASSERT(caught_exception);
   673     std::vector<std::size_t> checked_sizes(size, 0);
   674     for (
int p=rank; p < M; p += size)
   675       for (
int srcp=0; srcp != size; ++srcp)
   677           int diffsize = std::abs(srcp-p);
   678           int diffsqrt = std::sqrt(diffsize);
   679           if (diffsqrt*diffsqrt != diffsize)
   681               if (received_data.count(srcp))
   683                   const std::vector<unsigned int> & datum = received_data[srcp];
   684                   TIMPI_UNIT_ASSERT(std::count(datum.begin(), datum.end(), p) == std::ptrdiff_t(0));
   689           TIMPI_UNIT_ASSERT(received_data.count(srcp) == std::size_t(1));
   690           const std::vector<unsigned int> & datum = received_data[srcp];
   691           TIMPI_UNIT_ASSERT(std::count(datum.begin(), datum.end(), p) == std::ptrdiff_t(diffsqrt+1));
   692           checked_sizes[srcp] += diffsqrt+1;
   695     for (
int srcp=0; srcp != size; ++srcp)
   696       TIMPI_UNIT_ASSERT(checked_sizes[srcp] == received_data[srcp].size());
   741 int main(
int argc, 
const char * 
const * argv)
 
void testPullVecVecImpl(int M)
void pull_parallel_vector_data(const Communicator &comm, const MapToVectors &queries, GatherFunctor &gather_data, const ActionFunctor &act_on_data, const datum *example)
Send query vectors, receive and answer them with vectors of data, then act on those answers...
void testPushMultimapVecVec()
void sync_type(const SyncType st)
Explicitly sets the SyncType used for sync operations. 
The TIMPIInit class, when constructed, initializes any dependent libraries (e.g. 
void testPushVecVecImpl(int M)
processor_id_type rank() const
int main(int argc, const char *const *argv)
void testPullVecVecOversized()
void testPushMultimapVecVecOversized()
Encapsulates the MPI_Comm object. 
processor_id_type size() const
void push_parallel_vector_data(const Communicator &comm, MapToVectors &&data, const ActionFunctor &act_on_data)
Send and receive and act on vectors of data. 
uint8_t processor_id_type
void testPushMultimapOversized()
void testPushMultimapVecVecImpl(int M)
Communicator * TestCommWorld
void fill_scalar_data(std::map< processor_id_type, std::vector< unsigned int >> &data, int M)
void fill_vector_data(std::map< processor_id_type, std::vector< std::vector< unsigned int >>> &data, int M)
void testPushMultimapImpl(int M)
void testPushVecVecOversized()
const Communicator & comm() const
Returns the Communicator created by this object, which will be a compatibility shim if MPI is not ena...
void duplicate(const Communicator &comm)
void testStringSyncType()