package splar.core.constraints; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Vector; public class CNFClause { private Vector<CNFLiteral> literals; public CNFClause() { literals = new Vector<CNFLiteral>(); } public void addLiteral(CNFLiteral literal) { literals.add(literal); } public List<BooleanVariableInterface> getVariables() { Vector<BooleanVariableInterface> variables = new Vector<BooleanVariableInterface>(); for( Iterator<CNFLiteral> it = literals.iterator() ; it.hasNext() ; ) { variables.add(it.next().getVariable()); } return variables; } public int calculateSpan(Map<String,Integer> variable2indexMap) { int min = Integer.MAX_VALUE; int max = -1; Integer order; for( Iterator<CNFLiteral> it = literals.iterator() ; it.hasNext() ; ) { BooleanVariableInterface variable = it.next().getVariable(); order = variable2indexMap.get(variable.getID()); if ( order != null ) { if ( order < min ) { min = order.intValue(); } if ( order > max ) { max = order.intValue(); } } } return (max-min); } public List<CNFLiteral> getLiterals() { return literals; } public int countLiterals() { return literals.size(); } public int countVariables() { return getVariables().size(); } public int hashCode() { return literals.hashCode(); } public boolean equals(Object o) { CNFClause clause = (CNFClause)o; // same number of literals if ( clause.getLiterals().size() != getLiterals().size() ) { return false; } // same literals: one way for( CNFLiteral literal : clause.getLiterals()) { if ( !getLiterals().contains(literal) ) { return false; } } // same literals: other way for( CNFLiteral literal : getLiterals()) { if ( !clause.getLiterals().contains(literal) ) { return false; } } return true; } public String toPropositionalFormula() { String formula = ""; for( Iterator<CNFLiteral> it = literals.iterator() ; it.hasNext() ; ) { CNFLiteral literal = it.next(); formula += (literal.isPositive() ? literal.getVariable().getID() : "~" + literal.getVariable().getID()); if ( it.hasNext() ) { formula += " OR "; } } return formula; } public String toString() { StringBuffer toString = new StringBuffer(100); for( Iterator<CNFLiteral> it = literals.iterator() ; it.hasNext() ; ) { toString.append(it.next()); if ( it.hasNext() ) { toString.append(" or "); } } return toString.toString(); } public String toString2() { StringBuffer toString = new StringBuffer(100); for( Iterator<CNFLiteral> it = literals.iterator() ; it.hasNext() ; ) { toString.append(it.next().toString2()); if ( it.hasNext() ) { toString.append(" or "); } } return toString.toString(); } }