| 
									
										
										
										
											2007-05-02 15:31:23 +00:00
										 |  |  | /*********************************************
 | 
					
						
							|  |  |  |   File:     base_tries.h | 
					
						
							|  |  |  |   Author:   Ricardo Rocha | 
					
						
							|  |  |  |   Comments: Tries base module for Yap Prolog | 
					
						
							|  |  |  |   version:  $ID$ | 
					
						
							|  |  |  | *********************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-19 11:29:13 +01:00
										 |  |  | /* --------------------------- */ | 
					
						
							|  |  |  | /*           Defines           */ | 
					
						
							|  |  |  | /* --------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define TRAVERSE_MODE_FORWARD   0
 | 
					
						
							|  |  |  | #define TRAVERSE_MODE_BACKWARD  1
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-05-02 15:31:23 +00:00
										 |  |  | /* --------------------------- */ | 
					
						
							|  |  |  | /*           Structs           */ | 
					
						
							|  |  |  | /* --------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-22 18:57:27 +00:00
										 |  |  | typedef struct trie_entry { | 
					
						
							|  |  |  |   struct trie_node  *top_trie_node; | 
					
						
							|  |  |  |   struct trie_data  *first_trie_data; | 
					
						
							|  |  |  |   struct trie_data  *last_trie_data; | 
					
						
							|  |  |  |   struct trie_data  *traverse_trie_data; | 
					
						
							|  |  |  |   struct trie_entry *next; | 
					
						
							|  |  |  |   struct trie_entry *previous; | 
					
						
							|  |  |  | } *TrEntry; | 
					
						
							| 
									
										
										
										
											2007-05-02 15:31:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-22 18:57:27 +00:00
										 |  |  | #define TrEntry_trie(X)           ((X)->top_trie_node)
 | 
					
						
							|  |  |  | #define TrEntry_first_data(X)     ((X)->first_trie_data)
 | 
					
						
							|  |  |  | #define TrEntry_last_data(X)      ((X)->last_trie_data)
 | 
					
						
							|  |  |  | #define TrEntry_traverse_data(X)  ((X)->traverse_trie_data)
 | 
					
						
							|  |  |  | #define TrEntry_next(X)           ((X)->next)
 | 
					
						
							|  |  |  | #define TrEntry_previous(X)       ((X)->previous)
 | 
					
						
							| 
									
										
										
										
											2007-05-02 15:31:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-22 18:57:27 +00:00
										 |  |  | typedef struct trie_data { | 
					
						
							|  |  |  |   struct trie_entry *trie; | 
					
						
							|  |  |  |   struct trie_node *leaf_trie_node; | 
					
						
							|  |  |  |   struct trie_data *next; | 
					
						
							|  |  |  |   struct trie_data *previous; | 
					
						
							|  |  |  | } *TrData; | 
					
						
							| 
									
										
										
										
											2007-05-02 15:31:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-22 18:57:27 +00:00
										 |  |  | #define TrData_trie(X)      ((X)->trie)
 | 
					
						
							|  |  |  | #define TrData_leaf(X)      ((X)->leaf_trie_node)
 | 
					
						
							|  |  |  | #define TrData_next(X)      ((X)->next)
 | 
					
						
							|  |  |  | #define TrData_previous(X)  ((X)->previous)
 | 
					
						
							| 
									
										
										
										
											2007-05-02 15:31:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-22 18:57:27 +00:00
										 |  |  | #define TYPE_TR_ENTRY         struct trie_entry
 | 
					
						
							|  |  |  | #define TYPE_TR_DATA          struct trie_data
 | 
					
						
							|  |  |  | #define SIZEOF_TR_ENTRY       sizeof(TYPE_TR_ENTRY)
 | 
					
						
							|  |  |  | #define SIZEOF_TR_DATA        sizeof(TYPE_TR_DATA)
 | 
					
						
							| 
									
										
										
										
											2007-05-02 15:31:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-30 07:41:30 +00:00
										 |  |  | #define AS_TR_ENTRY_NEXT(ADDR) (TrEntry)((YAP_UInt)(ADDR) - sizeof(struct trie_node *) - 3 * sizeof(struct trie_data *))
 | 
					
						
							|  |  |  | #define AS_TR_DATA_NEXT(ADDR)  (TrData)((YAP_UInt)(ADDR) - sizeof(struct trie_entry *) - sizeof(struct trie_node *))
 | 
					
						
							| 
									
										
										
										
											2007-05-02 15:31:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* --------------------------- */ | 
					
						
							|  |  |  | /*           Macros            */ | 
					
						
							|  |  |  | /* --------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-22 14:01:56 +00:00
										 |  |  | #define new_trie_entry(TR_ENTRY, TR_NODE)                                                \
 | 
					
						
							|  |  |  |         { new_struct(TR_ENTRY, TYPE_TR_ENTRY, SIZEOF_TR_ENTRY);                          \ | 
					
						
							|  |  |  |           TrEntry_trie(TR_ENTRY) = TR_NODE;                                              \ | 
					
						
							|  |  |  |           TrEntry_first_data(TR_ENTRY) = NULL;                                           \ | 
					
						
							|  |  |  |           TrEntry_last_data(TR_ENTRY) = AS_TR_DATA_NEXT(&TrEntry_first_data(TR_ENTRY));  \ | 
					
						
							|  |  |  |           TrEntry_traverse_data(TR_ENTRY) = NULL;                                        \ | 
					
						
							|  |  |  |           TrEntry_next(TR_ENTRY) = FIRST_TRIE;                                           \ | 
					
						
							|  |  |  |           TrEntry_previous(TR_ENTRY) = AS_TR_ENTRY_NEXT(&FIRST_TRIE);                    \ | 
					
						
							|  |  |  |           INCREMENT_MEMORY(TRIE_ENGINE, SIZEOF_TR_ENTRY);                                \ | 
					
						
							| 
									
										
										
										
											2007-05-02 15:31:23 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-02-22 14:01:56 +00:00
										 |  |  | #define new_trie_data(TR_DATA, TR_ENTRY, TR_NODE)                                        \
 | 
					
						
							|  |  |  |         { TrData first_data = TrEntry_first_data(TR_ENTRY);                              \ | 
					
						
							|  |  |  |           new_struct(TR_DATA, TYPE_TR_DATA, SIZEOF_TR_DATA);                             \ | 
					
						
							|  |  |  |           TrData_trie(TR_DATA) = TR_ENTRY;                                               \ | 
					
						
							|  |  |  |           TrData_leaf(TR_DATA) = TR_NODE;                                                \ | 
					
						
							|  |  |  |           TrData_next(TR_DATA) = NULL;                                                   \ | 
					
						
							|  |  |  |           if (first_data) {                                                              \ | 
					
						
							|  |  |  |             TrData last_data = TrEntry_last_data(TR_ENTRY);                              \ | 
					
						
							|  |  |  |             TrData_next(last_data) = TR_DATA;	         	                         \ | 
					
						
							|  |  |  |             TrData_previous(TR_DATA) = last_data;		                         \ | 
					
						
							|  |  |  |           } else { 	                                                                 \ | 
					
						
							|  |  |  |             TrData_previous(TR_DATA) = AS_TR_DATA_NEXT(&TrEntry_first_data(TR_ENTRY));   \ | 
					
						
							|  |  |  |             TrEntry_first_data(TR_ENTRY) = TR_DATA;                                      \ | 
					
						
							|  |  |  |           }                                                                              \ | 
					
						
							|  |  |  |           TrEntry_last_data(TR_ENTRY) = TR_DATA;                                         \ | 
					
						
							|  |  |  |           INCREMENT_MEMORY(TRIE_ENGINE, SIZEOF_TR_DATA);                                 \ | 
					
						
							| 
									
										
										
										
											2008-02-22 18:57:27 +00:00
										 |  |  |         }  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define free_trie_entry(STR)                                                           \
 | 
					
						
							|  |  |  |         { free_struct(STR);                                                            \ | 
					
						
							|  |  |  |           DECREMENT_MEMORY(TRIE_ENGINE, SIZEOF_TR_ENTRY);                              \ | 
					
						
							| 
									
										
										
										
											2007-05-02 15:31:23 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2008-02-22 18:57:27 +00:00
										 |  |  | #define free_trie_data(STR)                                                            \
 | 
					
						
							|  |  |  |         { free_struct(STR);                                                            \ | 
					
						
							|  |  |  |           DECREMENT_MEMORY(TRIE_ENGINE, SIZEOF_TR_DATA);                               \ | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2007-05-02 15:31:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* --------------------------- */ | 
					
						
							|  |  |  | /*             API             */ | 
					
						
							|  |  |  | /* --------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-04 01:07:44 +00:00
										 |  |  | void     trie_init_module(void); | 
					
						
							|  |  |  | void     trie_data_load(TrNode node, YAP_Int depth, FILE *file); | 
					
						
							|  |  |  | void     trie_data_copy(TrNode node_dest, TrNode node_source); | 
					
						
							|  |  |  | void     trie_data_destruct(TrNode node); | 
					
						
							|  |  |  | TrEntry  trie_open(void); | 
					
						
							|  |  |  | void     trie_close(TrEntry trie); | 
					
						
							|  |  |  | void     trie_close_all(void); | 
					
						
							|  |  |  | void     trie_set_mode(YAP_Int mode); | 
					
						
							|  |  |  | YAP_Int  trie_get_mode(void); | 
					
						
							|  |  |  | TrData   trie_put_entry(TrEntry trie, YAP_Term entry); | 
					
						
							|  |  |  | TrData   trie_check_entry(TrEntry trie, YAP_Term entry); | 
					
						
							|  |  |  | YAP_Term trie_get_entry(TrData data); | 
					
						
							|  |  |  | TrData   trie_get_first_entry(TrEntry trie); | 
					
						
							|  |  |  | TrData   trie_get_last_entry(TrEntry trie); | 
					
						
							|  |  |  | TrData   trie_traverse_init(TrEntry trie, TrData init_data); | 
					
						
							|  |  |  | TrData   trie_traverse_cont(TrEntry trie); | 
					
						
							|  |  |  | void     trie_remove_entry(TrData data); | 
					
						
							|  |  |  | void     trie_remove_subtree(TrData data); | 
					
						
							|  |  |  | void     trie_join(TrEntry trie_dest, TrEntry trie_source); | 
					
						
							|  |  |  | void     trie_intersect(TrEntry trie_dest, TrEntry trie_source); | 
					
						
							|  |  |  | YAP_Int  trie_count_join(TrEntry trie1, TrEntry trie2); | 
					
						
							|  |  |  | YAP_Int  trie_count_intersect(TrEntry trie1, TrEntry trie2); | 
					
						
							|  |  |  | void     trie_save(TrEntry trie, FILE *file); | 
					
						
							|  |  |  | TrEntry  trie_load(FILE *file); | 
					
						
							|  |  |  | void     trie_stats(YAP_Int *memory, YAP_Int *tries, YAP_Int *entries, YAP_Int *nodes); | 
					
						
							|  |  |  | void     trie_max_stats(YAP_Int *memory, YAP_Int *tries, YAP_Int *entries, YAP_Int *nodes); | 
					
						
							|  |  |  | void     trie_usage(TrEntry trie, YAP_Int *entries, YAP_Int *nodes, YAP_Int *virtual_nodes); | 
					
						
							|  |  |  | void     trie_print(TrEntry trie); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void     trie_data_construct(TrNode node); | 
					
						
							|  |  |  | void     trie_set_traverse_mode(YAP_Int mode); | 
					
						
							|  |  |  | YAP_Int  trie_get_traverse_mode(void); | 
					
						
							|  |  |  | TrData   trie_traverse_first(TrEntry trie); | 
					
						
							|  |  |  | TrData   trie_traverse_next(TrData data); | 
					
						
							|  |  |  | void     trie_disable_hash_table(void); | 
					
						
							|  |  |  | void     trie_enable_hash_table(void); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | YAP_Term trie_to_list(TrEntry trie); | 
					
						
							| 
									
										
										
										
											2010-07-19 11:29:13 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "base_dbtries.h"
 |