/// <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(); }