211static void simplification_reduction(
TrEntry trie);
214static inline int compare_label_nodes(
TrData data1,
TrData data2);
215static inline void move_after(
TrData data_source,
TrData data_dest);
216static inline void move_last_data_after(
TrData moveto_data);
217static inline void set_depth_breadth_reduction_current_data(
TrData data);
224static TrData CURRENT_DEPTH_BREADTH_DATA;
232YAP_Term trie_depth_breadth(
TrEntry trie,
TrEntry db_trie, YAP_Int opt_level, YAP_Int start_counter, YAP_Int *end_counter) {
233 TrNode depth_node, breadth_node, nested_trie;
235 core_set_label_counter(start_counter);
236 CURRENT_TRIE = db_trie;
237 core_set_trie_db_return_term(YAP_MkAtomTerm(YAP_LookupAtom(
"false")));
238 core_initialize_depth_breadth_trie(TrEntry_trie(db_trie), &depth_node, &breadth_node);
239 set_depth_breadth_reduction_current_data(NULL);
243 if (TrNode_child(TrEntry_trie(trie)))
244 simplification_reduction(trie);
245 while (TrNode_child(TrEntry_trie(trie))) {
247 nested_trie = depth_reduction(trie, depth_node, opt_level);
249 set_depth_breadth_reduction_current_data(get_data_from_trie_node(nested_trie));
250 core_finalize_depth_breadth_trie(depth_node, breadth_node);
251 *end_counter = core_get_label_counter();
252 CURRENT_TRIE = otrie;
253 return YAP_MkApplTerm((YAP_Functor)(~ApplTag & TrNode_entry(TrNode_parent(nested_trie))), 1, &TrNode_entry(nested_trie));
256 nested_trie = breadth_reduction(trie, breadth_node, opt_level);
258 set_depth_breadth_reduction_current_data(get_data_from_trie_node(nested_trie));
259 core_finalize_depth_breadth_trie(depth_node, breadth_node);
260 *end_counter = core_get_label_counter();
261 CURRENT_TRIE = otrie;
262 return YAP_MkApplTerm((YAP_Functor)(~ApplTag & TrNode_entry(TrNode_parent(nested_trie))), 1, &TrNode_entry(nested_trie));
265 core_finalize_depth_breadth_trie(depth_node, breadth_node);
266 *end_counter = core_get_label_counter();
267 CURRENT_TRIE = otrie;
268 return core_get_trie_db_return_term();
273YAP_Int trie_get_db_opt_level_count(YAP_Int opt_level) {
274 return core_db_trie_get_optimization_level_count(opt_level);
279TrData trie_get_depth_breadth_reduction_current_data(
void) {
280 return CURRENT_DEPTH_BREADTH_DATA;
285void trie_replace_nested_trie(
TrEntry trie, YAP_Int nested_trie_id, YAP_Term new_term) {
288 core_depth_breadth_trie_replace_nested_trie(TrNode_child(TrEntry_trie(trie)), nested_trie_id, new_term, &trie_data_construct, &trie_data_destruct);
289 CURRENT_TRIE = otrie;
295YAP_Int trie_get_db_opt_min_prefix(
void) {
296 return core_get_trie_db_opt_min_prefix();
301void trie_set_db_opt_min_prefix(YAP_Int min_prefix) {
302 core_set_trie_db_opt_min_prefix(min_prefix);
313void set_depth_breadth_reduction_current_data(
TrData data) {
314 CURRENT_DEPTH_BREADTH_DATA = data;
320void simplification_reduction(
TrEntry trie) {
322 TrData stop_data, new_data, data = NULL;
323 stop_data = TrData_previous(TrEntry_first_data(trie));
324 data = TrEntry_traverse_data(trie) = TrEntry_last_data(trie);
325 while (data && (data != stop_data) && (TrData_trie(data))) {
326 node = core_simplification_reduction(TRIE_ENGINE, TrData_leaf(data), &trie_data_destruct);
328 new_trie_data(new_data, trie, node);
329 PUT_DATA_IN_LEAF_TRIE_NODE(node, new_data);
332 if (data && TrEntry_traverse_data(trie) && TrEntry_traverse_data(trie) != stop_data && !TrData_trie(data)) {
333 data = TrData_previous(data);
334 TrEntry_traverse_data(trie) = data;
335 }
else if (data && TrEntry_traverse_data(trie) && TrEntry_traverse_data(trie) != stop_data && data == TrEntry_traverse_data(trie)) {
336 data = TrData_previous(data);
337 TrEntry_traverse_data(trie) = data;
339 data = TrEntry_traverse_data(trie);
347 TrData stop_data, new_data, data = NULL;
349 stop_data = TrData_previous(TrEntry_first_data(trie));
350 data = TrEntry_traverse_data(trie) = TrEntry_last_data(trie);
351 while (data && (data != stop_data) && (TrData_trie(data))) {
352 node = core_depth_reduction(TRIE_ENGINE, TrData_leaf(data), depth_node, opt_level, &trie_data_construct, &trie_data_destruct, &trie_data_copy, &trie_data_order_correction);
353 if (node && IS_FUNCTOR_NODE(TrNode_parent(node)) && (strcmp(YAP_AtomName(YAP_NameOfFunctor((YAP_Functor)(~ApplTag & TrNode_entry(TrNode_parent(node))))), NESTED_TRIE_TERM) == 0)) {
358 new_trie_data(new_data, trie, node);
359 PUT_DATA_IN_LEAF_TRIE_NODE(node, new_data);
362 if (data && TrEntry_traverse_data(trie) && TrEntry_traverse_data(trie) != stop_data && !TrData_trie(data)) {
363 data = TrData_previous(data);
364 TrEntry_traverse_data(trie) = data;
365 }
else if (data && TrEntry_traverse_data(trie) && TrEntry_traverse_data(trie) != stop_data && data == TrEntry_traverse_data(trie)) {
366 data = TrData_previous(data);
367 TrEntry_traverse_data(trie) = data;
369 data = TrEntry_traverse_data(trie);
378 TrData stop_data, new_data, data = NULL;
380 stop_data = TrData_previous(TrEntry_first_data(trie));
381 data = TrEntry_traverse_data(trie) = TrEntry_last_data(trie);
382 while (data && (data != stop_data) && (TrData_trie(data))) {
383 node = core_breadth_reduction(TRIE_ENGINE, TrData_leaf(data), breadth_node, opt_level, &trie_data_construct, &trie_data_destruct, &trie_data_copy, &trie_data_order_correction);
384 if (node && IS_FUNCTOR_NODE(TrNode_parent(node)) && (strcmp(YAP_AtomName(YAP_NameOfFunctor((YAP_Functor)(~ApplTag & TrNode_entry(TrNode_parent(node))))), NESTED_TRIE_TERM) == 0)) {
389 new_trie_data(new_data, trie, node);
390 PUT_DATA_IN_LEAF_TRIE_NODE(node, new_data);
393 if (data && TrEntry_traverse_data(trie) && TrEntry_traverse_data(trie) != stop_data && !TrData_trie(data)) {
394 data = TrData_previous(data);
395 TrEntry_traverse_data(trie) = data;
396 }
else if (data && TrEntry_traverse_data(trie) && TrEntry_traverse_data(trie) != stop_data && data == TrEntry_traverse_data(trie)) {
397 data = TrData_previous(data);
398 TrEntry_traverse_data(trie) = data;
400 data = TrEntry_traverse_data(trie);
407void move_last_data_after(
TrData moveto_data) {
409 TrData last_data = TrEntry_last_data(trie);
410 TrEntry_last_data(trie) = TrData_previous(last_data);
411 TrData_next(TrData_previous(last_data)) = TrData_next(last_data);
412 if (moveto_data == TrData_previous(TrEntry_first_data(trie))) {
413 TrData_next(last_data) = TrEntry_first_data(trie);
414 TrEntry_first_data(trie) = last_data;
416 TrData_next(last_data) = TrData_next(moveto_data);
417 TrData_next(moveto_data) = last_data;
419 TrData_previous(last_data) = moveto_data;
420 TrData_previous(TrData_next(last_data)) = last_data;
428 if (data_source == TrEntry_first_data(trie))
429 TrEntry_first_data(trie) = TrData_next(data_source);
431 TrData_next(TrData_previous(data_source)) = TrData_next(data_source);
432 if (data_source == TrEntry_last_data(trie))
433 TrEntry_last_data(trie) = TrData_previous(data_source);
435 TrData_previous(TrData_next(data_source)) = TrData_previous(data_source);
437 if (data_dest == TrData_previous(TrEntry_first_data(trie))) {
438 TrData_next(data_source) = TrEntry_first_data(trie);
439 TrData_previous(TrEntry_first_data(trie)) = data_source;
440 TrEntry_first_data(trie) = data_source;
442 TrData_next(data_source) = TrData_next(data_dest);
443 if (data_dest == TrEntry_last_data(trie))
444 TrEntry_last_data(trie) = data_source;
446 TrData_previous(TrData_next(data_dest)) = data_source;
447 TrData_next(data_dest) = data_source;
449 TrData_previous(data_source) = data_dest;
454void trie_data_order_correction(
void) {
456 TrData inserted_data = TrEntry_last_data(trie);
457 TrData moved_data = TrData_previous(inserted_data);
458 TrData moveto_data = TrData_previous(moved_data);
460 while((moveto_data != TrData_previous(TrEntry_first_data(trie))) && (compare_label_nodes(moveto_data, inserted_data) == 1)) {
461 if (compare_label_nodes(moveto_data, moved_data) == 2)
462 moved_data = moveto_data;
463 moveto_data = TrData_previous(moveto_data);
465 move_last_data_after(moveto_data);
468 moveto_data = TrData_next(inserted_data);
469 while(compare_label_nodes(moveto_data, moved_data) == 2)
470 moveto_data = TrData_next(moveto_data);
471 inserted_data = moved_data;
472 moved_data = TrData_next(moved_data);
473 if (moved_data != moveto_data)
474 move_after(inserted_data, TrData_previous(moveto_data));
482 YAP_Term t1 = TrNode_entry(TrData_leaf(data1)), t2 = TrNode_entry(TrData_leaf(data2));
483 YAP_Int i1 = atol(YAP_AtomName(YAP_AtomOfTerm(t1)) + 1), i2 = atol(YAP_AtomName(YAP_AtomOfTerm(t2)) + 1);
484 if (i1 == i2)
return 0;
485 if (i1 > i2)
return 1;