mirror of
				https://github.com/fjosw/pyerrors.git
				synced 2025-11-04 01:25:46 +01:00 
			
		
		
		
	feat: positive semi-definite estimator for the covariance implemented,
fits.covariance matrix deprecated, covariance can now handle lists of observables.
This commit is contained in:
		
					parent
					
						
							
								8e3e34bbea
							
						
					
				
			
			
				commit
				
					
						82419b7a88
					
				
			
		
					 5 changed files with 65 additions and 79 deletions
				
			
		| 
						 | 
				
			
			@ -251,10 +251,10 @@ def test_covariance_is_variance():
 | 
			
		|||
    dvalue = np.abs(np.random.normal(0, 1))
 | 
			
		||||
    test_obs = pe.pseudo_Obs(value, dvalue, 't')
 | 
			
		||||
    test_obs.gamma_method()
 | 
			
		||||
    assert np.abs(test_obs.dvalue ** 2 - pe.covariance(test_obs, test_obs)) <= 10 * np.finfo(np.float64).eps
 | 
			
		||||
    assert np.abs(test_obs.dvalue ** 2 - pe.covariance([test_obs, test_obs])[0, 1]) <= 10 * np.finfo(np.float64).eps
 | 
			
		||||
    test_obs = test_obs + pe.pseudo_Obs(value, dvalue, 'q', 200)
 | 
			
		||||
    test_obs.gamma_method()
 | 
			
		||||
    assert np.abs(test_obs.dvalue ** 2 - pe.covariance(test_obs, test_obs)) <= 10 * np.finfo(np.float64).eps
 | 
			
		||||
    assert np.abs(test_obs.dvalue ** 2 - pe.covariance([test_obs, test_obs])[0, 1]) <= 10 * np.finfo(np.float64).eps
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_fft():
 | 
			
		||||
| 
						 | 
				
			
			@ -268,21 +268,6 @@ def test_fft():
 | 
			
		|||
    assert np.abs(test_obs1.dvalue - test_obs2.dvalue) <= 10 * max(test_obs1.dvalue, test_obs2.dvalue) * np.finfo(np.float64).eps
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_covariance_symmetry():
 | 
			
		||||
    value1 = np.random.normal(5, 10)
 | 
			
		||||
    dvalue1 = np.abs(np.random.normal(0, 1))
 | 
			
		||||
    test_obs1 = pe.pseudo_Obs(value1, dvalue1, 't')
 | 
			
		||||
    test_obs1.gamma_method()
 | 
			
		||||
    value2 = np.random.normal(5, 10)
 | 
			
		||||
    dvalue2 = np.abs(np.random.normal(0, 1))
 | 
			
		||||
    test_obs2 = pe.pseudo_Obs(value2, dvalue2, 't')
 | 
			
		||||
    test_obs2.gamma_method()
 | 
			
		||||
    cov_ab = pe.covariance(test_obs1, test_obs2)
 | 
			
		||||
    cov_ba = pe.covariance(test_obs2, test_obs1)
 | 
			
		||||
    assert np.abs(cov_ab - cov_ba) <= 10 * np.finfo(np.float64).eps
 | 
			
		||||
    assert np.abs(cov_ab) < test_obs1.dvalue * test_obs2.dvalue * (1 + 10 * np.finfo(np.float64).eps)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_gamma_method_uncorrelated():
 | 
			
		||||
    # Construct pseudo Obs with random shape
 | 
			
		||||
    value = np.random.normal(5, 10)
 | 
			
		||||
| 
						 | 
				
			
			@ -629,8 +614,8 @@ def test_covariance_symmetry():
 | 
			
		|||
    dvalue2 = np.abs(np.random.normal(0, 1))
 | 
			
		||||
    test_obs2 = pe.pseudo_Obs(value2, dvalue2, 't')
 | 
			
		||||
    test_obs2.gamma_method()
 | 
			
		||||
    cov_ab = pe.covariance(test_obs1, test_obs2)
 | 
			
		||||
    cov_ba = pe.covariance(test_obs2, test_obs1)
 | 
			
		||||
    cov_ab = pe.covariance([test_obs1, test_obs2])[0, 1]
 | 
			
		||||
    cov_ba = pe.covariance([test_obs2, test_obs1])[0, 1]
 | 
			
		||||
    assert np.abs(cov_ab - cov_ba) <= 10 * np.finfo(np.float64).eps
 | 
			
		||||
    assert np.abs(cov_ab) < test_obs1.dvalue * test_obs2.dvalue * (1 + 10 * np.finfo(np.float64).eps)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -643,10 +628,10 @@ def test_covariance_symmetry():
 | 
			
		|||
    idx = [i + 1 for i in range(len(configs)) if configs[i] == 1]
 | 
			
		||||
    a = pe.Obs([zero_arr], ['t'], idl=[idx])
 | 
			
		||||
    a.gamma_method()
 | 
			
		||||
    assert np.isclose(a.dvalue**2, pe.covariance(a, a), atol=100, rtol=1e-4)
 | 
			
		||||
    assert np.isclose(a.dvalue ** 2, pe.covariance([a, a])[0, 1], atol=100, rtol=1e-4)
 | 
			
		||||
 | 
			
		||||
    cov_ab = pe.covariance(test_obs1, a)
 | 
			
		||||
    cov_ba = pe.covariance(a, test_obs1)
 | 
			
		||||
    cov_ab = pe.covariance([test_obs1, a])[0, 1]
 | 
			
		||||
    cov_ba = pe.covariance([a, test_obs1])[0, 1]
 | 
			
		||||
    assert np.abs(cov_ab - cov_ba) <= 10 * np.finfo(np.float64).eps
 | 
			
		||||
    assert np.abs(cov_ab) < test_obs1.dvalue * a.dvalue * (1 + 10 * np.finfo(np.float64).eps)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -704,4 +689,4 @@ def test_merge_idx():
 | 
			
		|||
    new_idx = pe.obs._merge_idx(idl)
 | 
			
		||||
    assert(new_idx[-1] > new_idx[0])
 | 
			
		||||
    for i in range(1, len(new_idx)):
 | 
			
		||||
        assert(new_idx[i - 1] < new_idx[i])
 | 
			
		||||
        assert(new_idx[i - 1] < new_idx[i])
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue