adding two new modes to the yap_flag/2 and tabling_mode/2 built-in
predicates: 'local_trie' mode and 'global_trie' mode.
This commit is contained in:
parent
052c20a29b
commit
ddb1cd8604
@ -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);
|
||||
|
65
C/stdpreds.c
65
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 <stdio.h>
|
||||
#if HAVE_STRING_H
|
||||
#include <string.h>
|
||||
@ -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 */
|
||||
|
@ -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");
|
||||
|
@ -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);
|
||||
|
12
H/tatoms.h
12
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_;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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) \
|
||||
|
@ -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 */
|
||||
};
|
||||
|
@ -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"
|
||||
|
24
pl/flags.yap
24
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).
|
||||
|
@ -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)).
|
||||
|
Reference in New Issue
Block a user