1.7.2 の変更内容
1.7.2 は後方互換な Rust API の追加と内部改善を含む。
公開日は 2026-10-31。
以下の API は book feature で有効になる。
Python の公開 API と YBB の保存形式は変更しない。
YBB の差分保存
YbbBook::write_ybb_with_patch と write_ybb_with_patch_with_control は、DB2016 と SBK と共通の BookDatabasePatch を使う。
元ファイルを全件ロードせず、PackedSfen のバイト順で差分を整列マージし、別の空の出力先へ全体を書き直す。
出力先には Write + Seek が必要である。
差分の識別単位は手数を除いた局面であり、同じキーへの最後の編集を採用する。
元データはキーの厳密な昇順と一意性を要求し、手数違いを含む重複があれば空差分でも保存を拒否する。
出力前に全元行の構造、範囲、候補手の符号化とキー順を検査する。 削除または置換される元行も検査する。 元行のキーはバイト列として扱い、局面復元、正準性や合法手の全件検査は行わない。 追加または変更する行は局面、候補手の一意性、合法性と表現可能性を検査し、明示的な手数と評価値を要求する。 元ファイルの depth 有無、未変更行の手数、評価値と候補手順を保持し、表現不能な情報の破棄や値の補完は行わない。
制御付き版は Validating と Writing を通知する。
処理数と総数は元行数を表し、段階切替で処理数を 0 に戻す。
追加差分の処理中には元行処理数が変わらないため、出力件数や全体の完了率には使わない。
キャンセルは協調的であり、単一行の処理やソートの途中での即時中断は保証しない。
保存失敗とキャンセル
元ファイルと出力先には別の保存領域を使い、処理完了まで元ファイルを変更しない。
事前検査と Writing 開始通知までの失敗やキャンセルでは、出力への write、seek と flush を行わない。
書き込み開始後の失敗やキャンセルでは部分出力が残り得る。
reader と差分は変更されないため、新しい空の出力先で再試行できる。
成功は flush の完了を意味し、永続化や元ファイルの置換までを保証しない。
呼び出し側で一時ファイルを作成し、成功後に必要な同期と置換を行う。
この責務分担は DB2016 と SBK の差分保存と同じである。
Native .book の editor は元ファイルへの追記と同期を担当し、保存結果が不確かな場合は SaveUncertain と再オープンを要求する別の契約を持つ。
省メモリ writer と明示的な診断
YbbWriter は全索引を保持せず、上限付きの索引ブロックと候補手ブロックを seek しながら出力する。
file-backed reader と差分による保存の追加メモリは、差分、最大行と固定バッファに比例し、全局面数には比例しない。
BookDatabase::write_ybb では所有 IR、Memory reader では元ファイルの保持領域が別途必要となる。
既存の保存形式と重複行の出力順は維持する。
同一 PackedSfen の全行取得と、進捗通知とキャンセルに対応する diagnose_full を追加する。
通常の open と lookup に重複検出のための全走査は追加しない。
重複や手数違いを確認する場合に、利用側が明示的に全件診断を実行する。
診断や低水準 writer の重複行対応は、差分保存の一意キー要件を緩和しない。