00001
00002
00003 #ifndef _QUIESCENCEWINDOW_TCC
00004 #define _QUIESCENCEWINDOW_TCC
00005 #include "osl/search/quiescenceWindow.h"
00006
00007 namespace osl
00008 {
00009 namespace search
00010 {
00011 struct NullWindowToQWindow
00012 {
00016 static const std::pair<int,int>
00017 halfPawn(int current, int pawn_value2)
00018 {
00019 return std::make_pair(current - pawn_value2/4,
00020 current + pawn_value2/4);
00021 }
00025 static const std::pair<int,int>
00026 extendToCenter(Player turn, int current,
00027 int pawn_value2, int root_value)
00028 {
00029 const int delta = eval::delta(turn);
00030 const int extend_range = pawn_value2 * 4;
00031 int alpha = current - pawn_value2/8;
00032 int beta = current + pawn_value2/8;
00033
00034 if (eval::betterThan(turn, current, root_value))
00035 {
00036 alpha = eval::min(turn, root_value+extend_range-delta, alpha);
00037 }
00038 else
00039 {
00040 beta = eval::max(turn, root_value-extend_range+delta, beta);
00041 }
00042 return std::make_pair(alpha, beta);
00043 }
00044 };
00045 }
00046 }
00047
00048 template <class Eval>
00049 const std::pair<int,int>
00050 osl::search::QuiescenceWindow<osl::search::NullWindow>::
00051 make(Player turn, NullWindow window, Eval
00052 #ifdef EXPERIMENTAL_WINDOW_SIZE
00053 eval
00054 #endif
00055 )
00056 {
00057 const int pawn_value2 = Eval::captureValue(newPtypeO(alt(turn),PAWN));
00058 const int current = window.beta();
00059 #ifdef EXPERIMENTAL_WINDOW_SIZE
00060 const int root_value = eval.value();
00061 const std::pair<int,int> alpha_beta
00062 = NullWindowToQWindow::extendToCenter(turn, current, pawn_value2,
00063 root_value);
00064 #else
00065 const std::pair<int,int> alpha_beta
00066 = NullWindowToQWindow::halfPawn(current, pawn_value2);
00067 #endif
00068 const int alpha = eval::max(turn, FixedEval::winThreshold(alt(turn)),
00069 alpha_beta.first);
00070 const int beta = eval::min(turn, FixedEval::winThreshold(turn),
00071 alpha_beta.second);
00072 return std::make_pair(alpha, beta);
00073 }
00074
00075 #endif
00076
00077
00078
00079
00080