public TestResult Test(GeneratedData data)
        {
            //Console.WriteLine(new
            //{
            //	samples = data.ExcludedSamples_2.Count,
            //	pairs = data.ExcludedPairs_2.Count,
            //});

            var generationParameters = data.Parameters;

            var scores                  = new List <int>();
            var falsePositives          = new List <string>();
            var totalTruePositiveCount  = 0;
            var totalTrueNegativeCount  = 0;
            var totalFalsePositiveCount = 0;
            var totalFalseNegativeCount = 0;
            var matchCounter            = new MatchCounter();

            // var results = new List<string>();

            var testCases = TestCases.Value;

            foreach (var testCase in testCases)
            {
                var score = 0;
                // Console.WriteLine("Testing {0}", sample);
                var testData = testCase.Item2;
                foreach (var value in testData)
                {
                    var word     = value.Key;
                    var expected = value.Value;

                    //word = "aq's";
                    //expected = testData[word];

                    var result = Match(
                        data,
                        word,
                        generationParameters,
                        matchCounter);

                    var success = result == expected;

                    // results.Add(String.Format("{0} - {1} - {2}\n", word, result, success).ToLowerInvariant());

                    if (success)
                    {
                        score++;
                        if (result)
                        {
                            totalTruePositiveCount++;
                        }
                        else
                        {
                            totalTrueNegativeCount++;
                        }
                    }
                    else
                    {
                        if (result)
                        {
                            falsePositives.Add(value.Key);
                            totalFalsePositiveCount++;
                        }
                        else
                        {
                            totalFalseNegativeCount++;
                        }
                    }
                }

                // Console.WriteLine("score: {0}", score);
                scores.Add(score);
            }

            // File.WriteAllText(String.Format("c:/temp/results-dotnet-{0}.txt", data.Parameters.Id), String.Concat(results));

            return(new TestResult
            {
                FalsePositives = falsePositives,
                AvgPreExclusionMatches = matchCounter.PreExclusion / (double)testCases.Count(),
                AvgSampleExclusion1Matches = matchCounter.SampleExclusion_1 / (double)testCases.Count(),
                AvgSampleExclusion2Matches = matchCounter.SampleExclusion_2 / (double)testCases.Count(),
                AvgSampleExclusion3Matches = matchCounter.SampleExclusion_3 / (double)testCases.Count(),
                AvgPairExclusionMatches = matchCounter.PairExclusion / (double)testCases.Count(),
                AvgPairExclusion2Matches = matchCounter.PairExclusion2 / (double)testCases.Count(),
                AvgBloomFilterMatches = matchCounter.BloomFilter / (double)testCases.Count(),
                AvgFalsePositives = totalFalsePositiveCount / (double)testCases.Count(),
                AvgFalseNegatives = totalFalseNegativeCount / (double)testCases.Count(),
                AvgTruePositives = totalTruePositiveCount / (double)testCases.Count(),
                AvgTrueNegatives = totalTrueNegativeCount / (double)testCases.Count(),
                MinScore = scores.Min(),
                MaxScore = scores.Max(),
                StdDevScore = scores.Select(score => (double)score).StdDev(),
                AvgScore = scores.Average(),
            });
        }
        public static bool Match(GeneratedData data, string value, GenerationParameters parameters, MatchCounter counter, bool skipBloomFilter = false)
        {
            if (SampleSplitter.PreExcludeValue(value))
            {
                // if (!skipBloomFilter) Console.WriteLine("preex: " + value);
                counter.PreExclusion++;
                return(false);
            }

            if (!MatchSampleExclusion(value, data.ExcludedSamples_1, parameters.SampleExclusion_1))
            {
                counter.SampleExclusion_1++;
                return(false);
            }

            if (!MatchSampleExclusion(value, data.ExcludedSamples_2, parameters.SampleExclusion_2))
            {
                // if (!skipBloomFilter) Console.WriteLine("se: " + value);
                counter.SampleExclusion_2++;
                return(false);
            }

            if (!MatchSampleExclusion(value, data.ExcludedSamples_3, parameters.SampleExclusion_3))
            {
                counter.SampleExclusion_3++;
                return(false);
            }

            if (!MatchPairExclusion(value, data.ExcludedPairs_1, parameters.PairExclusion_1))
            {
                counter.PairExclusion++;
                return(false);
            }

            if (!MatchPairExclusion(value, data.ExcludedPairs_2, parameters.PairExclusion_2))
            {
                //if (!skipBloomFilter) Console.WriteLine("pe: " + value);
                counter.PairExclusion2++;
                return(false);
            }

            if (!skipBloomFilter && !MatchBloomFilter(value, data.BloomFilter, data.Parameters.BloomFilter))
            {
                // if (!skipBloomFilter) Console.WriteLine("bf: " + value);
                counter.BloomFilter++;
                return(false);
            }

            // if (!skipBloomFilter) Console.WriteLine("pass: " + value);

            return(true);
        }