[5f4d9c3] | 1 | #ifndef _SGRAPH_HH |
---|
| 2 | #define _SGRAPH_HH |
---|
| 3 | |
---|
| 4 | #include <stdio.h> |
---|
| 5 | |
---|
| 6 | #include <list> |
---|
| 7 | #include <vector> |
---|
| 8 | #include <bitset> |
---|
| 9 | |
---|
| 10 | #include "const.hh" |
---|
| 11 | #include "thesymbols.hh" |
---|
| 12 | |
---|
| 13 | |
---|
| 14 | class MNode; |
---|
| 15 | |
---|
| 16 | |
---|
| 17 | struct Arc |
---|
| 18 | { |
---|
| 19 | int dst; |
---|
| 20 | Role role; |
---|
| 21 | int anc; |
---|
| 22 | |
---|
| 23 | Arc(int d, Role r, int a) : dst(d), role(r), anc(a) {}; |
---|
| 24 | }; |
---|
| 25 | |
---|
| 26 | |
---|
| 27 | struct NodeProp |
---|
| 28 | { |
---|
| 29 | bitset<MAXTYPES> required; |
---|
| 30 | bitset<MAXTYPES> forbidden; |
---|
| 31 | |
---|
| 32 | bool operator==(const NodeProp& p) |
---|
| 33 | { return required==p.required && forbidden==p.forbidden; } |
---|
| 34 | |
---|
| 35 | void clear() |
---|
| 36 | { required.reset(), forbidden.reset(); } |
---|
| 37 | |
---|
| 38 | }; |
---|
| 39 | |
---|
| 40 | |
---|
| 41 | struct SNode |
---|
| 42 | { |
---|
| 43 | |
---|
| 44 | MNode* mnode; |
---|
| 45 | |
---|
| 46 | NodeProp prop; |
---|
| 47 | |
---|
| 48 | bitset<MAXNODES> LV; |
---|
| 49 | bitset<MAXNODES> LH; |
---|
| 50 | bitset<MAXNODES> LD; |
---|
| 51 | bool in_LH; |
---|
| 52 | |
---|
| 53 | vector<Arc> heads; |
---|
| 54 | vector<Arc> deps; |
---|
| 55 | |
---|
| 56 | void clear() { prop.clear(), LV.reset(), LD.reset(), LH.reset(), heads.clear(), deps.clear(); } |
---|
| 57 | bool saturated() { return prop.required.none(); } |
---|
| 58 | }; |
---|
| 59 | |
---|
| 60 | |
---|
| 61 | |
---|
| 62 | class SGraph |
---|
| 63 | { |
---|
| 64 | public: |
---|
| 65 | |
---|
| 66 | SNode nodes[MAXNODES]; |
---|
| 67 | int n; // number of nodes |
---|
| 68 | |
---|
| 69 | enum Output { HEADS=1, DEPS=2, SETS=4, CONSTRAINTS=8 }; |
---|
| 70 | |
---|
| 71 | SGraph() : n(0) {} |
---|
| 72 | |
---|
| 73 | void clear() { n=0; } |
---|
| 74 | |
---|
| 75 | int add_base_snode(MNode* mn); |
---|
| 76 | int clone(int ancind, NodeProp newprop); |
---|
| 77 | void update_left(int headind, int depind); |
---|
| 78 | void update_right(int headind, int depind); |
---|
| 79 | |
---|
| 80 | bool visible(int left, int right); |
---|
| 81 | bool saturated(int node); |
---|
| 82 | |
---|
| 83 | //-------------------------------------------------------------------- |
---|
| 84 | |
---|
| 85 | void read(FILE* f); |
---|
| 86 | void write(FILE* f, list<int> nodelist, unsigned int info); |
---|
| 87 | |
---|
| 88 | int sprint_node(char* buf, int n, unsigned int info); |
---|
| 89 | int print_node(FILE* f, int n, unsigned int info); |
---|
| 90 | int sprint_node_debug(char* buf, const char* pref, int n); |
---|
| 91 | int print_node_debug(FILE* f, const char* pref, int n); |
---|
| 92 | |
---|
| 93 | void print_arc(FILE* f, int left, int right, Role role, int dir); // 0 - left, 1 - right |
---|
| 94 | |
---|
| 95 | }; |
---|
| 96 | |
---|
| 97 | |
---|
| 98 | inline bool SGraph::visible(int left, int right) |
---|
| 99 | { |
---|
| 100 | return nodes[right].LV[left]; |
---|
| 101 | } |
---|
| 102 | |
---|
| 103 | inline bool SGraph::saturated(int node) |
---|
| 104 | { |
---|
| 105 | return nodes[node].saturated(); |
---|
| 106 | } |
---|
| 107 | |
---|
| 108 | #endif |
---|