Skip to content

Commit 0acad54

Browse files
committed
Fixed #316 Add Maximum Window Size
1 parent 150d8e2 commit 0acad54

File tree

13 files changed

+40
-14
lines changed

13 files changed

+40
-14
lines changed

stumpy/aamp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ def aamp(T_A, m, T_B=None, ignore_trivial=True):
280280
if T_B.ndim != 1: # pragma: no cover
281281
raise ValueError(f"T_B is {T_B.ndim}-dimensional and must be 1-dimensional. ")
282282

283-
core.check_window_size(m)
283+
core.check_window_size(m, max_size=min(T_A.shape[0], T_B.shape[0]))
284284

285285
if ignore_trivial is False and core.are_arrays_equal(T_A, T_B): # pragma: no cover
286286
logger.warning("Arrays T_A, T_B are equal, which implies a self-join.")

stumpy/aamped.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def aamped(dask_client, T_A, m, T_B=None, ignore_trivial=True):
7171
if T_B.ndim != 1: # pragma: no cover
7272
raise ValueError(f"T_B is {T_B.ndim}-dimensional and must be 1-dimensional. ")
7373

74-
core.check_window_size(m)
74+
core.check_window_size(m, max_size=min(T_A.shape[0], T_B.shape[0]))
7575

7676
if ignore_trivial is False and core.are_arrays_equal(T_A, T_B): # pragma: no cover
7777
logger.warning("Arrays T_A, T_B are equal, which implies a self-join.")

stumpy/core.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,15 +247,20 @@ def are_distances_too_small(a, threshold=10e-6): # pragma: no cover
247247
return False
248248

249249

250-
def check_window_size(m):
250+
def check_window_size(m, max_size=None):
251251
"""
252-
Check the window size and ensure that it is greater than or equal to 3
252+
Check the window size and ensure that it is greater than or equal to 3 and, if
253+
`max_size` is provided, ensure that the window size is less than or equal to the
254+
`max_size`
253255
254256
Parameters
255257
----------
256258
m : int
257259
Window size
258260
261+
max_size : int, default None
262+
The maximum window size allowed
263+
259264
Returns
260265
-------
261266
None
@@ -274,6 +279,9 @@ def check_window_size(m):
274279
""",
275280
)
276281

282+
if max_size is not None and m > max_size:
283+
raise ValueError(f"The window size must be less than or equal to {max_size}")
284+
277285

278286
def sliding_dot_product(Q, T):
279287
"""
@@ -979,6 +987,12 @@ def mass(Q, T, M_T=None, Σ_T=None):
979987
if T.ndim != 1: # pragma: no cover
980988
raise ValueError(f"T is {T.ndim}-dimensional and must be 1-dimensional. ")
981989

990+
if m > n: # pragma: no cover
991+
raise ValueError(
992+
f"The length of `Q` ({len(Q)}) must be less than or equal to "
993+
f"the length of `T` ({len(T)}). "
994+
)
995+
982996
distance_profile = np.empty(n - m + 1)
983997
if np.any(~np.isfinite(Q)):
984998
distance_profile[:] = np.inf
@@ -1104,6 +1118,12 @@ def mass_absolute(Q, T):
11041118
if T.ndim != 1: # pragma: no cover
11051119
raise ValueError(f"T is {T.ndim}-dimensional and must be 1-dimensional. ")
11061120

1121+
if m > n: # pragma: no cover
1122+
raise ValueError(
1123+
f"The length of `Q` ({len(Q)}) must be less than or equal to "
1124+
f"the length of `T` ({len(T)}). "
1125+
)
1126+
11071127
distance_profile = np.empty(n - m + 1)
11081128
if np.any(~np.isfinite(Q)):
11091129
distance_profile[:] = np.inf

stumpy/gpu_aamp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ def gpu_aamp(T_A, m, T_B=None, ignore_trivial=True, device_id=0):
431431
"For multidimensional STUMP use `stumpy.mstump` or `stumpy.mstumped`"
432432
)
433433

434-
core.check_window_size(m)
434+
core.check_window_size(m, max_size=min(T_A.shape[0], T_B.shape[0]))
435435

436436
if ignore_trivial is False and core.are_arrays_equal(T_A, T_B): # pragma: no cover
437437
logger.warning("Arrays T_A, T_B are equal, which implies a self-join.")

stumpy/gpu_stump.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ def gpu_stump(T_A, m, T_B=None, ignore_trivial=True, device_id=0):
456456
"For multidimensional STUMP use `stumpy.mstump` or `stumpy.mstumped`"
457457
)
458458

459-
core.check_window_size(m)
459+
core.check_window_size(m, max_size=min(T_A.shape[0], T_B.shape[0]))
460460

461461
if ignore_trivial is False and core.are_arrays_equal(T_A, T_B): # pragma: no cover
462462
logger.warning("Arrays T_A, T_B are equal, which implies a self-join.")

stumpy/mstump.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -836,7 +836,7 @@ def mstump(T, m, include=None, discords=False):
836836
err = f"T is {T_A.ndim}-dimensional and must be at least 1-dimensional"
837837
raise ValueError(f"{err}")
838838

839-
core.check_window_size(m)
839+
core.check_window_size(m, max_size=min(T_A.shape[1], T_B.shape[1]))
840840

841841
if include is not None:
842842
include = _preprocess_include(include)

stumpy/mstumped.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def mstumped(dask_client, T, m, include=None, discords=False):
8080
err = f"T is {T_A.ndim}-dimensional and must be at least 1-dimensional"
8181
raise ValueError(f"{err}")
8282

83-
core.check_window_size(m)
83+
core.check_window_size(m, max_size=min(T_A.shape[1], T_B.shape[1]))
8484

8585
if include is not None:
8686
include = np.asarray(include)

stumpy/scrump.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ def prescrump(T_A, m, T_B=None, s=None):
197197
core.check_dtype(T_B)
198198
T_B[np.isinf(T_B)] = np.nan
199199

200-
core.check_window_size(m)
200+
core.check_window_size(m, max_size=min(T_A.shape[0], T_B.shape[0]))
201201

202202
μ_Q, σ_Q = core.compute_mean_std(T_A, m)
203203
M_T, Σ_T = core.compute_mean_std(T_B, m)
@@ -377,7 +377,7 @@ def __init__(
377377
"For multidimensional STUMP use `stumpy.mstump` or `stumpy.mstumped`"
378378
)
379379

380-
core.check_window_size(self._m)
380+
core.check_window_size(m, max_size=min(T_A.shape[0], T_B.shape[0]))
381381

382382
if self._ignore_trivial is False and core.are_arrays_equal(
383383
self._T_A, self._T_B

stumpy/stamp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ def stamp(T_A, T_B, m, ignore_trivial=False):
136136
if T_B.ndim != 1: # pragma: no cover
137137
raise ValueError(f"T_B is {T_B.ndim}-dimensional and must be 1-dimensional. ")
138138

139-
core.check_window_size(m)
139+
core.check_window_size(m, max_size=min(T_A.shape[0], T_B.shape[0]))
140140
subseq_T_A = core.rolling_window(T_A, m)
141141
excl_zone = int(np.ceil(m / 2))
142142

stumpy/stomp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def _stomp(T_A, m, T_B=None, ignore_trivial=True):
8686
if T_B.ndim != 1: # pragma: no cover
8787
raise ValueError(f"T_B is {T_B.ndim}-dimensional and must be 1-dimensional. ")
8888

89-
core.check_window_size(m)
89+
core.check_window_size(m, max_size=min(T_A.shape[0], T_B.shape[0]))
9090

9191
if ignore_trivial is False and core.are_arrays_equal(T_A, T_B): # pragma: no cover
9292
logger.warning("Arrays T_A, T_B are equal, which implies a self-join.")

0 commit comments

Comments
 (0)