Skip to content

Commit a07be2b

Browse files
authored
Merge 1.2.0 Development
Use rounding instead of format; Rounding using Decimals for better performance; Docstring; Trigonometric errors propagation; Remove numpy soft depend; Accept any Iterable for list type argument; Precision Tests; Interface Tests; Structure Tests; Typings, docstrings and refactor;
2 parents 1cf0339 + 558db88 commit a07be2b

File tree

7 files changed

+561
-214
lines changed

7 files changed

+561
-214
lines changed

labfis/__init__.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33
# Copyright © 2020 labfis.py
44
# (see LICENSE for details)
55

6-
__version__ = '1.1.7'
6+
__version__ = "1.2.0"
77

88
# Local imports
9-
from labfis.uncertainty import labfloat
10-
labfloat
9+
from labfis.uncertainty import labfloat, Infix
10+
11+
u = Infix(lambda x, y: labfloat(x, y))

labfis/test/__init__.py

Whitespace-only changes.

tests/test_labfloat.py renamed to labfis/test/accuracy_test.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,35 +4,33 @@
44
from math import sqrt
55
import labfis
66

7-
dx = 1e-10
7+
dx = 1e-8
88

99

1010
def labfloat_iterative(vardic, exp):
1111
resulterror = 0
1212

1313
for var in vardic.keys():
14-
exec(var + "=" + "{0:.16f}".format(vardic[var][0]))
14+
exec(var + "=" + "vardic[var][0]")
1515

1616
for var in vardic.keys():
1717
var_value = vardic[var][0]
1818
var_error = vardic[var][1]
1919

20-
exec(var + "=" + "{0:.16f}".format(var_value) +
21-
"+" + "{0:.16f}".format(dx))
20+
exec(var + "=" + "var_value" + "+" + "dx")
2221
dph = eval(exp)
2322

24-
exec(var + "=" + "{0:.16f}".format(var_value))
23+
exec(var + "=" + "var_value")
2524
dpn = eval(exp)
2625

27-
derivative = (dph - dpn)/dx
28-
resulterror += (derivative * var_error) ** 2
26+
derivative = (dph - dpn) / dx
27+
resulterror += (derivative ** 2) * (var_error ** 2)
2928
return sqrt(resulterror)
3029

3130

3231
def labfloat_calc(vardic, exp):
3332
for var in vardic.keys():
34-
exec(var + "=" +
35-
"labfis.labfloat({0:.16f},{1:.16f})".format(*vardic[var]))
33+
exec(var + "=" + "labfis.labfloat(vardic[var][0],vardic[var][1])")
3634
result = eval(exp)
3735
return result.uncertainty
3836

@@ -46,27 +44,29 @@ def labfloat_calc(vardic, exp):
4644
"b": (rng.random(), rng.random()),
4745
"c": (rng.random(), rng.random()),
4846
"d": (rng.random(), rng.random()),
49-
"e": (rng.random(), rng.random())
47+
"e": (rng.random(), rng.random()),
5048
}
5149

5250

5351
def test_labfloat_expressions():
5452
print(vals)
5553
var = list(vals.keys())
56-
opers = itertools.combinations_with_replacement(operations, len(var)-1)
54+
opers = itertools.combinations_with_replacement(operations, len(var) - 1)
5755
for exp in opers:
5856
expression = ""
5957
for i in range(len(exp)):
60-
if i == len(exp)-1:
61-
expression += var[i]+exp[i]+var[i+1]
58+
if i == len(exp) - 1:
59+
expression += var[i] + exp[i] + var[i + 1]
6260
else:
63-
expression += var[i]+exp[i]
61+
expression += var[i] + exp[i]
6462

6563
result1 = labfloat_iterative(vals, expression)
6664
result2 = labfloat_calc(vals, expression)
6765

66+
error = abs(result2 - result1) / result2
67+
6868
print(expression)
69-
print(result1, result2)
70-
print(round(result1), round(result2))
69+
print(type(result1), type(result2))
70+
print("numerical: {}".format(result1), "analitical: {}".format(result2))
7171

72-
assert round(result2) == round(result1)
72+
assert error < 1e-5

labfis/test/arithmetic_test.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from itertools import combinations
2+
from labfis import labfloat
3+
4+
5+
def test_zeros():
6+
zeros = [
7+
labfloat(),
8+
labfloat(0),
9+
labfloat(0.0),
10+
labfloat(0, 0),
11+
labfloat(0.0, 0.0),
12+
labfloat(0.0, 0),
13+
labfloat(0, 0.0),
14+
]
15+
16+
for z1, z2 in combinations(zeros, 2):
17+
print(z1, z2)
18+
assert list(z1) == list(z2)
19+
20+
21+
def test_indexing():
22+
assert labfloat(10, 2)[:] == (10, 2)
23+
24+
25+
def TestUnary():
26+
def test_pos():
27+
x = labfloat(100, 4)
28+
y = +x
29+
30+
assert list(x) == list(y)
31+
32+
def test_neg_mean():
33+
x = labfloat(243, 2)
34+
y = labfloat(-243, 2)
35+
y = -y
36+
37+
assert list(x) == list(y)
38+
39+
def test_neg_uncertainty():
40+
x = labfloat(243, 2)
41+
y = labfloat(243, -2)
42+
43+
assert list(x) == list(y)
44+
45+
46+
# TODO: test cases for other arithmetic operators

labfis/test/interface_test.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from random import uniform
2+
from labfis import u, labfloat
3+
4+
5+
def test_infix():
6+
for _ in range(200):
7+
x, e = uniform(-2e50, 2e50), uniform(-2e50, 2e50)
8+
assert labfloat(x, e) == x | u | e == x << u >> e
9+
10+
11+
def test_attrs():
12+
x = labfloat(10, 1)
13+
assert x.mean == 10 and x.uncertainty == 1

0 commit comments

Comments
 (0)