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