@Before public void setUpProposalDistribution() throws Exception { when(vertex1.getReference()).thenReturn(new VertexId(1)); when(vertex2.getReference()).thenReturn(new VertexId(2)); proposalDistribution = new PriorProposalDistribution(ImmutableList.of(vertex1, vertex2)); }
@Test public void youCanAddProposalListeners() { ProposalListener listener1 = mock(ProposalListener.class); ProposalListener listener2 = mock(ProposalListener.class); List<ProposalListener> listeners = ImmutableList.of(listener1, listener2); proposalDistribution = new PriorProposalDistribution(ImmutableList.of(vertex1, vertex2), listeners); Set<Variable> variables = ImmutableSet.of(vertex1, vertex2); Proposal proposal = proposalDistribution.getProposal(variables, KeanuRandom.getDefaultRandom()); verify(listener1).onProposalCreated(proposal); verify(listener2).onProposalCreated(proposal); proposalDistribution.onProposalRejected(); verify(listener1).onProposalRejected(proposal); verify(listener2).onProposalRejected(proposal); verifyNoMoreInteractions(listener1, listener2); } }
public static io.improbable.keanu.algorithms.mcmc.MetropolisHastings withDefaultConfigFor(KeanuProbabilisticModel model, KeanuRandom random) { List<Vertex> latentVertices = model.getLatentVertices(); return builder() .proposalDistribution(new PriorProposalDistribution(latentVertices)) .rejectionStrategy(new RollBackToCachedValuesOnRejection(latentVertices)) .random(random) .build(); }
public static io.improbable.keanu.algorithms.mcmc.SimulatedAnnealing withDefaultConfigFor(KeanuProbabilisticModel model, KeanuRandom random) { return builder() .proposalDistribution(new PriorProposalDistribution(model.getLatentVertices())) .rejectionStrategy(new RollbackAndCascadeOnRejection(model.getLatentVertices())) .random(random) .build(); }
@Test public void doesCalculateCorrectLogProbAfterAcceptingStep() { DoubleVertex A = new GaussianVertex(0, 1); A.setValue(1.0); DoubleVertex B = A.times(2); DoubleVertex observedB = new GaussianVertex(B, 1); observedB.observe(5); BayesianNetwork bayesNet = new BayesianNetwork(A.getConnectedGraph()); KeanuProbabilisticModel model = new KeanuProbabilisticModel(bayesNet); double logProbBeforeStep = model.logProb(); MetropolisHastingsStep mhStep = new MetropolisHastingsStep( model, new PriorProposalDistribution(bayesNet.getAllVertices()), new RollBackToCachedValuesOnRejection(bayesNet.getLatentVertices()), alwaysAccept ); MetropolisHastingsStep.StepResult result = mhStep.step( Collections.singleton(A), logProbBeforeStep ); assertTrue(result.isAccepted()); assertEquals(model.logProb(), result.getLogProbabilityAfterStep(), 1e-10); }
@Test public void samplesContinuousPriorSingleVariableSelected() { MCMCTestCase testCase = new SumGaussianTestCase(); BayesianNetwork bayesNet = testCase.getModel(); KeanuProbabilisticModel model = new KeanuProbabilisticModel(bayesNet); NetworkSamples posteriorSamples = MetropolisHastings.builder() .proposalDistribution(new PriorProposalDistribution(model.getLatentVertices())) .rejectionStrategy(new RollBackToCachedValuesOnRejection(model.getLatentVertices())) .variableSelector(MHStepVariableSelector.SINGLE_VARIABLE_SELECTOR) .build() .getPosteriorSamples( model, model.getLatentVertices(), 5000 ); testCase.assertExpected(posteriorSamples); }
@Test public void samplesContinuousPriorAllVariablesSelected() { MCMCTestCase testCase = new SumGaussianTestCase(); BayesianNetwork bayesNet = testCase.getModel(); KeanuProbabilisticModel model = new KeanuProbabilisticModel(bayesNet); NetworkSamples posteriorSamples = MetropolisHastings.builder() .proposalDistribution(new PriorProposalDistribution(model.getLatentVertices())) .rejectionStrategy(new RollBackToCachedValuesOnRejection(model.getLatentVertices())) .variableSelector(MHStepVariableSelector.FULL_VARIABLE_SELECTOR) .build() .getPosteriorSamples( model, model.getLatentVertices(), 5000 ); testCase.assertExpected(posteriorSamples); }
@Category(Slow.class) @Test public void samplesComplexDiscreteWithFullVariableSelect() { MCMCTestCase testCase = new MultiVariateDiscreteTestCase(); BayesianNetwork bayesNet = testCase.getModel(); KeanuProbabilisticModel model = new KeanuProbabilisticModel(bayesNet); NetworkSamples posteriorSamples = MetropolisHastings.builder() .proposalDistribution(new PriorProposalDistribution(model.getLatentVertices())) .rejectionStrategy(new RollBackToCachedValuesOnRejection(model.getLatentVertices())) .variableSelector(MHStepVariableSelector.FULL_VARIABLE_SELECTOR) .build() .getPosteriorSamples( model, model.getLatentVertices(), 1000 ); testCase.assertExpected(posteriorSamples); }
.proposalDistribution(new PriorProposalDistribution(network.getLatentVertices())) .rejectionStrategy(new RollBackToCachedValuesOnRejection(network.getLatentVertices())) .build()