7个稳定版本
3.1.6 | 2022年12月5日 |
---|---|
3.0.0 | 2022年11月30日 |
在 算法 中排名 574
每月下载量 39
在 wavefc-cli 中使用
67KB
1.5K SLoC
波函数坍缩
字符映射演示
概述
这是一个使用Rust编写的波函数坍缩算法的自研实现。
该函数的核心是接受任何类型的样本输入,并根据该输入创建一个新的输出。算法背后的 Wave
引擎被设计为在位和位集中操作。这使得它可以运行于任何二维、基于网格的输入:字符映射、图像、视频游戏关卡、数独谜题等。唯一的要求是编写一个适配器来支持给定的格式。目前,程序仅支持字符映射文本输入。不过,图像适配器正在开发中。
本项目遵循 license.txt
文件中描述的 MIT 许可协议。
快速设置
对于不熟悉Rust且只想从源码构建项目的用户,您来到了正确的位置。要开始,请在 rustup.rs 安装Rust工具链。
安装工具链成功后,只需导航到源代码目录。您可能已经从仓库克隆或下载了它。进入目录后,只需运行 cargo b --release
命令来构建项目。要实际运行项目,请使用 cargo r --release -- <ARGS>
这不是Rust语言或Cargo的教程。因此,请查阅他们在 rust-lang.org 提供的优秀资源和文档。
讨论
默认情况下,CLI使用Robert Heaton在其博客文章中描述的海、陆、海岸示例。这在上面的字符映射演示中可以看到。我认为这种介绍算法的方法非常有意义。它以实际的方式易于理解和掌握。它基于sample.txt
源文件,该文件位于wavefc
crate中。在编译时将其嵌入到程序中以提供此功能,尽管其大小微不足道。
在源代码中,CLI和核心逻辑已被分为两个包:wavefc-cli
和wavefc
。为了创建您自己的自定义适配器和编写自己的CLI,我建议使用wavefc-cli
源代码作为模板,然后在此基础上构建wavefc
类型。在开发过程中,我个人发现使用Cargo的--release
模式构建和运行非常有用。两种模式之间的构建时间差异可以忽略不计,而在这种优化模式下实际的折叠速度要快得多。
程序需要提供宽度和高度来设置输出的大小。您可以随意调整这些值以创建不同形状的输出。请注意,输出的大小越大,函数通常需要的时间越长,因为它自我矛盾的几率增加。理论上,如果指定的输出大小低于或等于样本的大小,则存在有效结果。指定的输出大小必须是瓦片大小的乘积。瓦片大小将在下一段中探讨。
尝试相对于微小的样本一个相对较大的瓦片大小
在wavefc
的版本1和版本2中,仅实现了算法的简单瓦片模型。这严重限制了其“创意”能力,产生了相当单调的输出。在当前版本的算法中,使用重叠瓦片模型。这产生了更好的输出,并且在某些情况下也更快。尽管如此,这种模型通常比简单瓦片模型需要更长的时间。幸运的是,新的重叠逻辑只是原始方法的一个更高级的子集。这意味着,通过指定瓦片大小为1,您实际上是在使用简单瓦片模型。
算法选择下一个折叠的瓦片(叠加)的方式是基于特定位置的Shannon熵。这是通过计算原始样本中每个可能值的出现的概率来计算的。所有这些共同形成给定叠加的集体熵。
由于算法的顺序性质,wavefc
库目前是单线程的。然而,我确实认识到可以通过添加一些多线程来提高很多性能优化。这是项目的长期目标,目前我经常关注rayon
这个特定的项目。
CLI有一系列标志可以调整程序设置。详细说明太多了,而且这样做也没有意义。然而,通过使用clap
库,支持帮助标志以显示所有可用的标志列表。
在您的代码中使用此项目
此项目在crates.io
上有两个包:wavefc
和wavefc-cli
。如果您只想尝试程序,wavefc-cli
可能是您的最佳选择来安装。如果您想在您的代码中使用此算法,只需将wavefc
添加到您的Cargo.toml
中即可。作为替代方案,您可以通过手动复制其源代码或在Cargo工作空间中包含它来使用此项目。
要熟悉源代码的好地方是 wavefc/src/lib.rs
,它包含了大多数实际的 Wave
代码。要在 Rust 中包含此代码,请使用 use wavefc::prelude::*;
预导入。
版权所有 © Zachary Morden 2022
依赖项
~0.6–1MB
~18K SLoC