Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

cshogi との API 対応表

rsshogi と cshogi の API 対応をまとめたリファレンスです。

実装状況

カテゴリ状況主な API
盤面管理Board
合法手生成legal_moves, pseudo_legal_moves
状態判定is_in_check, is_mated, is_repetition, can_declare_win
SFEN/USIto_sfen, set_sfen, apply_usi
PackedSfento_packed_sfen(out=None), set_packed_sfen
HCP / HCPEto_hcp, set_hcp, to_hcpe, AperyMove, AperyMove32
局面キーzobrist_hash
Move32 復元move32_from_move, move_from_csa
policy ラベル変換rsshogi.policy, rsshogi::labels::policy
棋譜 I/Ofrom_kif_str, from_ki2_str, from_csa_str, to_kif, to_ki2, to_csa
USI エンジン連携⚠️rsshogi.usi(USI 文字列の値オブジェクト変換のみ。エンジンプロセス制御は対象外)

API 差分(主要)

メソッド設計

# cshogi
board.turn          # property
board.legal_moves   # property-like iterable

# rsshogi
board.turn          # property
board.legal_moves() # method

手番型

board.turn  # Color

手番は Color に統一されています。

push/pop 系

# rsshogi
board.push_move(move)      # Move を受け取り Move32 を返す
board.push_usi("7g7f")     # USI 文字列を受け取り Move32 を返す
board.pop()                # 最後の手を取り消して Move32 を返す(履歴なければ None)
board.last_move()          # 最後の手を Move32 で返す(なければ None)

指し手の操作

# Move32 のメソッド例
mv32 = board.push_move(move)   # push_move は Move32 を返す
to_sq = mv32.to_sq
from_sq = mv32.from_sq
is_drop = mv32.is_drop()
is_promo = mv32.is_promotion()

cshogi / Apery 互換 API

amv = move.to_apery()
mv = amv.to_move()

amv32 = board.apery_move32_from_move(move)
amv32 = move32.to_apery(board)
move32 = amv32.to_move32(board)

AperyMovecshogi.move16(...) と同じ 16bit 形式です。 AperyMove32 は Apery 系 32bit move に対応しますが、rsshogi.Move32 とは保持情報が異なります。

policy ラベル

cshogi/dlshogi 系でよく使われる 27x81 の policy ラベルは、 Python では rsshogi.policy、Rust では labels::policy で提供しています。

用途cshogi 系rsshogi
2187 クラスの move labelmake_move_label(...) 相当rsshogi.policy.move_label(mv, turn)
1496 クラスへの圧縮ライブラリごとに別実装rsshogi.policy.compact_move_label(mv, turn)
2187 → 1496 変換-rsshogi.policy.move_label_to_compact(label)
1496 → 2187 変換-rsshogi.policy.compact_move_label_to_move_label(label)

MoveLabelclass * 81 + to_sq の 2187 クラスです。 後手番の手は 180 度回転してからラベル化するため、常に先手視点で比較できます。

CompactMoveLabel は「局面で合法」ではありません。 空盤での移動・成り・駒打ち制約から見て、構造的に現れうる 1496 クラスだけを残した gapless なラベルです。

Python では Move, Move32, int, USI 文字列をそのまま move 引数に渡せます。

指し手エンコーディング

rsshogi と cshogi は異なる指し手エンコーディングを採用しています。 rsshogi では AperyMove / AperyMove32 を追加し、整数値を保ったまま相互変換できます。 通常の手生成や盤面操作では Move / Move32 を使い、外部データとの境界でのみ AperyMove 系を使うのを推奨します。

項目rsshogi (互換)cshogi (Apery 型)
駒打ち判定bit 14 フラグfrom >= 81
成りフラグ位置bit 15bit 14
駒情報移動後の Piece (5bit)PieceType (4bit) × 2

AperyMove32 -> Move32 が局面依存な理由

cshogi の内部 32bit move は pieceTypeFromcapturedPieceType を保持します。 一方、rsshogi.Move32 は「移動後の色付き駒 (Piece)」を保持します。

そのため AperyMove32 から Move32 を復元するには、

  • 現在の手番
  • 移動元の盤上駒

が必要です。rsshogi ではこれを AperyMove32.to_move32(board) として公開しています。

指し手型の命名

rsshogi と cshogi/参照実装では型名が異なります。

サイズrsshogiYaneuraOucshogi
16bitMoveMove16Move16
32bitMove32MoveMove

rsshogi は 16bit 指し手を基本型と位置付け Move と命名しています。 YaneuraOu/cshogi では 32bit が Move で、16bit が Move16 です。

重要: rsshogi の Move は 参照実装の Move16 と同一のビットレイアウトですが、 cshogi (Apery 系) の Move16 とはビットレイアウトが異なります。 整数値を保持した変換が必要な場合は Move.to_apery() / AperyMove.to_move() を使ってください。

rsshogi.usi(USI 文字列パーサ)

rsshogi.usi モジュールは USI プロトコルの値オブジェクト変換を提供します。 エンジンプロセスの起動・通信は対象外です。

クラス / 関数説明
UsiInfo / parse_info(line)info depth ... score ... 行のパース
UsiBestMove / parse_bestmove(line)bestmove ... ponder ... 行のパース
UsiScorecp / mate 距離のラッパー
UsiBoundlowerbound / upperbound / exact
UsiGoCommandgo コマンドのシリアライズ
move_from_usi(usi)resign / win / 0000 / none を含む USI 指し手変換

詳細は rsshogi.usi を参照してください。