Merge branch 'master' of ssh://plrg.eecs.uci.edu/home/git/constraint_compiler
authorbdemsky <bdemsky@uci.edu>
Wed, 5 Jul 2017 23:47:48 +0000 (16:47 -0700)
committerbdemsky <bdemsky@uci.edu>
Wed, 5 Jul 2017 23:47:48 +0000 (16:47 -0700)
src/AST/boolean.c
src/AST/predicate.c
src/AST/predicate.h
src/Backend/orderpair.c [new file with mode: 0644]
src/Backend/orderpair.h [new file with mode: 0644]
src/Backend/satencoder.c
src/Backend/satencoder.h
src/Collections/structs.c
src/Collections/structs.h
src/Encoders/functionencoding.h
src/classlist.h

index bc23b057faffdb4bde94fd007339190f6b3a3a82..3166c5da6d65cb51a0ccdfa39e69f3bafb76a085 100644 (file)
@@ -19,6 +19,9 @@ Boolean* allocBooleanOrder(Order* order, uint64_t first, uint64_t second) {
        tmp->order=order;
        tmp->first=first;
        tmp->second=second;
+       //FIXME: what if client calls this function with the same arguments?
+       //Instead of vector we should keep a hashtable from PAIR->BOOLEANOrder with
+       //asymmetric hash function.  
        pushVectorBoolean(&order->constraints, &tmp->base);
        allocInlineDefVectorBoolean(GETBOOLEANPARENTS(tmp));
        return & tmp -> base;
index ebb3c14f1c8650f411c259e2699ad11ce1f2fc09..116f152673cd3a2d23239a09d46c497b512a9c91 100644 (file)
@@ -1,4 +1,6 @@
 #include "predicate.h"
+#include "boolean.h"
+#include "set.h"
 
 Predicate* allocPredicateOperator(CompOp op, Set ** domain, uint numDomain){
        PredicateOperator* predicate = ourmalloc(sizeof(PredicateOperator));
@@ -16,6 +18,29 @@ Predicate* allocPredicateTable(Table* table, UndefinedBehavior undefBehavior){
        return &predicate->base;
 }
 
+void getEqualitySetIntersection(PredicateOperator* predicate, uint* size, uint64_t* result){
+       ASSERT( predicate->op == EQUALS);
+       //make sure equality has 2 operands
+       ASSERT(getSizeArraySet( &predicate->domains) == 2);
+       *size=0;
+       VectorInt* mems1 = getArraySet(&predicate->domains, 0)->members; 
+       uint size1 = getSizeVectorInt(mems1);
+       VectorInt* mems2 = getArraySet(&predicate->domains, 1)->members;
+       uint size2 = getSizeVectorInt(mems2);
+       //FIXME:This isn't efficient, if we a hashset datastructure for Set, we
+       // can reduce it to O(n), but for now .... HG
+       for(uint i=0; i<size1; i++){
+               uint64_t tmp= getVectorInt(mems1, i);
+               for(uint j=0; j<size2; j++){
+                       if(tmp == getVectorInt(mems2, j)){
+                               result[(*size)++]=tmp;
+                               break;
+                       }
+               }
+       }
+       
+}
+
 void deletePredicate(Predicate* predicate){
        switch(GETPREDICATETYPE(predicate)) {
        case OPERATORPRED: {
index 13e5295bc69c2a10e0e90d8d5ab94ed45cb45de9..22f33d0e2e4bacaac23a6f22ac608e475d36c72c 100644 (file)
@@ -26,5 +26,7 @@ struct PredicateTable {
 
 Predicate* allocPredicateOperator(CompOp op, Set ** domain, uint numDomain);
 Predicate* allocPredicateTable(Table* table, UndefinedBehavior undefBehavior);
+// size and result will be modified by this function!
+void getEqualitySetIntersection(PredicateOperator* predicate, uint* size, uint64_t* result);
 void deletePredicate(Predicate* predicate);
 #endif
diff --git a/src/Backend/orderpair.c b/src/Backend/orderpair.c
new file mode 100644 (file)
index 0000000..2290b36
--- /dev/null
@@ -0,0 +1,12 @@
+#include "orderpair.h"
+
+
+OrderPair* allocOrderPair(uint64_t first, uint64_t second){
+       OrderPair* pair = (OrderPair*) ourmalloc(sizeof(OrderPair));
+       pair->first = first;
+       pair->second = second;
+       return pair;
+}
+void deleteOrderPair(OrderPair* pair){
+       ourfree(pair);
+}
\ No newline at end of file
diff --git a/src/Backend/orderpair.h b/src/Backend/orderpair.h
new file mode 100644 (file)
index 0000000..21bddd7
--- /dev/null
@@ -0,0 +1,23 @@
+/* 
+ * File:   orderpair.h
+ * Author: hamed
+ *
+ * Created on July 1, 2017, 4:22 PM
+ */
+
+#ifndef ORDERPAIR_H
+#define ORDERPAIR_H
+
+#include "classlist.h"
+#include "mymemory.h"
+
+struct OrderPair{
+       uint64_t first;
+       uint64_t second;
+}; 
+
+OrderPair* allocOrderPair(uint64_t first, uint64_t second);
+void deleteOrderPair(OrderPair* pair);
+
+#endif /* ORDERPAIR_H */
+
index 397512148f0470728fb7e0ec8a8ee6aafdd0c62c..dc557b5ee40b7147744e22cc84dc54cebb10c144 100644 (file)
@@ -9,7 +9,9 @@
 #include "tableentry.h"
 #include "table.h"
 #include "order.h"
-
+#include "predicate.h"
+#include "orderpair.h"
+#include "set.h"
 
 SATEncoder * allocSATEncoder() {
        SATEncoder *This=ourmalloc(sizeof (SATEncoder));
@@ -70,7 +72,6 @@ Constraint * getElementValueBinaryIndexConstraint(Element* This, uint64_t value)
                                elemEnc->variables, i);
                }
        }
-       ASSERT(0);
        return NULL;
 }
 
@@ -82,19 +83,20 @@ void encodeAllSATEncoder(CSolver *csolver, SATEncoder * This) {
                encodeConstraintSATEncoder(This, constraint);
        }
        
-       size = getSizeVectorElement(csolver->allElements);
-       for(uint i=0; i<size; i++){
-               Element* element = getVectorElement(csolver->allElements, i);
-               switch(GETELEMENTTYPE(element)){
-                       case ELEMFUNCRETURN: 
-                               encodeFunctionElementSATEncoder(This, (ElementFunction*) element);
-                               break;
-                       default:        
-                               continue;
-                               //ElementSets that aren't used in any constraints/functions
-                               //will be eliminated.
-               }
-       }
+//     FIXME: Following line for element!
+//     size = getSizeVectorElement(csolver->allElements);
+//     for(uint i=0; i<size; i++){
+//             Element* element = getVectorElement(csolver->allElements, i);
+//             switch(GETELEMENTTYPE(element)){
+//                     case ELEMFUNCRETURN: 
+//                             encodeFunctionElementSATEncoder(This, (ElementFunction*) element);
+//                             break;
+//                     default:        
+//                             continue;
+//                             //ElementSets that aren't used in any constraints/functions
+//                             //will be eliminated.
+//             }
+//     }
 }
 
 Constraint * encodeConstraintSATEncoder(SATEncoder *This, Boolean *constraint) {
@@ -163,6 +165,7 @@ Constraint * encodeLogicSATEncoder(SATEncoder *This, BooleanLogic * constraint)
        }
 }
 
+
 Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint) {
        switch( constraint->order->type){
                case PARTIAL:
@@ -175,8 +178,76 @@ Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint)
        return NULL;
 }
 
+
 Constraint * encodeTotalOrderSATEncoder(SATEncoder *This, BooleanOrder * boolOrder){
        ASSERT(boolOrder->order->type == TOTAL);
+       HashTableBoolConst* boolToConsts = boolOrder->order->boolsToConstraints;
+       OrderPair* pair = allocOrderPair(boolOrder->first, boolOrder->second);
+       if( !containsBoolConst(boolToConsts, pair) ){
+               createAllTotalOrderConstraintsSATEncoder(This, boolOrder->order);
+       }
+       Constraint* constraint = getOrderConstraint(boolToConsts, pair);
+       deleteOrderPair(pair);
+       return constraint;
+}
+
+void createAllTotalOrderConstraintsSATEncoder(SATEncoder* This, Order* order){
+       ASSERT(order->type == TOTAL);
+       VectorInt* mems = order->set->members;
+       HashTableBoolConst* table = order->boolsToConstraints;
+       uint size = getSizeVectorInt(mems);
+       for(uint i=0; i<size; i++){
+               uint64_t valueI = getVectorInt(mems, i);
+               for(uint j=i+1; j<size;j++){
+                       uint64_t valueJ = getVectorInt(mems, j);
+                       OrderPair* pairIJ = allocOrderPair(valueI, valueJ);
+                       ASSERT(!containsBoolConst(table, pairIJ));
+                       Constraint* constIJ = getNewVarSATEncoder(This);
+                       putBoolConst(table, pairIJ, constIJ);
+                       for(uint k=j+1; k<size; k++){
+                               uint64_t valueK = getVectorInt(mems, k);
+                               OrderPair* pairJK = allocOrderPair(valueJ, valueK);
+                               OrderPair* pairIK = allocOrderPair(valueI, valueK);
+                               Constraint* constJK, *constIK;
+                               if(!containsBoolConst(table, pairJK)){
+                                       constJK = getNewVarSATEncoder(This);
+                                       putBoolConst(table, pairJK, constJK);
+                               }
+                               if(!containsBoolConst(table, pairIK)){
+                                       constIK = getNewVarSATEncoder(This);
+                                       putBoolConst(table, pairIK, constIK);
+                               }
+                               generateTransOrderConstraintSATEncoder(This, constIJ, constJK, constIK); 
+                       }
+               }
+       }
+}
+
+Constraint* getOrderConstraint(HashTableBoolConst *table, OrderPair *pair){
+       ASSERT(pair->first!= pair->second);
+       Constraint* constraint= getBoolConst(table, pair);
+       ASSERT(constraint!= NULL);
+       if(pair->first > pair->second)
+               return constraint;
+       else
+               return negateConstraint(constraint);
+}
+
+Constraint * generateTransOrderConstraintSATEncoder(SATEncoder *This, Constraint *constIJ,Constraint *constJK,Constraint *constIK){
+       //FIXME: first we should add the the constraint to the satsolver!
+       Constraint *carray[] = {constIJ, constJK, negateConstraint(constIK)};
+       Constraint * loop1= allocArrayConstraint(OR, 3, carray);
+       Constraint * carray2[] = {negateConstraint(constIJ), negateConstraint(constJK), constIK};
+       Constraint * loop2= allocArrayConstraint(OR, 3,carray2 );
+       return allocConstraint(AND, loop1, loop2);
+}
+
+Constraint * encodePartialOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint){
+       // FIXME: we can have this implementation for partial order. Basically,
+       // we compute the transitivity between two order constraints specified by the client! (also can be used
+       // when client specify sparse constraints for the total order!)
+       ASSERT(boolOrder->order->type == PARTIAL);
+/*
        HashTableBoolConst* boolToConsts = boolOrder->order->boolsToConstraints;
        if( containsBoolConst(boolToConsts, boolOrder) ){
                return getBoolConst(boolToConsts, boolOrder);
@@ -206,25 +277,94 @@ Constraint * encodeTotalOrderSATEncoder(SATEncoder *This, BooleanOrder * boolOrd
                }
                return constraint;
        }
-       
+*/     
        return NULL;
 }
 
-Constraint * generateTransOrderConstraintSATEncoder(SATEncoder *This, Constraint *first,Constraint *second,Constraint *third){
-       //FIXME: first we should add the the constraint to the satsolver!
-       return allocConstraint(IMPLIES, allocConstraint(AND, first, second), third);
+Constraint * encodePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint) {
+       switch(GETPREDICATETYPE(constraint->predicate) ){
+               case TABLEPRED:
+                       return encodeTablePredicateSATEncoder(This, constraint);
+               case OPERATORPRED:
+                       return encodeOperatorPredicateSATEncoder(This, constraint);
+               default:
+                       ASSERT(0);
+       }
+       return NULL;
 }
 
-Constraint * encodePartialOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint){
+Constraint * encodeTablePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint){
+       switch(constraint->encoding.type){
+               case ENUMERATEIMPLICATIONS:
+               case ENUMERATEIMPLICATIONSNEGATE:
+                       return encodeEnumTablePredicateSATEncoder(This, constraint);
+               case CIRCUIT:
+                       ASSERT(0);
+                       break;
+               default:
+                       ASSERT(0);
+       }
        return NULL;
 }
 
-Constraint * encodePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint) {
-       //TO IMPLEMENT
-       
+Constraint * encodeEnumTablePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint){
+       VectorTableEntry* entries = &(((PredicateTable*)constraint->predicate)->table->entries);
+       FunctionEncodingType encType = constraint->encoding.type;
+       uint size = getSizeVectorTableEntry(entries);
+       Constraint* constraints[size];
+       for(uint i=0; i<size; i++){
+               TableEntry* entry = getVectorTableEntry(entries, i);
+               if(encType==ENUMERATEIMPLICATIONS && entry->output!= true)
+                       continue;
+               else if(encType==ENUMERATEIMPLICATIONSNEGATE && entry->output !=false)
+                       continue;
+               ArrayElement* inputs = &constraint->inputs;
+               uint inputNum =getSizeArrayElement(inputs);
+               Constraint* carray[inputNum];
+               Element* el = getArrayElement(inputs, i);
+               for(uint j=0; j<inputNum; j++){
+                       carray[j] = getElementValueConstraint(el, entry->inputs[j]);
+               }
+               constraints[i]=allocArrayConstraint(AND, inputNum, carray);
+       }
+       Constraint* result= allocArrayConstraint(OR, size, constraints);
+       //FIXME: if it didn't match with any entry
+       return encType==ENUMERATEIMPLICATIONS? result: negateConstraint(result);
+}
+
+Constraint * encodeOperatorPredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint){
+       switch(constraint->encoding.type){
+               case ENUMERATEIMPLICATIONS:
+                       return encodeEnumOperatorPredicateSATEncoder(This, constraint);
+               case CIRCUIT:
+                       ASSERT(0);
+                       break;
+               default:
+                       ASSERT(0);
+       }
        return NULL;
 }
 
+Constraint * encodeEnumOperatorPredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint){
+       ASSERT(GETPREDICATETYPE(constraint)==OPERATORPRED);
+       PredicateOperator* predicate = (PredicateOperator*)constraint->predicate;
+       ASSERT(predicate->op == EQUALS); //For now, we just only support equals
+       //getting maximum size of in common elements between two sets!
+       uint size=getSizeVectorInt( getArraySet( &predicate->domains, 0)->members);
+       uint64_t commonElements [size];
+       getEqualitySetIntersection(predicate, &size, commonElements);
+       Constraint*  carray[size];
+       Element* elem1 = getArrayElement( &constraint->inputs, 0);
+       Element* elem2 = getArrayElement( &constraint->inputs, 1);
+       for(uint i=0; i<size; i++){
+               
+               carray[i] =  allocConstraint(AND, getElementValueConstraint(elem1, commonElements[i]),
+                       getElementValueConstraint(elem2, commonElements[i]) );
+       }
+       //FIXME: the case when there is no intersection ....
+       return allocArrayConstraint(OR, size, carray);
+}
+
 Constraint* encodeFunctionElementSATEncoder(SATEncoder* encoder, ElementFunction *This){
        switch(GETFUNCTIONTYPE(This->function)){
                case TABLEFUNC:
index 32fb6fae70343d1db989c1a9efcb9a9dd8ac1e06..6963feefcfe83da08bd6e75c08e475887d3c15bd 100644 (file)
@@ -16,12 +16,19 @@ Constraint * getNewVarSATEncoder(SATEncoder *This);
 void getArrayNewVarsSATEncoder(SATEncoder* encoder, uint num, Constraint **carray);
 Constraint * encodeConstraintSATEncoder(SATEncoder *This, Boolean *constraint);
 Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint);
-Constraint * generateTransOrderConstraintSATEncoder(SATEncoder *This, Constraint *first,Constraint *second,Constraint *third);
+void createAllTotalOrderConstraintsSATEncoder(SATEncoder* This, Order* order);
+Constraint* getOrderConstraint(HashTableBoolConst *table, OrderPair *pair);
+Constraint * generateTransOrderConstraintSATEncoder(SATEncoder *This, Constraint *constIJ,Constraint *constJK,Constraint *constIK);
 Constraint * encodeTotalOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint);
 Constraint * encodePartialOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint);
 Constraint * encodeVarSATEncoder(SATEncoder *This, BooleanVar * constraint);
 Constraint * encodeLogicSATEncoder(SATEncoder *This, BooleanLogic * constraint);
 Constraint * encodePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint);
+Constraint * encodeTablePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint);
+Constraint * encodeEnumTablePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint);
+Constraint * encodeOperatorPredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint);
+Constraint * encodeEnumOperatorPredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint);
+
 Constraint * getElementValueBinaryIndexConstraint(Element* This, uint64_t value);
 Constraint * getElementValueConstraint(Element* This, uint64_t value);
 
index 6fd7ceaa804e63c973074be135d796c36a75b184..58d37286193327f51491701a0f1a7bb2c15bdcdc 100644 (file)
@@ -1,6 +1,6 @@
 #include "structs.h"
 #include "mymemory.h"
-#include "order.h"
+#include "orderpair.h"
 
 VectorImpl(Table, Table *, 4);
 VectorImpl(Set, Set *, 4);
@@ -22,12 +22,14 @@ inline bool Ptr_equals(void * key1, void * key2) {
        return key1 == key2;
 }
 
-inline unsigned int BooleanOrder_hash_Function(BooleanOrder* This){
-       return This->first ^ This->second;
+inline unsigned int order_pair_hash_Function(OrderPair* This){
+       uint64_t x=This->first^This->second;
+       uint64_t a=This->first&This->second;
+       return (uint)((x<<4)^(a));
 }
 
-inline unsigned int BooleanOrder_equals(BooleanOrder* key1, BooleanOrder* key2){
+inline unsigned int order_pair_equals(OrderPair* key1, OrderPair* key2){
        return key1->first== key2->first && key1->second == key2->second;
 }
 
-HashTableImpl(BoolConst, BooleanOrder *, Constraint *, BooleanOrder_hash_Function, BooleanOrder_equals);
+HashTableImpl(BoolConst, OrderPair *, Constraint *, order_pair_hash_Function, order_pair_equals);
index 86db3ed684870419f3f11fed102056a8c1256d5b..a45eb132cf1eb2c53ae99dd4e5bd259b69ac59cd 100644 (file)
@@ -26,7 +26,7 @@ VectorDef(Int, uint64_t, 4);
 
 
 HashTableDef(Void, void *, void *);
-HashTableDef(BoolConst, BooleanOrder *, Constraint *);
+HashTableDef(BoolConst, OrderPair *, Constraint *);
 
 HashSetDef(Void, void *);
 
index a3521396f04abef9689b7371f4905e88b430dd14..41d99761e6958309e66f946e1e428c2e89639cbb 100644 (file)
@@ -3,7 +3,7 @@
 #include "classlist.h"
 
 enum FunctionEncodingType {
-       FUNC_UNASSIGNED, ENUMERATEIMPLICATIONS, CIRCUIT
+       FUNC_UNASSIGNED, ENUMERATEIMPLICATIONS, ENUMERATEIMPLICATIONSNEGATE, CIRCUIT
 };
 
 typedef enum FunctionEncodingType FunctionEncodingType;
index 3c7d071a66221d25dffd679d5465284efe7cc769..c02268df29bebbe49d56cfca2fb272b297bc7321 100644 (file)
@@ -70,6 +70,9 @@ typedef struct Table Table;
 struct Order;
 typedef struct Order Order;
 
+struct OrderPair;
+typedef struct OrderPair OrderPair;
+
 struct ElementEncoding;
 typedef struct ElementEncoding ElementEncoding;