/**
   * Returns an array R of longs such that for each i, j in [0..R.length) i < j implies that the
   * formula identified by (int)R[i] in this.hits contributes fewer clauses to the core of the given
   * trace than the formula identified by (int)R[j].
   *
   * @return an array as described above
   */
  private long[] sortByRelevance(ResolutionTrace trace, IntSet relevantVars) {
    hits.indices().retainAll(relevantVars);

    if (hits.get(hits.indices().min()) == null) { // first call, initialize the hits
      for (IntIterator varItr = relevantVars.iterator(); varItr.hasNext(); ) {
        final int var = varItr.next();
        final IntSet varReachable = new IntBitSet(var + 1);
        varReachable.add(var);
        hits.put(var, varReachable);
      }
      for (Iterator<Clause> clauseItr = trace.reverseIterator(trace.axioms());
          clauseItr.hasNext(); ) {
        final Clause clause = clauseItr.next();
        final int maxVar = clause.maxVariable();
        for (IntSet reachableVars : hits.values()) {
          if (reachableVars.contains(maxVar)) {
            for (IntIterator lits = clause.literals(); lits.hasNext(); ) {
              reachableVars.add(StrictMath.abs(lits.next()));
            }
          }
        }
      }
    }

    final long[] counts = new long[hits.size()];

    for (Iterator<Clause> clauseItr = trace.iterator(trace.core()); clauseItr.hasNext(); ) {
      final Clause clause = clauseItr.next();
      final int maxVar = clause.maxVariable();
      int i = 0;
      for (IntSet reachableVars : hits.values()) {
        if (reachableVars.contains(maxVar)) {
          counts[i]++;
        }
        i++;
      }
    }

    int i = 0;
    for (IntIterator varItr = hits.indices().iterator(); varItr.hasNext(); ) {
      final int var = varItr.next();
      counts[i] = (counts[i] << 32) | var;
      i++;
    }

    Arrays.sort(counts);

    return counts;
  }
Exemple #2
0
 /**
  * Returns the set of all integers bound by this Bounds. The returned set does not support the add
  * operation. It supports removal iff this is not an unmodifiable Bounds.
  *
  * @return this.intBounds.TupleSet
  */
 public IntSet ints() {
   return intbounds.indices();
 }