12 const size_t vertexTag;
19 template<
typename T_Cage>
20 std::vector<typename T_Cage::Vertex> operator()(
const unsigned processID,
const unsigned processCount, T_Cage &cage){
22 using CommunicationPolicy =
typename T_Cage::CommunicationPolicy;
23 using Vertex =
typename T_Cage::Vertex;
24 using Context =
typename CommunicationPolicy::Context;
25 using VAddr =
typename CommunicationPolicy::VAddr;
27 std::vector<VAddr> peersWithSameTag;
29 CommunicationPolicy& comm = cage.comm;
30 Context context = comm.getGlobalContext();
35 std::array<size_t, 1> sendData{vertexTag};
36 for(VAddr vAddr = 0; vAddr < context.size(); vAddr++){
37 comm.asyncSend(vAddr, 0, context, sendData);
40 for(VAddr vAddr = 0; vAddr < context.size(); vAddr++){
41 std::array<size_t, 1> recvData{0};
42 comm.recv(vAddr, 0, context, recvData);
43 if(recvData[0] == vertexTag){
44 peersWithSameTag.push_back(vAddr);
49 std::sort(peersWithSameTag.begin(), peersWithSameTag.end());
51 const size_t nPeers = peersWithSameTag.size();
54 std::vector<Vertex> vertices = cage.getVertices();
55 std::vector<Vertex> myVertices;
57 for(
size_t i = 0; i < vertices.size(); ++i){
58 if(vertices[i]().tag == vertexTag){
59 if(peersWithSameTag.at(peer_i) == context.getVAddr()){
60 myVertices.push_back(vertices[i]);
63 peer_i = (peer_i + 1 % nPeers);
Definition: Filter.hpp:10