# BonaPiece

BonaPiece は、Bonanza 系やそれに互換性を持つ評価関数で使われる駒番号体系である。
駒や持ち駒や升上の状態を一意な番号へ写像し、特徴量配列の添字として使う。

## 概要

Bonanza 系評価関数では、
大量の特徴量配列を高速に引くために、
局面中の駒を規則的な整数へ変換して扱う。

このときの番号体系が BonaPiece であり、

- [三駒関係](/shogi/shogiwiki/search/three-piece-relationship/)
- KPP / KPPT
- 差分更新

の土台になる。

## なぜ必要か

評価関数の特徴量は、局面中の駒をそのままキーに使うより、
連番化した方が配列アクセスしやすい。

BonaPiece を導入すると、

- 特徴量テーブルの添字計算がしやすい
- 学習器と探索器で同じ表現を共有しやすい
- 互換評価関数を扱いやすい

という利点がある。

## 実装例

説明用の最小例では、駒と位置から番号を作る。

```cpp
int makeBonaPiece(Piece piece, Square sq) {
    return pieceToBaseIndex(piece) + static_cast<int>(sq);
}
```

実際には、

- 盤上駒
- 持ち駒
- 先後
- 成り

を含めた設計が必要になる。

## 将棋AIでの位置づけ

BonaPiece は一般読者向けには地味に見えるが、
Bonanza 系や elmo 系の評価関数を読むときには非常に重要である。

[NNUE](/shogi/shogiwiki/search/nnue/)時代になっても、
手作り特徴量時代の設計を理解する入口として価値がある。

## 関連項目

- [評価関数](/shogi/shogiwiki/search/evaluation-function/)
- [Bonanza](/shogi/shogiwiki/search/bonanza/)
- [三駒関係](/shogi/shogiwiki/search/three-piece-relationship/)
- [elmo式学習](/shogi/shogiwiki/search/elmo-style-learning/)

## 参考にしたホームページ

- [やねうら王公式サイト: MAKE Evaluate Function](https://yaneuraou.yaneu.com/2020/11/17/make-evaluate-function/)
- [やねうら王公式サイト: MAKE Evaluate Function 11](https://yaneuraou.yaneu.com/2020/12/07/make-evaluate-function-11/)
- [Chessprogramming Wiki: Bonanza](https://www.chessprogramming.org/Bonanza)