00001
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 Position king_position = state.getKingPosition(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 }
00056 }
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.hasMultipleEffectBy(defender, move.to()))
00070 ++proof_number;
00071
00072 const Position from=move.from();
00073 const Position 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 Position 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
00134
00135
00136
00137