From b2221b18fdb48961c6eb5cf8bc81982c5a58feb3 Mon Sep 17 00:00:00 2001 From: NimaSarajpoor Date: Mon, 24 Aug 2026 22:28:57 -0400 Subject: [PATCH 1/2] add branching logic to sdp func in core --- stumpy/core.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/stumpy/core.py b/stumpy/core.py index 09fd80d8f..5db05b66d 100644 --- a/stumpy/core.py +++ b/stumpy/core.py @@ -665,7 +665,16 @@ def sliding_dot_product(Q, T): output : numpy.ndarray Sliding dot product between `Q` and `T`. """ - return sdp._sliding_dot_product(Q, T) + if len(Q) == len(T): + func = np.dot + elif len(Q) <= 128: # 2 ** 7 + func = sdp._njit_sliding_dot_product + elif sdp.PYFFTW_IS_AVAILABLE: + func = sdp._pyfftw_sliding_dot_product + else: + func = sdp._sliding_dot_product + + return func(Q, T) @njit( From 545055729cfd4a2605a3e492d424d5c2ca4a8730 Mon Sep 17 00:00:00 2001 From: NimaSarajpoor Date: Tue, 25 Aug 2026 01:15:29 -0400 Subject: [PATCH 2/2] add test function to improve coverage --- stumpy/config.py | 2 ++ stumpy/core.py | 14 +++++++------- tests/test_core.py | 10 ++++++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/stumpy/config.py b/stumpy/config.py index f4378fbe6..e82d1bf31 100644 --- a/stumpy/config.py +++ b/stumpy/config.py @@ -17,6 +17,7 @@ "STUMPY_MAX_P_NORM_DISTANCE": np.finfo(np.float64).max, "STUMPY_MAX_DISTANCE": np.sqrt(np.finfo(np.float64).max), "STUMPY_EXCL_ZONE_DENOM": 4, + "STUMPY_NJIT_SDP_Q_LENGTH": 128, # 2 ** 7 "STUMPY_FASTMATH_TRUE": True, "STUMPY_FASTMATH_FLAGS": {"nsz", "arcp", "contract", "afn", "reassoc"}, "STUMPY_FASTMATH_FASTMATH._ADD_ASSOC": True, @@ -38,6 +39,7 @@ STUMPY_MAX_P_NORM_DISTANCE = _STUMPY_DEFAULTS["STUMPY_MAX_P_NORM_DISTANCE"] STUMPY_MAX_DISTANCE = _STUMPY_DEFAULTS["STUMPY_MAX_DISTANCE"] STUMPY_EXCL_ZONE_DENOM = _STUMPY_DEFAULTS["STUMPY_EXCL_ZONE_DENOM"] +STUMPY_NJIT_SDP_Q_LENGTH = _STUMPY_DEFAULTS["STUMPY_NJIT_SDP_Q_LENGTH"] STUMPY_FASTMATH_TRUE = _STUMPY_DEFAULTS["STUMPY_FASTMATH_TRUE"] STUMPY_FASTMATH_FLAGS = _STUMPY_DEFAULTS["STUMPY_FASTMATH_FLAGS"] diff --git a/stumpy/core.py b/stumpy/core.py index 5db05b66d..601b68912 100644 --- a/stumpy/core.py +++ b/stumpy/core.py @@ -666,15 +666,15 @@ def sliding_dot_product(Q, T): Sliding dot product between `Q` and `T`. """ if len(Q) == len(T): - func = np.dot - elif len(Q) <= 128: # 2 ** 7 - func = sdp._njit_sliding_dot_product - elif sdp.PYFFTW_IS_AVAILABLE: - func = sdp._pyfftw_sliding_dot_product + out = np.array([np.dot(Q, T)]) + elif len(Q) <= config.STUMPY_NJIT_SDP_Q_LENGTH: + out = sdp._njit_sliding_dot_product(Q, T) + elif sdp.PYFFTW_IS_AVAILABLE: # pragma: no cover + out = sdp._pyfftw_sliding_dot_product(Q, T) else: - func = sdp._sliding_dot_product + out = sdp._sliding_dot_product(Q, T) - return func(Q, T) + return out @njit( diff --git a/tests/test_core.py b/tests/test_core.py index 28589cfa3..c92339574 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -208,6 +208,16 @@ def test_sliding_dot_product(Q, T): npt.assert_allclose(cmp_mp, ref_mp, atol=1.5e-07) +def test_sliding_dot_product_large_Q(): + # Set len(T) > len(Q) > config.STUMPY_NJIT_SDP_Q_LENGTH, + # so that it triggers a certain code flow + Q = rng.RNG.rand(config.STUMPY_NJIT_SDP_Q_LENGTH + 1) + T = rng.RNG.rand(config.STUMPY_NJIT_SDP_Q_LENGTH + 2) + ref_mp = naive.rolling_window_dot_product(Q, T) + cmp_mp = core.sliding_dot_product(Q, T) + npt.assert_allclose(cmp_mp, ref_mp, atol=1.5e-07) + + def test_welford_nanvar(): T = rng.RNG.rand(64) m = 10