IAN starts with a Gabriel graph, estimates local neighborhood scales,
and prunes edges. create.ian.graph() preserves connectivity
by default by retaining proposed edges whose removal would disconnect
the current graph. It also retains the initial Gabriel graph and useful
numerical and pruning diagnostics.
Build the optional backend once
The initial supported target is macOS arm64. Setup needs Python 3, Apple’s C++ compiler/SDK, and native arm64 Cargo/Rust (Rust at least 1.77). The package installs pinned backend sources; its ordinary installation does not build Rust or download a toolchain. These setup commands run explicitly:
library(dgraphs)
backend <- build.ian.backend("ian-build")Use a new build directory. Logs and source identities remain there.
Save the returned module path for later sessions, and rebuild after
changing the R runtime or backend sources. The graph function uses this
module directly; it does not launch a separate solver process. With
cached dependencies, offline=TRUE avoids Cargo network
access. If the default toolchain targets Intel Mac, specify matching
native cargo and rustc executable paths. See
help("build.ian.backend").
Construct and inspect a graph
X <- rbind(c(0, 0), c(1, 0), c(2, 0), c(0, 0))
fit <- create.ian.graph(X, backend = backend,
specimen.ids = c("alpha", "beta", "gamma", "delta"),
participant.ids = c("p1", "p1", "p2", "p3"))
if (!fit$complete) stop(fit$error$message)
graph.edges(fit$initial_graph)
graph.edges(fit$final_graph)
fit$mapping$member_to_profile
fit$scales
fit$affinity
fit$diagnostics$connectivity$protected.edges
fit$diagnostics$connectivity$historyInput rows are specimens. Exact duplicate feature rows become one graph vertex; the example has four specimens and three vertices, in first-occurrence order. Repeated participant IDs remain labels and do not cause profile merging. Mapping indices and graph vertices are one-based. Full raw traces retain explicitly labeled zero-based native indices.
When distances are omitted, the function uses Euclidean distances
computed by R. An optional distances matrix or
dist object supplies unsquared distances in the same row
order as X. Duplicate feature profiles must have identical
distance rows. Coordinates remain required for duplicate identification.
Named supplied distances must match the specimen IDs. Feature
transformation and distance choice are part of the user’s scientific
model; no microbiome-specific preprocessing is automatically
selected.
Graph edge lengths retain input distance units. The affinity matrix contains similarities and is returned separately; it is not a matrix of metric edge lengths. The protected-edge table contains encountered bridges whose pruning conditions were deliberately not tested. It is neither a list of every bridge nor a claim that those edges would otherwise have passed pruning criteria.
Numerical behavior and incomplete results
The default
numerical.policy="IAN evaluated-LP retry-power 0.1" permits
one fresh normalized retry after an eligible rejected solver return.
That retry must pass strict solver success and the unchanged
original-unit numerical checks. Both attempts remain in
diagnostics$solver_history.
To select the earlier strict numerical and reference pruning behavior:
reference <- create.ian.graph(X, backend = backend,
numerical.policy = "IAN evaluated-LP 1.0",
preserve.connectivity = FALSE)Reference pruning can disconnect a graph. Numerical policy and connectivity are independent options; these defaults select already-qualified implementations. They do not establish that retained connections improve biological interpretation or prediction.
Invalid arguments or an unavailable module raise an R error.
Numerical refusal, solve-budget exhaustion or interruption at an engine
event return complete=FALSE, a structured
error, no final_graph, and whatever initial or
last-valid graph and diagnostics are available. A last-valid graph is
partial, not an accepted final output. Always check
complete before proceeding. Interrupts do not preempt a
running solver or every initialization loop. Memory exhaustion or
operating-system termination need not return a recoverable result. R
restart is not provided by this interface.
Resources and qualification
There is no fixed experimental row cap. One dense n-by-n double
matrix uses 8*n*n bytes before overhead; several arrays and
conversion copies coexist. Original specimen count matters because
distances precede duplicate collapse. Gabriel construction has cubic
worst-case work. diagnostics="summary" is the default; full
traces retain additional dense solve data and can be much larger.
Accepted preceding qualification covers seven 1,000-profile geometries in both pruning modes and two 2,000-profile connected examples through native/R paths on Mac arm64 R-devel. The conditional 5,000-profile run was not executed because its prospective memory gate failed. These sizes describe tested examples, not a universal capacity promise. Public-interface qualification is documented in the project’s versioned records; support on other operating systems is not established.