void EncodingGraph::mergeNodes(EncodingNode *first, EncodingNode *second) {
EncodingSubGraph *graph1=graphMap.get(first);
EncodingSubGraph *graph2=graphMap.get(second);
+ if (graph1 == NULL)
+ first->setEncoding(BINARYINDEX);
+ if (graph2 == NULL)
+ second->setEncoding(BINARYINDEX);
+
if (graph1 == NULL && graph2 == NULL) {
graph1 = new EncodingSubGraph();
subgraphs.add(graph1);
EncodingNode *right = ee->right;
if (ee->encoding != EDGE_UNASSIGNED ||
- left->encoding != BINARYINDEX ||
- right->encoding != BINARYINDEX)
+ !left->couldBeBinaryIndex() ||
+ !right->couldBeBinaryIndex())
continue;
uint64_t eeValue = ee->getValue();
v1=tmp;
}
- if ((left != NULL && left->encoding==BINARYINDEX) &&
- (right != NULL) && right->encoding==BINARYINDEX) {
+ if ((left != NULL && left->couldBeBinaryIndex()) &&
+ (right != NULL) && right->couldBeBinaryIndex()) {
EdgeEncodingType type=(EdgeEncodingType)solver->getTuner()->getVarTunable(v1, v2, EDGEENCODING, &EdgeEncodingDesc);
result->setEncoding(type);
if (type == EDGE_MATCH) {
if (n == NULL) {
n = new EncodingNode(s);
n->setEncoding((ElementEncodingType)solver->getTuner()->getVarTunable(n->getType(), NODEENCODING, &NodeEncodingDesc));
+
encodingMap.put(s, n);
}
n->addElement(e);
Order *order = solver->createOrder(SATC_TOTAL, s);
BooleanEdge b1 = solver->orderConstraint(order, 5, 1);
BooleanEdge b2 = solver->orderConstraint(order, 1, 4);
- solver->addConstraint(b1);
- solver->addConstraint(b2);
+
+ solver->addConstraint(solver->applyLogicalOperation(SATC_OR, b1, solver->applyLogicalOperation(SATC_NOT, b2)));
+ solver->addConstraint(solver->applyLogicalOperation(SATC_OR, b2, solver->applyLogicalOperation(SATC_NOT, b1)));
solver->serialize();
if (solver->solve() == 1){
printf("SAT\n");