libertyEstimator.h
Go to the documentation of this file.
00001 /* libertyEstimator.h
00002  */
00003 #ifndef _LIBERTYESTIMATOR_H
00004 #define _LIBERTYESTIMATOR_H
00005 
00006 #include "osl/checkmate/proofNumberTable.h"
00007 #include "osl/move.h"
00008 namespace osl
00009 {
00010   namespace checkmate
00011   {
00012     struct PureLibertyEstimator
00013     {
00015       template <class State>
00016       static void attackH(Player attacker, const State& state, 
00017                           King8Info info, Move move, 
00018                           unsigned int& proof_number, 
00019                           unsigned int& disproof_number)
00020       {
00021         const Player defender = alt(attacker);
00022         const Square king_position = state.kingSquare(defender);
00023         proof_number = Proof_Number_Table.countLiberty
00024           (state, info.libertyCount(), move, king_position, info);
00025         disproof_number = 1;
00026       }
00028       template <class State>
00029       static void defenseH(Player /*attacker*/, const State&, Move /*move*/, 
00030                            unsigned int& proof_number, 
00031                            unsigned int& disproof_number)
00032       {
00033         proof_number = 1;
00034         disproof_number = 1;
00035       }
00036 
00037     };
00042     struct LibertyEstimator
00043     {
00044 
00046       template <class State>
00047       static void attackH(Player attacker, const State&, King8Info, Move move, 
00048                           unsigned int& proof_number, unsigned int& disproof_number);
00050       template <class State>
00051       static void defenseH(Player attacker, const State&, Move move, 
00052                            unsigned int& proof_number, unsigned int& disproof_number);
00053     };
00054 
00055   } // namespace checkmate
00056 } // namespace osl
00057 
00058 
00059 template<typename State>
00060 void osl::checkmate::LibertyEstimator::
00061 attackH(Player attacker, const State& state, King8Info info, Move move, 
00062         unsigned int& proof_number, unsigned int& disproof_number)
00063 {
00064   const Player defender = alt(attacker);
00065   PureLibertyEstimator::attackH
00066     (attacker, state, info, move, proof_number, disproof_number);
00067 
00068   // 功罪はあるが,速くなる問題の方が多そう
00069   if (state.hasMultipleEffectAt(defender, move.to()))
00070     ++proof_number;
00071 
00072   const Square from=move.from();
00073   const Square to=move.to();
00074   const int attack_support = state.countEffect(attacker,to);
00075   const int defense_support = state.countEffect(defender,to);
00076   if ((attack_support + (from.isPieceStand() ? 1 : 0)) > defense_support)
00077   {
00079     disproof_number=2;
00080   }
00081   else if (move.capturePtype()!=PTYPE_EMPTY)
00082   {
00084     Ptype capturePtype=unpromote(move.capturePtype());
00085     if ((capturePtype == SILVER)
00086         || (capturePtype == GOLD))
00087     {
00088       disproof_number=2;
00089     }
00090     else
00091     {
00092       proof_number+=1;
00093       disproof_number=1;
00094     }
00095   }
00096   else
00097   {
00098     proof_number+=1;
00099     disproof_number=1;
00100   }
00101 }
00102 
00103 template<typename State>
00104 void osl::checkmate::LibertyEstimator::
00105 defenseH(Player attacker, const State& state, Move move, 
00106                  unsigned int& proof_number, unsigned int& disproof_number)
00107 {
00109   if (move.capturePtype()!=PTYPE_EMPTY)
00110   {
00111     proof_number=2;
00112     disproof_number=1;
00113     return;
00114   }
00115   if (move.ptype()==KING)
00116   {
00117     proof_number=1;
00118     disproof_number=1;
00119     return;
00120   }
00121   const Square to = move.to();
00122   if ((state.countEffect(attacker,to) + (move.isDrop() ? 1 : 0))
00123       <= state.countEffect(alt(attacker),to))
00124   {
00125     proof_number=2;
00126     disproof_number=1;
00127     return;
00128   }
00129   proof_number=1;
00130   disproof_number = 2;
00131 }
00132 
00133 #endif /* _LIBERTYESTIMATOR_H */
00134 // ;;; Local Variables:
00135 // ;;; mode:c++
00136 // ;;; c-basic-offset:2
00137 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines