bool CircuitCmp::proveSAT(Gate* one, Gate* two){ vector<Gate*> dlistOne, dlistTwo; DFSearch(one, dlistOne); DFSearch(two, dlistTwo); resetTraversed(dlistOne); resetTraversed(dlistTwo); solver.initialize(); genProofModel(dlistOne, dlistTwo); Var v = solver.newVar(); if(one -> phase == two -> phase) solver.addXorCNF(v, one -> getVar(), false, two-> getVar(),false); else if(one -> phase == !(two -> phase)) solver.addXorCNF(v, one -> getVar(), true, two-> getVar(), false); solver.assumeProperty(circuitOne -> constTrueGate -> getVar(), true); solver.assumeProperty(circuitOne -> constFalseGate -> getVar(), false); solver.assumeProperty(v, true); bool result = solver.assumpSolve(); //solver.printStats(); return !result; }
void CircuitCmp::CountScore(){ vector<int>score; int tmp; vector<Gate*> store; cout<<cutSet.size()<<endl; for(int i=0;i<cutSet.size();i++){ for(int j=0;j<cutSet[i]->size();j++){ cout<<cutSet[i]->at(j)->name<<endl; DFSearch(cutSet[i]->at(j)->input[0],store); tmp=0; for(int k=0;k<store.size();k++){ if(store[k]->gateType!=Input && store[k]->gateType!=Wir) tmp++; } tmp++; if(tmp==1){ cout<<"tmp=1"<<endl; assert(0); } score.push_back(tmp); store.clear(); } } for(int i=0;i<circuitOne->output.size();i++){ DFSearch(circuitOne->output[i]->input[0],store); resetTraversed(store); tmp=0; for(int j=0;j<store.size();j++){ if(store[j]->gateType!=Input && store[j]->gateType!=Wir) tmp++; } score.push_back(tmp); store.clear(); DFSearch(circuitTwo->output[i]->input[0],store); resetTraversed(store); tmp=0; for(int j=0;j<store.size();j++){ if(store[j]->gateType!=Input && store[j]->gateType!=Wir) tmp++; } score.push_back(tmp); store.clear(); } intsort g; sort(score.begin(),score.end(),g); for(int i=0;i<score.size()-1;i++) cout<<score[i]<<","; cout<<score[score.size()-1]<<endl; }
/****DFS Function Definition****/ void DFS() { int i; for(i=1;i<=n;i++) if(!visited[i]) { if(i>1) connected=0; DFSearch(i); } }
void CircuitCmp::DFSearch(Gate* source, vector<Gate*>& List){ source->traversed=true; if(source->gateType!=Wir || !(((Wire*)source)->isCut())){ for(int i=0;i<source->input.size();i++){ if(!(source->input[i]->traversed)) DFSearch(source->input[i],List); } } List.push_back(source); }
void CircuitCmp::RebuiltDFSlist(){ int one=0,two=0; dfsListOne.clear(); dfsListTwo.clear(); circuitOne->resetTraversed(); circuitTwo->resetTraversed(); for(int i=0;i<circuitOne->output.size();i++){ DFSearch(circuitOne->output[i],dfsListOne); DFSearch(circuitTwo->output[i],dfsListTwo); } for(int i=0;i<dfsListOne.size();i++) if(dfsListOne[i]->gateType==Wir && !(((Wire*)dfsListOne[i])->isCut()) && ((Wire*)dfsListOne[i])->potentialCut) one++; for(int i=0;i<dfsListTwo.size();i++) if(dfsListTwo[i]->gateType==Wir && !(((Wire*)dfsListTwo[i])->isCut()) && ((Wire*)dfsListTwo[i])->potentialCut) two++; cout<<one<<":"<<two<<endl; resetTraversed(dfsListOne); resetTraversed(dfsListTwo); }
/****DFSearch Function Definition****/ void DFSearch(int cur) { int i,j; visited[cur]=++count; seq[count]=cur; for(i=1;i<count-1;i++) if(A[cur][seq[i]]) acyclic=0; for(i=1;i<=n;i++) if(A[cur][i] && !visited[i]) DFSearch(i); }