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()