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);
        }
      }
    }
    private void PrefixSpan(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));
      }

      // Divides the search space and recursively mine the subset of all sequential patterns.
      for (int i = 0; i < newSequentialPatterns.Count; ++i)
      {
        Sequence seqPattern = newSequentialPatterns[i];

        _allSequentialPatterns.Add(seqPattern);
        LogPattern(seqPattern);

        ProjectedDatabase seqPatternProjectedDatabase = ConstructProjectedDatabase(seqPattern, projectedDatabase);

        if (seqPatternProjectedDatabase == null || !seqPatternProjectedDatabase.IsNotEmpty) continue;
        
        PrefixSpan(seqPatternProjectedDatabase);
      }
    }
        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);
                }
            }
        }