File: testrandom.c

package info (click to toggle)
kissat 4.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,068 kB
  • sloc: ansic: 39,201; sh: 1,226; makefile: 91
file content (95 lines) | stat: -rw-r--r-- 3,509 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "../src/random.h"

#include "test.h"

static void test_random_range (void) {
  srand (42);
  generator random;
  const unsigned rounds = (tissat_big ? 100 : 10);
  for (unsigned seed = 0; seed < rounds; seed++) {
#define M 100
    random = seed;
    printf ("seed %u\n", seed);
    unsigned count[M];
    const unsigned L = rand () % 1000;
    const unsigned R = L + (rand () % M) + 1;
    const unsigned D = R - L;
    const unsigned N = 1000 * D;
    printf ("generating %u in the range [%u..%u) of size %u\n", N, L, R, D);
    const unsigned expected = N / D;
    assert (expected > 0);
    const double percent = 20;
    unsigned epsilon = percent / 100 * expected;
    if (!epsilon)
      epsilon = 1;
    assert (epsilon <= expected);
    printf ("expected %u epsilon %u = %.0f %% of %u (%u .. %u)\n", expected,
            epsilon, percent, expected, expected - epsilon,
            expected + epsilon);
    memset (count, 0, sizeof count);
    for (unsigned i = 0; i < N; i++) {
      const unsigned picked = kissat_pick_random (&random, L, R);
      assert (L <= picked), assert (picked < R);
      count[picked - L]++;
    }
    unsigned min = UINT_MAX, max = 0;
    for (unsigned i = L; i < R; i++) {
      const unsigned tmp = count[i - L];
      max = MAX (tmp, max);
      min = MIN (tmp, min);
      printf ("count[%u] = %u\n", i, tmp);
    }
    printf ("min %u, max %u, range %.0f%%\n", min, max,
            100.0 * (max - min + 1) / expected);
    for (unsigned i = L; i < R; i++)
      if (count[i - L] < expected - epsilon)
        FATAL ("count[%u] = %u but expected at least %u = %u - %u", i,
               count[i - L], expected - epsilon, expected, epsilon);
      else if (count[i - L] > expected + epsilon)
        FATAL ("count[%u] = %u but expected at most %u = %u + %u", i,
               count[i - L], expected + epsilon, expected, epsilon);
  }
}

static void test_random_bool (void) {
  generator random;
  const unsigned rounds = (tissat_big ? 100 : 10);
  for (unsigned seed = 0; seed < rounds; seed++) {
    random = seed;
    printf ("seed %u\n", seed);
    unsigned count[2];
    const unsigned N = 10000;
    printf ("generating %u random Boolean numbers\n", N);
    const unsigned expected = N / 2;
    assert (expected > 0);
    const double percent = 10;
    unsigned epsilon = percent / 100 * expected;
    assert (epsilon);
    printf ("expected %u epsilon %u = %.0f %% of %u (%u .. %u)\n", expected,
            epsilon, percent, expected, expected - epsilon,
            expected + epsilon);
    memset (count, 0, sizeof count);
    for (unsigned i = 0; i < N; i++) {
      const bool picked = kissat_pick_bool (&random);
      count[picked]++;
    }
    for (unsigned i = 0; i < 2; i++)
      printf ("count[%u] = %u\n", i, count[i]);
    unsigned min = MIN (count[0], count[1]);
    unsigned max = MAX (count[0], count[1]);
    printf ("min %u, max %u, range %.0f%%\n", min, max,
            100.0 * (max - min + 1) / expected);
    for (unsigned i = 0; i < 2; i++)
      if (count[i] < expected - epsilon)
        FATAL ("count[%u] = %u but expected at least %u = %u - %u", i,
               count[i], expected - epsilon, expected, epsilon);
      else if (count[i] > expected + epsilon)
        FATAL ("count[%u] = %u but expected at most %u = %u + %u", i,
               count[i], expected + epsilon, expected, epsilon);
  }
}

void tissat_schedule_random (void) {
  SCHEDULE_FUNCTION (test_random_range);
  SCHEDULE_FUNCTION (test_random_bool);
}