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(); }
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); }