-
Notifications
You must be signed in to change notification settings - Fork 27
/
test_residuals.py
129 lines (94 loc) · 4.2 KB
/
test_residuals.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
"""Tests for residuals
"""
__authors__ = "D. Knowles"
__date__ = "22 Jun 2022"
import os
import pytest
import numpy as np
from gnss_lib_py.algorithms.snapshot import solve_wls
from gnss_lib_py.parsers.google_decimeter import AndroidDerived2021
from gnss_lib_py.navdata.navdata import NavData
from gnss_lib_py.algorithms.residuals import solve_residuals
def test_residuals_inplace(derived_2021):
"""Test that solving for residuals doesn't fail
Parameters
----------
derived_2021 : AndroidDerived2021
Instance of AndroidDerived2021 for testing.
"""
derived_original = derived_2021.copy()
state_estimate = solve_wls(derived_2021)
solve_residuals(derived_2021, state_estimate)
# result should still be a NavData Class instance
assert isinstance(derived_2021,type(NavData()))
# derived should have one more row but same number of cols
assert len(derived_2021.rows) == len(derived_original.rows) + 1
assert len(derived_2021) == len(derived_original)
# derived should include new residuals rows but not its copy
assert "residuals_m" in derived_2021.rows
assert "residuals_m" not in derived_original.rows
assert not np.any(np.isinf(derived_2021["residuals_m"]))
# max is 47.814594604074955
assert max(derived_2021["residuals_m"]) < 50.
def test_residuals(derived_2021):
"""Test that solving for residuals doesn't fail
Parameters
----------
derived_2021 : AndroidDerived2021
Instance of AndroidDerived2021 for testing.
"""
state_estimate = solve_wls(derived_2021)
residuals = solve_residuals(derived_2021, state_estimate, inplace=False)
# result should still be a NavData Class instance
assert isinstance(residuals,type(NavData()))
# derived should have one more row but same number of cols
for row in ["residuals_m","gps_millis","gnss_id","sv_id","signal_type"]:
assert row in residuals.rows
assert len(residuals) == len(derived_2021)
# derived should not include new residuals row
assert "residuals_m" not in derived_2021.rows
assert not np.any(np.isinf(residuals["residuals_m"]))
# max is 47.814594604074955
assert max(residuals["residuals_m"]) < 50.
def test_residuals_fails(derived_2021):
"""Test that solving for residuals fails when it should
Parameters
----------
derived_2021 : AndroidDerived2021
Instance of AndroidDerived2021 for testing.
"""
state_estimate = solve_wls(derived_2021)
for inplace in [True,False]:
for row in ["gps_millis","corr_pr_m"]:
derived_removed = derived_2021.remove(rows=row)
with pytest.raises(KeyError) as excinfo:
_ = solve_residuals(derived_removed, state_estimate,
inplace=inplace)
assert row in str(excinfo.value)
for row in ["gps_millis"]:
state_estimate_removed = state_estimate.remove(rows=row)
with pytest.raises(KeyError) as excinfo:
_ = solve_residuals(derived_2021,
state_estimate_removed,
inplace=inplace)
assert row in str(excinfo.value)
for row in ["x_rx_wls_m", "y_rx_wls_m", "z_rx_wls_m", "b_rx_wls_m"]:
duplicated = state_estimate.copy()
new_name = row.split("_")
new_name[2] = "gt"
new_name = "_".join(new_name)
error_name = row[:4] + '*' + row[-2:]
duplicated[new_name] = duplicated[row]
with pytest.raises(KeyError) as excinfo:
_ = solve_residuals(derived_2021,
duplicated,
inplace=inplace)
assert error_name in str(excinfo.value)
for row in ["x_rx_wls_m", "y_rx_wls_m", "z_rx_wls_m", "b_rx_wls_m"]:
state_estimate_removed = state_estimate.remove(rows=row)
error_name = row[:4] + '*' + row[-2:]
with pytest.raises(KeyError) as excinfo:
_ = solve_residuals(derived_2021,
state_estimate_removed,
inplace=inplace)
assert error_name in str(excinfo.value)