edits
authorbdemsky <bdemsky@uci.edu>
Mon, 19 Jun 2017 20:32:50 +0000 (13:32 -0700)
committerbdemsky <bdemsky@uci.edu>
Mon, 19 Jun 2017 20:32:50 +0000 (13:32 -0700)
src/Encoders/elementencoding.c
src/Encoders/elementencoding.h
src/Encoders/naiveelementencoder.c
src/common.h

index 8056812863aa4b619f8c0114a8fab29c21518a64..fb2ce4aa4ea2536843c6812bd25283d309223926 100644 (file)
@@ -15,6 +15,15 @@ void deleteElementEncoding(ElementEncoding *This) {
                ourfree(This->variables);
        if (This->encodingArray!=NULL)
                ourfree(This->encodingArray);
+       if (This->inUseArray!=NULL)
+               ourfree(This->inUseArray);
        ourfree(This);
 }
 
+void allocEncodingArrayElement(ElementEncoding *This, uint size) {
+       This->encodingArray=ourcalloc(1, sizeof(uint64_t)*size);
+}
+
+void allocInUseArrayElement(ElementEncoding *This, uint size) {
+       This->inUseArray=ourcalloc(1, size >> 6);
+}
index d6de95ac0a6d43ff7b7fd871c47ed33e1590ce41..8d142dab13ecd5b2f7d8345220166f3c3f39e333 100644 (file)
@@ -13,11 +13,21 @@ struct ElementEncoding {
        Element * element;
        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 numVars; /* Number of variables */
 };
 
 ElementEncoding * allocElementEncoding(ElementEncodingType type, Element *element);
 void deleteElementEncoding(ElementEncoding *This);
 void baseBinaryIndexElementAssign(ElementEncoding *This);
+void allocEncodingArrayElement(ElementEncoding *This, uint size);
+void allocInUseArrayElement(ElementEncoding *This, uint size);
 
+inline bool isinUseElement(ElementEncoding *This, uint offset) {
+       return (This->inUseArray[(offset>>6)] >> (offset & 63)) &0x1;
+}
+
+inline void setInUseElement(ElementEncoding *This, uint offset) {
+       This->inUseArray[(offset>>6)] |= 1 << (offset & 63);
+}
 #endif
index ec3be7d731d589d33771269e83559d3cf58730ca..4d522352d00fb0189e771c602560050f221c22ff 100644 (file)
@@ -4,15 +4,20 @@
 #include "set.h"
 #include "common.h"
 #include "struct.h"
+#include <strings.h>
 
 void baseBinaryIndexElementAssign(ElementEncoding *This) {
        Element * element=This->element;
        Set * set=element->set;
        ASSERT(set->isRange==false);
        uint size=getSizeVectorInt(set->members);
-       This->encodingArray=ourmalloc(sizeof(uint64_t)*size);
+       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->type=BINARYINDEX;
 }
+
index d4d86c60d737da55c3a8bd632b9189c37102ecc8..9b7848583f0eebd17bb0c23303af3dfb2590c4fb 100644 (file)
@@ -27,7 +27,7 @@ extern int switch_alloc;
 
 #define model_print_err(fmt, ...) do { model_dprintf(model_err, fmt, ## __VA_ARGS__); } while (0)
 
-
+#define NEXTPOW2(x) (1<<(sizeof(uint)*8-__builtin_clz(x-1)))
 
 #ifdef CONFIG_DEBUG
 #define DEBUG(fmt, ...) do { model_print("*** %15s:%-4d %25s() *** " fmt, __FILE__, __LINE__, __func__, ## __VA_ARGS__); } while (0)