Changeset e7de6cc for src/dgp/sgraph.hh
- Timestamp:
- 02/21/12 20:02:51 (13 years ago)
- Branches:
- master
- Children:
- b242df2
- Parents:
- 354ba3d
- git-author:
- Tomasz Obrebski <to@…> (02/21/12 20:02:51)
- git-committer:
- Tomasz Obrebski <to@…> (02/21/12 20:02:51)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/dgp/sgraph.hh
r5f4d9c3 re7de6cc 9 9 10 10 #include "const.hh" 11 #include "mgraph.hh" 11 12 #include "thesymbols.hh" 12 13 14 class MNode; 15 16 13 #include "boubble.hh" 14 15 16 using namespace std; 17 18 //==================================================================================================== 19 // CLASS Arc 20 //==================================================================================================== 17 21 struct Arc 18 22 { 19 23 int dst; 20 24 Role role; 21 int anc; 25 int headanc; 26 int depanc; 22 27 23 Arc(int d, Role r, int a) : dst(d), role(r), anc(a) {}; 24 }; 25 28 Arc(int d, Role r, int ha, int da) : dst(d), role(r), headanc(ha), depanc(da) {}; 29 }; 30 31 //==================================================================================================== 32 // CLASS NodeProp 33 //==================================================================================================== 26 34 27 35 struct NodeProp 28 36 { 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 37 NodeProp(); 38 NodeProp(const NodeProp& p); 39 ~NodeProp(); 40 41 bool operator==(const NodeProp& p); 42 NodeProp& operator=(const NodeProp& p); 43 44 void clear_boubbles(); 45 void merge_boubbles(list<Boubble*> new_boubbles); 46 47 void copy(const NodeProp& p); 48 void clear(); 49 50 RoleSet required; 51 RoleSet forbidden; 52 RoleSet attached; 53 54 bool init_attached; 55 bool fin_attached; 56 57 FlagSet flags; 58 59 list<Boubble*> boubbles; 60 }; 61 62 //---------------------------------------------------------------------------------------------------- 63 64 inline 65 bool NodeProp::operator==(const NodeProp& p) 66 { 67 if(required != p.required) return false; 68 if(forbidden != p.forbidden) return false; 69 if(attached != p.attached) return false; 70 if(flags != p.flags) return false; 71 if(init_attached != p.init_attached) return false; 72 if(fin_attached != p.fin_attached) return false; 73 74 list<Boubble*>::const_iterator b1 = p.boubbles.begin(); 75 for(list<Boubble*>::const_iterator b = boubbles.begin(); b != boubbles.end(); b++) 76 { 77 if(b1 == p.boubbles.end()) 78 return false; 79 if(!(**b == **b1)) 80 return false; 81 } 82 if(b1 != p.boubbles.end()) 83 return false; 84 85 return true; 86 } 87 88 //---------------------------------------------------------------------------------------------------- 89 90 inline 91 void NodeProp::clear_boubbles() 92 { 93 for(list<Boubble*>::iterator b = boubbles.begin(); b!=boubbles.end(); b++) 94 delete *b; 95 boubbles.clear(); 96 } 97 98 //---------------------------------------------------------------------------------------------------- 99 100 inline 101 void NodeProp::merge_boubbles(list<Boubble*> new_boubbles) 102 { 103 boubbles.merge(new_boubbles); 104 } 105 106 //---------------------------------------------------------------------------------------------------- 107 108 inline 109 void NodeProp::copy(const NodeProp& p) 110 { 111 required=p.required; 112 forbidden=p.forbidden; 113 attached=p.attached; 114 flags=p.flags; 115 init_attached=p.init_attached; 116 fin_attached=p.fin_attached; 117 for(list<Boubble*>::const_iterator b = p.boubbles.begin(); b!=p.boubbles.end(); b++) 118 boubbles.push_back(new Boubble(**b)); 119 } 120 121 //---------------------------------------------------------------------------------------------------- 122 123 inline 124 NodeProp::~NodeProp() 125 { 126 clear_boubbles(); 127 } 128 //---------------------------------------------------------------------------------------------------- 129 130 inline 131 NodeProp::NodeProp() 132 { 133 clear(); 134 } 135 136 //---------------------------------------------------------------------------------------------------- 137 138 inline 139 NodeProp::NodeProp(const NodeProp& p) 140 { 141 copy(p); 142 } 143 144 //---------------------------------------------------------------------------------------------------- 145 146 inline 147 NodeProp& NodeProp::operator=(const NodeProp& p) 148 { 149 clear(); 150 copy(p); 151 return *this; 152 } 153 154 //---------------------------------------------------------------------------------------------------- 155 156 inline 157 void NodeProp::clear() 158 { 159 required.reset(); 160 forbidden.reset(); 161 attached.reset(); 162 init_attached=false; 163 fin_attached=false; 164 clear_boubbles(); 165 } 166 167 //==================================================================================================== 168 // CLASS SNode 169 //==================================================================================================== 40 170 41 171 struct SNode 42 172 { 43 173 44 MNode*mnode;174 int mnode; 45 175 46 176 NodeProp prop; … … 54 184 vector<Arc> deps; 55 185 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 186 void clear(); 187 bool saturated(); 188 }; 189 190 //---------------------------------------------------------------------------------------------------- 191 inline 192 void SNode::clear() 193 { prop.clear(), LV.reset(), LD.reset(), LH.reset(), heads.clear(), deps.clear(); } 194 //---------------------------------------------------------------------------------------------------- 195 inline 196 bool SNode::saturated() 197 { return prop.required.none(); } 198 199 //==================================================================================================== 200 // SGraph CLASS 201 //==================================================================================================== 61 202 62 203 class SGraph … … 64 205 public: 65 206 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); 207 enum Output { HEADS=1, DEPS=2, SETS=4, CONSTRAINTS=8, BOUBBLES=16 }; 208 209 SGraph(MGraph& mg) : mgraph(mg) { clear(); } 210 211 SNode& operator[](const int i) { return nodes[i]; } 212 213 void clear() { nodes.clear(); } 214 int add_base_snode(int mnodeind); 215 int clone(int ancind, NodeProp newprop); 77 216 void update_left(int headind, int depind); 78 217 void update_right(int headind, int depind); 79 80 218 bool visible(int left, int right); 81 219 bool saturated(int node); 82 220 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); 221 Cat cat(int i) const { return mgraph[nodes[i].mnode].cat; } 222 char* form(int i) const { return mgraph[nodes[i].mnode].form; } 223 89 224 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); 225 int print_node_debug(FILE* f, const char* pref, int n, int anc); 92 226 93 227 void print_arc(FILE* f, int left, int right, Role role, int dir); // 0 - left, 1 - right 94 228 95 }; 96 229 //private: 230 231 int size() {return nodes.size(); } 232 233 private: 234 235 MGraph& mgraph; 236 237 vector<SNode> nodes; 238 239 int lastnodeind() { return nodes.size()-1; } 240 SNode& makenewnode() { nodes.push_back(SNode()); nodes.back().clear(); return nodes.back(); } 241 242 int sprint_node(char* buf, int n, int anc, unsigned int info); 243 int sprint_node_debug(char* buf, const char* pref, int n, int anc); 244 }; 245 246 //---------------------------------------------------------------------------------------------------- 97 247 98 248 inline bool SGraph::visible(int left, int right) … … 101 251 } 102 252 253 //---------------------------------------------------------------------------------------------------- 254 103 255 inline bool SGraph::saturated(int node) 104 256 { … … 106 258 } 107 259 260 //---------------------------------------------------------------------------------------------------- 261 108 262 #endif
Note: See TracChangeset
for help on using the changeset viewer.