piecePairPieceTable.cc
Go to the documentation of this file.
00001 /* piecePairPieceTable.cc
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     } // namespace ppair
00019   } // namespace eval
00020 } // namespace osl
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; // scale up according to pawn value change
00044   }
00045 
00046   // add once, decrease later
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   // for gold, silver
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   // undo piece values
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 // ;;; Local Variables:
00148 // ;;; mode:c++
00149 // ;;; c-basic-offset:2
00150 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines