From ddb1cd86041ded2830ca403417039177c9be6097 Mon Sep 17 00:00:00 2001 From: Ricardo Rocha Date: Fri, 16 Apr 2010 02:08:06 +0100 Subject: [PATCH] adding two new modes to the yap_flag/2 and tabling_mode/2 built-in predicates: 'local_trie' mode and 'global_trie' mode. --- C/cdmgr.c | 2 +- C/stdpreds.c | 65 ++++++++-------- H/iatoms.h | 8 +- H/ratoms.h | 6 +- H/tatoms.h | 12 ++- OPTYap/opt.preds.c | 108 +++++++++++++------------- OPTYap/tab.macros.h | 65 ++++++++++++---- OPTYap/tab.structs.h | 178 ++++++++++++++++++------------------------- misc/ATOMS | 8 +- pl/flags.yap | 24 +++--- pl/tabling.yap | 37 ++++++--- 11 files changed, 275 insertions(+), 238 deletions(-) diff --git a/C/cdmgr.c b/C/cdmgr.c index 10a41e19b..9fdb8d55a 100644 --- a/C/cdmgr.c +++ b/C/cdmgr.c @@ -3509,7 +3509,7 @@ static Term all_calls(void) { Term ts[4]; - Functor f = Yap_MkFunctor(AtomLocal,4); + Functor f = Yap_MkFunctor(AtomLocalSp,4); ts[0] = MkIntegerTerm((Int)P); ts[1] = MkIntegerTerm((Int)CP); diff --git a/C/stdpreds.c b/C/stdpreds.c index ffd7ce58b..5772d8406 100755 --- a/C/stdpreds.c +++ b/C/stdpreds.c @@ -273,6 +273,9 @@ static char SccsId[] = "%W% %G%"; #include "YapHeap.h" #include "eval.h" #include "yapio.h" +#ifdef TABLING +#include "tab.macros.h" +#endif /* TABLING */ #include #if HAVE_STRING_H #include @@ -3656,28 +3659,19 @@ p_access_yap_flags(void) } #ifdef TABLING if (flag == TABLING_MODE_FLAG) { - int n = 0; - if (IsMode_CompletedOn(yap_flags[flag])) { - if (IsMode_LoadAnswers(yap_flags[flag])) - tout = MkAtomTerm(AtomLoadAnswers); - else - tout = MkAtomTerm(AtomExecAnswers); - n++; - } - if (IsMode_SchedulingOn(yap_flags[flag])) { - Term taux = tout; - if (IsMode_Local(yap_flags[flag])) - tout = MkAtomTerm(AtomLocalA); - else - tout = MkAtomTerm(AtomBatched); - if (n) { - taux = MkPairTerm(taux, MkAtomTerm(AtomNil)); - tout = MkPairTerm(tout, taux); - } - n++; - } - if (n == 0) - tout = MkAtomTerm(AtomDefault); + tout = TermNil; + if (IsMode_LocalTrie(yap_flags[flag])) + tout = MkPairTerm(MkAtomTerm(AtomLocalTrie), tout); + else if (IsMode_GlobalTrie(yap_flags[flag])) + tout = MkPairTerm(MkAtomTerm(AtomGlobalTrie), tout); + if (IsMode_ExecAnswers(yap_flags[flag])) + tout = MkPairTerm(MkAtomTerm(AtomExecAnswers), tout); + else if (IsMode_LoadAnswers(yap_flags[flag])) + tout = MkPairTerm(MkAtomTerm(AtomLoadAnswers), tout); + if (IsMode_Batched(yap_flags[flag])) + tout = MkPairTerm(MkAtomTerm(AtomBatched), tout); + else if (IsMode_Local(yap_flags[flag])) + tout = MkPairTerm(MkAtomTerm(AtomLocal), tout); } else #endif /* TABLING */ tout = MkIntegerTerm(yap_flags[flag]); @@ -3804,14 +3798,7 @@ p_set_yap_flags(void) if (value == 0) { /* default */ tab_ent_ptr tab_ent = GLOBAL_root_tab_ent; while(tab_ent) { - if (IsDefaultMode_Local(TabEnt_mode(tab_ent))) - SetMode_Local(TabEnt_mode(tab_ent)); - else - SetMode_Batched(TabEnt_mode(tab_ent)); - if (IsDefaultMode_LoadAnswers(TabEnt_mode(tab_ent))) - SetMode_LoadAnswers(TabEnt_mode(tab_ent)); - else - SetMode_ExecAnswers(TabEnt_mode(tab_ent)); + TabEnt_mode(tab_ent) = TabEnt_flags(tab_ent); tab_ent = TabEnt_next(tab_ent); } yap_flags[TABLING_MODE_FLAG] = 0; @@ -3822,7 +3809,6 @@ p_set_yap_flags(void) tab_ent = TabEnt_next(tab_ent); } SetMode_Batched(yap_flags[TABLING_MODE_FLAG]); - SetMode_SchedulingOn(yap_flags[TABLING_MODE_FLAG]); } else if (value == 2) { /* local */ tab_ent_ptr tab_ent = GLOBAL_root_tab_ent; while(tab_ent) { @@ -3830,7 +3816,6 @@ p_set_yap_flags(void) tab_ent = TabEnt_next(tab_ent); } SetMode_Local(yap_flags[TABLING_MODE_FLAG]); - SetMode_SchedulingOn(yap_flags[TABLING_MODE_FLAG]); } else if (value == 3) { /* exec_answers */ tab_ent_ptr tab_ent = GLOBAL_root_tab_ent; while(tab_ent) { @@ -3838,7 +3823,6 @@ p_set_yap_flags(void) tab_ent = TabEnt_next(tab_ent); } SetMode_ExecAnswers(yap_flags[TABLING_MODE_FLAG]); - SetMode_CompletedOn(yap_flags[TABLING_MODE_FLAG]); } else if (value == 4) { /* load_answers */ tab_ent_ptr tab_ent = GLOBAL_root_tab_ent; while(tab_ent) { @@ -3846,7 +3830,20 @@ p_set_yap_flags(void) tab_ent = TabEnt_next(tab_ent); } SetMode_LoadAnswers(yap_flags[TABLING_MODE_FLAG]); - SetMode_CompletedOn(yap_flags[TABLING_MODE_FLAG]); + } else if (value == 5) { /* local_trie */ + tab_ent_ptr tab_ent = GLOBAL_root_tab_ent; + while(tab_ent) { + SetMode_LocalTrie(TabEnt_mode(tab_ent)); + tab_ent = TabEnt_next(tab_ent); + } + SetMode_LocalTrie(yap_flags[TABLING_MODE_FLAG]); + } else if (value == 6) { /* global_trie */ + tab_ent_ptr tab_ent = GLOBAL_root_tab_ent; + while(tab_ent) { + SetMode_GlobalTrie(TabEnt_mode(tab_ent)); + tab_ent = TabEnt_next(tab_ent); + } + SetMode_GlobalTrie(yap_flags[TABLING_MODE_FLAG]); } break; #endif /* TABLING */ diff --git a/H/iatoms.h b/H/iatoms.h index c835df88a..431c1aff8 100644 --- a/H/iatoms.h +++ b/H/iatoms.h @@ -114,7 +114,8 @@ AtomGeneratePredInfo = Yap_FullLookupAtom("$generate_pred_info"); AtomGetwork = Yap_FullLookupAtom("$getwork"); AtomGetworkSeq = Yap_FullLookupAtom("$getwork_seq"); - AtomGlobal = Yap_LookupAtom("global_sp"); + AtomGlobalSp = Yap_LookupAtom("global_sp"); + AtomGlobalTrie = Yap_LookupAtom("global_trie"); AtomGoalExpansion = Yap_LookupAtom("goal_expansion"); AtomHERE = Yap_LookupAtom("\n <====HERE====> \n"); AtomHandleThrow = Yap_FullLookupAtom("$handle_throw"); @@ -142,8 +143,9 @@ AtomList = Yap_LookupAtom("list"); AtomLive = Yap_FullLookupAtom("$live"); AtomLoadAnswers = Yap_LookupAtom("load_answers"); - AtomLocal = Yap_LookupAtom("local_sp"); - AtomLocalA = Yap_LookupAtom("local"); + AtomLocal = Yap_LookupAtom("local"); + AtomLocalSp = Yap_LookupAtom("local_sp"); + AtomLocalTrie = Yap_LookupAtom("local_trie"); AtomMaxArity = Yap_LookupAtom("max_arity"); AtomMaxFiles = Yap_LookupAtom("max_files"); AtomMegaClause = Yap_FullLookupAtom("$mega_clause"); diff --git a/H/ratoms.h b/H/ratoms.h index 49c9c48d6..195310e81 100644 --- a/H/ratoms.h +++ b/H/ratoms.h @@ -114,7 +114,8 @@ AtomGeneratePredInfo = AtomAdjust(AtomGeneratePredInfo); AtomGetwork = AtomAdjust(AtomGetwork); AtomGetworkSeq = AtomAdjust(AtomGetworkSeq); - AtomGlobal = AtomAdjust(AtomGlobal); + AtomGlobalSp = AtomAdjust(AtomGlobalSp); + AtomGlobalTrie = AtomAdjust(AtomGlobalTrie); AtomGoalExpansion = AtomAdjust(AtomGoalExpansion); AtomHERE = AtomAdjust(AtomHERE); AtomHandleThrow = AtomAdjust(AtomHandleThrow); @@ -143,7 +144,8 @@ AtomLive = AtomAdjust(AtomLive); AtomLoadAnswers = AtomAdjust(AtomLoadAnswers); AtomLocal = AtomAdjust(AtomLocal); - AtomLocalA = AtomAdjust(AtomLocalA); + AtomLocalSp = AtomAdjust(AtomLocalSp); + AtomLocalTrie = AtomAdjust(AtomLocalTrie); AtomMaxArity = AtomAdjust(AtomMaxArity); AtomMaxFiles = AtomAdjust(AtomMaxFiles); AtomMegaClause = AtomAdjust(AtomMegaClause); diff --git a/H/tatoms.h b/H/tatoms.h index 7fdc3fad5..02afbf4ac 100644 --- a/H/tatoms.h +++ b/H/tatoms.h @@ -230,8 +230,10 @@ #define AtomGetwork Yap_heap_regs->AtomGetwork_ Atom AtomGetworkSeq_; #define AtomGetworkSeq Yap_heap_regs->AtomGetworkSeq_ - Atom AtomGlobal_; -#define AtomGlobal Yap_heap_regs->AtomGlobal_ + Atom AtomGlobalSp_; +#define AtomGlobalSp Yap_heap_regs->AtomGlobalSp_ + Atom AtomGlobalTrie_; +#define AtomGlobalTrie Yap_heap_regs->AtomGlobalTrie_ Atom AtomGoalExpansion_; #define AtomGoalExpansion Yap_heap_regs->AtomGoalExpansion_ Atom AtomHERE_; @@ -288,8 +290,10 @@ #define AtomLoadAnswers Yap_heap_regs->AtomLoadAnswers_ Atom AtomLocal_; #define AtomLocal Yap_heap_regs->AtomLocal_ - Atom AtomLocalA_; -#define AtomLocalA Yap_heap_regs->AtomLocalA_ + Atom AtomLocalSp_; +#define AtomLocalSp Yap_heap_regs->AtomLocalSp_ + Atom AtomLocalTrie_; +#define AtomLocalTrie Yap_heap_regs->AtomLocalTrie_ Atom AtomMaxArity_; #define AtomMaxArity Yap_heap_regs->AtomMaxArity_ Atom AtomMaxFiles_; diff --git a/OPTYap/opt.preds.c b/OPTYap/opt.preds.c index a384a34c1..eb375a0ed 100644 --- a/OPTYap/opt.preds.c +++ b/OPTYap/opt.preds.c @@ -616,10 +616,6 @@ Int p_table(void) { return (FALSE); /* predicate already compiled */ pe->PredFlags |= TabledPredFlag; new_table_entry(tab_ent, pe, at, arity); - if (IsMode_Local(yap_flags[TABLING_MODE_FLAG])) - SetMode_Local(TabEnt_mode(tab_ent)); - if (IsMode_LoadAnswers(yap_flags[TABLING_MODE_FLAG])) - SetMode_LoadAnswers(TabEnt_mode(tab_ent)); pe->TableOfPred = tab_ent; return (TRUE); } @@ -627,7 +623,7 @@ Int p_table(void) { static Int p_tabling_mode(void) { - Term mod, t, val; + Term mod, t, tvalue; tab_ent_ptr tab_ent; mod = Deref(ARG1); @@ -638,62 +634,70 @@ Int p_tabling_mode(void) { tab_ent = RepPredProp(PredPropByFunc(FunctorOfTerm(t), mod))->TableOfPred; else return (FALSE); - val = Deref(ARG3); - if (IsVarTerm(val)) { - Term mode; - t = MkAtomTerm(AtomNil); - if (IsDefaultMode_LoadAnswers(TabEnt_mode(tab_ent))) - mode = MkAtomTerm(Yap_LookupAtom("load_answers")); - else - mode = MkAtomTerm(Yap_LookupAtom("exec_answers")); - t = MkPairTerm(mode, t); - if (IsDefaultMode_Local(TabEnt_mode(tab_ent))) - mode = MkAtomTerm(Yap_LookupAtom("local")); - else - mode = MkAtomTerm(Yap_LookupAtom("batched")); - t = MkPairTerm(mode, t); - mode = MkAtomTerm(Yap_LookupAtom("default")); - t = MkPairTerm(mode, t); - t = MkPairTerm(t, MkAtomTerm(AtomNil)); - if (IsMode_LoadAnswers(TabEnt_mode(tab_ent))) - mode = MkAtomTerm(Yap_LookupAtom("load_answers")); - else - mode = MkAtomTerm(Yap_LookupAtom("exec_answers")); - t = MkPairTerm(mode, t); - if (IsMode_Local(TabEnt_mode(tab_ent))) - mode = MkAtomTerm(Yap_LookupAtom("local")); - else - mode = MkAtomTerm(Yap_LookupAtom("batched")); - t = MkPairTerm(mode, t); - Bind((CELL *)val, t); + tvalue = Deref(ARG3); + if (IsVarTerm(tvalue)) { + t = TermNil; + if (IsMode_LocalTrie(TabEnt_flags(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomLocalTrie), t); + else if (IsMode_GlobalTrie(TabEnt_flags(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomGlobalTrie), t); + if (IsMode_ExecAnswers(TabEnt_flags(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomExecAnswers), t); + else if (IsMode_LoadAnswers(TabEnt_flags(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomLoadAnswers), t); + if (IsMode_Batched(TabEnt_flags(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomBatched), t); + else if (IsMode_Local(TabEnt_flags(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomLocal), t); + t = MkPairTerm(MkAtomTerm(AtomDefault), t); + t = MkPairTerm(t, TermNil); + if (IsMode_LocalTrie(TabEnt_mode(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomLocalTrie), t); + else if (IsMode_GlobalTrie(TabEnt_mode(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomGlobalTrie), t); + if (IsMode_ExecAnswers(TabEnt_mode(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomExecAnswers), t); + else if (IsMode_LoadAnswers(TabEnt_mode(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomLoadAnswers), t); + if (IsMode_Batched(TabEnt_mode(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomBatched), t); + else if (IsMode_Local(TabEnt_mode(tab_ent))) + t = MkPairTerm(MkAtomTerm(AtomLocal), t); + Bind((CELL *) tvalue, t); return(TRUE); - } - if (IsAtomTerm(val)) { - char *str_val = RepAtom(AtomOfTerm(val))->StrOfAE; - if (strcmp(str_val,"batched") == 0) { - SetDefaultMode_Batched(TabEnt_mode(tab_ent)); - if (IsMode_SchedulingOff(yap_flags[TABLING_MODE_FLAG])) + } else if (IsIntTerm(tvalue)) { + Int value = IntOfTerm(tvalue); + if (value == 1) { /* batched */ + SetMode_Batched(TabEnt_flags(tab_ent)); + if (! IsMode_Local(yap_flags[TABLING_MODE_FLAG])) SetMode_Batched(TabEnt_mode(tab_ent)); return(TRUE); - } - if (strcmp(str_val,"local") == 0) { - SetDefaultMode_Local(TabEnt_mode(tab_ent)); - if (IsMode_SchedulingOff(yap_flags[TABLING_MODE_FLAG])) + } else if (value == 2) { /* local */ + SetMode_Local(TabEnt_flags(tab_ent)); + if (! IsMode_Batched(yap_flags[TABLING_MODE_FLAG])) SetMode_Local(TabEnt_mode(tab_ent)); return(TRUE); - } - if (strcmp(str_val,"exec_answers") == 0) { - SetDefaultMode_ExecAnswers(TabEnt_mode(tab_ent)); - if (IsMode_CompletedOff(yap_flags[TABLING_MODE_FLAG])) + } else if (value == 3) { /* exec_answers */ + SetMode_ExecAnswers(TabEnt_flags(tab_ent)); + if (! IsMode_LoadAnswers(yap_flags[TABLING_MODE_FLAG])) SetMode_ExecAnswers(TabEnt_mode(tab_ent)); return(TRUE); - } - if (strcmp(str_val,"load_answers") == 0) { - SetDefaultMode_LoadAnswers(TabEnt_mode(tab_ent)); - if (IsMode_CompletedOff(yap_flags[TABLING_MODE_FLAG])) + } else if (value == 4) { /* load_answers */ + SetMode_LoadAnswers(TabEnt_flags(tab_ent)); + if (! IsMode_ExecAnswers(yap_flags[TABLING_MODE_FLAG])) SetMode_LoadAnswers(TabEnt_mode(tab_ent)); return(TRUE); - } + } else if (value == 5) { /* local_trie */ + SetMode_LocalTrie(TabEnt_flags(tab_ent)); + if (! IsMode_GlobalTrie(yap_flags[TABLING_MODE_FLAG])) + SetMode_LocalTrie(TabEnt_mode(tab_ent)); + return(TRUE); + } else if (value == 6) { /* global_trie */ + SetMode_GlobalTrie(TabEnt_flags(tab_ent)); + if (! IsMode_LocalTrie(yap_flags[TABLING_MODE_FLAG])) + SetMode_GlobalTrie(TabEnt_mode(tab_ent)); + return(TRUE); + } } return (FALSE); } diff --git a/OPTYap/tab.macros.h b/OPTYap/tab.macros.h index 788cbf0b4..32999df3b 100644 --- a/OPTYap/tab.macros.h +++ b/OPTYap/tab.macros.h @@ -56,6 +56,35 @@ static inline tg_sol_fr_ptr CUT_prune_tg_solution_frames(tg_sol_fr_ptr, int); +/********************************* +** Tabling mode flags ** +*********************************/ + +#define Flag_Batched 0x001 +#define Flag_Local 0x002 +#define Flags_SchedulingMode (Flag_Batched | Flag_Local) +#define Flag_ExecAnswers 0x010 +#define Flag_LoadAnswers 0x020 +#define Flags_AnswersMode (Flag_ExecAnswers | Flag_LoadAnswers) +#define Flag_LocalTrie 0x100 +#define Flag_GlobalTrie 0x200 +#define Flags_TrieMode (Flag_LocalTrie | Flag_GlobalTrie) + +#define SetMode_Batched(X) (X) = ((X) & ~Flags_SchedulingMode) | Flag_Batched +#define SetMode_Local(X) (X) = ((X) & ~Flags_SchedulingMode) | Flag_Local +#define SetMode_ExecAnswers(X) (X) = ((X) & ~Flags_AnswersMode) | Flag_ExecAnswers +#define SetMode_LoadAnswers(X) (X) = ((X) & ~Flags_AnswersMode) | Flag_LoadAnswers +#define SetMode_LocalTrie(X) (X) = ((X) & ~Flags_TrieMode) | Flag_LocalTrie +#define SetMode_GlobalTrie(X) (X) = ((X) & ~Flags_TrieMode) | Flag_GlobalTrie +#define IsMode_Batched(X) ((X) & Flag_Batched) +#define IsMode_Local(X) ((X) & Flag_Local) +#define IsMode_ExecAnswers(X) ((X) & Flag_ExecAnswers) +#define IsMode_LoadAnswers(X) ((X) & Flag_LoadAnswers) +#define IsMode_LocalTrie(X) ((X) & Flag_LocalTrie) +#define IsMode_GlobalTrie(X) ((X) & Flag_GlobalTrie) + + + /********************* ** Macros ** *********************/ @@ -227,19 +256,29 @@ static inline tg_sol_fr_ptr CUT_prune_tg_solution_frames(tg_sol_fr_ptr, int); #define TrNode_init_lock_field(NODE) #endif /* TABLE_LOCK_AT_NODE_LEVEL */ -#define new_table_entry(TAB_ENT, PRED_ENTRY, ATOM, ARITY) \ - { register sg_node_ptr sg_node; \ - new_subgoal_trie_node(sg_node, 0, NULL, NULL, NULL); \ - ALLOC_TABLE_ENTRY(TAB_ENT); \ - TabEnt_init_lock_field(TAB_ENT); \ - TabEnt_pe(TAB_ENT) = PRED_ENTRY; \ - TabEnt_atom(TAB_ENT) = ATOM; \ - TabEnt_arity(TAB_ENT) = ARITY; \ - TabEnt_mode(TAB_ENT) = 0; \ - TabEnt_subgoal_trie(TAB_ENT) = sg_node; \ - TabEnt_hash_chain(TAB_ENT) = NULL; \ - TabEnt_next(TAB_ENT) = GLOBAL_root_tab_ent; \ - GLOBAL_root_tab_ent = TAB_ENT; \ +#define new_table_entry(TAB_ENT, PRED_ENTRY, ATOM, ARITY) \ + { register sg_node_ptr sg_node; \ + new_subgoal_trie_node(sg_node, 0, NULL, NULL, NULL); \ + ALLOC_TABLE_ENTRY(TAB_ENT); \ + TabEnt_init_lock_field(TAB_ENT); \ + TabEnt_pe(TAB_ENT) = PRED_ENTRY; \ + TabEnt_atom(TAB_ENT) = ATOM; \ + TabEnt_arity(TAB_ENT) = ARITY; \ + TabEnt_flags(TAB_ENT) = 0; \ + SetMode_Batched(TabEnt_flags(TAB_ENT)); \ + SetMode_ExecAnswers(TabEnt_flags(TAB_ENT)); \ + SetMode_LocalTrie(TabEnt_flags(TAB_ENT)); \ + TabEnt_mode(TAB_ENT) = TabEnt_flags(TAB_ENT); \ + if (IsMode_Local(yap_flags[TABLING_MODE_FLAG])) \ + SetMode_Local(TabEnt_mode(TAB_ENT)); \ + if (IsMode_LoadAnswers(yap_flags[TABLING_MODE_FLAG])) \ + SetMode_LoadAnswers(TabEnt_mode(TAB_ENT)); \ + if (IsMode_GlobalTrie(yap_flags[TABLING_MODE_FLAG])) \ + SetMode_GlobalTrie(TabEnt_mode(TAB_ENT)); \ + TabEnt_subgoal_trie(TAB_ENT) = sg_node; \ + TabEnt_hash_chain(TAB_ENT) = NULL; \ + TabEnt_next(TAB_ENT) = GLOBAL_root_tab_ent; \ + GLOBAL_root_tab_ent = TAB_ENT; \ } #define new_subgoal_frame(SG_FR, CODE) \ diff --git a/OPTYap/tab.structs.h b/OPTYap/tab.structs.h index be7bb2399..f782f98dd 100644 --- a/OPTYap/tab.structs.h +++ b/OPTYap/tab.structs.h @@ -11,58 +11,23 @@ ** ** ************************************************************************/ -/********************************* -** Tabling mode flags ** -*********************************/ +/************************************************************************ +** Table Space Data Structures ** +************************************************************************/ -#define Mode_SchedulingOn 0x00000001L /* yap_flags[TABLING_MODE_FLAG] */ -#define Mode_CompletedOn 0x00000002L /* yap_flags[TABLING_MODE_FLAG] */ - -#define Mode_Local 0x10000000L /* yap_flags[TABLING_MODE_FLAG] + struct table_entry */ -#define Mode_LoadAnswers 0x20000000L /* yap_flags[TABLING_MODE_FLAG] + struct table_entry */ - -#define DefaultMode_Local 0x00000001L /* struct table_entry */ -#define DefaultMode_LoadAnswers 0x00000002L /* struct table_entry */ - -#define SetMode_SchedulingOn(X) (X) |= Mode_SchedulingOn -#define SetMode_CompletedOn(X) (X) |= Mode_CompletedOn -#define IsMode_SchedulingOn(X) ((X) & Mode_SchedulingOn) -#define IsMode_SchedulingOff(X) (!IsMode_SchedulingOn(X)) -#define IsMode_CompletedOn(X) ((X) & Mode_CompletedOn) -#define IsMode_CompletedOff(X) (!IsMode_CompletedOn(X)) - -#define SetMode_Local(X) (X) |= Mode_Local -#define SetMode_Batched(X) (X) &= ~Mode_Local -#define SetMode_LoadAnswers(X) (X) |= Mode_LoadAnswers -#define SetMode_ExecAnswers(X) (X) &= ~Mode_LoadAnswers -#define IsMode_Local(X) ((X) & Mode_Local) -#define IsMode_Batched(X) (!IsMode_Local(X)) -#define IsMode_LoadAnswers(X) ((X) & Mode_LoadAnswers) -#define IsMode_ExecAnswers(X) (!IsMode_LoadAnswers(X)) - -#define SetDefaultMode_Local(X) (X) |= DefaultMode_Local -#define SetDefaultMode_Batched(X) (X) &= ~DefaultMode_Local -#define SetDefaultMode_LoadAnswers(X) (X) |= DefaultMode_LoadAnswers -#define SetDefaultMode_ExecAnswers(X) (X) &= ~DefaultMode_LoadAnswers -#define IsDefaultMode_Local(X) ((X) & DefaultMode_Local) -#define IsDefaultMode_Batched(X) (!IsDefaultMode_Local(X)) -#define IsDefaultMode_LoadAnswers(X) ((X) & DefaultMode_LoadAnswers) -#define IsDefaultMode_ExecAnswers(X) (!IsDefaultMode_LoadAnswers(X)) - - - -/********************************* -** Struct table_entry ** -*********************************/ +/************************** +** table_entry ** +**************************/ typedef struct table_entry { #if defined(YAPOR) || defined(THREADS) lockvar lock; -#endif /* YAPOR */ +#endif /* YAPOR || THREADS */ struct pred_entry *pred_entry; Atom pred_atom; int pred_arity; - int mode_flags; + short pred_flags; + short execution_mode; /* combines yap_flags with pred_flags */ struct subgoal_trie_node *subgoal_trie; struct subgoal_trie_hash *hash_chain; struct table_entry *next; @@ -72,16 +37,17 @@ typedef struct table_entry { #define TabEnt_pe(X) ((X)->pred_entry) #define TabEnt_atom(X) ((X)->pred_atom) #define TabEnt_arity(X) ((X)->pred_arity) -#define TabEnt_mode(X) ((X)->mode_flags) +#define TabEnt_flags(X) ((X)->pred_flags) +#define TabEnt_mode(X) ((X)->execution_mode) #define TabEnt_subgoal_trie(X) ((X)->subgoal_trie) #define TabEnt_hash_chain(X) ((X)->hash_chain) #define TabEnt_next(X) ((X)->next) -/******************************************************************************* -** Structs global_trie_node, subgoal_trie_node and answer_trie_node ** -*******************************************************************************/ +/*********************************************************************** +** global_trie_node, subgoal_trie_node and answer_trie_node ** +***********************************************************************/ #ifdef GLOBAL_TRIE typedef struct global_trie_node { @@ -127,9 +93,9 @@ typedef struct answer_trie_node { -/******************************************************************************* -** Structs global_trie_hash, subgoal_trie_hash and answer_trie_hash ** -*******************************************************************************/ +/*********************************************************************** +** global_trie_hash, subgoal_trie_hash and answer_trie_hash ** +***********************************************************************/ #ifdef GLOBAL_TRIE typedef struct global_trie_hash { @@ -172,9 +138,54 @@ typedef struct answer_trie_hash { -/*********************************** -** Struct subgoal_frame ** -***********************************/ +/************************************************************************ +** Execution Data Structures ** +************************************************************************/ + +/**************************** +** choice points ** +****************************/ + +struct generator_choicept { + struct choicept cp; + struct dependency_frame *cp_dep_fr; /* always NULL if batched scheduling */ + struct subgoal_frame *cp_sg_fr; +#ifdef LOW_LEVEL_TRACER + struct pred_entry *cp_pred_entry; +#endif /* LOW_LEVEL_TRACER */ +}; + +#ifdef DETERMINISTIC_TABLING +struct deterministic_generator_choicept { + struct deterministic_choicept cp; + struct subgoal_frame *cp_sg_fr; +#ifdef LOW_LEVEL_TRACER + struct pred_entry *cp_pred_entry; +#endif /* LOW_LEVEL_TRACER */ +}; +#endif /* DETERMINISTIC_TABLING */ + +struct consumer_choicept { + struct choicept cp; + struct dependency_frame *cp_dep_fr; +#ifdef LOW_LEVEL_TRACER + struct pred_entry *cp_pred_entry; +#endif /* LOW_LEVEL_TRACER */ +}; + +struct loader_choicept { + struct choicept cp; + struct answer_trie_node *cp_last_answer; +#ifdef LOW_LEVEL_TRACER + struct pred_entry *cp_pred_entry; +#endif /* LOW_LEVEL_TRACER */ +}; + + + +/**************************** +** subgoal_frame ** +****************************/ typedef struct subgoal_frame { #if defined(YAPOR) || defined(THREADS) @@ -185,7 +196,7 @@ typedef struct subgoal_frame { struct or_frame *top_or_frame_on_generator_branch; #endif /* YAPOR */ yamop *code_of_subgoal; - enum { + enum { /* do not change order !!! */ incomplete = 0, /* INCOMPLETE_TABLING */ ready = 1, evaluating = 2, @@ -193,7 +204,7 @@ typedef struct subgoal_frame { complete_in_use = 4, /* LIMIT_TABLING */ compiled = 5, compiled_in_use = 6 /* LIMIT_TABLING */ - } state_flag; /* do not change order !!! */ + } state_flag; choiceptr generator_choice_point; struct answer_trie_hash *hash_chain; struct answer_trie_node *answer_trie; @@ -252,14 +263,14 @@ typedef struct subgoal_frame { -/************************************** -** Struct dependency_frame ** -**************************************/ +/******************************* +** dependency_frame ** +*******************************/ typedef struct dependency_frame { #if defined(YAPOR) || defined(THREADS) lockvar lock; -#endif +#endif /* YAPOR || THREADS */ #ifdef YAPOR int leader_dependency_is_on_stack; struct or_frame *top_or_frame; @@ -307,9 +318,9 @@ typedef struct dependency_frame { -/************************************** -** Struct suspension_frame ** -**************************************/ +/******************************* +** suspension_frame ** +*******************************/ #ifdef YAPOR typedef struct suspension_frame { @@ -338,44 +349,3 @@ typedef struct suspension_frame { #define SuspFr_trail_start(X) ((X)->trail_block.block_start) #define SuspFr_trail_size(X) ((X)->trail_block.block_size) #define SuspFr_next(X) ((X)->next) - - - -/************************************ -** Structs choice points ** -************************************/ - -struct generator_choicept { - struct choicept cp; - struct dependency_frame *cp_dep_fr; /* always NULL if batched scheduling */ - struct subgoal_frame *cp_sg_fr; -#ifdef LOW_LEVEL_TRACER - struct pred_entry *cp_pred_entry; -#endif /* LOW_LEVEL_TRACER */ -}; - -#ifdef DETERMINISTIC_TABLING -struct deterministic_generator_choicept { - struct deterministic_choicept cp; - struct subgoal_frame *cp_sg_fr; -#ifdef LOW_LEVEL_TRACER - struct pred_entry *cp_pred_entry; -#endif /* LOW_LEVEL_TRACER */ -}; -#endif /* DETERMINISTIC_TABLING */ - -struct consumer_choicept { - struct choicept cp; - struct dependency_frame *cp_dep_fr; -#ifdef LOW_LEVEL_TRACER - struct pred_entry *cp_pred_entry; -#endif /* LOW_LEVEL_TRACER */ -}; - -struct loader_choicept { - struct choicept cp; - struct answer_trie_node *cp_last_answer; -#ifdef LOW_LEVEL_TRACER - struct pred_entry *cp_pred_entry; -#endif /* LOW_LEVEL_TRACER */ -}; diff --git a/misc/ATOMS b/misc/ATOMS index 48a18259d..9c1b75e53 100644 --- a/misc/ATOMS +++ b/misc/ATOMS @@ -123,7 +123,8 @@ A GcVeryVerbose F "$gc_very_verbose" A GeneratePredInfo F "$generate_pred_info" A Getwork F "$getwork" A GetworkSeq F "$getwork_seq" -A Global N "global_sp" +A GlobalSp N "global_sp" +A GlobalTrie N "global_trie" A GoalExpansion N "goal_expansion" A HERE N "\n <====HERE====> \n" A HandleThrow F "$handle_throw" @@ -151,8 +152,9 @@ A Leash F "$leash" A List N "list" A Live F "$live" A LoadAnswers N "load_answers" -A Local N "local_sp" -A LocalA N "local" +A Local N "local" +A LocalSp N "local_sp" +A LocalTrie N "local_trie" A MaxArity N "max_arity" A MaxFiles N "max_files" A MegaClause F "$mega_clause" diff --git a/pl/flags.yap b/pl/flags.yap index ccce5935d..53885bb3f 100644 --- a/pl/flags.yap +++ b/pl/flags.yap @@ -190,25 +190,25 @@ yap_flag(home,X) :- yap_flag(tabling_mode,Options) :- var(Options), !, '$access_yap_flags'(20,Options). -yap_flag(tabling_mode,[]) :- !. +yap_flag(tabling_mode,[]) :- !, + yap_flag(tabling_mode,default). yap_flag(tabling_mode,[HOption|TOption]) :- !, - yap_flag(tabling_mode,HOption), - yap_flag(tabling_mode,TOption). -yap_flag(tabling_mode,(Option1,Option2)) :- !, - yap_flag(tabling_mode,Option1), - yap_flag(tabling_mode,Option2). + yap_flag(tabling_mode,TOption), + yap_flag(tabling_mode,HOption). yap_flag(tabling_mode,Option) :- - '$transl_to_tabling_mode'(Flag,Option), + '$transl_to_yap_flag_tabling_mode'(Flag,Option), !, '$set_yap_flags'(20,Flag). yap_flag(tabling_mode,Options) :- '$do_error'(domain_error(flag_value,tabling_mode+Options),yap_flag(tabling_mode,Options)). % should match with code in stdpreds.c -'$transl_to_tabling_mode'(0,default). -'$transl_to_tabling_mode'(1,batched). -'$transl_to_tabling_mode'(2,local). -'$transl_to_tabling_mode'(3,exec_answers). -'$transl_to_tabling_mode'(4,load_answers). +'$transl_to_yap_flag_tabling_mode'(0,default). +'$transl_to_yap_flag_tabling_mode'(1,batched). +'$transl_to_yap_flag_tabling_mode'(2,local). +'$transl_to_yap_flag_tabling_mode'(3,exec_answers). +'$transl_to_yap_flag_tabling_mode'(4,load_answers). +'$transl_to_yap_flag_tabling_mode'(5,local_trie). +'$transl_to_yap_flag_tabling_mode'(6,global_trie). yap_flag(informational_messages,X) :- var(X), !, get_value('$verbose',X). diff --git a/pl/tabling.yap b/pl/tabling.yap index 822feb4f4..564d5cde0 100644 --- a/pl/tabling.yap +++ b/pl/tabling.yap @@ -120,9 +120,12 @@ tabling_mode(Pred,Options) :- integer(PredArity), functor(PredFunctor,PredName,PredArity), '$flags'(PredFunctor,Mod,Flags,Flags), !, - (Flags /\ 0x000040 =\= 0, !, '$set_tabling_mode'(Mod,PredFunctor,Options) + ( + Flags /\ 0x000040 =\= 0, !, '$set_tabling_mode'(Mod,PredFunctor,Options) ; - '$do_error'(domain_error(table,Mod:PredName/PredArity),tabling_mode(Mod:PredName/PredArity,Options))). +write(icardioi),nl, + '$do_error'(domain_error(table,Mod:PredName/PredArity),tabling_mode(Mod:PredName/PredArity,Options)) + ). '$do_tabling_mode'(Mod,Pred,Options) :- '$do_error'(type_error(callable,Mod:Pred),tabling_mode(Mod:Pred,Options)). @@ -137,12 +140,20 @@ tabling_mode(Pred,Options) :- '$set_tabling_mode'(Mod,PredFunctor,Option1), '$set_tabling_mode'(Mod,PredFunctor,Option2). '$set_tabling_mode'(Mod,PredFunctor,Option) :- - (Option = batched ; Option = local ; Option = exec_answers ; Option = load_answers), !, - '$c_tabling_mode'(Mod,PredFunctor,Option). + '$transl_to_pred_flag_tabling_mode'(Flag,Option), !, + '$c_tabling_mode'(Mod,PredFunctor,Flag). '$set_tabling_mode'(Mod,PredFunctor,Options) :- functor(PredFunctor,PredName,PredArity), '$do_error'(domain_error(flag_value,tabling_mode+Options),tabling_mode(Mod:PredName/PredArity,Options)). +% should match with code in OPTYap/opt.preds.c +'$transl_to_pred_flag_tabling_mode'(1,batched). +'$transl_to_pred_flag_tabling_mode'(2,local). +'$transl_to_pred_flag_tabling_mode'(3,exec_answers). +'$transl_to_pred_flag_tabling_mode'(4,load_answers). +'$transl_to_pred_flag_tabling_mode'(5,local_trie). +'$transl_to_pred_flag_tabling_mode'(6,global_trie). + /************************** @@ -170,9 +181,11 @@ abolish_table(Pred) :- integer(PredArity), functor(PredFunctor,PredName,PredArity), '$flags'(PredFunctor,Mod,Flags,Flags), !, - (Flags /\ 0x000040 =\= 0, !, '$c_abolish_table'(Mod,PredFunctor) + ( + Flags /\ 0x000040 =\= 0, !, '$c_abolish_table'(Mod,PredFunctor) ; - '$do_error'(domain_error(table,Mod:PredName/PredArity),abolish_table(Mod:PredName/PredArity))). + '$do_error'(domain_error(table,Mod:PredName/PredArity),abolish_table(Mod:PredName/PredArity)) + ). '$do_abolish_table'(Mod,Pred) :- '$do_error'(type_error(callable,Mod:Pred),abolish_table(Mod:Pred)). @@ -203,9 +216,11 @@ show_table(Pred) :- integer(PredArity), functor(PredFunctor,PredName,PredArity), '$flags'(PredFunctor,Mod,Flags,Flags), !, - (Flags /\ 0x000040 =\= 0, !, '$c_show_table'(Mod,PredFunctor) + ( + Flags /\ 0x000040 =\= 0, !, '$c_show_table'(Mod,PredFunctor) ; - '$do_error'(domain_error(table,Mod:PredName/PredArity),show_table(Mod:PredName/PredArity))). + '$do_error'(domain_error(table,Mod:PredName/PredArity),show_table(Mod:PredName/PredArity)) + ). '$do_show_table'(Mod,Pred) :- '$do_error'(type_error(callable,Mod:Pred),show_table(Mod:Pred)). @@ -236,8 +251,10 @@ table_statistics(Pred) :- integer(PredArity), functor(PredFunctor,PredName,PredArity), '$flags'(PredFunctor,Mod,Flags,Flags), !, - (Flags /\ 0x000040 =\= 0, !, '$c_table_statistics'(Mod,PredFunctor) + ( + Flags /\ 0x000040 =\= 0, !, '$c_table_statistics'(Mod,PredFunctor) ; - '$do_error'(domain_error(table,Mod:PredName/PredArity),table_statistics(Mod:PredName/PredArity))). + '$do_error'(domain_error(table,Mod:PredName/PredArity),table_statistics(Mod:PredName/PredArity)) + ). '$do_table_statistics'(Mod,Pred) :- '$do_error'(type_error(callable,Mod:Pred),table_statistics(Mod:Pred)).