12 #ifdef SHOW_PROBE_COUNTER
19 return os <<
"[" << mp.
pos() <<
"," << mp.
ptypeO() <<
"]";
25 for(
int ptypeIndex=8;ptypeIndex<=15;ptypeIndex++)
46 for(
size_t i=0;i<myOnboardPlus.size();++i){
47 if(myOnboardPlus[i].posPtypeO==posPtypeO){
48 myOnboardPlus[i]=myOnboardPlus[myOnboardPlus.size()-1];
49 myOnboardPlus.pop_back();
59 for(
size_t i=0;i<opOnboardMinus.size();++i){
60 if(opOnboardMinus[i].posPtypeO==posPtypeO){
61 opOnboardMinus[i]=opOnboardMinus[opOnboardMinus.size()-1];
62 opOnboardMinus.pop_back();
72 for(
size_t i=0;i<opOnboardPlus.size();++i){
73 if(opOnboardPlus[i].posPtypeO==posPtypeO){
74 opOnboardPlus[i]=opOnboardPlus[opOnboardPlus.size()-1];
75 opOnboardPlus.pop_back();
93 addStand(move.
ptype());
103 addMyBoard(move.
to(),move.
ptypeO());
111 addOpBoard(move.
to(),move.
ptypeO());
112 subStand(move.
ptype());
118 addOpBoard(move.
to(),move.
ptypeO());
122 addOpBoard(move.
to(),move.
ptypeO());
131 template<osl::Player P>
140 if(fromPtypeO!=toPtypeO &&
142 (!from.
canPromote<P>() && !to.canPromote<P>())))
151 if(pos==to)
return true;
152 if(pos==moveTo)
return false;
155 for (pos+=o;; pos+=o) {
156 if(pos==to)
return true;
157 if(pos==moveTo)
return false;
169 template<osl::Player P>
178 if(to!=captureElement.
pos())
return false;
182 if(fromPtypeO!=toPtypeO &&
193 if(pos==to)
return true;
194 if(pos==moveTo)
return false;
197 for (pos+=o;; pos+=o) {
198 if(pos==to)
return true;
199 if(pos==moveTo)
return false;
220 template<osl::Player P>
224 switch(myOnboardPlus.size()){
226 switch(opOnboardPlus.size()){
228 if(opOnboardMinus.size()==1 && myOnboardMinus.size()==0){
230 if(validSimpleMove<altP>(state,opOnboardPlus[0],opOnboardMinus[0],lastMove)){
231 if(!mayRejectSennichite && stand.isZero()){
234 return stand.geZero();
239 if(opOnboardMinus.size()==1){
240 if(myOnboardMinus.size()==0){
245 localStand.
sub(ptype);
246 if(!mayRejectSennichite && localStand.
isZero()){
249 return localStand.
geZero();
254 if(opOnboardMinus.size()==0 && myOnboardMinus.size()==0){
255 if(isRootMove)
return stand.gtZero();
256 else return stand.geZero();
260 default:
return false;
263 switch(myOnboardMinus.size()){
265 switch(opOnboardMinus.size()){
267 if(opOnboardPlus.size()==0){
268 if(validCaptureMove<P>(state,myOnboardMinus[0],myOnboardPlus[0],opOnboardMinus[0],lastMove))
274 localStand.
add(capturePtype);
276 assert(actualMove.
player()==P);
277 if(!mayRejectSennichite &&
278 actualMove.
ptypeO()==myOnboardPlus[0].ptypeO() &&
279 actualMove.
from()==myOnboardMinus[0].pos() &&
280 actualMove.
to()==myOnboardPlus[0].pos())
return false;
283 return localStand.
geZero();
288 if(opOnboardPlus.size()==0){
289 if(validSimpleMove<P>(state,myOnboardMinus[0],myOnboardPlus[0],lastMove)){
291 assert(actualMove.
player()==P);
292 if(!mayRejectSennichite &&
293 actualMove.
ptypeO()==myOnboardPlus[0].ptypeO() &&
294 actualMove.
from()==myOnboardMinus[0].pos() &&
295 actualMove.
to()==myOnboardPlus[0].pos())
return false;
298 return stand.geZero();
304 if(opOnboardPlus.size()==1){
305 if(opOnboardMinus.size()==1){
306 if(validCaptureMove<altP>(state,opOnboardPlus[0],opOnboardMinus[0],myOnboardPlus[0],lastMove))
311 localStand.
add(capturePtype);
312 if(!mayRejectSennichite && localStand.
isZero()){
315 return localStand.
geZero();
320 else if(opOnboardPlus.size()==0 && opOnboardMinus.size()==0
324 localStand.
sub(
getPtype(myOnboardPlus[0].ptypeO()));
326 if(!mayRejectSennichite &&
327 actualMove.
ptypeO()==myOnboardPlus[0].ptypeO() &&
329 actualMove.
to()==myOnboardPlus[0].pos())
return false;
332 return localStand.
geZero();
335 default:
return false;
342 os <<
"[ MyOnboardPlus(";
348 os <<
"[ MyOnboardMinus(";
354 os <<
"[ OpOnboardPlus(";
360 os <<
"[ OpOnboardMinus(";
365 return os <<
"Stand(" << mps.
stand <<
") ]\n" << std::endl;
368 #ifdef SHOW_PROBE_COUNTER
370 #ifdef OSL_USE_RACE_DETECTOR
371 osl::LightMutex mutex;
375 void incCheck(
int d){
376 #ifdef OSL_USE_RACE_DETECTOR
377 osl::LightMutex::scoped_lock lk(mutex);
382 #ifdef OSL_USE_RACE_DETECTOR
383 osl::LightMutex::scoped_lock lk(mutex);
388 for(
int i=0;i<1024;i++){
390 std::cerr << i <<
" : " << hit[i] <<
"/" << check[i] << std::endl;
395 ProbeCounter probeCounter;
398 template<osl::Player P>
405 bool existNormal=
false;
406 for(
int i=1;i<ply;i+=2){
417 if(mayRejectSennichite)
return true;
428 #ifdef SHOW_PROBE_COUNTER
429 probeCounter.incCheck(i);
434 bool isRootMove=(i == ply-1);
437 elements.
canReject<P>(state,mayRejectSennichite,isRootMove,m,m2)
439 #ifdef SHOW_PROBE_COUNTER
440 probeCounter.incHit(i);
451 template bool MoveStackRejections::probe<BLACK>(
453 template bool MoveStackRejections::probe<WHITE>(