
Convex.jl开发者指南用Problem Depot测试与基准你的优化问题【免费下载链接】Convex.jlA Julia package for disciplined convex programming项目地址: https://gitcode.com/gh_mirrors/co/Convex.jl如果你正在开发 Julia 凸优化求解器或需要验证 Convex.jl 的表达与求解能力Problem Depot就是你最趁手的内置武器一个预置 130 余个凸优化问题的标准问题库让你用几行代码即可完成测试testing与性能基准benchmarking无需自己从零构造测试用例。 什么是 Problem DepotProblem Depot 是 Convex.jl 的一个子模块核心代码位于 src/problem_depot/problem_depot.jl。它维护了一个全局问题注册表PROBLEMS把一个个问题工厂函数按类别归档。每个问题本质上是一个函数标准签名为f(handle_problem!, ::Val{test}, atol, rtol, ::Type{T})handle_problem!拿到Problem实例后做什么例如用指定求解器solve!test是否启用断言测试基准测试时可跳过atol/rtol绝对/相对容差T数值类型如Float64、BigFloat内置问题分类一览问题按求解器能力分类存放于 src/problem_depot/problems/ 目录共 133 个分类文件问题数典型覆盖仿射affine.jl23点乘、拼接、对角化等仿射原子常数constant.jl6常数与复数常量处理指数/熵exp.jl7exp、log、熵、相对熵线性规划lp.jl13无穷范数、maximum、minimum混合整数mip.jl3整数变量、IntVar半定规划sdp.jl63lambda_min、log_det、sum_largest_eigsSDP指数sdp_and_exp.jl1root_det等复合约束二阶锥规划socp.jl17范数、二次型、quad_over_lin这种按原子/求解器类型命名的规范如affine_negate_atom、mip_integer_variables正是后续exclude正则过滤的基础。 最快上手用 run_tests 测试你的求解器run_tests是问题库的测试入口它会遍历所有问题把每个Problem交给你提供的处理函数并自动包裹在testset中。以 SCS 求解器为例排除它无法处理的混合整数问题MIPusing Convex, SCS, Test const MOI Convex.MOI Convex.ProblemDepot.run_tests(; exclude [rmip]) do p solve!(p, MOI.OptimizerWithAttributes(SCS.Optimizer, verbose 0)) end几个实用参数详见 run_tests 文档exclude [rmip, rsdp]用正则按类别或名称排除问题求解器不支持 SDP 时非常有用problems [rsocp]反向过滤只运行匹配的问题Convex.jl 的 CI 就是这样只用 GLPK 测 MIP 子集atol/rtol调整容差默认atol 1e-3所有benchmark类问题会在测试时自动跳过避免无断言问题干扰结果官方测试 test/test_problem_depot.jl 给出了完整范例用 Clarabel 跑全部非 MIP 问题、用 GLPK 跑 MIP 子集并额外验证了求解后打印show不报错——这是一个很容易被忽略的回归测试点。⏱️ 性能基准用 benchmark_suite 量化求解耗时测正确性之后下一个问题是快不快。benchmark_suite基于 BenchmarkTools把注册表中的每个问题包装成BenchmarkGroupusing Convex, SCS, BenchmarkTools SUITE Convex.ProblemDepot.benchmark_suite(; exclude [rmip]) do p solve!(p, SCS.Optimizer; silent true) end benchmark_suite SUITE生成的SUITE是按分类 → 问题名两级分组的基准树可以直接交给 PkgBenchmark 做跨版本、跨提交的性能回归追踪——项目自带的基准入口 benchmark/benchmarks.jl 就是挑选了 15 个建模开销代表性问题如socp_norm_2_atom、sdp_log_det_atom、mip_integer_variables配合 MockOptimizer 测量纯建模formulation耗时从而把求解器因素剥离出去。 小技巧benchmark_suite支持test Val(true)基准的同时顺带校验答案适合做性能正确性双重守门。 进阶如何注册自己的问题add_problem想给问题库添砖加瓦只需两步写函数、加宏。以一个最简单的仿射问题为例add_problem affine function affine_negate_atom( handle_problem!, ::Val{test}, atol, rtol, ::Type{T} ) where {T, test} x Variable() p minimize(-x, [x 0]) if test test vexity(p) AffineVexity() end handle_problem!(p) if test test p.optval ≈ 0 atol atol rtol rtol end endadd_problem宏定义于 problem_depot.jl会把函数自动写入PROBLEMS注册表命名规范是关键前缀即分类affine、sdp、mip……决定该问题归属哪个类别函数名即描述写清楚考察的原子如negate_atom这样exclude [rnegate]可以精准排除断言必须门控在if test之后因为handle_problem!不保证求解未求解时evaluate(x)返回nothing直接real(evaluate(x))会抛错——把取值和断言都放进if test块是标准写法纯基准问题命名中包含benchmark如sdp_constraintrun_tests会自动跳过它完整的写法规范与更多细节参见官方开发者文档 docs/src/developer/problem_depot.md。✅ 选型与避坑清单求解器能力不匹配优先用exclude正则过滤而不是删除问题——问题库是全社区共享的资产容差敏感问题量子相对熵类问题如sdp_quantum_relative_entropy3_lowrank在大矩阵下数值不稳定CI 中即被显式排除遇到类似 flaky 测试可参考 test_problem_depot.jl 的处理方式想遍历问题而不求解还有底层 APIforeach_problem(apply, class, problems; exclude...)可用于静态检查、问题统计等场景BigFloat 实验T BigFloat可切换底层模型类型但高维线性代数性能较差CI 中默认注释禁用 写在最后Problem Depot 的价值在于标准化它让这个求解器能解 Convex.jl 生成的什么问题从一句空话变成一组可复现的testset和一张可对比的基准曲线。无论你是要验证新求解器、追踪建模性能回归还是为问题库贡献新场景133 个分类清晰的问题和run_tests/benchmark_suite两个入口都已为你铺好了路——打开 src/problem_depot/跑起来就是最快的学习方式。【免费下载链接】Convex.jlA Julia package for disciplined convex programming项目地址: https://gitcode.com/gh_mirrors/co/Convex.jl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考