code: private void reduce() {
          this.stats.reductions++;
          final LNGVector<CLClause> candidates = new LNGVector<>();
          for (final CLClause c : this.clauses) { if (c.redundant() && !c.important() && !c.forcing()) { candidates.push(c); } }
          final int keep = candidates.size() / 2;
          candidates.sort(CLClause.comp);
          for (int i = keep; i < candidates.size(); i++) { candidates.get(i).setRemove(true); }
          for (int idx = 1; idx <= maxvar(); idx++) {
              for (int sign = -1; sign <= 1; sign += 2) {
                  final LNGVector<CLWatch> ws = watches(sign * idx);
                  final LNGVector<CLWatch> newWs = new LNGVector<>(ws.size());
                  for (final CLWatch w : ws) { if (!w.clause().remove()) { newWs.push(w); } }
                  ws.replaceInplace(newWs);
              }
          }
          int j = 0;
          int i;
          for (i = 0; i < this.clauses.size(); i++) {
              final CLClause c = this.clauses.get(i);
              if (i == this.distilled) { this.distilled = j; }
              if (!c.remove()) { this.clauses.set(j++, c); }
          }
          if (i == this.distilled) { this.distilled = j; }
          this.clauses.shrinkTo(j);
          long reduced = 0;
          for (int k = keep; k < candidates.size(); k++) {
              deleteClause(candidates.get(k));
              reduced++;
          }
          this.stats.clausesReduced += reduced;
          candidates.release();
          this.limits.reduceRedundant += this.config.redinc;
      }
docs: Reduces the number of redundant clauses.