def test_with_fake_log_prob(self):
        np.random.seed(42)


        def grad_log_prob(x):
            return -(x/2.0 + np.sin(x))*(1.0/2.0 + np.cos(x))

        def fake_log_prob(x):
            return -(x/5.0 + np.sin(x) )**2.0/2.0

        generator = mh_generator(log_density=fake_log_prob,x_start=1.0)
        tester = GaussianSteinTest(grad_log_prob,41)

        selector = SampleSelector(generator, sample_size=1000,thinning=20,tester=tester, max_iterations=5)

        data,converged = selector.points_from_stationary()

        assert converged is False
    def test_with_fake_log_prob(self):
        np.random.seed(42)

        def grad_log_prob(x):
            return -(x / 2.0 + np.sin(x)) * (1.0 / 2.0 + np.cos(x))

        def fake_log_prob(x):
            return -(x / 5.0 + np.sin(x))**2.0 / 2.0

        generator = mh_generator(log_density=fake_log_prob, x_start=1.0)
        tester = GaussianSteinTest(grad_log_prob, 41)

        selector = SampleSelector(generator,
                                  sample_size=1000,
                                  thinning=20,
                                  tester=tester,
                                  max_iterations=5)

        data, converged = selector.points_from_stationary()

        assert converged is False
    def test_on_one_dim_gaussian(self):
        np.random.seed(42)

        def log_normal(x):
                return  -np.dot(x,x)/2

        generator = mh_generator(log_density=log_normal)

        def gradient_of_log_of_normal(x):
            return  -x


        tester = GaussianSteinTest(gradient_of_log_of_normal,10)


        selector = SampleSelector(generator, sample_size=2000,thinning=15,tester=tester)

        data,converged = selector.points_from_stationary()

        tester = GaussianSteinTest(gradient_of_log_of_normal,10)
        assert tester.compute_pvalue(data)>0.05
        assert converged
    def test_on_one_dim_gaussian(self):
        np.random.seed(42)

        def log_normal(x):
            return -np.dot(x, x) / 2

        generator = mh_generator(log_density=log_normal)

        def gradient_of_log_of_normal(x):
            return -x

        tester = GaussianSteinTest(gradient_of_log_of_normal, 10)

        selector = SampleSelector(generator,
                                  sample_size=2000,
                                  thinning=15,
                                  tester=tester)

        data, converged = selector.points_from_stationary()

        tester = GaussianSteinTest(gradient_of_log_of_normal, 10)
        assert tester.compute_pvalue(data) > 0.05
        assert converged