void GroupableTimeSeriesSet::similar(GroupableTimeSeriesSet *other, int otherSeq, TimeInterval otherInt, SearchStrategy strat, int warps) { if (!valid() || !other->valid()) { session->geterr() << "Warning: Attempted to find similarities using an invalid database." << endl; return; } if (grouping == NULL) { session->geterr() << "Warning: Attempted to find similarities on ungrouped dataset." << endl; return; } kBest best = grouping->getBestInterval(otherInt.length(), other->dataset->getRawData(otherSeq, otherInt.start), strat, warps); session->getout() << "Found most similar interval." << endl; session->getout() << "Sequence number and interval: " << best.seq << "@" << "[" << best.interval.start << ", " << best.interval.end << "]." << endl; session->getout() << "Distance: " << best.dist << endl; if (verbosity > 0) { session->getout() << "Sequence: " << endl; dataset->printInterval(session->getout(), best.seq, best.interval); } }
kBest GroupableTimeSeriesSet::returnSimilar(GroupableTimeSeriesSet *other, int otherSeq, TimeInterval otherInt, SearchStrategy strat, int warps) { if (!valid() || !other->valid()) { session->geterr() << "Warning: Attempted to find similarities using an invalid database." << endl; return; } if (grouping == NULL) { session->geterr() << "Warning: Attempted to find similarities on ungrouped dataset." << endl; return; } return grouping->getBestInterval(otherInt.length(), other->dataset->getRawData(otherSeq, otherInt.start), strat, warps); }
void OnlineSession::kSimilar(int dbindex, vector<double> qdata, TimeInterval interval, int k, int strict) { if (groupings[dbindex] == NULL) genGrouping(dbindex, defaultST); TimeSeriesGrouping *t = groupings[dbindex]; int slen = dataSets[dbindex]->seqLength; int ilen = interval.length(); TimeSeriesIntervalEnvelope eqdata(TimeSeriesInterval(qdata.data(), TimeInterval(0, qdata.size() - 1))); double gb; int bsfStart = 0, bsfEnd = 0, bsfIndex = -1; double bsf = INF; if (strict == 0) { for (int i = 0; i < slen; i++) { if (debug) { cout << "Searching groups from start=" << i << ", bsf=" << bsf << endl; } for (int j = i; j < slen; j++) { int k = t->groups[i * slen + j].getBestGroup(eqdata, &gb, bsf); if (k < 0) continue; if (gb < bsf) { bsf = gb; bsfStart = i; bsfEnd = j; bsfIndex = k; } } } } else if (strict == 1) { for (int i = 0; i + ilen - 1 < slen; i++) { if (debug) cout << "Searching groups from start=" << i << endl; int j = i + (ilen - 1); int k = t->groups[i * slen + j].getBestGroup(eqdata, &gb, bsf); if (k < 0) continue; if (gb < bsf) { bsf = gb; bsfStart = i; bsfEnd = j; bsfIndex = k; } } } else { bsfStart = interval.start; bsfEnd = interval.end; bsfIndex = t->groups[bsfStart * slen + bsfEnd].getBestGroup(eqdata, &gb, bsf); if (bsfIndex >= 0) bsf = gb; } if (bsf == INF || bsfIndex < 0) { cerr << "kSimilar: Failed to find similar objects. No suitable candidate group centroids." << endl; return; } cout << "Found most similar interval and group: " << bsfIndex << "@" << "[" << bsfStart << "," << bsfEnd << "]" << endl; vector<kSim> sim = t->groups[bsfStart * slen + bsfEnd].groups[bsfIndex]->getSortedSimilar(eqdata, k); cout << "Discovered k similar points:" << endl; for (unsigned int i = 0; i < sim.size(); i++) { cout << "Series " << sim[i].index << ", interval [" << bsfStart << "," << bsfEnd << "] is at distance " << sim[i].distance << "." << endl; TimeSeriesInterval interval = (*t->groups[bsfStart * slen + bsfEnd].groups[bsfIndex]->slice)[sim[i].index]; for (int j = 0; j < interval.length(); j++) { cout << interval[j] << " "; } cout << endl; } }