def test_replace(self): # Tests the replace() method x0 = self.real_parameters mcmc = pints.HaarioACMC(x0) # One round of ask-tell must have been run self.assertRaisesRegex( RuntimeError, 'already running', mcmc.replace, x0, 1) mcmc.ask() # One round of ask-tell must have been run self.assertRaises(RuntimeError, mcmc.replace, x0, 1) mcmc.tell(0.5) mcmc.replace([1, 2, 3], 10) mcmc.replace([1, 2, 3], 10) # New position must have correct size self.assertRaisesRegex( ValueError, 'Point `current` has the wrong dimensions', mcmc.replace, [1, 2], 1) # Proposal can be changed too mcmc.ask() mcmc.replace([1, 2, 3], 10, [3, 4, 5]) # New proposal must have correct size self.assertRaisesRegex( ValueError, '`proposed` has the wrong dimensions', mcmc.replace, [1, 2, 3], 3, [3, 4])
def test_method(self): # Create mcmc x0 = self.real_parameters * 1.1 mcmc = pints.HaarioACMC(x0) # Configure mcmc.set_target_acceptance_rate(0.3) mcmc.set_initial_phase(True) # Perform short run rate = [] chain = [] for i in range(100): x = mcmc.ask() fx = self.log_posterior(x) sample = mcmc.tell(fx) if i == 20: mcmc.set_initial_phase(False) if i >= 50: chain.append(sample) rate.append(mcmc.acceptance_rate()) if np.all(sample == x): self.assertEqual(mcmc.current_log_pdf(), fx) chain = np.array(chain) rate = np.array(rate) self.assertEqual(chain.shape[0], 50) self.assertEqual(chain.shape[1], len(x0)) self.assertEqual(rate.shape[0], 100)
def test_current_log_pdf(self): # Test current_log_pdf() method mcmc = pints.HaarioACMC(self.real_parameters) mcmc.ask() mcmc.tell(1.23) self.assertEqual(mcmc.current_log_pdf(), 1.23)
def test_method(self): # Create mcmc x0 = self.real_parameters * 1.1 mcmc = pints.HaarioACMC(x0) # Configure mcmc.set_target_acceptance_rate(0.3) mcmc.set_initial_phase(True) # Perform short run rate = [] chain = [] for i in range(100): x = mcmc.ask() fx = self.log_posterior(x) y, fy, ac = mcmc.tell(fx) if i == 20: mcmc.set_initial_phase(False) if i >= 50: chain.append(y) rate.append(mcmc.acceptance_rate()) self.assertTrue(isinstance(ac, bool)) if ac: self.assertTrue(np.all(x == y)) self.assertEqual(fx, fy) chain = np.array(chain) rate = np.array(rate) self.assertEqual(chain.shape[0], 50) self.assertEqual(chain.shape[1], len(x0)) self.assertEqual(rate.shape[0], 100)
def test_hyper_parameters(self): # Tests hyperparameter methods mcmc = pints.HaarioACMC(self.real_parameters) self.assertTrue(mcmc.n_hyper_parameters(), 1) mcmc.set_hyper_parameters([0.1]) self.assertEqual(mcmc.eta(), 0.1) mcmc.set_hyper_parameters([0.67]) self.assertEqual(mcmc.eta(), 0.67)
def test_target_acceptance_rate(self): # Test target_acceptance_rate getting and setting mcmc = pints.HaarioACMC(self.real_parameters) self.assertEqual(mcmc.target_acceptance_rate(), 0.234) mcmc.set_target_acceptance_rate(0.1) self.assertEqual(mcmc.target_acceptance_rate(), 0.1) self.assertRaises(ValueError, mcmc.set_target_acceptance_rate, 0) self.assertRaises(ValueError, mcmc.set_target_acceptance_rate, -1e-6) self.assertRaises(ValueError, mcmc.set_target_acceptance_rate, 1.00001)
def test_initial_phase(self): # Test initial phase setting mcmc = pints.HaarioACMC(self.real_parameters) self.assertTrue(mcmc.needs_initial_phase()) self.assertTrue(mcmc.in_initial_phase()) mcmc.set_initial_phase(True) self.assertTrue(mcmc.in_initial_phase()) mcmc.set_initial_phase(False) self.assertFalse(mcmc.in_initial_phase()) mcmc.set_initial_phase(True) self.assertTrue(mcmc.in_initial_phase())
def test_ask_tell(self): # Test ask-tell flow # Test initial proposal is first point x0 = self.real_parameters mcmc = pints.HaarioACMC(x0) self.assertTrue(np.all(x0 == mcmc.ask())) # Repeated calls return same initial point self.assertTrue(np.all(x0 == mcmc.ask())) self.assertTrue(np.all(x0 == mcmc.ask())) # Repeated asks should return same point mcmc = pints.HaarioACMC(x0) # Get into accepting state mcmc.set_initial_phase(False) for i in range(100): mcmc.tell(self.log_posterior(mcmc.ask())) x = mcmc.ask() for i in range(10): self.assertTrue(x is mcmc.ask()) # Repeated tells should fail mcmc.tell(1) self.assertRaises(RuntimeError, mcmc.tell, 1) # Bad starting point mcmc = pints.HaarioACMC(x0) mcmc.ask() self.assertRaises(ValueError, mcmc.tell, float('-inf')) # Tell without ask mcmc = pints.HaarioACMC(x0) self.assertRaises(RuntimeError, mcmc.tell, 0) # Bad starting point mcmc = pints.HaarioACMC(x0) mcmc.ask() self.assertRaises(ValueError, mcmc.tell, float('-inf'))
def test_eta(self): # Test eta getting and setting mcmc = pints.HaarioACMC(self.real_parameters) self.assertEqual(mcmc.eta(), 0.6) mcmc.set_eta(0.1) self.assertEqual(mcmc.eta(), 0.1) mcmc.set_eta(0.4) self.assertEqual(mcmc.eta(), 0.4) self.assertRaisesRegex( ValueError, 'greater than zero', mcmc.set_eta, 0) self.assertRaisesRegex( ValueError, 'greater than zero', mcmc.set_eta, -0.1)
def test_name(self): # Test name method mcmc = pints.HaarioACMC(self.real_parameters) self.assertEqual(mcmc.name(), 'Haario adaptive covariance MCMC')
def test_hyperparameters(self): # Hyperparameters unchanged from base class mcmc = pints.HaarioACMC(self.real_parameters) self.assertEqual(mcmc.n_hyper_parameters(), 1)