Data-oriented C++23 geometry and structure engine with a throughput-first CPU pipeline.
- SoA geometry storage (
x,y,z) for cache-friendly traversal. DiscreteExteriorCalculusstructure with explicit face arrays and CSR adjacency (faces + vertex neighbors).DiffusionGeometrystructure with k-NN graph construction (nanoflann) and sparse Markov chain (Eigen).- Spectral and Hodge operator stack (Gram, weak exterior derivative, curl energy, Hodge spectrum).
- Doctest correctness suite and Google Benchmark performance suite.
Managed through vcpkg manifest:
fmtrange-v3doctestxsimdeigen3nanoflannspectrabenchmark
cmake --preset default-local -DCMAKE_BUILD_TYPE=Release
cmake --build build -j8The repo uses Doxygen-style comments in headers under include/igneous/.
Generate docs:
cmake -S . -B build -G Ninja
cmake --build build --target docsOutput:
build/docs/html/index.html
If Doxygen is missing, install it first (for example via Homebrew: brew install doxygen graphviz).
Deployment:
- GitHub Actions workflow
.github/workflows/docs.ymlbuilds and deploys docs to GitHub Pages onmain. - Published URL pattern:
https://<org-or-user>.github.io/igneous/
This repo uses clang-tidy (lint) and clang-format (formatter) with config files at:
.clang-tidy.clang-format
Run locally:
make lint
make lint-fast
make lint-changed
make lint-all
make lint-strict
make format
make format-checkNotes:
make lintis the default local pass:src/translation units plus header include-cleaner checks.make lint-fastskips header include-cleaner checks (faster iterative loop).make lint-changedchecks only changed C++ translation units in git working tree (fastest local loop).make lint-allextends lint coverage totests/andbenches/.make lint-strictis full-project strict lint (similar to CI lint settings).make lintand related targets auto-runmake debugonly whenbuild/compile_commands.jsonis missing.- Tool binaries searched in
PATH:clang-tidyandclang-format(version-suffixed variants are supported). scripts/dev/lint.shknobs:IGNEOUS_LINT_JOBS=<N>controls parallel workers (default: auto, capped at 8).IGNEOUS_LINT_HEADERS=0|1toggles header include-cleaner pass.IGNEOUS_LINT_CHANGED_ONLY=0|1restricts lint to changed files in git.
scripts/dev/format.shknob:IGNEOUS_CLANG_FORMAT_BIN=<binary>selects an explicit formatter binary (useful to match CI version exactly).
./build/igneous-mesh assets/bunny.obj
./build/igneous-point assets/bunny.obj
./build/igneous-diffusion assets/bunny.obj
./build/igneous-spectral assets/bunny.obj
./build/igneous-hodge
./build/igneous-diffusion-geometryPer-main output viewers are available under visualizations/.
python3 visualizations/view_main_point.py --run --open
python3 visualizations/view_main_mesh.py --run --open
python3 visualizations/view_main_diffusion.py --run --open
python3 visualizations/view_main_spectral.py --run --open
python3 visualizations/view_main_hodge.py --run --open
python3 visualizations/view_main_diffusion_geometry.py --run --openDetailed usage is documented in visualizations/README.md.
The diffusion/Hodge parity work in this repository is aligned against the Python reference implementation:
Standard parity round:
./scripts/hodge/run_parity_round.shStandard torus+sphere parity round:
./scripts/diffgeo/run_parity_round.shBy default, test_diffgeo_parity_optional reports parity metrics but only hard-fails
when strict enforcement is requested:
IGNEOUS_REQUIRE_PARITY=1 ctest --test-dir build -R test_diffgeo_parity_optional --output-on-failureSet IGNEOUS_BENCH_MODE=1 to disable heavy export paths in runtime apps.
Runtime backend controls:
IGNEOUS_BACKEND=cpufor single-thread CPU execution.IGNEOUS_BACKEND=parallel(default) for threaded CPU execution.IGNEOUS_BACKEND=gpuenables Metal diffusion kernels on Apple platforms.IGNEOUS_NUM_THREADS=<N>to override worker count for threaded kernels.IGNEOUS_GPU_MIN_ROWS=<N>sets minimum vertex count for GPU offload (default8192).IGNEOUS_GPU_MIN_ROW_STEPS=<N>sets minimumrows*stepsfor multi-step GPU offload (default200000).IGNEOUS_GPU_FORCE=1forces GPU offload for debugging/profiling.- Workload guidance for backend choice:
notes/perf/backend-guidance.md.
ctest --test-dir build --output-on-failure --verboseCurrent suites:
test_algebratest_structure_dectest_structure_diffusion_geometrytest_ops_curvature_flowtest_ops_spectral_geometrytest_ops_hodgetest_ops_diffusion_basistest_ops_diffusion_formstest_ops_diffusion_wedgetest_io_meshestest_hodge_cli_outputstest_hodge_parity_optional(skips unlessDiffusionGeometry/is available, unless forced)test_diffgeo_cli_outputstest_diffgeo_parity_optional(strict-fail only whenIGNEOUS_REQUIRE_PARITY=1)
./build/bench_geometry./build/bench_dod --benchmark_min_time=0.1s --benchmark_repetitions=5 --benchmark_report_aggregates_only=true
./build/bench_pipelines --benchmark_min_time=0.1s --benchmark_repetitions=5 --benchmark_report_aggregates_only=truePR-smoke style local run:
IGNEOUS_BENCH_MODE=1 IGNEOUS_BACKEND=parallel IGNEOUS_NUM_THREADS=8 \
./build/bench_dod --benchmark_min_time=0.05s --benchmark_repetitions=5 --benchmark_report_aggregates_only=true
IGNEOUS_BENCH_MODE=1 IGNEOUS_BACKEND=parallel IGNEOUS_NUM_THREADS=8 \
./build/bench_pipelines --benchmark_min_time=0.05s --benchmark_repetitions=5 --benchmark_report_aggregates_only=trueNightly-deep style local run:
./scripts/perf/run_deep_bench.sh
IGNEOUS_BENCH_MODE=1 IGNEOUS_BACKEND=parallel IGNEOUS_NUM_THREADS=8 \
./build/bench_pipelines --benchmark_min_time=0.2s --benchmark_repetitions=10 --benchmark_report_aggregates_only=trueBenchmark groups:
bench_mesh_structure_buildbench_curvature_kernelbench_flow_kernelbench_diffusion_buildbench_markov_stepbench_markov_multi_stepbench_eigenbasisbench_1form_grambench_weak_derivativebench_curl_energybench_hodge_solve
Pipeline benchmark groups:
bench_pipeline_diffusion_mainbench_pipeline_spectral_mainbench_pipeline_hodge_mainbench_hodge_phase_structure_buildbench_hodge_phase_eigenbasisbench_hodge_phase_grambench_hodge_phase_weak_derivativebench_hodge_phase_curl_energybench_hodge_phase_solvebench_hodge_phase_circular
.github/workflows/ci.yml: Linux/macOS build + tests, sanitizer pass, compile commands artifact..github/workflows/docs.yml: Doxygen build and GitHub Pages deployment for API docs..github/workflows/perf-smoke.yml: PR smoke benchmark report against baseline (report-only)..github/workflows/perf-deep.yml: nightly/manual deep benchmark capture and summary (report-only)..github/workflows/release.yml: tag-triggeredv*release packaging and GitHub Release asset publish..github/workflows/codeql.yml: weekly/manual C++ CodeQL scan.
- Journal:
notes/perf/journal.md - Metrics log:
notes/perf/metrics.csv - Main-vs-branch summary:
notes/perf/main-vs-branch.md - Results:
notes/perf/results/ - Profiles:
notes/perf/profiles/ - Report:
notes/perf/final-report.md - Migration notes:
notes/perf/migration.md
Helper scripts:
scripts/perf/run_deep_bench.shscripts/perf/compare_against_main.pyscripts/perf/profile_time.shscripts/perf/profile_counters.shscripts/perf/download_datasets.sh
Regenerate main-vs-branch.md:
python3 scripts/perf/compare_against_main.py \
--baseline notes/perf/results/bench_dod_20260213-085501.json \
--current notes/perf/results/bench_dod_20260213-current-latest.json \
--baseline-commit e7615627872a53010b006d69775174113cdbc467 \
--label "Main vs branch: bench_dod" \
--output-markdown notes/perf/main-vs-branch-bench_dod.md \
--output-json notes/perf/main-vs-branch-bench_dod.jsonRelease tagging convention:
git tag vX.Y.Z
git push origin vX.Y.Z#include <igneous/igneous.hpp>
using Mesh = igneous::data::Space<igneous::data::DiscreteExteriorCalculus>;
int main() {
Mesh mesh;
igneous::io::load_obj(mesh, "assets/bunny.obj");
std::vector<float> H;
std::vector<float> K;
igneous::ops::dec::CurvatureWorkspace<igneous::data::DiscreteExteriorCalculus> curvature_ws;
igneous::ops::dec::FlowWorkspace<igneous::data::DiscreteExteriorCalculus> flow_ws;
igneous::ops::dec::compute_curvature_measures(mesh, H, K, curvature_ws);
igneous::ops::dec::integrate_mean_curvature_flow(mesh, 0.01f, flow_ws);
}make release
make build
make test
make bench
make bench-deep