Conversation
Code Review SummaryStatus: 3 Issues Remaining | Recommendation: Address before merge Overview
Issue Details (click to expand)CRITICAL
WARNING
SUGGESTION
Resolved IssuesThe following previously identified issues have been addressed:
Other Observations (not in diff)Issues found in unchanged code that cannot receive inline comments:
Files Reviewed (3 files)
Note: The author (MayaGavrichenkova) has provided detailed explanations of the tds-dpcca algorithm changes in PR comments. The remaining critical issue is about the architectural change in how the algorithm processes time lags, which the author has defended as correct. Reviewers should carefully evaluate the algorithm explanation against the intended mathematical behavior. |
|
Обоснование текущей логики и объяснение, почему ввод сравнения intersection_length!=s_val некорректен. Требуется анализировать количество точек глобально(внутри всего массива) и локально(внутри текущего временного окна). При лаге>0: находится значение положение глобального конца, как минимум между (позиция начала временного окна+колличество точек во временном масштабе, длина общего входного массива-значение лага). Также значение позиции локального конца находится, как (колличество точек во временном масштабе-значение лага). intersection_length это длина итогового массива точек для анализа, которая находится как минимум(значение позиции глобального конца-значение позиции начала текущего временного окна, значение количества точек, которое находится как колличество точек во временном масштабе-значение лага). При лаге <0: находится значение положение глобального старта, как max(значение положения начала текущего окна, значение положения начала текущего окна-значение лага). Значение положения глобального конца находится, как (значение положения начала текущего окна+ значение точек во временном масштабе). intersection_length находится как (значение положения глобального конца-значение положения глобального старта). shift_sig = -lag - значение позиции сигнала без лага, shift_sig_lag = 0 - значение сигнала с лагом. Возникала ошибка с недостатком точек для polyfit: реализована проверка на количество точек: окна, где точек недостаточно-откидываются. Для каждого сигнала находим итоговое колличество точек с лагом и без лага в конкретном окне: data_true = signal_view[sig_idx, w, shift_sig : shift_sig + intersection_lenght] -данные без лага для w-окна, кол-во точек для анализа. data_lag_true = signal_view[sig_idx, w, shift_sig_lag : intersection_lenght + shift_sig_lag] - данные c лагом для w-окна, кол-во точек для анализа. Почему ввод сравнения intersection_length!=s_val некорректен: так как intersection_length - это количество точек для анализа в текущем временном окне для исходного сигнала и сигнала с временным лагом, приведем пример. Исходный сигнал с индексами значений во временном окне (0...10) при лаге=5, следовательно, индексы для сдвинутого сигнала будут (5..15). Значение пересечения (5..10) =6 позиций при изначальном значении длины временного окна=11. Следовательно, такое сравнение будет выполняться при все лагах кроме 0, что приводит к некорректной работе tds-dpcca. |
s_val -- это число отсчетов в анализируемом масштабе. Анализ других по длине окон -- это другие масштабы. В начале и конце сигнала варианты запаздываний, очевидно, ограничены -- это нормально. |
tests_manual/tds_dpcca.py
Outdated
| p, r, f, s = dpcca( | ||
| signal.T, | ||
| pd=1, | ||
| step=1, | ||
| s=s_val, | ||
| time_delays=[-60, -50, -40, 0, 40, 50, 60], | ||
| n_integral=1, | ||
| ) |
There was a problem hiding this comment.
- зачем каждый раз считать dpcca?
- Нужен ли этот тест в репозитории вообще? Автотесты делают примерно то же самое. А пример будет голубиный чуть позже
There was a problem hiding this comment.
Этот тест уберу, он правда повторяет предыдущий
StatTools/analysis/dpcca.py
Outdated
| lag_length = end - start | ||
| cur_window = (lag_length - s_val) // step_s + 1 | ||
| n_windows_arr.append(cur_window) | ||
| n_windows = min(n_windows_arr) |
There was a problem hiding this comment.
Может вызвать ValueError: min() iterable argument is empty если в список ничего не добавится
There was a problem hiding this comment.
Добавила
There was a problem hiding this comment.
Чёт ты странное сделала. Что ты пыталась сделать то?
Ася говорит, что выполнение команды на 232 строке может вызвать исключение при определенных условиях
There was a problem hiding this comment.
Да, можно было добавить if n_windows_arr: n_windows = min(n_windows_arr)
tests/test_dpcca.py
Outdated
| for r_pred in r: | ||
| np.testing.assert_allclose(r0, r_pred, atol=0.2) | ||
| estimated_lag = time_delays[max_lag_idx] | ||
| assert abs(estimated_lag - (-true_lag)) <= 10 |
There was a problem hiding this comment.
Я там увеличила порядок из-за увеличения порядка временных лагов. Был лаг 50->теперь 50
There was a problem hiding this comment.
Может, тогда сделать не абсолютное значение значение?
Был лаг 50->теперь 50
?
tests/test_dpcca.py
Outdated
| pd = 2 | ||
| n_integral = 1 | ||
| true_lag = 50 | ||
| p, r, f = tds_dpcca_worker( |
There was a problem hiding this comment.
неиспользуемые переменные
There was a problem hiding this comment.
Внесла в tdc_dpcca_worker неиспользуемые
There was a problem hiding this comment.
p и f неиспользуемые
There was a problem hiding this comment.
Вернуть _, r, _ = tds_dpcca_worker(, чтобы p, f не присвоились
| for s_idx in range(len(s)): | ||
| correlation = r[:, s_idx, 0, 1] | ||
| correlation = r[:, s_idx, :, :] | ||
| max_lag_idx = np.argmax(correlation) |
There was a problem hiding this comment.
А почему тут сменились индексы?
There was a problem hiding this comment.
Тест исправила
There was a problem hiding this comment.
Это ответ о причине изменения индексов или о том, что ты поправил по замечанию Аси?
There was a problem hiding this comment.
Code Review Summary
Status: 8 Issues Found | Recommendation: Address before merge
Overview
| Severity | Count |
|---|---|
| CRITICAL | 4 |
| WARNING | 2 |
| SUGGESTION | 2 |
Issue Details (click to expand)
CRITICAL
| File | Line | Issue |
|---|---|---|
StatTools/analysis/dpcca.py |
231 | The code raises ValueError("min() iterable argument is empty") for ANY invalid time lag, instead of gracefully skipping that lag. This is a regression from the old code which would check each window individually and skip invalid ones. This will cause the program to crash for edge cases where some lags are naturally invalid at the data boundaries. |
StatTools/analysis/dpcca.py |
266 | The _covariation function that handled two signals was removed. The PR now uses _covariation_single_signal for all cases, which may not correctly handle correlations between two different signals. |
StatTools/analysis/dpcca.py |
N/A | The tds_dpcca_worker function was completely rewritten with new logic. The new approach uses a different algorithm (computing covariation across all lags simultaneously then extracting diagonals) instead of the original per-lag computation. This is a significant behavioral change. |
StatTools/analysis/dpcca.py |
368 | Significant behavior change - removed the (processes == 1 or len(s) == 1) condition. This means tds_dpcca_worker will now be called even when processes > 1 and len(s) > 1, which may have performance implications or change intended behavior. |
WARNING
| File | Line | Issue |
|---|---|---|
StatTools/analysis/dpcca.py |
120 | New validation check if start_arr + end_arr >= n raises ValueError earlier than the old code. This changes when errors are raised for invalid time delays. |
StatTools/analysis/dpcca.py |
131 | Changed from checking s_val > n to s_val > valid_arr_lag. This is a logic change that may affect edge cases. |
SUGGESTION
| File | Line | Issue |
|---|---|---|
StatTools/analysis/dpcca.py |
237 | Typo in comment - "indecies" should be "indices" |
StatTools/analysis/dpcca.py |
46 | The _partial_correlation function uses np.linalg.inv(R) which will raise np.linalg.LinAlgError if R is singular - consider adding error handling for edge cases. |
Files Reviewed (3 files)
StatTools/analysis/dpcca.py- 8 issuestests/test_dpcca.py- Test parameters updated for new behaviortests_manual/tds_dpcca.py- New manual test file added
StatTools/analysis/dpcca.py
Outdated
| lag_length = end - start | ||
| cur_window = (lag_length - s_val) // step_s + 1 | ||
| n_windows_arr.append(cur_window) | ||
| n_windows = min(n_windows_arr) |
There was a problem hiding this comment.
Чёт ты странное сделала. Что ты пыталась сделать то?
Ася говорит, что выполнение команды на 232 строке может вызвать исключение при определенных условиях
tests_manual/tds_dpcca.py
Outdated
| p, r, f, s = dpcca( | ||
| signal.T, | ||
| pd=1, | ||
| step=1, | ||
| s=s_val, | ||
| time_delays=[-60, -50, -40, 0, 40, 50, 60], | ||
| n_integral=1, | ||
| ) |
StatTools/analysis/dpcca.py
Outdated
| lag_length = end - start | ||
| cur_window = (lag_length - s_val) // step_s + 1 | ||
| n_windows_arr.append(cur_window) | ||
| n_windows = min(n_windows_arr) |
There was a problem hiding this comment.
Да, можно было добавить if n_windows_arr: n_windows = min(n_windows_arr)
tests/test_dpcca.py
Outdated
| pd = 2 | ||
| n_integral = 1 | ||
| true_lag = 50 | ||
| p, r, f = tds_dpcca_worker( |
There was a problem hiding this comment.
Вернуть _, r, _ = tds_dpcca_worker(, чтобы p, f не присвоились
tests_manual/tds_dpcca.py
Outdated
| # Generate fractional Brownian noise using the default Kasdin method | ||
| sig_1 = generate_fbn(hurst=hurst, length=length) | ||
| sig_2 = generate_fbn(hurst=hurst, length=length) | ||
| print(sig_2.shape) |
tests/test_dpcca.py
Outdated
| for r_pred in r: | ||
| np.testing.assert_allclose(r0, r_pred, atol=0.2) | ||
| estimated_lag = time_delays[max_lag_idx] | ||
| assert abs(estimated_lag - (-true_lag)) <= 10 |
There was a problem hiding this comment.
Может, тогда сделать не абсолютное значение значение?
Был лаг 50->теперь 50
?
|
Объяснение концепции tds-dpcca:
|
Fix in tds-dpcca: correct comparison between analyzed points with time lag and current size of s window.