/usr/include/osl/checkmate/fixedDepthSearcher2.h is in libosl-dev 0.6.0-3.3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | /* fixedDepthSearcher2.h
*/
#ifndef _CHECKMATE_FIXED_DEPTH_SERCHER2_H
#define _CHECKMATE_FIXED_DEPTH_SERCHER2_H
#include "osl/checkmate/proofDisproof.h"
#include "osl/state/numEffectState.h"
#include "osl/move.h"
#include "osl/pieceStand.h"
#include "osl/misc/carray.h"
#include "osl/misc/align16New.h"
namespace osl
{
class PieceStand;
namespace container
{
class MoveVector;
}
namespace checkmate
{
/**
* 深さ固定で,その深さまで depth first searchで読む詰将棋.
* 深さ0で詰み状態かどうか(攻め手の手番の場合),王手をかける手がないかを判定可能
* 深さ1で通常の一手詰みを判定(攻め手の手番の場合)
* 使うのは深さ3位まで?
* 攻撃側の自殺手はmove generationはしない.
* NumEffectState専用
*/
class FixedDepthSearcher2
#if OSL_WORDSIZE == 32
: public misc::Align16New
#endif
{
private:
static const int MAXDEPTH=16;
NumEffectState *original_state;
CArray<NumEffectState,MAXDEPTH> states;
int count;
public:
FixedDepthSearcher2() : original_state(0), count(0)
{
}
explicit FixedDepthSearcher2(NumEffectState& s)
: original_state(&s), count(0)
{
}
void setState(NumEffectState& s)
{
original_state = &s;
}
private:
void addCount()
{
count++;
}
public:
int getCount() const
{
return count;
}
public:
// private: Note: helper の都合
template <Player P, bool SetPieces, bool HasGuide>
const ProofDisproof attack(int depth, Move& best_move, PieceStand& proof_pieces);
template <Player P, bool SetPieces, bool HasGuide>
const ProofDisproof attackMayUnsafe(int depth, Move& best_move, PieceStand& proof_pieces);
template <Player P, bool SetPieces>
const ProofDisproof defense(Move last_move,int depth,
PieceStand& proof_pieces);
private:
/**
* move を作らずに ProofDisproof の予測を計算する
*/
template <Player P, bool SetPieces>
const ProofDisproof defenseEstimation(int depth,Move last_move, PieceStand& proof_pieces,
Piece attacker_piece,
Square target_position) const;
public:
/**
* stateがPから詰む局面かを返す.
* stateの手番はPと一致しているという前提
*/
template <Player P>
const ProofDisproof hasCheckmateMove(int depth, Move& best_move,
PieceStand& proof_pieces)
{
states[depth].copyFrom(*original_state);
return attack<P,true,false>(depth, best_move, proof_pieces);
}
/**
* guide を最初に試す.
* guide.isNormal() である必要はあるが,その局面でvalid でなくても良い
*/
template <Player P>
const ProofDisproof hasCheckmateWithGuide(int depth, Move& guide,
PieceStand& proof_pieces);
template <Player P>
const ProofDisproof hasCheckmateMove(int depth,Move& best_move)
{
PieceStand proof_pieces;
states[depth].copyFrom(*original_state);
return attack<P,false,false>(depth, best_move, proof_pieces);
}
template <Player P>
const ProofDisproof hasCheckmateMove(int depth)
{
Move checkmate_move;
return hasCheckmateMove<P>(depth, checkmate_move);
}
/**
* stateがPによって詰んでいる局面かを返す.
* 王手がかかっていない時には呼ばない
* stateの手番はalt(P)と一致しているという前提
* stateはPによって王手がかかっているという前提
* @param last_move 打ち歩詰めの判定に必要
*/
template <Player P>
const ProofDisproof hasEscapeMove(Move last_move,int depth,
PieceStand& proof_pieces)
{
return defense<P,true>(last_move, depth, proof_pieces);
}
template <Player P>
const ProofDisproof hasEscapeMove(Move last_move,int depth)
{
PieceStand proof_pieces;
return defense<P,false>(last_move, depth, proof_pieces);
}
/**
* next_move を指して逃げられるかどうかを調べる
* @param check_move 詰の場合の攻撃側の指手
* @param depth next_move を指した後からカウント
*/
template <Player P>
const ProofDisproof hasEscapeByMove(Move next_move, int depth,
Move& check_move,
PieceStand& proof_pieces);
template <Player P>
const ProofDisproof hasEscapeByMove(Move next_move, int depth);
const ProofDisproof hasCheckmateMoveOfTurn(int depth,Move& best_move);
const ProofDisproof hasCheckmateMoveOfTurn(int depth,Move& best_move,
PieceStand& proof_pieces);
const ProofDisproof hasCheckmateWithGuideOfTurn(int depth, Move& guide,
PieceStand& proof_pieces);
const ProofDisproof hasEscapeMoveOfTurn(Move last_move,int depth);
const ProofDisproof hasEscapeByMoveOfTurn(Move next_move, int depth,
Move& check_move,
PieceStand& proof_pieces);
const ProofDisproof hasEscapeByMoveOfTurn(Move next_move, int depth);
/**
* 無駄合をなるべく生成しない,合駒生成
*/
template <Player Defense>
void generateBlockingWhenLiberty0(int depth,Piece defense_king, Square attack_from,
container::MoveVector& moves) const;
template <Player Defense>
int blockEstimation(Square attack_from, Square defense_king) const;
};
} // namespace checkmate
} // namespace osl
#endif /* _CHECKMATE_FIXED_DEPTH_SERCHER2_H */
// ;;; Local Variables:
// ;;; mode:c++
// ;;; c-basic-offset:2
// ;;; End:
|