#include "tunable.h"
void DFS(OrderGraph *graph, Vector<OrderNode *> *finishNodes) {
- HSIteratorOrderNode *iterator = graph->getNodes();
+ SetIteratorOrderNode *iterator = graph->getNodes();
while (iterator->hasNext()) {
OrderNode *node = iterator->next();
if (node->status == NOTVISITED) {
}
void DFSNodeVisit(OrderNode *node, Vector<OrderNode *> *finishNodes, bool isReverse, bool mustvisit, uint sccNum) {
- HSIteratorOrderEdge *iterator = isReverse ? node->inEdges.iterator() : node->outEdges.iterator();
+ SetIteratorOrderEdge *iterator = isReverse ? node->inEdges.iterator() : node->outEdges.iterator();
while (iterator->hasNext()) {
OrderEdge *edge = iterator->next();
if (mustvisit) {
}
void resetNodeInfoStatusSCC(OrderGraph *graph) {
- HSIteratorOrderNode *iterator = graph->getNodes();
+ SetIteratorOrderNode *iterator = graph->getNodes();
while (iterator->hasNext()) {
iterator->next()->status = NOTVISITED;
}
}
bool isMustBeTrueNode(OrderNode *node) {
- HSIteratorOrderEdge *iterator = node->inEdges.iterator();
+ SetIteratorOrderEdge *iterator = node->inEdges.iterator();
while (iterator->hasNext()) {
OrderEdge *edge = iterator->next();
if (!edge->mustPos) {
}
void bypassMustBeTrueNode(CSolver *This, OrderGraph *graph, OrderNode *node) {
- HSIteratorOrderEdge *iterin = node->inEdges.iterator();
+ SetIteratorOrderEdge *iterin = node->inEdges.iterator();
while (iterin->hasNext()) {
OrderEdge *inEdge = iterin->next();
OrderNode *srcNode = inEdge->source;
srcNode->outEdges.remove(inEdge);
- HSIteratorOrderEdge *iterout = node->outEdges.iterator();
+ SetIteratorOrderEdge *iterout = node->outEdges.iterator();
while (iterout->hasNext()) {
OrderEdge *outEdge = iterout->next();
OrderNode *sinkNode = outEdge->sink;
sinkNode->inEdges.remove(outEdge);
//Adding new edge to new sink and src nodes ...
+ if(srcNode == sinkNode){
+ This->setUnSAT();
+ delete iterout;
+ delete iterin;
+ return;
+ }
OrderEdge *newEdge = graph->getOrderEdgeFromOrderGraph(srcNode, sinkNode);
newEdge->mustPos = true;
newEdge->polPos = true;
- if (newEdge->mustNeg)
+ if (newEdge->mustNeg){
This->setUnSAT();
+ }
srcNode->outEdges.add(newEdge);
sinkNode->inEdges.add(newEdge);
}
}
void removeMustBeTrueNodes(CSolver *This, OrderGraph *graph) {
- HSIteratorOrderNode *iterator = graph->getNodes();
+ SetIteratorOrderNode *iterator = graph->getNodes();
while (iterator->hasNext()) {
OrderNode *node = iterator->next();
if (isMustBeTrueNode(node)) {
Vector<OrderNode *> finishNodes;
DFS(graph, &finishNodes);
resetNodeInfoStatusSCC(graph);
- HashTableNodeToNodeSet *table = new HashTableNodeToNodeSet(128, 0.25);
+ HashtableNodeToNodeSet *table = new HashtableNodeToNodeSet(128, 0.25);
Vector<OrderNode *> sccNodes;
uint sccNum = 1;
for (int i = size - 1; i >= 0; i--) {
OrderNode *node = finishNodes.get(i);
- HashSetOrderNode *sources = new HashSetOrderNode(4, 0.25);
+ HashsetOrderNode *sources = new HashsetOrderNode(4, 0.25);
table->put(node, sources);
if (node->status == NOTVISITED) {
for (uint j = 0; j < rSize; j++) {
OrderNode *rnode = sccNodes.get(j);
//Compute source sets
- HSIteratorOrderEdge *iterator = rnode->inEdges.iterator();
+ SetIteratorOrderEdge *iterator = rnode->inEdges.iterator();
while (iterator->hasNext()) {
OrderEdge *edge = iterator->next();
OrderNode *parent = edge->source;
if (edge->polPos) {
sources->add(parent);
- HashSetOrderNode *parent_srcs = (HashSetOrderNode *)table->get(parent);
+ HashsetOrderNode *parent_srcs = (HashsetOrderNode *)table->get(parent);
sources->addAll(parent_srcs);
}
}
for (uint j = 0; j < rSize; j++) {
//Copy in set of entire SCC
OrderNode *rnode = sccNodes.get(j);
- HashSetOrderNode *set = (j == 0) ? sources : sources->copy();
+ HashsetOrderNode *set = (j == 0) ? sources : sources->copy();
table->put(rnode, set);
//Use source sets to compute pseudoPos edges
- HSIteratorOrderEdge *iterator = node->inEdges.iterator();
+ SetIteratorOrderEdge *iterator = node->inEdges.iterator();
while (iterator->hasNext()) {
OrderEdge *edge = iterator->next();
OrderNode *parent = edge->source;
}
void DFSMust(OrderGraph *graph, Vector<OrderNode *> *finishNodes) {
- HSIteratorOrderNode *iterator = graph->getNodes();
+ SetIteratorOrderNode *iterator = graph->getNodes();
while (iterator->hasNext()) {
OrderNode *node = iterator->next();
if (node->status == NOTVISITED) {
void DFSClearContradictions(CSolver *solver, OrderGraph *graph, Vector<OrderNode *> *finishNodes, bool computeTransitiveClosure) {
uint size = finishNodes->getSize();
- HashTableNodeToNodeSet *table = new HashTableNodeToNodeSet(128, 0.25);
+ HashtableNodeToNodeSet *table = new HashtableNodeToNodeSet(128, 0.25);
for (int i = size - 1; i >= 0; i--) {
OrderNode *node = finishNodes->get(i);
- HashSetOrderNode *sources = new HashSetOrderNode(4, 0.25);
+ HashsetOrderNode *sources = new HashsetOrderNode(4, 0.25);
table->put(node, sources);
{
//Compute source sets
- HSIteratorOrderEdge *iterator = node->inEdges.iterator();
+ SetIteratorOrderEdge *iterator = node->inEdges.iterator();
while (iterator->hasNext()) {
OrderEdge *edge = iterator->next();
OrderNode *parent = edge->source;
if (edge->mustPos) {
sources->add(parent);
- HashSetOrderNode *parent_srcs = (HashSetOrderNode *) table->get(parent);
+ HashsetOrderNode *parent_srcs = (HashsetOrderNode *) table->get(parent);
sources->addAll(parent_srcs);
}
}
}
if (computeTransitiveClosure) {
//Compute full transitive closure for nodes
- HSIteratorOrderNode *srciterator = sources->iterator();
+ SetIteratorOrderNode *srciterator = sources->iterator();
while (srciterator->hasNext()) {
OrderNode *srcnode = srciterator->next();
OrderEdge *newedge = graph->getOrderEdgeFromOrderGraph(srcnode, node);
}
{
//Use source sets to compute mustPos edges
- HSIteratorOrderEdge *iterator = node->inEdges.iterator();
+ SetIteratorOrderEdge *iterator = node->inEdges.iterator();
while (iterator->hasNext()) {
OrderEdge *edge = iterator->next();
OrderNode *parent = edge->source;
}
{
//Use source sets to compute mustNeg for edges that would introduce cycle if true
- HSIteratorOrderEdge *iterator = node->outEdges.iterator();
+ SetIteratorOrderEdge *iterator = node->outEdges.iterator();
while (iterator->hasNext()) {
OrderEdge *edge = iterator->next();
OrderNode *child = edge->sink;
had one). */
void localMustAnalysisTotal(CSolver *solver, OrderGraph *graph) {
- HSIteratorOrderEdge *iterator = graph->getEdges();
+ SetIteratorOrderEdge *iterator = graph->getEdges();
while (iterator->hasNext()) {
OrderEdge *edge = iterator->next();
if (edge->mustPos) {
polarity. */
void localMustAnalysisPartial(CSolver *solver, OrderGraph *graph) {
- HSIteratorOrderEdge *iterator = graph->getEdges();
+ SetIteratorOrderEdge *iterator = graph->getEdges();
while (iterator->hasNext()) {
OrderEdge *edge = iterator->next();
if (edge->mustPos) {