00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00025 #ifdef __GNUG__
00026 # pragma interface
00027 #endif
00028
00029
00030 #ifndef ELEMENTMODEL_H
00031 #define ELEMENTMODEL_H
00032
00033 #include <cmath>
00034
00035 #include "defs.h"
00036 #include "list.h"
00037 #include "stack.h"
00038 #include "xmlchar.h"
00039 #include "saxemitter.h"
00040
00041
00043 #define STR_NODE_TYPE_START_NODE "S"
00044
00046 #define STR_NODE_TYPE_END_NODE "/"
00047
00049 #define STR_NODE_TYPE_ELEMENT_NODE "E"
00050
00052 #define STR_NODE_TYPE_CHARACTERS_NODE "C"
00053
00054
00055 class ElementModeler;
00056
00057
00061 namespace ElementModel
00062 {
00063 struct Node;
00064
00065
00067 struct Transition
00068 {
00070 size_t frequency;
00071
00073 size_t id;
00074
00076 Node *node;
00077 };
00078
00079
00081 typedef List<Transition> Transitions;
00082
00083
00085 enum NodeType
00086 {
00088 NoNode,
00089
00091 StartNode,
00092
00094 EndNode,
00095
00097 CharactersNode,
00098
00100 ElementNode,
00101 };
00102
00103
00105 enum TransitionState
00106 {
00108 Definite,
00109
00111 Indefinite,
00112
00114 NewNodeCreated,
00115
00117 Impossible
00118 };
00119
00120
00122 struct Node
00123 {
00125 unsigned long id;
00126
00128 NodeType type;
00129
00131 Transitions successors;
00132
00134 Transition *mpt;
00135
00137 ElementModeler *modeler;
00138 };
00139
00145 struct AttributeNode : public Node
00146 {
00148 size_t noAttrCnt;
00149
00151 size_t yesAttrCnt;
00152
00154 bool hasAttr;
00155 };
00156
00157
00159 typedef Stack<Node> NodeStack;
00160 };
00161
00162
00163
00169 class ElementModeler
00170 {
00171 public:
00173 ElementModeler(XmlChar *name);
00174
00176 virtual ~ElementModeler(void);
00177
00179 virtual void resetCurrentNode(void);
00180
00182 virtual void popCurrentNode(void);
00183
00185 virtual ElementModel::Node *getCurrentNode(void);
00186
00188 virtual ElementModel::TransitionState moveToDesiredNode(ElementModel::NodeType desiredNodeType, size_t *edgeId, size_t *elementPushes, ElementModeler *elementModeler = 0);
00189
00191 virtual ElementModel::NodeType moveForward(ElementModel::Node **node, SAXEmitter *saxEmitter, void *userData);
00192
00194 virtual ElementModel::NodeType followEdge(size_t edgeId, ElementModel::Node **node, SAXEmitter *saxEmitter, void *userData);
00195
00197 virtual ElementModel::NodeType currentNodeType(void);
00198
00200 virtual bool setAttributes(bool attributes);
00201
00203 virtual bool hasAttributes(void);
00204
00206 virtual ElementModel::Node *getStartNode(void);
00207
00209 virtual ElementModel::Node *getEndNode(void);
00210
00212 virtual XmlChar *getElementName(void);
00213
00215 virtual void increaseRefCount(void);
00216
00218 virtual size_t getRefCount(void);
00219
00221 virtual void computeAverageEntropy(void);
00222
00224 virtual double getAverageEntropy(void);
00225
00227 virtual void print(void);
00228
00230 virtual void printNode(ElementModel::Node *node);
00231
00232
00233 protected:
00235 XmlChar *elementName;
00236
00238 ElementModel::AttributeNode *startNode;
00239
00241 ElementModel::Node *endNode;
00242
00244 ElementModel::Node *currentNode;
00245
00247 ElementModel::NodeStack nodeStack;
00248
00250 size_t nodeCounter;
00251
00253 size_t refCount;
00254
00256 double averageEntropy;
00257
00259 List<ElementModel::Node> nodeList;
00260 };
00261
00262
00263
00265 struct ElementModelerInfo
00266 {
00268 ElementModeler *modeler;
00269
00271 bool building;
00272 };
00273
00274
00276 struct ElementModelTransitionInfo
00277 {
00279 double probability;
00280
00282 ElementModel::Transition *transition;
00283 };
00284
00285
00291 class ElementModelEntropyCalculator
00292 {
00293 public:
00295 static double calculate(ElementModeler *modeler);
00296 };
00297
00298
00299
00300 #endif //ELEMENTMODEL_H