Gecode 6.3.0 和 6.4.0 已发布

Lobsters Hottest 工具

摘要

经过长时间停更后,Gecode 6.3.0 和 6.4.0 现已发布,带来了现代化的构建系统(CMake)以及更新后的 MiniZinc 集成。

<p><a href="https://lobste.rs/s/u6hawc/gecode_6_3_0_6_4_0_are_released">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/07/16 09:55

# Gecode 6.3.0 和 6.4.0 发布 - zayenz.se 来源:https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/ Gecode 标志在漫长的停顿之后,推出了两个新的 Gecode 版本。Gecode 6.3.0 (https://github.com/Gecode/gecode/releases/tag/release-6.3.0) 日期为 2026 年 7 月 7 日,而 Gecode 6.4.0 (https://github.com/Gecode/gecode/releases/tag/release-6.4.0) 于 2026 年 7 月 15 日发布。 这两个版本扮演着不同的角色。6.3.0 版本记录了自 Gecode 6.2.0 以来七年中在其发布分支上累积的更改。6.4.0 版本也是一个新的起点。从现在起,开发将在 `main` 分支上进行,CMake 是预期的构建系统,并且版本将仅提供源代码。 如果你正在开始一个新项目或升级现有项目,6.4.0 是应使用的版本。本文的其余部分按更改对用户和开发者的意义进行分组,而不是逐次提交地叙述历史。 ## 构建和使用 Gecode 更符合常规 Gecode 6.4.0 最显著的变化是构建和安装流程。CMake 之前就已可用,但现在它正确地支持原生构建,并且是构建 Gecode 的预期方式。一个正常的源代码构建如下所示: `` cmake -S . -B build -DCMAKE_BUILD_TYPE=Release cmake --build build --parallel cmake --build build --target check cmake --install build --prefix /path/to/install `` 安装步骤会创建一个 CMake 包。因此,一个独立的 CMake 项目可以消费 Gecode,而无需维护自己的 `FindGecode.cmake` 文件或手动组装包含路径和库: `` find_package(Gecode CONFIG REQUIRED) add_executable(my-model main.cpp) target_link_libraries(my-model PRIVATE Gecode::gecode) `` 聚合目标 `Gecode::gecode` 是简单的默认设置。希望声明更窄依赖关系的项目可以请求并链接单个组件,例如 `driver`、`flatzinc` 或 `gist`。该包还导出了 `Gecode_VERSION`,因此下游版本检查不再需要检查生成的标头。 新包带有传递依赖关系,并记录了构建了哪些可选组件。这对于涉及 MPFR、Qt 或 Gist 的安装尤其有用。现在首选 Qt 6,同时仍然支持 Qt 5.15 及更高版本。 最低 CMake 版本为 3.21,当前构建需要支持 C++17 的编译器。Autotools 构建在 6.4.0 中仍然受支持,但计划在后续版本中移除。维护生成器也已从 Perl 迁移到通过 `uv` 运行的 Python 脚本,这使得维护环境更易于重现。普通的 CMake 构建使用源代码版本中包含的生成文件,不需要运行这些脚本。 ## MiniZinc 和 FlatZinc 已迎头赶上 Gecode 6.3.0 的大部分内容将其 MiniZinc 集成更新到最新状态。累积的更改包括: - 支持标准约束 `sliding_among` 和 `regular_set`; - 完整的 `cumulatives` 调度约束,包括 `cumulative` 和 `disjunctive` 的可选活动; - 安装到 MiniZinc 预期位置的求解器配置和库文件; - 值、域和边界传播注解; - 更好的 FlatZinc 错误信息,包括可用的 MiniZinc 约束名称;以及 - 用于表达基于重启的元搜索的实验性 `on_restart` 接口。1 (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fn-on-restart) 有几个修复单独看很小,但合在一起很重要。数组参数正确地对诸如 `inverse`、除法、模、`arg_min`、`arg_max` 和表等约束取消共享。Element 约束可以保留索引偏移量,而不是引入转换后的数组。零持续时间任务、空集、整数幂和布尔表现在遵循其预期的 MiniZinc 语义。 Gecode 6.4.0 添加了对实验性 MiniZinc 黑盒传播器接口的支持。2 (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fn-black-box) 一个 FlatZinc 模型可以连接一个在共享库或持久子进程中实现的定制值或边界传播器。该传播器返回其结果以及决定何时必须再次运行的依赖关系。这是一个有趣的中间地带:一个模型可以使用专门的传播,而无需先向求解器本身添加原生传播器。 黑盒接口是实验性的,因此应将其视为探索场所,而不是冻结的长期 API。尽管如此,它为从 MiniZinc 测试传播器想法开辟了一条有用的途径。 ## 新的传播选择 Gecode 6.4.0 为外延整数约束添加了可选择的支持表示。3 (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fn-tuple-set-sparse) 一个 `TupleSet` 可以使用密集、稀疏或压缩密集支持,或者让 Gecode 自动选择。然后,相应的表传播器会使用所选表示。FlatZinc 表和实例化较大元组集的示例使用自动选择。 用于表约束的元组集可以具有非常不同的形状。对于小型密集表效果良好的表示不一定适用于大型稀疏表。在提供自动模式的同时明确做出这一选择,为库用户和 FlatZinc 解释器提供了一种更好的方式来平衡内存使用和传播工作。 装箱传播也得到了加强,增加了基于对偶可行函数的下界。4 (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fn-bin-packing-dff) 这些边界可以比以前的单独传播更早地检测到不可行的打包状态。高级传播级别现在是默认设置。 ## 正确性和稳定性工作 6.4.0 中不太显眼的部分也是我在求解器版本中最看重的部分:一轮广泛的正确定性和稳定性修复。 两个整数传播器修复解决了严重的边界情况。域级全局基数传播可能通过重复计算已赋值变量和保留过时冲突信息而丢失解。`sorted` 约束可能在匹配组件没有兼容区间时无法终止。两者都有回归测试。 浮点传播也经过了类似的处理。区间中位数不再在大边界附近溢出,否则可能会阻止搜索取得进展。5 (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fn-float-median) 乘法、幂和 n 次根传播现在直接收缩区间,并避免了几个紧边界和偶次根边界情况。 搜索和克隆在 sanitizer 和确定性故障注入下进行了测试。这揭示了并行搜索中的竞态和生命周期问题、分支定界重计算期间的未定义行为,以及在克隆空间或构造 MiniModel 表达式时分配失败导致清理不完整的问题。失败的克隆现在是事务性的:恢复源空间并释放部分克隆,而不是留下前向链接或活动列表处于不一致状态。6 (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fn-sap-exception-safety) 这些是不常见的执行路径,这正是新测试支持有用的原因。分配失败和时序相关的搜索竞态很难通过普通示例重现。专用的故障注入和 sanitizer 配置使这些失败可重现到足以捕获回归。 6.3.0 版本已经在同一方向上进行了准备工作。平台特定的线程实现被替换为标准 C++ 线程,统计计数器被加宽以用于长时间运行的搜索,测试套件获得了并行执行,并且修复了并行搜索中的泄漏。7 (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fn-parallel-search-leak) 6.4.0 版本在此基础上构建,并具有当前的 Windows、macOS 和 Linux CI 覆盖。 ## 需要检查的兼容性更改 在更新现有构建之前,有三个更改值得检查: 1. 版本仅提供源代码。6.4.0 没有 Gecode 提供的 Windows 安装程序或 macOS 磁盘映像。 2. 旧的 `qecode` 和 `quacode` 贡献模块不再属于仓库或发布存档。仍然依赖它们的项目必须保留较旧版本或单独维护这些模块。 3. 公共宏 `GECODE_FLATZINC_VERSION` 已被移除。它描述了固定的 FlatZinc 语言修订版本,而当前的 MiniZinc 集成是基于功能的。对于 Gecode 版本请使用 `GECODE_VERSION`,对于 FlatZinc 功能请使用已安装的 MiniZinc 求解器元数据。 使用旧版本 `GIST_STATIC_LIBS` 拼写的静态 Windows 客户端可以继续工作,尽管 `GECODE_STATIC_LIBS` 仍然是首选的宏。 ## 获取发布版本 Gecode 6.4.0 可以从 Gecode 下载页面 (https://www.gecode.dev/download.html) 或 GitHub 发布页面 (https://github.com/Gecode/gecode/releases/tag/release-6.4.0) 下载。源代码也可以直接从 `release-6.4.0` 标签 (https://github.com/Gecode/gecode/tree/release-6.4.0) 获取。 有关所有个别更改,请参见 6.4.0 和 6.3.0 的变更日志 (https://www.gecode.dev/doc/latest/reference/PageChange.html#SectionChangeList)。参考文档 (https://www.gecode.dev/doc/latest/reference/) 和 *Modeling and Programming with Gecode* (https://www.gecode.dev/doc/latest/MPG.pdf) 也已为该版本重建。 这一对版本清除了大量的积压工作,但更重要的变化是组织层面的:有一个活跃的开发分支和一个适合当前 C++ 项目的构建。这为未来的 Gecode 工作提供了比另一个孤立的修复集合更坚实的基础。 1. Gecode 中 `on_restart` 的实现由 Jip J. Dekker 贡献。该接口基于 *Solver-Independent Large Neighbourhood Search* (https://doi.org/10.1007/978-3-319-98334-9_6)。↩ (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fnref-on-restart) 2. Gecode 的实现由 Jip J. Dekker 贡献。该接口在 *Defining Propagators in MiniZinc* (https://2026.modref.org/papers/ModRef2026-03-Defining-Propagators-MiniZinc.pdf) 中描述,作者为 Jip J. Dekker、Peter J. Stuckey、Guido Tack、Huu Quang Tran 和 Markus Wagner。↩ (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fnref-black-box) 3. 感谢 Helmut Simonis 在研究 *Modeling the Inglenook Shunting Puzzle* (https://hdl.handle.net/10468/17768) 时发现稀疏域的问题,该研究由 Luis Quesada 合著。Inglenook 模型促成了此处描述的稀疏 `TupleSet` 表示和自动表示选择。↩ (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fnref-tuple-set-sparse) 4. 对偶可行函数传播由 Fabio Tardivo 贡献。它基于 *CP for Bin Packing with Multi-Core and GPUs* (https://doi.org/10.4230/LIPIcs.CP.2024.28) 中描述的下界组合,作者为 Fabio Tardivo、Laurent Michel 和 Enrico Pontelli。↩ (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fnref-bin-packing-dff) 5. Pierre Talbot 在问题 #164 (https://github.com/Gecode/gecode/issues/164) 中报告了无界浮点数情况,该情况暴露了区间中位数计算中的溢出。↩ (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fnref-float-median) 6. SAP 的 Kris Coester 和 Alexander Shepil 在 PR #211 (https://github.com/Gecode/gecode/pull/211) 中贡献了最初的异常安全性和分配失败工作。SAP 描述了他们如何使用 Gecode 进行高级变体配置 (https://community.sap.com/t5/enterprise-resource-planning-blog-posts-by-sap/sap-uses-gecode-an-award-winning-constraint-solver-in-s-4hana-for-advanced/ba-p/13370310)。↩ (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fnref-sap-exception-safety) 7. Alexis LG 贡献了问题 #156 (https://github.com/Gecode/gecode/issues/156) 中报告的并行搜索解决方案队列泄漏的修复。↩ (https://zayenz.se/blog/post/gecode-6-3-and-6-4-released/#user-content-fnref-parallel-search-leak)

相似文章

C3 0.8.2:小幅改进

Hacker News Top

C3 0.8.2 是 C3 编程语言的一个小幅更新,增加了可复用的库目标模板、泛型反射、位结构属性、新的 @param 选项,并修复了多个 bug。

构建系统重构

Lobsters Hottest

Zig 构建系统已经重构,将配置器和制造器进程分离,支持缓存、发布模式编译,并且'zig build'命令速度提升高达90%。这一变化提高了性能,并允许构建系统在不减速的情况下增加功能。

Zine 0.12.0

Lobsters Hottest

Zine 0.12.0,一个静态站点生成器,新增了 Firefox 开发服务器支持、基于目录的静态资源、自定义配置字段、Codeberg Pages 部署文档,以及带有版本匹配强制的新 setup action v2。

Magit 4.6 发布

Lobsters Hottest

Magit 4.6,Emacs 上流行的 Git 界面,已发布,改进了浏览 blob 的缓冲区,并在差异中增加了实验性的语法高亮。

zai-org/GLM-5.2 来了!

Reddit r/LocalLLaMA

Z.AI 发布了 GLM-5.2,这是一款新的旗舰模型,拥有稳定的 1M token 上下文窗口,通过灵活的思考努力增强了编码能力,并通过 IndexShare 改进了架构。该模型在 MIT 开源许可证下发布。