import numpy as np
import pytest
from ewoksxas.fit.lca_fit import LCAModel
# The shared XYData container and as_1d_array helper (formerly duplicated here)
# are now covered by tests/test_data.py; this module tests LCAModel/FitResult.
[docs]
def test_lca_fit_unbounded(sample, components):
lca = LCAModel.from_dicts(sample, components)
# Bounds
assert lca.xmin == 0
assert lca.xmax == np.pi
assert lca.roi.x.min() == lca.xmin
assert lca.roi.x.max() == lca.xmax
assert lca.sample.x.size == lca.sample.y.size == 100
assert lca.roi.x.size == lca.roi.y.size == 100
# Components
assert len(lca.components) == 5
matrix, _ = lca._build_component_matrix()
assert matrix.shape == (5, 100)
# Fit
fit = lca.fit()
expected_solution = [0.1, 0.2, 0.3, 0.35, 0.05]
assert np.allclose(expected_solution, fit.solution, atol=1e-6)
assert np.allclose(fit.rmse, 0.0, atol=1e-6)
assert np.allclose(fit.r2, 1.0, atol=1e-6)
assert np.allclose(lca.roi.y, fit.model.y, atol=1e-6)
[docs]
def test_lca_fit_bounded(sample, components):
parameters = {"xmin": 1, "xmax": 2}
lca = LCAModel.from_dicts(sample, components, parameters)
# Bounds
assert lca.xmin == 1
assert lca.xmax == 2
assert np.allclose([lca.roi.x.min(), lca.roi.x.max()], [1, 2], atol=0.1)
assert lca.sample.x.size == lca.sample.y.size == 100
assert lca.roi.x.size == lca.roi.y.size == 32
# Components
assert len(lca.components) == 5
matrix, _ = lca._build_component_matrix()
assert matrix.shape == (5, 32)
# Fit
fit = lca.fit()
expected_solution = [0.1, 0.2, 0.3, 0.35, 0.05]
assert np.allclose(expected_solution, fit.solution, atol=1e-3)
assert np.allclose(fit.rmse, 0.0, atol=1e-6)
assert np.allclose(fit.r2, 1.0, atol=1e-6)
assert np.allclose(lca.roi.y, fit.model.y, atol=1e-6)
[docs]
@pytest.mark.filterwarnings("ignore::RuntimeWarning")
def test_lca_fit_excess_components(sample, excess_components, rand_components):
lca = LCAModel.from_dicts(sample, excess_components)
fit = lca.fit()
expected_solution = [0.1, 0.2, 0.3, 0.35, 0.05] + [0.0] * 9
assert np.allclose(expected_solution, fit.solution, atol=1e-2)
assert np.allclose(fit.rmse, 0.0, atol=1e-3)
assert np.allclose(fit.r2, 1.0, atol=1e-3)
assert np.allclose(lca.roi.y, fit.model.y, atol=1e-3)
# randomize component list
lca = LCAModel.from_dicts(sample, rand_components)
fit = lca.fit()
expected_solution = [
0.35,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.3,
0.0,
0.05,
0.0,
0.1,
0.2,
]
assert np.allclose(expected_solution, fit.solution, atol=1e-2)
assert np.allclose(fit.rmse, 0.0, atol=1e-3)
assert np.allclose(fit.r2, 1.0, atol=1e-3)
assert np.allclose(lca.roi.y, fit.model.y, atol=1e-3)