/// <summary> /// Builds an index with randomly generated time series /// </summary> public static void BaseIndex() { DateTime startTime = DateTime.Now; // index construction Index <RawDataFormat> si = new Index <RawDataFormat>(0, new IndexOptions("root")); DataLoader dl = new GeneratedRawDataLoader(si, Globals.TimeSeriesLength, NUM_TIMESERIES, SEED); InsertTimeSeries(dl); Console.WriteLine(); Console.WriteLine("Sequential Disk Accesses: " + DiskCost.seqcost); Console.WriteLine("Random Disk Accesses: " + DiskCost.rancost); Console.WriteLine("Read Disk Accesses: " + DiskCost.readcost); Console.WriteLine("Saved cost in buffer: " + DiskCost.savedcost); Console.WriteLine(); Index <RawDataFormat> .Save(Globals.IndexRootDir, si); Index <RawDataFormat> si2 = Index <RawDataFormat> .Load(Globals.IndexRootDir); DateTime endConstructionTime = DateTime.Now; Console.WriteLine("Index Construction Time: {0}", endConstructionTime - startTime); // generate some test queries const int NUM_QUERIES = 10; List <double[]> queries = new List <double[]>(NUM_QUERIES); for (int i = 0; i < NUM_QUERIES; i++) { queries.Add(Util.RandomWalk(Globals.TimeSeriesLength)); } // full sequential scan Console.WriteLine("Performing full sequential scan."); Console.WriteLine("--------------------------------"); List <IndexFileDist[]> nnInfo = si.KNearestNeighborSequentialScan(10, queries); Console.WriteLine(); // query results Console.WriteLine("Performing exact and approximate search."); Console.WriteLine("----------------------------------------"); int counter = 0; for (int i = 0; i < NUM_QUERIES; i++) { IndexFileDist exactResult; si.ExactSearch(queries[i], out exactResult); IndexFileDist approxResult = Index <RawDataFormat> .MinFileEucDist(queries[i], si.ApproximateSearch(queries[i]).FileName); Assert.IsTrue(exactResult == nnInfo[i][0]); if (approxResult == exactResult) { counter++; Console.WriteLine(approxResult); } } Console.WriteLine("{0} approximate results == exact results.", counter); Console.WriteLine(); }
public static void SearchQualityExperiment() { DateTime startTime = DateTime.Now; // index construction Index <RawDataFormat> si = new Index <RawDataFormat>(0, new IndexOptions("root")); DataLoader dl = new GeneratedRawDataLoader(si, Globals.TimeSeriesLength, NUM_TIMESERIES, SEED); InsertTimeSeries(dl); Console.WriteLine(); Console.WriteLine("Sequential Disk Accesses: " + DiskCost.seqcost); Console.WriteLine("Random Disk Accesses: " + DiskCost.rancost); Console.WriteLine("Read Disk Accesses: " + DiskCost.readcost); Console.WriteLine("Saved cost in buffer: " + DiskCost.savedcost); Console.WriteLine(); Index <RawDataFormat> .Save(Globals.IndexRootDir, si); Index <RawDataFormat> si2 = Index <RawDataFormat> .Load(Globals.IndexRootDir); DateTime endConstructionTime = DateTime.Now; Console.WriteLine("Index Construction Time: {0}", endConstructionTime - startTime); // avg over queries const int NUM_QUERIES = 100; List <double[]> queries = new List <double[]>(NUM_QUERIES); for (int i = 0; i < NUM_QUERIES; i++) { queries.Add(Util.RandomWalk(Globals.TimeSeriesLength)); } // measured metrics double approxSearchDist = 0; double approxSearchNodeDist = 0; double approxSearchNodeSize = 0; CostCounter exactSearchCosts = new CostCounter(); for (int i = 0; i < queries.Count; ++i) { // exact search IndexFileDist eRes; exactSearchCosts += si.ExactSearch(queries[i], out eRes); // approximate search TermEntry approxNode = si.ApproximateSearch(queries[i]); double mDist = double.MaxValue; List <RawDataFormat> nodeEntries = si.ReturnDataFormatFromTermEntry(approxNode); double sumDists = 0; foreach (RawDataFormat rd in nodeEntries) { double dist = Util.EuclideanDistance(queries[i], rd.GetTimeSeries()); sumDists += dist; if (dist < mDist) { mDist = dist; } } approxSearchDist += mDist; approxSearchNodeDist += sumDists / nodeEntries.Count; approxSearchNodeSize += nodeEntries.Count; } approxSearchDist /= queries.Count; approxSearchNodeDist /= queries.Count; approxSearchNodeSize /= queries.Count; using (StreamWriter sw = new StreamWriter(Path.Combine(ROOT_DIR, "searchQuality.txt"))) { string baseFormat = string.Format("{0}:NumTs_{1}:Th_{2}:Wl_{3}:NewPolicy", NUM_TIMESERIES, Globals.IndexNumMaxEntries, Globals.TimeSeriesLength, Globals.NewSplitPolicy); sw.WriteLine(baseFormat); sw.WriteLine("ExactSearchNumIO {0}", exactSearchCosts.IO / (double)queries.Count); sw.WriteLine("ExactSearchNumCalcuations {0}", exactSearchCosts.distance / (double)queries.Count); sw.WriteLine("ApproxSearchDistance {0}", approxSearchDist); sw.WriteLine("ApproxSearchAverageNodeDistance {0}", approxSearchNodeDist); sw.WriteLine("ApproxSearchAverageNodeSize {0}", approxSearchNodeSize); sw.WriteLine("ValidationString "); foreach (double[] query in queries) { sw.Write("{0} ", query[1]); } sw.WriteLine(); } }