ae330b853dcedca2cbeafa0f804c513a56de258a
[satune.git] / src / ASTAnalyses / Encoding / encodinggraph.h
1 #ifndef ENCODINGGRAPH_H
2 #define ENCODINGGRAPH_H
3 #include "classlist.h"
4 #include "structs.h"
5 #include "graphstructs.h"
6
7 #define FUDGEFACTOR 1.2
8 #define CONVERSIONFACTOR  0.5
9
10 class EncodingGraph {
11 public:
12         EncodingGraph(CSolver *solver);
13         ~EncodingGraph();
14         void buildGraph();
15         void encode();
16         void validate();
17
18         CMEMALLOC;
19 private:
20         CSolver *solver;
21         HashtableEncoding encodingMap;
22         HashtableEdge edgeMap;
23         Vector<EncodingEdge *> edgeVector;
24         HashsetElement discovered;
25         HashtableNodeToSubGraph graphMap;
26         HashsetEncodingSubGraph subgraphs;
27
28         void encodeParent(Element *e);
29         void decideEdges();
30         void mergeNodes(EncodingNode *first, EncodingNode *second);
31         void processElement(Element *e);
32         void processFunction(ElementFunction *f);
33         void processPredicate(BooleanPredicate *b);
34         EncodingNode *createNode(Element *e);
35         EncodingNode *getNode(Element *e);
36         EncodingEdge *getEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
37         EncodingEdge *createEdge(EncodingNode *left, EncodingNode *right, EncodingNode *dst);
38 };
39
40 class EncodingNode {
41 public:
42         EncodingNode(Set *_s);
43         void addElement(Element *e);
44         uint getSize() const;
45         uint64_t getIndex(uint index);
46         VarType getType() const;
47         double measureSimilarity(EncodingNode *node);
48         void setEncoding(ElementEncodingType e) {encoding = e;}
49         ElementEncodingType getEncoding() {return encoding;}
50         bool itemExists(uint64_t item);
51         bool couldBeBinaryIndex() {return encoding == BINARYINDEX || encoding == ELEM_UNASSIGNED;}
52         CMEMALLOC;
53 private:
54         Set *s;
55         HashsetElement elements;
56         HashsetEncodingEdge edges;
57         ElementEncodingType encoding;
58         friend class EncodingGraph;
59         friend class EncodingSubGraph;
60 };
61
62 enum EdgeEncodingType { EDGE_UNASSIGNED, EDGE_BREAK, EDGE_MATCH};
63 typedef enum EdgeEncodingType EdgeEncodingType;
64
65 class EncodingEdge {
66 public:
67         EncodingEdge(EncodingNode *_l, EncodingNode *_r);
68         EncodingEdge(EncodingNode *_l, EncodingNode *_r, EncodingNode *_d);
69         void setEncoding(EdgeEncodingType e) {encoding = e;}
70         uint64_t getValue() const;
71         EdgeEncodingType getEncoding() {return encoding;}
72
73         CMEMALLOC;
74
75 private:
76         EncodingNode *left;
77         EncodingNode *right;
78         EncodingNode *dst;
79         EdgeEncodingType encoding;
80         uint numArithOps;
81         uint numEquals;
82         uint numComparisons;
83         friend uint hashEncodingEdge(EncodingEdge *edge);
84         friend bool equalsEncodingEdge(EncodingEdge *e1, EncodingEdge *e2);
85         friend class EncodingGraph;
86         friend class EncodingSubGraph;
87 };
88
89 #endif