package edu.neu.ccs.evergreen.ir;
import static org.junit.Assert.*;
import org.junit.Test;
public class RelationCoreForcedVarsTest {
int maxRank = RelationCore.MaxRank;
@Test
public final void testIsForced() {
for(int rank=1;rank<=maxRank;rank++){
for(int vars=1;vars<=rank;vars++){
CustomCounter c = new CustomCounter(vars,0,rank-1);
while(c.hasNextDistinctPermutation()){
int[] forcedVars = c.nextDistinctPermutation();
int r = RelationNumberUtil.and(rank, forcedVars);
CustomCounter d = new CustomCounter(vars,0,1);
while(d.hasNext()){
int[] negatedVars = d.next();
int rn = RelationNumberUtil.nMap(r, rank, c.filter(negatedVars));
for(int variablePosition=0;variablePosition<rank;variablePosition++){
int forced = RelationCore.isForced(rn, rank, variablePosition);
switch(forced){
case -1:
for(int i:forcedVars){
assertTrue(i!=variablePosition);
}
break;
case 0:
boolean flag=false;
for(int i=0;i<forcedVars.length;i++){
if((forcedVars[i]==variablePosition)&&(negatedVars[i]==1)){
flag=true;
}
}
assertTrue(flag);
break;
case 1:
boolean flag2=false;
for(int i=0;i<forcedVars.length;i++){
if((forcedVars[i]==variablePosition)&&(negatedVars[i]==0)){
flag2=true;
}
}
assertTrue(flag2);
break;
default:
fail("invalid return value");
}
}
}
}
}
}
}
@Test
public final void testFirstForcedVariable() {
CustomCounter c,d;
int r,rn;
int[] forcedVars;
int[] negatedVars;
for(int rank=1;rank<=maxRank;rank++){
for(int vars=1;vars<=rank;vars++){
c = new CustomCounter(vars,0,rank-1);
while(c.hasNextDistinctPermutation()){
forcedVars = c.nextDistinctPermutation();
r = RelationNumberUtil.and(rank, forcedVars);
d = new CustomCounter(vars,0,1);
while(d.hasNext()){
negatedVars = d.next();
rn = RelationNumberUtil.nMap(r, rank, c.filter(negatedVars));
int startPosition=0;
int countForcedVars=0;
for(startPosition=0,countForcedVars=0;startPosition<rank;startPosition++,countForcedVars++){
startPosition = RelationCore.firstForcedVariable(rn, rank, startPosition);
if(startPosition==-1){
assertTrue(countForcedVars==vars);
break;
}
int forced = RelationCore.isForced(rn, rank, startPosition);
assertTrue(forced!=-1);
}
}
}
}
}
}
}