public static void Test()
        {
            Quickscore <string, string> quickscoreSS = Quickscore <string, string> .GetInstance("");

            quickscoreSS.SetCause("cold", .01);
            quickscoreSS.SetLink("cold", "cough", .1);
            quickscoreSS.SetLink("cold", "runny nose", .3);
            AssertNear(.01, quickscoreSS.PosteriorOfCause("cold", new string[] { }, new string[] { }));
            AssertNear(1, quickscoreSS.PosteriorOfCause("cold", new string[] { "runny nose" }, new string[] { }));
            AssertNear(.9 * .01 / (1 - .01 * .1), quickscoreSS.PosteriorOfCause("cold", new string[] { }, new string[] { "cough" }));

            quickscoreSS.SetCause("onion attack", .001);
            quickscoreSS.SetLink("onion attack", "watery eyes", .9);
            AssertNear(.001, quickscoreSS.PosteriorOfCause("onion attack", new string[] { }, new string[] { }));
            AssertNear(.001, quickscoreSS.PosteriorOfCause("onion attack", new string[] { "cough" }, new string[] { }));
            AssertNear(.001, quickscoreSS.PosteriorOfCause("onion attack", new string[] { }, new string[] { "cough" }));
            AssertNear(1, quickscoreSS.PosteriorOfCause("onion attack", new string[] { "watery eyes" }, new string[] { }));


            quickscoreSS.SetCause("allergy", .02);
            quickscoreSS.SetLink("allergy", "watery eyes", .1);
            quickscoreSS.SetLink("allergy", "runny nose", .6);

            AssertNear(0.223055458667595, quickscoreSS.PosteriorOfCause("cold", new string[] { "runny nose" }, new string[] { "watery eyes" }));
            AssertNear(0.786362050924305, quickscoreSS.PosteriorOfCause("allergy", new string[] { "runny nose" }, new string[] { "watery eyes" }));
            AssertNear(1.0, quickscoreSS.PosteriorOfCause("cold", new string[] { "runny nose", "cough" }, new string[] { "watery eyes" }));
            AssertNear(0.042220484753702256, quickscoreSS.PosteriorOfCause("allergy", new string[] { "runny nose", "cough" }, new string[] { "watery eyes" }));

            Dictionary <string, double> posteriorOfEveryCauseSS = quickscoreSS.PosteriorOfEveryCause(new string[] { "runny nose", "cough" }, new string[] { "watery eyes" });

            AssertNear(1.0, posteriorOfEveryCauseSS["cold"]);
            AssertNear(0.042220484753702256, posteriorOfEveryCauseSS["allergy"]);

            AssertNear(1, quickscoreSS.PosteriorOfCause("cold", new string[] { "cough" }, new string[] { }));
            quickscoreSS.SetLeak("cough", 1.0 / 300.0);
            AssertNear(0.237875288683606, quickscoreSS.PosteriorOfCause("cold", new string[] { "cough" }, new string[] { }));


            AssertNear(.01, quickscoreSS.PosteriorOfCause("cold", new string[] { }, new string[] { "watery eyes" }));


            Quickscore <double, int> quickscoreDL = Quickscore <double, int> .GetInstance(double.NaN);

            quickscoreDL.SetCause(3.1, .01);
            quickscoreDL.SetLink(3.1, 0, .1);
            quickscoreDL.SetLink(3.1, 2, .3);
            AssertNear(.01, quickscoreDL.PosteriorOfCause(3.1, new int[] { }, new int[] { }));
            AssertNear(1, quickscoreDL.PosteriorOfCause(3.1, new int[] { 0 }, new int[] { }));
            Dictionary <double, double> posteriorOfEveryCauseDL = quickscoreDL.PosteriorOfEveryCause(new int[] { }, new int[] { 2 });

            quickscoreDL.SetLeak(0, .001);
            AssertNear(0.50475237618810087, quickscoreDL.PosteriorOfCause(3.1, new int[] { 0 }, new int[] { }));

            TestBigSize();
        }
        internal static void TestBigSize()
        {
            Random random = new Random(023029);
            Dictionary <int, bool> effectList;
            Quickscore <int, int>  quickscore = GetRandomInstance(random, 600, 10, 10, .0001, out effectList);

            int[] effectListX = new int[effectList.Count];
            effectList.Keys.CopyTo(effectListX, 0);
            for (int numberOfPositiveFindings = 0; numberOfPositiveFindings < 20; ++numberOfPositiveFindings)
            {
                int[] positiveFinding = GetRandomEffects(random, effectListX, numberOfPositiveFindings);

                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();

                quickscore.PosteriorOfEveryCause(positiveFinding, new int[] { });

                stopwatch.Stop();
                Console.WriteLine("{0}\t{1}", numberOfPositiveFindings, stopwatch.Elapsed);
            }
        }