tudocomp
– The TU Dortmund Compression Framework
NaivST.hpp
Go to the documentation of this file.
1 #pragma once
2 
3 //Original Implementation::
4 // https://gist.github.com/makagonov/f7ed8ce729da72621b321f0ab547debb
5 
6 //from: http://stackoverflow.com/questions/9452701/ukkonens-suffix-tree-algorithm-in-plain-english/9513423#9513423
7 #include <string>
8 #include <map>
9 #include <vector>
10 #include <tuple>
11 
12 #include <sstream>
13 
14 
15 #include <math.h>
16 
18 #include <tudocomp/ds/STInterface.hpp>
19 
20 
21 #include <tudocomp/io.hpp>
22 
23 
24 
25 
26 namespace tdc {
27 
28 
29  struct STNode;
30  struct STLeaf;
31  struct STInnerNode;
32 
33 
34 template<typename size_type = uint>
35 class NaivST : STInterface<STNode>{
36 private:
37 
38  typedef STNode node_type;
39 
40 
41  struct STNode{
42 
43  //represents the edge leading to this node
44  int start;
45  int end;
46  STNode(int s, int e = 0) : start(s), end (e) {}
47  virtual ~STNode(){}
48 
49  };
50 
51  struct STLeaf : STNode {
52  //suffix if leaf
53  uint suffix;
54  //constructor. e=0
55  STLeaf(int s, int e = 0) : STNode(s,e){}
56 
57  virtual ~STLeaf() {}
58 
59  };
60 
61  struct STInnerNode : STNode {
62  //
63  uint string_depth;
64  STInnerNode * parent;
65 
66  // child nodes
67  std::unordered_map<char, STNode*> child_nodes;
68  //suffix link
69  STInnerNode* suffix_link;
70  //constructor. e=0
71 
72  // start(s), end (e)
73  STInnerNode(int s, int e = 0) : STNode(s,e){ suffix_link = NULL; child_nodes.reserve(6);}
74 
75  virtual ~STInnerNode(){}
76 
77  };
78 
79 
80 
81 
82 
83 public:
84  inline void add_child(node_type node, size_type start, size_type suffix_beg){
85 
86  STLeaf child = STLeaf(start,0);
87  child.suffix = suffix_beg;
88 
89 
90 
91 
92  }
93 
94 
95  inline node_type split_edge(node_type parent, node_type child, size_type edge_len){
96 
97 
98 
99 
100  }
101 
102 
103  inline size_type get_edge_length(node_type node){
104 
105 
106 
107  }
108 
109  inline size_type get_start(node_type node){ return start[node];}
110  inline size_type get_end(node_type node){ return end[node];}
111 
112 
113 
114  inline size_type get_suffix(node_type node){
115 
116  }
117 
118 
119  inline bool is_leaf(node_type node){
120 
121  }
122 
123  inline node_type get_child(node_type node, char c){
124 
125 
126 
127  }
128 
129 
130  inline std::vector<node_type> get_child(node_type node){
131 
132  }
133 
134  inline node_type get_suffix_link(node_type node){
135 
136  }
137 
138  inline void set_suffix_link(node_type from_node, node_type to_node){
139 
140  }
141 
142 
143  inline node_type get_root(){
144 
145  }
146 
147  inline size_type get_tree_size(){
148 
149  }
150 
151 
152 
153 
154 
155  inline std::string get_string_of_edge(uint node){
156  // return Text.substr(start[node], edge_length(node));
157  std::stringstream ss ;
158  ss << start[node]<< " " <<start[node] + get_edge_length(node);
159  // for (uint i = start[node]; i<start[node] + edge_length(node); i++){
160  // DLOG(INFO)<<"works "<< i << " " << edge_length(node) ;
161  // ss << Text[i];
162  // DLOG(INFO)<<"works";
163  // }
164  return ss.str();
165  }
166 
167 
168  // inline std::vector<STNode*> get_leaves(){
169  // return leaves;
170  // }
171 
172  // inline STNode* get_leaf(uint position){
173  // return leaves.at(position);
174  // }
175 
176 
177  inline void print_tree(uint node, std::string depth){
178 
179  uint child = first_child[node];
180  while (child != 0){
181  DLOG(INFO)<< depth << "edge: " << get_string_of_edge(child) << std::endl;
182  print_tree(child, depth+" ");
183  child=next_sibling[child];
184  }
185  }
186 
187  // BST(Input& input) : STInterface(input){
188  // auto in = input.as_view();
189 
190  // stree(input.as_view());
191  // construct();
192 
193  // }
194 
195  NaivST(io::InputView & input) : STInterface(input){
196 
197 
198 
199  // stree(input);
200  construct();
201 
202 
203 
204  }
205 
206 
207 };
208 
209 }
210 
Contains the text compression and encoding framework.
Definition: namespaces.hpp:11
node_type get_child(node_type node, char c)
Definition: NaivST.hpp:123
NaivST(io::InputView &input)
Definition: NaivST.hpp:195
size_type get_tree_size()
Definition: NaivST.hpp:147
node_type get_suffix_link(node_type node)
Definition: NaivST.hpp:134
unsigned int uint
Definition: characterhash.h:6
size_type get_end(node_type node)
Definition: NaivST.hpp:110
size_type get_edge_length(node_type node)
Definition: NaivST.hpp:103
size_type get_suffix(node_type node)
Definition: NaivST.hpp:114
node_type get_root()
Definition: NaivST.hpp:143
node_type split_edge(node_type parent, node_type child, size_type edge_len)
Definition: NaivST.hpp:95
std::vector< node_type > get_child(node_type node)
Definition: NaivST.hpp:130
void set_suffix_link(node_type from_node, node_type to_node)
Definition: NaivST.hpp:138
Provides a view on the input that allows for random access.
Definition: InputView.hpp:29
void add_child(node_type node, size_type start, size_type suffix_beg)
Definition: NaivST.hpp:84
size_type get_start(node_type node)
Definition: NaivST.hpp:109
bool is_leaf(node_type node)
Definition: NaivST.hpp:119
std::string get_string_of_edge(uint node)
Definition: NaivST.hpp:155
void print_tree(uint node, std::string depth)
Definition: NaivST.hpp:177