220115

220115

cshogiとdlshogiのどちらを読むかというかと考え直した.ソースをざっと見た感じdlshogiはcshogiと大半は同じなように見えた.cshogiではpythonで実装していた部分がc++になっていそうなところもあり追加や更新があるように見える.とはいえほとんど同じソースでありそうなのでひとまずはcshogiの方を読んでいけばあとからdlshogiを読んでも無駄にはならないだろう,むしろ少ないソースのほうが読みやすくてよいだろうという判断からcshogiを読むことにした.

本日は自宅で作業をする.図書館に行く手もあるが手間だし,なるべく家で開発できる様になりたい.PCを自作するとどうしてもハードに引っ張られて家にこもらないといけなくなることになると予想している.仕事と同じ空間ではやりたくないので,またコロナが蔓延してもなるべく出社をしていきたいと思う.

今日の作業はcshogiのソースツリーの末端ノードから読んでいくこと.狙いは下記あたりを想定している. - overloadEnumOperator.hpp - ifdef.hpp - common.hpp - color.hpp - piece.hpp - hand.hpp - square.hpp

これらが終わると,bitoboard.hppを読むことができ,そしてそれが終わればmove.hpp,そしてgenerateMovesに進むことができる.このあたりが本丸なので今日はその前哨戦といったところだろうか.

overloadEnumOperator.hpp

C++enumクラスに加減乗除等の基本的な演算子オーバーロードして実装している.このマクロのおかげでPieceとかのenumに演算を実行することが可能になる.

ifdef.hpp

SIMD命令が使用可能か等をマクロ定義済みかで確認して,使うかどうかのマクロ定数を定義している.

  • 表関数のSIMD
  • 稲庭判定を有効にするか
  • 角の打ち場所の限定をするか
  • 入玉を24点法にする など設定をするために使われている模様.

common.hpp

とりあえず定義されているものを列挙しておく 正直どう使っているかわからないと内容を理解するのが難しい.というよりも理解する必要性に乏しい.

  • u32.. bit幅用の型の定義
  • Binary<> Binary標記to数値変換
  • firstOneFromLSB
  • lsb
  • firstOneFromMSB
  • msb これはLSBとかMSBを求めるための関数
  • count1s(popcount)
  • putb バイナリ表示
  • enum SyncCout
  • struct Unroller<>
  • prefetch
  • struct HashTable
  • class Timer
  • struct Mutex
  • struct TriangularArray

color.hpp

先手後手がそれぞれ黒と白としてenumで定義されている

piece.hpp

基本的にenumで駒を定義しているのと,関連の変換関数が定義されている. - enum PieceType - enum Pice - enum HandPiece - inverse(Piece) - pieceToColor - colorAndPieceTypeToPice - isSlider - pieceTypeToHandPiece - handPieceToPieceType - colorAndHandPieceToPiece

hand.hpp

初期化子について思い出した.ありがたい. これは持ち駒の管理をするHandクラスを定義している.Handクラスには持ち駒の数をPieceTypeごとに教えてくれたり,ある駒の持ち駒があるか教えてくれる関数があったりする.あとは駒の増減とか. - numoF - exists - exceptPawnExists - plusOne - minusOne - isEqualOrSuperior

square.hpp

盤上のマスの定義が行われている.主に下記の列挙子の定義が行われている.

  • Square
  • File
  • Rank
  • SquareDelta
  • Direction
  • SquareWithWall
  • Directions

Squareは盤上のマスそれぞれに数値を与えている. SquareWithWallはSquareに加え,そのマスから番外までの距離を含めた情報を保持するように設計されている. このソースだけ読んでも内容はわかるが,おそらくその設計の真価を判断するのには駒の利きを判断する合法手生成のソースであろう.

ということで今日の分は一通り読んだ.次回はbitboard.hppから初めていこうと思う. どのタイミングで実装を始めるかは悩みどころ.まだ定義部分でしかないので,これから本格的な部分に足を踏み入れていくのでそのときに判断かなとは思っている.今の部分だけ書き写しても意味というか意義が特にない.