From 0f956ba8d86843b001d95f1e12b7fefcfd477938 Mon Sep 17 00:00:00 2001 From: Hamed Date: Tue, 8 Aug 2017 17:38:46 -0700 Subject: [PATCH] Adding new API for defining an order constraint on two orders... --- src/AST/boolean.c | 14 ++++++++++++++ src/AST/boolean.h | 10 ++++++++++ src/AST/ops.h | 2 +- src/classlist.h | 1 + src/csolver.c | 6 ++++++ src/csolver.h | 2 ++ 6 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/AST/boolean.c b/src/AST/boolean.c index 09ec2ae..a984515 100644 --- a/src/AST/boolean.c +++ b/src/AST/boolean.c @@ -28,6 +28,20 @@ Boolean* allocBooleanOrder(Order* order, uint64_t first, uint64_t second) { return & This -> base; } +Boolean * allocBooleanInterOrder(Order * order1, uint64_t first,Order* order2, uint64_t second){ + BooleanInterOrder* This=(BooleanInterOrder *) ourmalloc(sizeof (BooleanInterOrder)); + GETBOOLEANTYPE(This)=INTERORDERCONST; + GETBOOLEANVALUE(This) = BV_UNDEFINED; + GETBOOLEANPOLARITY(This) = P_UNDEFINED; + This->order1=order1; + This->order2 = order2; + This->first=first; + This->second=second; + pushVectorBoolean(&order1->constraints, &This->base); + initDefVectorBoolean(GETBOOLEANPARENTS(This)); + return & This -> base; +} + Boolean * allocBooleanPredicate(Predicate * predicate, Element ** inputs, uint numInputs, Boolean* undefinedStatus){ BooleanPredicate* This = (BooleanPredicate*) ourmalloc(sizeof(BooleanPredicate)); GETBOOLEANTYPE(This)= PREDICATEOP; diff --git a/src/AST/boolean.h b/src/AST/boolean.h index b24fa3f..eb3b02c 100644 --- a/src/AST/boolean.h +++ b/src/AST/boolean.h @@ -31,6 +31,15 @@ struct BooleanOrder { uint64_t second; }; +//I don't like the name, we may want to change it later --HG +struct BooleanInterOrder{ + Boolean base; + Order* order1; + uint64_t first; + Order* order2; + uint64_t second; +}; + struct BooleanVar { Boolean base; VarType vtype; @@ -53,6 +62,7 @@ struct BooleanPredicate { Boolean * allocBooleanVar(VarType t); Boolean * allocBooleanOrder(Order * order, uint64_t first, uint64_t second); +Boolean * allocBooleanInterOrder(Order * order1, uint64_t first,Order* order2, uint64_t second); Boolean * allocBooleanPredicate(Predicate * predicate, Element ** inputs, uint numInputs, Boolean* undefinedStatus); Boolean * allocBooleanLogicArray(CSolver *solver, LogicOp op, Boolean ** array, uint asize); void deleteBoolean(Boolean * This); diff --git a/src/AST/ops.h b/src/AST/ops.h index 9e8113d..e607898 100644 --- a/src/AST/ops.h +++ b/src/AST/ops.h @@ -35,7 +35,7 @@ typedef enum FunctionType FunctionType; enum PredicateType {TABLEPRED, OPERATORPRED}; typedef enum PredicateType PredicateType; -enum ASTNodeType {ORDERCONST, BOOLEANVAR, LOGICOP, PREDICATEOP, ELEMSET, ELEMFUNCRETURN, ELEMCONST}; +enum ASTNodeType {INTERORDERCONST, ORDERCONST, BOOLEANVAR, LOGICOP, PREDICATEOP, ELEMSET, ELEMFUNCRETURN, ELEMCONST}; typedef enum ASTNodeType ASTNodeType; enum Polarity {P_UNDEFINED, P_TRUE, P_FALSE, P_BOTHTRUEFALSE}; diff --git a/src/classlist.h b/src/classlist.h index 2079d9b..0e3d287 100644 --- a/src/classlist.h +++ b/src/classlist.h @@ -22,6 +22,7 @@ struct SATEncoder; typedef struct SATEncoder SATEncoder; typedef struct BooleanOrder BooleanOrder; +typedef struct BooleanInterOrder BooleanInterOrder; typedef struct BooleanVar BooleanVar; typedef struct BooleanLogic BooleanLogic; typedef struct BooleanPredicate BooleanPredicate; diff --git a/src/csolver.c b/src/csolver.c index d440aad..126caa6 100644 --- a/src/csolver.c +++ b/src/csolver.c @@ -193,6 +193,12 @@ Boolean * orderConstraint(CSolver *This, Order * order, uint64_t first, uint64_t return constraint; } +Boolean * interOrderConstraint(CSolver * This, Order * order1, uint64_t first, Order* order2, uint64_t second){ + Boolean* constraint = allocBooleanInterOrder(order1, first, order2, second); + pushVectorBoolean(This->allBooleans, constraint); + return constraint; +} + int startEncoding(CSolver* This){ naiveEncodingDecision(This); SATEncoder* satEncoder = This->satEncoder; diff --git a/src/csolver.h b/src/csolver.h index b35f801..1c76ac8 100644 --- a/src/csolver.h +++ b/src/csolver.h @@ -121,6 +121,8 @@ Order * createOrder(CSolver *, OrderType type, Set * set); /** This function instantiates a boolean on two items in an order. */ Boolean * orderConstraint(CSolver *, Order * order, uint64_t first, uint64_t second); +Boolean * interOrderConstraint(CSolver *, Order * order1, uint64_t first, Order* order2, uint64_t second); + /** When everything is done, the client calls this function and then csolver starts to encode*/ int startEncoding(CSolver*); -- 2.34.1