All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
checkMovePerf.cc
Go to the documentation of this file.
1 
4 #include "osl/record/csaString.h"
5 
6 #define NO_SAFE_MOVE_ACTION_IN_LIBOSL
7 #define SIMPLE_STATE_ONLY
8 
12 
13 #ifdef NO_SAFE_MOVE_ACTION_IN_LIBOSL
20 #endif
21 
22 #ifndef SIMPLE_STATE_ONLY
23 # include "osl/boardBitEffect.h"
24 # include "osl/evalHashEffectState.h"
25 # include "osl/numEffectState.h"
26 #endif
27 
28 #include "osl/applyMove.h"
29 #include "osl/move_action/store.h"
30 #include "osl/move_action/safeFilter.h"
31 #include "osl/perfmon.h"
32 #include <time.h>
33 #include <sys/time.h>
34 
35 using namespace osl;
36 using namespace osl::move_generator;
37 using namespace osl::move_action;
38 
41 
42 template<Player P,typename State, bool isAttack,bool withEffect>
43 void nextMoves(State& state,int level,Move lastMove);
44 
45 template<class State, Player P, bool isAttack,bool withEffect>
47 {
49  int level;
51 
52  DoUndoHelper(State& s, int level) : state(s), level(level), move(MOVE_INVALID){}
54  {
55  assert(move!=MOVE_INVALID);
56  nextMoves<P,State,isAttack,withEffect>(state,level,move);
57  }
58 };
59 
60 template <Player P, typename State, bool isAttack,bool withEffect>
61 void nextMoves(State& state,int level,Move lastMove)
62 {
63  typedef typename State::effect_state_t effect_t;
64  if (level>maxLevel)
65  return;
66  MoveVector moves;
67  typedef DoUndoHelper<State,PlayerTraits<P>::opponent,!isAttack,withEffect> helper_t;
68  helper_t helper(state, level+1);
69  {
70  Store store(moves);
71  if (isAttack)
72  {
73  typedef SafeFilter<P,typename State::effect_state_t,Store> action_t;
74  action_t safeAction(state,store);
75  const Square opKingSquare
76  =state.template kingSquare<PlayerTraits<P>::opponent>();
77 #if 1
78  if (state.hasEffectAt(P,opKingSquare)) // 逃げる手になっていない
79  return; // 詰
80 #else
81  assert(!state.hasEffectAt(P,opKingSquare));
82 #endif
83  if(withEffect)
85  generateMoves(P,(effect_t)state,opKingSquare,safeAction);
86 #if 1
87  else
89  generateMoves(P,state,opKingSquare,safeAction);
90 #endif
91  }
92  else
93  {
94  assert(!state.hasEffectAt(P,state.template kingSquare<PlayerTraits<P>::opponent>()));
95 
97  generateKingEscape((effect_t)state, lastMove,store);
98  }
99  }
100  size_t size=moves.size();
101  for(size_t i=0;i<size;i++){
102  // std::cerr << i << " " << moves[i] << "\n";
103  moveCount++;
104  helper.move=moves[i];
105  ApplyMove<P>::doUndoMove(state,moves[i],helper);
106  }
107 }
108 
109 int main(int argc,char **argv){
110  bool effectMode=false;
111  bool hashMode=false;
112  bool evalMode=false;
113  bool nullMode=false;
114  bool withEffectMode=false;
115  bool simpleMode=false;
116  bool boardBitMode=false;
117  int level=3;
118  extern char *optarg;
119 
120  char c;
121  while ((c = getopt(argc, argv, "l:dehEnwsb")) != EOF)
122  {
123  switch(c)
124  {
125  case 'l': level=atoi(optarg);
126  break;
127  case 'e': effectMode=true;
128  break;
129  case 'h': hashMode=true;
130  break;
131  case 'E': evalMode=true;
132  break;
133  case 'n': nullMode=true;
134  break;
135  case 'w': withEffectMode=true;
136  break;
137  case 's': simpleMode=true;
138  break;
139  case 'b': boardBitMode=true;
140  break;
141  default:
142  std::cerr << "unknown option\n";
143  return 1;
144  }
145  }
146  SimpleState state=CsaString(
147 "P1-KY * * * -KY * -FU-KE * \n"
148 "P2 * * * * -OU * * * * \n"
149 "P3 * * * -FU-FU+RY * * -KY\n"
150 "P4-FU * * -GI * * * * * \n"
151 "P5 * * * * * * * * * \n"
152 "P6+FU * * +RY * * +FU * * \n"
153 "P7 * +FU * +FU+FU+FU * * * \n"
154 "P8 * * +OU * -TO * * * * \n"
155 "P9+KY * * * * * * +KE * \n"
156 "P+00KI00GI00GI00GI00KE00KE00FU00FU00FU00KI\n"
157 "P-00KA00KA00KI00FU00FU00FU00FU00KI\n"
158 "-\n").getInitialState();
159  maxLevel=level;
160  moveCount=0;
161  clock_start();
162 
163 #ifndef SIMPLE_STATE_ONLY
164  if(evalMode)
165  {
166  std::cerr << "evalMode" << std::endl;
167  NumEffectState neState(state);
168  HashEffectState hState(neState);
169  EvalHashEffectState eState(hState);
170 
171  Move lastMove=newMove(newSquare(4,4),newSquare(4,3),PROOK,
172  PTYPE_EMPTY,false,BLACK);
173 
174  if(withEffectMode)
175  nextMoves<WHITE,EvalHashEffectState,false,true>(eState,0,lastMove);
176  else
177  nextMoves<WHITE,EvalHashEffectState,false,false>(eState,0,lastMove);
178  }
179  else if(hashMode)
180  {
181  std::cerr << "hashMode" << std::endl;
182  NumEffectState neState(state);
183  HashEffectState hState(neState);
184 
185  Move lastMove=newMove(newSquare(4,4),newSquare(4,3),PROOK,
186  PTYPE_EMPTY,false,BLACK);
187  if(withEffectMode)
188  nextMoves<WHITE,HashEffectState,false,true>(hState,0,lastMove);
189  else
190  nextMoves<WHITE,HashEffectState,false,false>(hState,0,lastMove);
191  }
192  else if(effectMode);
193  {
194  assert(effectMode);
195 
196  std::cerr << "effectMode" << std::endl;
197  NumEffectState neState(state);
198  Move lastMove=newMove(newSquare(4,4),newSquare(4,3),PROOK,
199  PTYPE_EMPTY,false,BLACK);
200  if(withEffectMode)
201  nextMoves<WHITE,NumEffectState,false,true>(neState,0,lastMove);
202  else
203  nextMoves<WHITE,NumEffectState,false,false>(neState,0,lastMove);
204  }
205 #if 0
206  else
207  if(boardBitMode){
208  std::cerr << "boardBitEffectMode" << std::endl;
209  typedef BoardBitEffect<SimpleState> effect_state_t;
210  effect_state_t neState(state);
211  Move lastMove=newMove(newSquare(4,4),newSquare(4,3),PROOK,
212  PTYPE_EMPTY,false,BLACK);
213  nextMoves<WHITE,effect_state_t,false,true>(neState,0,lastMove);
214  }
215 #endif
216 #if 0
217  else if(nullMode){
218  std::cerr << "nullBoardEffectMode" << std::endl;
219  typedef NullBoardEffect<SimpleState> effect_state_t;
220  effect_state_t neState(state);
221  Move lastMove=newMove(newSquare(4,4),newSquare(4,3),PROOK,
222  PTYPE_EMPTY,false,BLACK);
223  nextMoves<WHITE,effect_state_t,false,true>(neState,0,lastMove);
224  }
225 #endif
226  else
227 #else /* SIMPLE_STATE_ONLY */
228  if(simpleMode){
229  std::cerr << "nullBoardEffectMode" << std::endl;
230  typedef SimpleState effect_state_t;
231  effect_state_t neState(state);
232  Move lastMove=newMove(newSquare(4,4),newSquare(4,3),PROOK,
233  PTYPE_EMPTY,false,BLACK);
234  nextMoves<WHITE,effect_state_t,false,true>(neState,0,lastMove);
235  }
236 #endif
237  clock_stop("total", moveCount+1);
238  std::cerr << "maxLevel=" << maxLevel << ",moveCount=" << moveCount
239  << std::endl;
240 }
241 // ;;; Local Variables:
242 // ;;; mode:c++
243 // ;;; c-basic-offset:2
244 // ;;; End: