This is the tracing counterpart to grip(). The
metric argument selects the hop-based or edge-length-based compiled
engine while the remaining trace and diagnostic options keep the same
meaning in both cases. See grip() for detailed edge-length
semantics.
trace.grip(
edges = NULL,
n = NULL,
adj_list = NULL,
weight_list = NULL,
edge_weights = NULL,
dim = 3,
placement = c("barycenter", "circle"),
preset = NULL,
rounds = 160,
final_rounds = 384,
num_init = 24,
num_nbrs = 20,
r = 0.03,
s = 7.5,
repulsion_factor = 2.5,
coarse_repulsion_factor = 1.5,
coarse_repulsion_sample = 16,
coarse_repulsion_exact_below = 64,
final_anchor_factor = 0,
final_move_scale_after_first = 1,
final_mode = c("fr", "kk_repulse"),
insertion_anchor_count = 3,
insertion_anchor_scope = c("any_higher", "prev_misf"),
insertion_anchor_strategy = c("first", "distance_band", "balanced_band", "spread_prev"),
level0_insertion_mode = c("inherit", "barycenter", "least_squares"),
level0_anchor_count = insertion_anchor_count,
level0_local_kk_steps = 3,
lgkk_polish_rounds = 0L,
lgkk_multiscale_rounds = 0L,
lgkk_rounds_coarse = NULL,
lgkk_rounds_pre_final = NULL,
lgkk_rounds_final = NULL,
lgkk_local_nbrs = 20L,
lgkk_landmark_count = 8L,
lgkk_multiscale_scope = c("all", "coarse"),
lgkk_active_limit = 4096L,
tinit_factor = 6,
seed = 6,
trace = c("round", "level"),
trace.every = 1,
diagnostics = c("none", "light", "full"),
target_coords = NULL,
diagnostic_sample_size_nonedge = 1000L,
diagnostic_sample_size_stress = 500L,
diagnostic_nonedge_seed = 1L,
diagnostic_stress_seed = 1L,
metric = c("hop", "edge_length"),
metric_neighbor_cap = NULL,
length_normalization = c("median", "mean", "none")
)A list containing the final layout, recorded coordinate frames, frame metadata, trace settings, canonical stage data, and any requested diagnostics.
Two-column integer matrix of edges (1-based vertex ids).
Number of vertices.
Adjacency list (1-based) for undirected graphs.
Parallel list of edge lengths for adj_list.
The edge-length-metric engine requires it; in the hop-metric engine,
NULL treats all edges as length 1. All supplied lengths must be
finite and strictly positive.
Vector of edge lengths for edges, in the same
order as its rows. The edge-length-metric engine requires it; in the
hop-metric engine, NULL treats all edges as length 1. All supplied
lengths must be finite and strictly positive. The selected engine
determines whether lengths also define graph distances.
Layout dimension (2 or 3). Default is 3.
Initial placement strategy. "circle" is only used for 2D.
Optional tuning preset. NULL uses the quality-first
defaults. "carpet" applies a preset tuned for
Sierpinski-carpet-like graphs and validated on carpet levels 3 and 4.
"mesh" applies a preset tuned for rectangular lattice graphs and
validated on 8x8 and 12x12 mesh layouts. "torus" applies a preset
tuned for 3D torus layouts and validated on torus sizes from 8x8 through
20x20. "tree" applies a preset tuned for symmetric force-directed
layouts of tree-like graphs and validated on binary trees of depths 5 and
6. Presets only fill in tuning arguments that you did not supply
explicitly.
Initial rounds for refinement.
Final rounds for refinement.
Number of initial vertices in the coarsest level.
Maximum number of graph-distance neighbors retained for local refinement at each filtration level.
Main local temperature adaptation rate in [0, 1].
Non-negative boost factor applied when successive displacements have a consistent direction.
Non-negative multiplier applied to GRIP's finest-level repulsive force scale.
Non-negative multiplier applied to the extra
coarse-level active-set repulsion term. 0 disables that extra term.
Positive integer sample size used to approximate active-set-wide repulsion on larger coarse levels.
Positive integer threshold. When the active set size is at most this value, the coarse repulsion is computed exactly against all currently active vertices instead of being sampled.
Non-negative multiplier for an anchor term that pulls the final FR stage back toward the pre-final full-graph layout. `0` disables the anchor and preserves the current behavior.
Scalar in `[0, 1]` applied to the final FR displacement after the first finest-level round. Values below `1` damp later full-graph movement while keeping the first FR round unchanged.
Final full-graph refinement mode. "fr" keeps the
current Fruchterman-Reingold-style final stage. "kk_repulse" uses a
KK-style local distance-matching update with explicit active-set
repulsion instead of the final FR phase.
Positive integer number of anchor vertices used
during multiscale insertion on non-initial MISF refinement levels. This is
the closest current implementation to a global K_mish parameter.
Anchor-eligibility rule used during multiscale
insertion. "any_higher" matches the historical GRIP behavior and
allows anchors from any already placed higher MISF level.
"prev_misf" restricts anchors to the immediately previous MISF
level only.
Anchor-selection rule used during
multiscale insertion. "first" keeps the historical
first-anchors-found BFS behavior. "distance_band" keeps exploring
until the K_mish-th anchor distance band is exhausted, then places
the new vertex from that less order-sensitive anchor pool.
"balanced_band" uses the same band expansion, then explicitly
selects a subset whose centroid stays centered in the candidate cloud while
remaining geometrically spread out. "spread_prev" is a
symmetry-oriented band strategy intended to be paired with
insertion_anchor_scope = "prev_misf"; it selects anchors with broad
angular and geometric coverage before placement.
Level-0 insertion placement override used only
when the finest filtration level is first populated. "inherit"
keeps the current GRIP behavior. "barycenter" disables the 2D
circle heuristic at level 0 and uses barycentric anchor placement.
"least_squares" uses a multi-anchor least-squares distance fit at
level 0 before any local micro-polish.
Positive integer number of already placed anchors
to collect for level-0 insertion experiments. By default this inherits
insertion_anchor_count. The legacy behavior uses 3.
Non-negative integer number of tiny local KK micro-polish steps applied immediately after each level-0 insertion. The legacy behavior uses 3.
Non-negative integer number of experimental
landmark-geodesic KK polish iterations applied after the main GRIP solve.
0 disables the polish.
Non-negative integer number of compiled
landmark-geodesic KK refinement rounds applied inside the multiscale solver
after each eligible MISF level completes its standard GRIP rounds.
This legacy shared budget is used as a fallback when any of the more
specific per-stage budgets below are left NULL.
Optional non-negative integer number of compiled
LGKK rounds applied on coarse MISF levels with misf_level > 1.
When NULL, this falls back to lgkk_multiscale_rounds.
Optional non-negative integer number of compiled
LGKK rounds applied on the last coarse level just before the full graph is
opened (misf_level == 1). When NULL, this falls back to
lgkk_multiscale_rounds.
Optional non-negative integer number of compiled
LGKK rounds applied after the full graph level completes its standard GRIP
rounds (misf_level == 0). When NULL, this falls back to
lgkk_multiscale_rounds.
Number of nearest graph-metric neighbors retained per vertex in the LGKK sparse local set when either LGKK stage is enabled.
Number of farthest-point landmarks retained per vertex in the LGKK sparse long-range set when either LGKK stage is enabled.
Scope for the compiled multiscale LGKK stage.
"all" applies it after every eligible MISF level, including the
final full-graph level. "coarse" applies it only on coarse levels.
Positive integer upper bound on the active-set size for compiled multiscale LGKK cache construction. Levels larger than this skip the multiscale LGKK stage.
Initial temperature factor.
Optional RNG seed for reproducibility. If NULL, uses current time.
Snapshot granularity. "round" records the coarsest
initialization, each level start, every trace.every completed
rounds, and the final layout. "level" records the coarsest
initialization, every trace.everyth level start, and the final
layout.
Positive integer thinning factor for recorded rounds or levels. Initial and final snapshots are always included.
Optional per-frame diagnostic mode. "none" skips
extra scoring, "light" appends lightweight shape diagnostics, and
"full" also computes sampled stress on each traced frame.
Optional numeric target coordinate matrix used to append
per-frame Procrustes RMSE diagnostics. It must have n rows and
dim columns.
Positive integer sample size used for
per-frame non-edge separation diagnostics when
diagnostics != "none".
Positive integer sample size used for
per-frame sampled stress when diagnostics = "full".
RNG seed base used for per-frame non-edge separation diagnostics.
RNG seed base used for per-frame sampled stress diagnostics.
Graph metric traced by the multiscale engine:
"hop" (default) or "edge_length". See
grip() for the exact role and normalization of supplied edge
lengths in each mode.
Weighted-metric search limit used only when
metric = "edge_length". NULL performs the exact weighted
neighborhood search and stops once the required neighbors and anchors are
filled. A positive integer enables an approximate search by limiting the
number of settled vertices per search. It is an error to supply this
argument with metric = "hop".
Global normalization applied only when
metric = "edge_length": "median" (default) divides every
edge length by their median, "mean" divides by their mean, and
"none" preserves the supplied numerical scale. It is an error to
supply this argument with metric = "hop".
edges <- cbind(1:5, 2:6)
tr <- trace.grip(
edges, n = 6, metric = "hop", dim = 2,
rounds = 3, final_rounds = 2, num_init = 3,
trace = "level", diagnostics = "light", seed = 1
)
tr$meta
Run the code above in your browser using DataLab