24#include "tab.macros.h"
33void prune_shared_branch(
choiceptr prune_cp,
int* pend_ltt) {
40#ifdef TABLING_INNER_CUTS
41 tg_sol_fr_ptr tg_solutions, aux_tg_solutions;
43 leftmost_or_fr = CUT_leftmost_or_frame();
44 if (Get_LOCAL_prune_request())
46 leftmost_cp = GetOrFr_node(leftmost_or_fr);
48#ifdef TABLING_INNER_CUTS
51 if (EQUAL_OR_YOUNGER_CP(prune_cp, leftmost_cp)) {
57 or_fr_ptr old_LOCAL_top_or_fr = LOCAL_top_or_fr;
60 LOCK_OR_FRAME(LOCAL_top_or_fr);
61 int depth2 = OrFr_depth(LOCAL_top_or_fr);
62 members2 = OrFr_members(LOCAL_top_or_fr);
63 for (i = 0; i < GLOBAL_number_workers; i++) {
64 if (BITMAP_member(members2, i) && *pend_ltt != BRANCH_LTT(i,depth2)){
65 BITMAP_delete(members2,i);
71 prune_or_fr = prune_cp->cp_or_fr;
72 depth = OrFr_depth(prune_or_fr);
73 ltt = BRANCH_LTT(worker_id, depth);
74 LOCK_OR_FRAME(prune_or_fr);
75 members = OrFr_members(prune_or_fr);
78 BITMAP_minus(members,members2);
82 BITMAP_delete(members, worker_id);
84 for (i = 0; i < GLOBAL_number_workers; i++) {
85 if (BITMAP_member(members, i) && ltt == BRANCH_LTT(i, depth)) {
86 CUT_send_prune_request(i, prune_cp);
89 UNLOCK_OR_FRAME(prune_or_fr);
93 ltt = BRANCH_LTT(worker_id, OrFr_depth(LOCAL_top_or_fr));
94 if(!pend_ltt || LOCAL_top_or_fr != old_LOCAL_top_or_fr)
95 LOCK_OR_FRAME(LOCAL_top_or_fr);
96 if (Get_OrFr_pend_prune_cp(LOCAL_top_or_fr)){
97 Set_OrFr_pend_prune_cp(LOCAL_top_or_fr, NULL);
99 aux_qg_solutions = OrFr_qg_solutions(LOCAL_top_or_fr);
100#ifdef TABLING_INNER_CUTS
101 aux_tg_solutions = OrFr_tg_solutions(LOCAL_top_or_fr);
103 if (BITMAP_alone(OrFr_members(LOCAL_top_or_fr), worker_id)) {
105 if (OrFr_suspensions(LOCAL_top_or_fr) || OrFr_owners(LOCAL_top_or_fr) != 1)
106 pruning_over_tabling_data_structures();
108 if(!pend_ltt || LOCAL_top_or_fr != old_LOCAL_top_or_fr){
109 FREE_OR_FRAME(LOCAL_top_or_fr);
112 OrFr_qg_solutions(LOCAL_top_or_fr) = NULL;
113#ifdef TABLING_INNER_CUTS
114 OrFr_tg_solutions(LOCAL_top_or_fr) = NULL;
116 OrFr_alternative(LOCAL_top_or_fr) = NULL;
117 BITMAP_delete(OrFr_members(LOCAL_top_or_fr), worker_id);
119 OrFr_owners(LOCAL_top_or_fr)--;
121 if(!pend_ltt || LOCAL_top_or_fr != old_LOCAL_top_or_fr)
122 UNLOCK_OR_FRAME(LOCAL_top_or_fr);
124 if ((aux_qg_solutions = CUT_prune_solution_frames(aux_qg_solutions, ltt))) {
125 CUT_join_answers_in_an_unique_frame(aux_qg_solutions);
126 SolFr_next(aux_qg_solutions) = qg_solutions;
127 qg_solutions = aux_qg_solutions;
129#ifdef TABLING_INNER_CUTS
130 if ((aux_tg_solutions = CUT_prune_tg_solution_frames(aux_tg_solutions, ltt))) {
131 CUT_join_tg_solutions(& tg_solutions, aux_tg_solutions);
134 SCH_update_local_or_tops();
135 }
while (Get_LOCAL_top_cp() != prune_cp);
139 UNLOCK_OR_FRAME(old_LOCAL_top_or_fr);
140 if (BITMAP_alone(OrFr_members(old_LOCAL_top_or_fr), worker_id)){
141 FREE_OR_FRAME(old_LOCAL_top_or_fr);
146 YAPOR_ERROR_CHECKING(prune_shared_branch, Get_LOCAL_prune_request() && EQUAL_OR_YOUNGER_CP(Get_LOCAL_prune_request(), Get_LOCAL_top_cp()));
149 CUT_join_answers_in_an_unique_frame(qg_solutions);
150 LOCK_OR_FRAME(leftmost_or_fr);
151 if (Get_LOCAL_prune_request()) {
152 UNLOCK_OR_FRAME(leftmost_or_fr);
154 CUT_free_solution_frame(qg_solutions);
155#ifdef TABLING_INNER_CUTS
156 CUT_free_tg_solution_frames(tg_solutions);
160 CUT_store_answers(leftmost_or_fr, qg_solutions);
161#ifdef TABLING_INNER_CUTS
163 tg_solutions = CUT_store_tg_answers(leftmost_or_fr, tg_solutions, BRANCH_LTT(worker_id, OrFr_depth(leftmost_or_fr)));
165 UNLOCK_OR_FRAME(leftmost_or_fr);
166#ifdef TABLING_INNER_CUTS
167 CUT_validate_tg_answers(tg_solutions);
176 or_fr_ptr old_LOCAL_top_or_fr = LOCAL_top_or_fr;
179 LOCK_OR_FRAME(LOCAL_top_or_fr);
180 int depth2 = OrFr_depth(LOCAL_top_or_fr);
181 members2 = OrFr_members(LOCAL_top_or_fr);
182 for (i = 0; i < GLOBAL_number_workers; i++) {
183 if (BITMAP_member(members2, i) && *pend_ltt != BRANCH_LTT(i,depth2)){
184 BITMAP_delete(members2,i);
191 depth = OrFr_depth(leftmost_or_fr);
192 ltt = BRANCH_LTT(worker_id, depth);
193 if(!pend_ltt || LOCAL_top_or_fr != leftmost_or_fr)
194 LOCK_OR_FRAME(leftmost_or_fr);
195 members = OrFr_members(leftmost_or_fr);
198 BITMAP_minus(members,members2);
202 BITMAP_delete(members, worker_id);
203 for (i = 0; i < GLOBAL_number_workers; i++) {
204 if (BITMAP_member(members, i)) {
205 if (ltt >= BRANCH_LTT(i, depth)) {
206 CUT_send_prune_request(i, leftmost_cp->cp_b);
207 }
else if (BRANCH_CUT(i, depth)) {
212 if(!pend_ltt || LOCAL_top_or_fr != leftmost_or_fr)
213 UNLOCK_OR_FRAME(leftmost_or_fr);
216 while (Get_LOCAL_top_cp() != leftmost_cp) {
217 ltt = BRANCH_LTT(worker_id, OrFr_depth(LOCAL_top_or_fr));
218 if(!pend_ltt || LOCAL_top_or_fr != old_LOCAL_top_or_fr)
219 LOCK_OR_FRAME(LOCAL_top_or_fr);
220 if (Get_OrFr_pend_prune_cp(LOCAL_top_or_fr))
222 if (Get_OrFr_pend_prune_cp(LOCAL_top_or_fr)){
223 Set_OrFr_pend_prune_cp(LOCAL_top_or_fr, NULL);
225 aux_qg_solutions = OrFr_qg_solutions(LOCAL_top_or_fr);
226#ifdef TABLING_INNER_CUTS
227 aux_tg_solutions = OrFr_tg_solutions(LOCAL_top_or_fr);
229 if (BITMAP_alone(OrFr_members(LOCAL_top_or_fr), worker_id)) {
231 if (OrFr_suspensions(LOCAL_top_or_fr) || OrFr_owners(LOCAL_top_or_fr) != 1)
232 pruning_over_tabling_data_structures();
234 if(!pend_ltt || LOCAL_top_or_fr != old_LOCAL_top_or_fr){
235 FREE_OR_FRAME(LOCAL_top_or_fr);
238 OrFr_qg_solutions(LOCAL_top_or_fr) = NULL;
239#ifdef TABLING_INNER_CUTS
240 OrFr_tg_solutions(LOCAL_top_or_fr) = NULL;
242 OrFr_alternative(LOCAL_top_or_fr) = NULL;
243 BITMAP_delete(OrFr_members(LOCAL_top_or_fr), worker_id);
245 OrFr_owners(LOCAL_top_or_fr)--;
247 if(!pend_ltt || LOCAL_top_or_fr != old_LOCAL_top_or_fr)
248 UNLOCK_OR_FRAME(LOCAL_top_or_fr);
250 if ((aux_qg_solutions = CUT_prune_solution_frames(aux_qg_solutions, ltt))) {
251 CUT_join_answers_in_an_unique_frame(aux_qg_solutions);
252 SolFr_next(aux_qg_solutions) = qg_solutions;
253 qg_solutions = aux_qg_solutions;
255#ifdef TABLING_INNER_CUTS
256 if ((aux_tg_solutions = CUT_prune_tg_solution_frames(aux_tg_solutions, ltt))) {
257 CUT_join_tg_solutions(& tg_solutions, aux_tg_solutions);
260 SCH_update_local_or_tops();
264 UNLOCK_OR_FRAME(old_LOCAL_top_or_fr);
265 if (BITMAP_alone(OrFr_members(old_LOCAL_top_or_fr), worker_id)){
266 FREE_OR_FRAME(old_LOCAL_top_or_fr);
270 YAPOR_ERROR_CHECKING(prune_shared_branch, Get_LOCAL_prune_request() && EQUAL_OR_YOUNGER_CP(Get_LOCAL_prune_request(), Get_LOCAL_top_cp()));
273 CUT_join_answers_in_an_unique_frame(qg_solutions);
274 LOCK_OR_FRAME(leftmost_or_fr);
275 if (Get_LOCAL_prune_request()) {
276 UNLOCK_OR_FRAME(leftmost_or_fr);
278 CUT_free_solution_frame(qg_solutions);
279#ifdef TABLING_INNER_CUTS
280 CUT_free_tg_solution_frames(tg_solutions);
283 ltt = BRANCH_LTT(worker_id, depth);
285 CUT_store_answers(leftmost_or_fr, qg_solutions);
286#ifdef TABLING_INNER_CUTS
288 tg_solutions = CUT_store_tg_answers(leftmost_or_fr, tg_solutions, ltt);
290 if (Get_OrFr_pend_prune_cp(leftmost_or_fr))
292 OrFr_alternative(leftmost_or_fr) = NULL;
293 if (!Get_LOCAL_prune_request()){
294 Set_OrFr_pend_prune_cp(leftmost_or_fr, prune_cp);
295 OrFr_pend_prune_ltt(leftmost_or_fr) = ltt;
297 UNLOCK_OR_FRAME(leftmost_or_fr);
298#ifdef TABLING_INNER_CUTS
299 CUT_validate_tg_answers(tg_solutions);
304 BITMAP_copy(members, OrFr_members(leftmost_or_fr));
305 leftmost_cp = leftmost_cp->cp_b;
306 while (leftmost_cp != prune_cp) {
307 leftmost_or_fr = leftmost_cp->cp_or_fr;
308 depth = OrFr_depth(leftmost_or_fr);
309 ltt = BRANCH_LTT(worker_id, depth);
310 LOCK_OR_FRAME(leftmost_or_fr);
311 BITMAP_difference(members, OrFr_members(leftmost_or_fr), members);
312 for (i = 0; i < GLOBAL_number_workers; i++) {
313 if (BITMAP_member(members, i)) {
314 if (ltt > BRANCH_LTT(i, depth)) {
315 CUT_send_prune_request(i, leftmost_cp->cp_b);
316 }
else if (BRANCH_CUT(i, depth)) {
317 UNLOCK_OR_FRAME(leftmost_or_fr);
322 OrFr_alternative(leftmost_or_fr) = NULL;
323 UNLOCK_OR_FRAME(leftmost_or_fr);
324 BITMAP_copy(members, OrFr_members(leftmost_or_fr));
325 leftmost_cp = leftmost_cp->cp_b;
332 CUT_reset_prune_request();
334 Set_LOCAL_top_cp_on_stack(Get_LOCAL_top_cp());