1 module tests.grid;
2 
3 import tests.utils;
4 import vivaldi;
5 
6 /**
7  * Generates an NxN matrix of latencies in a 2D grid, a fixed distance
8  * apart.
9  */
10 template grid(size_t n, double distance) {
11     import std.math : sqrt;
12 
13     auto grid() nothrow @safe @nogc {
14         auto matrix = matrix!n;
15 
16         const dim = sqrt(cast(double)n);
17 
18         for (size_t i = 0; i < n; i++) {
19             for (size_t j = i + 1; j < n; j++) {
20                 const x1 = i % dim;
21                 const y1 = i / dim;
22                 const x2 = j % dim;
23                 const y2 = j / dim;
24 
25                 const dx = x2 - x1;
26                 const dy = y2 - y1;
27 
28                 const z = sqrt(dx*dx + dy*dy);
29 
30                 const double rtt = z * distance;
31 
32                 matrix[i][j] = rtt;
33                 matrix[j][i] = rtt;
34             }
35         }
36 
37         return matrix;
38     }
39 }
40 
41 @("grid")
42 unittest {
43     import std.format;
44     import std.random;
45 
46     // Stable seed for random unitvectors.
47     rndGen().seed(1);
48 
49     alias N = Node!(Coordinate!8, 20);
50 
51     immutable distance = 0.01;
52     immutable size_t n = 25;
53     auto cycles = 1000;
54 
55     N[n] nodes = new N[n];
56     double[n][n] matrix = grid!(n, distance);
57 
58     simulate!(N, 3, n)(nodes, matrix, cycles);
59     auto stats = evaluate!(N, n)(nodes, matrix);
60 
61     assert(stats.mean <= 0.0015, format("mean=%s", stats.mean));
62     assert(stats.max <= 0.022, format("max=%s", stats.max));
63 }