示例#1
0
    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])
示例#2
0
    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)
示例#3
0
    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)
示例#4
0
    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)
示例#5
0
    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)
示例#6
0
    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)
示例#7
0
    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())
示例#8
0
    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'))
示例#9
0
    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)
示例#10
0
 def test_name(self):
     # Test name method
     mcmc = pints.HaarioACMC(self.real_parameters)
     self.assertEqual(mcmc.name(), 'Haario adaptive covariance MCMC')
示例#11
0
 def test_hyperparameters(self):
     # Hyperparameters unchanged from base class
     mcmc = pints.HaarioACMC(self.real_parameters)
     self.assertEqual(mcmc.n_hyper_parameters(), 1)