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 }