2007-05-02 16:31:23 +01:00
|
|
|
/*********************************************
|
|
|
|
File: base_tries.h
|
|
|
|
Author: Ricardo Rocha
|
|
|
|
Comments: Tries base module for Yap Prolog
|
|
|
|
version: $ID$
|
|
|
|
*********************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* --------------------------- */
|
|
|
|
/* 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 16:31:23 +01: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 16:31:23 +01: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 16:31:23 +01: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 16:31:23 +01: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 16:31:23 +01:00
|
|
|
|
2008-02-22 18:57:27 +00:00
|
|
|
#define AS_TR_ENTRY_NEXT(ADDR) (TrEntry)((unsigned long int)(ADDR) - sizeof(struct trie_node *) - 3 * sizeof(struct trie_data *))
|
|
|
|
#define AS_TR_DATA_NEXT(ADDR) (TrData)((unsigned long int)(ADDR) - sizeof(struct trie_entry *) - sizeof(struct trie_node *))
|
2007-05-02 16:31:23 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* --------------------------- */
|
|
|
|
/* Macros */
|
|
|
|
/* --------------------------- */
|
|
|
|
|
2008-02-22 18:57:27 +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) = NULL; \
|
|
|
|
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 16:31:23 +01:00
|
|
|
}
|
2008-02-22 18:57:27 +00:00
|
|
|
#define new_trie_data(TR_DATA, TR_ENTRY, TR_NODE) \
|
|
|
|
{ TrData last_data = TrEntry_last_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 (last_data) { \
|
|
|
|
TrData_next(last_data) = TR_DATA; \
|
|
|
|
TrData_previous(TR_DATA) = last_data; \
|
|
|
|
TrEntry_last_data(TR_ENTRY) = TR_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); \
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define free_trie_entry(STR) \
|
|
|
|
{ free_struct(STR); \
|
|
|
|
DECREMENT_MEMORY(TRIE_ENGINE, SIZEOF_TR_ENTRY); \
|
2007-05-02 16:31:23 +01: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 16:31:23 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* --------------------------- */
|
|
|
|
/* API */
|
|
|
|
/* --------------------------- */
|
|
|
|
|
2008-02-22 18:57:27 +00:00
|
|
|
inline void trie_init_module(void);
|
|
|
|
inline void trie_data_load(TrNode node, YAP_Int depth, FILE *file);
|
|
|
|
inline void trie_data_copy(TrNode node_dest, TrNode node_source);
|
|
|
|
inline void trie_data_destruct(TrNode node);
|
|
|
|
inline TrEntry trie_open(void);
|
|
|
|
inline void trie_close(TrEntry trie);
|
|
|
|
inline void trie_close_all(void);
|
2007-05-02 16:31:23 +01:00
|
|
|
inline void trie_set_mode(YAP_Int mode);
|
|
|
|
inline YAP_Int trie_get_mode(void);
|
2008-02-22 18:57:27 +00:00
|
|
|
inline TrData trie_put_entry(TrEntry trie, YAP_Term entry);
|
|
|
|
inline TrData trie_check_entry(TrEntry trie, YAP_Term entry);
|
|
|
|
inline YAP_Term trie_get_entry(TrData data);
|
2009-11-27 19:10:36 +00:00
|
|
|
inline TrData trie_get_first_entry(TrEntry trie);
|
|
|
|
inline TrData trie_get_last_entry(TrEntry trie);
|
|
|
|
inline TrData trie_traverse_init(TrEntry trie, TrData init_data);
|
2008-02-22 18:57:27 +00:00
|
|
|
inline TrData trie_traverse_cont(TrEntry trie);
|
|
|
|
inline void trie_remove_entry(TrData data);
|
|
|
|
inline void trie_remove_subtree(TrData data);
|
|
|
|
inline void trie_join(TrEntry trie_dest, TrEntry trie_source);
|
|
|
|
inline void trie_intersect(TrEntry trie_dest, TrEntry trie_source);
|
|
|
|
inline YAP_Int trie_count_join(TrEntry trie1, TrEntry trie2);
|
|
|
|
inline YAP_Int trie_count_intersect(TrEntry trie1, TrEntry trie2);
|
|
|
|
inline void trie_save(TrEntry trie, FILE *file);
|
|
|
|
inline TrEntry trie_load(FILE *file);
|
|
|
|
inline void trie_stats(YAP_Int *memory, YAP_Int *tries, YAP_Int *entries, YAP_Int *nodes);
|
|
|
|
inline void trie_max_stats(YAP_Int *memory, YAP_Int *tries, YAP_Int *entries, YAP_Int *nodes);
|
|
|
|
inline void trie_usage(TrEntry trie, YAP_Int *entries, YAP_Int *nodes, YAP_Int *virtual_nodes);
|
|
|
|
inline void trie_print(TrEntry trie);
|