Fixed compile errors.

This commit is contained in:
Hisayori Noda
2019-06-15 17:08:47 +09:00
parent 9964fbbe25
commit b330602cdc
18 changed files with 336 additions and 22 deletions

View File

@@ -1,10 +1,12 @@
// NNUE評価関数の計算に関するコード
#include <fstream>
#include <iostream>
#include "../../evaluate.h"
#include "../../position.h"
#include "../../misc.h"
#include "../../uci.h"
#include "evaluate_nnue.h"
@@ -263,7 +265,7 @@ Value compute_eval(const Position& pos) {
}
// 評価関数
Value evaluate(const Position& pos) {
Value NNUE::evaluate(const Position& pos) {
const auto& accumulator = pos.state()->accumulator;
if (accumulator.computed_score) {
return accumulator.score;

View File

@@ -55,6 +55,8 @@ bool ReadParameters(std::istream& stream);
// 評価関数パラメータを書き込む
bool WriteParameters(std::ostream& stream);
Value evaluate(const Position& pos);
} // namespace NNUE
} // namespace Eval

View File

@@ -71,7 +71,7 @@ class FeatureSetBase {
template <typename IndexListType>
static void AppendActiveIndices(
const Position& pos, TriggerEvent trigger, IndexListType active[2]) {
for (const auto perspective : COLOR) {
for (const auto perspective : Colors) {
Derived::CollectActiveIndices(
pos, trigger, perspective, &active[perspective]);
}
@@ -85,7 +85,7 @@ class FeatureSetBase {
const auto& dp = pos.state()->dirtyPiece;
if (dp.dirty_num == 0) return;
for (const auto perspective : COLOR) {
for (const auto perspective : Colors) {
reset[perspective] = false;
switch (trigger) {
case TriggerEvent::kNone:
@@ -105,7 +105,7 @@ class FeatureSetBase {
reset[perspective] = true;
break;
default:
ASSERT_LV5(false);
assert(false);
break;
}
if (reset[perspective]) {

View File

@@ -28,7 +28,7 @@ inline void HalfKP<AssociatedKing>::GetPieces(
const PieceNumber target = (AssociatedKing == Side::kFriend) ?
static_cast<PieceNumber>(PIECE_NUMBER_KING + perspective) :
static_cast<PieceNumber>(PIECE_NUMBER_KING + ~perspective);
*sq_target_k = static_cast<Square>(((*pieces)[target] - f_king) % SQ_NB);
*sq_target_k = static_cast<Square>(((*pieces)[target] - f_king) % SQUARE_NB);
}
// 特徴量のうち、値が1であるインデックスのリストを取得する

View File

@@ -26,7 +26,7 @@ class HalfKP {
0x5D69D5B9u ^ (AssociatedKing == Side::kFriend);
// 特徴量の次元数
static constexpr IndexType kDimensions =
static_cast<IndexType>(SQ_NB) * static_cast<IndexType>(fe_end);
static_cast<IndexType>(SQUARE_NB) * static_cast<IndexType>(fe_end);
// 特徴量のうち、同時に値が1となるインデックスの数の最大値
static constexpr IndexType kMaxActiveDimensions = PIECE_NUMBER_KING;
// 差分計算の代わりに全計算を行うタイミング

View File

@@ -17,8 +17,8 @@ inline IndexType HalfRelativeKP<AssociatedKing>::MakeIndex(
Square sq_k, BonaPiece p) {
constexpr IndexType W = kBoardWidth;
constexpr IndexType H = kBoardHeight;
const IndexType piece_index = (p - fe_hand_end) / SQ_NB;
const Square sq_p = static_cast<Square>((p - fe_hand_end) % SQ_NB);
const IndexType piece_index = (p - fe_hand_end) / SQUARE_NB;
const Square sq_p = static_cast<Square>((p - fe_hand_end) % SQUARE_NB);
const IndexType relative_file = file_of(sq_p) - file_of(sq_k) + (W / 2);
const IndexType relative_rank = rank_of(sq_p) - rank_of(sq_k) + (H / 2);
return H * W * piece_index + H * relative_file + relative_rank;
@@ -35,7 +35,7 @@ inline void HalfRelativeKP<AssociatedKing>::GetPieces(
const PieceNumber target = (AssociatedKing == Side::kFriend) ?
static_cast<PieceNumber>(PIECE_NUMBER_KING + perspective) :
static_cast<PieceNumber>(PIECE_NUMBER_KING + ~perspective);
*sq_target_k = static_cast<Square>(((*pieces)[target] - f_king) % SQ_NB);
*sq_target_k = static_cast<Square>(((*pieces)[target] - f_king) % SQUARE_NB);
}
// 特徴量のうち、値が1であるインデックスのリストを取得する

View File

@@ -25,7 +25,7 @@ class HalfRelativeKP {
static constexpr std::uint32_t kHashValue =
0xF9180919u ^ (AssociatedKing == Side::kFriend);
// 玉を除いた駒種
static constexpr IndexType kNumPieceKinds = (fe_end - fe_hand_end) / SQ_NB;
static constexpr IndexType kNumPieceKinds = (fe_end - fe_hand_end) / SQUARE_NB;
// 玉を中央に置いた仮想的な盤の幅
static constexpr IndexType kBoardWidth = FILE_NB * 2 - 1;
// 玉を中央に置いた仮想的な盤の高さ

View File

@@ -20,8 +20,8 @@ void K::AppendActiveIndices(
const BonaPiece* pieces = (perspective == BLACK) ?
pos.eval_list()->piece_list_fb() :
pos.eval_list()->piece_list_fw();
ASSERT_LV5(pieces[PIECE_NUMBER_BKING] != BONA_PIECE_ZERO);
ASSERT_LV5(pieces[PIECE_NUMBER_WKING] != BONA_PIECE_ZERO);
assert(pieces[PIECE_NUMBER_BKING] != BONA_PIECE_ZERO);
assert(pieces[PIECE_NUMBER_WKING] != BONA_PIECE_ZERO);
for (PieceNumber i = PIECE_NUMBER_KING; i < PIECE_NUMBER_NB; ++i) {
active->push_back(pieces[i] - fe_end);
}

View File

@@ -22,7 +22,7 @@ class K {
// 評価関数ファイルに埋め込むハッシュ値
static constexpr std::uint32_t kHashValue = 0xD3CEE169u;
// 特徴量の次元数
static constexpr IndexType kDimensions = SQ_NB * 2;
static constexpr IndexType kDimensions = SQUARE_NB * 2;
// 特徴量のうち、同時に値が1となるインデックスの数の最大値
static constexpr IndexType kMaxActiveDimensions = 2;
// 差分計算の代わりに全計算を行うタイミング

View File

@@ -3,8 +3,6 @@
#ifndef _NNUE_ACCUMULATOR_H_
#define _NNUE_ACCUMULATOR_H_
#include "../../config.h"
#if defined(EVAL_NNUE)
#include "nnue_architecture.h"

View File

@@ -8,6 +8,7 @@
// 入力特徴量とネットワーク構造が定義されたヘッダをincludeする
// KP256型を使いたいときは、これを事前にdefineする。
#define EVAL_NNUE_KP256
#if defined(EVAL_NNUE_KP256)
#include "architectures/k-p_256x2-32-32.h"
#else // #if defined(EVAL_NNUE_HALFKP256)

View File

@@ -142,9 +142,9 @@ class FeatureTransformer {
}
#else
for (IndexType j = 0; j < kHalfDimensions; ++j) {
BiasType sum = accumulation[perspectives[p]][0][j];
BiasType sum = accumulation[static_cast<int>(perspectives[p])][0][j];
for (IndexType i = 1; i < kRefreshTriggers.size(); ++i) {
sum += accumulation[perspectives[p]][i][j];
sum += accumulation[static_cast<int>(perspectives[p])][i][j];
}
output[offset + j] = static_cast<OutputType>(
std::max<int>(0, std::min<int>(127, sum)));
@@ -161,7 +161,7 @@ class FeatureTransformer {
Features::IndexList active_indices[2];
RawFeatures::AppendActiveIndices(pos, kRefreshTriggers[i],
active_indices);
for (const auto perspective : COLOR) {
for (const auto perspective : Colors) {
if (i == 0) {
std::memcpy(accumulator.accumulation[perspective][i], biases_,
kHalfDimensions * sizeof(BiasType));
@@ -217,7 +217,7 @@ class FeatureTransformer {
bool reset[2];
RawFeatures::AppendChangedIndices(pos, kRefreshTriggers[i],
removed_indices, added_indices, reset);
for (const auto perspective : COLOR) {
for (const auto perspective : Colors) {
#if defined(USE_AVX2)
constexpr IndexType kNumChunks = kHalfDimensions / (kSimdWidth / 2);
auto accumulation = reinterpret_cast<__m256i*>(

View File

@@ -43,7 +43,7 @@ class Factorizer<HalfKP<AssociatedKing>> {
// kFeaturesHalfKP
{true, FeatureType::kDimensions},
// kFeaturesHalfK
{true, SQ_NB},
{true, SQUARE_NB},
// kFeaturesP
{true, Factorizer<P>::GetDimensions()},
// kFeaturesHalfRelativeKP

View File

@@ -34,6 +34,181 @@ constexpr Value Tempo = Value(28); // Must be visible to search
std::string trace(const Position& pos);
Value evaluate(const Position& pos);
// --- <20>]<5D><><EFBFBD>֐<EFBFBD><D690>Ŏg<C58E><67><EFBFBD>萔 KPP(<28>ʂƔC<C694><43>2<EFBFBD><32>)<29><>P<EFBFBD>ɑ<EFBFBD><C991><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>enum
// (<28>]<5D><><EFBFBD>֐<EFBFBD><D690>̎<EFBFBD><CC8E><EFBFBD><EFBFBD>̂Ƃ<CC82><C682>ɂ́ABonaPiece<63>͎<EFBFBD><CD8E>R<EFBFBD>ɒ<EFBFBD><C992>`<60><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ł<CC82><C582><EFBFBD><EFBFBD>ł͒<C582><CD92>`<60><><EFBFBD>Ȃ<EFBFBD><C882>B)
// Bonanza<7A><61>KKP/KPP<50>ƌ<EFBFBD><C68C><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD>P(Piece)<29><><EFBFBD>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>^<5E>B
// <20><> KPP<50><50><EFBFBD><EFBFBD><EFBFBD>߂<EFBFBD><DF82>Ƃ<EFBFBD><C682>ɁA39<33>̒n<CC92>_<EFBFBD>̕<EFBFBD><CC95>̂悤<CC82>ɁA<C981><41><EFBFBD>~<7E><><EFBFBD><EFBFBD><EFBFBD>ɑ΂<C991><CE82>Ĉ<EFBFBD><C488>ӂȔԍ<C894><D48D><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD>ƂȂ<C682><C882>B
enum BonaPiece : int32_t
{
// f = friend(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>̈Ӗ<CC88><D396>Be = enemy(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29>̈Ӗ<CC88>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̎<EFBFBD><CC8E>̒l
BONA_PIECE_NOT_INIT = -1,
// <20><><EFBFBD><EFBFBD><EFBFBD>ȋ<EFBFBD><C88B>B<EFBFBD><EFBFBD><EE978E><EFBFBD>̂Ƃ<CC82><C682>Ȃǂ́A<CD81>s<EFBFBD>v<EFBFBD>ȋ<EFBFBD><C88B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ɉړ<C988><DA93><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
BONA_PIECE_ZERO = 0,
fe_hand_end = BONA_PIECE_ZERO + 1,
// Bonanza<7A>̂悤<CC82>ɔՏ<C994><D58F>̂<EFBFBD><CC82><EFBFBD>Ȃ<EFBFBD><C882><EFBFBD><EFBFBD>̕<EFBFBD><CC95><EFBFBD>̔ԍ<CC94><D48D><EFBFBD><EFBFBD>l<EFBFBD>߂Ȃ<DF82><C882>B
// <20><><EFBFBD>R1) <20>w<EFBFBD>K<EFBFBD>̂Ƃ<CC82><C682>ɑ<EFBFBD><C991><EFBFBD>PP<50><50>1<EFBFBD>i<EFBFBD>ڂɍ<DA82><C98D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>āA<C481><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>ϊ<EFBFBD><CF8A>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>Đ<EFBFBD><C490><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<5C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><CC82><EFBFBD><EF82B5><EFBFBD>B
// <20><><EFBFBD>R2) <20>c<EFBFBD>^Bitboard<72><64><EFBFBD><EFBFBD>Square<72><65><EFBFBD><EFBFBD><EFBFBD>̕ϊ<CC95><CF8A>ɍ<EFBFBD><C98D><EFBFBD><EFBFBD>B
// --- <20>Տ<EFBFBD><D58F>̋<EFBFBD>
f_pawn = fe_hand_end,
e_pawn = f_pawn + SQUARE_NB,
f_knight = e_pawn + SQUARE_NB,
e_knight = f_knight + SQUARE_NB,
f_bishop = e_knight + SQUARE_NB,
e_bishop = f_bishop + SQUARE_NB,
f_rook = e_bishop + SQUARE_NB,
e_rook = f_rook + SQUARE_NB,
f_queen = e_rook + SQUARE_NB,
e_queen = f_queen + SQUARE_NB,
fe_end = e_queen + SQUARE_NB,
f_king = fe_end,
e_king = f_king + SQUARE_NB,
fe_end2 = e_king + SQUARE_NB, // <20>ʂ<EFBFBD><CA82>܂߂<DC82><DF82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̔ԍ<CC94><D48D>B
};
// BonaPiece<63><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E78CA9><EFBFBD>Ƃ<EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>39<33>̕<EFBFBD><CC95><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E78CA9><EFBFBD>ƌ<EFBFBD><C68C><EFBFBD><EFBFBD><EFBFBD>71<37>̕<EFBFBD>)<29>̔ԍ<CC94><D48D>Ƃ<EFBFBD>
// <20>y<EFBFBD>A<EFBFBD>ɂ<EFBFBD><C982><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD>ExtBonaPiece<63>^<5E>ƌĂԂ<C482><D482>Ƃɂ<C682><C982><EFBFBD><EFBFBD>B
union ExtBonaPiece
{
struct {
BonaPiece fw; // from white
BonaPiece fb; // from black
};
BonaPiece from[2];
ExtBonaPiece() {}
ExtBonaPiece(BonaPiece fw_, BonaPiece fb_) : fw(fw_), fb(fb_) {}
};
// <20><EFBFBD><EE82AA><EFBFBD><EFBFBD><EFBFBD>̎w<CC8E><77><EFBFBD><EFBFBD><EFBFBD>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>Ăǂ<C482><C782><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǂ<EFBFBD><C782>Ɉړ<C988><DA93><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><CC82>̏<EFBFBD><CC8F><EFBFBD><EFBFBD>B
// <20><><EFBFBD><EFBFBD>ExtBonaPiece<63>\<5C><><EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>B
struct ChangedBonaPiece
{
ExtBonaPiece old_piece;
ExtBonaPiece new_piece;
};
// KPP<50>e<EFBFBD>[<5B>u<EFBFBD><75><EFBFBD>̔Տ<CC94><D58F>̋<EFBFBD>pc<70>ɑΉ<C991><CE89><EFBFBD><EFBFBD><EFBFBD>BonaPiece<63><65><EFBFBD><EFBFBD><EFBFBD>߂邽<DF82>߂̔z<CC94><7A><EFBFBD>B
// <20><>)
// BonaPiece fb = kpp_board_index[pc].fb + sq; // <20><><EFBFBD><EFBFBD><EFBFBD><E78CA9>sq<73>ɂ<EFBFBD><C982><EFBFBD>pc<70>ɑΉ<C991><CE89><EFBFBD><EFBFBD><EFBFBD>BonaPiece
// BonaPiece fw = kpp_board_index[pc].fw + sq; // <20><><EFBFBD><EFBFBD><EFBFBD><E78CA9>sq<73>ɂ<EFBFBD><C982><EFBFBD>pc<70>ɑΉ<C991><CE89><EFBFBD><EFBFBD><EFBFBD>BonaPiece
extern ExtBonaPiece kpp_board_index[PIECE_NB];
// <20>]<5D><><EFBFBD>֐<EFBFBD><D690>ŗp<C597><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>g<EFBFBD>B<EFBFBD>ǂ̋<C782>(PieceNumber)<29><><EFBFBD>ǂ<EFBFBD><C782>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>̂<EFBFBD>(BonaPiece)<29><><EFBFBD>ێ<EFBFBD><DB8E><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>\<5C><><EFBFBD><EFBFBD>
struct EvalList
{
// <20>]<5D><><EFBFBD>֐<EFBFBD>(FV38<33>^)<29>ŗp<C597><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԍ<EFBFBD><D48D>̃<EFBFBD><CC83>X<EFBFBD>g
BonaPiece* piece_list_fw() const { return const_cast<BonaPiece*>(pieceListFw); }
BonaPiece* piece_list_fb() const { return const_cast<BonaPiece*>(pieceListFb); }
// <20>w<EFBFBD><EFBFBD>ꂽpiece_no<6E>̋<EFBFBD><CC8B><EFBFBD>ExtBonaPiece<63>^<5E>ɕϊ<C995><CF8A><EFBFBD><EFBFBD>ĕԂ<C495><D482>B
ExtBonaPiece bona_piece(PieceNumber piece_no) const
{
ExtBonaPiece bp;
bp.fw = pieceListFw[piece_no];
bp.fb = pieceListFb[piece_no];
return bp;
}
// <20>Տ<EFBFBD><D58F><EFBFBD>sq<73>̏<EFBFBD><CC8F><EFBFBD>piece_no<6E><6F>pc<70>̋<EFBFBD><CC8B><EFBFBD><EFBFBD>z<EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD>
void put_piece(PieceNumber piece_no, Square sq, Piece pc) {
set_piece_on_board(piece_no, BonaPiece(kpp_board_index[pc].fw + sq), BonaPiece(kpp_board_index[pc].fb + inverse(sq)), sq);
}
// <20>Տ<EFBFBD><D58F>̂<EFBFBD><CC82>鏡sq<73>ɑΉ<C991><CE89><EFBFBD><EFBFBD><EFBFBD>PieceNumber<65><72><EFBFBD>Ԃ<EFBFBD><D482>B
PieceNumber piece_no_of_board(Square sq) const { return piece_no_list_board[sq]; }
// pieceList<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
// <20><EFBFBD><EE978E><EFBFBD>ɑΉ<C991><CE89><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD><CC82>߂ɁA<C981><41><EFBFBD>g<EFBFBD>p<EFBFBD>̋<EFBFBD><CC8B>̒l<CC92><6C>BONA_PIECE_ZERO<52>ɂ<EFBFBD><C982>Ă<EFBFBD><C482><EFBFBD><EFBFBD>B
// <20>ʏ<EFBFBD><CA8F>̕]<5D><><EFBFBD>֐<EFBFBD><D690><EFBFBD><EFBFBD><EFBFBD><EE978E><EFBFBD>̕]<5D><><EFBFBD>֐<EFBFBD><D690>Ƃ<EFBFBD><C682>ė<EFBFBD><C497>p<EFBFBD>ł<EFBFBD><C582><EFBFBD><EFBFBD>B
// piece_no_list<73>̂ق<CC82><D982>̓f<CD83>o<EFBFBD>b<EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E682A4>PIECE_NUMBER_NB<4E>ŏ<EFBFBD><C58F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
void clear()
{
for (auto& p : pieceListFw)
p = BONA_PIECE_ZERO;
for (auto& p : pieceListFb)
p = BONA_PIECE_ZERO;
for (auto& v : piece_no_list_board)
v = PIECE_NUMBER_NB;
}
// list<73><74><EFBFBD><EFBFBD><EFBFBD>•ς̂Ƃ<CC82><C682>́Aadd()/remove()<29><><EFBFBD>T<EFBFBD>|<7C>[<5B>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>B
// DirtyPiece<63>̂ق<CC82><D982><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ăяo<D18F><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
// list<73><74>add()<29><><EFBFBD><EFBFBD><EFBFBD>B
void add(BonaPiece fb);
// list<73><74><EFBFBD><EFBFBD>remove<76><65><EFBFBD><EFBFBD><EFBFBD>B
void remove(BonaPiece fb);
// <20><><EFBFBD><EFBFBD><EFBFBD>ŕێ<C595><DB8E><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD>pieceListFb[]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BonaPiece<63>ł<EFBFBD><C582><EFBFBD><E982A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B
// <20><> : <20>f<EFBFBD>o<EFBFBD>b<EFBFBD>O<EFBFBD>p<EFBFBD>B<EFBFBD>x<EFBFBD><78><EFBFBD>B
bool is_valid(const Position& pos);
protected:
// <20>Տ<EFBFBD>sq<73>ɂ<EFBFBD><C982><EFBFBD>piece_no<6E>̋<EFBFBD><CC8B><EFBFBD>BonaPiece<63><65>fb,fw<66>ł<EFBFBD><C582><EFBFBD>Ƃ<EFBFBD><C682>ݒ肷<DD92><E882B7><EFBFBD>B
inline void set_piece_on_board(PieceNumber piece_no, BonaPiece fw, BonaPiece fb, Square sq)
{
assert(is_ok(piece_no));
pieceListFw[piece_no] = fw;
pieceListFb[piece_no] = fb;
piece_no_list_board[sq] = piece_no;
}
// <20><EFBFBD>X<EFBFBD>g<EFBFBD>B<EFBFBD><42><EFBFBD>ԍ<EFBFBD>(PieceNumber)<29><><EFBFBD><EFBFBD><EFBFBD>‚̋<CC8B>ǂ<EFBFBD><C782>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>̂<EFBFBD>(BonaPiece)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BFV38<33>Ȃǂŗp<C597><70><EFBFBD><EFBFBD><EFBFBD>B
// <20><EFBFBD>X<EFBFBD>g<EFBFBD>̒<EFBFBD><CC92><EFBFBD>
// 38<33>Œ<EFBFBD>
public:
int length() const { return PIECE_NUMBER_KING; }
// VPGATHERDD<44><44><EFBFBD>g<EFBFBD><67><EFBFBD>s<EFBFBD><73><EFBFBD>A4<41>̔{<7B><><EFBFBD>łȂ<C582><C882><EFBFBD><EFBFBD>΂Ȃ<CE82><C882>Ȃ<EFBFBD><C882>B
// <20>܂<EFBFBD><DC82>AKPPT<50>^<5E>]<5D><><EFBFBD>֐<EFBFBD><D690>Ȃǂ́A39,40<34>Ԗڂ̗v<CC97>f<EFBFBD><66><EFBFBD>[<5B><><EFBFBD>ł<EFBFBD><C582><EFBFBD>Ƃ<EFBFBD><C682>O<EFBFBD><4F><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD>
// <20>A<EFBFBD>N<EFBFBD>Z<EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>ӏ<EFBFBD><D38F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂Œ<CC82><C592>ӂ<EFBFBD><D382><EFBFBD>ƁB
static const int MAX_LENGTH = 40;
private:
BonaPiece pieceListFw[MAX_LENGTH];
BonaPiece pieceListFb[MAX_LENGTH];
// <20>Տ<EFBFBD><D58F>̋<EFBFBD><CC8B>ɑ΂<C991><CE82>āA<C481><41><EFBFBD>̋<EFBFBD><CC8B>ԍ<EFBFBD>(PieceNumber)<29><><EFBFBD>ێ<EFBFBD><DB8E><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>z<EFBFBD><7A>
// <20>ʂ<EFBFBD>SQ_NB<4E>Ɉړ<C988><DA93><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>p<EFBFBD><70>+1<>܂ŕێ<C595><DB8E><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A
// SQ_NB<4E>̋ʂ<CC8B><CA82>ړ<EFBFBD><DA93><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>̂ŁA<C581><41><EFBFBD>̒l<CC92><6C><EFBFBD>g<EFBFBD><67><EFBFBD><EFBFBD><EFBFBD>Ƃ͂Ȃ<CD82><C882>͂<EFBFBD><CD82>B
PieceNumber piece_no_list_board[SQUARE_NB_PLUS1];
};
// <20>]<5D><><EFBFBD>l<EFBFBD>̍<EFBFBD><CC8D><EFBFBD><EFBFBD>v<EFBFBD>Z<EFBFBD>̊Ǘ<CC8A><C797>p
// <20>O<EFBFBD>̋ǖʂ<C796><CA82><EFBFBD><EFBFBD>ړ<EFBFBD><DA93><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԍ<EFBFBD><D48D><EFBFBD><EFBFBD>Ǘ<EFBFBD><C797><EFBFBD><EFBFBD><EFBFBD>߂̍\<5C><><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>́A<CD81>ő<EFBFBD><C591><EFBFBD>2<EFBFBD>B
struct DirtyPiece
{
// <20><><EFBFBD>̋<EFBFBD><CC8B>ԍ<EFBFBD><D48D>̋<CC8B><EE82AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɕς<C995><CF82><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂<EFBFBD>
Eval::ChangedBonaPiece changed_piece[2];
// dirty<74>ɂȂ<C982><C882><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԍ<EFBFBD>
PieceNumber pieceNo[2];
// dirty<74>ɂȂ<C982><C882><EFBFBD><EFBFBD><EFBFBD><C290>B
// null move<76><65><EFBFBD><EFBFBD>0<EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD><EFBFBD><E882A4><EFBFBD>B
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǝ<EFBFBD><C68E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃōő<C58D><C591><EFBFBD>2<EFBFBD>B
int dirty_num;
};
}
#endif // #ifndef EVALUATE_H_INCLUDED

View File

@@ -315,3 +315,19 @@ void bindThisThread(size_t idx) {
#endif
} // namespace WinProcGroup
void sleep(int ms)
{
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
}
void* aligned_malloc(size_t size, size_t align)
{
void* p = _mm_malloc(size, align);
if (p == nullptr)
{
std::cout << "info string can't allocate memory. sise = " << size << std::endl;
exit(1);
}
return p;
}

View File

@@ -21,6 +21,7 @@
#ifndef MISC_H_INCLUDED
#define MISC_H_INCLUDED
#include <algorithm>
#include <cassert>
#include <chrono>
#include <ostream>
@@ -110,4 +111,69 @@ namespace WinProcGroup {
void bindThisThread(size_t idx);
}
// 指定されたミリ秒だけsleepする。
extern void sleep(int ms);
// 途中での終了処理のためのwrapper
static void my_exit()
{
sleep(3000); // エラーメッセージが出力される前に終了するのはまずいのでwaitを入れておく。
exit(EXIT_FAILURE);
}
// --------------------
// Math
// --------------------
// 進行度の計算や学習で用いる数学的な関数
namespace Math {
// シグモイド関数
// = 1.0 / (1.0 + std::exp(-x))
double sigmoid(double x);
// シグモイド関数の微分
// = sigmoid(x) * (1.0 - sigmoid(x))
double dsigmoid(double x);
// vを[lo,hi]の間に収まるようにクリップする。
// ※ Stockfishではこの関数、bitboard.hに書いてある。
template<class T> constexpr const T& clamp(const T& v, const T& lo, const T& hi) {
return v < lo ? lo : v > hi ? hi : v;
}
}
// --------------------
// Path
// --------------------
// C#にあるPathクラス的なもの。ファイル名の操作。
// C#のメソッド名に合わせておく。
struct Path
{
// path名とファイル名を結合して、それを返す。
// folder名のほうは空文字列でないときに、末尾に'/'か'\\'がなければそれを付与する。
static std::string Combine(const std::string& folder, const std::string& filename)
{
if (folder.length() >= 1 && *folder.rbegin() != '/' && *folder.rbegin() != '\\')
return folder + "/" + filename;
return folder + filename;
}
// full path表現から、(フォルダ名を除いた)ファイル名の部分を取得する。
static std::string GetFileName(const std::string& path)
{
// "\"か"/"か、どちらを使ってあるかはわからない。
auto path_index1 = path.find_last_of("\\") + 1;
auto path_index2 = path.find_last_of("/") + 1;
auto path_index = std::max(path_index1, path_index2);
return path.substr(path_index);
}
};
extern void* aligned_malloc(size_t size, size_t align);
static void aligned_free(void* ptr) { _mm_free(ptr); }
#endif // #ifndef MISC_H_INCLUDED

View File

@@ -29,6 +29,8 @@
#include "bitboard.h"
#include "types.h"
#include "eval/nnue/nnue_accumulator.h"
/// StateInfo struct stores information needed to restore a Position object to
/// its previous state when we retract a move. Whenever a move is made on the
@@ -54,6 +56,11 @@ struct StateInfo {
Bitboard blockersForKing[COLOR_NB];
Bitboard pinners[COLOR_NB];
Bitboard checkSquares[PIECE_TYPE_NB];
Eval::NNUE::Accumulator accumulator;
// <20>]<5D><><EFBFBD>l<EFBFBD>̍<EFBFBD><CC8D><EFBFBD><EFBFBD>v<EFBFBD>Z<EFBFBD>̊Ǘ<CC8A><C797>p
Eval::DirtyPiece dirtyPiece;
};
/// A list to keep track of the position states along the setup moves (from the
@@ -165,6 +172,15 @@ public:
bool pos_is_ok() const;
void flip();
// --- StateInfo
// <20><><EFBFBD>݂̋ǖʂɑΉ<C991><CE89><EFBFBD><EFBFBD><EFBFBD>StateInfo<66><6F><EFBFBD>Ԃ<EFBFBD><D482>B
// <20><><EFBFBD>Ƃ<EFBFBD><C682>΁Astate()->capturedPiece<63>ł<EFBFBD><C582><EFBFBD><EFBFBD>΁A<CE81>O<EFBFBD>ǖʂŕߊl<DF8A><6C><EFBFBD><EFBFBD><EFBFBD>i<EFBFBD>[<5B><><EFBFBD><EFBFBD><EFBFBD>Ă<EFBFBD><C482><EFBFBD><EFBFBD>B
StateInfo* state() const { return st; }
// <20>]<5D><><EFBFBD>֐<EFBFBD><D690>Ŏg<C58E><67><EFBFBD><EFBFBD><EFBFBD>߂́A<CC81>ǂ̋<C782><CC8B>ԍ<EFBFBD><D48D>̋<CC8B>ǂ<EFBFBD><C782>ɂ<EFBFBD><C982><EFBFBD>Ȃǂ̏<C782><CC8F><EFBFBD><EFBFBD>B
const Eval::EvalList* eval_list() const { return &evalList; }
private:
// Initialization helpers (used while setting up a position)
void set_castling_right(Color c, Square rfrom);
@@ -194,6 +210,9 @@ private:
Thread* thisThread;
StateInfo* st;
bool chess960;
// <20>]<5D><><EFBFBD>֐<EFBFBD><D690>ŗp<C597><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̃<EFBFBD><CC83>X<EFBFBD>g
Eval::EvalList evalList;
};
namespace PSQT {

View File

@@ -131,6 +131,8 @@ enum Color {
WHITE, BLACK, COLOR_NB = 2
};
constexpr Color Colors[2] = { WHITE, BLACK };
enum CastlingSide {
KING_SIDE, QUEEN_SIDE, CASTLING_SIDE_NB = 2
};
@@ -186,7 +188,10 @@ enum Value : int {
RookValueMg = 1289, RookValueEg = 1378,
QueenValueMg = 2529, QueenValueEg = 2687,
MidgameLimit = 15258, EndgameLimit = 3915
MidgameLimit = 15258, EndgameLimit = 3915,
// <20>]<5D><><EFBFBD>֐<EFBFBD><D690>̕Ԃ<CC95><D482>l<EFBFBD>̍ő<CC8D><C591>l(2**14<31><34><EFBFBD><EFBFBD>Ɏ<EFBFBD><C98E>܂<EFBFBD><DC82>Ă<EFBFBD><C482>ė~<7E><><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682><EFBFBD><EB82BE>..)
VALUE_MAX_EVAL = 27000,
};
enum PieceType {
@@ -230,7 +235,8 @@ enum Square : int {
SQ_A8, SQ_B8, SQ_C8, SQ_D8, SQ_E8, SQ_F8, SQ_G8, SQ_H8,
SQ_NONE,
SQUARE_NB = 64
SQUARE_NB = 64,
SQUARE_NB_PLUS1 = SQUARE_NB + 1, // <20>ʂ<EFBFBD><CA82><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882><EFBFBD>ASQ_NB<4E>Ɉړ<C988><DA93><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂Ƃ<CC82><C682>Ĉ<EFBFBD><C488><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߁A<DF81>z<EFBFBD><7A><EFBFBD><EFBFBD>SQ_NB+1<>Ŋm<C58A>ۂ<EFBFBD><DB82>Ȃ<EFBFBD><C882>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD>Ȃ<EFBFBD><C882>Ƃ<EFBFBD><C682><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̂ł<CC82><C582>̒萔<CC92><E89094><EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD><EFBFBD>B
};
enum Direction : int {
@@ -356,6 +362,10 @@ constexpr Square operator~(Square s) {
return Square(s ^ SQ_A8); // Vertical flip SQ_A1 -> SQ_A8
}
constexpr Square inverse(Square s) {
return static_cast<Square>(static_cast<int>(SQUARE_NB) - s - 1);
}
constexpr File operator~(File f) {
return File(f ^ FILE_H); // Horizontal flip FILE_A -> FILE_H
}
@@ -454,4 +464,29 @@ constexpr bool is_ok(Move m) {
return from_sq(m) != to_sq(m); // Catch MOVE_NULL and MOVE_NONE
}
// --------------------
// <20>
// --------------------
// Position<6F>N<EFBFBD><4E><EFBFBD>X<EFBFBD>ŗp<C597><70><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD>X<EFBFBD>g(<28>ǂ̋<CC8B>ǂ<EFBFBD><C782>ɂ<EFBFBD><C982><EFBFBD><EFBFBD>̂<EFBFBD>)<29><><EFBFBD>Ǘ<EFBFBD><C797><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƃ<EFBFBD><C682>̔ԍ<CC94><D48D>B
enum PieceNumber : int8_t
{
PIECE_NUMBER_PAWN = 0,
PIECE_NUMBER_KNIGHT = 16,
PIECE_NUMBER_BISHOP = 20,
PIECE_NUMBER_ROOK = 24,
PIECE_NUMBER_QUEEN = 28,
PIECE_NUMBER_KING = 30,
PIECE_NUMBER_WKING = 30,
PIECE_NUMBER_BKING = 31, // <20><><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>̋ʂ̔ԍ<CC94><D48D><EFBFBD><EFBFBD>K<EFBFBD>v<EFBFBD>ȏꍇ<C88F>͂<EFBFBD><CD82><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>p<EFBFBD><70><EFBFBD><EFBFBD>
PIECE_NUMBER_ZERO = 0,
PIECE_NUMBER_NB = 32,
};
inline PieceNumber& operator++(PieceNumber& d) { return d = PieceNumber(int(d) + 1); } \
inline PieceNumber& operator--(PieceNumber& d) { return d = PieceNumber(int(d) - 1); }
// PieceNumber<65>̐<EFBFBD><CC90><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̌<EFBFBD><CC8C><EFBFBD><EFBFBD>Bassert<72>p<EFBFBD>B
constexpr bool is_ok(PieceNumber pn) { return pn < PIECE_NUMBER_NB; }
#endif // #ifndef TYPES_H_INCLUDED