/// <summary>Initializes a new instance of the TrimmedPatterns class.</summary> /// <param name="worker">The BackgroundWorker in wich Processing is run.</param> /// <param name="shakeCnt">The amount of shakes.</param> /// <param name="isAvrgIndividual">True if the Individual Average Choice mode is set; otherwise, false.</param> /// <param name="stepCntOnShake">The number of progress bar steps generated by method within one shake; 0 if without progress bar steps.</param> /// <param name="isDrawPlot">True if a plot should be drawing; otherwise, false.</param> /// <returns></returns> public TrimmedPatterns(System.ComponentModel.BackgroundWorker worker, short shakeCnt, bool isAvrgIndividual, float stepCntOnShake, bool isDrawPlot) : base(Words.Count, NON_SORT) { _realCount = _coll.Length; Average[] avrgs = isAvrgIndividual ? null : new Average[1]; TrimmedPattern tPtn; int maxFreqNumber = 0; // not used in this case OnPrgBarReseat(); // final drawing is been executed in invoking method, so we shold draw intermediate shakes only _initPtns = Patterns.GetTreatedPatterns( worker, 0, Sequence.Length, shakeCnt, ref avrgs, ref maxFreqNumber, stepCntOnShake, isDrawPlot); int k = isAvrgIndividual ? 1 : 0; for (int i = 0; i < _initPtns.Count; i++) { tPtn.SeedNumber = i; tPtn.Freq = _initPtns[i]; tPtn.Avrg = avrgs[k * i]; this[i] = tPtn; } worker.ReportProgress(Patterns.TreatSORTING); Shrink(); }
/// <summary>Creates and calculate an instance of ScanWindows class.</summary> /// <param name="worker">BackgroundWorker in wich Processing is run.</param> /// <param name="prgBar">ProgressBar to modify its Maximum.</param> /// <param name="shakeCnt">Number of shakes.</param> /// <param name="winStartLenght">Initial length of current scanned window.</param> /// <param name="winStopLenght">Final length of of current scanned window.</param> /// <param name="winIncr">Incriment of length of current scanned window.</param> /// <param name="winShift">Shift of current scanned window.</param> /// <param name="scanCnt">Nnumber of scanned window.</param> /// <returns>The sorted ScanWindow's collection.</returns> public static ScanWindows GetTreatedWindows( System.ComponentModel.BackgroundWorker worker, ProgressBar prgBar, short shakeCnt, short winStartLenght, short winStopLenght, short winIncr, short winShift, int scanCnt) { int j, length, startInd = 0, maxFreqInd, maxFreqNumber = 0; int winCnt = (winStopLenght - winStartLenght) / winIncr + 1; // the amount of windows from start to stop lengths int loopsPerStep = scanCnt * winCnt / prgBar.Maximum; // ProgressBar.DefaultMaximum; if (loopsPerStep < 10) // modify Maximum in case of appreciable cumulative error { prgBar.Maximum = scanCnt * winCnt / loopsPerStep; } float F, maxF; Patterns ptns; // threated patterns within inner loop ScanWindow sWin; // scanWindow with max Frequency int[] maxFreqNumbers = new int[winCnt]; // array for keeping maxFreqNumber within inner loop Patterns[] ptnsArray = new Patterns[winCnt]; // array for keeping Patterns within inner loop Average[] avrgs = new Average[1]; // single Average from threated patterns ScanWindows sWins = new ScanWindows(winCnt); // ScanWindows within inner loop ScanWindows sWinsRes = new ScanWindows(scanCnt); // result ScanWindows OnPrgBarReseat(); for (int i = 0; i < scanCnt; i++) { length = winStartLenght; // choose patterns with max F within inner loop (among increasing subsequenses) for (maxF = 0, maxFreqInd = 0, j = 0; j < winCnt; length += winIncr, j++) { ptnsArray[j] = ptns = Patterns.GetTreatedPatterns( worker, startInd, length, shakeCnt, ref avrgs, ref maxFreqNumber, 0, false); // ptns is unsorted maxFreqNumbers[j] = maxFreqNumber; sWins[j] = new ScanWindow( startInd, length, maxFreqNumber, F = avrgs[0].F(ptns[maxFreqNumber]), 0); // keep index of maxF element to avoid sorting by F at the end if (F > maxF) { maxF = F; maxFreqInd = j; } // increase progress bar OnPrgBarIncreased(worker, loopsPerStep); } // calculate CV for sWin with max F maxFreqNumber = maxFreqNumbers[maxFreqInd]; sWin = sWins[maxFreqInd]; sWin.CV = ptnsArray[maxFreqInd]. GetSimilars(maxFreqNumber). GetCV(sWin.StartIndex, sWin.Length, maxFreqNumber); // save sWin with max F sWinsRes[i] = sWin; startInd += winShift; // corrects startInd on the last step if (startInd + winStopLenght > Sequence.Length) { startInd = Sequence.Length - winStopLenght; } } sWinsRes.Sort(); return(sWinsRes); }