Exemplo n.º 1
0
        public void Do(MHSampler2Parameters parameters)
        {
            Log.Post("MHSampler - Start");
            Build.Do();
            GraphClones = new List<IGWGraph<SGLNodeData, SGLEdgeData, SGLGraphData>>();

            //get parameter values
            var numberChains = parameters.NumberChains;
            var graph = parameters.Graph;

            //create clones
            GraphClones.Add(graph);
            var catGraphCreator = new CategoryGraphCreator();
            for (int i = 1; i < numberChains; i++)
            {
                var clone = graph.Clone(GraphDataConverter.SGLNodeDataConvert, GraphDataConverter.SGLEdgeDataConvert, GraphDataConverter.SGLGraphDataConvert);
                //catGraphCreator.CreateCategoryGraph(clone);
                GraphClones.Add(clone);
            }

            //init testsamples
            GraphCloneSamples = new List<int[]>[GraphClones.Count];
            for (int i = 0; i < GraphCloneSamples.Length; i++)
            {
                GraphCloneSamples[i] = new List<int[]>();
            }

            //start chains
            for (int i = 0; i < GraphClones.Count; i++)
            {
                var chain = GraphClones[i];
                //start the first chain with viterbi
                switch (parameters.MHSampler2StartPoint)
                {
                    case MHSampler2StartPoint.Random:
                        FindStartPointRandom(chain);
                        break;
                    case MHSampler2StartPoint.Viterbi:
                        FindStartPointViterbi(chain);
                        break;
                    default: break;
                }
            }

            //iterate over prerun
            for (int i = 0; i < parameters.PreRunLength; i++)
            {
                foreach (var chain in GraphClones)
                {
                    ChangePosition(chain, 0);
                }
            }

            //iterate over prerun
            for (int i = 0; i < GraphClones.Count; i++)
            {
                var chain = GraphClones[i];
                for (int k = 0; k < parameters.RunLength; k++)
                {
                    ChangePosition(chain, 0);
                    var sample = new int[chain.Nodes.Count()];
                    foreach (var node in chain.Nodes)
                    {
                        sample[node.GraphId] = node.Data.TempAssign;
                    }
                    GraphCloneSamples[i].Add(sample);
                }
            }

            // shuffle all samples into one sample.
            FinalSample = GraphCloneSamples.SelectMany(s => s).RandomizeOrder().ToList();
        }
Exemplo n.º 2
0
        public void Do(MHSamplerParameters parameters)
        {
            Log.Post("MHSampler - Start");
            Build.Do();
            Chains = new List <IGWGraph <SGLNodeData, SGLEdgeData, SGLGraphData> >();

            //get parameter values
            var numberChains = parameters.NumberChains;
            var graph        = parameters.Graph;

            TestInterval                  = parameters.TestInterval;
            ToleranceVariance             = parameters.ToleranceVariance;
            ToleranceMarginalDistribution = parameters.ToleranceMarginalDistribution;
            ToleranceAutoCorrelation      = parameters.ToleranceAutoCorrelation;


            //don't allow less than 2 chains
            if (numberChains < 2)
            {
                numberChains = 2;
            }
            //combinations for marginal distribution test
            Combinations = new List <int[]>();
            int[] arr = new int[numberChains];
            for (int i = 0; i < numberChains; i++)
            {
                arr[i] = i;
            }
            CalcCombinations(arr, 2, 0, new int[2]);


            //create clones
            Chains.Add(graph);
            var catGraphCreator = new CategoryGraphCreator();

            for (int i = 1; i < numberChains; i++)
            {
                var clone = graph.Clone(GraphDataConverter.SGLNodeDataConvert, GraphDataConverter.SGLEdgeDataConvert, GraphDataConverter.SGLGraphDataConvert);
                catGraphCreator.CreateCategoryGraph(clone);
                Chains.Add(clone);
            }

            //init testsamples
            TestSamples = new List <int[]> [Chains.Count];
            for (int i = 0; i < TestSamples.Length; i++)
            {
                TestSamples[i] = new List <int[]>();
            }


            //start chains
            for (int i = 0; i < Chains.Count; i++)
            {
                var chain = Chains[i];
                //start the first chain with viterbi
                if (i == 0)
                {
                    FindStartPointViterbi(chain);
                }
                //rest with random for now
                else
                {
                    FindStartPointRandom(chain);
                }
            }

            //iterate over prerun
            for (int i = 0; i < parameters.PreRunLength; i++)
            {
                foreach (var chain in Chains)
                {
                    ChangePosition(chain, 0);
                }
            }

            //test if chains are mixed
            bool chainsHaveMixed = false;
            int  time            = 1;
            int  test            = 1;

            while (!chainsHaveMixed)
            {
                foreach (var chain in Chains)
                {
                    ChangePosition(chain, time);
                }

                //make statistic tests every xth iteration
                if (time % TestInterval == 0)
                {
                    Console.WriteLine("test: " + test++);
                    chainsHaveMixed = StatisticTests(time);

                    //constant window
                    if (!chainsHaveMixed)
                    {
                        //chains aren't mixed -> set everything back to 0
                        time = 0;
                        foreach (var chain in Chains)
                        {
                            chain.Nodes.Each(n => { n.Data.TempCount = 0; });
                            chain.Nodes.Each(n => { n.Data.LastUpdate = 0; });
                        }

                        //clear testsamples
                        foreach (var samples in TestSamples)
                        {
                            samples.Clear();
                        }
                    }
                }
                time++;
            }

            // shuffle all samples into one sample.
            FinalSample = TestSamples.SelectMany(s => s).RandomizeOrder().ToList();

            Log.Post("Chains may have mixed. ");
            Log.Post("Number of Chains: " + numberChains);
            Log.Post("Total Transitions: " + (CountTransitionNodeProposal + CountTransitionNeighborhoodProposal + CountTransitionCategoryProposal));
            Log.Post("Node Transistion Proposals: " + CountTransitionNodeProposal);
            Log.Post("Node Transistions Accepted: " + CountTransitionNodeAccepted);
            Log.Post("Neighborhood Transistion Proposals: " + CountTransitionNeighborhoodProposal);
            Log.Post("Neighborhood Transistions Accepted: " + CountTransitionNeighborhoodAccepted);
            Log.Post("Category Transition Proposals: " + CountTransitionCategoryProposal);
            Log.Post("Category Transitions Accepted: " + CountTransitionCategoryAccepted);

            Log.Post("Tests: " + (test - 1));
            Log.Post("AutoCorrelation Test Failed: " + CountTestAutoCorrelationFailed);
            Log.Post("Variance Test Failed: " + CountTestVarianceFailed);
            Log.Post("Marginal Distribution Test Failed: " + CountTestMarginalDistributionFailed);
            Log.Post(Environment.NewLine);
        }