/// <summary>
 /// Obtain all the sliding window sub seqences given a time series and a length w
 /// </summary>
 /// <param name="TimeSeries"></param>
 /// <param name="w"></param>
 /// <returns></returns>
 private List<SubTimeSeries> SlidingWindowSampling(SubTimeSeries TimeSeries, int w)
 {
     List<SubTimeSeries> SlidingTimeSeriesSet = new List<SubTimeSeries>();
     for (int i = 0; i < TimeSeries.TimeSeries.Count; i++)
     {
         if (i + w < TimeSeries.TimeSeries.Count)
         {
             SubTimeSeries subSequence = new SubTimeSeries();
             for (int j = 0; j < w; j++)
             {
                 subSequence.TimeSeries.Add(TimeSeries.TimeSeries[i + j]);
             }
             subSequence.index = i + TimeSeries.index;
             SlidingTimeSeriesSet.Add(subSequence);
         }
     }
     return SlidingTimeSeriesSet;
 }
        /// <summary>
        /// Samping the Noise Set
        /// </summary>
        /// <param name="TimeSeries"></param>
        /// <param name="WMax"></param>
        /// <param name="WMin"></param>
        /// <returns></returns>
        private List<SubTimeSeries> SamplingNoiseSet(List<double> TimeSeries, int WMax, int WMin)
        {
            List<SubTimeSeries> SubSet = new List<SubTimeSeries>();
            Random rand = new Random();

            SubTimeSeries SubSequence = new SubTimeSeries();
            for (int i = 0; i < WMax; i++)
            {
                int index = rand.Next(TimeSeries.Count);
                SubSequence.TimeSeries.Add(TimeSeries[index]);
            }

            List<SubTimeSeries> SlidingWindowSet = SlidingWindowSampling(SubSequence, WMin);
            foreach (SubTimeSeries SlidingSeries in SlidingWindowSet)
            {
                SubSet.Add(SlidingSeries);
            }
            return SubSet;
        }
        /// <summary>
        /// Sample one sub sequence give a length w
        /// </summary>
        /// <param name="TimeSeries"></param>
        /// <param name="w"></param>
        /// <returns></returns>
        private SubTimeSeries SamplingSubSequence(List<double> TimeSeries, int w)
        {
            Random rand = new Random();
            int index = rand.Next(TimeSeries.Count);
            while (index + w - 1 >= 1000)
                index = rand.Next(TimeSeries.Count);
            SubTimeSeries SubSequence = new SubTimeSeries();

            for (int i = index; i < index + w - 1; i++)
            {
                SubSequence.TimeSeries.Add(TimeSeries[i]);
            }
            SubSequence.index = index;

            return SubSequence;
        }
 /// <summary>
 /// A tool method used for insert sorting.
 /// </summary>
 /// <param name="CandidateSet"></param>
 /// <param name="CandidateSequence"></param>
 private void InsertInto(ref List<SubTimeSeries> CandidateSet, SubTimeSeries CandidateSequence)
 {
     for (int i =0; i < CandidateSet.Count; i++)
     {
         if (CandidateSequence.dist < CandidateSet[i].dist)
         {
             for (int j = CandidateSet.Count - 1; j > i; j--)
             {
                 CandidateSet[j] = CandidateSet[j - 1];
             }
             CandidateSet[i] = CandidateSequence;
         }
     }
 }