All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
simpleMovePerf.cc
Go to the documentation of this file.
1 
7 #include "osl/record/csaString.h"
9 
10 #ifdef MORE_STATE
11 # include "osl/boardBitEffect.h"
12 # include "osl/signatureEffect.h"
13 #endif
14 
15 #ifdef PPAIR_PERF
16 # include "osl/piecePairEval.h"
17 # include "osl/pieceEval.h"
18 #endif
19 
20 #include "osl/player.h"
23 #include "osl/move_action/store.h"
24 #include "osl/misc/perfmon.h"
25 #include <iostream>
26 #include <time.h>
27 #include <sys/time.h>
28 #include <cstdio>
29 
30 using namespace osl;
31 
35 
36 int maxVal=0;
37 
38 #ifdef PPAIR_PERF
39 bool noPair = false;
40 bool piecePair = false;
41 int value;
42 #endif
43 
44 template<Player P,typename State,bool isMoveEval>
45 void nextMoves(State& state,int level);
46 
47 template<class State, Player P,bool isMoveEval>
48 struct DoUndoHelper{
49  State& state;
50  int level;
51 
52  DoUndoHelper(State& s, int level) : state(s), level(level){}
53  void operator()(Square p){
54  nextMoves<P,State,isMoveEval>(state,level);
55  }
56 };
57 
58 template<Player P,typename State>
59 void callValWithMove(State& state,Move move,Int2Type<false>){
60 }
61 
62 template<Player P,typename State>
63 void callValWithMove(State& state,Move move,Int2Type<true>){
64  typename State::eval_t ev = state.getEval();
65  const int ret = ev.template computeValWithMove<State,P>(state, move);
66  if(ret>maxVal){maxVal=ret;}
67 }
68 
69 
70 template<Player P,typename State,bool isMoveEval>
71 void nextMoves(State& state,int level){
72  if(level>maxLevel) return;
73  MoveVector moves;
74  DoUndoHelper<State,PlayerTraits<P>::opponent,isMoveEval> helper(state, level+1);
75  GenerateAllMoves::generate(P,state,moves);
76 
77  size_t size=moves.size();
78  for(size_t i=0;i<size;i++){
79  callValWithMove<P,State>(state,moves[i],Int2Type<isMoveEval>());
80  moveCount++;
81 #ifdef PPAIR_PERF
82  const int prevValue = value;
83  if (noPair)
84  value += PieceEval::diffWithMove(state, moves[i]);
85  else if (piecePair)
86  value += PiecePairEval::diffWithMove(state, moves[i]);
87 #endif
88  state.makeUnmakeMove(Player2Type<P>(),moves[i],helper);
89 #ifdef PPAIR_PERF
90  value = prevValue;
91 #endif
92  }
93 }
94 
95 #ifdef ENABLE_DIRECT_MODE
96 template<Player P,typename State,bool isMoveEval>
97 void nextMovesDirect(State& state,int level);
98 
99 template<class State,Player P,bool isMoveEval>
100 struct CallNextMoves{
101  State& state;
102  int level;
103  CallNextMoves(State& s, int level) : state(s), level(level){}
104 
105  void operator()(Square p){
106  nextMovesDirect<P,State,isMoveEval>(state,level);
107  }
108 };
109 
110 template<typename State,Player P,bool isMoveEval>
111 struct DirectCallAction{
112  State& state;
113  int level;
114  DirectCallAction(State& s, int level) : state(s), level(level){}
115  typedef CallNextMoves<State,PlayerTraits<P>::opponent,isMoveEval> next_t;
116  void receiveSimpleMove(Square from,Square to,Ptype ptype, bool isPromote,Player p){
117 
118  moveCount++;
119  next_t caller(state,level);
120  ApplyDoUndoSimpleMove<P,State>::template doUndoSimpleMove<next_t>
121  (state,from,to,promoteMask(isPromote),caller);
122  }
123  void receiveUnknownMove(Square from,Square to,Piece p1,Ptype ptype,bool isPromote,Player p){
124  next_t caller(state,level);
125  moveCount++;
126  if(p1==PIECE_EMPTY)
127  ApplyDoUndoSimpleMove<P,State>::template doUndoSimpleMove<next_t>
128  (state,from,to,promoteMask(isPromote),caller);
129  else
130  ApplyDoUndoCaptureMove<P,State>::template doUndoCaptureMove<next_t>
131  (state,from,to,p1,promoteMask(isPromote),caller);
132  }
133  void receiveDropMove(Square to,Ptype ptype,Player p){
134  moveCount++;
135  next_t caller(state, level);
136  ApplyDoUndoDropMove<P,State>::template doUndoDropMove<next_t>(state,to,ptype,caller);
137  }
138 };
139 
140 template<Player P,typename State,bool isMoveEval>
141 void nextMovesDirect(State& state,int level){
142  if(level>maxLevel) return;
143  DirectCallAction<State,P,isMoveEval> action(state, level+1);
145  generate_t::template generateMoves<P>(state,action);
146 }
147 #endif /* ENABLE_DIRECT_MODE */
148 
149 int main(int argc,char **argv){
150  bool directMode=false;
151  bool effectMode=false;
152  bool hashMode=false;
153  bool boardBitMode=false;
154  bool signatureMode=false;
155  int level=3;
156  extern char *optarg;
157 
158  char c;
159  while ((c = getopt(argc, argv, "l:dehpPbS")) != EOF)
160  {
161  switch(c)
162  {
163  case 'l': level=atoi(optarg);
164  break;
165  case 'd': directMode=true;
166  break;
167  case 'e': effectMode=true;
168  break;
169  case 'h': hashMode=true;
170  break;
171  case 'b': boardBitMode=true;
172  break;
173  case 'S': signatureMode=true;
174  break;
175 #ifdef PPAIR_PERF
176  case 'p': noPair=true;
177  break;
178  case 'P': piecePair=true;
179  break;
180 #endif
181  default:
182  std::cerr << "unknown option\n";
183  return 1;
184  }
185  }
186  SimpleState state=CsaString(
187  "P1+RY * * * * * * -KE-KY\n"
188  "P2 * * * +GI * -KI-KI-OU *\n"
189  "P3 * * +TO * * * -GI-FU-FU\n"
190  "P4-FU * -UM * -FU * -FU * *\n"
191  "P5 * * +GI * * -FU * +FU+FU\n"
192  "P6+FU+OU+GI+FU+FU * +FU * *\n"
193  "P7 * +FU * +KE * * * * *\n"
194  "P8 * * * * * * * * * \n"
195  "P9-RY * * * * * * * +KY\n"
196  "P+00KA00KY00FU00FU00FU00FU\n"
197  "P-00KI00KI00KE00KE00KY\n"
198  "+\n").getInitialState();
199  maxLevel=level;
200  moveCount=0;
201  dropCount=0;
203  if(effectMode){
204  std::cerr << "effectMode" << std::endl;
205  NumEffectState neState(state);
206 
207  if(directMode){
208  std::cerr << "directMode" << std::endl;
209 #ifdef ENABLE_DIRECT_MODE
210  nextMovesDirect<BLACK,NumEffectState,false>(neState,0);
211 #endif
212  }
213  else{
214  nextMoves<BLACK,NumEffectState,false>(neState,0);
215  }
216  }
217  else
218 #ifdef MORE_STATE
219 #ifndef PPAIR_PERF
220  if(signatureMode){
221  std::cerr << "signatureMode" << std::endl;
222  SimpleState sState(state);
223  typedef SignatureEffect<BoardBitEffect<SimpleState> > state_t;
224  state_t bState(sState);
225 
226  if(directMode){
227  std::cerr << "directMode" << std::endl;
228 #ifdef ENABLE_DIRECT_MODE
229  nextMovesDirect<BLACK,state_t,false>(bState,0);
230 #endif
231  }
232  else{
233  nextMoves<BLACK,state_t,false>(bState,0);
234  }
235  }
236  else
237  if(boardBitMode){
238  std::cerr << "boardBitMode" << std::endl;
239  SimpleState sState(state);
240  typedef BoardBitEffect<SimpleState> state_t;
241  state_t bState(sState);
242 
243  if(directMode){
244  std::cerr << "directMode" << std::endl;
245 #ifdef ENABLE_DIRECT_MODE
246  nextMovesDirect<BLACK,state_t,false>(bState,0);
247 #endif
248  }
249  else{
250  nextMoves<BLACK,state_t,false>(bState,0);
251  }
252  }
253  else
254 #endif /* ifndef PPAIR_PERF */
255  if(simpleMode){
256  std::cerr << "simpleMode" << std::endl;
257  SimpleState sState(state);
258 
259  if(directMode){
260  std::cerr << "directMode" << std::endl;
261 #ifdef ENABLE_DIRECT_MODE
262  nextMovesDirect<BLACK,SimpleState,false>(sState,0);
263 #endif
264  }
265  else{
266  nextMoves<BLACK,SimpleState,false>(sState,0);
267  }
268  }
269  else
270 #endif /* MORE_STATE */
271  {
272  }
273  timer.stop("total", moveCount+1);
274  std::cerr << "maxLevel=" << maxLevel << ",moveCount=" << moveCount <<
275  ",dropCount=" << dropCount << std::endl;
276 
277 }
278 // ;;; Local Variables:
279 // ;;; mode:c++
280 // ;;; c-basic-offset:2
281 // ;;; End: