Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

elementmodel.h

Go to the documentation of this file.
00001 /***************************************************************************
00002     elementmodel.h  -  Definition of ElementModeler class
00003                              -------------------
00004     begin                : November 19 2002
00005     copyright            : (C) 2003 by Vojtìch Toman
00006     email                : vtoman@lit.cz
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
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;   //forward declaration
00056 
00057 
00061 namespace ElementModel
00062 {
00063   struct Node;          //forward declaration, see below
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

Generated on Wed Feb 5 10:43:01 2003 for Exalt by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002