Hello and thank you for your excellent package.
When providing a pre-computed Inverse Average Complexity (IAC) profile via the custom_iac parameter to stumpy.fluss, a ValueError related to shape incompatibility is raised within the internal _cac function. This occurs even when the custom_iac array is confirmed to have the correct expected shape (len(I) - L + 1,).
According to the documentation and intended use, stumpy.fluss should accept custom_iac of shape (len(I) - L + 1,) and use it directly in the CAC calculation.
Steps to Reproduce
- Import necessary libraries.
- Create a synthetic time series
I.
- Define window size
L and the number of regimes n_regimes.
- Calculate the expected profile length
profile_len = len(I) - L + 1.
- Create a simple
custom_iac array of shape (profile_len,).
- Call
stumpy.fluss passing the custom_iac.
import numpy as np
import stumpy
import matplotlib.pyplot as plt # Included in case plotting code is run afterwards
# 1. Create a synthetic time series (I) with different regimes
ts_len1 = 200
ts_len2 = 200
ts_len3 = 200
I = np.concatenate([
5 * np.sin(np.linspace(0, 10 * np.pi, ts_len1)),
10 + 0.5 * np.random.randn(ts_len2),
5 * np.random.randn(ts_len3)
])
N = len(I) # N = 600
# 2. Define window size (L) and number of regimes to find
L = 50
n_regimes = 3
# 3. Calculate the required length of the profile (N - L + 1)
profile_len = N - L + 1 # profile_len = 600 - 50 + 1 = 551
# 4. Create a SIMPLE custom_iac profile of the correct shape
# Using a simple constant IAC to eliminate complexity in IAC creation logic as the cause
custom_iac = np.ones(profile_len) * 0.5 # Should be shape (551,)
# Add print statements to verify shapes immediately before the call
print(f"Shape of original time series I: {I.shape}")
print(f"Calculated expected profile length (N - L + 1): {profile_len}")
print(f"Shape of the created custom_iac: {custom_iac.shape}") # Expected: (551,)
# 5. Run stumpy.fluss with the custom_iac
try:
# Note: stumpy.fluss returns (regimes, iac, cac) in v1.13.0
regimes, iac_output, cac = stumpy.fluss(I, L, n_regimes, custom_iac=custom_iac)
print("stumpy.fluss completed successfully (unexpected based on error seen before).")
print(f"Identified regime change points (indices in I): {regimes}")
# Optional: Add plotting code here if it runs without the error
except ValueError as e:
print(f"\nA ValueError occurred: {e}")
print("This error occurred inside stumpy.floss._cac during the CAC calculation.")
# Re-print actual shape just in case something changed (highly unlikely)
print(f"Actual custom_iac shape *after* error caught: {custom_iac.shape}")
Observed Behavior
When running the code above, the following output and traceback are observed:
STUMPY version: 1.13.0
Shape of original time series I: (600,)
Calculated expected profile length (N - L + 1): 551
Shape of the created custom_iac: (551,)
A ValueError occurred: operands could not be broadcast together with shapes (600,) (551,)
This error occurred inside stumpy.floss._cac during the CAC calculation.
Actual custom_iac shape *after* error caught: (551,)
Followed by a traceback similar to this (line numbers might vary slightly but the core error location is within stumpy.floss._cac):
ValueError Traceback (most recent call last)
File "<ipython-input-...>", line XX, in <module>
regimes, iac_output, cac = stumpy.fluss(I, L, n_regimes, custom_iac=custom_iac)
File "~/miniconda3/envs/stumpy_env/lib/python3.12/site-packages/stumpy/floss.py", line 300, in fluss
cac = _cac(I, L, bidirectional=True, excl_factor=excl_factor, custom_iac=custom_iac)
File "~/miniconda3/envs/stumpy_env/lib/python3.12/site-packages/stumpy/floss.py", line 174, in _cac
CAC[:] = AC / IAC
ValueError: operands could not be broadcast together with shapes (600,) (551,)
The error occurs at CAC[:] = AC / IAC within _cac. The error message indicates shapes (600,) and (551,). Since CAC and AC are internally computed based on N and L, they are expected to have shape (551,). The presence of (600,) suggests that the variable representing the IAC profile within _cac is incorrectly inheriting the shape of the original time series I (600) instead of using the provided custom_iac which has the correct shape (551). This contradicts the print statements verifying the custom_iac shape before the function call.
Expected Behavior
The stumpy.fluss function should successfully run when provided with a custom_iac array that has the shape (len(I) - L + 1,), without raising a ValueError. The custom_iac should be used directly in the calculation CAC = AC / IAC where AC, IAC, and CAC all have the shape (len(I) - L + 1,).
Regards
snvv
Hello and thank you for your excellent package.
When providing a pre-computed Inverse Average Complexity (IAC) profile via the
custom_iacparameter tostumpy.fluss, aValueErrorrelated to shape incompatibility is raised within the internal_cacfunction. This occurs even when thecustom_iacarray is confirmed to have the correct expected shape(len(I) - L + 1,).According to the documentation and intended use,
stumpy.flussshould acceptcustom_iacof shape(len(I) - L + 1,)and use it directly in the CAC calculation.Steps to Reproduce
I.Land the number of regimesn_regimes.profile_len = len(I) - L + 1.custom_iacarray of shape(profile_len,).stumpy.flusspassing thecustom_iac.Observed Behavior
When running the code above, the following output and traceback are observed:
Followed by a traceback similar to this (line numbers might vary slightly but the core error location is within
stumpy.floss._cac):The error occurs at
CAC[:] = AC / IACwithin_cac. The error message indicates shapes(600,)and(551,). SinceCACandACare internally computed based onNandL, they are expected to have shape(551,). The presence of(600,)suggests that the variable representing the IAC profile within_cacis incorrectly inheriting the shape of the original time seriesI(600) instead of using the providedcustom_iacwhich has the correct shape (551). This contradicts the print statements verifying thecustom_iacshape before the function call.Expected Behavior
The
stumpy.flussfunction should successfully run when provided with acustom_iacarray that has the shape(len(I) - L + 1,), without raising aValueError. Thecustom_iacshould be used directly in the calculationCAC = AC / IACwhereAC,IAC, andCACall have the shape(len(I) - L + 1,).Regards
snvv