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 Quickscore <int, int> GetRandomInstance(Random random, int cCause, int cEffectsPerCause, int maxJumpBetweenEffects, double leakProbability, out Dictionary <int, bool> effectList)
        {
            Quickscore <int, int> quickscore = Quickscore <int, int> .GetInstance(int.MinValue);

            effectList = new Dictionary <int, bool>();
            for (int cause = 0; cause < cCause; ++cause)
            {
                quickscore.SetCause(cause, random.NextDouble());
                int effect = -1;
                for (int iEffect = 0; iEffect < cEffectsPerCause; ++iEffect)
                {
                    effect += 1 + random.Next(maxJumpBetweenEffects);
                    quickscore.SetLink(cause, effect, random.NextDouble());
                    if (!effectList.ContainsKey(effect))
                    {
                        quickscore.SetLeak(effect, leakProbability);
                        effectList.Add(effect, true);
                    }
                }
            }
            return(quickscore);
        }