mirror of
https://github.com/HChaZZY/Stockfish.git
synced 2025-12-22 01:56:58 +08:00
Fixed compile errors.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -55,6 +55,8 @@ bool ReadParameters(std::istream& stream);
|
||||
// 評価関数パラメータを書き込む
|
||||
bool WriteParameters(std::ostream& stream);
|
||||
|
||||
Value evaluate(const Position& pos);
|
||||
|
||||
} // namespace NNUE
|
||||
|
||||
} // namespace Eval
|
||||
|
||||
@@ -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]) {
|
||||
|
||||
@@ -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であるインデックスのリストを取得する
|
||||
|
||||
@@ -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;
|
||||
// 差分計算の代わりに全計算を行うタイミング
|
||||
|
||||
@@ -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であるインデックスのリストを取得する
|
||||
|
||||
@@ -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;
|
||||
// 玉を中央に置いた仮想的な盤の高さ
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
// 差分計算の代わりに全計算を行うタイミング
|
||||
|
||||
@@ -3,8 +3,6 @@
|
||||
#ifndef _NNUE_ACCUMULATOR_H_
|
||||
#define _NNUE_ACCUMULATOR_H_
|
||||
|
||||
#include "../../config.h"
|
||||
|
||||
#if defined(EVAL_NNUE)
|
||||
|
||||
#include "nnue_architecture.h"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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*>(
|
||||
|
||||
@@ -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
|
||||
|
||||
175
src/evaluate.h
175
src/evaluate.h
@@ -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
|
||||
|
||||
16
src/misc.cpp
16
src/misc.cpp
@@ -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;
|
||||
}
|
||||
|
||||
66
src/misc.h
66
src/misc.h
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
39
src/types.h
39
src/types.h
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user