Module diskchef.tests.fitting.test_linear_fitting

Functions

def dirname()
Expand source code
@pytest.fixture(scope="session")
def dirname():
    """Returns a Path object with a path to unique temporary directory"""
    today = date.today().strftime("%d.%m.%Y")
    dirname = Path(tempfile.mkdtemp(prefix=f"diskchef_test_{today}_"))
    print("Test outputs are in: ", dirname)
    return dirname

Returns a Path object with a path to unique temporary directory

def example_lin()
Expand source code
def example_lin():
    x = np.linspace(1, 10, 100)
    y = linear([1, 2], x)

    a = Parameter(name="a", min=0.1, max=2, truth=1)
    b = Parameter(name="b", min=-2, max=5, truth=2)
    fitter = EMCEEFitter(lnprob=linear_model_lnprob, parameters=[a, b], threads=threads)
    bestfit = fitter.fit(x=x, y=y)
    fitter.corner()

    fitter = BruteForceFitter(lnprob=linear_model_lnprob, parameters=[a, b], threads=threads, n_points=100)
    bestfit = fitter.fit(x=x, y=y)
    fitter.corner()

    fitter = UltraNestFitter(lnprob=linear_model_lnprob, parameters=[a, b], threads=threads, transform=rescale_linear)
    bestfit = fitter.fit(x=x, y=y)
    fitter.corner()

    plt.show()
def example_sqr()
Expand source code
def example_sqr():
    x = np.linspace(1, 10, 100)
    y = sqr([1, 2, 0], x)

    a = Parameter(name="a", min=0.1, max=2, truth=1)
    b = Parameter(name="b", min=-2, max=5, truth=2)
    c = Parameter(name="c", min=-2, max=5, truth=0)
    params = [a, b, c]

    fitter = EMCEEFitter(lnprob=sqr_model_lnprob, parameters=params, threads=threads)
    bestfit = fitter.fit(x=x, y=y)
    fitter.corner()

    fitter = BruteForceFitter(lnprob=sqr_model_lnprob, parameters=params, threads=threads, n_points=40)
    bestfit = fitter.fit(x=x, y=y)
    fitter.corner()

    fitter = UltraNestFitter(lnprob=sqr_model_lnprob, parameters=params, threads=threads,
                             # transform=rescale_sqr
                             )
    bestfit = fitter.fit(x=x, y=y)
    fitter.corner()

    plt.show()
def linear(params: List[Parameter],
x: numpy.ndarray)
Expand source code
def linear(
        params: List[Parameter],
        x: np.ndarray
):
    return params[0] * x + params[1]
def linear_model_lnprob(params: List[Parameter],
x: numpy.ndarray,
y: numpy.ndarray,
weights: numpy.ndarray = None)
Expand source code
def linear_model_lnprob(
        params: List[Parameter],
        x: np.ndarray,
        y: np.ndarray,
        weights: np.ndarray = None
):
    y_from_x = linear(params, x)
    if weights is None:
        weights = np.ones_like(y)
    chi2 = np.sum(weights ** 2 * (y - y_from_x) ** 2)
    return -0.5 * chi2
def rescale_linear(cube)
Expand source code
def rescale_linear(cube):
    params = np.empty_like(cube)
    lo = 0.1
    hi = 10
    params[0] = 10 ** (cube[0] * (np.log10(hi) - np.log10(lo)) + np.log10(lo))
    lo = -2
    hi = 5
    params[1] = cube[1] * (hi - lo) + lo
    return params
def rescale_sqr(cube)
Expand source code
def rescale_sqr(cube):
    params = np.empty_like(cube)
    lo = 0.1
    hi = 10
    params[0] = 10 ** (cube[0] * (np.log10(hi) - np.log10(lo)) + np.log10(lo))
    lo = -2
    hi = 5
    params[1] = cube[1] * (hi - lo) + lo
    lo = -2
    hi = 5
    params[2] = cube[2] * (hi - lo) + lo
    return params
def sqr(params: List[Parameter],
x: numpy.ndarray)
Expand source code
def sqr(
        params: List[Parameter],
        x: np.ndarray
):
    return params[0] * x ** 2 + params[1] * x + params[2]
def sqr_model_lnprob(params: List[Parameter],
x: numpy.ndarray,
y: numpy.ndarray,
weights: numpy.ndarray = None)
Expand source code
def sqr_model_lnprob(
        params: List[Parameter],
        x: np.ndarray,
        y: np.ndarray,
        weights: np.ndarray = None
):
    y_from_x = sqr(params, x)
    if weights is None:
        weights = np.ones_like(y)
    chi2 = np.sum(weights ** 2 * (y - y_from_x) ** 2)
    return -0.5 * chi2
def test_linear_brute(threads, dirname)
Expand source code
@pytest.mark.parametrize(
    "threads",
    [
        1, 2, None
    ]
)
def test_linear_brute(threads, dirname):
    runname = f"brute_{threads}"
    x = np.linspace(1, 10, 100)
    y = linear([1, 2], x)
    assert linear_model_lnprob([1, 2], x, y) == 0
    a = Parameter(name="a", min=0.1, max=10)
    b = Parameter(name="b", min=-2, max=5)
    fitter = BruteForceFitter(lnprob=linear_model_lnprob, parameters=[a, b], n_points=100, threads=threads)
    bestfit = fitter.fit(x=x, y=y)
    assert [bestfit["a"], bestfit["b"]] == [1, 2]

    fitter.save(dirname / f"{runname}.sav")
    loaded_fitter = BruteForceFitter.load(dirname / f"{runname}.sav")

    assert [loaded_fitter.parameters_dict["a"], loaded_fitter.parameters_dict["b"]] == [1, 2]

    fig = loaded_fitter.corner()
    fig.savefig(dirname / f"{runname}.pdf")
def test_linear_emcee(threads, dirname)
Expand source code
@pytest.mark.parametrize(
    "threads",
    [
        1, 2, None
    ]
)
def test_linear_emcee(threads, dirname):
    runname = f"emcee_{threads}"
    x = np.linspace(1, 10, 100)
    y = linear([1, 2], x)
    assert linear_model_lnprob([1, 2], x, y) == 0
    a = Parameter(name="a", min=0.1, max=10)
    b = Parameter(name="b", min=-2, max=5)
    fitter = EMCEEFitter(
        lnprob=linear_model_lnprob, parameters=[a, b],
        threads=threads
    )
    bestfit = fitter.fit(x=x, y=y)
    assert [bestfit["a"], bestfit["b"]] == [1, 2]

    fitter.save(dirname / f"{runname}.sav")
    loaded_fitter = EMCEEFitter.load(dirname / f"{runname}.sav")

    assert [loaded_fitter.parameters_dict["a"], loaded_fitter.parameters_dict["b"]] == [1, 2]

    fig = loaded_fitter.corner()
    fig.savefig(dirname / f"{runname}.pdf")
def test_linear_ultranest(threads, dirname)
Expand source code
@pytest.mark.parametrize(
    "threads",
    [
        1,
    ]
)
def test_linear_ultranest(threads, dirname):
    runname = dirname / f"ultranest_{threads}"
    x = np.linspace(1, 10, 100)
    y = linear([1, 2], x)
    assert linear_model_lnprob([1, 2], x, y) == 0
    a = Parameter(name="T_{atm}", min=0.1, max=10, truth=1)
    b = Parameter(name="log_{10}(M/M_\odot)", min=-2, max=5, truth=2)
    fitter = UltraNestFitter(
        lnprob=linear_model_lnprob, parameters=[a, b],
        transform=rescale_linear,
        threads=threads,
        log_dir=runname,
        resume="overwrite"
    )
    bestfit = fitter.fit(x=x, y=y)
    fig = fitter.corner()
    fig.savefig(runname/"corner.pdf")
    print(a.math_repr, b.math_repr)
    assert [bestfit["T_{atm}"], bestfit["log_{10}(M/M_\odot)"]] == [1, 2]

    fitter.save(str(runname) + ".sav")
    loaded_fitter = EMCEEFitter.load(str(runname) + ".sav")

    assert [
               loaded_fitter.parameters_dict["T_{atm}"], loaded_fitter.parameters_dict["log_{10}(M/M_\odot)"]
           ] == [1, 2]

    fig = loaded_fitter.corner()
    fig.savefig(str(runname) + ".pdf")