Persistent H0/H1 homology, representative cycles and diagram comparison in pure MoonBit
| 输入/功能 | 实现 |
|---|---|
| 点云 | 1–32 维欧氏距离、Vietoris–Rips 过滤复形 |
| 距离/不相似度矩阵 | 校验对称非负矩阵,构建 Rips 2-骨架 |
| 二维网格 | 顶点值的 lower-star 方格复形,检测连接区域和洞 |
| 灰度图像 | 直接解析 PGM P2/P5,保留原始灰度并进入网格过滤复形 |
| 图像预处理 | 可选 Otsu 自动截止值与亮暗反转,记录可复现的实际参数 |
| 批量项目 | 从一个 JSON 清单分析多份输入并生成指定两两比较和总索引 |
| 全对比较 | 可选 H0/H1 距离方阵、CSV 与离线热图,提示比较条件不一致 |
| 时间序列 | 指定维数、滞后、步长的延迟嵌入,随后进行 Rips 分析 |
| 参数敏感性 | 同一时间序列扫描多组维数/滞后值,导出环路摘要和对齐的景观向量 |
| 持续同调 | GF(2) 稀疏边界矩阵约化、H0/H1 区间、出生时的代表链 |
| 比较与特征 | 精确瓶颈距离、Betti 数与曲线、寿命排名/筛选、有限区间持续熵 |
| 尺度与向量 | 精确 Betti 事件、指定尺度的连通分组、持久景观采样与特征向量 |
| 观察尺度推荐 | 按 H1 已观察寿命挑选区间内尺度;无环路时可提示合并前分组尺度 |
| 解释与演示 | 区间最优匹配明细、离线双图对比、分组着色的尺度 SVG、网格填充、存活代表链高亮 |
| 输出 | 完整 JSON、区间/曲线 CSV、SVG 条形码/持续图、离线 HTML 报告 |
| 可复现验证 | GUDHI Rips 外部区间对照、不同点数的耗时和进程内存基准 |
git clone https://github.com/wdgodghl/moontopolens.git
cd moontopolens
moon version --all
moon check --target js
moon build --target js
moon test --target js
moon run --target js cmd/demomoon check --target wasm-gc
moon build --target wasm-gc
moon test --target wasm-gc
moon run --target wasm-gc cmd/demomoon run --target js cmd/main -- analyze examples/square.json --out out-square
moon run --target js cmd/main -- compare examples/square.json examples/rectangle.json
moon run --target js cmd/main -- summary examples/square.jsonmoon run --target js cmd/main -- analyze examples/periodic-series.json --out out-seriesmoon run --target js cmd/main -- analyze examples/ring-grid.json --out out-gridmoon run --target js cmd/main -- analyze examples/two-holes-grid.json --out out-two-holesmoon run --target js cmd/main -- slice examples/square.json 1
moon run --target js cmd/main -- slice examples/clusters.json 0.5moon run --target js cmd/main -- landscape examples/two-holes-grid.json 1 0 1 --out out-landscapemoon run --target js cmd/main -- compare examples/square.json examples/rectangle.json --out out-comparison
moon run --target js cmd/main -- slice examples/clusters.json 0.5 --out out-clusters-slice
moon run --target js cmd/main -- slice examples/square.json 1 --out out-loop-slice --interval 4moon run --target js cmd/main -- image examples/ring-image.pgm 1 --out out-ring-imagemoon run --target js cmd/main -- batch examples/batch-study.json --out out-studymoon run --target js cmd/main -- image examples/bright-ring.pgm auto --invert --out out-bright-ringmoon run --target js cmd/main -- batch examples/batch-study.json --out out-studymoon run --target js cmd/main -- recommend examples/ring-grid.json
moon run --target js cmd/main -- recommend examples/clusters.json --out out-recommend-clusters
moon run --target js cmd/main -- slice examples/ring-grid.json 0.5 --out out-recommended-slicemoon run --target js cmd/main -- sweep examples/periodic-sweep.json --out out-periodic-sweep{
"kind": "points",
"threshold": 2,
"max_cells": 4000,
"points": [[0, 0], [1, 0], [1, 1], [0, 1]]
}import {
"wdgodghl/moontopolens" @topo,
}let points = [[0.0, 0.0], [1.0, 0.0], [1.0, 1.0], [0.0, 1.0]]
let filtration = @topo.rips(points, threshold=2.0)
let analysis = @topo.analyze(filtration)
let loops = @topo.betti(analysis, 1, 1.0) // 1
let finite_diagram = @topo.diagram(analysis, 1)
let json = @topo.report_json(analysis)
let strongest = @topo.ranked_intervals(analysis, dimension=1, min_lifetime=0.1)
let summary = @topo.summary_json(analysis)
let html = @topo.html_report(analysis)
let events = @topo.betti_events(analysis)
let groups = @topo.connected_components(analysis, 1.0)
let snapshot = @topo.snapshot_json(analysis, 1.0)
let landscape = @topo.persistence_landscape(
analysis, dimension=1, start=0.0, end=2.0, samples=101, layers=3,
)
let matching = @topo.interval_matching(analysis, analysis, dimension=1)
let comparison = @topo.comparison_json(analysis, analysis)
let scale_picture = @topo.scale_svg(analysis, scale=1.0)moon fmt --check
moon check --target js
moon check --target wasm-gc
moon build --target js
moon build --target wasm-gc
moon coverage clean
moon test --target js --enable-coverage
moon test --target wasm-gc
moon coverage report -f summary
node scripts/check-source.mjs
node scripts/smoke.mjs
python -m pip install numpy==2.3.5 gudhi==3.13.0
python scripts/reference_gudhi.py
node scripts/benchmark.mjs
moon package --listpub struct Analysis {
filtration : Filtration
intervals : Array[Interval]
column_additions : Int
} derive(Debug)pub struct BatchCase {
name : String
input : String
format : String
threshold : Double?
auto_threshold : Bool
invert : Bool
} derive(Debug)pub struct ScaleRecommendation {
scale : Double
interval_index : Int?
reason : String
observed_lifetime : Double?
censored : Bool
} derive(Debug)fn analyze(filtration : Filtration, include_zero? : Bool, max_additions? : Int) -> Analysis raise TopologyErrorfn batch_distance_matrix(plan : BatchPlan, analyses : Array[Analysis]) -> BatchDistanceMatrix raise TopologyErrorfn betti_curve(analysis : Analysis, dimension~ : Int, scales : Array[Double]) -> Array[Int] raise TopologyErrorfn bottleneck(a : Array[(Double, Double)], b : Array[(Double, Double)]) -> Double raise TopologyErrorfn connected_components(analysis : Analysis, scale : Double) -> Array[Array[Int]] raise TopologyErrorfn cubical_grid(grid : Array[Array[Double]], threshold~ : Double, max_cells? : Int) -> Filtration raise TopologyErrorfn delay_embed(series : Array[Double], dimension~ : Int, lag~ : Int, stride? : Int) -> Array[Array[Double]] raise TopologyErrorfn interval_matching(a : Analysis, b : Analysis, dimension~ : Int) -> Array[IntervalMatch] raise TopologyErrorfn landscape_csv(analysis : Analysis, dimension~ : Int, start~ : Double, end~ : Double, samples? : Int, layers? : Int) -> String raise TopologyErrorfn landscape_json(analysis : Analysis, dimension~ : Int, start~ : Double, end~ : Double, samples? : Int, layers? : Int) -> Json raise TopologyErrorfn persistence_landscape(analysis : Analysis, dimension~ : Int, start~ : Double, end~ : Double, samples? : Int, layers? : Int) -> Array[Array[Double]] raise TopologyErrorfn ranked_intervals(analysis : Analysis, dimension~ : Int, min_lifetime? : Double, include_alive? : Bool) -> Array[Interval] raise TopologyErrorfn recommend_scales(analysis : Analysis, max_loops? : Int) -> Array[ScaleRecommendation] raise TopologyErrorfn rips(points : Array[Array[Double]], threshold~ : Double, max_cells? : Int) -> Filtration raise TopologyErrorfn rips_matrix(matrix : Array[Array[Double]], threshold~ : Double, max_cells? : Int) -> Filtration raise TopologyErrorInstall
Download zipPersistent H0/H1 homology, representative cycles and diagram comparison in pure MoonBit