| 119 | } |
| 120 | |
| 121 | static void TestPicker(SimplePhilox* rnd, int size) { |
| 122 | VLOG(0) << "======= Testing size " << size; |
| 123 | |
| 124 | // Check that empty picker returns -1 |
| 125 | { |
| 126 | WeightedPicker picker(size); |
| 127 | picker.SetAllWeights(0); |
| 128 | for (int i = 0; i < 100; i++) EXPECT_EQ(picker.Pick(rnd), -1); |
| 129 | } |
| 130 | |
| 131 | // Create zero weights array |
| 132 | std::vector<int32> weights(size); |
| 133 | for (int elem = 0; elem < size; elem++) { |
| 134 | weights[elem] = 0; |
| 135 | } |
| 136 | |
| 137 | // Check that singleton picker always returns the same element |
| 138 | for (int elem = 0; elem < size; elem++) { |
| 139 | WeightedPicker picker(size); |
| 140 | picker.SetAllWeights(0); |
| 141 | picker.set_weight(elem, elem + 1); |
| 142 | for (int i = 0; i < 100; i++) EXPECT_EQ(picker.Pick(rnd), elem); |
| 143 | weights[elem] = 10; |
| 144 | picker.SetWeightsFromArray(size, &weights[0]); |
| 145 | for (int i = 0; i < 100; i++) EXPECT_EQ(picker.Pick(rnd), elem); |
| 146 | weights[elem] = 0; |
| 147 | } |
| 148 | |
| 149 | // Check that uniform picker generates elements roughly uniformly |
| 150 | { |
| 151 | WeightedPicker picker(size); |
| 152 | CheckUniform(rnd, &picker, 100000); |
| 153 | } |
| 154 | |
| 155 | // Check uniform picker that was grown piecemeal |
| 156 | if (size / 3 > 0) { |
| 157 | WeightedPicker picker(size / 3); |
| 158 | while (picker.num_elements() != size) { |
| 159 | picker.Append(1); |
| 160 | } |
| 161 | CheckUniform(rnd, &picker, 100000); |
| 162 | } |
| 163 | |
| 164 | // Check that skewed distribution works |
| 165 | if (size <= 10) { |
| 166 | // When picker grows one element at a time |
| 167 | WeightedPicker picker(size); |
| 168 | int32 weight = 1; |
| 169 | for (int elem = 0; elem < size; elem++) { |
| 170 | picker.set_weight(elem, weight); |
| 171 | weights[elem] = weight; |
| 172 | weight *= 2; |
| 173 | } |
| 174 | CheckSkewed(rnd, &picker, 1000000); |
| 175 | |
| 176 | // When picker is created from an array |
| 177 | WeightedPicker array_picker(0); |
| 178 | array_picker.SetWeightsFromArray(size, &weights[0]); |
no test coverage detected