Go to the documentation of this file.00001
00002
00003 #include "osl/eval/ppair/piecePairPieceEval.h"
00004 #include "osl/eval/ppair/piecePairRawEval.h"
00005 #include "osl/eval/ppair/piecePairEval.tcc"
00006 #include "osl/eval/ppair/piecePairWithStand.tcc"
00007 #include "osl/eval/pieceEval.h"
00008
00009 namespace osl
00010 {
00011 namespace eval
00012 {
00013 namespace ppair
00014 {
00015 template class PiecePairEvalTableBase<PiecePairPieceTable>;
00016 template class PiecePairEval<PiecePairWithStand<PiecePairPieceTable>,PiecePairPieceTable>;
00017 template class PiecePairWithStand<PiecePairPieceTable>;
00018 }
00019 }
00020 }
00021
00022 osl::eval::ppair::
00023 PiecePairPieceTable::PiecePairPieceTable()
00024 {
00025 }
00026
00027 osl::eval::ppair::
00028 PiecePairPieceTable::~PiecePairPieceTable()
00029 {
00030 }
00031
00032
00033 bool osl::eval::ppair::
00034 PiecePairPieceTable::
00035 setUp(const char *filename) const
00036 {
00037 if (! PiecePairRawEval::setUp(filename))
00038 return false;
00039
00040 for (unsigned int i=0; i<maxPairIndex; ++i)
00041 {
00042 values[i] = PiecePairRawTable::Table.value(i)
00043 *128/100;
00044 }
00045
00046
00047 for (int y=1; y<=9; ++y)
00048 {
00049 for (int x=1; x<=9; ++x)
00050 {
00051 const Square position(x,y);
00052 for (int p=PTYPEO_MIN; p<=PTYPEO_MAX; ++p)
00053 {
00054 const PtypeO ptypeo = static_cast<PtypeO>(p);
00055 if (! isPiece(ptypeo))
00056 continue;
00057 const unsigned int index = indexOf(position, ptypeo);
00058 values[indexOf(index, index)] += Ptype_Eval_Table.value(ptypeo);
00059 }
00060 }
00061 }
00062
00063
00064 static const CArray<Ptype,2> gold_silver = {{ GOLD, SILVER }};
00065 for (size_t i=0; i<gold_silver.size(); ++i) {
00066 const Ptype ptype = gold_silver[i];
00067
00068 for (int y=7; y<=9; ++y) {
00069 Square right(1,y), left(9,y);
00070 unsigned int index_r = indexOf(right, newPtypeO(BLACK, ptype));
00071 unsigned int index_l = indexOf(left, newPtypeO(BLACK, ptype));
00072 values[selfIndexOf(index_r)] = values[selfIndexOf(index_r)]*4/5;
00073 values[selfIndexOf(index_l)] = values[selfIndexOf(index_l)]*4/5;
00074
00075 right = right.rotate180();
00076 left = left.rotate180();
00077 index_r = indexOf(right, newPtypeO(WHITE, ptype));
00078 index_l = indexOf(left, newPtypeO(WHITE, ptype));
00079 values[selfIndexOf(index_r)] = values[selfIndexOf(index_r)]*4/5;
00080 values[selfIndexOf(index_l)] = values[selfIndexOf(index_l)]*4/5;
00081 }
00082 for (int x=1; x<=9; ++x) {
00083 Square top(x,1);
00084 unsigned int index = indexOf(top, newPtypeO(BLACK, ptype));
00085 values[selfIndexOf(index)] = values[selfIndexOf(index)] * 2/3;
00086
00087 top = top.rotate180();
00088 index = indexOf(top, newPtypeO(WHITE, ptype));
00089 values[selfIndexOf(index)] = values[selfIndexOf(index)] * 2/3;
00090 }
00091 }
00092 for (int y=1; y<=6; ++y) {
00093 for (int x=1; x<=9; ++x) {
00094 Square out(x,y);
00095 unsigned int index = indexOf(out, newPtypeO(BLACK, GOLD));
00096 values[selfIndexOf(index)] = values[selfIndexOf(index)] * 6/7;
00097
00098 out = out.rotate180();
00099 index = indexOf(out, newPtypeO(WHITE, GOLD));
00100 values[selfIndexOf(index)] = values[selfIndexOf(index)] * 6/7;
00101 }
00102 }
00103 for (int y=7; y<=9; ++y) {
00104 Square right(2,y), left(8,y);
00105 unsigned int index_r = indexOf(right, newPtypeO(BLACK, GOLD));
00106 unsigned int index_l = indexOf(left, newPtypeO(BLACK, GOLD));
00107 values[selfIndexOf(index_r)] = values[selfIndexOf(index_r)]*7/8;
00108 values[selfIndexOf(index_l)] = values[selfIndexOf(index_l)]*7/8;
00109
00110 right = right.rotate180();
00111 left = left.rotate180();
00112 index_r = indexOf(right, newPtypeO(WHITE, GOLD));
00113 index_l = indexOf(left, newPtypeO(WHITE, GOLD));
00114 values[selfIndexOf(index_r)] = values[selfIndexOf(index_r)]*7/8;
00115 values[selfIndexOf(index_l)] = values[selfIndexOf(index_l)]*7/8;
00116 }
00117
00118
00119 for (int y=1; y<=9; ++y)
00120 {
00121 for (int x=1; x<=9; ++x)
00122 {
00123 const Square position(x,y);
00124 for (int p=PTYPEO_MIN; p<=PTYPEO_MAX; ++p)
00125 {
00126 const PtypeO ptypeo = static_cast<PtypeO>(p);
00127 if (! isPiece(ptypeo))
00128 continue;
00129 const unsigned int index = indexOf(position, ptypeo);
00130 values[indexOf(index, index)] -= Ptype_Eval_Table.value(ptypeo);
00131 }
00132 }
00133 }
00134
00135 return true;
00136 }
00137
00138 void osl::eval::ppair::
00139 PiecePairPieceEval::resetWeights(const int *w)
00140 {
00141 CArray<int, PTYPE_SIZE> values;
00142 std::copy(w, w+(int)PTYPE_SIZE, values.begin());
00143 PiecePairPieceTable::Piece_Value.reset(values);
00144 }
00145
00146
00147
00148
00149
00150