mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
c5917e5476
Same as r311392 with some fixes for library dependencies. Thanks to Chapuni for helping work those out! Original commit message: This introduces the FuzzMutate library, which provides structured fuzzing for LLVM IR, as described in my EuroLLVM 2017 talk. Most of the basic mutators to inject and delete IR are provided, with support for most basic operations. llvm-svn: 311402
70 lines
2.1 KiB
C++
70 lines
2.1 KiB
C++
//===- ReservoirSampler.cpp - Tests for the ReservoirSampler --------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/FuzzMutate/Random.h"
|
|
#include "gtest/gtest.h"
|
|
#include <random>
|
|
|
|
using namespace llvm;
|
|
|
|
TEST(ReservoirSamplerTest, OneItem) {
|
|
std::mt19937 Rand;
|
|
auto Sampler = makeSampler(Rand, 7, 1);
|
|
ASSERT_FALSE(Sampler.isEmpty());
|
|
ASSERT_EQ(7, Sampler.getSelection());
|
|
}
|
|
|
|
TEST(ReservoirSamplerTest, NoWeight) {
|
|
std::mt19937 Rand;
|
|
auto Sampler = makeSampler(Rand, 7, 0);
|
|
ASSERT_TRUE(Sampler.isEmpty());
|
|
}
|
|
|
|
TEST(ReservoirSamplerTest, Uniform) {
|
|
std::mt19937 Rand;
|
|
|
|
// Run three chi-squared tests to check that the distribution is reasonably
|
|
// uniform.
|
|
std::vector<int> Items = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
|
|
|
|
int Failures = 0;
|
|
for (int Run = 0; Run < 3; ++Run) {
|
|
std::vector<int> Counts(Items.size(), 0);
|
|
|
|
// We need $np_s > 5$ at minimum, but we're better off going a couple of
|
|
// orders of magnitude larger.
|
|
int N = Items.size() * 5 * 100;
|
|
for (int I = 0; I < N; ++I) {
|
|
auto Sampler = makeSampler(Rand, Items);
|
|
Counts[Sampler.getSelection()] += 1;
|
|
}
|
|
|
|
// Knuth. TAOCP Vol. 2, 3.3.1 (8):
|
|
// $V = \frac{1}{n} \sum_{s=1}^{k} \left(\frac{Y_s^2}{p_s}\right) - n$
|
|
double Ps = 1.0 / Items.size();
|
|
double Sum = 0.0;
|
|
for (int Ys : Counts)
|
|
Sum += Ys * Ys / Ps;
|
|
double V = (Sum / N) - N;
|
|
|
|
assert(Items.size() == 10 && "Our chi-squared values assume 10 items");
|
|
// Since we have 10 items, there are 9 degrees of freedom and the table of
|
|
// chi-squared values is as follows:
|
|
//
|
|
// | p=1% | 5% | 25% | 50% | 75% | 95% | 99% |
|
|
// v=9 | 2.088 | 3.325 | 5.899 | 8.343 | 11.39 | 16.92 | 21.67 |
|
|
//
|
|
// Check that we're in the likely range of results.
|
|
//if (V < 2.088 || V > 21.67)
|
|
if (V < 2.088 || V > 21.67)
|
|
++Failures;
|
|
}
|
|
EXPECT_LT(Failures, 3) << "Non-uniform distribution?";
|
|
}
|