#include "structs.h"
#include "set.h"
#include "constraint.h"
+#include "function.h"
+#include "table.h"
Element *allocElementSet(Set * s) {
ElementSet * tmp=(ElementSet *)ourmalloc(sizeof(ElementSet));
return &tmp->base;
}
-uint getElementSize(Element* This){
+Set* getElementSet(Element* This){
switch(GETELEMENTTYPE(This)){
case ELEMSET:
- return getSetSize( ((ElementSet*)This)->set );
- break;
+ return ((ElementSet*)This)->set;
case ELEMFUNCRETURN:
- ASSERT(0);
+ ;//Nope is needed for label assignment. i.e. next instruction isn't
+ Function* func = ((ElementFunction*)This)->function;
+ switch(GETFUNCTIONTYPE(func)){
+ case TABLEFUNC:
+ return ((FunctionTable*)func)->table->range;
+ case OPERATORFUNC:
+ return ((FunctionOperator*)func)->range;
+ default:
+ ASSERT(0);
+ }
default:
ASSERT(0);
}
- return -1;
+ ASSERT(0);
+ return NULL;
}
+uint getElemEncodingInUseVarsSize(ElementEncoding* This){
+ uint size=0;
+ for(uint i=0; i<This->encArraySize; i++){
+ if(isinUseElement(This, i)){
+ size++;
+ }
+ }
+ return size;
+}
-Constraint * getElementValueConstraint(Element* This, uint64_t value) {
- switch(GETELEMENTTYPE(This)){
- case ELEMSET:
- ; //Statement is needed for a label and This is a NOPE
- uint size = getSetSize(((ElementSet*)This)->set);
- //FIXME
- for(uint i=0; i<size; i++){
- if( getElementEncoding(This)->encodingArray[i]==value){
- return generateBinaryConstraint(getElementEncoding(This)->numVars,
- getElementEncoding(This)->variables, i);
- }
- }
- break;
- case ELEMFUNCRETURN:
- ASSERT(0);
- break;
- default:
- ASSERT(0);
+
+Constraint * getElementValueBinaryIndexConstraint(Element* This, uint64_t value) {
+ ASTNodeType type = GETELEMENTTYPE(This);
+ ASSERT(type == ELEMSET || type == ELEMFUNCRETURN);
+ ElementEncoding* elemEnc = getElementEncoding(This);
+ for(uint i=0; i<elemEnc->encArraySize; i++){
+ if( isinUseElement(elemEnc, i) && elemEnc->encodingArray[i]==value){
+ return generateBinaryConstraint(elemEnc->numVars,
+ elemEnc->variables, i);
+ }
}
ASSERT(0);
return NULL;
#include "boolean.h"
#define GETELEMENTTYPE(o) GETASTNODETYPE(o)
-#define GETELEMENTPARENTS(o) (&((Element*)o)->parents)
-
+#define GETELEMENTPARENTS(o) (&((Element*)o)->parents)
struct Element {
ASTNode base;
VectorASTNode parents;
Element * allocElementSet(Set *s);
Element* allocElementFunction(Function * function, Element ** array, uint numArrays, Boolean * overflowstatus);
void deleteElement(Element *This);
-
+Set* getElementSet(Element* This);
static inline ElementEncoding* getElementEncoding(Element* This){
switch(GETELEMENTTYPE(This)){
case ELEMSET:
return &func->functionencoding;
}
-uint getElementSize(Element* This);
-Constraint * getElementValueConstraint(Element* This, uint64_t value);
+uint getElemEncodingInUseVarsSize(ElementEncoding* This);
+Constraint * getElementValueBinaryIndexConstraint(Element* This, uint64_t value);
#endif
}
void addOrderConstraint(Order* order, BooleanOrder* constraint){
- pushVectorBoolean( &order->constraints, (Boolean) constraint);
+ pushVectorBoolean( &order->constraints, (Boolean*) constraint);
}
void setOrderEncodingType(Order* order, OrderEncodingType type){
ourfree(This);
}
-void encodeAllSATEncoder(SATEncoder * This, CSolver *csolver) {
+void initializeConstraintVars(CSolver* csolver, SATEncoder* This){
+ uint size = getSizeVectorElement(csolver->allElements);
+ for(uint i=0; i<size; i++){
+ Element* element = getVectorElement(csolver->allElements, i);
+ generateElementEncodingVariables(This,getElementEncoding(element));
+ }
+}
+
+void encodeAllSATEncoder(CSolver *csolver, SATEncoder * This) {
VectorBoolean *constraints=csolver->constraints;
uint size=getSizeVectorBoolean(constraints);
for(uint i=0;i<size;i++) {
case ENUMERATEIMPLICATIONS:
return encodeEnumTableElemFunctionSATEncoder(encoder, This);
break;
+ case CIRCUIT:
+ ASSERT(0);
+ break;
default:
ASSERT(0);
}
return NULL;
}
-Constraint* encodeOperatorElementFunctionSATEncoder(SATEncoder* encoder,ElementFunction* This){
+Constraint* encodeOperatorElementFunctionSATEncoder(SATEncoder* encoder, ElementFunction* This){
+ //FIXME: for now it just adds/substracts inputs exhustively
return NULL;
}
Element* el= getArrayElement(elements, i);
Constraint* carray[inputNum];
for(uint j=0; j<inputNum; j++){
- carray[inputNum] = getElementValueConstraint(el, entry->inputs[j]);
+ carray[inputNum] = getElementValueBinaryIndexConstraint(el, entry->inputs[j]);
}
Constraint* row= allocConstraint(IMPLIES, allocArrayConstraint(AND, inputNum, carray),
- getElementValueConstraint((Element*)This, entry->output));
+ getElementValueBinaryIndexConstraint((Element*)This, entry->output));
constraints[i]=row;
}
Constraint* result = allocArrayConstraint(OR, size, constraints);
}
SATEncoder * allocSATEncoder();
void deleteSATEncoder(SATEncoder *This);
-void encodeAllSATEncoder(SATEncoder *This, CSolver *csolver);
+void initializeConstraintVars(CSolver* csolver, SATEncoder* This);
+void encodeAllSATEncoder(CSolver *csolver, SATEncoder *This);
Constraint * getNewVarSATEncoder(SATEncoder *This);
void getArrayNewVarsSATEncoder(SATEncoder* encoder, uint num, Constraint **carray);
Constraint * encodeConstraintSATEncoder(SATEncoder *This, Boolean *constraint);
This->encodingArray=NULL;
This->inUseArray=NULL;
This->numVars=0;
+ This->encArraySize=0;
}
void deleteElementEncoding(ElementEncoding *This) {
void allocEncodingArrayElement(ElementEncoding *This, uint size) {
This->encodingArray=ourcalloc(1, sizeof(uint64_t)*size);
+ This->encArraySize=size;
}
void allocInUseArrayElement(ElementEncoding *This, uint size) {
void generateBinaryIndexEncodingVars(SATEncoder* encoder, ElementEncoding* This){
ASSERT(This->type==BINARYINDEX);
- uint size = getElementSize(This->element);
+ uint size = getElemEncodingInUseVarsSize(This);
allocElementConstraintVariables(This, NUMBITS(size-1));
getArrayNewVarsSATEncoder(encoder, This->numVars, This->variables);
}
Constraint ** variables;/* List Variables Used To Encode Element */
uint64_t * encodingArray; /* List the Variables in the appropriate order */
uint64_t * inUseArray;/* Bitmap to track variables in use */
+ uint encArraySize;
uint numVars; /* Number of variables */
};
void baseBinaryIndexElementAssign(ElementEncoding *This);
void allocEncodingArrayElement(ElementEncoding *This, uint size);
void allocInUseArrayElement(ElementEncoding *This, uint size);
-
+//FIXME:
+//uint addNewVariableToEncodingArray(ElementEncoding* This, uint64_t);
static inline bool isinUseElement(ElementEncoding *This, uint offset) {
return (This->inUseArray[(offset>>6)] >> (offset & 63)) &0x1;
}
#include <strings.h>
-void naiveEncodingDecision(CSolver* csolver, SATEncoder* encoder){
+void naiveEncodingDecision(CSolver* csolver){
uint size = getSizeVectorElement(csolver->allElements);
for(uint i=0; i<size; i++){
Element* element = getVectorElement(csolver->allElements, i);
+ //Whether it's a ElementFunction or ElementSet we should do the followings:
+ setElementEncodingType(getElementEncoding(element), BINARYINDEX);
+ baseBinaryIndexElementAssign(getElementEncoding(element));
switch(GETELEMENTTYPE(element)){
case ELEMSET:
- setElementEncodingType(getElementEncoding(element), BINARYINDEX);
- //FIXME:Should be moved to SATEncoder
- baseBinaryIndexElementAssign(getElementEncoding(element));
- generateElementEncodingVariables(encoder,getElementEncoding(element));
- //
+ //FIXME: Move next line to satEncoderInitializer!
+// generateElementEncodingVariables(encoder,getElementEncoding(element));
break;
case ELEMFUNCRETURN:
setFunctionEncodingType(getElementFunctionEncoding((ElementFunction*)element),
void baseBinaryIndexElementAssign(ElementEncoding *This) {
Element * element=This->element;
- ASSERT(element->type == ELEMSET);
- Set * set= ((ElementSet*)element)->set;
+ Set * set= getElementSet(element);
ASSERT(set->isRange==false);
uint size=getSizeVectorInt(set->members);
uint encSize=NEXTPOW2(size);
allocEncodingArrayElement(This, encSize);
allocInUseArrayElement(This, encSize);
-
for(uint i=0;i<size;i++) {
This->encodingArray[i]=getVectorInt(set->members, i);
setInUseElement(This, i);
}
- This->numVars = NUMBITS(size-1);
- This->variables = ourmalloc(sizeof(Constraint*)* This->numVars);
-
-
}
* @param csolver
* @param encoder
*/
-void naiveEncodingDecision(CSolver* csolver, SATEncoder* encoder);
+void naiveEncodingDecision(CSolver* csolver);
void baseBinaryIndexElementAssign(ElementEncoding *This);
#endif
#include "order.h"
#include "table.h"
#include "function.h"
+#include "satencoder.h"
CSolver * allocCSolver() {
CSolver * tmp=(CSolver *) ourmalloc(sizeof(CSolver));
pushVectorBoolean(solver->allBooleans,constraint);
return constraint;
}
+
+void encode(CSolver* solver){
+ naiveEncodingDecision(solver);
+ SATEncoder* satEncoder = allocSATEncoder();
+ initializeConstraintVars(solver, satEncoder);
+ encodeAllSATEncoder(solver, satEncoder);
+ //For now, let's just delete it, and in future for doing queries
+ //we may need it.
+ deleteSATEncoder(satEncoder);
+}
\ No newline at end of file
/** This function instantiates a boolean on two items in an order. */
Boolean * orderConstraint(CSolver *, Order * order, uint64_t first, uint64_t second);
+
+/** When everything is done, the client calls this function and then csolver starts to encode*/
+void encode(CSolver*);
#endif