private static TimeWarpInfo fastDTW(final MultivariateTimeSeries tsI, final MultivariateTimeSeries tsJ, int searchRadius, final DistanceFunction distFn) {
if (searchRadius < 0)
searchRadius = 0;
final int minTSsize = searchRadius + 2;
if ((tsI.size() <= minTSsize) || (tsJ.size() <= minTSsize)) {
return DTW.getWarpInfoBetween(tsI, tsJ, distFn);
} else {
final PAA shrunkI = new PAA(tsI, tsI.size() / 2);
final PAA shrunkJ = new PAA(tsJ, tsJ.size() / 2);
final WarpPath warpPath = getWarpInfoBetween(shrunkI, shrunkJ, searchRadius, distFn).getPath();
final SearchWindow window = new ExpandedResWindow(tsI, tsJ, shrunkI, shrunkJ, warpPath, searchRadius);
return DTW.getWarpInfoBetween(tsI, tsJ, window, distFn);
}
}
}