/** * 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; }
/** * 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(); }