220122

220122

Bitboardは平日に読んだとしてPositionを読む

postion.hpp

定義されているstructやclass

  • CheckInfo
  • StateInfo
  • BitStream
  • HuffmanCode
  • HuffmanCodeToPieceHash
  • HUffmanCodedPos
  • HuffmanCodedPosAndEval
  • PackedSfen
  • PackedSfenValue
  • Position
  • CharToPieceUSI

Postionでかすぎる. 正直本当に読みすすめるのが苦しい.理由は簡単で詳細が不明なものがいくつも並んでいて処理できないから. まず量に圧倒されているし,そしてその内容もそれぞれ難解.何十年と作り上げられたソフトなのだからそれはそうなのかもしれないが. 苦しんでばかりいられないので消化できるところは消化していきたい. ざっくりと受けた印象では,ここまででてきたものに複雑な処理はしているというよりはかんたんな処理をしてメンバを返すみたいな関数ではないかと思っている.

量に圧倒されているからメソッドを書き出してみる

  • set * 3
  • set_hcp
  • set_psfen
  • bbof * 9
  • occupiedBB
  • emptyBB
  • goldsBB
  • piece
  • hand
  • pinnedBB
  • noPawns
  • isPinnedIllegal
  • isDiscoverdCheck
  • checkersBB
  • prevCheckersBB
  • isCheck
  • moveGivesCheck * 2
  • movedPiece
  • attackersTo * 3
  • attackersToExceptKing
  • attackersToIsAny * 2
  • unDropCheckIsSupported
  • attacksFrom * 6
  • attacksSlider * 2
  • attacksAroundKingNonSlider
  • attacksAroundKingSlider
  • attacksAroundKingNonSiderIsAvoiding
  • attacksAroundKingInAvoiding
  • canPawnDrop
  • pinnedPieces
  • turn
  • pseudoLegalMoveIsLegal
  • pseudoLegalMoveIsEvasion
  • moveIsPseudoLegal
  • moveIsLegal
  • doMove * 2
  • undoMove
  • mateMoveIn1Ply * 2
  • gamePly
  • getBoardKey
  • getHandKey
  • getKey
  • getKeyExcludeTurn
  • print
  • toSFEN * 2
  • toCSAPos
  • toHuffmanCodedPos
  • toPackedSfen
  • isDraw
  • setStartPosPly
  • isOk
  • initZobrist

private:

  • clear
  • setPiece
  • setHand * 2
  • findCheckers
  • xorBBs
  • computeBoardKey
  • computeHandKey
  • computeKey
  • printHand
  • zobrist
  • zobTurn
  • zobHand

90近いメソッドがあることがわかった.これは一読で処理できるわけない. ボトムアップでは処理しきれない印象. トップダウン的にどう使われるかの観点から見ていく事も考えないといけない. というか理解できないコードの処理を読めばいいわけで,全部が全部を読む必要はそもそもないと思う.決して自分を慰めているわけではない.極めて冷静な状況分析である.

Positionが終わっても関数ラッシュ.これは外に定義されているだけでメソッドのようだ.テンプレートを使うために外に出している模様.これらを合わせると100以上あることになる.おかしい.

  • attacksFrom< Lance>
  • attacksFrom< Bishop>
  • attacksFrom< Rook>
  • attacksFrom< Horse>
  • attacksFrom< Dragon>
  • attacksFrom< Pawn>
  • attacksFrom< Lance>
  • attacksFrom< Knight>
  • attacksFrom< Silver>
  • attacksFrom< Bishop>
  • attacksFrom< Rook>
  • attacksFrom< King>
  • attacksFrom< Horse>
  • attacksFrom< Dragon>

いったんここらでcshogi.hppに戻るというのはどうだろうか. 少しposition.cppを見てみたが4000行近い.逐一見ている頃には春になっている.

コード読むばかりでは理解が深まらない気がするので,来週あたりから書きながら読むフェーズに入ってもいいかもしれない.

cshogi.hpp

class __Board

Postionをメンバにもっていて,基本的にはそのメソッドを呼び出している.だからPositionを無理に読もうとするよりもこちらから呼び出されているメソッドから読んでいくと読みやすいかもしれない. 実際問題bookから呼び出されているようなものもあるだろうし.

  • set
  • set_position
  • set_hcp
  • set_psfen
  • reset
  • dump
  • push
  • pop
  • peek
  • is_game_over
  • isDraw
  • move
  • drop_move
  • move_from_usi
  • move_from_csa
  • move_from_move16
  • move_from_psv
  • turn
  • ply
  • toSFEN
  • toCSAPos
  • toHuffmanCodedPos
  • toPackedSfen
  • piece
  • inCheck
  • mateMove
  • is_mate
  • getKey()
  • moveIsPseudoLegal
  • moveIsLegal
  • pieces_in_hand
  • pieces
  • pices_planes
  • pices_planes_rotate
  • bookKey
  • bbToVector

読んでみた感想としてはもう書いていいんじゃないかなって思う. 一応move系が残っているがまぁ大したことないんじゃないかなと思っている. 有効手の生成は大変な気もするけど.