14#define ITRIES_MODE_NONE 0
15#define ITRIES_MODE_INC_POS 1
16#define ITRIES_MODE_DEC_POS 2
17#define ITRIES_MODE_INC_NEG 3
18#define ITRIES_MODE_DEC_NEG 4
19#define BASE_TR_DATA_BUCKETS 20
35 YAP_Int number_of_buckets;
36 YAP_Int traverse_bucket;
39#define TrEntry_trie(X) ((X)->top_trie_node)
40#define TrEntry_buckets(X) ((X)->trie_data_buckets)
41#define TrEntry_bucket(X,N) ((X)->trie_data_buckets + N)
42#define TrEntry_traverse_data(X) ((X)->traverse_trie_data)
43#define TrEntry_next(X) ((X)->next)
44#define TrEntry_previous(X) ((X)->previous)
45#define TrEntry_mode(X) ((X)->mode)
46#define TrEntry_timestamp(X) ((X)->timestamp)
47#define TrEntry_num_buckets(X) ((X)->number_of_buckets)
48#define TrEntry_traverse_bucket(X) ((X)->traverse_bucket)
61#define TrData_itrie(X) ((X)->itrie)
62#define TrData_leaf(X) ((X)->leaf_trie_node)
63#define TrData_next(X) ((X)->next)
64#define TrData_previous(X) ((X)->previous)
65#define TrData_pos(X) ((X)->pos)
66#define TrData_neg(X) ((X)->neg)
67#define TrData_timestamp(X) ((X)->timestamp)
68#define TrData_depth(X) ((X)->depth)
70#define TYPE_TR_ENTRY struct itrie_entry
71#define TYPE_TR_DATA struct itrie_data
72#define SIZEOF_TR_ENTRY sizeof(TYPE_TR_ENTRY)
73#define SIZEOF_TR_DATA sizeof(TYPE_TR_DATA)
74#define SIZEOF_TR_DATA_BUCKET sizeof(TYPE_TR_DATA *)
76#define AS_TR_ENTRY_NEXT(ADDR) (TrEntry)((YAP_UInt)(ADDR) - sizeof(struct trie_node *) - sizeof(struct itrie_data **) - sizeof(struct itrie_data *))
77#define AS_TR_DATA_NEXT(ADDR) (TrData)((YAP_UInt)(ADDR) - sizeof(struct itrie_entry *) - sizeof(struct trie_node *))
85#define new_itrie_entry(TR_ENTRY, TR_NODE) \
86 { new_struct(TR_ENTRY, TYPE_TR_ENTRY, SIZEOF_TR_ENTRY); \
87 TrEntry_mode(TR_ENTRY) = ITRIES_MODE_NONE; \
88 TrEntry_timestamp(TR_ENTRY) = -1; \
89 TrEntry_num_buckets(TR_ENTRY) = BASE_TR_DATA_BUCKETS; \
90 new_itrie_buckets(TR_ENTRY, BASE_TR_DATA_BUCKETS); \
91 TrEntry_trie(TR_ENTRY) = TR_NODE; \
92 TrEntry_next(TR_ENTRY) = FIRST_ITRIE; \
93 TrEntry_previous(TR_ENTRY) = AS_TR_ENTRY_NEXT(&FIRST_ITRIE); \
94 INCREMENT_MEMORY(ITRIE_ENGINE, SIZEOF_TR_ENTRY); \
96#define new_itrie_buckets(TR_ENTRY, NUM_BUCKETS) \
97 { YAP_Int i; void **ptr; \
98 new_struct(ptr, void *, NUM_BUCKETS * sizeof(void *)); \
99 TrEntry_buckets(TR_ENTRY) = (TYPE_TR_DATA **) ptr; \
100 for (i = NUM_BUCKETS; i != 0; i--) \
102 INCREMENT_MEMORY(ITRIE_ENGINE, (NUM_BUCKETS) * SIZEOF_TR_DATA_BUCKET); \
104#define new_itrie_data(TR_DATA, TR_ENTRY, TR_NODE, POS, NEG, TIME, DEPTH) \
106 new_struct(TR_DATA, TYPE_TR_DATA, SIZEOF_TR_DATA); \
107 TrData_pos(TR_DATA) = POS; \
108 TrData_neg(TR_DATA) = NEG; \
109 TrData_timestamp(TR_DATA) = TIME; \
110 TrData_depth(TR_DATA) = DEPTH; \
111 TrData_itrie(TR_DATA) = TR_ENTRY; \
112 TrData_leaf(TR_DATA) = TR_NODE; \
113 if (DEPTH >= TrEntry_num_buckets(TR_ENTRY)) { \
114 YAP_Int i, new_num_buckets = DEPTH + BASE_TR_DATA_BUCKETS; \
115 bucket = TrEntry_buckets(TR_ENTRY); \
116 new_itrie_buckets(TR_ENTRY, new_num_buckets); \
117 memmove(TrEntry_buckets(TR_ENTRY), bucket, \
118 TrEntry_num_buckets(TR_ENTRY) * SIZEOF_TR_DATA_BUCKET); \
119 free_itrie_buckets(bucket, TrEntry_num_buckets(TR_ENTRY)); \
120 bucket = TrEntry_buckets(TR_ENTRY); \
121 for (i = 0; i != TrEntry_num_buckets(TR_ENTRY); i++) { \
123 TrData_previous(*bucket) = AS_TR_DATA_NEXT(bucket); \
126 TrEntry_num_buckets(TR_ENTRY) = new_num_buckets; \
128 bucket = TrEntry_bucket(TR_ENTRY, DEPTH); \
129 TrData_next(TR_DATA) = *bucket; \
130 TrData_previous(TR_DATA) = AS_TR_DATA_NEXT(bucket); \
132 TrData_previous(*bucket) = TR_DATA; \
134 INCREMENT_MEMORY(ITRIE_ENGINE, SIZEOF_TR_DATA); \
136#define update_itrie_data(TR_DATA, TIMESTAMP, ITRIES_MODE) \
137 if (TrData_timestamp(TR_DATA) != TIMESTAMP) { \
138 if (ITRIES_MODE == ITRIES_MODE_INC_POS) \
139 TrData_pos(TR_DATA)++; \
140 else if (ITRIES_MODE == ITRIES_MODE_DEC_POS) \
141 TrData_pos(TR_DATA)--; \
142 else if (ITRIES_MODE == ITRIES_MODE_INC_NEG) \
143 TrData_neg(TR_DATA)++; \
144 else if (ITRIES_MODE == ITRIES_MODE_DEC_NEG) \
145 TrData_neg(TR_DATA)--; \
146 TrData_timestamp(TR_DATA) = TIMESTAMP; \
151#define free_itrie_entry(STR) \
152 { free_itrie_buckets(TrEntry_buckets(STR), TrEntry_num_buckets(STR)); \
154 DECREMENT_MEMORY(ITRIE_ENGINE, SIZEOF_TR_ENTRY); \
156#define free_itrie_buckets(STR, NUM_BUCKETS) \
157 { free_struct(STR); \
158 DECREMENT_MEMORY(ITRIE_ENGINE, (NUM_BUCKETS) * SIZEOF_TR_DATA_BUCKET); \
160#define free_itrie_data(STR) \
161 { free_struct(STR); \
162 DECREMENT_MEMORY(ITRIE_ENGINE, SIZEOF_TR_DATA); \
171void itrie_init_module(
void);
172void itrie_data_save(
TrNode node, FILE *file);
173void itrie_data_load(
TrNode node, YAP_Int depth, FILE *file);
174void itrie_data_print(
TrNode node);
175void itrie_data_copy(
TrNode node_dest,
TrNode node_source);
176void itrie_data_destruct(
TrNode node);
177void itrie_data_add(
TrNode node_dest,
TrNode node_source);
178void itrie_data_subtract(
TrNode node_dest,
TrNode node_source);
180void itrie_close(
TrEntry itrie);
181void itrie_close_all(
void);
182void itrie_set_mode(
TrEntry itrie, YAP_Int mode);
183YAP_Int itrie_get_mode(
TrEntry itrie);
184void itrie_set_timestamp(
TrEntry itrie, YAP_Int timestamp);
185YAP_Int itrie_get_timestamp(
TrEntry itrie);
186void itrie_put_entry(
TrEntry itrie, YAP_Term entry);
187void itrie_update_entry(
TrEntry itrie, YAP_Term entry);
189YAP_Term itrie_get_entry(
TrData data);
190void itrie_get_data(
TrData data, YAP_Int *pos, YAP_Int *neg, YAP_Int *timestamp);
193void itrie_remove_entry(
TrData data);
194void itrie_remove_subtree(
TrData data);
201void itrie_save(
TrEntry itrie, FILE *file);
202void itrie_save_as_trie(
TrEntry itrie, FILE *file);
204void itrie_stats(YAP_Int *memory, YAP_Int *tries, YAP_Int *entries, YAP_Int *nodes);
205void itrie_max_stats(YAP_Int *memory, YAP_Int *tries, YAP_Int *entries, YAP_Int *nodes);
206void itrie_usage(
TrEntry itrie, YAP_Int *entries, YAP_Int *nodes, YAP_Int *virtual_nodes);
207void itrie_print(
TrEntry itrie);