18#ifdef LOW_LEVEL_TRACER
19#define store_low_level_trace_info(CP, TAB_ENT) \
20 CP->cp_pred_entry = TabEnt_pe(TAB_ENT)
22#define store_low_level_trace_info(CP, TAB_ENT)
25#define TABLING_ERROR_CHECKING_STACK \
26 TABLING_ERROR_CHECKING(store_node, Unsigned(H) + 1024 > Unsigned(B)); \
27 TABLING_ERROR_CHECKING(store_node, Unsigned(H_FZ) + 1024 > Unsigned(B))
30#define store_generator_node(TAB_ENT, SG_FR, ARITY, AP) \
31 { register CELL *pt_args; \
32 register choiceptr gcp; \
34 pt_args = XREGS + (ARITY); \
35 while (pt_args > XREGS) { \
36 register CELL aux_arg = pt_args[0]; \
42 YENV = (CELL *) (GEN_CP(YENV) - 1); \
43 gcp = NORM_CP(YENV); \
44 SgFr_gen_cp(SG_FR) = gcp; \
47 store_yaam_reg_cpdepth(gcp); \
49 gcp->cp_ap = (yamop *)(AP); \
54 if (IsMode_Local(TabEnt_mode(TAB_ENT))) { \
56 register dep_fr_ptr new_dep_fr; \
62 new_dependency_frame(new_dep_fr, TRUE, LOCAL_top_or_fr, gcp, \
63 gcp, SG_FR, FALSE, LOCAL_top_dep_fr); \
64 LOCAL_top_dep_fr = new_dep_fr; \
65 GEN_CP(gcp)->cp_dep_fr = LOCAL_top_dep_fr; \
68 GEN_CP(gcp)->cp_dep_fr = NULL; \
70 GEN_CP(gcp)->cp_sg_fr = SG_FR; \
71 store_low_level_trace_info(GEN_CP(gcp), TAB_ENT); \
72 set_cut((CELL *)gcp, B); \
76 TABLING_ERROR_CHECKING_STACK; \
80#ifdef DETERMINISTIC_TABLING
81#define store_deterministic_generator_node(TAB_ENT, SG_FR) \
82 { register choiceptr gcp; \
84 YENV = (CELL *) (DET_GEN_CP(YENV) - 1); \
85 gcp = NORM_CP(YENV); \
86 SgFr_gen_cp(SG_FR) = gcp; \
89 store_yaam_reg_cpdepth(gcp); \
90 gcp->cp_ap = COMPLETION; \
94 DET_GEN_CP(gcp)->cp_sg_fr = SG_FR; \
95 store_low_level_trace_info(DET_GEN_CP(gcp), TAB_ENT); \
96 set_cut((CELL *)gcp, B); \
100 TABLING_ERROR_CHECKING_STACK; \
105#ifdef THREADS_CONSUMER_SHARING
106#define store_generator_consumer_node(TAB_ENT, SG_FR, DEP_ON_STACK,ARITY) \
107 { register CELL *pt_args; \
108 register choiceptr gccp; \
109 register dep_fr_ptr new_dep_fr; \
111 pt_args = XREGS + (ARITY); \
112 while (pt_args > XREGS) { \
113 register CELL aux_arg = pt_args[0]; \
119 YENV = (CELL *) (GEN_CP(YENV) - 1); \
120 gccp = NORM_CP(YENV); \
121 SgFr_gen_cp(SG_FR) = gccp; \
124 store_yaam_reg_cpdepth(gccp); \
126 gccp->cp_ap = ANSWER_RESOLUTION_COMPLETION; \
129 gccp->cp_env = ENV; \
130 gccp->cp_cp = CPREG; \
132 new_dependency_frame(new_dep_fr, DEP_ON_STACK, LOCAL_top_or_fr, \
133 gccp, gccp, SG_FR, TRUE, LOCAL_top_dep_fr); \
134 LOCAL_top_dep_fr = new_dep_fr; \
135 GEN_CP(gccp)->cp_dep_fr = LOCAL_top_dep_fr; \
136 GEN_CP(gccp)->cp_sg_fr = SG_FR; \
141 store_low_level_trace_info(GEN_CP(gccp), TAB_ENT); \
142 set_cut((CELL *)gccp, B); \
146 TABLING_ERROR_CHECKING_STACK; \
151#define restore_generator_node(ARITY, AP) \
152 { register CELL *pt_args, *x_args; \
153 register choiceptr gcp = B; \
155 HR = HBREG = PROTECT_FROZEN_H(gcp); \
156 restore_yaam_reg_cpdepth(gcp); \
157 CPREG = gcp->cp_cp; \
159 YAPOR_update_alternative(PREG, (yamop *) AP) \
160 gcp->cp_ap = (yamop *) AP; \
162 pt_args = (CELL *)(GEN_CP(gcp) + 1) + ARITY; \
163 x_args = XREGS + 1 + ARITY; \
164 while (x_args > XREGS + 1) { \
165 register CELL x = pt_args[-1]; \
173#define pop_generator_node(ARITY) \
174 { register CELL *pt_args, *x_args; \
175 register choiceptr gcp = B; \
177 HR = PROTECT_FROZEN_H(gcp); \
178 pop_yaam_reg_cpdepth(gcp); \
179 CPREG = gcp->cp_cp; \
183 HBREG = PROTECT_FROZEN_H(B); \
185 x_args = XREGS + 1 ; \
186 pt_args = (CELL *)(GEN_CP(gcp) + 1); \
187 while (x_args < XREGS + 1 + ARITY) { \
188 register CELL x = pt_args[0]; \
194 SET_BB(PROTECT_FROZEN_B(B)); \
198#define store_consumer_node(TAB_ENT, SG_FR, LEADER_CP, DEP_ON_STACK) \
199 { register choiceptr ccp; \
200 register dep_fr_ptr new_dep_fr; \
202 YENV = (CELL *) (CONS_CP(YENV) - 1); \
203 ccp = NORM_CP(YENV); \
209 new_dependency_frame(new_dep_fr, DEP_ON_STACK, LOCAL_top_or_fr, \
210 LEADER_CP, ccp, SG_FR, FALSE, LOCAL_top_dep_fr); \
211 LOCAL_top_dep_fr = new_dep_fr; \
214 store_yaam_reg_cpdepth(ccp); \
216 ccp->cp_ap = ANSWER_RESOLUTION; \
220 ccp->cp_cp = CPREG; \
221 CONS_CP(ccp)->cp_dep_fr = LOCAL_top_dep_fr; \
222 store_low_level_trace_info(CONS_CP(ccp), TAB_ENT); \
227 TABLING_ERROR_CHECKING_STACK; \
231#ifdef THREADS_CONSUMER_SHARING
232#define consume_answer_and_procceed(DEP_FR, ANSWER) \
235 HR = HBREG = PROTECT_FROZEN_H(B); \
236 restore_yaam_reg_cpdepth(B); \
240 PREG = (yamop *) CPREG; \
243 if (B == DepFr_leader_cp(DEP_FR) || DepFr_external(DEP_FR)) { \
245 TABLING_ERROR_CHECKING(generator_consumer, IS_BATCHED_GEN_CP(B)); \
246 subs_ptr = (CELL *) (GEN_CP(B) + 1); \
247 subs_ptr += SgFr_arity(GEN_CP(B)->cp_sg_fr); \
249 subs_ptr = (CELL *) (CONS_CP(B) + 1); \
251 load_answer(ANSWER, subs_ptr); \
257#define consume_answer_and_procceed(DEP_FR, ANSWER) \
260 HR = HBREG = PROTECT_FROZEN_H(B); \
261 restore_yaam_reg_cpdepth(B); \
265 PREG = (yamop *) CPREG; \
268 if (B == DepFr_leader_cp(DEP_FR)) { \
271 TABLING_ERROR_CHECKING(generator_consumer, IS_BATCHED_GEN_CP(B)); \
272 subs_ptr = (CELL *) (GEN_CP(B) + 1); \
273 subs_ptr += SgFr_arity(GEN_CP(B)->cp_sg_fr); \
275 subs_ptr = (CELL *) (CONS_CP(B) + 1); \
277 load_answer(ANSWER, subs_ptr); \
285#define store_loader_node(TAB_ENT, ANSWER) \
286 { register choiceptr lcp; \
288 lcp = NORM_CP(LOAD_CP(YENV) - 1); \
291 store_yaam_reg_cpdepth(lcp); \
293 lcp->cp_ap = LOAD_ANSWER; \
297 lcp->cp_cp = CPREG; \
298 LOAD_CP(lcp)->cp_last_answer = ANSWER; \
299 store_low_level_trace_info(LOAD_CP(lcp), TAB_ENT); \
304 TABLING_ERROR_CHECKING_STACK; \
308#define restore_loader_node(ANSWER) \
309 HR = HBREG = PROTECT_FROZEN_H(B); \
310 restore_yaam_reg_cpdepth(B); \
313 LOAD_CP(B)->cp_last_answer = ANSWER; \
314 SET_BB(PROTECT_FROZEN_B(B))
317#define pop_loader_node() \
318 HR = PROTECT_FROZEN_H(B); \
319 pop_yaam_reg_cpdepth(B); \
321 TABLING_close_alt(B); \
324 HBREG = PROTECT_FROZEN_H(B); \
325 SET_BB(PROTECT_FROZEN_B(B))
329#define allocate_environment() \
330 YENV[E_CP] = (CELL) CPREG; \
331 YENV[E_E] = (CELL) ENV; \
332 YENV[E_B] = (CELL) B; \
333 YENV[E_DEPTH] = (CELL)DEPTH; \
336#define allocate_environment() \
337 YENV[E_CP] = (CELL) CPREG; \
338 YENV[E_E] = (CELL) ENV; \
339 YENV[E_B] = (CELL) B; \
349#ifdef TABLING_INNER_CUTS
350 Op(clause_with_cut, e)
351 if (LOCAL_pruning_scope) {
352 if (YOUNGER_CP(LOCAL_pruning_scope, B))
353 LOCAL_pruning_scope = B;
355 LOCAL_pruning_scope = B;
356 PUT_IN_PRUNING(worker_id);
358 PREG = NEXTOP(PREG, e);
369 PBOp(table_load_answer, Otapl)
374 if (SCH_top_shared_cp(B)) {
376 PROBLEM: cp_last_answer field is local to the cp!
377 -> we need a shared data structure to avoid redundant computations!
378 UNLOCK_OR_FRAME(LOCAL_top_or_fr);
380 fprintf(stderr,
"PROBLEM: cp_last_answer field is local to the cp!\n");
385 subs_ptr = (CELL *) (LOAD_CP(B) + 1);
386 ans_node = TrNode_child(LOAD_CP(B)->cp_last_answer);
387 if(TrNode_child(ans_node) != NULL) {
388 restore_loader_node(ans_node);
392 PREG = (
yamop *) CPREG;
394 load_answer(ans_node, subs_ptr);
405 PBOp(table_try_answer, Otapl)
406#ifdef INCOMPLETE_TABLING
410 sg_fr = GEN_CP(B)->cp_sg_fr;
411 ans_node = TrNode_child(SgFr_try_answer(sg_fr));
413 CELL *subs_ptr = (CELL *) (GEN_CP(B) + 1) + SgFr_arity(sg_fr);
415 HR = HBREG = PROTECT_FROZEN_H(B);
416 restore_yaam_reg_cpdepth(B);
419 SgFr_try_answer(sg_fr) = ans_node;
421 if (SCH_top_shared_cp(B))
422 UNLOCK_OR_FRAME(LOCAL_top_or_fr);
424 SET_BB(PROTECT_FROZEN_B(B));
426 PREG = (
yamop *) CPREG;
428 load_answer(ans_node, subs_ptr);
433 PREG = SgFr_code(sg_fr);
434 if (PREG->opc == Yap_opcode(_table_try)) {
436 code_ap = NEXTOP(PREG,Otapl);
437 PREG = PREG->y_u.Otapl.d;
438 }
else if (PREG->opc == Yap_opcode(_table_try_single)) {
440 code_ap = COMPLETION;
441 PREG = PREG->y_u.Otapl.d;
444 code_ap = PREG->y_u.Otapl.d;
445 PREG = NEXTOP(PREG,Otapl);
448 restore_generator_node(SgFr_arity(sg_fr), code_ap);
449 YENV = (CELL *) PROTECT_FROZEN_B(B);
450 set_cut(YENV, B->cp_b);
451 SET_BB(NORM_CP(YENV));
452 allocate_environment();
456 PREG = PREG->y_u.Otapl.d;
468 PBOp(table_try_single, Otapl)
473 tab_ent = PREG->y_u.Otapl.te;
476 sg_fr = subgoal_search(PREG, YENV_ADDRESS);
479#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
480 if (SgFr_state(sg_fr) <= ready) {
482 if (SgFr_sg_ent_state(sg_fr) >= complete)
483 SgFr_state(sg_fr) = SgFr_sg_ent_state(sg_fr);
485 SgFr_active_workers(sg_fr)++;
490#ifdef THREADS_CONSUMER_SHARING
491 if (SgFr_state(sg_fr) == ready_external) {
492 init_subgoal_frame(sg_fr);
493 store_generator_consumer_node(tab_ent, sg_fr, TRUE, PREG->y_u.Otapl.s);
495 allocate_environment();
496 check_for_deadlock(sg_fr);
497 goto answer_resolution_completion;
500 if (SgFr_state(sg_fr) == ready) {
502 init_subgoal_frame(sg_fr);
504#ifdef DETERMINISTIC_TABLING
505 if (IsMode_Batched(TabEnt_mode(tab_ent))) {
506 store_deterministic_generator_node(tab_ent, sg_fr);
510 store_generator_node(tab_ent, sg_fr, PREG->y_u.Otapl.s, COMPLETION);
512 PREG = PREG->y_u.Otapl.d;
514 allocate_environment();
516#ifdef INCOMPLETE_TABLING
517 }
else if (SgFr_state(sg_fr) == incomplete) {
518 if (IsMode_CoInductive(TabEnt_flags(tab_ent))) {
519 printf(
"Currently Unsupported\n");
523 CELL *subs_ptr = YENV;
524 init_subgoal_frame(sg_fr);
526 SgFr_try_answer(sg_fr) = ans_node;
527 store_generator_node(tab_ent, sg_fr, PREG->y_u.Otapl.s, TRY_ANSWER);
528 PREG = (
yamop *) CPREG;
530 load_answer(ans_node, subs_ptr);
535 }
else if (SgFr_state(sg_fr) == evaluating) {
536 if (IsMode_CoInductive(TabEnt_flags(tab_ent))) {
539 subs_ptr = (CELL *) (GEN_CP(SgFr_gen_cp(sg_fr)) + 1);
540 subs_ptr += SgFr_arity(sg_fr);
542 for (i = 0; i < subs_ptr[0]; i++)
543 Yap_unify(subs_ptr[i+1], YENV[i+1]);
546 PREG = (
yamop *) CPREG;
554 int leader_dep_on_stack;
556 find_dependency_node(sg_fr, leader_cp, leader_dep_on_stack);
558 find_leader_node(leader_cp, leader_dep_on_stack);
559 store_consumer_node(tab_ent, sg_fr, leader_cp, leader_dep_on_stack);
562 if (GLOBAL_parallel_mode == PARALLEL_MODE_RUNNING) {
565 while (YOUNGER_CP(aux_cp, Get_LOCAL_top_cp_on_stack()))
566 aux_cp = aux_cp->cp_b;
567 OPTYAP_ERROR_CHECKING(table_try_single, aux_cp->cp_or_fr != DepFr_top_or_fr(LOCAL_top_dep_fr));
569 while (YOUNGER_CP(aux_cp, DepFr_leader_cp(LOCAL_top_dep_fr)))
570 aux_cp = aux_cp->cp_b;
571 OPTYAP_ERROR_CHECKING(table_try_single, aux_cp != DepFr_leader_cp(LOCAL_top_dep_fr));
574 goto answer_resolution;
578 if (ans_node == NULL) {
582 }
else if (ans_node == SgFr_answer_trie(sg_fr)) {
585 PREG = (
yamop *) CPREG;
592 if (SgFr_state(sg_fr) == complete || SgFr_state(sg_fr) == compiled) {
594 remove_from_global_sg_fr_list(sg_fr);
598#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
599 if (IsMode_LoadAnswers(TabEnt_mode(tab_ent)) || SgFr_active_workers(sg_fr) > 0) {
601 if (IsMode_LoadAnswers(TabEnt_mode(tab_ent))) {
605 if(TrNode_child(ans_node) != NULL) {
606 store_loader_node(tab_ent, ans_node);
608 PREG = (
yamop *) CPREG;
610 load_answer(ans_node, YENV);
615#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
616 if (SgFr_sg_ent_state(sg_fr) < compiled)
618 if (SgFr_state(sg_fr) < compiled)
620 update_answer_trie(sg_fr);
622 PREG = (
yamop *) TrNode_child(SgFr_answer_trie(sg_fr));
638 PBOp(table_try_me, Otapl)
643 tab_ent = PREG->y_u.Otapl.te;
646 sg_fr = subgoal_search(PREG, YENV_ADDRESS);
649#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
650 if (SgFr_state(sg_fr) <= ready) {
652 if (SgFr_sg_ent_state(sg_fr) >= complete)
653 SgFr_state(sg_fr) = SgFr_sg_ent_state(sg_fr);
655 SgFr_active_workers(sg_fr)++;
660#ifdef THREADS_CONSUMER_SHARING
661 if (SgFr_state(sg_fr) == ready_external) {
662 init_subgoal_frame(sg_fr);
664 store_generator_consumer_node(tab_ent, sg_fr, TRUE, PREG->y_u.Otapl.s);
666 allocate_environment();
667 check_for_deadlock(sg_fr);
668 goto answer_resolution_completion;
671 if (SgFr_state(sg_fr) == ready) {
673 init_subgoal_frame(sg_fr);
675 store_generator_node(tab_ent, sg_fr, PREG->y_u.Otapl.s, PREG->y_u.Otapl.d);
676 PREG = NEXTOP(PREG, Otapl);
678 allocate_environment();
680#ifdef INCOMPLETE_TABLING
681 }
else if (SgFr_state(sg_fr) == incomplete) {
682 if (IsMode_CoInductive(TabEnt_flags(tab_ent))) {
683 printf(
"Currently Unsupported\n");
687 CELL *subs_ptr = YENV;
688 init_subgoal_frame(sg_fr);
690 SgFr_try_answer(sg_fr) = ans_node;
691 store_generator_node(tab_ent, sg_fr, PREG->y_u.Otapl.s, TRY_ANSWER);
692 PREG = (
yamop *) CPREG;
694 load_answer(ans_node, subs_ptr);
699 }
else if (SgFr_state(sg_fr) == evaluating) {
700 if (IsMode_CoInductive(TabEnt_flags(tab_ent))) {
701 printf(
"Currently Unsupported\n");
706 int leader_dep_on_stack;
708 find_dependency_node(sg_fr, leader_cp, leader_dep_on_stack);
710 find_leader_node(leader_cp, leader_dep_on_stack);
711 store_consumer_node(tab_ent, sg_fr, leader_cp, leader_dep_on_stack);
714 if (GLOBAL_parallel_mode == PARALLEL_MODE_RUNNING) {
717 while (YOUNGER_CP(aux_cp, Get_LOCAL_top_cp_on_stack()))
718 aux_cp = aux_cp->cp_b;
719 OPTYAP_ERROR_CHECKING(table_try_me, aux_cp->cp_or_fr != DepFr_top_or_fr(LOCAL_top_dep_fr));
721 while (YOUNGER_CP(aux_cp, DepFr_leader_cp(LOCAL_top_dep_fr)))
722 aux_cp = aux_cp->cp_b;
723 OPTYAP_ERROR_CHECKING(table_try_me, aux_cp != DepFr_leader_cp(LOCAL_top_dep_fr));
726 goto answer_resolution;
730 if (ans_node == NULL) {
734 }
else if (ans_node == SgFr_answer_trie(sg_fr)) {
737 PREG = (
yamop *) CPREG;
744 if (SgFr_state(sg_fr) == complete || SgFr_state(sg_fr) == compiled) {
746 remove_from_global_sg_fr_list(sg_fr);
750#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
751 if (IsMode_LoadAnswers(TabEnt_mode(tab_ent)) || SgFr_active_workers(sg_fr) > 0) {
753 if (IsMode_LoadAnswers(TabEnt_mode(tab_ent))) {
757 if(TrNode_child(ans_node) != NULL) {
758 store_loader_node(tab_ent, ans_node);
760 PREG = (
yamop *) CPREG;
762 load_answer(ans_node, YENV);
767#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
768 if (SgFr_sg_ent_state(sg_fr) < compiled)
770 if (SgFr_state(sg_fr) < compiled)
772 update_answer_trie(sg_fr);
774 PREG = (
yamop *) TrNode_child(SgFr_answer_trie(sg_fr));
790 PBOp(table_try, Otapl)
795 tab_ent = PREG->y_u.Otapl.te;
797 sg_fr = subgoal_search(PREG, YENV_ADDRESS);
799#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
800 if (SgFr_state(sg_fr) <= ready) {
802 if (SgFr_sg_ent_state(sg_fr) >= complete)
803 SgFr_state(sg_fr) = SgFr_sg_ent_state(sg_fr);
805 SgFr_active_workers(sg_fr)++;
810#ifdef THREADS_CONSUMER_SHARING
811 if (SgFr_state(sg_fr) == ready_external) {
812 init_subgoal_frame(sg_fr);
814 store_generator_consumer_node(tab_ent, sg_fr, TRUE , PREG->y_u.Otapl.s);
816 allocate_environment();
817 check_for_deadlock(sg_fr);
818 goto answer_resolution_completion;
821 if (SgFr_state(sg_fr) == ready) {
823 init_subgoal_frame(sg_fr);
825 store_generator_node(tab_ent, sg_fr, PREG->y_u.Otapl.s, NEXTOP(PREG,Otapl));
826 PREG = PREG->y_u.Otapl.d;
828 allocate_environment();
830#ifdef INCOMPLETE_TABLING
831 }
else if (SgFr_state(sg_fr) == incomplete) {
832 if (IsMode_CoInductive(TabEnt_flags(tab_ent))) {
833 printf(
"Currently Unsupported\n");
837 CELL *subs_ptr = YENV;
838 init_subgoal_frame(sg_fr);
840 SgFr_try_answer(sg_fr) = ans_node;
841 store_generator_node(tab_ent, sg_fr, PREG->y_u.Otapl.s, TRY_ANSWER);
842 PREG = (
yamop *) CPREG;
844 load_answer(ans_node, subs_ptr);
849 }
else if (SgFr_state(sg_fr) == evaluating) {
850 if (IsMode_CoInductive(TabEnt_flags(tab_ent))) {
853 subs_ptr = (CELL *) (GEN_CP(SgFr_gen_cp(sg_fr)) + 1);
854 subs_ptr += SgFr_arity(sg_fr);
856 for (i = 0; i < subs_ptr[0]; i++)
857 Yap_unify(subs_ptr[i+1], YENV[i+1]);
860 PREG = (
yamop *) CPREG;
868 int leader_dep_on_stack;
870 find_dependency_node(sg_fr, leader_cp, leader_dep_on_stack);
872 find_leader_node(leader_cp, leader_dep_on_stack);
873 store_consumer_node(tab_ent, sg_fr, leader_cp, leader_dep_on_stack);
876 if (GLOBAL_parallel_mode == PARALLEL_MODE_RUNNING) {
879 while (YOUNGER_CP(aux_cp, Get_LOCAL_top_cp_on_stack()))
880 aux_cp = aux_cp->cp_b;
881 OPTYAP_ERROR_CHECKING(table_try, aux_cp->cp_or_fr != DepFr_top_or_fr(LOCAL_top_dep_fr));
883 while (YOUNGER_CP(aux_cp, DepFr_leader_cp(LOCAL_top_dep_fr)))
884 aux_cp = aux_cp->cp_b;
885 OPTYAP_ERROR_CHECKING(table_try, aux_cp != DepFr_leader_cp(LOCAL_top_dep_fr));
888 goto answer_resolution;
892 if (ans_node == NULL) {
896 }
else if (ans_node == SgFr_answer_trie(sg_fr)) {
899 PREG = (
yamop *) CPREG;
906 if (SgFr_state(sg_fr) == complete || SgFr_state(sg_fr) == compiled) {
908 remove_from_global_sg_fr_list(sg_fr);
912#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
913 if (IsMode_LoadAnswers(TabEnt_mode(tab_ent)) || SgFr_active_workers(sg_fr) > 0) {
915 if (IsMode_LoadAnswers(TabEnt_mode(tab_ent))) {
919 if(TrNode_child(ans_node) != NULL) {
920 store_loader_node(tab_ent, ans_node);
922 PREG = (
yamop *) CPREG;
924 load_answer(ans_node, YENV);
929#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
930 if (SgFr_sg_ent_state(sg_fr) < compiled)
932 if (SgFr_state(sg_fr) < compiled)
934 update_answer_trie(sg_fr);
936 PREG = (
yamop *) TrNode_child(SgFr_answer_trie(sg_fr));
952 Op(table_retry_me, Otapl)
953 restore_generator_node(PREG->y_u.Otapl.s, PREG->y_u.Otapl.d);
954 YENV = (CELL *) PROTECT_FROZEN_B(B);
955 set_cut(YENV, B->cp_b);
956 SET_BB(NORM_CP(YENV));
957 allocate_environment();
958 PREG = NEXTOP(PREG,Otapl);
968 Op(table_retry, Otapl)
969 restore_generator_node(PREG->y_u.Otapl.s, NEXTOP(PREG,Otapl));
970 YENV = (CELL *) PROTECT_FROZEN_B(B);
971 set_cut(YENV, B->cp_b);
972 SET_BB(NORM_CP(YENV));
973 allocate_environment();
974 PREG = PREG->y_u.Otapl.d;
984 Op(table_trust_me, Otapl)
985 restore_generator_node(PREG->y_u.Otapl.s, COMPLETION);
986#ifdef DETERMINISTIC_TABLING
987 if (B_FZ > B && IS_BATCHED_NORM_GEN_CP(B)) {
988 CELL *subs_ptr = (CELL *)(GEN_CP(B) + 1) + PREG->y_u.Otapl.s;
989 choiceptr gcp = NORM_CP(DET_GEN_CP(subs_ptr) - 1);
991 DET_GEN_CP(gcp)->cp_sg_fr = sg_fr;
994 gcp->cp_depth = B->cp_depth;
996 gcp->cp_tr = B->cp_tr;
998 gcp->cp_ap = B->cp_ap;
999 SgFr_gen_cp(sg_fr) = B = gcp;
1002 YENV = (CELL *) PROTECT_FROZEN_B(B);
1003 set_cut(YENV, B->cp_b);
1004 SET_BB(NORM_CP(YENV));
1005 allocate_environment();
1006 PREG = NEXTOP(PREG,Otapl);
1016 Op(table_trust, Otapl)
1017 restore_generator_node(PREG->y_u.Otapl.s, COMPLETION);
1018#ifdef DETERMINISTIC_TABLING
1019 if (B_FZ > B && IS_BATCHED_NORM_GEN_CP(B)) {
1020 CELL *subs_ptr = (CELL *)(GEN_CP(B) + 1) + PREG->y_u.Otapl.s;
1021 choiceptr gcp = NORM_CP(DET_GEN_CP(subs_ptr) - 1);
1023 DET_GEN_CP(gcp)->cp_sg_fr = sg_fr;
1024 gcp->cp_h = B->cp_h;
1026 gcp->cp_depth = B->cp_depth;
1028 gcp->cp_tr = B->cp_tr;
1029 gcp->cp_b = B->cp_b;
1030 gcp->cp_ap = B->cp_ap;
1031 SgFr_gen_cp(sg_fr) = B = gcp;
1034 YENV = (CELL *) PROTECT_FROZEN_B(B);
1035 set_cut(YENV, B->cp_b);
1036 SET_BB(NORM_CP(YENV));
1037 allocate_environment();
1038 PREG = PREG->y_u.Otapl.d;
1048 PBOp(table_new_answer, s)
1054 gcp = NORM_CP(YENV[E_B]);
1055#ifdef DETERMINISTIC_TABLING
1056 if (IS_DET_GEN_CP(gcp)){
1057 sg_fr = DET_GEN_CP(gcp)->cp_sg_fr;
1058 subs_ptr = (CELL *)(DET_GEN_CP(gcp) + 1) ;
1062 sg_fr = GEN_CP(gcp)->cp_sg_fr;
1063 subs_ptr = (CELL *)(GEN_CP(gcp) + 1) + PREG->y_u.s.s;
1065#if defined(DEBUG_TABLING) && !defined(DETERMINISTIC_TABLING)
1067 int i, j, arity_args, arity_subs;
1071 arity_args = PREG->y_u.s.s;
1072 arity_subs = *subs_ptr;
1073 aux_args = (CELL *)(GEN_CP(gcp) + 1);
1074 aux_subs = subs_ptr;
1075 for (i = 1; i <= arity_subs; i++) {
1076 Term term_subs = Deref(*(aux_subs + i));
1077 for (j = 0; j < arity_args; j++) {
1078 Term term_arg = Deref(*(aux_args + j));
1079 if (term_subs == term_arg)
break;
1081 TABLING_ERROR_CHECKING(table_new_answer, j == arity_args);
1085 LOCK_ANSWER_TRIE(sg_fr);
1086#ifdef MODE_DIRECTED_TABLING
1087 if (SgFr_mode_directed(sg_fr)) {
1088 ans_node = mode_directed_answer_search(sg_fr, subs_ptr);
1089 if (ans_node == NULL) {
1091 UNLOCK_ANSWER_TRIE(sg_fr);
1096 ans_node = answer_search(sg_fr, subs_ptr);
1097 LOCK_ANSWER_NODE(ans_node);
1098 if (! IS_ANSWER_LEAF_NODE(ans_node)) {
1100#ifdef TABLING_INNER_CUTS
1102 if (! BITMAP_empty(GLOBAL_bm_pruning_workers)) {
1103 int until_depth, depth;
1105 until_depth = OrFr_depth(SgFr_gen_top_or_fr(sg_fr));
1106 depth = OrFr_depth(LOCAL_top_or_fr);
1107 if (depth > until_depth) {
1109 bitmap prune_members, members;
1110 or_fr_ptr leftmost_or_fr, or_fr, nearest_or_fr;
1112 BITMAP_copy(prune_members, GLOBAL_bm_pruning_workers);
1113 BITMAP_delete(prune_members, worker_id);
1114 ltt = BRANCH_LTT(worker_id, depth);
1115 BITMAP_intersection(members, prune_members, OrFr_members(LOCAL_top_or_fr));
1117 for (i = 0; i < GLOBAL_number_workers; i++) {
1118 if (BITMAP_member(members, i) &&
1119 BRANCH_LTT(i, depth) > ltt &&
1120 EQUAL_OR_YOUNGER_CP(Get_LOCAL_top_cp(), REMOTE_pruning_scope(i))) {
1121 leftmost_or_fr = LOCAL_top_or_fr;
1122 pending_table_new_answer:
1123 UNLOCK_ANSWER_NODE(ans_node);
1124 UNLOCK_ANSWER_TRIE(sg_fr);
1125 LOCK_OR_FRAME(leftmost_or_fr);
1126 if (Get_LOCAL_prune_request()) {
1127 UNLOCK_OR_FRAME(leftmost_or_fr);
1128 SCHEDULER_GET_WORK();
1130 CUT_store_tg_answer(leftmost_or_fr, ans_node, gcp, ltt);
1131 UNLOCK_OR_FRAME(leftmost_or_fr);
1133 if (IS_BATCHED_GEN_CP(gcp)) {
1135 PREG = (
yamop *) YENV[E_CP];
1139 ENV = YENV = (CELL *) YENV[E_E];
1141 DEPTH = YENV[E_DEPTH];
1150 BITMAP_minus(prune_members, members);
1152 leftmost_or_fr = OrFr_nearest_leftnode(LOCAL_top_or_fr);
1153 depth = OrFr_depth(leftmost_or_fr);
1154 if (depth > until_depth) {
1155 ltt = BRANCH_LTT(worker_id, depth);
1156 BITMAP_intersection(members, prune_members, OrFr_members(leftmost_or_fr));
1158 for (i = 0; i < GLOBAL_number_workers; i++) {
1159 if (BITMAP_member(members, i) &&
1160 BRANCH_LTT(i, depth) > ltt &&
1161 EQUAL_OR_YOUNGER_CP(GetOrFr_node(leftmost_or_fr), REMOTE_pruning_scope(i)))
1162 goto pending_table_new_answer;
1164 BITMAP_minus(prune_members, members);
1167 leftmost_or_fr = OrFr_nearest_leftnode(leftmost_or_fr);
1168 depth = OrFr_depth(leftmost_or_fr);
1169 while (depth > until_depth) {
1170 ltt = BRANCH_LTT(worker_id, depth);
1171 BITMAP_intersection(members, prune_members, OrFr_members(leftmost_or_fr));
1173 for (i = 0; i < GLOBAL_number_workers; i++) {
1174 if (BITMAP_member(members, i) &&
1175 BRANCH_LTT(i, depth) > ltt &&
1176 EQUAL_OR_YOUNGER_CP(GetOrFr_node(leftmost_or_fr), REMOTE_pruning_scope(i))) {
1178 or_fr = LOCAL_top_or_fr;
1179 nearest_or_fr = OrFr_nearest_leftnode(or_fr);
1180 while (OrFr_depth(nearest_or_fr) > depth) {
1181 LOCK_OR_FRAME(or_fr);
1182 OrFr_nearest_leftnode(or_fr) = leftmost_or_fr;
1183 UNLOCK_OR_FRAME(or_fr);
1184 or_fr = nearest_or_fr;
1185 nearest_or_fr = OrFr_nearest_leftnode(or_fr);
1187 goto pending_table_new_answer;
1190 BITMAP_minus(prune_members, members);
1192 leftmost_or_fr = OrFr_nearest_leftnode(leftmost_or_fr);
1193 depth = OrFr_depth(leftmost_or_fr);
1196 or_fr = LOCAL_top_or_fr;
1197 nearest_or_fr = OrFr_nearest_leftnode(or_fr);
1198 while (OrFr_depth(nearest_or_fr) > depth) {
1199 LOCK_OR_FRAME(or_fr);
1200 OrFr_nearest_leftnode(or_fr) = leftmost_or_fr;
1201 UNLOCK_OR_FRAME(or_fr);
1202 or_fr = nearest_or_fr;
1203 nearest_or_fr = OrFr_nearest_leftnode(or_fr);
1210 if (Get_LOCAL_prune_request()) {
1211 UNLOCK_ANSWER_NODE(ans_node);
1212 UNLOCK_ANSWER_TRIE(sg_fr);
1213 SCHEDULER_GET_WORK();
1216 TAG_AS_ANSWER_LEAF_NODE(ans_node);
1217#ifdef THREADS_FULL_SHARING
1218 INFO_THREADS(
"new answer (1) sgfr=%p ans_node=%p",SgFr_sg_ent(sg_fr),ans_node);
1219 if (IsMode_Batched(TabEnt_mode(SgFr_tab_ent(sg_fr)))) {
1220 ANSWER_LEAF_NODE_INSTR_RELATIVE(ans_node);
1221 if (worker_id < ANSWER_LEAF_NODE_MAX_THREADS)
1222 ANSWER_LEAF_NODE_SET_WID(ans_node,worker_id);
1225 UNLOCK_ANSWER_NODE(ans_node);
1226#ifndef ANSWER_TRIE_LOCK_AT_ENTRY_LEVEL
1229 if (SgFr_first_answer(sg_fr) == NULL)
1230 SgFr_first_answer(sg_fr) = ans_node;
1232 TrNode_child(SgFr_last_answer(sg_fr)) = ans_node;
1233 SgFr_last_answer(sg_fr) = ans_node;
1237 while (aux_ans_node != SgFr_last_answer(sg_fr)) {
1238 TABLING_ERROR_CHECKING(table_new_answer, !IS_ANSWER_LEAF_NODE(aux_ans_node));
1239 aux_ans_node = TrNode_child(aux_ans_node);
1243 UNLOCK_SG_FR(sg_fr);
1244 if (IS_BATCHED_GEN_CP(gcp)) {
1245#ifdef THREADS_FULL_SHARING
1246 if (worker_id >= ANSWER_LEAF_NODE_MAX_THREADS)
1247 SgFr_batched_cached_answers_check_insert(sg_fr,ans_node);
1249#ifdef TABLING_EARLY_COMPLETION
1250 if (gcp == PROTECT_FROZEN_B(B) && (*subs_ptr == 0 || gcp->cp_ap == COMPLETION)) {
1255 private_completion(sg_fr);
1257 SET_BB(PROTECT_FROZEN_B(B));
1258 }
else if (*subs_ptr == 0) {
1261 mark_as_completed(sg_fr);
1262 if (gcp->cp_ap != NULL)
1263 gcp->cp_ap = COMPLETION;
1267 PREG = (
yamop *) YENV[E_CP];
1271 ENV = YENV = (CELL *) YENV[E_E];
1273 DEPTH = YENV[E_DEPTH];
1277#ifdef TABLING_EARLY_COMPLETION
1278 if (*subs_ptr == 0) {
1281 mark_as_completed(sg_fr);
1282 if (gcp->cp_ap != ANSWER_RESOLUTION)
1283 gcp->cp_ap = COMPLETION;
1291#ifdef THREADS_FULL_SHARING
1292 if (IsMode_Batched(TabEnt_mode(SgFr_tab_ent(sg_fr)))){
1293 if (worker_id >= ANSWER_LEAF_NODE_MAX_THREADS) {
1294 UNLOCK_ANSWER_NODE(ans_node);
1295 UNLOCK_ANSWER_TRIE(sg_fr);
1296 SgFr_batched_cached_answers_check_insert(sg_fr,NULL);
1297 INFO_THREADS(
"new answer (2) sgfr=%p ans_node=%p",SgFr_sg_ent(sg_fr),ans_node);
1298 if (SgFr_batched_cached_answers_check_remove(sg_fr , ans_node) == 1){
1299 INFO_THREADS(
"ans_node=%p not found", ans_node);
1303 PREG = (
yamop *) YENV[E_CP];
1307 ENV = YENV = (CELL *) YENV[E_E];
1309 DEPTH = YENV[E_DEPTH];
1313 if (!ANSWER_LEAF_NODE_CHECK_WID(ans_node,worker_id)){
1314 ANSWER_LEAF_NODE_SET_WID(ans_node,worker_id);
1315 UNLOCK_ANSWER_NODE(ans_node);
1316 UNLOCK_ANSWER_TRIE(sg_fr);
1318 INFO_THREADS(
"new answer (2) sgfr=%p ans_node=%p",SgFr_sg_ent(sg_fr),ans_node);
1319 PREG = (
yamop *) YENV[E_CP];
1323 ENV = YENV = (CELL *) YENV[E_E];
1325 DEPTH = YENV[E_DEPTH];
1332 UNLOCK_ANSWER_NODE(ans_node);
1333 UNLOCK_ANSWER_TRIE(sg_fr);
1335#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
1336 INFO_THREADS(
"new answer(rep) sgfr=%p ans_node=%p",SgFr_sg_ent(sg_fr),ans_node);
1338 INFO_THREADS(
"new answer(rep) sgfr=%p ans_node=%p",sg_fr,ans_node);
1350 BOp(table_answer_resolution, Otapl)
1352 if (SCH_top_shared_cp(B)) {
1353 UNLOCK_OR_FRAME(LOCAL_top_or_fr);
1363 OPTYAP_ERROR_CHECKING(answer_resolution, SCH_top_shared_cp(B) && B->cp_or_fr->alternative != ANSWER_RESOLUTION);
1364 OPTYAP_ERROR_CHECKING(answer_resolution, !SCH_top_shared_cp(B) && B->cp_ap != ANSWER_RESOLUTION);
1365 dep_fr = CONS_CP(B)->cp_dep_fr;
1366 LOCK_DEP_FR(dep_fr);
1367 ans_node = DepFr_last_answer(dep_fr);
1368 if (TrNode_child(ans_node)) {
1370#ifdef MODE_DIRECTED_TABLING
1371 if (IS_ANSWER_INVALID_NODE(TrNode_child(ans_node))) {
1373 old_ans_node = ans_node;
1374 ans_node = TrNode_child(ans_node);
1376 ans_node = TrNode_child(ans_node);
1377 }
while (IS_ANSWER_INVALID_NODE(ans_node));
1378 TrNode_child(old_ans_node) = ans_node;
1381 ans_node = TrNode_child(ans_node);
1382 DepFr_last_answer(dep_fr) = ans_node;
1383 UNLOCK_DEP_FR(dep_fr);
1384 consume_answer_and_procceed(dep_fr, ans_node);
1386 UNLOCK_DEP_FR(dep_fr);
1389 if (B == DepFr_leader_cp(LOCAL_top_dep_fr)) {
1392 TABLING_ERROR_CHECKING(answer_resolution, IS_BATCHED_GEN_CP(B));
1398 if (DepFr_backchain_cp(dep_fr) == NULL) {
1401 if (SCH_top_shared_cp(B)) {
1402 SCHEDULER_GET_WORK();
1415 top_chain_cp = DepFr_backchain_cp(dep_fr);
1416 chain_cp = DepFr_leader_cp(LOCAL_top_dep_fr);
1417 if (YOUNGER_CP(top_chain_cp, chain_cp))
1418 chain_cp = top_chain_cp;
1419 TABLING_ERROR_CHECKING(answer_resolution, EQUAL_OR_YOUNGER_CP(top_chain_cp, B));
1420 TABLING_ERROR_CHECKING(answer_resolution, EQUAL_OR_YOUNGER_CP(chain_cp, B));
1423 dep_fr = DepFr_next(dep_fr);
1424 while (YOUNGER_CP(DepFr_cons_cp(dep_fr), chain_cp)) {
1425 LOCK_DEP_FR(dep_fr);
1426 ans_node = DepFr_last_answer(dep_fr);
1427 if (TrNode_child(ans_node)) {
1429#ifdef MODE_DIRECTED_TABLING
1430 if (IS_ANSWER_INVALID_NODE(TrNode_child(ans_node))) {
1432 old_ans_node = ans_node;
1433 ans_node = TrNode_child(ans_node);
1435 ans_node = TrNode_child(ans_node);
1436 }
while (IS_ANSWER_INVALID_NODE(ans_node));
1437 TrNode_child(old_ans_node) = ans_node;
1440 ans_node = TrNode_child(ans_node);
1441 DepFr_last_answer(dep_fr) = ans_node;
1443 if (YOUNGER_CP(DepFr_backchain_cp(dep_fr), top_chain_cp))
1445 DepFr_backchain_cp(dep_fr) = top_chain_cp;
1446 UNLOCK_DEP_FR(dep_fr);
1448 chain_cp = DepFr_cons_cp(dep_fr);
1451 start_or_fr = LOCAL_top_or_fr;
1452 end_or_fr = DepFr_top_or_fr(dep_fr);
1453 if (start_or_fr != end_or_fr) {
1454 LOCAL_top_or_fr = end_or_fr;
1455 Set_LOCAL_top_cp(GetOrFr_node(end_or_fr));
1457 while (YOUNGER_CP(GetOrFr_node(start_or_fr), GetOrFr_node(end_or_fr))) {
1458 LOCK_OR_FRAME(start_or_fr);
1459 BITMAP_delete(OrFr_members(start_or_fr), worker_id);
1460 if (BITMAP_empty(OrFr_members(start_or_fr))) {
1461 if (frame_with_suspensions_not_collected(start_or_fr)) {
1462 collect_suspension_frames(start_or_fr);
1464#ifdef TABLING_INNER_CUTS
1465 if (OrFr_tg_solutions(start_or_fr)) {
1466 tg_sol_fr_ptr tg_solutions;
1468 tg_solutions = OrFr_tg_solutions(start_or_fr);
1469 leftmost_until = CUT_leftmost_until(start_or_fr, OrFr_depth(TgSolFr_gen_cp(tg_solutions)->cp_or_fr));
1470 OrFr_tg_solutions(start_or_fr) = NULL;
1471 UNLOCK_OR_FRAME(start_or_fr);
1472 if (leftmost_until) {
1473 LOCK_OR_FRAME(leftmost_until);
1474 tg_solutions = CUT_store_tg_answers(leftmost_until, tg_solutions,
1475 BRANCH_LTT(worker_id, OrFr_depth(leftmost_until)));
1476 UNLOCK_OR_FRAME(leftmost_until);
1478 CUT_validate_tg_answers(tg_solutions);
1479 goto continue_update_loop1;
1483 UNLOCK_OR_FRAME(start_or_fr);
1484#ifdef TABLING_INNER_CUTS
1485 continue_update_loop1:
1487 start_or_fr = OrFr_next(start_or_fr);
1489 while (YOUNGER_CP(GetOrFr_node(end_or_fr), GetOrFr_node(start_or_fr))) {
1490 LOCK_OR_FRAME(end_or_fr);
1491 BITMAP_insert(OrFr_members(end_or_fr), worker_id);
1492 BRANCH(worker_id, OrFr_depth(end_or_fr)) = 1;
1493 UNLOCK_OR_FRAME(end_or_fr);
1494 end_or_fr = OrFr_next(end_or_fr);
1496 }
while (start_or_fr != end_or_fr);
1497 if (Get_LOCAL_prune_request())
1498 pruning_over_tabling_data_structures();
1502 if (GLOBAL_parallel_mode == PARALLEL_MODE_RUNNING) {
1504 OPTYAP_ERROR_CHECKING(completion, YOUNGER_CP(Get_LOCAL_top_cp(), Get_LOCAL_top_cp_on_stack()));
1506 while (aux_cp != Get_LOCAL_top_cp()) {
1507 OPTYAP_ERROR_CHECKING(completion, YOUNGER_CP(Get_LOCAL_top_cp(), aux_cp));
1508 OPTYAP_ERROR_CHECKING(completion, EQUAL_OR_YOUNGER_CP(Get_LOCAL_top_cp_on_stack(), aux_cp));
1509 aux_cp = aux_cp->cp_b;
1514 restore_bindings(B->cp_tr, chain_cp->cp_tr);
1515 TABLING_ERROR_CHECKING(answer_resolution, TR != B->cp_tr && !IsPairTerm((CELL)TrailTerm(TR - 1)));
1516 TABLING_ERROR_CHECKING(answer_resolution, TR != B->cp_tr && (tr_fr_ptr) RepPair((CELL)TrailTerm(TR - 1)) != B->cp_tr);
1519 TRAIL_LINK(B->cp_tr);
1520 consume_answer_and_procceed(dep_fr, ans_node);
1522 UNLOCK_DEP_FR(dep_fr);
1523 dep_fr = DepFr_next(dep_fr);
1529 if (EQUAL_OR_YOUNGER_CP(Get_LOCAL_top_cp_on_stack(), chain_cp)) {
1530 end_or_fr = chain_cp->cp_or_fr;
1531 start_or_fr = LOCAL_top_or_fr;
1532 if (start_or_fr != end_or_fr) {
1533 LOCAL_top_or_fr = end_or_fr;
1534 Set_LOCAL_top_cp(GetOrFr_node(end_or_fr));
1535 while (start_or_fr != end_or_fr) {
1536 LOCK_OR_FRAME(start_or_fr);
1537 BITMAP_delete(OrFr_members(start_or_fr), worker_id);
1538 if (BITMAP_empty(OrFr_members(start_or_fr))) {
1539 if (frame_with_suspensions_not_collected(start_or_fr)) {
1540 collect_suspension_frames(start_or_fr);
1542#ifdef TABLING_INNER_CUTS
1543 if (OrFr_tg_solutions(start_or_fr)) {
1544 tg_sol_fr_ptr tg_solutions;
1546 tg_solutions = OrFr_tg_solutions(start_or_fr);
1547 leftmost_until = CUT_leftmost_until(start_or_fr, OrFr_depth(TgSolFr_gen_cp(tg_solutions)->cp_or_fr));
1548 OrFr_tg_solutions(start_or_fr) = NULL;
1549 UNLOCK_OR_FRAME(start_or_fr);
1550 if (leftmost_until) {
1551 LOCK_OR_FRAME(leftmost_until);
1552 tg_solutions = CUT_store_tg_answers(leftmost_until, tg_solutions,
1553 BRANCH_LTT(worker_id, OrFr_depth(leftmost_until)));
1554 UNLOCK_OR_FRAME(leftmost_until);
1556 CUT_validate_tg_answers(tg_solutions);
1557 goto continue_update_loop2;
1561 UNLOCK_OR_FRAME(start_or_fr);
1562#ifdef TABLING_INNER_CUTS
1563 continue_update_loop2:
1565 start_or_fr = OrFr_next(start_or_fr);
1567 if (Get_LOCAL_prune_request())
1568 pruning_over_tabling_data_structures();
1573 if (GLOBAL_parallel_mode == PARALLEL_MODE_RUNNING) {
1575 OPTYAP_ERROR_CHECKING(completion, YOUNGER_CP(Get_LOCAL_top_cp(), Get_LOCAL_top_cp_on_stack()));
1577 while (aux_cp != Get_LOCAL_top_cp()) {
1578 OPTYAP_ERROR_CHECKING(completion, YOUNGER_CP(Get_LOCAL_top_cp(), aux_cp));
1579 OPTYAP_ERROR_CHECKING(completion, EQUAL_OR_YOUNGER_CP(Get_LOCAL_top_cp_on_stack(), aux_cp));
1580 aux_cp = aux_cp->cp_b;
1585 unbind_variables(B->cp_tr, chain_cp->cp_tr);
1586 TABLING_ERROR_CHECKING(answer_resolution, TR != B->cp_tr && !IsPairTerm((CELL)TrailTerm(TR - 1)));
1587 TABLING_ERROR_CHECKING(answer_resolution, TR != B->cp_tr && (tr_fr_ptr) RepPair((CELL)TrailTerm(TR - 1)) != B->cp_tr);
1588 if (DepFr_leader_cp(LOCAL_top_dep_fr) == chain_cp && (
1592 DepFr_leader_dep_is_on_stack(LOCAL_top_dep_fr) == FALSE ||
1597 chain_cp->cp_ap == NULL || chain_cp->cp_ap == ANSWER_RESOLUTION)) {
1600 TRAIL_LINK(B->cp_tr);
1604 PREG = chain_cp->cp_ap;
1608 TRAIL_LINK(B->cp_tr);
1620 BOp(table_completion, Otapl)
1622 if (SCH_top_shared_cp(B)) {
1623 if (IS_BATCHED_GEN_CP(B)) {
1624 SCH_new_alternative(PREG, NULL);
1625 if (B != DepFr_leader_cp(LOCAL_top_dep_fr) && EQUAL_OR_YOUNGER_CP(B_FZ, B)) {
1627 SCHEDULER_GET_WORK();
1630 SCH_new_alternative(PREG, ANSWER_RESOLUTION);
1631 if (B != DepFr_leader_cp(LOCAL_top_dep_fr)) {
1633 SCHEDULER_GET_WORK();
1640#ifdef THREADS_CONSUMER_SHARING
1641 goto answer_resolution_completion;
1644 if (IS_BATCHED_GEN_CP(B)) {
1646 if (EQUAL_OR_YOUNGER_CP(B_FZ, B) && B != DepFr_leader_cp(LOCAL_top_dep_fr)) {
1652 B->cp_ap = ANSWER_RESOLUTION;
1653 if (B != DepFr_leader_cp(LOCAL_top_dep_fr)) {
1664#ifdef THREADS_CONSUMER_SHARING
1665 goto answer_resolution_completion;
1671#ifdef TIMESTAMP_CHECK
1674 int entry_owners = 0;
1676 if (SCH_top_shared_cp(B)) {
1677#ifdef TIMESTAMP_CHECK
1678 timestamp = ++GLOBAL_timestamp;
1680 entry_owners = OrFr_owners(LOCAL_top_or_fr);
1685 dep_fr = LOCAL_top_dep_fr;
1686 while (YOUNGER_CP(DepFr_cons_cp(dep_fr), B)) {
1687 LOCK_DEP_FR(dep_fr);
1688 ans_node = DepFr_last_answer(dep_fr);
1689 if (TrNode_child(ans_node)) {
1691#ifdef MODE_DIRECTED_TABLING
1692 if (IS_ANSWER_INVALID_NODE(TrNode_child(ans_node))) {
1694 old_ans_node = ans_node;
1695 ans_node = TrNode_child(ans_node);
1697 ans_node = TrNode_child(ans_node);
1698 }
while (IS_ANSWER_INVALID_NODE(ans_node));
1699 TrNode_child(old_ans_node) = ans_node;
1702 ans_node = TrNode_child(ans_node);
1703 DepFr_last_answer(dep_fr) = ans_node;
1706 if (YOUNGER_CP(DepFr_backchain_cp(dep_fr), B))
1708 DepFr_backchain_cp(dep_fr) = B;
1711 if (YOUNGER_CP(DepFr_backchain_cp(dep_fr), B->cp_b))
1713 DepFr_backchain_cp(dep_fr) = B->cp_b;
1715 UNLOCK_DEP_FR(dep_fr);
1718 if (GLOBAL_parallel_mode == PARALLEL_MODE_RUNNING) {
1720 OPTYAP_ERROR_CHECKING(completion, Get_LOCAL_top_cp(), Get_LOCAL_top_cp_on_stack());
1721 aux_cp = DepFr_cons_cp(dep_fr);
1722 while (YOUNGER_CP(aux_cp, Get_LOCAL_top_cp_on_stack()))
1723 aux_cp = aux_cp->cp_b;
1724 OPTYAP_ERROR_CHECKING(completion, aux_cp->cp_or_fr != DepFr_top_or_fr(dep_fr));
1729 if (YOUNGER_CP(Get_LOCAL_top_cp_on_stack(), Get_LOCAL_top_cp())) {
1731 while (
or_frame != LOCAL_top_or_fr) {
1733 BITMAP_insert(OrFr_members(
or_frame), worker_id);
1734 BRANCH(worker_id, OrFr_depth(
or_frame)) = 1;
1738 LOCAL_top_or_fr = DepFr_top_or_fr(dep_fr);
1739 Set_LOCAL_top_cp(GetOrFr_node(LOCAL_top_or_fr));
1743 if (GLOBAL_parallel_mode == PARALLEL_MODE_RUNNING) {
1745 OPTYAP_ERROR_CHECKING(completion, YOUNGER_CP(Get_LOCAL_top_cp(), Get_LOCAL_top_cp_on_stack()));
1746 aux_cp = DepFr_cons_cp(dep_fr);
1747 while (aux_cp != Get_LOCAL_top_cp()) {
1748 OPTYAP_ERROR_CHECKING(completion, YOUNGER_CP(Get_LOCAL_top_cp(), aux_cp));
1749 OPTYAP_ERROR_CHECKING(completion, EQUAL_OR_YOUNGER_CP(Get_LOCAL_top_cp_on_stack(), aux_cp));
1750 aux_cp = aux_cp->cp_b;
1755 TABLING_ERROR_CHECKING(completion, EQUAL_OR_YOUNGER_CP(B, DepFr_cons_cp(dep_fr)));
1756 TABLING_ERROR_CHECKING(completion, B->cp_tr > DepFr_cons_cp(dep_fr)->cp_tr);
1757 rebind_variables(DepFr_cons_cp(dep_fr)->cp_tr, B->cp_tr);
1758 TABLING_ERROR_CHECKING(completion, TR != B->cp_tr && !IsPairTerm((CELL)TrailTerm(TR - 1)));
1759 TABLING_ERROR_CHECKING(completion, TR != B->cp_tr && (tr_fr_ptr) RepPair((CELL)TrailTerm(TR - 1)) != B->cp_tr);
1760 B = DepFr_cons_cp(dep_fr);
1763 TRAIL_LINK(B->cp_tr);
1764 consume_answer_and_procceed(dep_fr, ans_node);
1766 UNLOCK_DEP_FR(dep_fr);
1767#ifdef TIMESTAMP_CHECK
1768 DepFr_timestamp(dep_fr) = timestamp;
1770 dep_fr = DepFr_next(dep_fr);
1775 if (SCH_top_shared_cp(B)) {
1776 if (entry_owners > 1) {
1778 if (YOUNGER_CP(B_FZ, B)) {
1781 while (YOUNGER_CP(GetOrFr_node(LOCAL_top_susp_or_fr), Get_LOCAL_top_cp())) {
1783 susp_fr_ptr resume_fr;
1784 susp_or_fr = LOCAL_top_susp_or_fr;
1785 LOCK_OR_FRAME(susp_or_fr);
1786#ifdef TIMESTAMP_CHECK
1787 resume_fr = suspension_frame_to_resume(susp_or_fr, timestamp);
1789 resume_fr = suspension_frame_to_resume(susp_or_fr);
1792 if (OrFr_suspensions(susp_or_fr) == NULL) {
1793 LOCAL_top_susp_or_fr = OrFr_nearest_suspnode(susp_or_fr);
1794 OrFr_nearest_suspnode(susp_or_fr) = susp_or_fr;
1796 UNLOCK_OR_FRAME(susp_or_fr);
1797 rebind_variables(GetOrFr_node(susp_or_fr)->cp_tr, B->cp_tr);
1798 resume_suspension_frame(resume_fr, susp_or_fr);
1799 B = Get_LOCAL_top_cp();
1802 TRAIL_LINK(B->cp_tr);
1805 LOCAL_top_susp_or_fr = OrFr_nearest_suspnode(susp_or_fr);
1806 OrFr_nearest_suspnode(susp_or_fr) = NULL;
1807 UNLOCK_OR_FRAME(susp_or_fr);
1812 if (frame_with_suspensions_not_collected(LOCAL_top_or_fr))
1813 collect_suspension_frames(LOCAL_top_or_fr);
1815 while (EQUAL_OR_YOUNGER_CP(GetOrFr_node(LOCAL_top_susp_or_fr), Get_LOCAL_top_cp())) {
1817 susp_fr_ptr resume_fr;
1818 susp_or_fr = LOCAL_top_susp_or_fr;
1819#ifdef TIMESTAMP_CHECK
1820 resume_fr = suspension_frame_to_resume(susp_or_fr, timestamp);
1822 resume_fr = suspension_frame_to_resume(susp_or_fr);
1825 if (OrFr_suspensions(susp_or_fr) == NULL) {
1826 LOCAL_top_susp_or_fr = OrFr_nearest_suspnode(susp_or_fr);
1827 OrFr_nearest_suspnode(susp_or_fr) = susp_or_fr;
1829 if (YOUNGER_CP(B_FZ, B)) {
1832 rebind_variables(GetOrFr_node(susp_or_fr)->cp_tr, B->cp_tr);
1833 resume_suspension_frame(resume_fr, susp_or_fr);
1834 B = Get_LOCAL_top_cp();
1837 TRAIL_LINK(B->cp_tr);
1840 LOCAL_top_susp_or_fr = OrFr_nearest_suspnode(susp_or_fr);
1841 OrFr_nearest_suspnode(susp_or_fr) = NULL;
1844 public_completion();
1846 TABLING_ERROR_CHECKING(completion, TR != B->cp_tr && !IsPairTerm((CELL)TrailTerm(TR - 1)));
1847 TABLING_ERROR_CHECKING(completion, TR != B->cp_tr && (tr_fr_ptr) RepPair((CELL)TrailTerm(TR - 1)) != B->cp_tr);
1848 if (B == DepFr_leader_cp(LOCAL_top_dep_fr)) {
1852 TABLING_ERROR_CHECKING(completion, IS_BATCHED_GEN_CP(B));
1855 LOCK_OR_FRAME(LOCAL_top_or_fr);
1856 LOCK_DEP_FR(LOCAL_top_dep_fr);
1857 ans_node = DepFr_last_answer(LOCAL_top_dep_fr);
1858 if (TrNode_child(ans_node)) {
1860 UNLOCK_OR_FRAME(LOCAL_top_or_fr);
1861#ifdef MODE_DIRECTED_TABLING
1862 if (IS_ANSWER_INVALID_NODE(TrNode_child(ans_node))) {
1864 old_ans_node = ans_node;
1865 ans_node = TrNode_child(ans_node);
1867 ans_node = TrNode_child(ans_node);
1868 }
while (IS_ANSWER_INVALID_NODE(ans_node));
1869 TrNode_child(old_ans_node) = ans_node;
1872 ans_node = TrNode_child(ans_node);
1873 DepFr_last_answer(LOCAL_top_dep_fr) = ans_node;
1874 UNLOCK_DEP_FR(LOCAL_top_dep_fr);
1875 consume_answer_and_procceed(LOCAL_top_dep_fr, ans_node);
1878 UNLOCK_DEP_FR(LOCAL_top_dep_fr);
1879 if (OrFr_owners(LOCAL_top_or_fr) > 1) {
1881 Set_LOCAL_top_cp_on_stack(GetOrFr_node(OrFr_next_on_stack(LOCAL_top_or_fr)));
1882 BITMAP_delete(OrFr_members(LOCAL_top_or_fr), worker_id);
1883 OrFr_owners(LOCAL_top_or_fr)--;
1884 LOCAL_top_dep_fr = DepFr_next(LOCAL_top_dep_fr);
1885 UNLOCK_OR_FRAME(LOCAL_top_or_fr);
1886 if (LOCAL_top_sg_fr && Get_LOCAL_top_cp() == SgFr_gen_cp(LOCAL_top_sg_fr)) {
1887 LOCAL_top_sg_fr = SgFr_next(LOCAL_top_sg_fr);
1889 SCH_update_local_or_tops();
1890 CUT_reset_prune_request();
1891 adjust_freeze_registers();
1895 OrFr_alternative(LOCAL_top_or_fr) = NULL;
1896 UNLOCK_OR_FRAME(LOCAL_top_or_fr);
1897 dep_fr = DepFr_next(LOCAL_top_dep_fr);
1898 FREE_DEPENDENCY_FRAME(LOCAL_top_dep_fr);
1899 LOCAL_top_dep_fr = dep_fr;
1900 adjust_freeze_registers();
1901 SCHEDULER_GET_WORK();
1913#ifdef THREADS_CONSUMER_SHARING
1920#ifdef DETERMINISTIC_TABLING
1921 if (IS_DET_GEN_CP(B))
1922 sg_fr = DET_GEN_CP(B)->cp_sg_fr;
1925 sg_fr = GEN_CP(B)->cp_sg_fr;
1926 private_completion(sg_fr);
1927#ifdef THREADS_CONSUMER_SHARING
1928 if (IS_BATCHED_GEN_CP(B) || SgFr_gen_worker(sg_fr) != worker_id) {
1930 if (IS_BATCHED_GEN_CP(B)) {
1934 SET_BB(PROTECT_FROZEN_B(B));
1938 ans_node = SgFr_first_answer(sg_fr);
1939 if (ans_node == NULL) {
1942 SET_BB(PROTECT_FROZEN_B(B));
1945 TABLING_ERROR_CHECKING(completion, TR != B->cp_tr && !IsPairTerm((CELL)TrailTerm(TR - 1)));
1946 TABLING_ERROR_CHECKING(completion, TR != B->cp_tr && (tr_fr_ptr) RepPair((CELL)TrailTerm(TR - 1)) != B->cp_tr);
1947 pop_generator_node(SgFr_arity(sg_fr));
1948 if (ans_node == SgFr_answer_trie(sg_fr)) {
1950 PREG = (
yamop *) CPREG;
1958 SgFr_state(sg_fr)++;
1959 remove_from_global_sg_fr_list(sg_fr);
1962 if (IsMode_LoadAnswers(TabEnt_mode(tab_ent))) {
1964 if(TrNode_child(ans_node) != NULL) {
1965 store_loader_node(tab_ent, ans_node);
1967 PREG = (
yamop *) CPREG;
1969 load_answer(ans_node, YENV);
1973#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
1975 if (SgFr_active_workers(sg_fr) > 0) {
1977 UNLOCK_SG_FR(sg_fr);
1978 if(TrNode_child(ans_node) != NULL) {
1979 store_loader_node(tab_ent, ans_node);
1981 PREG = (
yamop *) CPREG;
1983 load_answer(ans_node, YENV);
1989#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
1990 if (SgFr_sg_ent_state(sg_fr) < compiled)
1993 if (SgFr_state(sg_fr) < compiled)
1995 update_answer_trie(sg_fr);
1996 UNLOCK_SG_FR(sg_fr);
1997 PREG = (
yamop *) TrNode_child(SgFr_answer_trie(sg_fr));
2015#ifdef THREADS_CONSUMER_SHARING
2016 BOp(table_answer_resolution_completion, Otapl)
2017answer_resolution_completion:
2020 int do_not_complete_tables;
2021 int wid = worker_id ;
2027 do_not_complete_tables = 0;
2028 if (B->cp_ap == ANSWER_RESOLUTION_COMPLETION ){
2030 if ((IS_BATCHED_GEN_CP(B) && (EQUAL_OR_YOUNGER_CP(B_FZ, B) && B != DepFr_leader_cp(LOCAL_top_dep_fr))) ||
2031 (B != DepFr_leader_cp(LOCAL_top_dep_fr))) {
2033 INFO_THREADS(
"ans_reso_com (1) : not leader on that node dep_fr = %p leader_node =%p", LOCAL_top_dep_fr, GEN_CP(DepFr_leader_cp(LOCAL_top_dep_fr))->cp_dep_fr);
2034 ThDepFr_state(GLOBAL_th_dep_fr(wid)) = working;
2035 B->cp_ap = ANSWER_RESOLUTION;
2036 goto answer_resolution;
2039 dep_fr = GEN_CP(B)->cp_dep_fr;
2040 ans_node = DepFr_last_answer(dep_fr);
2041 if (TrNode_child(ans_node)) {
2043 ThDepFr_state(GLOBAL_th_dep_fr(wid)) = working;
2044 ans_node = DepFr_last_answer(dep_fr) = TrNode_child(ans_node);
2045 INFO_THREADS(
"ans_reso_com (2) : consume_answer =%p dep_fr = %p leader_node =%p", ans_node, dep_fr, GEN_CP(DepFr_leader_cp(dep_fr))->cp_dep_fr);
2046 consume_answer_and_procceed(dep_fr, ans_node);
2050 if (SgFr_sg_ent_state(sg_fr) < complete || (SgFr_sg_ent_state(sg_fr) >= complete && TrNode_child(ans_node)!= NULL))
2051 do_not_complete_tables = 1;
2055 if (IS_BATCHED_GEN_CP(B)) {
2056 if (EQUAL_OR_YOUNGER_CP(B_FZ, B) && B != DepFr_leader_cp(LOCAL_top_dep_fr)) {
2058 ThDepFr_state(GLOBAL_th_dep_fr(wid)) = working;
2064 if (B != DepFr_leader_cp(LOCAL_top_dep_fr)) {
2066 ThDepFr_state(GLOBAL_th_dep_fr(wid)) = working;
2067 B->cp_ap = ANSWER_RESOLUTION;
2069 INFO_THREADS(
"ans_reso_com (3) : not leader on that node dep_fr = %p leader_node =%p", LOCAL_top_dep_fr, GEN_CP(DepFr_leader_cp(LOCAL_top_dep_fr))->cp_dep_fr);
2079 dep_fr = LOCAL_top_dep_fr;
2082 while (YOUNGER_CP(DepFr_cons_cp(dep_fr), B)) {
2083 ans_node = DepFr_last_answer(dep_fr);
2084 if (TrNode_child(ans_node)) {
2085 ThDepFr_state(GLOBAL_th_dep_fr(wid)) = working;
2087 ans_node = DepFr_last_answer(dep_fr) = TrNode_child(ans_node);
2088 if (IS_BATCHED_GEN_CP(B))
2089 DepFr_backchain_cp(dep_fr) = B->cp_b;
2091 DepFr_backchain_cp(dep_fr) = B;
2097 TABLING_ERROR_CHECKING(answer_resolution_completion, EQUAL_OR_YOUNGER_CP(B, DepFr_cons_cp(dep_fr)));
2098 TABLING_ERROR_CHECKING(answer_resolution_completion, B->cp_tr > DepFr_cons_cp(dep_fr)->cp_tr);
2099 rebind_variables(DepFr_cons_cp(dep_fr)->cp_tr,B->cp_tr);
2101 TABLING_ERROR_CHECKING(answer_resolution_completion, TR != B->cp_tr && !IsPairTerm((CELL)TrailTerm(TR - 1)));
2102 TABLING_ERROR_CHECKING(answer_resolution_completion, TR != B->cp_tr && (tr_fr_ptr) RepPair((CELL)TrailTerm(TR - 1)) != B->cp_tr);
2103 B = DepFr_cons_cp(dep_fr);
2106 TRAIL_LINK(B->cp_tr);
2107 INFO_THREADS(
"ans_reso_com (4) : consume_answer =%p dep_fr = %p leader_node =%p", ans_node, dep_fr, GEN_CP(DepFr_leader_cp(dep_fr))->cp_dep_fr);
2108 consume_answer_and_procceed(dep_fr, ans_node);
2112 if (DepFr_external(dep_fr) == TRUE){
2113 sg_fr_ptr sg_fr = GEN_CP(DepFr_cons_cp(dep_fr))->cp_sg_fr;
2114 if (SgFr_sg_ent_state(sg_fr) < complete || (SgFr_sg_ent_state(sg_fr) >= complete && TrNode_child(ans_node)!= NULL))
2115 do_not_complete_tables = 1;
2118 dep_fr = DepFr_next(dep_fr);
2123 if (do_not_complete_tables == 1){
2125 if (ThDepFr_next(GLOBAL_th_dep_fr(wid)) == wid)
2129 if (ThDepFr_state(GLOBAL_th_dep_fr(wid)) == working) {
2130 int c_wid = ThDepFr_next(GLOBAL_th_dep_fr(wid));
2132 ThDepFr_terminator(GLOBAL_th_dep_fr(c_wid)) = 1;
2133 c_wid = ThDepFr_next(GLOBAL_th_dep_fr(c_wid));
2134 }
while(c_wid != wid);
2135 ThDepFr_terminator(GLOBAL_th_dep_fr(wid)) = 1;
2136 ThDepFr_state(GLOBAL_th_dep_fr(wid)) = idle;
2138 }
else if (ThDepFr_state(GLOBAL_th_dep_fr(wid)) == idle){
2140 int c_wid = ThDepFr_next(GLOBAL_th_dep_fr(wid));
2141 int jump_state = TRUE;
2143 if (ThDepFr_state(GLOBAL_th_dep_fr(c_wid)) != idle){
2149 c_wid = ThDepFr_next(GLOBAL_th_dep_fr(c_wid));
2150 }
while(c_wid != wid);
2152 if (jump_state && l_wid == wid){
2154 ThDepFr_terminator(GLOBAL_th_dep_fr(wid)) = 0;
2155 c_wid = ThDepFr_next(GLOBAL_th_dep_fr(wid));
2157 dep_fr_ptr remote_dep_fr = REMOTE_top_dep_fr(c_wid);
2158 while(YOUNGER_CP(DepFr_cons_cp(remote_dep_fr),DepFr_leader_cp(REMOTE_top_dep_fr(c_wid)))){
2159 if (TrNode_child(DepFr_last_answer(remote_dep_fr))){
2164 remote_dep_fr = DepFr_next(remote_dep_fr);
2166 if (ThDepFr_state(GLOBAL_th_dep_fr(c_wid)) != idle){
2170 c_wid = ThDepFr_next(GLOBAL_th_dep_fr(c_wid));
2171 }
while(c_wid != wid);
2174 if (jump_state && ThDepFr_terminator(GLOBAL_th_dep_fr(wid)) == 0){
2175 c_wid = ThDepFr_next(GLOBAL_th_dep_fr(wid));
2177 ThDepFr_state(GLOBAL_th_dep_fr(c_wid)) = completing;
2178 c_wid = ThDepFr_next(GLOBAL_th_dep_fr(c_wid));
2179 }
while(c_wid != wid);
2180 ThDepFr_state(GLOBAL_th_dep_fr(wid)) = completing;
2182 }
else if (ThDepFr_state(GLOBAL_th_dep_fr(wid)) == completing){
2183 INFO_THREADS(
"ans_reso_com (5) : completing thread_state =%d",ThDepFr_state(GLOBAL_th_dep_fr(wid)));
2187 }
while(do_not_complete_tables);
2190 INFO_THREADS("ans_reso_com (6) : completing thread_state =%d",ThDepFr_state(GLOBAL_th_dep_fr(worker_id)));