cshogi との API 対応表
rsshogi と cshogi の API 対応をまとめたリファレンスです。
実装状況
| カテゴリ | 状況 | 主な API |
|---|---|---|
| 盤面管理 | ✅ | Board |
| 合法手生成 | ✅ | legal_moves, pseudo_legal_moves |
| 状態判定 | ✅ | is_in_check, is_mated, is_repetition, can_declare_win |
| SFEN/USI | ✅ | to_sfen, set_sfen, apply_usi |
| PackedSfen | ✅ | to_packed_sfen(out=None), set_packed_sfen |
| HCP / HCPE | ✅ | to_hcp, set_hcp, to_hcpe, AperyMove, AperyMove32 |
| 局面キー | ✅ | zobrist_hash |
| Move32 復元 | ✅ | move32_from_move, move_from_csa |
| policy ラベル変換 | ✅ | rsshogi.policy, rsshogi::labels::policy |
| 棋譜 I/O | ✅ | from_kif_str, from_ki2_str, from_csa_str, from_csa_games_str, to_kif, to_ki2, to_csa |
| USI 文字列解析 | ✅ | rsshogi.usi(info / bestmove の値オブジェクト変換) |
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)
AperyMove は cshogi.move16(...) と同じ 16bit 形式です。
AperyMove32 は Apery 系 32bit move に対応しますが、rsshogi.Move32 とは保持情報が異なります。
policy ラベル
cshogi/dlshogi 系でよく使われる 27x81 の policy ラベルは、
Python では rsshogi.policy、Rust では labels::policy で提供しています。
| 用途 | cshogi 系 | rsshogi |
|---|---|---|
| 2187 クラスの move label | make_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) |
MoveLabel は class * 81 + to_sq の 2187 クラスです。
後手番の手は 180 度回転してからラベル化するため、常に先手視点で比較できます。
CompactMoveLabel は、移動、成り、駒打ちの構造的な制約から使用可能な 1496 クラスに連番を割り当てたラベルです。
現在局面の駒配置や王手は参照しないため、そのラベルに対応する手が局面上で合法であることまでは保証しません。
Python では Move, Move32, int, USI 文字列をそのまま move 引数に渡せます。
指し手エンコーディング
rsshogi と cshogi は異なる指し手エンコーディングを採用しています。
AperyMove / AperyMove32 は、Apery 形式の整数値を受け渡すための型です。
Move / Move32 との変換は指し手の意味を保ちますが、ビットレイアウトが異なるため整数値は一般に変わります。
通常の手生成や盤面操作では Move / Move32 を使い、外部データとの境界でのみ
AperyMove 系を使うのを推奨します。
| 項目 | rsshogi の Move / Move32 | Apery 形式 |
|---|---|---|
| 駒打ち判定 | bit 14 フラグ | from >= 81 |
| 成りフラグ位置 | bit 15 | bit 14 |
| 駒情報 | 移動後の Piece (5bit) | PieceType (4bit) × 2 |
AperyMove32 -> Move32 が局面依存な理由
cshogi の内部 32bit move は pieceTypeFrom と capturedPieceType を保持します。
一方、rsshogi.Move32 は「移動後の色付き駒 (Piece)」を保持します。
そのため AperyMove32 から Move32 を復元するには、
- 現在の手番
- 移動元の盤上駒
が必要です。rsshogi ではこれを AperyMove32.to_move32(board) として公開しています。
指し手型の命名
rsshogi と cshogi/参照実装では型名が異なります。
| サイズ | rsshogi | YaneuraOu | cshogi |
|---|---|---|---|
| 16bit | Move | Move16 | Move16 |
| 32bit | Move32 | Move | Move |
rsshogi は 16bit 指し手を基本型と位置付け Move と命名しています。
YaneuraOu/cshogi では 32bit が Move で、16bit が Move16 です。
通常手の rsshogi Move と Apery 形式の Move16 は、成りや駒打ちのビット配置が異なります。
相互変換には Move.to_apery() / AperyMove.to_move() を使ってください。
整数をそのまま別の型の raw 値として扱うと、指し手の意味が変わります。
rsshogi.usi(USI 文字列パーサ)
rsshogi.usi モジュールは USI プロトコルの info と bestmove を値オブジェクトへ変換します。
| クラス / 関数 | 説明 |
|---|---|
UsiInfo / parse_info(line) | info depth ... score ... 行のパース |
UsiBestMove / parse_bestmove(line) | bestmove ... ponder ... 行のパース |
UsiScore | cp / mate 距離のラッパー |
UsiBound | lowerbound / upperbound / exact |
UsiGoCommand | go コマンドのシリアライズ |
move_from_usi(usi) | resign / win / 0000 / none を含む USI 指し手変換 |
詳細は rsshogi.usi を参照してください。