Data is send through a ring of nodes and every node transforms data with own function.
#include <iostream>
#include <vector>
#include <array>
#include <graybat/Cage.hpp>
#include <graybat/communicationPolicy/BMPI.hpp>
#include <graybat/graphPolicy/BGL.hpp>
#include <graybat/mapping/Consecutive.hpp>
#include <graybat/mapping/Random.hpp>
#include <graybat/mapping/Roundrobin.hpp>
#include <graybat/pattern/Ring.hpp>
void process(std::tuple<unsigned, std::string> &a){
std::get<0>(a)++;
std::get<1>(a) += " world";
}
};
int exp() {
typedef CP::Config Config;
typedef typename Cage::Event Event;
typedef typename Cage::Vertex Vertex;
const unsigned nRingLinks = 50;
Config config;
Cage cage(config);
assert(cage.getPeers().size() >= nRingLinks);
std::vector<Event> events;
std::array<std::tuple<unsigned, std::string>, 1> input{{std::make_tuple(0, "hello")}};
std::array<std::tuple<unsigned, std::string>, 1> output;
std::array<std::tuple<unsigned, std::string>, 1> intermediate;
const Vertex stimula = cage.getVertex(0);
for(Vertex v : cage.hostedVertices){
if(v == stimula){
v.spread(input, events);
std::cout << "Input: " << std::get<0>(input[0]) << std::endl;
}
while(true){
v.collect(intermediate);
v().process(intermediate[0]);
std::cout << "Increment: " << std::get<0>(intermediate[0]) << std::endl;
v.spread(intermediate);
}
}
return 0;
}
int main(){
exp();
return 0;
}