fermat.distances(return.graph = TRUE) now returns the union of selected
shortest-path edges with powered base lengths and source/target coverage
metadata, while preserving the default distance-matrix return.
Added fermat.knn() and create.fermat.sknn.graph() for exact complete-graph
Fermat nearest neighbors using Euclidean pruning and truncated Dijkstra.
Union graph lengths are path distances; global distance preservation and
connectivity are not assumed.
Added an exact implicit complete-graph backend to fermat.distances(), with
source-to-all and rectangular queries, a workspace estimate guard, and a
teaching example supplying exact Fermat constraints to sparse metric MDS.
Extend the Fermat vignette with noisy arms and nested diffuse background, geometric path diagnostics and complete-versus-kNN distance checks.
Add fermat.distances() with a complete Euclidean graph reference, explicit
symmetric-kNN or supplied-graph restrictions, and optional rooted output.
Add a noisy-circle vignette comparing restricted distances to the reference.
Export create.ian.graph() with connectivity preservation and the audited
retry-power numerical policy as defaults. Retain explicit strict/reference
options, initial/final graphs, profile mapping and diagnostics; no fixed row cap.
Add build.ian.backend() for explicit optional-backend setup on macOS arm64.
Backend compilation remains separate from ordinary package installation.
Geodesic nearest-neighbor queries now count other vertices, exclude self by
identity, preserve coincident observations and break ties by vertex index.
Insufficient reachable neighbors error unless small.component = "truncate";
truncation pads missing indices/distances with NA/Inf and reports effective.k.
Remove no-op intersection parallel controls, path.dist edge.col, geodesic.knnx method, plot.IkNNgraphs k, and the explorer run_dir alias and old cache option. graph.embedding verbose now reports elapsed layout time.
Add concise print/summary methods for geometry samples and path collections.
Include a deterministic saved circle benchmark in the explorer. Preserve coordinate proportions by default, label axes and optional normalization, and disclose edge thinning without changing saved metrics.
Make the package overview visible in installed help. Link every catalog and method entry to detailed help generated from the same installed Rd database, including offline copies. Add perspective static galleries and figure alt text.
Accept the additional binomial-generator field in R-devel RNG state headers when supported by the runtime, preserving replay tokens and existing word validation instead of rejecting freshly generated states.
Separate release/development installation examples, add a reproducible README figure and a pkgdown site, and validate static and interactive documentation separately in CI with exact source/archive fingerprints and Windows coverage.
Separate path measurement, geodesic neighbors, intersection stability and display modules; rename their regression suites by enduring workflow names.
Unify graph spectra across the native and R backends: nev counts the
smallest positive eigenpairs in increasing order, and defaults to all
positive modes. Results have class graph_spectrum, with exact component
nullity, vertex component IDs, and a resolved zero-mode tolerance. All
component zero modes are excluded. Counts are validated without truncation;
empty/edgeless graphs return zero-column spectra. Both backends honor dense
versus sparse Laplacian output; native full spectra use a dense solver.
Breaking spectral embedding interface: use
graph.spectral.embedding(spectrum, dim, scale) with the complete spectrum
object, replacing the separate eigenvector/eigenvalue arguments. Choose
scale = "none" or "inverse.sqrt". Disconnected graphs must be embedded
component by component. No compatibility wrappers are retained.
Correct subdivide.path() to include both endpoints and interpolate at equal
arc-length intervals along the polyline, skipping repeated points instead of
returning missing rows. Singleton and zero-length paths now have length zero,
normalized cumulative distances of zero, and repeated-location subdivisions.
Empty/malformed paths and invalid subdivision counts or vertex indices are
rejected explicitly; subdivision requires at least two output points.
Add explore.graphs(), the Graph Reconstruction Explorer migrated from
dggraphui, with optional Shiny dependencies. read.graph.benchmark() reads
existing benchmark manifests; register.graph.project() remembers external
projects without moving or changing their data.
Retain saved-layout viewing and add current weighted-GRIP support for explicit missing-layout generation. Cache keys distinguish full project paths.
Consolidate distance matrices under graph.geodesic.distances(), accepting
either a graph or points with explicit symmetric-kNN/MST construction. MST
construction preserves zero-length edges; k = 1 no longer implies an MST.
create.path.graph(graph, h.values) always returns a named collection.
Correct hop-constrained route reconstruction and support reverse and self
queries in get.shortest.path(). Remove the raw public shortest.path(),
estimate.geodesic.distances() and create.path.graph.series() interfaces.
Replace plot2D.colored.graph() with plot() for dgraph. Layouts can be
reused, numeric values and explicit colors are distinct, constant values
plot correctly, and undirected edges are drawn once. Three-dimensional
coordinates require explicit projection. Layout and plotting share stage
selection. No compatibility wrappers are retained.
Replace ten basic graph constructors with create.graph(type, ...), without
compatibility wrappers. Eight types share vertex counts, optional labels and
strict argument validation. Chains use per-side span; circles return
coordinates and explicit arc/chord lengths; random graphs enforce feasible
edge budgets and support isolated seeds.
Breaking graph API: every constructor returns dgraph; use graph.adjacency,
graph.lengths, graph.edges, graph.order, graph.stages and
graph.edge.attribute. Raw metric inputs use adj.list and length.list.
Old graph fields, conversion overloads, get.edge.weights and
extract.edge.lengths are removed without compatibility wrappers.
Graph sequences use increasing k.values. Coordinate, geodesic and iterated
intersection covers contain self plus k other vertices, with distance ties
resolved by vertex index. Undersized components require explicit truncation.
Neighbor caches use format 3 and validate working coordinates and row order.
Mutual-neighbor sequences now use the documented path/edge ratio directly; zero disables pruning. The former unintended addition of one is removed.
Graph layouts select edge attributes and transformations explicitly. Nerve
overlaps are attributes rather than lengths. Path results contain $graph;
path series compute each requested hop limit independently.
Expand quadratic-geometry examples with interactive ivue galleries, labeled x/y/z axes, all specialized sampling modes, frames, dimensions and metric diagnostics. Optional visualization dependencies have static fallbacks.
Add installed function-guide and synthetic-geometry vignettes, with a task-oriented catalog, method workflows, reproducible examples and explicit geometry/sampling limits. Link all guides from the package overview and README; add automated export and method-help coverage checks.
Fix one-point box sampling and multiple-height embeddings to retain matrix dimensions. These inputs previously failed in inherited geometry kernels.
Add explicit current-stream sampling for Geometry Lab compatibility with nondefault RNG kinds; the default isolated seed/state modes are unchanged.
Add reusable synthetic geometry constructors, embeddings, geometric edge lengths, and sampling specifications previously provided by geosmooth.
Add sample.synthetic.geometry() with explicit random-state continuation
and restoration of the caller's random-number state. Statistical responses,
registry identities and the legacy G4 recipe remain in geosmooth.
Move the development Geometry Lab app and maintained quadratic-surface fixture/reference tools into this repository. Geometry Lab uses shared versioned sampling while retaining its existing point identities.
Adds create.sknn.graphs() for constructing a sequence of symmetric-kNN
graphs from one cached ANN search. create.sknn.graph() now also accepts a
validated precomputed neighbor matrix and supports
graph.detail = "minimal" for scalable fitting workflows that do not need
repaired lifecycle branches.
Removed global compiler-warning suppression and unsupported native OpenMP branches. Native graph construction remains serial, including in custom builds with OpenMP enabled; compatibility arguments are retained.
ANN errors now propagate as R errors instead of silently continuing. Native entry points catch C++ exceptions, ANN point and tree ownership is exception-safe in nearest-neighbor and MST helpers, and the native kNN entry validates dimensions, finite coordinates and neighborhood size.
Documented all registered S3 methods and added runnable method examples. The documentation-coverage test now includes registered methods.
compare.adj.lists() is silent by default; use verbose = TRUE to print
vertices whose neighbor sets differ.
Fixes summaries of empty detect.local.extrema() results by retaining the
requested maxima/minima setting in a scalar detect.maxima component.
Legacy empty objects without this metadata report an unknown (NA) type
instead of being incorrectly labeled as minima.
create.radius.graph() and
create.adaptive.radius.graph() compatibility wrappers. Use
create.rknn.graph() with type = "fixed" or
type = "adaptive.radius", respectively.cpp.create.rknn.graphs(). Use create.rknn.graphs(backend = "cpp").dist.to.knn(), euclidean.distance(), and
graph.adj.mat() helpers.adjlist.to.igraph() conversion function.
as_igraph() now accepts bare adjacency lists and an optional aligned
weight.list argument.graph.edit.distance(),
load.graph.data(), calculate.edit.distances(), and
create.distance.plot().rel_geodesic_stress diagnostic is a
target-normalized graph-geodesic relative RMSE, not Kruskal's Stress-1.igraph, and geodesic-isometry diagnostics.as_igraph() to current dgraphs graph objects while preserving
support for legacy basin graph objects.