1 module tests.random;
2 
3 import tests.utils;
4 import vivaldi;
5 
6 /**
7  * Generates an NxN matrix of latencies using a randomized normal
8  * distribution.
9  */
10 template random(size_t n, double mean, double stddev) {
11 
12     import mir.random;
13     import mir.random.variable;
14 
15     auto random() nothrow @safe @nogc {
16         Random gen = Random(1);
17         auto rv = NormalVariable!double(mean, stddev);
18         auto matrix = matrix!n;
19 
20         for (size_t i = 0; i < n; i++) {
21             for (size_t j = i + 1; j < n; j++) {
22                 const rtt = rv(gen);
23 
24                 matrix[i][j] = rtt;
25                 matrix[j][i] = rtt;
26             }
27         }
28 
29         return matrix;
30     }
31 }
32 
33 @("random")
34 unittest {
35     import std.format;
36     import std.random;
37 
38     // Stable seed for random unitvectors.
39     rndGen().seed(1);
40 
41     alias N = Node!(Coordinate!8, 20);
42 
43     immutable double mean = 0.1;
44     immutable double stddev = 0.01;
45     immutable size_t n = 25;
46     auto cycles = 1000;
47 
48     N[n] nodes = new N[n];
49     double[n][n] matrix = random!(n, mean, stddev);
50 
51     simulate!(N, 3, n)(nodes, matrix, cycles);
52     auto stats = evaluate!(N, n)(nodes, matrix);
53 
54     assert(stats.mean <= 0.075, format("mean=%s", stats.mean));
55     assert(stats.max <= 0.33, format("max=%s", stats.max));
56 }