Ejemplo n.º 1
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());
        }
        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]);
            }
        }
        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));
        }
Ejemplo n.º 4
0
        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++;
            }
        }
Ejemplo n.º 5
0
        public void RankDistribution()
        {
            // Create a new distribution, such as a Poisson
            var poisson = new PoissonDistribution(lambda: 0.42);

            // Draw enough samples from it
            double[] samples = poisson.Generate(1000000).ToDouble();

            // Let's pretend we don't know from which distribution
            // those sample come from, and create an analysis object
            // to check it for us:
            var analysis = new DistributionAnalysis();

            // Compute the analysis
            var gof = analysis.Learn(samples);

            // Get the most likely distribution
            var mostLikely = gof[0];

            // The result should be Poisson(x; λ = 0.420961)
            var result = (mostLikely.Distribution as IFormattable).ToString("N3", CultureInfo.InvariantCulture);

            Assert.AreEqual("Poisson(x; λ = 0.422)", result);
        }
        public void RankDistribution()
        {
            // Create a new distribution, such as a Poisson
            var poisson = new PoissonDistribution(lambda: 0.42);

            // Draw enough samples from it
            double[] samples = poisson.Generate(1000000).ToDouble();

            // Let's pretend we don't know from which distribution
            // those sample come from, and create an analysis object
            // to check it for us:
            var analysis = new DistributionAnalysis(samples);

            // Compute the analysis
            analysis.Compute();

            // Get the most likely distribution
            var mostLikely = analysis.GoodnessOfFit[0];

            // The result should be Poisson(x; λ = 0.420961)
            var result = mostLikely.Distribution.ToString();

            Assert.AreEqual("Poisson(x; λ = 0.420961)", result);
        }
Ejemplo n.º 7
0
        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
        }
Ejemplo n.º 8
0
        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
        }
Ejemplo n.º 9
0
        private void testBtn_Click(object sender, EventArgs e)
        {
            double alpha     = (double)alphaNumeric.Value;
            double opgBorder = Math.Sqrt(-Math.Log((alpha) / 2) / 2);

            opgLbl.Text = "(0; " + opgBorder.ToString() + ")";


            IRandomNumberGenerator <double> generator;

            switch (_transferData.Distribution)
            {
            case DistributionEnum.Uniform:
            {
                generator = new UniformContinuousDistribution(_transferData.A, _transferData.B);
                break;
            }

            case DistributionEnum.Exponential:
            {
                generator = new ExponentialDistribution(_transferData.Lambda);
                break;
            }

            case DistributionEnum.Erlang:
            {
                generator = new ErlangDistribution(_transferData.Lambda, _transferData.N);
                break;
            }

            case DistributionEnum.Normal:
            {
                generator = new NormalDistribution(_transferData.Mu, _transferData.Sigma);
                break;
            }

            case DistributionEnum.Poisson:
            {
                generator = new PoissonDistribution(_transferData.Lambda);
                break;
            }

            default: return;
            }

            List <double> newGenerated = generator.Generate(_transferData.Numbers.Count).ToList();

            newGenerated.Sort();

            exStatNumPg.NumberList = newGenerated;

            exNLbl.Text    = newGenerated.Count.ToString();
            exMinLbl.Text  = newGenerated.Min().ToString();
            exMaxLbl.Text  = newGenerated.Max().ToString();
            exMeanLbl.Text = newGenerated.Average().ToString();

            double average = newGenerated.Average();

            exStdDevLbl.Text = Math.Sqrt(
                newGenerated.Sum((num) => { return(Math.Pow(num - average, 2)); })
                / newGenerated.Count)
                               .ToString();


            double KS = GetKolmogorovSmirnov(newGenerated);

            ksLbl.Text = KS.ToString();
        }