4个版本 (破坏性更新)
0.4.0 | 2024年8月12日 |
---|---|
0.3.0 | 2024年5月14日 |
0.2.0 | 2024年4月11日 |
0.1.0 | 2024年1月19日 |
#1884 在 解析器实现 中
每月150 次下载
63KB
1.5K SLoC
FlatZinc Serde
flatzinc-serde
是一个Rust库,使用 serde
库提供对FlatZinc JSON格式的序列化和反序列化支持。FlatZinc (JSON) 是一种用于向这类问题的求解器表示决策和优化问题的表示方法。该格式由 MiniZinc 约束建模语言使用。
入门
使用 cargo
安装库
cargo install flatzinc-serde
阅读 文档 了解如何使用该库的更多信息。
许可证
本项目采用MPL-2.0许可证。有关详细信息,请参阅LICENSE文件。
lib.rs
:
FlatZinc数据格式的序列化
FlatZinc是由 MiniZinc 编译器生产的语言,用于生成数据和求解器特定约束模型。这个crate实现了MiniZinc参考手册中“将求解器连接到FlatZinc”部分所描述的FlatZinc序列化格式。虽然这个crate中的serde规范可以与各种数据格式一起使用,但MiniZinc目前仅使用JSON数据格式输出这种公式。我们建议使用 serde_json
与这个crate中的规范来解析MiniZinc编译器生成的FlatZinc JSON文件。
入门
为您的包安装 flatzinc-serde
和 serde_json
cargo add flatzinc-serde serde_json
一旦将这些依赖安装到您的crate中,您就可以按以下方式反序列化一个FlatZinc JSON文件
// let path = Path::new("/lorem/ipsum/model.fzn.json");
let rdr = BufReader::new(File::open(path).unwrap());
let fzn: FlatZinc = serde_json::from_reader(rdr).unwrap();
// ... process FlatZinc ...
然而,如果您想序列化FlatZinc格式,可以按照以下片段进行
let fzn = FlatZinc::<String>::default();
// ... create solver constraint model ...
let json_str = serde_json::to_string(&fzn).unwrap();
请注意,在写入较大的FlatZinc文件时,使用带缓冲的文件写入器的serde_json::to_writer
将会更受欢迎。
在MiniZinc中注册您的求解器
如果您的目标是反序列化FlatZinc以实现MiniZinc求解器,那么下一步就是将您的求解器可执行文件注册到MiniZinc中。这可以通过创建一个MiniZinc求解器配置(.msc
)文件,并将其添加到MZN_SOLVER_PATH
或标准路径,如~/.minizinc/solvers/
所在的文件夹中来实现。一个接受JSON输入的求解器的基本配置如下
{
"name" : "My Solver",
"version": "0.0.1",
"id": "my.organisation.mysolver",
"inputType": "JSON",
"executable": "../../../bin/fzn-my-solver",
"mznlib": "../mysolver"
"stdFlags": [],
"extraFlags": []
}
一旦您将配置文件放置到正确的路径,您的求解器将显示在minizinc --solvers
列表中。假设有一个有效的MiniZinc实例,调用minizinc --solver mysolver model.mzn data.dzn
,(在编译之后)将调用已注册的可执行文件,路径为FlatZinc JSON文件的路径,以及可能注册的标准和额外标志(例如,../../../bin/fzn-my-solver model.fzn.json
)。
依赖关系
~0.8–1.5MB
~32K SLoC