// Path: src/com/juliasoft/beedeedee/bdd/Assignment.java
// public interface Assignment {
// 
// 	/**
// 	 * Determines if the given BDD variable holds in this assignment.
// 	 *
// 	 * @param var the variable
// 	 * @return true if and only if {@code var} holds in this assignment
// 	 * @throws IndexOutOfBoundsException if the variable does not belong to this
// 	 *             assignment. This means that the variable can be assigned any
// 	 *             value
// 	 */
// 	public boolean holds(BDD var) throws IndexOutOfBoundsException;
// 
// 	/**
// 	 * Determines if the given BDD variable holds in this assignment.
// 	 *
// 	 * @param i the variable index
// 	 * @return true if and only if the variable indexed by {@code i} holds in
// 	 *         this assignment
// 	 * @throws IndexOutOfBoundsException if the variable does not belong to this
// 	 *             assignment. This means that the variable can be assigned any
// 	 *             value
// 	 */
// 	public boolean holds(int i);
// 
// 	/**
// 	 * @return a <em>minterm</em> representation of the assignment
// 	 */
// 	public BDD toBDD();
// 
// 	/**
// 	 * Adds a mapping for the given variable.
// 	 * 
// 	 * @param var the variable index
// 	 * @param value the value to assign to the variable in this assignment
// 	 */
// 	public void put(int var, boolean value);
// 
// }


import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import com.juliasoft.beedeedee.bdd.Assignment;
			Arrays.equals(((EquivalenceRelation) obj).equivalenceClasses, equivalenceClasses);
	}

	@Override
	public int hashCode() {
		return hashCode;
	}

	private int hashCodeAux() {
		return Arrays.hashCode(equivalenceClasses);
	}

	@Override
	public String toString() {
		return Arrays.toString(equivalenceClasses);
	}

	public int maxVar() {
		int max = 0;
		for (BitSet eqClass: equivalenceClasses)
			max = Math.max(max, eqClass.length() - 1);

		return max;
	}

	/**
	 * Updates the given assignment with information on equivalent variables.
	 * 
	 * @param a the assignment to update
	 */
// Path: src/com/juliasoft/beedeedee/bdd/Assignment.java
// public interface Assignment {
// 
// 	/**
// 	 * Determines if the given BDD variable holds in this assignment.
// 	 *
// 	 * @param var the variable
// 	 * @return true if and only if {@code var} holds in this assignment
// 	 * @throws IndexOutOfBoundsException if the variable does not belong to this
// 	 *             assignment. This means that the variable can be assigned any
// 	 *             value
// 	 */
// 	public boolean holds(BDD var) throws IndexOutOfBoundsException;
// 
// 	/**
// 	 * Determines if the given BDD variable holds in this assignment.
// 	 *
// 	 * @param i the variable index
// 	 * @return true if and only if the variable indexed by {@code i} holds in
// 	 *         this assignment
// 	 * @throws IndexOutOfBoundsException if the variable does not belong to this
// 	 *             assignment. This means that the variable can be assigned any
// 	 *             value
// 	 */
// 	public boolean holds(int i);
// 
// 	/**
// 	 * @return a <em>minterm</em> representation of the assignment
// 	 */
// 	public BDD toBDD();
// 
// 	/**
// 	 * Adds a mapping for the given variable.
// 	 * 
// 	 * @param var the variable index
// 	 * @param value the value to assign to the variable in this assignment
// 	 */
// 	public void put(int var, boolean value);
// 
// }


// Path: src/com/juliasoft/beedeedee/factories/EquivalenceRelation.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import com.juliasoft.beedeedee.bdd.Assignment;

			Arrays.equals(((EquivalenceRelation) obj).equivalenceClasses, equivalenceClasses);
	}

	@Override
	public int hashCode() {
		return hashCode;
	}

	private int hashCodeAux() {
		return Arrays.hashCode(equivalenceClasses);
	}

	@Override
	public String toString() {
		return Arrays.toString(equivalenceClasses);
	}

	public int maxVar() {
		int max = 0;
		for (BitSet eqClass: equivalenceClasses)
			max = Math.max(max, eqClass.length() - 1);

		return max;
	}

	/**
	 * Updates the given assignment with information on equivalent variables.
	 * 
	 * @param a the assignment to update
	 */
	void updateAssignment(Assignment a) {