Skip to content

Commit fd87d92

Browse files
committed
Add unit tests to increase code coverage
1 parent 8d62775 commit fd87d92

File tree

2 files changed

+79
-23
lines changed

2 files changed

+79
-23
lines changed

control/modelsimp.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,7 @@ def markov(*args, m=None, transpose=False, dt=None, truncate=False):
527527
t = 0
528528
if truncate:
529529
t = m
530+
print(f"{t = }")
530531

531532
q = Ymat.shape[0] # number of outputs
532533
p = Umat.shape[0] # number of inputs
@@ -579,6 +580,8 @@ def markov(*args, m=None, transpose=False, dt=None, truncate=False):
579580
# Truncate first t=0 or t=m time steps, transpose the problem for lsq
580581
YY = Ymat[:,t:].T
581582
UU = UUT[:,t:].T
583+
print(f"{YY = }")
584+
print(f"{UU = }")
582585

583586
# Solve for the Markov parameters from YY = UU @ H.T
584587
HT, _, _, _ = np.linalg.lstsq(UU, YY, rcond=None)

control/tests/modelsimp_test.py

Lines changed: 76 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99

1010
from control import StateSpace, forced_response, impulse_response, tf, rss, c2d, TimeResponseData
11+
from control.exception import ControlArgument, ControlDimension
1112
from control.tests.conftest import slycotonly
1213
from control.modelsimp import balred, hsvd, markov, modred
1314

@@ -32,7 +33,7 @@ def testHSVD(self):
3233
assert not isinstance(hsv, np.matrix)
3334

3435
def testMarkovSignature(self):
35-
U = np.array([[1., 1., 1., 1., 1.]])
36+
U = np.array([[1., 1., 1., 1., 1., 1., 1.]])
3637
Y = U
3738
response = TimeResponseData(time=np.arange(U.shape[-1]),
3839
outputs=Y,
@@ -41,27 +42,40 @@ def testMarkovSignature(self):
4142
input_labels='u',
4243
)
4344

44-
# Basic usage
45+
# setup
4546
m = 3
4647
Htrue = np.array([1., 0., 0.])
48+
Htrue_l = np.array([1., 0., 0., 0., 0., 0., 0.])
4749

48-
H = markov(Y, U, m=m, transpose=False)
49-
np.testing.assert_array_almost_equal(H, Htrue)
50+
# test not enough input arguments
51+
with pytest.raises(ControlArgument):
52+
H = markov(Y)
53+
with pytest.raises(ControlArgument):
54+
H = markov()
5055

51-
response.transpose=False
52-
H = markov(response, m=m)
53-
np.testing.assert_array_almost_equal(H, Htrue)
56+
# to many positional arguments
57+
with pytest.raises(ControlArgument):
58+
H = markov(Y,U,m,1)
59+
with pytest.raises(ControlArgument):
60+
H = markov(response,m,1)
5461

55-
# Make sure that transposed data also works
56-
H = markov(Y.T, U.T, m, transpose=True)
57-
np.testing.assert_array_almost_equal(H, np.transpose(Htrue))
62+
# to many positional arguments
63+
with pytest.raises(ControlDimension):
64+
U2 = np.hstack([U,U])
65+
H = markov(Y,U2,m)
5866

59-
response.transpose=True
60-
H = markov(response, m)
61-
np.testing.assert_array_almost_equal(H, np.transpose(Htrue))
62-
response.transpose=False
67+
# not enough data
68+
with pytest.warns(Warning):
69+
H = markov(Y,U,8)
70+
71+
# Basic Usage, m=l
72+
H = markov(Y, U)
73+
np.testing.assert_array_almost_equal(H, Htrue_l)
6374

64-
# Generate Markov parameters without any arguments
75+
H = markov(response)
76+
np.testing.assert_array_almost_equal(H, Htrue_l)
77+
78+
# Basic Usage, m
6579
H = markov(Y, U, m)
6680
np.testing.assert_array_almost_equal(H, Htrue)
6781

@@ -74,6 +88,20 @@ def testMarkovSignature(self):
7488
H = markov(response, m=m)
7589
np.testing.assert_array_almost_equal(H, Htrue)
7690

91+
response.transpose=False
92+
H = markov(response, m=m)
93+
np.testing.assert_array_almost_equal(H, Htrue)
94+
95+
# Make sure that transposed data also works, siso
96+
HT = markov(Y.T, U.T, m, transpose=True)
97+
np.testing.assert_array_almost_equal(HT, np.transpose(Htrue))
98+
99+
response.transpose = True
100+
HT = markov(response, m)
101+
np.testing.assert_array_almost_equal(HT, np.transpose(Htrue))
102+
response.transpose=False
103+
104+
77105
# Test example from docstring
78106
# TODO: There is a problem here, last markov parameter does not fit
79107
# the approximation error could be to big
@@ -114,16 +142,41 @@ def testMarkovSignature(self):
114142
dt = 0.25
115143
sysd = sys.sample(dt, method='zoh')
116144

117-
t = np.arange(0,100,dt)
118-
u = np.random.randn(sysd.B.shape[-1], len(t))
119-
response = forced_response(sysd, U=u)
145+
T = np.arange(0,100,dt)
146+
U = np.random.randn(sysd.B.shape[-1], len(T))
147+
response = forced_response(sysd, U=U)
148+
Y = response.outputs
120149

121150
m = 100
122-
H = markov(response, m, dt=dt)
123151
_, Htrue = impulse_response(sysd, T=dt*(m-1))
124152

153+
154+
# test array_like
155+
H = markov(Y, U, m, dt=dt)
125156
np.testing.assert_array_almost_equal(H, Htrue)
126157

158+
# test array_like, truncate
159+
H = markov(Y, U, m, dt=dt, truncate=True)
160+
np.testing.assert_array_almost_equal(H, Htrue)
161+
162+
# test array_like, transpose
163+
HT = markov(Y.T, U.T, m, dt=dt, transpose=True)
164+
np.testing.assert_array_almost_equal(HT, np.transpose(Htrue))
165+
166+
# test response data
167+
H = markov(response, m, dt=dt)
168+
np.testing.assert_array_almost_equal(H, Htrue)
169+
170+
# test response data
171+
H = markov(response, m, dt=dt, truncate=True)
172+
np.testing.assert_array_almost_equal(H, Htrue)
173+
174+
# test response data, transpose
175+
response.transpose = True
176+
HT = markov(response, m, dt=dt)
177+
np.testing.assert_array_almost_equal(HT, np.transpose(Htrue))
178+
179+
127180
# Make sure markov() returns the right answer
128181
@pytest.mark.parametrize("k, m, n",
129182
[(2, 2, 2),
@@ -168,14 +221,14 @@ def testMarkovResults(self, k, m, n):
168221
ir_true = impulse_response(Hd,T)
169222
Mtrue_scaled = ir_true[1][:m]
170223

171-
T, Y = forced_response(Hd, T, U, squeeze=True)
172-
Mcomp = markov(Y, U, m, dt=True)
173-
Mcomp_scaled = markov(Y, U, m, dt=Ts)
174-
175224
# Compare to results from markov()
176225
# experimentally determined probability to get non matching results
177226
# with rtot=1e-6 and atol=1e-8 due to numerical errors
178227
# for k=5, m=n=10: 0.015 %
228+
T, Y = forced_response(Hd, T, U, squeeze=True)
229+
Mcomp = markov(Y, U, m, dt=True)
230+
Mcomp_scaled = markov(Y, U, m, dt=Ts)
231+
179232
np.testing.assert_allclose(Mtrue, Mcomp, rtol=1e-6, atol=1e-8)
180233
np.testing.assert_allclose(Mtrue_scaled, Mcomp_scaled, rtol=1e-6, atol=1e-8)
181234

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy