# Changelog

本文件记录每个版本的可见变化。格式参考 [Keep a Changelog](https://keepachangelog.com/)，
版本号遵循 [Semantic Versioning](https://semver.org/)。

开发过程中的逐轮实测记录、量过并否决的方案及其理由，见 [`docs/history.md`](docs/history.md)。

## [Unreleased]

（下一轮的改动在此累积。）

## [0.2.0] — 2026-09-30

自 `0.1.2` 起的变化。公开 API 有新增（`MipOptions::primal_rounding` 字段与
`MipOptions::without_primal_rounding()`），按语义化版本是 minor 版本。

### Added

- 分支定界的原始启发式：从松弛取整读出整数点、取整不可行时把整数固定住重解、可行性泵；三者与下潜
  共用"当前解"这一槽位，只提供当前解、永不主张最优，并计入同一份预算。
- 采样取整：按每个整数自己的小数部分无偏地随机取整，零次求解，在三个确定性方向之外多一条找点的路。
- 下潜的第二个启动理由（当前解离开界很远时也走一次）与下潜储备（跑掉一半预算仍没有整数点的运行，
  额外拿到 `max_nodes / 16` 的份额用于走法）。
- 根割轮次按收益走：`cut_rounds` 是上限，前两轮无条件，之后只有上一轮把根界抬了至少 1.4% 才再开一轮。
- `MipOptions::primal_rounding` 与 `MipOptions::without_primal_rounding()`。

### Changed

- 基准报告的上限由实测定：求解报告的枢轴上限 1200 → 20000，小规模整数报告的节点预算 20000 → 30000。
  两处上限逐字记录在报告头部与索引里——**不同上限下的计数不能互相比较**。
- 割轮的整轮重解拿到 4 倍的迭代上限：原来"重解没跑完就丢弃整轮"会让一个本可证到最优的实例白白丢掉覆盖面。

### Fixed

- 热启动的拒签没有交回冷启动。基按检验数最优、但证书写不出来时，结果是以 `NumericalFailure`
  **返回**的，而不是以 `None` 返回的，所以回退被绕过，被丢弃节点的界随之消失。现在这类结果一律交回
  冷路径（迭代上限不交）。
- 内核的自检补齐两处：**模型变量自己的界**（此前只量内核列的非负性，两者不是一件事）与 **Farkas 射线
  的三条测量**（符号按射线自己的尺度、盒吸收、边际严格为正）。任一超容差就不发证书、报数值失败，
  搜索按"没有结论的松弛"继续。
- `nodes` 不再可能超过 `max_nodes`：每个"花掉一次松弛"的地方都先问预算。
- 报告的界改取"全部开着的活"（队列里的键 ∪ 松弛没有结论、因此不再入队的那些节点的键），
  不再因为丢弃子树而偏乐观。
- 数值失败的恢复梯子从一步扩到三步：Bland 重启 → 去掉退化微扰 → 换定价规则，后两步只在"乘子符号越出
  证书约定"这一类失败上触发，结果同样过全部自检与独立校验器。

## [0.1.2] — 2026-09-25

### Fixed

- 独立校验器算错对偶间隙的下界：`box_minimum` 在检验数落进容差带时把整项丢掉，而那一项的大小由检验数
  指向的界决定（在界为 `10²~10³` 的实例上最大可以差到自身容差的 1000 倍）⇒ 旧版本可能接受一份真实对偶
  间隙超容差的最优性证书。现在只要那个方向上有有限界，就照实算。
- 内核对偶间隙自检：宣布基最优之前量残差、乘子符号与对偶间隙三件，与校验器用同一条式子与同一套尺度。
- 无结论节点的界账目：`open_bound` 改取"队列的键 ∪ 被丢下节点的键"，界不再偏乐观。

## [0.1.1] — 2026-09-22

### Changed

- CI 补上显式的 `moon build` 步骤，让"检查 / 构建 / 测试"三步在工作流里直接可见。
- `moon run cmd/main` 不再打印开发期版本号 `0.1.0-dev`。
- 发布页的包文档与 README 补全（`cmd/main` 的包描述、过期的测试数与里程碑状态）。

## [0.1.0] — 2026-09-21

首个发布版本。

### Added

- 公开入口 `solve` / `solve_with` 与 `SolveStatus` / `Solution` / `SolveOptions`。
- MPS（free / fixed）与 LP 格式的读写。
- 稀疏修正单纯形内核：稀疏 LU 基分解、有界变量枢轴、增益定价、对偶单纯形热启动，以及 presolve / postsolve。
- `verify`：最优性、Farkas 不可行、无界射线的独立校验，证书可序列化为 JSON。
- `mip`：分支定界与根割，每个节点松弛都过 `verify`。
- `cmd/parse` 的五个子命令与统一的 `--json` 输出。
- 四份基准报告与它们的索引（含报告陈旧性的机械化判定）、CI，以及发布物自包含与公开面契约的验收。
