#include "structs.h"
#include "csolver.h"
#include "element.h"
+#include "order.h"
Boolean* allocBoolean(VarType t) {
BooleanVar* tmp=(BooleanVar *) ourmalloc(sizeof (BooleanVar));
tmp->order=order;
tmp->first=first;
tmp->second=second;
- tmp->var=NULL;
+ pushVectorBoolean(&order->constraints, &tmp->base);
allocInlineDefVectorBoolean(GETBOOLEANPARENTS(tmp));
return & tmp -> base;
}
Order* order;
uint64_t first;
uint64_t second;
- Constraint* var;
};
struct BooleanVar {
allocInlineDefVectorBoolean(& order->constraints);
order->type=type;
allocOrderEncoding(& order->order, order);
+ order->boolsToConstraints = allocHashTableBoolConst(HT_INITIAL_CAPACITY, HT_DEFAULT_FACTOR);
return order;
}
void deleteOrder(Order* order){
deleteVectorArrayBoolean(& order->constraints);
deleteOrderEncoding(& order->order);
+ deleteHashTableBoolConst(order->boolsToConstraints);
ourfree(order);
}
struct Order {
OrderType type;
Set * set;
+ HashTableBoolConst* boolsToConstraints;
VectorBoolean constraints;
OrderEncoding order;
};
#include "predicate.h"
-Predicate* allocPredicate(CompOp op, Set ** domain, uint numDomain){
+Predicate* allocPredicateOperator(CompOp op, Set ** domain, uint numDomain){
PredicateOperator* predicate = ourmalloc(sizeof(PredicateOperator));
GETPREDICATETYPE(predicate)=OPERATORPRED;
allocInlineArrayInitSet(&predicate->domains, domain, numDomain);
return &predicate->base;
}
+Predicate* allocPredicateTable(Table* table, UndefinedBehavior undefBehavior){
+ PredicateTable* predicate = ourmalloc(sizeof(PredicateTable));
+ GETPREDICATETYPE(predicate) = TABLEPRED;
+ predicate->table=table;
+ predicate->undefinedbehavior=undefBehavior;
+ return predicate;
+}
+
void deletePredicate(Predicate* predicate){
switch(GETPREDICATETYPE(predicate)) {
case OPERATORPRED: {
};
-Predicate* allocPredicate(CompOp op, Set ** domain, uint numDomain);
+Predicate* allocPredicateOperator(CompOp op, Set ** domain, uint numDomain);
+Predicate* allocPredicateTable(Table* table, UndefinedBehavior undefBehavior);
void deletePredicate(Predicate* predicate);
#endif
}
Constraint * encodeOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint) {
- if(constraint->var== NULL){
- constraint->var = getNewVarSATEncoder(This);
+ switch( constraint->order->type){
+ case PARTIAL:
+ return encodePartialOrderSATEncoder(This, constraint);
+ case TOTAL:
+ return encodeTotalOrderSATEncoder(This, constraint);
+ default:
+ ASSERT(0);
}
- return constraint->var;
+ return NULL;
+}
+
+Constraint * encodeTotalOrderSATEncoder(SATEncoder *This, BooleanOrder * boolOrder){
+ ASSERT(boolOrder->order->type == TOTAL);
+ HashTableBoolConst* boolToConsts = boolOrder->order->boolsToConstraints;
+ if( containsBoolConst(boolToConsts, boolOrder) ){
+ return getBoolConst(boolToConsts, boolOrder);
+ } else {
+ Constraint* constraint = getNewVarSATEncoder(This);
+ putBoolConst(boolToConsts,boolOrder, constraint);
+ VectorBoolean* orderConstrs = &boolOrder->order->constraints;
+ uint size= getSizeVectorBoolean(orderConstrs);
+ for(uint i=0; i<size; i++){
+ ASSERT(GETBOOLEANTYPE( getVectorBoolean(orderConstrs, i)) == ORDERCONST );
+ BooleanOrder* tmp = (BooleanPredicate*)getVectorBoolean(orderConstrs, i);
+ BooleanOrder* newBool;
+ Constraint* first, second;
+ if(tmp->second==boolOrder->first){
+ newBool = (BooleanOrder*)allocBooleanOrder(tmp->order,tmp->first,boolOrder->second);
+ first = encodeTotalOrderSATEncoder(This, tmp);
+ second = constraint;
+
+ }else if (boolOrder->second == tmp->first){
+ newBool = (BooleanOrder*)allocBooleanOrder(tmp->order,boolOrder->first,tmp->second);
+ first = constraint;
+ second = encodeTotalOrderSATEncoder(This, tmp);
+ }else
+ continue;
+ Constraint* transConstr= encodeTotalOrderSATEncoder(This, newBool);
+ generateTransOrderConstraintSATEncoder(This, first, second, transConstr );
+ }
+ 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 * encodePartialOrderSATEncoder(SATEncoder *This, BooleanOrder * constraint){
+ return NULL;
}
Constraint * encodePredicateSATEncoder(SATEncoder * This, BooleanPredicate * constraint) {
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);
+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);
VectorImpl(TableEntry, TableEntry *, 4);
VectorImpl(ASTNode, ASTNode *, 4);
VectorImpl(Int, uint64_t, 4);
+
+HashTableImpl(BoolConst, BooleanOrder *, Constraint *, BooleanOrder_hash_Function, BooleanOrder_equals);
return key1 == key2;
}
+inline unsigned int BooleanOrder_hash_Function(BooleanOrder* This){
+ return ((This->first+This->second)(This->first+This->second+1))/2 + This->second;
+}
+
+inline unsigned int BooleanOrder_equals(BooleanOrder* key1, BooleanOrder* key2){
+ return key1->first== key2->first && key1->second == key2->second;
+}
+
HashTableDef(Void, void *, void *, Ptr_hash_function, Ptr_equals);
-HashSetDef(Void, void *, Ptr_hash_function, Ptr_equals);
+HashTableDef(BoolConst, BooleanOrder *, Constraint *, BooleanOrder_hash_Function, BooleanOrder_equals);
+HashSetDef(Void, void *, Ptr_hash_function, Ptr_equals);
#endif
}
Predicate * createPredicateOperator(CSolver *solver, CompOp op, Set ** domain, uint numDomain) {
- Predicate* predicate= allocPredicate(op, domain,numDomain);
+ Predicate* predicate= allocPredicateOperator(op, domain,numDomain);
pushVectorPredicate(solver->allPredicates, predicate);
return predicate;
}