(
query_idx, T, m, include=None, discords=False, T_subseq_isconstant=None
)
| 552 | |
| 553 | |
| 554 | def multi_distance_profile( |
| 555 | query_idx, T, m, include=None, discords=False, T_subseq_isconstant=None |
| 556 | ): |
| 557 | excl_zone = int(np.ceil(m / config.STUMPY_EXCL_ZONE_DENOM)) |
| 558 | |
| 559 | d = T.shape[0] |
| 560 | if T_subseq_isconstant is None or callable(T_subseq_isconstant): |
| 561 | T_subseq_isconstant = [T_subseq_isconstant] * d |
| 562 | |
| 563 | T_subseq_isconstant = np.array( |
| 564 | [rolling_isconstant(T[i], m, T_subseq_isconstant[i]) for i in range(d)] |
| 565 | ) |
| 566 | |
| 567 | Q = T[:, query_idx : query_idx + m] |
| 568 | Q_subseq_isconstant = np.expand_dims(T_subseq_isconstant[:, query_idx], axis=1) |
| 569 | D = multi_mass( |
| 570 | Q, |
| 571 | T, |
| 572 | m, |
| 573 | include, |
| 574 | discords, |
| 575 | T_subseq_isconstant=T_subseq_isconstant, |
| 576 | Q_subseq_isconstant=Q_subseq_isconstant, |
| 577 | ) |
| 578 | |
| 579 | start_row_idx = 0 |
| 580 | if include is not None: |
| 581 | apply_include(D, include) |
| 582 | start_row_idx = include.shape[0] |
| 583 | |
| 584 | if discords: |
| 585 | D[start_row_idx:][::-1].sort(axis=0) |
| 586 | else: |
| 587 | D[start_row_idx:].sort(axis=0) |
| 588 | |
| 589 | d, n = T.shape |
| 590 | D_prime = np.zeros(n - m + 1) |
| 591 | D_prime_prime = np.zeros((d, n - m + 1)) |
| 592 | for j in range(d): |
| 593 | D_prime[:] = D_prime + D[j] |
| 594 | D_prime_prime[j, :] = D_prime / (j + 1) |
| 595 | |
| 596 | apply_exclusion_zone(D_prime_prime, query_idx, excl_zone, np.inf) |
| 597 | |
| 598 | return D_prime_prime |
| 599 | |
| 600 | |
| 601 | def mstump(T, m, excl_zone, include=None, discords=False, T_subseq_isconstant=None): |
no test coverage detected