説明を見る。00001 #include "osl/eval/ptypeEval.h"
00002 osl::eval::PtypeEvalTable::PtypeEvalTable()
00003 {
00004 init();
00005 }
00006 void osl::eval::PtypeEvalTable::init()
00007 {
00008 const CArray<int, PTYPE_SIZE> values = {
00009 0, 0,
00010 PtypeEvalTraits<PPAWN>::val, PtypeEvalTraits<PLANCE>::val,
00011 PtypeEvalTraits<PKNIGHT>::val, PtypeEvalTraits<PSILVER>::val,
00012 PtypeEvalTraits<PBISHOP>::val, PtypeEvalTraits<PROOK>::val,
00013
00014 PtypeEvalTraits<KING>::val, PtypeEvalTraits<GOLD>::val,
00015
00016 PtypeEvalTraits<PAWN>::val, PtypeEvalTraits<LANCE>::val,
00017 PtypeEvalTraits<KNIGHT>::val, PtypeEvalTraits<SILVER>::val,
00018 PtypeEvalTraits<BISHOP>::val, PtypeEvalTraits<ROOK>::val,
00019 };
00020 reset(values);
00021 }
00022 osl::eval::PtypeEvalTable::~PtypeEvalTable()
00023 {
00024 }
00025
00026 void osl::eval::PtypeEvalTable::reset(const CArray<int,PTYPE_SIZE>& values)
00027 {
00028 ptypeO2Val.fill(0);
00029 std::copy(values.begin(), values.end(), ptypeO2Val.begin()+16);
00030 for(int i=PTYPE_MIN;i<=PTYPE_MAX;i++)
00031 {
00032 Ptype ptype=static_cast<Ptype>(i);
00033 ptypeO2Val[newPtypeO(WHITE,ptype)-PTYPEO_MIN]=
00034 -ptypeO2Val[newPtypeO(BLACK,ptype)-PTYPEO_MIN];
00035 }
00036 for(int i=PTYPEO_MIN;i<=PTYPEO_MAX;i++)
00037 {
00038 PtypeO ptypeO=static_cast<PtypeO>(i);
00039 PtypeO basicPtypeO=unpromote(ptypeO);
00040
00041 promoteVal[i-PTYPEO_MIN]=this->value(ptypeO)-this->value(basicPtypeO);
00042 }
00043
00044 captureVal[0]=0;
00045 for(int i=PTYPEO_MIN;i<=PTYPEO_MAX;i++)
00046 {
00047 PtypeO ptypeO=static_cast<PtypeO>(i);
00048
00049 if(isPiece(ptypeO))
00050 captureVal[i-PTYPEO_MIN]=this->value(captured(ptypeO))-
00051 this->value(ptypeO);
00052 else
00053 captureVal[i-PTYPEO_MIN]=0;
00054 }
00055 }
00056
00057
00058
00059
00060 osl::CArray<int, osl::PTYPEO_SIZE> osl::eval::ml::PieceEval::table;
00061
00062 void osl::eval::ml::
00063 PieceEval::setUp(const Weights &weights)
00064 {
00065 table.fill(0);
00066
00067 for (size_t i = 0; i < weights.dimension(); ++i)
00068 {
00069 table[i - (size_t)PTYPEO_MIN] = weights.value(i);
00070 table[i] = -weights.value(i);
00071 }
00072 table[newPtypeO(BLACK,KING)-PTYPEO_MIN] = osl::eval::Ptype_Eval_Table.value(KING);
00073 table[newPtypeO(WHITE,KING)-PTYPEO_MIN] = -osl::eval::Ptype_Eval_Table.value(KING);
00074 }
00075
00076 int osl::eval::ml::
00077 PieceEval::eval(const NumEffectState &state)
00078 {
00079 int value = 0;
00080 for (int i = 0; i < Piece::SIZE; ++i)
00081 {
00082 const Piece piece = state.pieceOf(i);
00083 value += table[piece.ptypeO() - PTYPEO_MIN];
00084 }
00085 return value;
00086 }
00087
00088 int osl::eval::ml::
00089 PieceEval::value(PtypeO ptypeO)
00090 {
00091 return table[ptypeO - PTYPEO_MIN];
00092 }
00093