# 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)