Skip to content

Commit 131d665

Browse files
committed
Update: tests
1 parent 3a84b54 commit 131d665

6 files changed

Lines changed: 197 additions & 45 deletions

File tree

test/fit/eiv/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Copyright (c) Brockmann Consult GmbH, 2026.
2+
# License: MIT

test/fit/eiv/test_eiv_jax.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# Copyright (c) Brockmann Consult GmbH, 2026.
2+
# License: MIT
3+
4+
import unittest
5+
6+
import numpy as np
7+
8+
from uncertaintyx.fit.eiv.jax import EIV
9+
from uncertaintyx.m.jax import Linear
10+
from uncertaintyx.plot.plots import MatrixPlot
11+
from uncertaintyx.plot.plots import RegressionPlot
12+
13+
14+
class ErrorsInVariablesTest(unittest.TestCase):
15+
"""
16+
Tests EIV regression.
17+
"""
18+
19+
def test_linear_model(self):
20+
"""
21+
Tests EIV regression by fitting a linear model to generated
22+
test data with known uncertainties of x and y.
23+
"""
24+
n = 100
25+
x = np.linspace(0.0, 100.0, n).reshape((n, 1))
26+
u = 1.0 + np.sqrt(x)
27+
28+
rng = np.random.default_rng(42)
29+
y = x + rng.normal(0.0, u, (n, 1))
30+
x = x + rng.normal(0.0, u, (n, 1))
31+
32+
result = EIV().fit(Linear(), x, y, ux=u, uy=u)
33+
34+
self.assertEqual(0, result.info)
35+
self.assertAlmostEqual(1.0, result.popt[0], delta=0.05)
36+
self.assertAlmostEqual(0.0, result.popt[1], delta=1.00)
37+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
38+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.00)
39+
self.assertAlmostEqual(0.0, result.pcov[0, 0], delta=0.001)
40+
self.assertAlmostEqual(0.0, result.pcov[0, 1], delta=0.015)
41+
self.assertAlmostEqual(0.0, result.pcov[1, 0], delta=0.015)
42+
self.assertAlmostEqual(0.0, result.pcov[1, 1], delta=1.000)
43+
44+
result = EIV().fit(Linear(), x, y, ux=u, uy=u, covar=True)
45+
46+
self.assertEqual(0, result.info)
47+
self.assertAlmostEqual(1.0, result.popt[0], delta=0.05)
48+
self.assertAlmostEqual(0.0, result.popt[1], delta=1.00)
49+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
50+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.00)
51+
self.assertAlmostEqual(0.0, result.pcov[0, 0], delta=0.001)
52+
self.assertAlmostEqual(0.0, result.pcov[0, 1], delta=0.015)
53+
self.assertAlmostEqual(0.0, result.pcov[1, 0], delta=0.015)
54+
self.assertAlmostEqual(0.0, result.pcov[1, 1], delta=1.000)
55+
56+
RegressionPlot(result).plot(
57+
x,
58+
y,
59+
xlabel=r"$x$",
60+
ylabel=r"$y$",
61+
xrange=(-10.0, 110.0),
62+
yrange=(-10.0, 110.0),
63+
savefig="eiv.png",
64+
title="Errors-in-variables regression",
65+
)
66+
MatrixPlot().plot(
67+
result.ycov_p(np.linspace(0.5, 99.5, n)),
68+
xlabel=r"$x$",
69+
ylabel=r"$x$",
70+
xrange=(0.5, 99.5),
71+
yrange=(0.5, 99.5),
72+
cbar_max=4.0,
73+
cbar_min=-1.0,
74+
cbar_label=r"variance-covariance $U_p(y)$",
75+
savefig="eiv-ycov.png",
76+
title="Errors-in-variables regression",
77+
)
78+
79+
80+
if __name__ == "__main__":
81+
unittest.main()

test/fit/eiv/test_eiv_numpy.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# Copyright (c) Brockmann Consult GmbH, 2026.
2+
# License: MIT
3+
4+
import unittest
5+
6+
import numpy as np
7+
8+
from uncertaintyx.fit.eiv.numpy import EIV
9+
from uncertaintyx.m.jax import Linear
10+
from uncertaintyx.plot.plots import MatrixPlot
11+
from uncertaintyx.plot.plots import RegressionPlot
12+
13+
14+
class ErrorsInVariablesTest(unittest.TestCase):
15+
"""
16+
Tests EIV regression.
17+
"""
18+
19+
def test_linear_model(self):
20+
"""
21+
Tests EIV regression by fitting a linear model to generated
22+
test data with known uncertainties of x and y.
23+
"""
24+
n = 100
25+
x = np.linspace(0.0, 100.0, n).reshape((n, 1))
26+
u = 1.0 + np.sqrt(x)
27+
28+
rng = np.random.default_rng(42)
29+
y = x + rng.normal(0.0, u, (n, 1))
30+
x = x + rng.normal(0.0, u, (n, 1))
31+
32+
result = EIV().fit(Linear(), x, y, ux=u, uy=u)
33+
34+
self.assertEqual(0, result.info)
35+
self.assertAlmostEqual(1.0, result.popt[0], delta=0.05)
36+
self.assertAlmostEqual(0.0, result.popt[1], delta=1.00)
37+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
38+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.00)
39+
self.assertAlmostEqual(0.0, result.pcov[0, 0], delta=0.001)
40+
self.assertAlmostEqual(0.0, result.pcov[0, 1], delta=0.015)
41+
self.assertAlmostEqual(0.0, result.pcov[1, 0], delta=0.015)
42+
self.assertAlmostEqual(0.0, result.pcov[1, 1], delta=1.000)
43+
44+
RegressionPlot(result).plot(
45+
x,
46+
y,
47+
xlabel=r"$x$",
48+
ylabel=r"$y$",
49+
xrange=(-10.0, 110.0),
50+
yrange=(-10.0, 110.0),
51+
savefig="eiv.png",
52+
title="Errors-in-variables regression",
53+
)
54+
MatrixPlot().plot(
55+
result.ycov_p(np.linspace(0.5, 99.5, n)),
56+
xlabel=r"$x$",
57+
ylabel=r"$x$",
58+
xrange=(0.5, 99.5),
59+
yrange=(0.5, 99.5),
60+
cbar_max=4.0,
61+
cbar_min=-1.0,
62+
cbar_label=r"variance-covariance $U_p(y)$",
63+
savefig="eiv-ycov.png",
64+
title="Errors-in-variables regression",
65+
)
66+
67+
68+
if __name__ == "__main__":
69+
unittest.main()

test/fit/test_regression_jax.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ def test_linear_model_homoscedastic(self):
3838
result = Bootstrap(HomoscedasticRegression(EIV())).fit(Linear(), x, y)
3939

4040
self.assertEqual(0, result.info)
41-
self.assertAlmostEqual(1.0, result.popt[0], delta=0.1)
42-
self.assertAlmostEqual(0.0, result.popt[1], delta=5.0)
43-
self.assertAlmostEqual(0.0, result.punc[0], delta=0.1)
44-
self.assertAlmostEqual(0.0, result.punc[1], delta=5.0)
41+
self.assertAlmostEqual(1.0, result.popt[0], delta=0.10)
42+
self.assertAlmostEqual(0.0, result.popt[1], delta=5.00)
43+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
44+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.50)
4545

4646
print()
4747
print("popt = ", result.popt)
@@ -92,10 +92,10 @@ def test_linear_model_homo_heteroscedastic(self):
9292
)
9393

9494
self.assertEqual(0, result.info)
95-
self.assertAlmostEqual(1.0, result.popt[0], delta=0.1)
96-
self.assertAlmostEqual(0.0, result.popt[1], delta=5.0)
97-
self.assertAlmostEqual(0.0, result.punc[0], delta=0.1)
98-
self.assertAlmostEqual(0.0, result.punc[1], delta=5.0)
95+
self.assertAlmostEqual(1.0, result.popt[0], delta=0.10)
96+
self.assertAlmostEqual(0.0, result.popt[1], delta=2.00)
97+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
98+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.00)
9999

100100
print()
101101
print("popt = ", result.popt)
@@ -146,10 +146,10 @@ def test_linear_model_hetero_homoscedastic(self):
146146
)
147147

148148
self.assertEqual(0, result.info)
149-
self.assertAlmostEqual(1.0, result.popt[0], delta=0.1)
150-
self.assertAlmostEqual(0.0, result.popt[1], delta=5.0)
151-
self.assertAlmostEqual(0.0, result.punc[0], delta=0.1)
152-
self.assertAlmostEqual(0.0, result.punc[1], delta=5.0)
149+
self.assertAlmostEqual(1.0, result.popt[0], delta=0.05)
150+
self.assertAlmostEqual(0.0, result.popt[1], delta=1.50)
151+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
152+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.00)
153153

154154
print()
155155
print("popt = ", result.popt)
@@ -200,9 +200,9 @@ def test_linear_model_heteroscedastic(self):
200200

201201
self.assertEqual(0, result.info)
202202
self.assertAlmostEqual(1.0, result.popt[0], delta=0.05)
203-
self.assertAlmostEqual(0.0, result.popt[1], delta=2.00)
204-
self.assertAlmostEqual(0.0, result.punc[0], delta=0.20)
205-
self.assertAlmostEqual(0.0, result.punc[1], delta=2.00)
203+
self.assertAlmostEqual(0.0, result.popt[1], delta=1.50)
204+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
205+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.00)
206206

207207
print()
208208
print("popt = ", result.popt)

test/fit/test_regression_numpy.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ def test_linear_model_homoscedastic(self):
3838
result = Bootstrap(HomoscedasticRegression(EIV())).fit(Linear(), x, y)
3939

4040
self.assertEqual(0, result.info)
41-
self.assertAlmostEqual(1.0, result.popt[0], delta=0.1)
42-
self.assertAlmostEqual(0.0, result.popt[1], delta=5.0)
43-
self.assertAlmostEqual(0.0, result.punc[0], delta=0.1)
44-
self.assertAlmostEqual(0.0, result.punc[1], delta=5.0)
41+
self.assertAlmostEqual(1.0, result.popt[0], delta=0.10)
42+
self.assertAlmostEqual(0.0, result.popt[1], delta=5.00)
43+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
44+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.50)
4545

4646
print()
4747
print("popt = ", result.popt)
@@ -92,10 +92,10 @@ def test_linear_model_homo_heteroscedastic(self):
9292
)
9393

9494
self.assertEqual(0, result.info)
95-
self.assertAlmostEqual(1.0, result.popt[0], delta=0.1)
96-
self.assertAlmostEqual(0.0, result.popt[1], delta=5.0)
97-
self.assertAlmostEqual(0.0, result.punc[0], delta=0.1)
98-
self.assertAlmostEqual(0.0, result.punc[1], delta=5.0)
95+
self.assertAlmostEqual(1.0, result.popt[0], delta=0.10)
96+
self.assertAlmostEqual(0.0, result.popt[1], delta=2.00)
97+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
98+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.00)
9999

100100
print()
101101
print("popt = ", result.popt)
@@ -146,10 +146,10 @@ def test_linear_model_hetero_homoscedastic(self):
146146
)
147147

148148
self.assertEqual(0, result.info)
149-
self.assertAlmostEqual(1.0, result.popt[0], delta=0.1)
150-
self.assertAlmostEqual(0.0, result.popt[1], delta=5.0)
151-
self.assertAlmostEqual(0.0, result.punc[0], delta=0.1)
152-
self.assertAlmostEqual(0.0, result.punc[1], delta=5.0)
149+
self.assertAlmostEqual(1.0, result.popt[0], delta=0.05)
150+
self.assertAlmostEqual(0.0, result.popt[1], delta=1.50)
151+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
152+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.00)
153153

154154
print()
155155
print("popt = ", result.popt)
@@ -200,9 +200,9 @@ def test_linear_model_heteroscedastic(self):
200200

201201
self.assertEqual(0, result.info)
202202
self.assertAlmostEqual(1.0, result.popt[0], delta=0.05)
203-
self.assertAlmostEqual(0.0, result.popt[1], delta=2.00)
204-
self.assertAlmostEqual(0.0, result.punc[0], delta=0.20)
205-
self.assertAlmostEqual(0.0, result.punc[1], delta=2.00)
203+
self.assertAlmostEqual(0.0, result.popt[1], delta=1.50)
204+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
205+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.00)
206206

207207
print()
208208
print("popt = ", result.popt)

test/fit/test_regression_torch.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@ def test_linear_model_homoscedastic(self):
3838
result = Bootstrap(HomoscedasticRegression(EIV())).fit(Linear(), x, y)
3939

4040
self.assertEqual(0, result.info)
41-
self.assertAlmostEqual(1.0, result.popt[0], delta=0.1)
42-
self.assertAlmostEqual(0.0, result.popt[1], delta=5.0)
43-
self.assertAlmostEqual(0.0, result.punc[0], delta=0.1)
44-
self.assertAlmostEqual(0.0, result.punc[1], delta=5.0)
41+
self.assertAlmostEqual(1.0, result.popt[0], delta=0.10)
42+
self.assertAlmostEqual(0.0, result.popt[1], delta=5.00)
43+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
44+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.50)
4545

4646
print()
4747
print("popt = ", result.popt)
@@ -92,10 +92,10 @@ def test_linear_model_homo_heteroscedastic(self):
9292
)
9393

9494
self.assertEqual(0, result.info)
95-
self.assertAlmostEqual(1.0, result.popt[0], delta=0.1)
96-
self.assertAlmostEqual(0.0, result.popt[1], delta=5.0)
97-
self.assertAlmostEqual(0.0, result.punc[0], delta=0.1)
98-
self.assertAlmostEqual(0.0, result.punc[1], delta=5.0)
95+
self.assertAlmostEqual(1.0, result.popt[0], delta=0.10)
96+
self.assertAlmostEqual(0.0, result.popt[1], delta=2.00)
97+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
98+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.00)
9999

100100
print()
101101
print("popt = ", result.popt)
@@ -146,10 +146,10 @@ def test_linear_model_hetero_homoscedastic(self):
146146
)
147147

148148
self.assertEqual(0, result.info)
149-
self.assertAlmostEqual(1.0, result.popt[0], delta=0.1)
150-
self.assertAlmostEqual(0.0, result.popt[1], delta=5.0)
151-
self.assertAlmostEqual(0.0, result.punc[0], delta=0.1)
152-
self.assertAlmostEqual(0.0, result.punc[1], delta=5.0)
149+
self.assertAlmostEqual(1.0, result.popt[0], delta=0.05)
150+
self.assertAlmostEqual(0.0, result.popt[1], delta=1.50)
151+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
152+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.00)
153153

154154
print()
155155
print("popt = ", result.popt)
@@ -200,9 +200,9 @@ def test_linear_model_heteroscedastic(self):
200200

201201
self.assertEqual(0, result.info)
202202
self.assertAlmostEqual(1.0, result.popt[0], delta=0.05)
203-
self.assertAlmostEqual(0.0, result.popt[1], delta=2.00)
204-
self.assertAlmostEqual(0.0, result.punc[0], delta=0.20)
205-
self.assertAlmostEqual(0.0, result.punc[1], delta=2.00)
203+
self.assertAlmostEqual(0.0, result.popt[1], delta=1.50)
204+
self.assertAlmostEqual(0.0, result.punc[0], delta=0.05)
205+
self.assertAlmostEqual(0.0, result.punc[1], delta=1.00)
206206

207207
print()
208208
print("popt = ", result.popt)

0 commit comments

Comments
 (0)