continue;
uint encodingSize = subgraph->getEncodingMaxVal(n)+1;
uint paddedSize = encoding->getSizeEncodingArray(encodingSize);
- model_print("encoding size=%u\n", encodingSize);
- model_print("padded=%u\n", paddedSize);
encoding->allocInUseArrayElement(paddedSize);
encoding->allocEncodingArrayElement(paddedSize);
Set *s = e->getRange();
for (uint i = 0; i < s->getSize(); i++) {
- model_print("index=%u\n", i);
uint64_t value = s->getElement(i);
uint encodingIndex = subgraph->getEncoding(n, value);
encoding->setInUseElement(encodingIndex);
DecomposeOrderResolver::~DecomposeOrderResolver() {
}
+void processNode(HashsetOrderNode * set, OrderNode *node, bool outedges) {
+ if (node->removed) {
+ Vector<OrderNode *> toprocess;
+ HashsetOrderNode visited;
+ toprocess.push(node);
+ while(toprocess.getSize()!=0) {
+ OrderNode *newnode=toprocess.last();toprocess.pop();
+ SetIteratorOrderEdge *iterator=outedges ? newnode->outEdges.iterator() : newnode->inEdges.iterator();
+ while(iterator->hasNext()) {
+ OrderEdge *edge=iterator->next();
+ OrderNode *tmpnode=outedges ? edge->sink : edge->source;
+ if (tmpnode->removed) {
+ if (visited.add(tmpnode)) {
+ toprocess.push(tmpnode);
+ }
+ } else {
+ set->add(tmpnode);
+ }
+ }
+ delete iterator;
+ }
+ } else
+ set->add(node);
+}
+
bool DecomposeOrderResolver::resolveOrder(uint64_t first, uint64_t second) {
OrderNode *from = graph->lookupOrderNodeFromOrderGraph(first);
ASSERT(from != NULL);
OrderNode *to = graph->lookupOrderNodeFromOrderGraph(second);
ASSERT(to != NULL);
-
- if (from->sccNum != to->sccNum) {
- OrderEdge *edge = graph->lookupOrderEdgeFromOrderGraph(from, to);
- if (edge != NULL && edge->mustPos) {
- return true;
- } else if ( edge != NULL && edge->mustNeg) {
- return false;
- } else {
- switch (graph->getOrder()->type) {
- case SATC_TOTAL:
- return from->sccNum < to->sccNum;
- case SATC_PARTIAL:
- return resolvePartialOrder(from, to);
- default:
- ASSERT(0);
+ if (from->removed || to->removed) {
+ HashsetOrderNode fromset, toset;
+ processNode(&fromset, from, true);
+ processNode(&toset, to, false);
+ SetIteratorOrderNode *fromit=fromset.iterator();
+ while(fromit->hasNext()) {
+ OrderNode * nodefrom=fromit->next();
+ SetIteratorOrderNode *toit=toset.iterator();
+ while(toit->hasNext()) {
+ OrderNode * nodeto=toit->next();
+ if (resolveOrder(nodefrom->getID(), nodeto->getID())) {
+ delete fromit;
+ delete toit;
+ return true;
+ }
}
+ delete toit;
+ }
+ delete fromit;
+ return false;
+ } else if (from->sccNum != to->sccNum) {
+ OrderEdge *edge = graph->lookupOrderEdgeFromOrderGraph(from, to);
+ switch (graph->getOrder()->type) {
+ case SATC_TOTAL:
+ return from->sccNum < to->sccNum;
+ case SATC_PARTIAL:
+ return resolvePartialOrder(from, to);
+ default:
+ ASSERT(0);
}
} else {
Order *suborder = NULL;