-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdagprinter.h
233 lines (174 loc) · 6.43 KB
/
dagprinter.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
/* -*- Mode: C++ -*- */
#ifndef _DAGPRINTER_H
#define _DAGPRINTER_H
#include "pet-config.h"
#include "dag.h"
#include "hashing.h"
#include <ostream>
#ifdef HASH_SPACE
namespace HASH_SPACE {
template<> struct hash<const struct ::dag_node *> {
inline size_t operator()(const dag_node * const key) const {
return (size_t) key;
}
};
}
#endif
class AbstractDagPrinter {
public:
AbstractDagPrinter() : _dags_visited(), _coref_nr(0) {}
virtual ~AbstractDagPrinter() {}
virtual void
print(std::ostream &out, const dag_node *dag, bool temp = false) = 0;
protected:
inline int get_coref_nr(const dag_node *dag) {
int coref = visited(dag);
switch (coref) {
case 1: coref = 0; break; // not coreferenced, not printed
case 2: // coreferenced, not printed
coref = ++_coref_nr;
set_visited(dag, - coref);
break;
}
return coref; // coreferenced, printed
}
void init_coreference_marks(const dag_node *dag, bool temp);
private:
int visited(const dag_node *dag);
int set_visited(const dag_node *dag, int val);
void mark_arc_targets(const dag_arc *arcs, bool temp);
void mark_coreferences(const dag_node *dag, bool temp);
HASH_SPACE::hash_map<const dag_node *, int> _dags_visited;
int _coref_nr;
};
class ReadableDagPrinter : public AbstractDagPrinter {
public:
ReadableDagPrinter(bool print_pointer = false)
: _print_pointer(print_pointer) {}
virtual ~ReadableDagPrinter() {}
/** \a temp determines if temporary dag information will be printed */
virtual void
print(std::ostream &out, const dag_node *dag, bool temp = false) {
if (dag == NULL) { out << type_name(0); return; }
if (dag == FAIL) { out << "fail"; return; }
init_coreference_marks(dag, temp);
print_dag_rec(out, dag, temp, 0);
}
protected:
virtual void
print_arcs(std::ostream &out, const dag_arc *arc, bool temp, int indent);
virtual void
print_dag_rec(std::ostream &out, const dag_node *dag, bool temp, int indent);
private:
bool _print_pointer;
};
/** superclass for printing dags in machine-readable formats, like LUI,
* Fegramed, JXCHG
*
* \todo maybe check if template metaprogramming could increase efficiency by
* turning the small printing functions inline, sth. like
* CompactDagPrinter<name> : AbstractDagPrinter
*/
class CompactDagPrinter : public AbstractDagPrinter {
protected:
bool honor_temporary_dags;
virtual void print_null_dag(std::ostream &out) { out << type_name(0); }
virtual void print_fail_dag(std::ostream &out) { out << "fail"; }
virtual void print_arc(std::ostream &out, const dag_arc *arc, bool temp) = 0;
virtual void print_coref_reference(std::ostream &out, int coref_nr) = 0;
virtual void print_coref_definition(std::ostream &out, int coref_nr) = 0;
virtual void print_dag_node_start(std::ostream &out, const dag_node *dag) = 0;
virtual void print_dag_node_end(std::ostream &out, const dag_node *dag) = 0;
virtual void print_dag_rec(std::ostream &out, const struct dag_node *dag, bool temp);
public:
CompactDagPrinter() : honor_temporary_dags(false) {}
virtual ~CompactDagPrinter() {}
virtual void
print(std::ostream &out, const dag_node *dag, bool temp = false) {
if (dag == NULL) { print_null_dag(out); return; }
if (dag == FAIL) { print_fail_dag(out); return; }
temp = temp && honor_temporary_dags;
init_coreference_marks(dag, temp);
print_dag_rec(out, dag, temp);
} // end print
}; // end CompactDagPrinter
class LUIDagPrinter : public CompactDagPrinter {
protected:
virtual void print_arc(std::ostream &out, const dag_arc *arc, bool temp) {
out << " " << attrname[arc->attr] << ": ";
print_dag_rec(out, arc->val, temp);
}
virtual void print_coref_reference(std::ostream &out, int coref_nr) {
out << "<" << coref_nr << ">";
}
virtual void print_coref_definition(std::ostream &out, int coref_nr) {
out << "<" << coref_nr << ">=";
}
virtual void print_dag_node_start(std::ostream &out, const dag_node *dag) {
if (dag->arcs != NULL) out << "#D[";
out << type_name(dag->type);
out << " [";
}
virtual void print_dag_node_end(std::ostream &out, const dag_node *dag) {
out << " ]";
if (dag->arcs != NULL) out << " ]";
}
};
class ItsdbDagPrinter : public CompactDagPrinter {
protected:
virtual void print_arc(std::ostream &out, const dag_arc *arc, bool temp);
virtual void print_coref_reference(std::ostream &out, int coref_nr);
virtual void print_coref_definition(std::ostream &out, int coref_nr);
virtual void print_dag_node_start(std::ostream &out, const dag_node *dag);
virtual void print_dag_node_end(std::ostream &out, const dag_node *dag);
virtual void print_dag_rec(std::ostream &out, const dag_node *dag, bool temp);
virtual void print_arcs(std::ostream &out, const dag_arc *arc, bool temp);
};
class FegramedDagPrinter : public CompactDagPrinter {
protected:
virtual void print_null_dag(std::ostream &out) { out << "NIL"; }
virtual void print_arc(std::ostream &out, const dag_arc *arc, bool temp) {
out << " (" << attrname[arc->attr];
print_dag_rec(out, arc->val, temp);
out << " )";
}
virtual void print_coref_reference(std::ostream &out, int coref_nr) {
out << " #" << coref_nr;
}
virtual void print_coref_definition(std::ostream &out, int coref_nr) {
out << " #" << coref_nr << "=";
}
virtual void print_dag_node_start(std::ostream &out, const dag_node *dag) {
out << " [ (%%TYPE " << type_name(dag->type) << " #T )";
}
virtual void print_dag_node_end(std::ostream &out, const dag_node *dag) {}
};
class JxchgDagPrinter : public CompactDagPrinter {
protected:
virtual void print_null_dag(std::ostream &out) { out << 0; }
virtual void print_arc(std::ostream &out, const dag_arc *arc, bool temp) {
out << " " << arc->attr;
print_dag_rec(out, arc->val, temp);
out << " ";
}
virtual void print_coref_reference(std::ostream &out, int coref_nr) {
out << " # " << coref_nr;
}
virtual void print_coref_definition(std::ostream &out, int coref_nr) {
out << " # " << coref_nr;
}
virtual void print_dag_node_start(std::ostream &out, const dag_node *dag) {
out << " [ ";
if (is_dynamic_type(dag->type)) {
out << type_name(dag->type);
} else {
out << dag->type;
}
}
virtual void print_dag_node_end(std::ostream &out, const dag_node *dag) {
out << " ]";
}
};
/** default printing for dags */
std::ostream &operator<<(std::ostream &out, const dag_node *dag);
#endif