group/escape.h
Go to the documentation of this file.
1 /* escape.h
2  */
3 #ifndef GROUP_ESCAPE_H
4 #define GROUP_ESCAPE_H
5 
6 #include "osl/rating/group.h"
8 
9 namespace osl
10 {
11  namespace rating
12  {
13  struct FromEffectGroup : public Group
14  {
16  void show(std::ostream& os, int name_width, const range_t& range,
17  const std::vector<double>& weights) const
18  {
19  showTopN(os, name_width, range, weights, 3);
20  }
21  int findMatch(const NumEffectState& state, Move move, const RatingEnv& env) const
22  {
23  if (move.isDrop())
24  return -1;
25  const int index = CountEffect2::index(state, move.from(), env);
26  const int progress8 = env.progress.value()/2;
27  return index*8 + progress8;
28  }
29  bool effectiveInCheck() const { return true; }
30  };
31 
32  struct PtypeAttackedGroup : public Group
33  {
35  void show(std::ostream& os, int name_width, const range_t& range,
36  const std::vector<double>& weights) const
37  {
38  showTopN(os, name_width, range, weights, 3);
39  }
40  int findMatch(const NumEffectState& state, Move move, const RatingEnv& env) const
41  {
42  if (move.isDrop())
43  return -1;
44  const int progress8 = env.progress.value()/2;
45  const Ptype self = move.oldPtype();
46  const Ptype attack = state.findCheapAttack(alt(move.player()), move.from()).ptype();
47  const int index = (self-PTYPE_PIECE_MIN)*(PTYPE_MAX+1-PTYPE_MIN)+attack;
48  return index*8 + progress8;
49  }
50  bool effectiveInCheck() const { return true; }
51  };
52 
53  struct ToSupportedGroup : public Group
54  {
55  ToSupportedGroup() : Group("ToSupported")
56  {
57  for (int p=0; p<8; ++p) // progress8
58  push_back(new ToSupported());
59  }
60  void show(std::ostream& os, int name_width, const range_t& range,
61  const std::vector<double>& weights) const
62  {
63  showAll(os, name_width, range, weights);
64  }
65  int findMatch(const NumEffectState& state, Move move, const RatingEnv& env) const
66  {
67  if (! (*this)[0].match(state, move, env))
68  return -1;
69  const int progress8 = env.progress.value()/2;
70  return progress8;
71  }
72  bool effectiveInCheck() const { return true; }
73  };
74 
75  struct ImmediateEscapeGroup : public Group
76  {
78  void show(std::ostream& os, int name_width, const range_t& range,
79  const std::vector<double>& weights) const
80  {
81  showTopN(os, name_width, range, weights, 3);
82  }
83  int findMatchWithoutProgress(const NumEffectState& state, Move move, const RatingEnv& env) const
84  {
85  if (move.isDrop())
86  return -1;
87  const Move last_move = env.history.lastMove();
88  if (! last_move.isNormal()
89  || ! state.hasEffectIf(last_move.ptypeO(), last_move.to(), move.from()))
90  return -1;
91  return (move.ptype() - PTYPE_PIECE_MIN) * (PTYPE_MAX+1 - PTYPE_PIECE_MIN)
92  + last_move.ptype() - PTYPE_PIECE_MIN;
93  }
94  int findMatch(const NumEffectState& state, Move move, const RatingEnv& env) const
95  {
96  const int index = findMatchWithoutProgress(state, move, env);
97  if (index < 0)
98  return index;
99  const int progress8 = env.progress.value()/2;
100  return index*8 + progress8;
101  }
102  };
103 
104  class KingEscapeGroup : public Group
105  {
106  public:
107  KingEscapeGroup();
108  void show(std::ostream& os, int name_width, const range_t& range,
109  const std::vector<double>& weights) const
110  {
111  showAll(os, name_width, range, weights);
112  }
113  int findMatch(const NumEffectState& state, Move move, const RatingEnv& env) const
114  {
115  if (! state.inCheck())
116  return -1;
117  const Ptype self = move.ptype();
118  const int index = self-PTYPE_PIECE_MIN;
119  assert((*this)[index].match(state, move, env));
120  return index;
121  }
122  bool effectiveInCheck() const { return true; }
123  };
124  }
125 }
126 
127 #endif /* GROUP_ESCAPE_H */
128 // ;;; Local Variables:
129 // ;;; mode:c++
130 // ;;; c-basic-offset:2
131 // ;;; End:
const Move lastMove(size_t last=1) const
Definition: moveStack.h:28
Progress16 progress
Definition: ratingEnv.h:22
bool hasEffectIf(PtypeO ptypeo, Square attacker, Square target) const
attackerにptypeoの駒がいると仮定した場合にtargetに利きがあるかどうか を stateをupdateしないで確かめる...
int findMatch(const NumEffectState &state, Move move, const RatingEnv &env) const
Definition: group/escape.h:21
int findMatch(const NumEffectState &state, Move move, const RatingEnv &env) const
Definition: group/escape.h:94
constexpr Player alt(Player player)
Definition: basic_type.h:13
int findMatchWithoutProgress(const NumEffectState &state, Move move, const RatingEnv &env) const
Definition: group/escape.h:83
bool isNormal() const
INVALID でも PASS でもない.
Definition: basic_type.h:1088
mutually exclusive set of features
Definition: group.h:16
std::pair< int, int > range_t
Definition: range.h:10
PtypeO ptypeO() const
移動後のPtype, i.e., 成る手だった場合成った後
Definition: basic_type.h:1162
Ptype
駒の種類を4ビットでコード化する
Definition: basic_type.h:83
Ptype ptype() const
Definition: basic_type.h:1155
void show(std::ostream &os, int name_width, const range_t &range, const std::vector< double > &weights) const
Definition: group/escape.h:60
int findMatch(const NumEffectState &state, Move move, const RatingEnv &env) const
Definition: group/escape.h:40
static int index(const NumEffectState &state, Square position, const RatingEnv &env)
Definition: countEffect2.h:43
const Square from() const
Definition: basic_type.h:1125
void show(std::ostream &os, int name_width, const range_t &range, const std::vector< double > &weights) const
Definition: group/escape.h:35
Ptype oldPtype() const
移動前のPtype, i.e., 成る手だった場合成る前
Definition: basic_type.h:1174
圧縮していない moveの表現 .
Definition: basic_type.h:1051
void showTopN(std::ostream &os, int name_width, const range_t &range, const std::vector< double > &weights, int n) const
Definition: group.cc:100
void show(std::ostream &os, int name_width, const range_t &range, const std::vector< double > &weights) const
Definition: group/escape.h:78
void show(std::ostream &os, int name_width, const range_t &range, const std::vector< double > &weights) const
Definition: group/escape.h:108
int findMatch(const NumEffectState &state, Move move, const RatingEnv &env) const
Definition: group/escape.h:65
void show(std::ostream &os, int name_width, const range_t &range, const std::vector< double > &weights) const
Definition: group/escape.h:16
Player player() const
Definition: basic_type.h:1195
利きを持つ局面
bool inCheck(Player P) const
Pの玉が王手状態
bool isDrop() const
Definition: basic_type.h:1150
const Square to() const
Definition: basic_type.h:1132
const Piece findCheapAttack(Player P, Square square) const
void showAll(std::ostream &os, int name_width, const range_t &range, const std::vector< double > &weights) const
Definition: group.cc:74
int findMatch(const NumEffectState &state, Move move, const RatingEnv &env) const
Definition: group/escape.h:113