/* Try to solve in solve_nr_remaining half-moves. * @param si slice index * @note assigns solve_result the length of solution found and written, i.e.: * previous_move_is_illegal the move just played is illegal * this_move_is_illegal the move being played is illegal * immobility_on_next_move the moves just played led to an * unintended immobility on the next move * <=n+1 length of shortest solution found (n+1 only if in next * branch) * n+2 no solution found in this branch * n+3 no solution found in next branch * (with n denominating solve_nr_remaining) */ void goalreachable_guard_mate_solve(slice_index si) { Side const just_moved = advers(SLICE_STARTER(si)); TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); --MovesLeft[just_moved]; TraceEnumerator(Side,SLICE_STARTER(si)); TraceEnumerator(Side,just_moved); TraceValue("%u",MovesLeft[SLICE_STARTER(si)]); TraceValue("%u",MovesLeft[just_moved]); TraceEOL(); pipe_this_move_doesnt_solve_if(si,!mate_isGoalReachable()); ++MovesLeft[just_moved]; TraceValue("%u",MovesLeft[SLICE_STARTER(si)]); TraceValue("%u",MovesLeft[just_moved]); TraceEOL(); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Try to solve in solve_nr_remaining half-moves. * @param si slice index * @note assigns solve_result the length of solution found and written, i.e.: * previous_move_is_illegal the move just played is illegal * this_move_is_illegal the move being played is illegal * immobility_on_next_move the moves just played led to an * unintended immobility on the next move * <=n+1 length of shortest solution found (n+1 only if in next * branch) * n+2 no solution found in this branch * n+3 no solution found in next branch * (with n denominating solve_nr_remaining) */ void maxsolutions_guard_solve(slice_index si) { TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); pipe_this_move_doesnt_solve_if(si,max_nr_solutions_found_in_phase()); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Try to solve in solve_nr_remaining half-moves. * @param si slice index * @note assigns solve_result the length of solution found and written, i.e.: * previous_move_is_illegal the move just played is illegal * this_move_is_illegal the move being played is illegal * immobility_on_next_move the moves just played led to an * unintended immobility on the next move * <=n+1 length of shortest solution found (n+1 only if in next * branch) * n+2 no solution found in this branch * n+3 no solution found in next branch * (with n denominating solve_nr_remaining) */ void republican_type1_dead_end_solve(slice_index si) { TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); /* defender has inserted the attacker's king - no use to go on */ pipe_this_move_doesnt_solve_if(si,king_placement[nbply]!=king_not_placed); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Try to solve in solve_nr_remaining half-moves. * @param si slice index * @note assigns solve_result the length of solution found and written, i.e.: * previous_move_is_illegal the move just played is illegal * this_move_is_illegal the move being played is illegal * immobility_on_next_move the moves just played led to an * unintended immobility on the next move * <=n+1 length of shortest solution found (n+1 only if in next * branch) * n+2 no solution found in this branch * n+3 no solution found in next branch * (with n denominating solve_nr_remaining) */ void dead_end_solve(slice_index si) { TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); assert(solve_nr_remaining>=previous_move_has_solved); TraceValue("%u\n",max_unsolvable); pipe_this_move_doesnt_solve_if(si, solve_nr_remaining<=max_unsolvable || solve_nr_remaining<next_move_has_solution); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Try to solve in solve_nr_remaining half-moves. * @param si slice index * @note assigns solve_result the length of solution found and written, i.e.: * previous_move_is_illegal the move just played is illegal * this_move_is_illegal the move being played is illegal * immobility_on_next_move the moves just played led to an * unintended immobility on the next move * <=n+1 length of shortest solution found (n+1 only if in next * branch) * n+2 no solution found in this branch * n+3 no solution found in next branch * (with n denominating solve_nr_remaining) */ void maxthreatlength_guard_solve(slice_index si) { stip_length_type const n_max = slack_length+2*max_len_threat; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); pipe_this_move_doesnt_solve_if(si, solve_nr_remaining>=n_max && !is_in_check(SLICE_STARTER(si)) && n_max<testing_pipe_solve_delegate(si,n_max)); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Try to solve in solve_nr_remaining half-moves. * @param si slice index * @note assigns solve_result the length of solution found and written, i.e.: * previous_move_is_illegal the move just played is illegal * this_move_is_illegal the move being played is illegal * immobility_on_next_move the moves just played led to an * unintended immobility on the next move * <=n+1 length of shortest solution found (n+1 only if in next * branch) * n+2 no solution found in this branch * n+3 no solution found in next branch * (with n denominating solve_nr_remaining) */ void goal_doublemate_reached_tester_solve(slice_index si) { TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); TraceValue("%u",nbply); TraceValue("%u",parent_ply[nbply]); TraceEOL(); pipe_this_move_doesnt_solve_if(si, !TSTFLAG(goal_preprequisites_met[parent_ply[nbply]], goal_doublemate)); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Try to solve in solve_nr_remaining half-moves. * @param si slice index * @note assigns solve_result the length of solution found and written, i.e.: * previous_move_is_illegal the move just played is illegal * this_move_is_illegal the move being played is illegal * immobility_on_next_move the moves just played led to an * unintended immobility on the next move * <=n+1 length of shortest solution found (n+1 only if in next * branch) * n+2 no solution found in this branch * n+3 no solution found in next branch * (with n denominating solve_nr_remaining) */ void keepmating_filter_solve(slice_index si) { Side const mating = SLICE_U(si).keepmating_guard.mating; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); TraceEnumerator(Side,mating); TraceEOL(); pipe_this_move_doesnt_solve_if(si,!is_a_mating_piece_left(mating)); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Try to solve in solve_nr_remaining half-moves. * @param si slice index * @note assigns solve_result the length of solution found and written, i.e.: * previous_move_is_illegal the move just played is illegal * this_move_is_illegal the move being played is illegal * immobility_on_next_move the moves just played led to an * unintended immobility on the next move * <=n+1 length of shortest solution found (n+1 only if in next * branch) * n+2 no solution found in this branch * n+3 no solution found in next branch * (with n denominating solve_nr_remaining) */ void goal_enpassant_reached_tester_solve(slice_index si) { move_effect_journal_index_type const base = move_effect_journal_base[nbply]; move_effect_journal_index_type const capture = base+move_effect_journal_index_offset_capture; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); assert(nbply>ply_retro_move); pipe_this_move_doesnt_solve_if(si,move_effect_journal[capture].type!=move_effect_piece_removal || move_effect_journal[capture].reason!=move_effect_reason_ep_capture); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Try to solve in solve_nr_remaining half-moves. * @param si slice index * @note assigns solve_result the length of solution found and written, i.e.: * previous_move_is_illegal the move just played is illegal * this_move_is_illegal the move being played is illegal * immobility_on_next_move the moves just played led to an * unintended immobility on the next move * <=n+1 length of shortest solution found (n+1 only if in next * branch) * n+2 no solution found in this branch * n+3 no solution found in next branch * (with n denominating solve_nr_remaining) */ void goal_steingewinn_reached_tester_solve(slice_index si) { move_effect_journal_index_type const top = move_effect_journal_base[nbply]; move_effect_journal_index_type const capture = top+move_effect_journal_index_offset_capture; TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); assert(nbply>ply_retro_move); pipe_this_move_doesnt_solve_if(si, move_effect_journal[capture].type ==move_effect_no_piece_removal); TraceFunctionExit(__func__); TraceFunctionResultEnd(); }
/* Try to solve in solve_nr_remaining half-moves. * @param si slice index * @note assigns solve_result the length of solution found and written, i.e.: * previous_move_is_illegal the move just played is illegal * this_move_is_illegal the move being played is illegal * immobility_on_next_move the moves just played led to an * unintended immobility on the next move * <=n+1 length of shortest solution found (n+1 only if in next * branch) * n+2 no solution found in this branch * n+3 no solution found in next branch * (with n denominating solve_nr_remaining) */ void extinction_extincted_tester_solve(slice_index si) { TraceFunctionEntry(__func__); TraceFunctionParam("%u",si); TraceFunctionParamListEnd(); { Side const side_in_check = SLICE_STARTER(si); piece_walk_type const capturee = find_capturee(); TraceWalk(capturee); TraceEnumerator(Side,side_in_check,"\n"); pipe_this_move_doesnt_solve_if(si, capturee==Empty || being_solved.number_of_pieces[side_in_check][capturee]!=0); } TraceFunctionExit(__func__); TraceFunctionResultEnd(); }