(
Q,
T,
m,
trivial_idx=None,
excl_zone=0,
ignore_trivial=False,
T_subseq_isconstant=None,
Q_subseq_isconstant=None,
)
| 129 | |
| 130 | |
| 131 | def mass_PI( |
| 132 | Q, |
| 133 | T, |
| 134 | m, |
| 135 | trivial_idx=None, |
| 136 | excl_zone=0, |
| 137 | ignore_trivial=False, |
| 138 | T_subseq_isconstant=None, |
| 139 | Q_subseq_isconstant=None, |
| 140 | ): |
| 141 | Q = np.asarray(Q) |
| 142 | T = np.asarray(T) |
| 143 | |
| 144 | Q_subseq_isconstant = rolling_isconstant(Q, m, Q_subseq_isconstant)[0] |
| 145 | T_subseq_isconstant = rolling_isconstant(T, m, T_subseq_isconstant) |
| 146 | |
| 147 | D = distance_profile(Q, T, m) |
| 148 | D[np.isnan(D)] = np.inf |
| 149 | for i in range(len(T) - m + 1): |
| 150 | if np.isfinite(D[i]): |
| 151 | if Q_subseq_isconstant and T_subseq_isconstant[i]: |
| 152 | D[i] = 0 |
| 153 | elif Q_subseq_isconstant or T_subseq_isconstant[i]: |
| 154 | D[i] = np.sqrt(m) |
| 155 | else: # pragma: no cover |
| 156 | pass |
| 157 | |
| 158 | if ignore_trivial: |
| 159 | apply_exclusion_zone(D, trivial_idx, excl_zone, np.inf) |
| 160 | start = max(0, trivial_idx - excl_zone) |
| 161 | stop = min(D.shape[0], trivial_idx + excl_zone + 1) |
| 162 | |
| 163 | I = np.argmin(D) |
| 164 | P = D[I] |
| 165 | |
| 166 | if P == np.inf: |
| 167 | I = -1 |
| 168 | |
| 169 | # Get left and right matrix profiles for self-joins |
| 170 | if ignore_trivial and trivial_idx > 0: |
| 171 | PL = np.inf |
| 172 | IL = -1 |
| 173 | for i in range(trivial_idx): |
| 174 | if D[i] < PL: # pragma: no cover |
| 175 | IL = i |
| 176 | PL = D[i] |
| 177 | if start <= IL < stop: # pragma: no cover |
| 178 | IL = -1 |
| 179 | else: # pragma: no cover |
| 180 | IL = -1 |
| 181 | |
| 182 | if ignore_trivial and trivial_idx + 1 < D.shape[0]: |
| 183 | PR = np.inf |
| 184 | IR = -1 |
| 185 | for i in range(trivial_idx + 1, D.shape[0]): |
| 186 | if D[i] < PR: |
| 187 | IR = i |
| 188 | PR = D[i] |
no test coverage detected