All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
tesseract::SquishedDawg Class Reference

#include <dawg.h>

Inheritance diagram for tesseract::SquishedDawg:
tesseract::Dawg

Public Member Functions

 SquishedDawg (FILE *file, DawgType type, const STRING &lang, PermuterType perm, int debug_level)
 
 SquishedDawg (const char *filename, DawgType type, const STRING &lang, PermuterType perm, int debug_level)
 
 SquishedDawg (EDGE_ARRAY edges, int num_edges, DawgType type, const STRING &lang, PermuterType perm, int unicharset_size, int debug_level)
 
 ~SquishedDawg ()
 
int NumEdges ()
 
EDGE_REF edge_char_of (NODE_REF node, UNICHAR_ID unichar_id, bool word_end) const
 Returns the edge that corresponds to the letter out of this node. More...
 
void unichar_ids_of (NODE_REF node, NodeChildVector *vec, bool word_end) const
 
NODE_REF next_node (EDGE_REF edge) const
 
bool end_of_word (EDGE_REF edge_ref) const
 
UNICHAR_ID edge_letter (EDGE_REF edge_ref) const
 Returns UNICHAR_ID stored in the edge indicated by the given EDGE_REF. More...
 
void print_node (NODE_REF node, int max_num_edges) const
 
void write_squished_dawg (FILE *file)
 Writes the squished/reduced Dawg to a file. More...
 
void write_squished_dawg (const char *filename)
 
- Public Member Functions inherited from tesseract::Dawg
DawgType type () const
 
const STRINGlang () const
 
PermuterType permuter () const
 
virtual ~Dawg ()
 
bool word_in_dawg (const WERD_CHOICE &word) const
 Returns true if the given word is in the Dawg. More...
 
bool prefix_in_dawg (const WERD_CHOICE &prefix, bool requires_complete) const
 
int check_for_words (const char *filename, const UNICHARSET &unicharset, bool enable_wildcard) const
 
void iterate_words (const UNICHARSET &unicharset, TessCallback1< const WERD_CHOICE * > *cb) const
 
void iterate_words (const UNICHARSET &unicharset, TessCallback1< const char * > *cb) const
 
virtual void unichar_id_to_patterns (UNICHAR_ID unichar_id, const UNICHARSET &unicharset, GenericVector< UNICHAR_ID > *vec) const
 
virtual EDGE_REF pattern_loop_edge (EDGE_REF edge_ref, UNICHAR_ID unichar_id, bool word_end) const
 

Additional Inherited Members

- Static Public Attributes inherited from tesseract::Dawg
static const inT16 kDawgMagicNumber = 42
 Magic number to determine endianness when reading the Dawg from file. More...
 
static const UNICHAR_ID kPatternUnicharID = 0
 
- Protected Member Functions inherited from tesseract::Dawg
 Dawg ()
 
NODE_REF next_node_from_edge_rec (const EDGE_RECORD &edge_rec) const
 Returns the next node visited by following this edge. More...
 
bool marker_flag_from_edge_rec (const EDGE_RECORD &edge_rec) const
 Returns the marker flag of this edge. More...
 
int direction_from_edge_rec (const EDGE_RECORD &edge_rec) const
 Returns the direction flag of this edge. More...
 
bool end_of_word_from_edge_rec (const EDGE_RECORD &edge_rec) const
 Returns true if this edge marks the end of a word. More...
 
UNICHAR_ID unichar_id_from_edge_rec (const EDGE_RECORD &edge_rec) const
 Returns UNICHAR_ID recorded in this edge. More...
 
void set_next_node_in_edge_rec (EDGE_RECORD *edge_rec, EDGE_REF value)
 Sets the next node link for this edge in the Dawg. More...
 
void set_marker_flag_in_edge_rec (EDGE_RECORD *edge_rec)
 Sets this edge record to be the last one in a sequence of edges. More...
 
int given_greater_than_edge_rec (NODE_REF next_node, bool word_end, UNICHAR_ID unichar_id, const EDGE_RECORD &edge_rec) const
 
bool edge_rec_match (NODE_REF next_node, bool word_end, UNICHAR_ID unichar_id, NODE_REF other_next_node, bool other_word_end, UNICHAR_ID other_unichar_id) const
 
void init (DawgType type, const STRING &lang, PermuterType perm, int unicharset_size, int debug_level)
 
bool match_words (WERD_CHOICE *word, inT32 index, NODE_REF node, UNICHAR_ID wildcard) const
 
void iterate_words_rec (const WERD_CHOICE &word_so_far, NODE_REF to_explore, TessCallback1< const WERD_CHOICE * > *cb) const
 
- Protected Attributes inherited from tesseract::Dawg
DawgType type_
 
STRING lang_
 
PermuterType perm_
 Permuter code that should be used if the word is found in this Dawg. More...
 
int unicharset_size_
 
int flag_start_bit_
 
int next_node_start_bit_
 
uinT64 next_node_mask_
 
uinT64 flags_mask_
 
uinT64 letter_mask_
 
int debug_level_
 

Detailed Description

Concrete class that can operate on a compacted (squished) Dawg (read, search and write to file). This class is read-only in the sense that new words can not be added to an instance of SquishedDawg. The underlying representation of the nodes and edges in SquishedDawg is stored as a contiguous EDGE_ARRAY (read from file or given as an argument to the constructor).

Definition at line 409 of file dawg.h.

Constructor & Destructor Documentation

tesseract::SquishedDawg::SquishedDawg ( FILE *  file,
DawgType  type,
const STRING lang,
PermuterType  perm,
int  debug_level 
)
inline

Definition at line 411 of file dawg.h.

412  {
413  read_squished_dawg(file, type, lang, perm, debug_level);
414  num_forward_edges_in_node0 = num_forward_edges(0);
415  }
DawgType type() const
Definition: dawg.h:127
tesseract::SquishedDawg::SquishedDawg ( const char *  filename,
DawgType  type,
const STRING lang,
PermuterType  perm,
int  debug_level 
)
inline

Definition at line 416 of file dawg.h.

417  {
418  FILE *file = fopen(filename, "rb");
419  if (file == NULL) {
420  tprintf("Failed to open dawg file %s\n", filename);
421  exit(1);
422  }
423  read_squished_dawg(file, type, lang, perm, debug_level);
424  num_forward_edges_in_node0 = num_forward_edges(0);
425  fclose(file);
426  }
#define tprintf(...)
Definition: tprintf.h:31
DawgType type() const
Definition: dawg.h:127
#define NULL
Definition: host.h:144
tesseract::SquishedDawg::SquishedDawg ( EDGE_ARRAY  edges,
int  num_edges,
DawgType  type,
const STRING lang,
PermuterType  perm,
int  unicharset_size,
int  debug_level 
)
inline

Definition at line 427 of file dawg.h.

429  :
430  edges_(edges), num_edges_(num_edges) {
431  init(type, lang, perm, unicharset_size, debug_level);
432  num_forward_edges_in_node0 = num_forward_edges(0);
433  if (debug_level > 3) print_all("SquishedDawg:");
434  }
DawgType type() const
Definition: dawg.h:127
void init(DawgType type, const STRING &lang, PermuterType perm, int unicharset_size, int debug_level)
Definition: dawg.cpp:177
tesseract::SquishedDawg::~SquishedDawg ( )

Definition at line 200 of file dawg.cpp.

200 { memfree(edges_); }
void memfree(void *element)
Definition: freelist.cpp:30

Member Function Documentation

EDGE_REF tesseract::SquishedDawg::edge_char_of ( NODE_REF  node,
UNICHAR_ID  unichar_id,
bool  word_end 
) const
virtual

Returns the edge that corresponds to the letter out of this node.

Implements tesseract::Dawg.

Definition at line 202 of file dawg.cpp.

204  {
205  EDGE_REF edge = node;
206  if (node == 0) { // binary search
207  EDGE_REF start = 0;
208  EDGE_REF end = num_forward_edges_in_node0 - 1;
209  int compare;
210  while (start <= end) {
211  edge = (start + end) >> 1; // (start + end) / 2
212  compare = given_greater_than_edge_rec(NO_EDGE, word_end,
213  unichar_id, edges_[edge]);
214  if (compare == 0) { // given == vec[k]
215  return edge;
216  } else if (compare == 1) { // given > vec[k]
217  start = edge + 1;
218  } else { // given < vec[k]
219  end = edge - 1;
220  }
221  }
222  } else { // linear search
223  if (edge != NO_EDGE && edge_occupied(edge)) {
224  do {
225  if ((unichar_id_from_edge_rec(edges_[edge]) == unichar_id) &&
226  (!word_end || end_of_word_from_edge_rec(edges_[edge])))
227  return (edge);
228  } while (!last_edge(edge++));
229  }
230  }
231  return (NO_EDGE); // not found
232 }
bool end_of_word_from_edge_rec(const EDGE_RECORD &edge_rec) const
Returns true if this edge marks the end of a word.
Definition: dawg.h:213
UNICHAR_ID unichar_id_from_edge_rec(const EDGE_RECORD &edge_rec) const
Returns UNICHAR_ID recorded in this edge.
Definition: dawg.h:217
int given_greater_than_edge_rec(NODE_REF next_node, bool word_end, UNICHAR_ID unichar_id, const EDGE_RECORD &edge_rec) const
Definition: dawg.h:238
inT64 EDGE_REF
Definition: dawg.h:54
UNICHAR_ID tesseract::SquishedDawg::edge_letter ( EDGE_REF  edge_ref) const
inlinevirtual

Returns UNICHAR_ID stored in the edge indicated by the given EDGE_REF.

Implements tesseract::Dawg.

Definition at line 470 of file dawg.h.

470  {
471  return unichar_id_from_edge_rec((edges_[edge_ref]));
472  }
UNICHAR_ID unichar_id_from_edge_rec(const EDGE_RECORD &edge_rec) const
Returns UNICHAR_ID recorded in this edge.
Definition: dawg.h:217
bool tesseract::SquishedDawg::end_of_word ( EDGE_REF  edge_ref) const
inlinevirtual

Returns true if the edge indicated by the given EDGE_REF marks the end of a word.

Implements tesseract::Dawg.

Definition at line 465 of file dawg.h.

465  {
466  return end_of_word_from_edge_rec((edges_[edge_ref]));
467  }
bool end_of_word_from_edge_rec(const EDGE_RECORD &edge_rec) const
Returns true if this edge marks the end of a word.
Definition: dawg.h:213
NODE_REF tesseract::SquishedDawg::next_node ( EDGE_REF  edge) const
inlinevirtual

Returns the next node visited by following the edge indicated by the given EDGE_REF.

Implements tesseract::Dawg.

Definition at line 459 of file dawg.h.

459  {
460  return next_node_from_edge_rec((edges_[edge]));
461  }
NODE_REF next_node_from_edge_rec(const EDGE_RECORD &edge_rec) const
Returns the next node visited by following this edge.
Definition: dawg.h:200
int tesseract::SquishedDawg::NumEdges ( )
inline

Definition at line 437 of file dawg.h.

437 { return num_edges_; }
void tesseract::SquishedDawg::print_node ( NODE_REF  node,
int  max_num_edges 
) const
virtual

Prints the contents of the node indicated by the given NODE_REF. At most max_num_edges will be printed.

Implements tesseract::Dawg.

Definition at line 247 of file dawg.cpp.

247  {
248  if (node == NO_EDGE) return; // nothing to print
249 
250  EDGE_REF edge = node;
251  const char *forward_string = "FORWARD";
252  const char *backward_string = " ";
253 
254  const char *last_string = "LAST";
255  const char *not_last_string = " ";
256 
257  const char *eow_string = "EOW";
258  const char *not_eow_string = " ";
259 
260  const char *direction;
261  const char *is_last;
262  const char *eow;
263 
264  UNICHAR_ID unichar_id;
265 
266  if (edge_occupied(edge)) {
267  do {
268  direction =
269  forward_edge(edge) ? forward_string : backward_string;
270  is_last = last_edge(edge) ? last_string : not_last_string;
271  eow = end_of_word(edge) ? eow_string : not_eow_string;
272 
273  unichar_id = edge_letter(edge);
274  tprintf(REFFORMAT " : next = " REFFORMAT ", unichar_id = %d, %s %s %s\n",
275  edge, next_node(edge), unichar_id,
276  direction, is_last, eow);
277 
278  if (edge - node > max_num_edges) return;
279  } while (!last_edge(edge++));
280 
281  if (edge < num_edges_ &&
282  edge_occupied(edge) && backward_edge(edge)) {
283  do {
284  direction =
285  forward_edge(edge) ? forward_string : backward_string;
286  is_last = last_edge(edge) ? last_string : not_last_string;
287  eow = end_of_word(edge) ? eow_string : not_eow_string;
288 
289  unichar_id = edge_letter(edge);
290  tprintf(REFFORMAT " : next = " REFFORMAT
291  ", unichar_id = %d, %s %s %s\n",
292  edge, next_node(edge), unichar_id,
293  direction, is_last, eow);
294 
295  if (edge - node > MAX_NODE_EDGES_DISPLAY) return;
296  } while (!last_edge(edge++));
297  }
298  }
299  else {
300  tprintf(REFFORMAT " : no edges in this node\n", node);
301  }
302  tprintf("\n");
303 }
NODE_REF next_node(EDGE_REF edge) const
Definition: dawg.h:459
#define tprintf(...)
Definition: tprintf.h:31
int direction(EDGEPT *point)
Definition: vecfuncs.cpp:43
UNICHAR_ID edge_letter(EDGE_REF edge_ref) const
Returns UNICHAR_ID stored in the edge indicated by the given EDGE_REF.
Definition: dawg.h:470
bool end_of_word(EDGE_REF edge_ref) const
Definition: dawg.h:465
#define MAX_NODE_EDGES_DISPLAY
Definition: dawg.h:86
int UNICHAR_ID
Definition: unichar.h:33
#define REFFORMAT
Definition: dawg.h:92
inT64 EDGE_REF
Definition: dawg.h:54
void tesseract::SquishedDawg::unichar_ids_of ( NODE_REF  node,
NodeChildVector vec,
bool  word_end 
) const
inlinevirtual

Fills the given NodeChildVector with all the unichar ids (and the corresponding EDGE_REFs) for which there is an edge out of this node.

Implements tesseract::Dawg.

Definition at line 445 of file dawg.h.

446  {
447  EDGE_REF edge = node;
448  if (!edge_occupied(edge) || edge == NO_EDGE) return;
449  assert(forward_edge(edge)); // we don't expect any backward edges to
450  do { // be present when this funciton is called
451  if (!word_end || end_of_word_from_edge_rec(edges_[edge])) {
452  vec->push_back(NodeChild(unichar_id_from_edge_rec(edges_[edge]), edge));
453  }
454  } while (!last_edge(edge++));
455  }
bool end_of_word_from_edge_rec(const EDGE_RECORD &edge_rec) const
Returns true if this edge marks the end of a word.
Definition: dawg.h:213
UNICHAR_ID unichar_id_from_edge_rec(const EDGE_RECORD &edge_rec) const
Returns UNICHAR_ID recorded in this edge.
Definition: dawg.h:217
inT64 EDGE_REF
Definition: dawg.h:54
void tesseract::SquishedDawg::write_squished_dawg ( FILE *  file)

Writes the squished/reduced Dawg to a file.

Definition at line 388 of file dawg.cpp.

388  {
389  EDGE_REF edge;
390  inT32 num_edges;
391  inT32 node_count = 0;
392  NODE_MAP node_map;
393  EDGE_REF old_index;
394  EDGE_RECORD temp_record;
395 
396  if (debug_level_) tprintf("write_squished_dawg\n");
397 
398  node_map = build_node_map(&node_count);
399 
400  // Write the magic number to help detecting a change in endianness.
401  inT16 magic = kDawgMagicNumber;
402  fwrite(&magic, sizeof(inT16), 1, file);
403  fwrite(&unicharset_size_, sizeof(inT32), 1, file);
404 
405  // Count the number of edges in this Dawg.
406  num_edges = 0;
407  for (edge=0; edge < num_edges_; edge++)
408  if (forward_edge(edge))
409  num_edges++;
410 
411  fwrite(&num_edges, sizeof(inT32), 1, file); // write edge count to file
412 
413  if (debug_level_) {
414  tprintf("%d nodes in DAWG\n", node_count);
415  tprintf("%d edges in DAWG\n", num_edges);
416  }
417 
418  for (edge = 0; edge < num_edges_; edge++) {
419  if (forward_edge(edge)) { // write forward edges
420  do {
421  old_index = next_node_from_edge_rec(edges_[edge]);
422  set_next_node(edge, node_map[old_index]);
423  temp_record = edges_[edge];
424  fwrite(&(temp_record), sizeof(EDGE_RECORD), 1, file);
425  set_next_node(edge, old_index);
426  } while (!last_edge(edge++));
427 
428  if (edge >= num_edges_) break;
429  if (backward_edge(edge)) // skip back links
430  while (!last_edge(edge++));
431 
432  edge--;
433  }
434  }
435  free(node_map);
436 }
EDGE_REF * NODE_MAP
Definition: dawg.h:56
#define tprintf(...)
Definition: tprintf.h:31
NODE_REF next_node_from_edge_rec(const EDGE_RECORD &edge_rec) const
Returns the next node visited by following this edge.
Definition: dawg.h:200
int unicharset_size_
Definition: dawg.h:297
static const inT16 kDawgMagicNumber
Magic number to determine endianness when reading the Dawg from file.
Definition: dawg.h:121
uinT64 EDGE_RECORD
Definition: dawg.h:50
int debug_level_
Definition: dawg.h:304
inT64 EDGE_REF
Definition: dawg.h:54
short inT16
Definition: host.h:100
int inT32
Definition: host.h:102
void tesseract::SquishedDawg::write_squished_dawg ( const char *  filename)
inline

Opens the file with the given filename and writes the squished/reduced Dawg to the file.

Definition at line 483 of file dawg.h.

483  {
484  FILE *file = fopen(filename, "wb");
485  if (file == NULL) {
486  tprintf("Error opening %s\n", filename);
487  exit(1);
488  }
489  this->write_squished_dawg(file);
490  fclose(file);
491  }
#define tprintf(...)
Definition: tprintf.h:31
void write_squished_dawg(FILE *file)
Writes the squished/reduced Dawg to a file.
Definition: dawg.cpp:388
#define NULL
Definition: host.h:144

The documentation for this class was generated from the following files: