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 }