/* Instrument the solving machinery so that postkey play is suppressed * @param si identifies the root of the solving machinery */ void solving_insert_play_suppressors(slice_index si) { stip_structure_traversal st; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); stip_structure_traversal_init(&st,0); stip_structure_traversal_override_by_contextual(&st, slice_contextual_conditional_pipe, &stip_traverse_structure_children_pipe); stip_structure_traversal_override_by_contextual(&st, slice_contextual_testing_pipe, &stip_traverse_structure_children_pipe); stip_structure_traversal_override_by_contextual(&st, slice_contextual_binary, &stip_traverse_structure_children_pipe); stip_structure_traversal_override(&st, play_suppressors_inserters, nr_play_suppressors_inserters); stip_traverse_structure(si,&st); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Instrument a stipulation with STMaxSolutions*Filter slices * @param si identifies slice where to start */ static void instrument_solvers(slice_index si) { stip_structure_traversal st; insertion_struct insertion = { false, SLICE_NEXT2(si) }; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); TraceStipulation(si); { slice_index const prototypes[] = { alloc_maxsolutions_initialiser_slice() }; enum { nr_prototypes = sizeof prototypes / sizeof prototypes[0] }; slice_insertion_insert(si,prototypes,nr_prototypes); } stip_structure_traversal_init(&st,&insertion); stip_structure_traversal_override_by_contextual(&st, slice_contextual_conditional_pipe, &stip_traverse_structure_children_pipe); stip_structure_traversal_override(&st, maxsolutions_filter_inserters, nr_maxsolutions_filter_inserters); stip_traverse_structure(si,&st); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Instrument stipulation with STKeepMatingFilter slices * @param si identifies slice where to start */ void solving_insert_keepmating_filters(slice_index si) { insertion_state_type state = { { false, false } }; stip_structure_traversal st; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); TraceStipulation(si); stip_structure_traversal_init(&st,&state); stip_structure_traversal_override_by_contextual(&st, slice_contextual_end_of_branch, &keepmating_filter_inserter_end_of_branch); stip_structure_traversal_override_by_contextual(&st, slice_contextual_conditional_pipe, &keepmating_filter_inserter_end_of_branch); stip_structure_traversal_override_by_contextual(&st, slice_contextual_binary, &keepmating_filter_inserter_binary); stip_structure_traversal_override(&st, keepmating_filter_inserters, nr_keepmating_filter_inserters); stip_traverse_structure(si,&st); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Instrument the stipulation representation so that it can solve and enforce * threats * @param si identifies slice where to start */ void solving_insert_threat_handlers(slice_index si) { stip_structure_traversal st; slice_index threat_start = no_slice; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); stip_structure_traversal_init(&st,&threat_start); stip_structure_traversal_override_by_contextual(&st, slice_contextual_testing_pipe, &stip_traverse_structure_children_pipe); stip_structure_traversal_override_by_contextual(&st, slice_contextual_conditional_pipe, &stip_traverse_structure_children_pipe); stip_structure_traversal_override(&st, threat_handler_inserters, nr_threat_handler_inserters); stip_traverse_structure(si,&st); reset_tables(); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Instrument the solving machinery with move generator slices * @param si identifies root the solving machinery */ void solving_insert_move_generators(slice_index si) { stip_structure_traversal st; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); stip_structure_traversal_init(&st,0); stip_structure_traversal_override(&st,solver_inserters,nr_solver_inserters); stip_traverse_structure(si,&st); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Instrument the stipulation representation with proxy slices marking the * beginning and end of the threat * @param si identifies slice where to start */ void solving_insert_threat_boundaries(slice_index si) { stip_structure_traversal st; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); stip_structure_traversal_init(&st,0); stip_structure_traversal_override(&st, threat_boundaries_inserters, nr_threat_boundaries_inserters); stip_traverse_structure(si,&st); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
static void insert_in_branch_guards(slice_index si) { stip_structure_traversal st; in_branch_insertion_state_type state = { no_goal, false, no_side }; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); stip_structure_traversal_init(&st,&state); stip_structure_traversal_override(&st, in_branch_guards_inserters, nr_in_branch_guards_inserters); stip_traverse_structure(si,&st); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Detect whether a goal implies immobility of the "goaled" side * @param si identifies entry slice to the goal testing machinery * @return true iff the goal implies immobility */ static boolean does_goal_imply_immobility(slice_index si) { boolean result = false; stip_structure_traversal st; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); stip_structure_traversal_init(&st,&result); stip_structure_traversal_override(&st, end_of_branch_goal_immobility_detectors, nr_end_of_branch_goal_immobility_detectors); stip_traverse_structure(si,&st); TraceFunctionExit(__func__); TraceFunctionResult("%u",result); TraceFunctionResultEnd(); return result; }
/* Instrument the solving machinery with the necessary STAvoidUnusable slices * @param root_slice identifies root slice of the solving machinery */ void solving_insert_avoid_unsolvable_forks(slice_index root_slice) { stip_structure_traversal st; TraceFunctionEntry(__func__); TraceFunctionParam("%u",root_slice); TraceFunctionParamListEnd(); stip_structure_traversal_init(&st,0); stip_structure_traversal_override_by_contextual(&st, slice_contextual_end_of_branch, &insert_avoid_unsolvable); stip_structure_traversal_override(&st, avoid_unusable_inserters, nr_avoid_unusable_inserters); stip_traverse_structure(root_slice,&st); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Remove goal checker slices that we know can't possibly be met * @param si identifies entry slice to stipulation */ void solving_remove_irrelevant_constraints(slice_index si) { stip_structure_traversal st; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); TraceStipulation(si); stip_structure_traversal_init(&st,0); stip_structure_traversal_override(&st, unsatisfiable_goal_checker_removers, nr_unsatisfiable_goal_checker_removers); stip_traverse_structure(si,&st); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Instrument the solving machinery with STContinuationSolver slices * @param root_slice root slice of the solving machinery */ void solving_insert_continuation_solvers(slice_index si) { stip_structure_traversal st; boolean attack_played = false; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); stip_structure_traversal_init(&st,&attack_played); stip_structure_traversal_override_by_contextual(&st, slice_contextual_conditional_pipe, &stip_traverse_structure_children_pipe); stip_structure_traversal_override(&st, continuation_solver_inserters, nr_continuation_solver_inserters); stip_traverse_structure(si,&st); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
static boolean is_goal_move_oriented(slice_index goal_reached_tester, stip_structure_traversal *st) { boolean result = true; stip_structure_traversal st_nested; TraceFunctionEntry(__func__); TraceFunctionParam("%u",goal_reached_tester); TraceFunctionParamListEnd(); stip_structure_traversal_init_nested(&st_nested,st,&result); stip_structure_traversal_override(&st_nested, goal_move_oriented_testers, nr_goal_move_oriented_testers); stip_traverse_structure(goal_reached_tester,&st_nested); TraceFunctionExit(__func__); TraceFunctionResult("%u",result); TraceFunctionResultEnd(); return result; }
/* Write a traditional stipulation * @param file where to write to * @param si identiifes the entry slice into the stipulation * @return number of characters written */ int WriteStipulation(FILE *file, slice_index stipulation) { state_type state = { file, 0, UINT_MAX, structure_traversal_level_top, { no_goal, initsquare } }; TraceFunctionEntry(__func__); TraceFunctionParam("%u",stipulation); TraceFunctionParamListEnd(); TraceStipulation(stipulation); { stip_structure_traversal st; stip_structure_traversal_init(&st,&state); stip_structure_traversal_override(&st,visitors,nr_visitors); stip_traverse_structure(stipulation,&st); } TraceFunctionExit(__func__); TraceFunctionResult("%u",state.nr_chars_written); TraceFunctionResultEnd(); return state.nr_chars_written; }
/* Instrument stipulation with STMaxThreatLength slices * @param si identifies slice where to start */ boolean solving_insert_maxthreatlength_guards(slice_index si) { boolean result = false; stip_structure_traversal st; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); TraceStipulation(si); stip_structure_traversal_init(&st,&result); stip_structure_traversal_override(&st, maxthreatlength_guards_inserters, nr_maxthreatlength_guards_inserters); st.activity = stip_traversal_activity_testing; stip_traverse_structure(SLICE_TESTER(si),&st); TraceFunctionExit(__func__); TraceFunctionResult("%u",result); TraceFunctionResultEnd(); return result; }
static void instrument_move_inverters(slice_index si) { stip_structure_traversal st; move_inverter_instrumentation_state_type state = { no_side, false }; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); stip_structure_traversal_init(&st,&state); stip_structure_traversal_override(&st, adapters_guards_inserters, nr_adapters_guards_inserters); stip_traverse_structure(si,&st); { slice_index const prototype = alloc_selfcheck_guard_slice(); slice_insertion_insert(si,&prototype,1); } TraceFunctionExit(__func__); TraceFunctionResultEnd(); }