00001 /* proofOracle.h 00002 */ 00003 #ifndef _PROOFORACLE_H 00004 #define _PROOFORACLE_H 00005 00006 #include "osl/checkmate/checkHashRecord.h" 00007 #include "osl/checkmate/checkAssert.h" 00008 #include <cstddef> 00009 namespace osl 00010 { 00011 namespace checkmate 00012 { 00013 template <Player Attacker> 00014 struct ProofOracleDefense; 00015 00020 template <Player Attacker> 00021 struct ProofOracleAttack 00022 { 00023 const CheckHashRecord *guide; 00024 explicit ProofOracleAttack(const CheckHashRecord *g=0) : guide(g) 00025 { 00026 check_assert((!guide) 00027 || ((guide->proofDisproof().isCheckmateSuccess() 00028 && (guide->hasBestMove() 00029 && guide->getBestMove()->move.player() == Attacker)) 00030 || (guide->dump(), 0))); 00031 // (guide->proofDisproof() == NoEscape) 00032 } 00033 Move oracle() 00034 { 00035 check_assert(guide && guide->hasBestMove()); 00036 return guide->getBestMove()->move; 00037 } 00038 inline ProofOracleDefense<Attacker> expandOracle(); 00039 bool isValid() const { return guide; } 00040 }; 00041 00046 template <Player Attacker> 00047 struct ProofOracleDefense 00048 { 00049 const CheckHashRecord *guide; 00050 explicit ProofOracleDefense(const CheckHashRecord *g=0) : guide(g) 00051 { 00052 check_assert((!guide) 00053 || (guide->proofDisproof().isCheckmateSuccess() 00054 || (g->dump(), 0))); 00055 } 00056 00058 ProofOracleAttack<Attacker> expandOracle(Move defense) 00059 { 00060 check_assert(guide); 00061 check_assert(alt(defense.player()) == Attacker); 00062 const CheckMoveList& moves 00063 = (guide->finalByDominance() 00064 ? guide->finalByDominance()->moves 00065 : guide->moves); 00066 for (CheckMoveList::const_iterator p=moves.begin(); 00067 p!=moves.end(); ++p) 00068 { 00069 if (p->move == defense) 00070 { 00071 check_assert(p->record || (guide->dump(), 0)); 00072 check_assert(p->record->proofDisproof().isCheckmateSuccess() 00073 || (guide->dump(), 0)); 00074 return ProofOracleAttack<Attacker>(p->record); 00075 } 00076 } 00077 if (defense.isDrop()) 00078 { 00079 const Position to = defense.to(); 00080 for (CheckMoveList::const_iterator p=moves.begin(); 00081 p!=moves.end(); ++p) 00082 { 00083 // TODO: 𤫤.. 00084 if (p->move.isDrop() && p->move.to() == to) 00085 { 00086 check_assert(p->record || (guide->dump(), 0)); 00087 check_assert(p->record->proofDisproof().isCheckmateSuccess() 00088 || (guide->dump(), 0)); 00089 return ProofOracleAttack<Attacker>(p->record); 00090 } 00091 } 00092 } 00093 return ProofOracleAttack<Attacker>(0); 00094 } 00095 bool isValid() const { return guide; } 00096 }; 00097 00098 template <Player Attacker> inline 00099 ProofOracleDefense<Attacker> ProofOracleAttack<Attacker>::expandOracle() 00100 { 00101 check_assert(guide); 00102 const CheckHashRecord *nextGuide =0; 00103 if (guide->hasBestMove() && guide->getBestMove()->record 00104 && guide->getBestMove()->record->proofDisproof().isCheckmateSuccess()) 00105 nextGuide = guide->getBestMove()->record; 00106 return ProofOracleDefense<Attacker>(nextGuide); 00107 } 00108 } // namespace checkmate 00109 } // namespace osl 00110 00111 #endif /* _PROOFORACLE_H */ 00112 // ;;; Local Variables: 00113 // ;;; mode:c++ 00114 // ;;; c-basic-offset:2 00115 // ;;; End: