diff --git a/pyerrors/fits.py b/pyerrors/fits.py index 677f6eba..85e28557 100644 --- a/pyerrors/fits.py +++ b/pyerrors/fits.py @@ -301,8 +301,7 @@ def total_least_squares(x, y, func, silent=False, **kwargs): result = [] for i in range(n_parms): - result.append(derived_observable(lambda x, **kwargs: x[0], list(x.ravel()) + list(y), man_grad=list(deriv_x[i]) + list(deriv_y[i]))) - result[-1]._value = out.beta[i] + result.append(derived_observable(lambda my_var, **kwargs: my_var[0] / x.ravel()[0].value * out.beta[i], list(x.ravel()) + list(y), man_grad=list(deriv_x[i]) + list(deriv_y[i]))) output.fit_parameters = result + const_par @@ -419,8 +418,7 @@ def _prior_fit(x, y, func, priors, silent=False, **kwargs): result = [] for i in range(n_parms): - result.append(derived_observable(lambda x, **kwargs: x[0], list(y) + list(loc_priors), man_grad=list(deriv[i]))) - result[-1]._value = params[i] + result.append(derived_observable(lambda x, **kwargs: x[0] / y[0].value * params[i], list(y) + list(loc_priors), man_grad=list(deriv[i]))) output.fit_parameters = result output.chisquare = chisqfunc(np.asarray(params)) @@ -614,8 +612,7 @@ def _standard_fit(x, y, func, silent=False, **kwargs): result = [] for i in range(n_parms): - result.append(derived_observable(lambda x, **kwargs: x[0], list(y), man_grad=list(deriv[i]))) - result[-1]._value = fit_result.x[i] + result.append(derived_observable(lambda x, **kwargs: x[0] / y[0].value * fit_result.x[i], list(y), man_grad=list(deriv[i]))) output.fit_parameters = result + const_par diff --git a/pyerrors/roots.py b/pyerrors/roots.py index 99434a1c..1cb7b46f 100644 --- a/pyerrors/roots.py +++ b/pyerrors/roots.py @@ -33,6 +33,5 @@ def find_root(d, func, guess=1.0, **kwargs): da = jacobian(lambda u, v: func(v, u))(d.value, root[0]) deriv = - da / dx - res = derived_observable(lambda x, **kwargs: x[0], [d], man_grad=[deriv]) - res._value = root[0] + res = derived_observable(lambda x, **kwargs: x[0] / d.value * root[0], [d], man_grad=[deriv]) return res diff --git a/tests/fits_test.py b/tests/fits_test.py index 45e98e35..5d7f1de3 100644 --- a/tests/fits_test.py +++ b/tests/fits_test.py @@ -52,7 +52,7 @@ def test_least_squares(): outc = pe.least_squares(x, oyc, func) betac = outc.fit_parameters - + for i in range(2): betac[i].gamma_method(S=1.0) assert math.isclose(betac[i].value, popt[i], abs_tol=1e-5) @@ -97,7 +97,7 @@ def test_least_squares(): return p[1] * np.exp(-p[0] * x) fitp = pe.least_squares(x, data, fitf, expected_chisquare=True) - + fitpc = pe.least_squares(x, data, fitf, correlated_fit=True) for i in range(2): diff = fitp[i] - fitpc[i] @@ -170,7 +170,7 @@ def test_total_least_squares(): diffc = outc.fit_parameters[0] - betac[0] assert(diffc / betac[0] < 1e-3 * betac[0].dvalue) assert((outc.fit_parameters[1] - betac[1]).is_zero()) - + outc = pe.total_least_squares(oxc, oy, func) betac = outc.fit_parameters @@ -208,3 +208,41 @@ def test_odr_derivatives(): tfit = pe.fits.fit_general(x, y, func, base_step=0.1, step_ratio=1.1, num_steps=20) assert np.abs(np.max(np.array(list(fit1[1].deltas.values())) - np.array(list(tfit[1].deltas.values())))) < 10e-8 + + +def test_r_value_persistence(): + def f(a, x): + return a[0] + a[1] * x + + a = pe.pseudo_Obs(1.1, .1, 'a') + assert np.isclose(a.value, a.r_values['a']) + + a_2 = a ** 2 + assert np.isclose(a_2.value, a_2.r_values['a']) + + b = pe.pseudo_Obs(2.1, .2, 'b') + + y = [a, b] + [o.gamma_method() for o in y] + + fitp = pe.fits.least_squares([1, 2], y, f) + + assert np.isclose(fitp[0].value, fitp[0].r_values['a']) + assert np.isclose(fitp[0].value, fitp[0].r_values['b']) + assert np.isclose(fitp[1].value, fitp[1].r_values['a']) + assert np.isclose(fitp[1].value, fitp[1].r_values['b']) + + fitp = pe.fits.total_least_squares(y, y, f) + + assert np.isclose(fitp[0].value, fitp[0].r_values['a']) + assert np.isclose(fitp[0].value, fitp[0].r_values['b']) + assert np.isclose(fitp[1].value, fitp[1].r_values['a']) + assert np.isclose(fitp[1].value, fitp[1].r_values['b']) + + fitp = pe.fits.least_squares([1, 2], y, f, priors=y) + + assert np.isclose(fitp[0].value, fitp[0].r_values['a']) + assert np.isclose(fitp[0].value, fitp[0].r_values['b']) + assert np.isclose(fitp[1].value, fitp[1].r_values['a']) + assert np.isclose(fitp[1].value, fitp[1].r_values['b']) + diff --git a/tests/obs_test.py b/tests/obs_test.py index 2a66ce7c..ce9d7f41 100644 --- a/tests/obs_test.py +++ b/tests/obs_test.py @@ -381,6 +381,16 @@ def test_merge_obs(): assert diff == -(my_obs1.value + my_obs2.value) / 2 +def test_merge_obs_r_values(): + a1 = pe.pseudo_Obs(1.1, .1, 'a|1') + a2 = pe.pseudo_Obs(1.2, .1, 'a|2') + a = pe.merge_obs([a1, a2]) + + assert np.isclose(a.r_values['a|1'], a1.value) + assert np.isclose(a.r_values['a|2'], a2.value) + assert np.isclose(a.value, np.mean([a1.value, a2.value])) + + def test_correlate(): my_obs1 = pe.Obs([np.random.rand(100)], ['t']) my_obs2 = pe.Obs([np.random.rand(100)], ['t']) diff --git a/tests/roots_test.py b/tests/roots_test.py index 8a4720d4..dbb27bbe 100644 --- a/tests/roots_test.py +++ b/tests/roots_test.py @@ -15,6 +15,7 @@ def test_root_linear(): my_root = pe.roots.find_root(my_obs, root_function) assert np.isclose(my_root.value, value) + assert np.isclose(my_root.value, my_root.r_values['t']) difference = my_obs - my_root assert difference.is_zero()