Optimization kernels for MoonBit: MPS/LP model interop, a sparse revised simplex with presolve and a dual simplex warm start, branch and bound for models with integer variables, and independently checkable optimality, infeasibility and unboundedness certificates.
Dependencies
moon add Freon793/moonopt/// max 5x + 4y s.t. 6x + 4y <= 24, x + 2y <= 6, x, y >= 0 -> 21 at (3, 1.5)
fn demo() -> Unit {
let m = @model.Model::new(@model.Sense::Maximize)
let x = m.add_var("x")
let y = m.add_var("y")
m.set_objective([(x, 5.0), (y, 4.0)])
m.add_named_constraint([(x, 6.0), (y, 4.0)], @model.Rel::LessEqual, 24.0, "machine_hours")
m.add_named_constraint([(x, 1.0), (y, 2.0)], @model.Rel::LessEqual, 6.0, "labour_hours")
let sol = @moonopt.solve(m)
match sol.status {
@moonopt.SolveStatus::Optimal => println("objective = " + sol.objective.to_string())
_ => println("not solved: " + sol.message)
}
}moon run examples/production_plan # 两产品生产计划(最优 21 at (3, 1.5))
moon run examples/transportation # 产销平衡运输问题(全等式约束,走 Phase I;最优 11)
moon run cmd/main # 打印示例模型与一个"当前不支持"的诚实案例moon run cmd/parse -- <file.mps> # 巡检:格式、规模、校验结论
moon run cmd/parse -- solve <file.mps> --relax --presolve # 线性求解(默认走 presolve)
moon run cmd/parse -- solve <file.mps> --mip --max-nodes 2000 # 分支定界,每个松弛过 verify
moon run cmd/parse -- verify <file.mps> --relax # 求解并用独立校验器复核证书
moon run cmd/parse -- verify <file.mps> --certificate cert.json # 只校验证书,不重解
moon run cmd/parse -- fmt <file.mps> --format lp -o out.lp # 读→写
moon run cmd/parse -- bench --manifest instances.txt --mip --max-nodes 300| 支持 | 暂不支持 |
|---|---|
| min / max;≤ / ≥ / = 任意混合(含负右端项) | MPS 的 SC / SI 半连续界、完整的 SOS / MARKER 语义 |
| 任意有限上下界、自由变量 | 系数强化、对偶固定、行/列的支配检测等 presolve 归约 |
| 整数与 0-1 变量(分支定界) | 节点上的割;整数无界性的证明(松弛无界只报 NotSolved / UnboundedRelaxation) |
| 证书复核(最优性 / Farkas / 无界射线) | 化简模型的乘子回映(证书只对内核收到的模型成立,故校验路径不化简) |
| 内核行数上限 200 000(稀疏 LU,内存 O(nnz + fill)) | 非线性 / 半定规划、并行、网络单纯形专用路径、Python / JS 绑定 |
| 报告 | 口径 | 结果 |
|---|---|---|
| bench/parse-report.md | 全清单解析 | 32 个实例全部解析成功 |
| bench/solve-report.md | 32 个实例、1000 行上限、20000 枢轴上限、presolve | 20 个求到最优、11 个超行数上限跳过、1 个到枢轴上限 |
| bench/mip-report.md | 32 个实例、300 节点 | 3 个证到最优、12 个到节点预算、17 个跳过 |
| bench/mip-report-small.md | 10 个实例、30000 节点 | 5 个证到公开已知最优值、5 个到节点预算 |
powershell -NoProfile -ExecutionPolicy Bypass -File bench/fetch-instances.ps1 # 下载实例
powershell -NoProfile -ExecutionPolicy Bypass -File bench/report.ps1 # 四份报告是否仍被当前代码支持moonopt.mbt 公开入口:solve / solve_with、SolveStatus、Solution、SolveOptions
core/ 数值与稀疏基础设施(容差比较、补偿求和、CSC 稀疏矩阵)
model/ 模型层(变量、线性表达式、约束、目标、模型校验)
format/ MPS 与 LP 读写、解析错误定位
oracle/ 参考实现:稠密两阶段单纯形(差分测试的对照基准,不是交付求解器)
simplex/ 稀疏修正单纯形内核、稀疏 LU、对偶单纯形热启动、证书生产端自检
presolve/ 模型化简与解还原
verify/ 独立校验器:最优性、Farkas、无界射线、割的再推导(不依赖 simplex)
mip/ 分支定界、根割、原始启发式
cmd/main/ 演示 CLI cmd/parse/ 模型巡检与求解 CLI
examples/ 可运行示例 bench/ 数据政策、下载与报告脚本、报告
docs/ 设计、算法、API 契约、路线图、生态调研、验收对照| 文件 | 内容 |
|---|---|
| docs/design.md | 架构:目标与非目标、包边界与依赖规则、数据表示、证书约定 |
| docs/algorithms.md | 实现里真正在跑的算法,每节附一条可复核的实测数字 |
| docs/api.md | 公开 API 契约:每个包承诺什么、什么情况下返回哪个状态 |
| docs/roadmap.md | 里程碑与完成标准、下一步方向、明确不做的事 |
| docs/prior-art.md | 生态调研:生态内有无同类实现、可借鉴的公开标准、许可证红线 |
| bench/README.md | 基准数据政策、实例量级、四份报告的复现步骤与口径 |
| CONTRIBUTING.md | 本地环境、提交前必须全绿的检查、代码规范 |
| CHANGELOG.md | 逐版变化 |
| docs/history.md | 开发过程中的实测记录(归档,含被否决的方案与理由) |
moon check --deny-warn
moon test --deny-warn
moon fmt && git diff --exit-code
moon info && git diff --exit-code # .mbti 是接口合同,必须随代码提交pub struct Solution {
status : SolveStatus
values : Array[Double]
objective : Double
iterations : Int
nodes : Int
bound : Double
gap : Double
message : String
} derive(Debug)pub(all) struct SolveOptions {
max_iterations : Int
presolve : Bool
max_nodes : Int
cut_rounds : Int
} derive(Debug)Install
Download zipOptimization kernels for MoonBit: MPS/LP model interop, a sparse revised simplex with presolve and a dual simplex warm start, branch and bound for models with integer variables, and independently checkable optimality, infeasibility and unboundedness certificates.
Dependencies