xrpld
Loading...
Searching...
No Matches
PeerGroup.h
1#pragma once
2
3#include <csf/Peer.h>
4#include <csf/SimTime.h>
5#include <csf/Validation.h>
6#include <csf/random.h>
7
8#include <algorithm>
9#include <cassert>
10#include <cstddef>
11#include <iterator>
12#include <ostream>
13#include <random>
14#include <set>
15#include <utility>
16#include <vector>
17
18namespace xrpl::test::csf {
19
30{
33
34public:
35 using iterator = peers_type::iterator;
36 using const_iterator = peers_type::const_iterator;
37 using reference = peers_type::reference;
38 using const_reference = peers_type::const_reference;
39
40 PeerGroup() = default;
41 PeerGroup(Peer* peer) : peers_{1, peer}
42 {
43 }
44 PeerGroup(std::vector<Peer*>&& peers) : peers_{std::move(peers)}
45 {
47 }
48 PeerGroup(std::vector<Peer*> const& peers) : peers_{peers}
49 {
51 }
52
53 PeerGroup(std::set<Peer*> const& peers) : peers_{peers.begin(), peers.end()}
54 {
55 }
56
59 {
60 return peers_.begin();
61 }
62
65 {
66 return peers_.end();
67 }
68
69 [[nodiscard]] const_iterator
70 begin() const
71 {
72 return peers_.begin();
73 }
74
75 [[nodiscard]] const_iterator
76 end() const
77 {
78 return peers_.end();
79 }
80
83 {
84 return peers_[i];
85 }
86
87 bool
88 contains(Peer const* p)
89 {
90 return std::ranges::find(peers_, p) != peers_.end();
91 }
92
93 bool
95 {
96 return std::ranges::find_if(peers_, [id](Peer const* p) { return p->id == id; }) !=
97 peers_.end();
98 }
99
100 [[nodiscard]] std::size_t
101 size() const
102 {
103 return peers_.size();
104 }
105
113 void
114 trust(PeerGroup const& o)
115 {
116 for (Peer* p : peers_)
117 {
118 for (Peer* target : o.peers_)
119 {
120 p->trust(*target);
121 }
122 }
123 }
124
132 void
134 {
135 for (Peer* p : peers_)
136 {
137 for (Peer* target : o.peers_)
138 {
139 p->untrust(*target);
140 }
141 }
142 }
143
153 void
155 {
156 for (Peer* p : peers_)
157 {
158 for (Peer* target : o.peers_)
159 {
160 // cannot send messages to self over network
161 if (p != target)
162 p->connect(*target, delay);
163 }
164 }
165 }
166
174 void
176 {
177 for (Peer* p : peers_)
178 {
179 for (Peer* target : o.peers_)
180 {
181 p->disconnect(*target);
182 }
183 }
184 }
185
195 void
197 {
198 trust(o);
199 connect(o, delay);
200 }
201
211 void
213 {
214 for (Peer* peer : peers_)
215 {
216 for (Peer* to : peer->trustGraph.trustedPeers(peer))
217 {
218 peer->connect(*to, delay);
219 }
220 }
221 }
222
223 // Union of PeerGroups
224 friend PeerGroup
225 operator+(PeerGroup const& a, PeerGroup const& b)
226 {
227 PeerGroup res;
229 return res;
230 }
231
232 // Set difference of PeerGroups
233 friend PeerGroup
234 operator-(PeerGroup const& a, PeerGroup const& b)
235 {
236 PeerGroup res;
237
239
240 return res;
241 }
242
244 operator<<(std::ostream& o, PeerGroup const& t)
245 {
246 o << "{";
247 bool first = true;
248 for (Peer const* p : t)
249 {
250 if (!first)
251 o << ", ";
252 first = false;
253 o << p->id;
254 }
255 o << "}";
256 return o;
257 }
258};
259
279template <class RandomNumberDistribution, class Generator>
282 PeerGroup& peers,
283 std::vector<double> const& ranks,
284 int numGroups,
285 RandomNumberDistribution sizeDist,
286 Generator& g)
287{
288 assert(peers.size() == ranks.size());
289
291 groups.reserve(numGroups);
292 std::vector<Peer*> rawPeers(peers.begin(), peers.end());
293 std::generate_n(std::back_inserter(groups), numGroups, [&]() {
294 std::vector<Peer*> res = randomWeightedShuffle(rawPeers, ranks, g);
295 res.resize(sizeDist(g));
296 return PeerGroup(std::move(res));
297 });
298
299 return groups;
300}
301
307template <class RandomNumberDistribution, class Generator>
308void
310 PeerGroup& peers,
311 std::vector<double> const& ranks,
312 int numGroups,
313 RandomNumberDistribution sizeDist,
314 Generator& g)
315{
316 std::vector<PeerGroup> const groups = randomRankedGroups(peers, ranks, numGroups, sizeDist, g);
317 std::uniform_int_distribution<int> u(0, groups.size() - 1); // NOLINT(misc-const-correctness)
318
319 for (auto& peer : peers)
320 {
321 for (auto& target : groups[u(g)])
322 peer->trust(*target);
323 }
324}
325
331template <class RandomNumberDistribution, class Generator>
332void
334 PeerGroup& peers,
335 std::vector<double> const& ranks,
336 int numGroups,
337 RandomNumberDistribution sizeDist,
338 Generator& g,
339 SimDuration delay)
340{
341 std::vector<PeerGroup> const groups = randomRankedGroups(peers, ranks, numGroups, sizeDist, g);
342 std::uniform_int_distribution<int> u(0, groups.size() - 1); // NOLINT(misc-const-correctness)
343
344 for (auto& peer : peers)
345 {
346 for (auto& target : groups[u(g)])
347 peer->connect(*target, delay);
348 }
349}
350
351} // namespace xrpl::test::csf
T back_inserter(T... args)
A group of simulation Peers.
Definition PeerGroup.h:30
peers_type::reference reference
Definition PeerGroup.h:37
peers_type::const_reference const_reference
Definition PeerGroup.h:38
friend PeerGroup operator+(PeerGroup const &a, PeerGroup const &b)
Definition PeerGroup.h:225
const_reference operator[](std::size_t i) const
Definition PeerGroup.h:82
bool contains(PeerID id)
Definition PeerGroup.h:94
void connectFromTrust(SimDuration delay)
Establish network connections based on trust relations.
Definition PeerGroup.h:212
void trust(PeerGroup const &o)
Establish trust.
Definition PeerGroup.h:114
void disconnect(PeerGroup const &o)
Destroy network connection.
Definition PeerGroup.h:175
void connect(PeerGroup const &o, SimDuration delay)
Establish network connection.
Definition PeerGroup.h:154
std::size_t size() const
Definition PeerGroup.h:101
friend std::ostream & operator<<(std::ostream &o, PeerGroup const &t)
Definition PeerGroup.h:244
std::vector< Peer * > peers_type
Definition PeerGroup.h:31
void trustAndConnect(PeerGroup const &o, SimDuration delay)
Establish trust and network connection.
Definition PeerGroup.h:196
peers_type::iterator iterator
Definition PeerGroup.h:35
PeerGroup(std::vector< Peer * > &&peers)
Definition PeerGroup.h:44
const_iterator end() const
Definition PeerGroup.h:76
bool contains(Peer const *p)
Definition PeerGroup.h:88
void untrust(PeerGroup const &o)
Revoke trust.
Definition PeerGroup.h:133
friend PeerGroup operator-(PeerGroup const &a, PeerGroup const &b)
Definition PeerGroup.h:234
const_iterator begin() const
Definition PeerGroup.h:70
PeerGroup(std::set< Peer * > const &peers)
Definition PeerGroup.h:53
peers_type::const_iterator const_iterator
Definition PeerGroup.h:36
PeerGroup(std::vector< Peer * > const &peers)
Definition PeerGroup.h:48
T find(T... args)
T generate_n(T... args)
STL namespace.
SimClock::duration SimDuration
Definition SimTime.h:14
TaggedInteger< std::uint32_t, PeerIDTag > PeerID
Definition Validation.h:17
std::vector< PeerGroup > randomRankedGroups(PeerGroup &peers, std::vector< double > const &ranks, int numGroups, RandomNumberDistribution sizeDist, Generator &g)
Randomly generate peer groups according to ranks.
Definition PeerGroup.h:281
void randomRankedConnect(PeerGroup &peers, std::vector< double > const &ranks, int numGroups, RandomNumberDistribution sizeDist, Generator &g, SimDuration delay)
Generate random network groups based on peer rankings.
Definition PeerGroup.h:333
void randomRankedTrust(PeerGroup &peers, std::vector< double > const &ranks, int numGroups, RandomNumberDistribution sizeDist, Generator &g)
Generate random trust groups based on peer rankings.
Definition PeerGroup.h:309
std::vector< T > randomWeightedShuffle(std::vector< T > v, std::vector< double > w, G &g)
Return a randomly shuffled copy of vector based on weights w.
Dir::ConstIterator const_iterator
Definition Dir.cpp:16
T reserve(T... args)
T resize(T... args)
T set_difference(T... args)
T set_union(T... args)
T size(T... args)
T sort(T... args)
A single peer in the simulation.
TrustGraph< Peer * > & trustGraph
Handle to Trust graph of network.