/** * */ package csp; /** * @author mohsen * */ public interface RelationI { /* * Permutation Semantics constant SOURCE * * @see rename */ public static final int SOURCE = RelationCore.SOURCE; /* * Permutation Semantics constant TARGET * * @see rename */ public static final int TARGET = RelationCore.TARGET; /** * @return an integer representing the relation number */ public int getRelationNumber(); /** * @param relationNumber * @throws IllegalArgumentException * Thrwon if the relation number is invalid according to the * rank */ public void setRelationNumber(int relationNumber) throws IllegalArgumentException; /** * @return rank of the relation */ public int getRank(); /** * Currently unsupported Usually converting to a higher rank is simple. * however converting to a lower rank might require the introduction of * auxiliary variables and more than one relation might result from the * operation * * @param rank * sets the rank of the relation * @throws IllegalArgumentException */ public void setRank(int rank) throws IllegalArgumentException; /** * Returns a magic number associated with a certain truth table column and * value The magic number associated with column number 0 of the truth table * and value 0 is basically a sequence of alternating 0 and 1 bits, packed * together in one integer. The magic number associated with column number 0 * of the truth table and value 1 is a sequence of alternating 1 and 0 bits, * packed together in one integer. In general: (getMagicNumber(n,0) == * ~getMagicNumber(n,1)) For column 1: magic numbers are fromed from * sequences of two 0's followed by two 1's For column 2: magic numbers are * formed from sequences of four 0's followed by four 1's For column 3: * magic numbers are formed from sequeneces of eight 0's followed by eight * 1's For column 4:magic numbers are formed from sequeneces of sixteen 0's * followed by sixteen 1's There is no other possible columns as long as we * are using 32 bit integers * * The lenght of the magic number depends on the internally stored relation * rank * * @param variablePosition * the position of the desired magic number * @param value * the value associated with the desired magic number * @return * @throws IllegalArgumentException */ public int getMagicNumber(int variablePosition, int value) throws IllegalArgumentException; /** * @return An integer with all of its bits set to 1. The length of the * integer depends on the internally stored rank.
* the result is: 2^2^rank-1
* Note: the method takes care of the case where 2^2^n is outside * the integer range but 2^2^n-1 is not. */ public int getMask(); /** * Checks if the variable at a given position is irrelevant to the * internally stored relation * * @param variablePosition * the variable to be checked * @return true if the variable at vairablePosition is irrelevant otherwise * returns false * @throws IllegalArgumentException */ public boolean isIrrelevant(int variablePosition) throws IllegalArgumentException; /** * Counts the number of relevantVariables in the relation * * @return The number of relevant variables in the relation */ public int numberOfRelevantVariables(); /** * Checks if the relation forces the given variablePosition * * @param variablePosition * positon of the varible checked for being forced * @return 0 if the given relation forces the given variable to 0 1 if the * given relation forces the given variable to 1 -1 given relation * doesn't forces the given variable * @throws IllegalArgumentException */ public int isForced(int variablePosition) throws IllegalArgumentException; /** * starting at the given startPosition, get the position of the first * variable forced by the relation. * * @param startPosition * @return -1 if nothing is forced the position of the first forced variable * @throws IllegalArgumentException */ public int firstForcedVariable(int startPosition) throws IllegalArgumentException; /** * NMaps one of the variables in a relation i.e. replaces it by it's * complement for example: nMapping x in Or(x,y,z) results in: or(!x,y,z) * * @param relationNumber * @param rank * rank of the given relation * @param variablePosition * the variable to be nmapped * @return The number of the given relation with the specified variable * nmapped * @throws IllegalArgumentException */ public int nMap(int variablePosition) throws IllegalArgumentException; /** * Reduces a relation by assigning a value to one of its variables * * @param relationNumber * @param rank * @param variablePosition * @param value * @return * @throws IllegalArgumentException */ public int reduce(int variablePosition, int value) throws IllegalArgumentException; public int swap(int variablePosition1, int variablePosition2) throws IllegalArgumentException; /** * permute the variables in the given relationNumber according to the given * permutation fix the truth table order after doing the permutation. * * @see swap * @param relationNumber * @param rank * rank of the given relation * @param permutationSemantics * specifies how the permutation should be applied. can be either * RelationCore.SOURCE or RelationCore.TARGET for example: *

* for the relation: R(v2,v1,v0) *

* and the permutation {1,2,0} SOURCE semantics means that v0 * goes to position1, v1 goes to position2, v2 goes to position 0 * TARGET semantics means that position0 gets v1, position1 gets * v2, position2 gets v0 * @param permutation * an array of variable positions describing the desired location * of every variables for example: *

* for the relation: R(v2,v1,v0) *

* and the permutation {1,2,0} means v0 goes to position1, v1 * goes to position2, v2 goes to position 0 * @return the modified relationNumber */ /** * @param relationNumber * @param rank * * @param permutation * @return */ public int renme(int permutationSemantics, int... permutation) throws IllegalArgumentException; /** * returns the number of ones in the given relationNumber * * @param relationNumber * @param rank * @return */ public int ones(); /** * @param s * @return the number of rows in the truth table with s 1's * @throws IllegalArgumentException */ public int q(int s) throws IllegalArgumentException; }