private void Bide() { _allSequentialPatterns.Clear(); ProjectedDatabase projectedDatabase = _sequenceDatabase.ConvertToProjectedDatabase(); // Divides the search space according to frequent items and mine each recursively. for (int i = 0; i < _1LengthSequentialPatterns.Count; ++i) { ProjectedDatabase freqItemProjectedDb = ConstructProjectedDatabase(_1LengthSequentialPatterns[i], projectedDatabase); if (freqItemProjectedDb == null || !freqItemProjectedDb.IsNotEmpty) { continue; } if (ClosureChecker.BackScan(freqItemProjectedDb)) { PrunedSequencesCount++; } else { Bide(freqItemProjectedDb); } } }
/// <summary> /// Checks if a given database contains some forward extensions items or backward extensions items. /// </summary> private static bool HasProjectedDatabaseAnyExtensions(ProjectedDatabase projectedDatabase, IEnumerable <Sequence> newSequentialPatterns) { // Checks if exist any forward extensions. If not tries find any backward extension return(newSequentialPatterns.Any(sequence => sequence.Support == projectedDatabase.Prefix.Support) || ClosureChecker.BackwardExtensionCheck(projectedDatabase)); }
private void Bide(ProjectedDatabase projectedDatabase) { if (Stopped) { return; } _sExtensions.Clear(); _iExtensions.Clear(); // Scans projected database once and finds extension items. projectedDatabase.FindLocalFrequentItems(_minSupport, _sExtensions, _iExtensions); var newSequentialPatterns = new List <Sequence>(); // Sequence-extension items. foreach (var pair in _sExtensions.OrderBy(e => e.Key)) { newSequentialPatterns.Add( Sequence.CreateNewBySStep(projectedDatabase.Prefix, pair.Key, pair.Value)); } // Itemset-extension items. foreach (var pair in _iExtensions.OrderBy(e => e.Key)) { newSequentialPatterns.Add( Sequence.CreateNewByIStep(projectedDatabase.Prefix, pair.Key, pair.Value)); } // If projected database does not contain backward or forward extensions // than a prefix of projection is closed sequential pattern. if (!HasProjectedDatabaseAnyExtensions(projectedDatabase, newSequentialPatterns)) { _allSequentialPatterns.Add(projectedDatabase.Prefix); LogPattern(projectedDatabase.Prefix); } else { NoClosedSequencesCount++; } // Divides the search space and recursively mine the subset of all sequential patterns. for (int i = 0; i < newSequentialPatterns.Count; ++i) { ProjectedDatabase seqPatternProjectedDatabase = ConstructProjectedDatabase(newSequentialPatterns[i], projectedDatabase); if (seqPatternProjectedDatabase == null || !seqPatternProjectedDatabase.IsNotEmpty) { continue; } if (ClosureChecker.BackScan(seqPatternProjectedDatabase)) { PrunedSequencesCount++; } else { Bide(seqPatternProjectedDatabase); } } }