コード例 #1
0
        public void PoissonBug()
        {
            PoissonDistribution pd = new PoissonDistribution(0.5);
            double x = pd.InverseLeftProbability(0.7716);

            Console.WriteLine(x);
        }
コード例 #2
0
        public void InverseDistributionFunctionTest()
        {
            // Create a new Poisson distribution
            var dist = new PoissonDistribution(lambda: 2);

            double equal = dist.ProbabilityMassFunction(k: 7);

            double lte1 = dist.DistributionFunction(k: 7);
            double lte2 = dist.DistributionFunction(k: 7, inclusive: true);
            double less = dist.DistributionFunction(k: 7, inclusive: false);

            double inv0 = dist.InverseDistributionFunction(0.99890328103214132);
            double inv1 = dist.InverseDistributionFunction(lte1);
            double inv2 = dist.InverseDistributionFunction(lte2);
            double inv3 = dist.InverseDistributionFunction(less);

            Assert.AreEqual(equal, 0.0034370865583901638, 1e-10);
            Assert.AreEqual(less, 0.99546619447375118, 1e-10);
            Assert.AreEqual(lte1, 0.99890328103214132, 1e-10);
            Assert.AreEqual(lte2, 0.99890328103214132, 1e-10);

            Assert.AreEqual(inv0, 7, 1e-10);
            Assert.AreEqual(inv1, 7, 1e-10);
            Assert.AreEqual(inv2, 7, 1e-10);
            Assert.AreEqual(inv3, 6, 1e-10);
        }
コード例 #3
0
        public void DistributionFunctionTest()
        {
            // Create a new Poisson distribution
            var dist = new PoissonDistribution(lambda: 4.2);

            // P(X = 1) = 0.0629814226460064
            double equal = dist.ProbabilityMassFunction(k: 1);

            // P(X < 1) = 0.0149955768204777
            double less = dist.DistributionFunction(k: 1, inclusive: false);

            // P(X ≤ 1) = 0.0779769994664841
            double lessThanOrEqual = dist.DistributionFunction(k: 1, inclusive: true);

            // P(X > 1) = 0.922023000533516
            double greater = dist.ComplementaryDistributionFunction(k: 1);

            // P(X ≥ 1) = 0.985004423179522
            double greaterThanOrEqual = dist.ComplementaryDistributionFunction(k: 1, inclusive: true);

            Assert.AreEqual(equal, 0.0629814226460064, 1e-10);
            Assert.AreEqual(less, 0.0149955768204777, 1e-10);
            Assert.AreEqual(lessThanOrEqual, 0.0779769994664841, 1e-10);
            Assert.AreEqual(greater, 0.922023000533516, 1e-10);
            Assert.AreEqual(greaterThanOrEqual, 0.985004423179522, 1e-10);
        }
コード例 #4
0
        //End of ui.cs file Contents

        //-------------------------------------------------------------------------

        //Begin of Random.cs file contents
        /// <summary>
        /// Initializes the random-number generator with a specific seed.
        /// </summary>
        public void Initialize(uint seed)
        {
            RandomNumberGenerator = new MT19937Generator(seed);
            betaDist              = new BetaDistribution(RandomNumberGenerator);
            betaPrimeDist         = new BetaPrimeDistribution(RandomNumberGenerator);
            cauchyDist            = new CauchyDistribution(RandomNumberGenerator);
            chiDist               = new ChiDistribution(RandomNumberGenerator);
            chiSquareDist         = new ChiSquareDistribution(RandomNumberGenerator);
            continuousUniformDist = new ContinuousUniformDistribution(RandomNumberGenerator);
            erlangDist            = new ErlangDistribution(RandomNumberGenerator);
            exponentialDist       = new ExponentialDistribution(RandomNumberGenerator);
            fisherSnedecorDist    = new FisherSnedecorDistribution(RandomNumberGenerator);
            fisherTippettDist     = new FisherTippettDistribution(RandomNumberGenerator);
            gammaDist             = new GammaDistribution(RandomNumberGenerator);
            laplaceDist           = new LaplaceDistribution(RandomNumberGenerator);
            lognormalDist         = new LognormalDistribution(RandomNumberGenerator);
            normalDist            = new NormalDistribution(RandomNumberGenerator);
            paretoDist            = new ParetoDistribution(RandomNumberGenerator);
            powerDist             = new PowerDistribution(RandomNumberGenerator);
            rayleighDist          = new RayleighDistribution(RandomNumberGenerator);
            studentsTDist         = new StudentsTDistribution(RandomNumberGenerator);
            triangularDist        = new TriangularDistribution(RandomNumberGenerator);
            weibullDist           = new WeibullDistribution(RandomNumberGenerator);
            poissonDist           = new PoissonDistribution(RandomNumberGenerator);

            // generator.randomGenerator = new MT19937Generator(seed);
        }
コード例 #5
0
        /*
         * minValue: es el minimo de personas que llegan al andén
         * maxValue: es el máximo de personas que llegan al andén
         * personasPorMinuto: cantida de personas que llegan por minuto
         * cantidadEnHoras: tiempo en horas de la muestra de personas
         */
        public static int Poisson(int minValue, int maxValue, int personasPorMinuto, int cantidadEnHoras)
        {
            double r1, r2, m, y, fx;
            int    k, lambda, x;

            if ((personasPorMinuto <= 0) || (cantidadEnHoras <= 0))
            {
                throw new System.ArgumentException("Valores incorrectos");
            }

            k = personasPorMinuto;

            lambda = cantidadEnHoras;

            PoissonDistribution f = new PoissonDistribution(lambda);

            m = Math.Pow(k, k) / (Math.Exp(k) * AdvancedIntegerMath.Factorial(k));

            Random r = new Random();

            do
            {
                r1 = r.NextDouble();

                r2 = r.NextDouble();

                x = Convert.ToInt32(minValue + (maxValue - minValue) * r1);

                y = m * r2;

                fx = f.ProbabilityMass(Convert.ToInt32(k * r1));
            } while (y < fx);

            return(x);
        }
コード例 #6
0
    void Poisson(Texture2D worldMap)
    {
        Debug.Log("Starting Poisson...");
        long time = DateTime.Now.Ticks;
        PoissonDistribution dist = new PoissonDistribution((x, z, v) =>
                                                           worldMap.GetPixel((int)x, (int)z).r < 0.22f ? (
                                                               v < 0.95f ? v * 0.01f : 0.4f
                                                               ) : 1.0f
                                                           );

        List <Vector3> poissonMap = PoissonGenerator.GeneratePoisson(Constants.WorldSize, Constants.WorldSize, 4.25f, 30.0f, dist, 90);

        Color[] colorSet = new Color[(Constants.WorldSize) * (Constants.WorldSize)];

        for (int i = 0; i < colorSet.Length; i++)
        {
            colorSet[i] = new Color(0, 0, 0, 0);
        }

        detailMap.SetPixels(colorSet);
        detailMap.Apply();

        foreach (Vector3 v in poissonMap)
        {
            float val = (v.z - 3.0f) / 30.0f;
            detailMap.SetPixel((int)v.x, (int)v.y, new Color(val, 0, val));
        }
        detailMap.Apply();

        byte[] bytes = detailMap.EncodeToPNG();
        File.WriteAllBytes(Application.dataPath + "/../Poisson.png", bytes);
        float seconds = (DateTime.Now.Ticks - time) / 10000000.0f;

        Debug.Log("Poisson finished in " + seconds + " seconds!");
    }
コード例 #7
0
        protected override void EndProcessing()
        {
            var dist = new PoissonDistribution(Lambda);
            var obj  = DistributionHelper.AddConvinienceMethods(dist);

            WriteObject(obj);
        }
コード例 #8
0
        public void ConstructorTest2()
        {
            // Create a new Poisson distribution with lambda = 0.7
            PoissonDistribution poisson = new PoissonDistribution(0.7);

            double mean   = poisson.Mean;              // 0.7    (lambda)
            double median = poisson.Median;            // 1.0
            double mode   = poisson.Mode;              // 0.7    (lambda)
            double stdDev = poisson.StandardDeviation; // 0.836  [sqrt((lambda))]
            double var    = poisson.Variance;          // 0.7    (lambda)

            // The cumulative distribution function, or the probability that a real-valued
            // random variable will be found to have a value less than or equal to some x:
            double cdf = poisson.DistributionFunction(k: 1);        // 0.84419501644539618

            // The probability density function, or the relative likelihood for a real-valued
            // random variable will be found to take on a given specific value of x:
            double pdf = poisson.ProbabilityMassFunction(k: 1);  // 0.34760971265398666

            // The log of the probability density function, useful for applications where
            // precision is critical
            double lpdf = poisson.LogProbabilityMassFunction(k: 1); // -1.0566749439387324

            // The complementary distribution function, or the tail function, that gives the
            // probability that a real-valued random variable will be found to have a value
            // greater than some x. This function is also known as the Survival function.
            double ccdf = poisson.ComplementaryDistributionFunction(k: 1); // 0.15580498355460382

            // The inverse distribution function, or the Quantile function, that is able to
            // revert probability values back to the real value that produces that probability
            int icdf = poisson.InverseDistributionFunction(p: cdf); // 1

            // The Hazard function, or the failure rate, the event rate at time t conditional
            // on survival until time t or later. Note that this function may only make sense
            // when using time-defined distributions, such as the Poisson.
            double hf = poisson.HazardFunction(x: 1);            // 2.2310564445595058

            // The cumulative hazard function, that gives how much the hazard
            // function accumulated over time until a given time instant x.
            double chf = poisson.CumulativeHazardFunction(x: 1); // 1.8591501591854034

            // Every distribution has a friendly string representation
            string str = poisson.ToString(System.Globalization.CultureInfo.InvariantCulture); // Poisson(x; λ = 0.7)

            Assert.AreEqual(0.84419501644539618, cdf);
            Assert.AreEqual(0.34760971265398666, pdf);
            Assert.AreEqual(-1.0566749439387324, lpdf);
            Assert.AreEqual(0.15580498355460382, ccdf);
            Assert.AreEqual(1, icdf);
            Assert.AreEqual(2.2310564445595058, hf);
            Assert.AreEqual(1.8591501591854034, chf);
            Assert.AreEqual("Poisson(x; λ = 0.7)", str);

            Assert.AreEqual(0.7, mean);
            Assert.AreEqual(0.7, mode);
            Assert.AreEqual(1, median);
            Assert.AreEqual(0.7, var);
            Assert.AreEqual(0.83666002653407556, stdDev);
        }
コード例 #9
0
 public void MedianTest()
 {
     for (int i = 0; i < 25; i++)
     {
         var target = new PoissonDistribution(i + 1);
         Assert.AreEqual(target.Median, target.InverseDistributionFunction(0.5));
     }
 }
コード例 #10
0
        public void ProbabilityDensityFunctionTest()
        {
            PoissonDistribution target = new PoissonDistribution(25);

            double actual   = target.ProbabilityMassFunction(20);
            double expected = 0.051917468608491321;

            Assert.AreEqual(expected, actual);
        }
コード例 #11
0
        public void LogProbabilityDensityFunctionTest()
        {
            PoissonDistribution target = new PoissonDistribution(25);

            double actual   = target.LogProbabilityMassFunction(20);
            double expected = System.Math.Log(0.051917468608491321);

            Assert.AreEqual(expected, actual, 1e-10);
        }
コード例 #12
0
ファイル: Poisson.cs プロジェクト: KevinRoth/simulacion
        /// <summary>
        /// Metodo que calcula la frecuencia esperada en un intervalo
        /// </summary>
        /// <param name="intervalo"></param>
        /// <param name="tamanioMuestra"></param>
        /// <param name="cantidadIntervalos"></param>
        /// <returns></returns>
        public override double CalcularFrecuenciaEsperadaEnIntervalo(Intervalo intervalo, int tamanioMuestra, int cantidadIntervalos = 0)
        {
            var distribucion = new PoissonDistribution(Lambda);

            var probabilidadEsperada = distribucion.LeftExclusiveProbability((int)intervalo.LimiteSuperior) -
                                       distribucion.LeftExclusiveProbability((int)intervalo.LimiteInferior);

            return(probabilidadEsperada * tamanioMuestra);
        }
コード例 #13
0
        public void ConstructorTest()
        {
            // Create a new Poisson distribution with
            var dist = new PoissonDistribution(lambda: 4.2);

            // Common measures
            double mean   = dist.Mean;     // 4.2
            double median = dist.Median;   // 4.0
            double var    = dist.Variance; // 4.2

            // Cumulative distribution functions
            double cdf  = dist.DistributionFunction(k: 2);              // 0.39488100648845126
            double ccdf = dist.ComplementaryDistributionFunction(k: 2); // 0.60511899351154874

            // Probability mass functions
            double pmf1 = dist.ProbabilityMassFunction(k: 4);    // 0.19442365170822165
            double pmf2 = dist.ProbabilityMassFunction(k: 5);    // 0.1633158674349062
            double pmf3 = dist.ProbabilityMassFunction(k: 6);    // 0.11432110720443435
            double lpmf = dist.LogProbabilityMassFunction(k: 2); // -2.0229781299813

            // Quantile function
            int icdf1 = dist.InverseDistributionFunction(p: 0.17); // 2
            int icdf2 = dist.InverseDistributionFunction(p: 0.46); // 4
            int icdf3 = dist.InverseDistributionFunction(p: 0.87); // 7

            // Hazard (failure rate) functions
            double hf  = dist.HazardFunction(x: 4);           // 0.19780423301883465
            double chf = dist.CumulativeHazardFunction(x: 4); // 0.017238269667812049

            // String representation
            string str = dist.ToString(CultureInfo.InvariantCulture); // "Poisson(x; λ = 4.2)"


            // Median bounds
            // (http://en.wikipedia.org/wiki/Poisson_distribution#Median)

            Assert.IsTrue(median < 4.2 + 1 / 3.0);
            Assert.IsTrue(4.2 - System.Math.Log(2) <= median);

            Assert.AreEqual(4.2, mean);
            Assert.AreEqual(4.0, median);
            Assert.AreEqual(4.2, var);
            Assert.AreEqual(0.017238269667812049, chf, 1e-10);
            Assert.AreEqual(0.39488100648845126, cdf);
            Assert.AreEqual(0.19442365170822165, pmf1);
            Assert.AreEqual(0.1633158674349062, pmf2);
            Assert.AreEqual(0.11432110720443435, pmf3);
            Assert.AreEqual(-2.0229781299813, lpmf);
            Assert.AreEqual(0.19780423301883465, hf);
            Assert.AreEqual(0.60511899351154874, ccdf);
            Assert.AreEqual(2, icdf1);
            Assert.AreEqual(4, icdf2);
            Assert.AreEqual(7, icdf3);
            Assert.AreEqual("Poisson(x; λ = 4.2)", str);
        }
コード例 #14
0
        // Закон Пуассона

        // Использование метода скользящего суммирования
        public double[] MethodMovingSumm()
        {
            double[] res = new double[2];

            var dist1 = new PoissonDistribution(lambda: 1);
            var dist2 = new PoissonDistribution(lambda: 2);
            var dist3 = new PoissonDistribution(lambda: 3);
            var dist4 = new PoissonDistribution(lambda: 4);

            return(res);
        }
コード例 #15
0
        public void GenerateTest()
        {
            double lambda = 1.11022302462516E-16;
            var    target = new PoissonDistribution(lambda) as ISampleableDistribution <double>;

            double[] values = target.Generate(samples: 10000);
            for (int i = 0; i < values.Length; i++)
            {
                Assert.AreEqual(0, values[i]);
            }
        }
コード例 #16
0
ファイル: TestDistributions.cs プロジェクト: sjvannTMU/Sage
        public void TestDistributionPoisson()
        {
            const double        EPSILON = 0.000001;
            IDoubleDistribution dist    = new PoissonDistribution(m_model, "PoissonDistribution", Guid.NewGuid(), 5.0);

            Assert.AreEqual(5.0, dist.GetValueWithCumulativeProbability(0.50), EPSILON);
            dist.SetCDFInterval(0.5, 0.5);
            Assert.AreEqual(5.0, dist.GetNext(), EPSILON);
            dist.SetCDFInterval(0.0, 1.0);

            System.IO.StreamWriter tw = new System.IO.StreamWriter(Environment.GetEnvironmentVariable("TEMP") + "\\DistributionPoisson.csv");
            Debug.WriteLine("Generating raw data.");
            const int DATASETSIZE = 1500000;

            double[] rawData = new double[DATASETSIZE];
            for (int x = 0; x < DATASETSIZE; x++)
            {
                rawData[x] = dist.GetNext();
                //tw.WriteLine(rawData[x]);
            }

            Debug.WriteLine("Performing histogram analysis.");
            Histogram1D_Double hist = new Histogram1D_Double(rawData, 0, 25, 25, "distribution");

            hist.LabelProvider = new LabelProvider(((Histogram1D_Double)hist).DefaultLabelProvider);
            hist.Recalculate();

            List <double> expected = new List <double>()// From Excel.
            {
                10107, 50535, 126337, 210561, 263201, 263201, 219334, 156667, 97917, 54398, 27199, 12363, 5151, 1981,
                708, 236, 74, 22, 6, 2, 0, 0, 0, 0, 0
            };
            IEnumerable <double> ied    = new List <int>((int[])hist.Bins).Select(n => (double)n);
            List <double>        actual = new List <double>((IEnumerable <double>)ied);
            double rmsError             = Mathematics.RMSErrorCalculator.Calculate(expected, actual);

            Assert.IsTrue(rmsError < 75, "Poisson distribution at lambda = 5 does not follow the expected curve.");

            if (m_visuallyVerify)
            {
                Debug.WriteLine("Writing data dump file.");
                int[] bins = (int[])hist.Bins;
                for (int i = 0; i < bins.Length; i++)
                {
                    //Debug.WriteLine(hist.GetLabel(new int[]{i}) + ", " + bins[i]);
                    tw.WriteLine(hist.GetLabel(new int[] { i }) + ", " + bins[i] + ", " + expected[i]);
                }
                tw.Flush();
                tw.Close();

                System.Diagnostics.Process.Start("excel.exe",
                                                 Environment.GetEnvironmentVariable("TEMP") + "\\DistributionPoisson.csv");
            }
        }
コード例 #17
0
        /// <summary>
        /// Debug: cover the pla
        /// </summary>
        /// <param name="img"></param>
        /// <param name="tileSize"></param>
        /// <param name="coverage"></param>
        public void ToNoiseTiles(Image img, Size tileSize, float coverage)
        {
            List <Bitmap> tileImgs = new List <Bitmap>();

            foreach (WangTile wt in tiles)
            {
                Bitmap bmp = new Bitmap(tileSize.Width, tileSize.Height);
                PoissonDistribution.ToImage(wt.distribution, Color.Black, bmp, coverage);
                tileImgs.Add(bmp);
            }
            ToImage(img, tileSize, tileImgs);
        }
コード例 #18
0
        public void FitTest()
        {
            PoissonDistribution target = new PoissonDistribution(1);

            double[] observations = { 0.2, 0.7, 1.0, 0.33 };

            target.Fit(observations);

            double expected = 0.5575;

            Assert.AreEqual(expected, target.Mean);
        }
コード例 #19
0
        public static void Main()
        {
            double[][] input =
                GeneralizedLinearModelTests.GravityCourseData
                .Select(
                    x => new double[]
            {
                Math.Log(x.Distance),
                x.CommonBorder,
                x.CommonLanguage,
                x.ColonialRelationship
            })
                .ToArray();

            double[] response =
                GeneralizedLinearModelTests.GravityCourseData
                .Select(x => x.Trade)
                .ToArray();

            double[] weights =
                Enumerable.Repeat(1.0, response.Length)
                .ToArray();

            GeneralizedLinearModel <double> generalized =
                GeneralizedLinearModel.PoissonRegression(input, response, weights);

            const int count = 10;

            IDistribution <double> distribution = new PoissonDistribution(new LogLinkFunction());
            Stopwatch sw = new Stopwatch();

            sw.Start();
            for (int i = 0; i < count; i++)
            {
                generalized = new GeneralizedLinearModel <double>(input, response, weights, distribution, true);
            }
            sw.Stop();
            System.Console.WriteLine(generalized);
            System.Console.WriteLine((double)sw.ElapsedMilliseconds / count);

            ParallelOptions options = new ParallelOptions();

            sw.Restart();
            for (int i = 0; i < count; i++)
            {
                generalized = new GeneralizedLinearModel <double>(input, response, weights, distribution, true, options);
            }
            sw.Stop();
            System.Console.WriteLine(generalized);
            System.Console.WriteLine((double)sw.ElapsedMilliseconds / count);
        }
コード例 #20
0
 public FuncionPoisson(double[] eventos) : base(eventos)
 {
     try
     {
         DistribucionDiscreta = new PoissonDistribution();
         DistribucionDiscreta.Fit(eventos);
         lambda    = ((PoissonDistribution)DistribucionDiscreta).Lambda.ToString("0.0000");
         Resultado = new ResultadoAjuste(StringFDP, StringInversa, DistribucionDiscreta.StandardDeviation, DistribucionDiscreta.Mean, DistribucionDiscreta.Variance, this);
     }
     catch (Exception)
     {
         Resultado = null;
     }
 }
コード例 #21
0
        public static object TestPoisson(double lambda, double[] x, double[] y)
        {
            PoissonDistribution dist = new PoissonDistribution(lambda);

            dist.Fit(y);

            double[] ret = new double[4];

            ret[0] = dist.Entropy;
            ret[1] = dist.Mean;
            ret[2] = dist.Variance;
            ret[3] = dist.StandardDeviation;

            return(ret);
        }
コード例 #22
0
        public void BellNumberAsPoissonMoment()
        {
            // The Bell numbers are the moments of the Poisson distribution
            // with \mu = 1.

            UnivariateDistribution d = new PoissonDistribution(1.0);

            foreach (int r in TestUtilities.GenerateIntegerValues(1, 50, 4))
            {
                Assert.IsTrue(TestUtilities.IsNearlyEqual(
                                  AdvancedIntegerMath.BellNumber(r),
                                  d.RawMoment(r)
                                  ));
            }
        }
コード例 #23
0
 public void TestPoissonDistribution()
 {
     double[][] para =
     {
         new double[] { 11, 0, 9, 0.3405106424656610472811084, 0.1085255092982049925567724 }
     };
     for (int i = 0; i < para.Length; i++)
     {
         var tester = new DiscDistTester(para[i], delegate(double a, double b)
         {
             var ret = new PoissonDistribution(a);
             return(ret);
         }
                                         );
         tester.Test(1E-14);
     }
 }
コード例 #24
0
        private void SetDistributionFunctionFromString()
        {
            if (DistributionfunctionString.StartsWith("N"))
            {
                DistributionFunction = new NormalDistribution(Mean, StDeviation);
            }
            else if (DistributionfunctionString.StartsWith("Poisson"))
            {
                DistributionfunctionString = EnsureOnlyOneComma(DistributionfunctionString, 1);

                var lambda = double.Parse((DistributionfunctionString.Split('=')[1]).Replace(")", "").Trim(), CultureInfo.InvariantCulture);
                DistributionFunction = new PoissonDistribution(lambda);
            }
            else if (DistributionfunctionString.StartsWith("U"))
            {
                DistributionfunctionString = EnsureOnlyOneComma(DistributionfunctionString, 2);

                var a = double.Parse((DistributionfunctionString.Split('=')[1]).Split(',')[0].Trim(), CultureInfo.InvariantCulture);
                var b = double.Parse((DistributionfunctionString.Split('=')[2]).Split(')')[0].Trim(), CultureInfo.InvariantCulture);

                DistributionFunction = new UniformContinuousDistribution(a, b);
            }
            else if (DistributionfunctionString.Contains("x; k ="))
            {
                DistributionfunctionString = EnsureOnlyOneComma(DistributionfunctionString, 2);

                var k    = double.Parse((DistributionfunctionString.Split('=')[1]).Split(',')[0].Trim(), CultureInfo.InvariantCulture);
                var teta = double.Parse((DistributionfunctionString.Split('=')[2]).Split(')')[0].Trim(), CultureInfo.InvariantCulture);

                DistributionFunction = new GammaDistribution(teta, k);
            }
            else if (DistributionfunctionString.Contains("Gumbel"))
            {
                DistributionfunctionString = EnsureOnlyOneComma(DistributionfunctionString, 2);

                var u = double.Parse((DistributionfunctionString.Split('=')[1]).Split(',')[0].Trim(), CultureInfo.InvariantCulture);
                var b = double.Parse((DistributionfunctionString.Split('=')[2]).Split(')')[0].Trim(), CultureInfo.InvariantCulture);

                DistributionFunction = new GumbelDistribution(u, b);
            }

            else
            {
                throw new Exception("Unregnoized disitrubtionfunction " + DistributionfunctionString);
            }
        }
コード例 #25
0
        public void GenerateTest3()
        {
            double lambda = 0.75;
            var    a      = new PoissonDistribution(lambda) as ISampleableDistribution <double>;


            Accord.Math.Random.Generator.Seed = 0;
            double[] expected = a.Generate(samples: 10000);

            Accord.Math.Random.Generator.Seed = 0;
            var b = new PoissonDistribution(lambda);

            Accord.Math.Random.Generator.Seed = 0;
            int[] actual = b.Generate(10000);

            Assert.IsTrue(expected.IsEqual(actual));
        }
コード例 #26
0
        private int GetNumberOfOrders()
        {
            PoissonDistribution pd = new PoissonDistribution(2.7);

            Dictionary <int, int> map = new Dictionary <int, int>();

            for (int i = 0; i < 1000; i++)
            {
                int num = pd.Generate();

                if (!map.ContainsKey(num))
                {
                    map[num] = 0;
                }
                map[num]++;
            }

            return(pd.Generate());
        }
コード例 #27
0
        static void Main(string[] args)
        {
            var poisson = new PoissonDistribution(9);

            //Console.WriteLine("CDF 1 : " + poisson.Cdf(1) + ", CDF0: " + poisson.Cdf0(1));
            //Console.WriteLine("CDF 5 : " + poisson.Cdf(5) + ", CDF0: " + poisson.Cdf0(5));
            //Console.WriteLine("CDF 7 : " + poisson.Cdf(7) + ", CDF0: " + poisson.Cdf0(7));
            //Console.WriteLine("CDF 9 : " + poisson.Cdf(9) + ", CDF0: " + poisson.Cdf0(9));
            //Console.WriteLine("CDF 10 : " + poisson.Cdf(10) + ", CDF0: " + poisson.Cdf0(10));
            //Console.WriteLine("CDF 12 : " + poisson.Cdf(12) + ", CDF0: " + poisson.Cdf0(12));
            //Console.WriteLine("CDF 14 : " + poisson.Cdf(14) + ", CDF0: " + poisson.Cdf0(14));
            //Console.WriteLine("CDF 15 : " + poisson.Cdf(15) + ", CDF0 :" + poisson.Cdf0(15));
            //Console.WriteLine("CDF 27 : " + poisson.Cdf(27) + ", CDF0 :" + poisson.Cdf0(27));
            //Console.WriteLine("CDF 20 : " + poisson.Cdf(20) + ", CDF0 :" + poisson.Cdf0(20));
            //Console.WriteLine("----PoissonDistribution(1800)---");
            //poisson = new PoissonDistribution(1800);
            //Console.WriteLine("CDF 100 : " + poisson.Cdf(100) + ", CDF1: " + poisson.Cdf1(100));
            //Console.WriteLine("CDF 500 : " + poisson.Cdf(500) + ", CDF1: " + poisson.Cdf1(500));
            //Console.WriteLine("CDF 700 : " + poisson.Cdf(700) + ", CDF1: " + poisson.Cdf1(700));
            //Console.WriteLine("CDF 900 : " + poisson.Cdf(900) + ", CDF1: " + poisson.Cdf1(900));
            //Console.WriteLine("CDF 1000 : " + poisson.Cdf(1000) + ", CDF1: " + poisson.Cdf1(1000));
            //Console.WriteLine("CDF 1200 : " + poisson.Cdf(1200) + ", CDF1: " + poisson.Cdf1(1200));
            //Console.WriteLine("CDF 1400 : " + poisson.Cdf(1400) + ", CDF1: " + poisson.Cdf1(1400));
            //Console.WriteLine("CDF 1500 : " + poisson.Cdf(1500) + ", CDF1 :" + poisson.Cdf1(1500));
            //Console.WriteLine("CDF 1700 : " + poisson.Cdf(1700) + ", CDF1 :" + poisson.Cdf1(1700));
            //Console.WriteLine("CDF 1900 : " + poisson.Cdf(1900) + ", CDF1 :" + poisson.Cdf1(1900));
            //Console.WriteLine("CDF 2100 : " + poisson.Cdf(2100) + ", CDF1 :" + poisson.Cdf1(2100));
            //Console.WriteLine("CDF 2300 : " + poisson.Cdf(2300) + ", CDF1 :" + poisson.Cdf1(2300));
            //Console.WriteLine("CDF 2500 : " + poisson.Cdf(2500) + ", CDF1 :" + poisson.Cdf1(2500));
            Console.WriteLine("CDF 2700 : " + poisson.Cdf(2700) + ", CDF1 :" + poisson.Cdf1(2700));

            for (int i = 3; i < 300; i++)
            {
                var d = poisson.Factorial(i) - poisson.Factorial1(i);
                Console.WriteLine("i: " + i + ", Factorial: " + poisson.Factorial(i) + ", Factorial1: " + poisson.Factorial1(i) + ", diff: " + d);
            }

            //for (int i = 3; i < 160; i++)
            //{
            //	Console.WriteLine("i: " + i + ", PMF: " + poisson.Pmf(i));
            //}
            Console.ReadKey();
        }
コード例 #28
0
        private void Display()
        {
            Cursor = Cursors.WaitCursor;

            var distribution = new PoissonDistribution().GetNormalizedValues(_threadCount);

            // Get the time delta between each sample point.
            var delta = TimeSpan.FromTicks(_duration.Ticks / (distribution.Count() - 1));

            _barSeries.DataPoints.Clear();

            for (int i = 0; i < distribution.Count(); i++)
            {
                var time      = TimeSpan.FromSeconds(delta.TotalSeconds * i);
                var dataPoint = new CategoricalDataPoint(distribution.ElementAt(i), time.ToString(@"hh\:mm\:ss"));
                _barSeries.DataPoints.Add(dataPoint);
            }

            Cursor = Cursors.Default;
        }
コード例 #29
0
        public Order(Distributions ad, Distributions td)
        {
            ammountDistribution = ad;
            timeDistribution    = td;

            Ammount = NonNegativeValue(new Func <double>(() =>
            {
                switch (ammountDistribution)
                {
                case Distributions.Normal: return(NormalDistribution.OrderSize());

                case Distributions.Poisson: return(PoissonDistribution.OrderSize());

                case Distributions.Exponential: return(ExponentialDistribution.OrderSize());

                case Distributions.UniformCont: return(UniformContDistribution.OrderSize());

                case Distributions.UniformDisc: return(UniformDiscDistribution.OrderSize());

                default: return(-1);
                }
            })());

            Time = NonNegativeValue(new Func <double>(() =>
            {
                switch (timeDistribution)
                {
                case Distributions.Normal: return(NormalDistribution.TimeBetweenOrder());

                case Distributions.Poisson: return(PoissonDistribution.TimeBetweenOrder());

                case Distributions.Exponential: return(ExponentialDistribution.TimeBetweenOrder());

                case Distributions.UniformCont: return(UniformContDistribution.TimeBetweenOrder());

                case Distributions.UniformDisc: return(UniformDiscDistribution.TimeBetweenOrder());

                default: return(-1);
                }
            })());
        }
コード例 #30
0
ファイル: Program.cs プロジェクト: UNRLTED/Premier-Simulation
        public static void PlayFixture(Club home, Club away)
        {
            // Get lambda value for both teams
            double homeLambda = home.HomeAttackStrength * away.AwayDefenseStrength * _homegoalsavg;
            double awayLambda = away.AwayAttackStrength * home.HomeDefenseStrength * _awaygoalsavg;

            var poissonHome = new PoissonDistribution(homeLambda);
            var poissonAway = new PoissonDistribution(awayLambda);

            // Determine number of goals each team scored
            int homeGoals = poissonHome.Generate();
            int awayGoals = poissonAway.Generate();

            // Record game results
            home.GoalsFor     += homeGoals;
            away.GoalsFor     += awayGoals;
            home.GoalsAgainst += awayGoals;
            away.GoalsAgainst += homeGoals;

            if (homeGoals > awayGoals)
            {
                home.Wins++;
                home.Points += 3;
                away.Losses++;
            }
            else if (awayGoals > homeGoals)
            {
                home.Losses++;
                away.Wins++;
                away.Points += 3;
            }
            else
            {
                home.Draws++;
                away.Draws++;
                home.Points++;
                away.Points++;
            }
        }
コード例 #31
0
        //---------------------------------------------------------------------

        ///<summary>
        /// Run the plug-in at a particular timestep.
        ///</summary>
        public override void Run()
        {
            if (isDebugEnabled)
                UI.WriteLine("Running {0} at time = {1}", Name, Model.Core.CurrentTime);

            UI.WriteLine("   Processing landscape for Fire events ...");

            SiteVars.Event.SiteValues = null;
            SiteVars.Severity.ActiveSiteValues = 0;
            SiteVars.Disturbed.ActiveSiteValues = false;
            SiteVars.TravelTime.ActiveSiteValues = Double.PositiveInfinity;
            SiteVars.MinNeighborTravelTime.ActiveSiteValues = Double.PositiveInfinity;
            SiteVars.RateOfSpread.ActiveSiteValues = 0.0;

            foreach (IFireRegion fire_region in FireRegions.Dataset)
            {
                summaryFireRegionEventCount[fire_region.Index] = 0;
                summaryFireRegionSeverity[fire_region.Index] = 0;
            }

            summaryTotalSites = 0;
            summaryEventCount = 0;

            // Update the FireRegions Map as necessary:
            //UI.WriteLine("    Dynamic Fire:  Loading Dynamic Fire Regions...");
            foreach(IDynamicFireRegion dyneco in dynamicEcos)
            {
                 if(dyneco.Year == Model.Core.CurrentTime)
                 {
                    UI.WriteLine("   Reading in new Fire FireRegions Map {0}.", dyneco.MapName);
                     foreach (IFireRegion fire_region in FireRegions.Dataset)
                     {
                         fire_region.FireRegionSites = new List<Location>();
                     }
                    FireRegions.ReadMap(dyneco.MapName); //Sites added to their respective fire_region lists
                 }
            }

            //Update the weather table as necessary:
            //UI.WriteLine("    Dynamic Fire:  Loading Dynamic Weather ...");
            foreach (IDynamicWeather dynweather in dynamicWeather)
            {
                if (dynweather.Year == Model.Core.CurrentTime)
                {
                    UI.WriteLine("  Reading in new Weather Table {0}", dynweather.FileName);
                    WeatherDataTable = Weather.ReadWeatherFile(dynweather.FileName, FireRegions.Dataset, seasonParameters);
                    //Weather.ReadFileName(, seasonParameters, FireRegions.Dataset);
                }
            }



            // Fill in open types as needed:
            if (isDebugEnabled)
                UI.WriteLine("Filling open types as needed ...");

            UI.WriteLine("      Dynamic Fire:  Filling open types as needed ...");
            foreach (ActiveSite site in Model.Core.Landscape)
            {
                IFireRegion fire_region = SiteVars.FireRegion[site];

                if(fire_region == null)
                    throw new System.ApplicationException("Error: SiteVars.FireRegion is empty.");

                //if(SiteVars.CFSFuelType[site] == 0)
                //    throw new System.ApplicationException("Error: SiteVars.CFSFuelType is empty.");

                if(Event.FuelTypeParms[SiteVars.CFSFuelType[site]] == null)
                {
                    UI.WriteLine("Error:  SiteVars.CFSFuelType[site]={0}.", SiteVars.CFSFuelType[site]);
                    throw new System.ApplicationException("Error: Event BaseFuel Empty.");
                }

                if(Event.FuelTypeParms[SiteVars.CFSFuelType[site]].BaseFuel == BaseFuelType.NoFuel)
                {
                    if(SiteVars.PercentDeadFir[site] == 0)
                        SiteVars.CFSFuelType[site] = fire_region.OpenFuelType;
                }
            }
            if (isDebugEnabled)
                UI.WriteLine("Done filling open types");

            UI.WriteLine("      Dynamic Fire:  Igniting Fires ...");
            foreach (IFireRegion fire_region in FireRegions.Dataset)
            {
                if (fire_region.EcoIgnitionNum > 0)
                {
                    PoissonDistribution randVar = new PoissonDistribution(RandomNumberGenerator.Singleton);
                    double doubleLambda;
                    int ignGenerated = 0;

                    if (isDebugEnabled)
                        UI.WriteLine("{0}: EcoIgnitionNum = {1}, computing ignGenerated ...",
                                             fire_region.Name, fire_region.EcoIgnitionNum);
                    if (fire_region.EcoIgnitionNum < 1)
                    {
                        // Adjust ignition probability for multiple years
                        // (The inverse of the probability of NOT having any ignition for the time period.)
                        // P = 1 - (1-Pignition)^timestep
                        //doubleLambda = 1 - System.Math.Pow(1.0 - fire_region.EcoIgnitionNum, Timestep);

                        for (int i = 1; i <= Timestep; i++)
                        {
                            int annualFires = 0;
                            if (Util.Random.GenerateUniform() <= fire_region.EcoIgnitionNum)
                            {
                                annualFires = 1;
                            }
                            ignGenerated += annualFires;
                        }
                    }
                    else
                    {
                        doubleLambda = fire_region.EcoIgnitionNum;
                        bool boolLarge = false;

                        // 745 is the upper limit for valid Poisson lambdas.  If greater than
                        // 745, divide by 10 and readjust back up below.
                        if (doubleLambda > 745)
                        {
                            doubleLambda = doubleLambda / 10;
                            boolLarge = true;
                        }
                        //bool boolLambda = randVar.IsValidLambda(doubleLambda);
                        randVar.Lambda = doubleLambda;

                        for (int i = 1; i <= Timestep; i++)
                        {
                            int annualFires = randVar.Next();
                            if (boolLarge)
                                annualFires = annualFires * 10;  //readjust if necessary.
                            ignGenerated += annualFires;
                        }
                    }
                    if (isDebugEnabled)
                        UI.WriteLine("  ignGenerated = {0}; Shuffling {0} cells ...",
                                             ignGenerated, fire_region.FireRegionSites.Count);

                    List<Location> cellsPerFireRegion = fire_region.FireRegionSites;
                    Landis.Util.Random.Shuffle(cellsPerFireRegion);
                    int fireCount = 0;

                    //Try to create poissonNumber of fires in each fire_region.
                    //Fires should only initiate if a fire event has not previously occurred
                    //at that site.
                    if (isDebugEnabled)
                    {
                        UI.WriteLine("  Trying to create fires... ");
                        UI.WriteLine("    there are {0} site locations in fire region {1}", cellsPerFireRegion.Count, fire_region.Name);
                    }

                    foreach (Location siteLocation in cellsPerFireRegion)
                    {

                        Site site = Model.Core.Landscape.GetSite(siteLocation);

                        ActiveSite asite = site as ActiveSite;

                        if (fireCount >= ignGenerated) continue;  //exit loop if the required number of fires has occurred.
                        if (SiteVars.Event[asite] == null)
                        {
                            fireCount++;
                            if (isDebugEnabled)
                                UI.WriteLine("    fireCount = {0}", fireCount);
                            Event FireEvent = Event.Initiate(asite, Timestep, fireSizeType, bui, seasonParameters, severityCalibrate);
                            if (isDebugEnabled)
                                UI.WriteLine("    fire event {0}started at {1}",
                                                     FireEvent == null ? "not ": "",
                                                     asite.Location);
                            if (FireEvent != null)
                            {
                                LogEvent(Model.Core.CurrentTime, FireEvent);
                                summaryEventCount++;
                            //fireCount++;  //RMS test
                            }
                        }
                    }
                }


            }

            // Track the time of last fire; registered in SiteVars.cs for other extensions to access.
            if (isDebugEnabled)
                UI.WriteLine("Assigning TimeOfLastFire site var ...");
            foreach (Site site in Model.Core.Landscape.AllSites)
                if(SiteVars.Disturbed[site])
                    SiteVars.TimeOfLastFire[site] = Model.Core.CurrentTime;


            //  Write Fire severity map
            UI.WriteLine("      Dynamic Fire:  Write Severity Map ...");

            string path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime);
            IOutputRaster<SeverityPixel> map = CreateMap(path);
            using (map) {
                SeverityPixel pixel = new SeverityPixel();
                foreach (Site site in Model.Core.Landscape.AllSites) {
                    if (site.IsActive) {
                        if (SiteVars.Disturbed[site])
                        {
                            pixel.Band0 = (byte)(SiteVars.Severity[site] + 2);
                            summaryFireRegionSeverity[SiteVars.FireRegion[site].Index] += SiteVars.Severity[site];
                        }
                        else
                            pixel.Band0 = 1;
                    }
                    else {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    map.WritePixel(pixel);
                }
            }
            /*
            //  Write travel time map

            path = MapNames.ReplaceTemplateVars("./DFFS-output/travel-time-{timestep}.gis", Model.Core.CurrentTime);
            IOutputRaster<UShortPixel> umap = CreateTravelTimeMap(path);
            using (umap) {
                UShortPixel pixel = new UShortPixel();
                          foreach (Site site in Model.Core.Landscape.AllSites) {
                    if (site.IsActive) {
                        if (!Double.IsPositiveInfinity(SiteVars.TravelTime[site]))
                        //if (SiteVars.Event[site] != null)
                            pixel.Band0 = (ushort) ((SiteVars.TravelTime[site]) + 2);
                        else
                            pixel.Band0 = 1;
                    }
                    else {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    umap.WritePixel(pixel);
                }
            }
            */
            /*
            //  Write topo map
            path = MapNames.ReplaceTemplateVars("./DFFS-output/topo-{timestep}.gis", Model.Core.CurrentTime);
            IOutputRaster<TopoPixel> tmap = CreateTopoMap(path);
            using (tmap)
            {
                TopoPixel pixel = new TopoPixel();
                foreach (Site site in Model.Core.Landscape.AllSites)
                {
                    if (site.IsActive)
                    {
                        pixel.Band0 = (ushort)(SiteVars.GroundSlope[site]);

                    }
                    else
                    {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    tmap.WritePixel(pixel);
                }
            }
            */
            /*
            //  Write wind speed map

            path = MapNames.ReplaceTemplateVars("./DFFS-output/WSV-{timestep}.gis", Model.Core.CurrentTime);
            IOutputRaster<UShortPixel> wsvmap = CreateTravelTimeMap(path);
            using (wsvmap)
            {
                UShortPixel pixel = new UShortPixel();
                foreach (Site site in Model.Core.Landscape.AllSites)
                {
                    if (site.IsActive)
                    {
                        pixel.Band0 = (ushort)(SiteVars.SiteWindSpeed[site]);

                    }
                    else
                    {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    wsvmap.WritePixel(pixel);
                }
            }
            */
            /*
            //  Write wind direction map

            path = MapNames.ReplaceTemplateVars("./DFFS-output/WindDir-{timestep}.gis", Model.Core.CurrentTime);
            IOutputRaster<UShortPixel> winddirmap = CreateTravelTimeMap(path);
            using (winddirmap)
            {
                UShortPixel pixel = new UShortPixel();
                foreach (Site site in Model.Core.Landscape.AllSites)
                {
                    if (site.IsActive)
                    {
                        pixel.Band0 = (ushort)(SiteVars.SiteWindDirection[site]);

                    }
                    else
                    {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    winddirmap.WritePixel(pixel);
                }
            }
            */
            /*
            //  Write ROS map

            /*path = MapNames.ReplaceTemplateVars("./DFFS-output/ROS-{timestep}.gis", Model.Core.CurrentTime);
            IOutputRaster<UShortPixel> rosmap = CreateTravelTimeMap(path);
            using (rosmap)
            {
                UShortPixel pixel = new UShortPixel();
                foreach (Site site in Model.Core.Landscape.AllSites)
                {
                    if (site.IsActive)
                    {
                        pixel.Band0 = (ushort)((SiteVars.RateOfSpread[site]) + 1);

                    }
                    else
                    {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    rosmap.WritePixel(pixel);
                }
            }*/

            /*
            //  Write AdjROS map

            path = MapNames.ReplaceTemplateVars("./DFFS-output/AdjROS-{timestep}.gis", Model.Core.CurrentTime);
            IOutputRaster<UShortPixel> adjmap = CreateTravelTimeMap(path);
            using (adjmap)
            {
                UShortPixel pixel = new UShortPixel();
                foreach (Site site in Model.Core.Landscape.AllSites)
                {
                    if (site.IsActive)
                    {
                        pixel.Band0 = (ushort)(((SiteVars.AdjROS[site]) * 100) + 1);

                    }
                    else
                    {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    adjmap.WritePixel(pixel);
                }
            }
            */

            //  Write TimeOfLastFire map

            path = MapNames.ReplaceTemplateVars("./DFFS-output/TimeOfLastFire-{timestep}.gis", Model.Core.CurrentTime);
            IOutputRaster<UShortPixel> tolfMap = CreateTravelTimeMap(path);
            using (tolfMap)
            {
                UShortPixel pixel = new UShortPixel();
                foreach (Site site in Model.Core.Landscape.AllSites)
                {
                    if (site.IsActive)
                    {
                        pixel.Band0 = (ushort)(SiteVars.TimeOfLastFire[site]);

                    }
                    else
                    {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    tolfMap.WritePixel(pixel);
                }
            }

            WriteSummaryLog(Model.Core.CurrentTime);

            if (isDebugEnabled)
                UI.WriteLine("Done running extension");
        }
コード例 #32
0
 /// <summary>
 /// Returns a new line chart plotting the specified function of the given distribution for 0.0001 &lt;= p &lt;= 0.9999.
 /// </summary>
 /// <param name="dist">The distribution.</param>
 /// <param name="function">The distribution function to plot.</param>
 /// <returns>A new chart.</returns>
 public static ChartControl ToChart( PoissonDistribution dist, DistributionFunction function = DistributionFunction.PDF )
 {
     ChartControl chart = GetDefaultChart();
       Update( ref chart, dist, function );
       return chart;
 }
コード例 #33
0
 /// <summary>
 /// Updates the given chart with the specified distribution.
 /// </summary>
 /// <param name="chart">A chart.</param>
 /// <param name="dist">The distribution.</param>
 /// <param name="function">The distribution function to plot.</param>
 /// <returns>A new chart.</returns>
 /// <remarks>
 /// Plots the specified function of the given distribution for 0.0001 &lt;= p &lt;= 0.9999.
 /// <br/>
 /// Titles are added only if chart does not currently contain any titles.
 /// <br/>
 /// chart.Series[0] is replaced, or added if necessary.
 /// </remarks>
 public static void Update( ref ChartControl chart, PoissonDistribution dist, DistributionFunction function = DistributionFunction.PDF )
 {
     List<string> titles = new List<string>()
       {
     "PoissonDistribution",
     String.Format("\u03BB={0}", dist.Mean)
       };
       UpdateDiscreteDistribution( ref chart, dist, titles, function );
 }
コード例 #34
0
        //---------------------------------------------------------------------

        ///<summary>
        /// Run the plug-in at a particular timestep.
        ///</summary>
        public override void Run()
        {
        
            UI.WriteLine("Processing landscape for Fire events ...");

            SiteVars.Event.SiteValues = null;
            SiteVars.Severity.ActiveSiteValues = 0;
            SiteVars.Disturbed.ActiveSiteValues = false;
            SiteVars.TravelTime.ActiveSiteValues = Double.PositiveInfinity;
            SiteVars.MinNeighborTravelTime.ActiveSiteValues = Double.PositiveInfinity;
            SiteVars.RateOfSpread.ActiveSiteValues = 0.0;
            
            // Fill in open types as needed:
            foreach (ActiveSite site in Model.Core.Landscape) 
            {
                if((FuelTypeCode) SiteVars.CFSFuelType[site] == FuelTypeCode.NoFuel)
                {
                    IEcoregion ecoregion = SiteVars.Ecoregion[site];
                    IMoreEcoregionParameters fireParms = ecoregion.MoreEcoregionParameters;
                    SiteVars.CFSFuelType[site] = (int) fireParms.OpenFuelType;
                }
            }


            foreach (IEcoregion ecoregion in Ecoregions.Dataset)
            {
                summaryEcoregionEventCount[ecoregion.Index] = 0;
            }

            summaryTotalSites = 0;
            summaryEventCount = 0;
            
            //-----Edited by BRM to incorporate Poisson selection of ignition #-----
            /*
            //-----This section is original method
            foreach (ActiveSite site in Model.Core.Landscape) 
            {
                IEcoregion ecoregion = SiteVars.Ecoregion[site];
                IMoreEcoregionParameters fireParms = ecoregion.MoreEcoregionParameters;
                
                if(Util.Random.GenerateUniform() <= fireParms.EcoIgnitionProb)
                {
                             
                    Event FireEvent = Event.Initiate(site, Timestep, fireSizeType, bui, seasonParameters, windDirectionParameters);
                    if (FireEvent != null) 
                    {
                        LogEvent(Model.Core.CurrentTime, FireEvent);
                        summaryEventCount++;
                    }
                }
            }
             //----------
             */
            
            //-----This section replaces removed section above-----
            foreach (IEcoregion ecoregion in Ecoregions.Dataset)
            {
                IMoreEcoregionParameters fireParms = ecoregion.MoreEcoregionParameters;
                if (fireParms.EcoIgnitionProb > 0)
                {
                    PoissonDistribution randVar = new PoissonDistribution(RandomNumberGenerator.Singleton);
                    double doubleLambda;
                    int ignGenerated = 0;
                    if (fireParms.EcoIgnitionProb < 1)
                    {
                        doubleLambda = fireParms.EcoIgnitionProb * Timestep;
                        if (doubleLambda < 1)
                        {
                            if (Util.Random.GenerateUniform() <= doubleLambda)
                            {
                                randVar.Lambda = 1;
                                ignGenerated = randVar.Next();
                            }
                            else
                            {
                                ignGenerated = 0;
                            }

                        }
                        else
                        {
                            randVar.Lambda = doubleLambda;
                            ignGenerated = randVar.Next();
                        }
                    }
                    else
                    {
                        doubleLambda = fireParms.EcoIgnitionProb;
                        bool boolLarge = false;
                        if (doubleLambda > 745)
                        {
                            doubleLambda = doubleLambda / 10;
                            boolLarge = true;
                        }
                        bool boolLambda = randVar.IsValidLambda(doubleLambda);
                        randVar.Lambda = doubleLambda;
                        
                        for (int i = 1; i <= Timestep; i++)
                        {
                            int annualFires = randVar.Next();
                            if (boolLarge)
                                annualFires = annualFires * 10;
                            ignGenerated += annualFires;
                        }
                    }
                    
                    List<Location> cellsPerEcoregion = ecoregion.MoreEcoregionParameters.EcoregionSites;
                    Landis.Util.Random.Shuffle(cellsPerEcoregion);
                    int fireCount = 0;

                    //Try to create poissonNumber of fires in each ecoregion.
                    //Fires should only initiate if a fire event has not previously occurred 
                    //at that site.

                    foreach (Location siteLocation in cellsPerEcoregion)
                    {

                        Site site = Model.Core.Landscape.GetSite(siteLocation);

                        ActiveSite asite = site as ActiveSite;

                        if (fireCount >= ignGenerated) continue;  //exit loop if the required number of fires has occurred.
                        if (SiteVars.Event[asite] == null)
                        {
                            fireCount++;
                            Event FireEvent = Event.Initiate(asite, Timestep, fireSizeType, bui, seasonParameters, windDirectionParameters);
                            if (FireEvent != null)
                            {  
                                LogEvent(Model.Core.CurrentTime, FireEvent);
                                summaryEventCount++;
                            }
                        }
                    }
                }

              
            }
 
            //----------
             

            //UI.WriteLine("  Fire events: {0}", summaryEventCount);

            //  Write Fire severity map
            string path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime);
            IOutputRaster<SeverityPixel> map = CreateMap(path);
            using (map) {
                SeverityPixel pixel = new SeverityPixel();
                foreach (Site site in Model.Core.Landscape.AllSites) {
                    if (site.IsActive) {
                        if (SiteVars.Disturbed[site])
                            pixel.Band0 = (byte) (SiteVars.Severity[site] + 2);
                        else
                            pixel.Band0 = 1;
                    }
                    else {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    map.WritePixel(pixel);
                }
            }
            
            //  Write travel time map
            path = MapNames.ReplaceTemplateVars("./tests/Fire-2006/travel-time-{timestep}.gis", Model.Core.CurrentTime);
            //path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime);
            IOutputRaster<UShortPixel> umap = CreateTravelTimeMap(path);
            using (umap) {
                UShortPixel pixel = new UShortPixel();
                foreach (Site site in Model.Core.Landscape.AllSites) {
                    if (site.IsActive) {
                        if (!Double.IsPositiveInfinity(SiteVars.TravelTime[site]))
                        //if (SiteVars.Event[site] != null)
                            pixel.Band0 = (ushort) ((SiteVars.TravelTime[site]) + 2);
                        else
                            pixel.Band0 = 1;
                    }
                    else {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    umap.WritePixel(pixel);
                }
            }

            //  Write topo map
            path = MapNames.ReplaceTemplateVars("./tests/Fire-2006/topo-{timestep}.gis", Model.Core.CurrentTime);
            //path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime);
            IOutputRaster<TopoPixel> tmap = CreateTopoMap(path);
            using (tmap)
            {
                TopoPixel pixel = new TopoPixel();
                foreach (Site site in Model.Core.Landscape.AllSites)
                {
                    if (site.IsActive)
                    {
                        pixel.Band0 = (ushort)(SiteVars.GroundSlope[site]);
                       
                    }
                    else
                    {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    tmap.WritePixel(pixel);
                }
            }
            //  Write wind speed map
            path = MapNames.ReplaceTemplateVars("./tests/Fire-2006/WSV-{timestep}.gis", Model.Core.CurrentTime);
            //path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime);
            IOutputRaster<UShortPixel> wsvmap = CreateTravelTimeMap(path);
            using (wsvmap)
            {
                UShortPixel pixel = new UShortPixel();
                foreach (Site site in Model.Core.Landscape.AllSites)
                {
                    if (site.IsActive)
                    {
                        pixel.Band0 = (ushort)(SiteVars.SiteWindSpeed[site]);

                    }
                    else
                    {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    wsvmap.WritePixel(pixel);
                }
            }

            //  Write ROS map
            path = MapNames.ReplaceTemplateVars("./tests/Fire-2006/ROS-{timestep}.gis", Model.Core.CurrentTime);
            //path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime);
            IOutputRaster<UShortPixel> rosmap = CreateTravelTimeMap(path);
            using (rosmap)
            {
                UShortPixel pixel = new UShortPixel();
                foreach (Site site in Model.Core.Landscape.AllSites)
                {
                    if (site.IsActive)
                    {
                        pixel.Band0 = (ushort)(SiteVars.RateOfSpread[site]);

                    }
                    else
                    {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    rosmap.WritePixel(pixel);
                }
            }

            //  Write AdjROS map
            path = MapNames.ReplaceTemplateVars("./tests/Fire-2006/AdjROS-{timestep}.gis", Model.Core.CurrentTime);
            //path = MapNames.ReplaceTemplateVars(mapNameTemplate, Model.Core.CurrentTime);
            IOutputRaster<UShortPixel> adjmap = CreateTravelTimeMap(path);
            using (adjmap)
            {
                UShortPixel pixel = new UShortPixel();
                foreach (Site site in Model.Core.Landscape.AllSites)
                {
                    if (site.IsActive)
                    {
                        pixel.Band0 = (ushort)((SiteVars.AdjROS[site]) * 100);

                    }
                    else
                    {
                        //  Inactive site
                        pixel.Band0 = 0;
                    }
                    adjmap.WritePixel(pixel);
                }
            }

            WriteSummaryLog(Model.Core.CurrentTime);

        }
コード例 #35
0
 /// <summary>
 /// Shows a new chart in a default form.
 /// </summary>
 /// <param name="dist">The distribution.</param>
 /// <param name="function">The distribution function to plot.</param>
 /// <remarks>
 /// Equivalent to:
 /// <code>
 /// NMathStatsChart.Show( ToChart( dist, function ) );
 /// </code>
 /// </remarks>
 public static void Show( PoissonDistribution dist, DistributionFunction function = DistributionFunction.PDF )
 {
     Show( ToChart( dist, function ) );
 }
コード例 #36
0
ファイル: Tiles.cs プロジェクト: beaver999/mygoodjob
        public void Generate(int numColors, int samplesPerTile, int numThreads )
        {
            random = new Random();
            this.numColors = numColors;
            tiles = new List<WangTile>();

            const int numEdges = 4;
            int numTiles = (int)Math.Pow(numColors, numEdges);

            #region generate Poisson distributions
            List<PoissonSample>[] distributions = new List<PoissonSample>[numTiles];
            generatePoissonDistParam_t[] threadParams = new generatePoissonDistParam_t[numThreads];
            PoissonDistribution[] generators = new PoissonDistribution[numThreads];
            AutoResetEvent[] waitHandles = new AutoResetEvent[numThreads];

            for (int i = 0; i < numThreads; i++)
            {
                threadParams[i].dist = new PoissonDistribution();
                threadParams[i].numSamples = samplesPerTile;
                waitHandles[i] = new AutoResetEvent(false);
                threadParams[i].autoResetEvent = waitHandles[i];
            }
            int t = 0;
            Queue<int> availableThreads = new Queue<int>();
            for (int i = 0; i < numThreads; i++) availableThreads.Enqueue(i);

            if (OnConsoleMessage != null) OnConsoleMessage("Generating " + numTiles + " source Poisson Distributions with " + samplesPerTile + " samples each...");

            Image debugImage = null;
            if (OnDebugStep != null) debugImage = new Bitmap(800, 800);

            while (t < numTiles || availableThreads.Count < numThreads)
            {
                while (availableThreads.Count > 0 && t < numTiles)
                {
                    int i = availableThreads.Dequeue();
                    if (OnProgressReport != null) OnProgressReport((float)(t + 1) / numTiles);
                    distributions[t] = new List<PoissonSample>(samplesPerTile);
                    threadParams[i].result = distributions[t];
                    ThreadPool.QueueUserWorkItem(new WaitCallback(GeneratePoissonDistThreaded), threadParams[i]);
                    t++;
                }
                int index = WaitHandle.WaitAny(waitHandles);
                if (debugImage != null)
                {
                    PoissonDistribution.ToImage( threadParams[index].dist.Samples, Color.Black, debugImage, 1);
                    OnDebugStep(debugImage, "Poisson Distribution " + t);
                }
                availableThreads.Enqueue(index);
            }

            #endregion

            #region generate seam tiles
            List<SourceTile> seamTiles = new List<SourceTile>();
            #if DEBUG
            Color[] colors = new Color[numColors];
            for( int i = 0; i < numColors; i++ ) colors[i] = Color.FromArgb(random.Next(256), random.Next(256), random.Next(256));
            #endif
            for (int i = 0; i < numColors; i++)
            {
                PoissonDistribution distribution = new PoissonDistribution();
                distribution.Generate(samplesPerTile);
            #if DEBUG
                foreach (PoissonSample p in distribution.Samples) p.color = colors[i];
            #endif
                seamTiles.Add(new SourceTile(distribution.Samples, i));
            }
            #endregion

            #region generate all edge permutations
            /*
             * 0000 0001 0002 ... 000n
             * 0010 0011 0012 ... 001n
             * 0020 0021 0022 ... 002n
             * ...
             * 00n0 00n1 00n2 ... 00nn
             *
             * 0100 0101 0102 ... 010n
             * 0110 0111 0112 ... 011n
             * ...
             * 01n0 01n1 01n2 ... 01nn
             *
             * ...
             *
             * nnn0 nnn1 nnn2 ... nnnn
             */
            int[,] edgeCol = new int[numTiles,numEdges];
            for (int i = 0; i < numEdges; i++) edgeCol[0, i] = 0;
            for (int i = 1; i < numTiles; i++)
            {
                for (int j = 0; j < numEdges; j++)
                {
                    edgeCol[i,j] = (edgeCol[i-1,j] + (i % (int)Math.Pow(numColors, j) == 0 ? 1 : 0)) % numColors;
                }
            }
            #endregion

            #region generate wang tiles
            WangTile[] tileArray = new WangTile[numTiles];
            t = 0;
            availableThreads.Clear();
            createWangTileParam_t[] createWangTileParams = new createWangTileParam_t[numThreads];
            for (int i = 0; i < numThreads; i++)
            {
                availableThreads.Enqueue(i);
                createWangTileParams[i] = new createWangTileParam_t();
                createWangTileParams[i].autoResetEvent = waitHandles[i];
                createWangTileParams[i].autoResetEvent.Reset();
                createWangTileParams[i].tileArray = tileArray;
            }

            if (OnConsoleMessage != null) OnConsoleMessage("Merging distributions to generate Wang Tiles..." );

            while (t < numTiles || availableThreads.Count < numThreads)
            {
                while (availableThreads.Count > 0 && t < numTiles)
                {
                    int i = availableThreads.Dequeue();
                    if (OnProgressReport != null) OnProgressReport((float)( t + 1 ) / numTiles);

                    createWangTileParams[i].tileBaseDistribution = distributions[t];
                    createWangTileParams[i].neighbours = new List<SourceTile>();
                    createWangTileParams[i].tileIndex = t;
                    if (numColors > 1)
                    {
                        for (int j = 0; j < numEdges; j++)
                            createWangTileParams[i].neighbours.Add(seamTiles[edgeCol[t, j]]);
                    }
                    ThreadPool.QueueUserWorkItem(new WaitCallback(CreateWangTileThreaded), createWangTileParams[i]);
                    t++;
                }
                int index = WaitHandle.WaitAny(waitHandles);
                availableThreads.Enqueue(index);
            }
            tiles = tileArray.ToList();

            SortTiles();
            MakeRecursive();

            if (OnDebugStep != null)
            {
                ToColorTiles(debugImage, new Size(8, 8));
                OnDebugStep(debugImage, "Sample coverage of the generated Wang Tiles" );
            }

            #endregion
        }
コード例 #37
0
        public void GenerateVehicle()
        {
            int generateVehicles;
            Random Random = new Random();
            int RandomNum;
            PoissonDistribution P = new PoissonDistribution(0);

            foreach (Road road in Simulator.RoadManager.GetGenerateVehicleRoadList())
            {
                if (road.generateLevel_lambda > 0 && DrivingPathList[road.roadID].Count >= 1)
                {
                    generateVehicles = 0;

                    double lambda = road.generateLevel_lambda / (60 / vehicleGenerateInterval) ;

                    P.SetLambda(lambda);

                    RandomNum = Random.Next(999);

                    if (!vehicleWeight)
                    {
                        if (RandomNum >= P.CummulitiveDistributionFunction(0) * 1000)
                        {
                            generateVehicles = 1;
                        }
                    }
                    else if (vehicleWeight)
                    {
                        while (RandomNum >= P.CummulitiveDistributionFunction(generateVehicles) * 1000)
                        {
                            generateVehicles++;
                        }
                    }

                    if (generateVehicles > 0)
                    {
                        if (Simulator.TESTMODE)
                            Simulator.UI.AddMessage("System", "Road : " + road.roadID + " Generate " + generateVehicles + " Vehicles");

                        CreateVehicle(road, generateVehicles);
                    }
                }
            }
        }
コード例 #38
0
ファイル: PoissonDistribution.cs プロジェクト: minikie/test
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(PoissonDistribution obj) {
   return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
 }