def test_richardson_extr(test_f: Callable[[float], float]): """Test of the Richardson's extrapolator.""" seeded_f = apply_seed_to_func(test_f, SEED) fac = RichardsonFactory(scale_factors=X_VALS) assert not fac._opt_params fac.run_classical(seeded_f) zne_value = fac.reduce() assert np.isclose(zne_value, seeded_f(0, err=0), atol=CLOSE_TOL) assert len(fac._opt_params) == len(X_VALS) assert np.isclose(fac._opt_params[-1], zne_value) exp_vals = fac.get_expectation_values() assert np.isclose(fac.extrapolate(X_VALS, exp_vals), zne_value) assert np.isclose( fac.extrapolate(X_VALS, exp_vals, full_output=True)[0], zne_value, )
def test_fake_nodes_extrapolation(): """Test that there exists a regime in which FakeNodesFactory is better than RichardsonFactory. Note: in many cases RichardsonFactory is better. """ y_vals = [f_runge(x) for x in UNIFORM_X] zne_runge = FakeNodesFactory.extrapolate(UNIFORM_X, y_vals) zne_richard = RichardsonFactory.extrapolate(UNIFORM_X, y_vals) abs_err_runge = np.abs(zne_runge - f_runge(0.0)) abs_err_richard = np.abs(zne_richard - f_runge(0.0)) # Test Richardson extrapolation error is much larger assert 500 * abs_err_runge < abs_err_richard