landmark_states() — 25 rule-defined
permutations of 1:n as fixed probe points for graphs too
large to enumerate; rotation-equivalent constructions are detected and
separated automatically.convex_hull_3d(),
enclosing_hull_3d() — the solid a point cloud
bounds, with area and volume; the second passes through every point, not
just the convex ones. New vignette landmark-geometry and
two example scripts.human_algorithm_to() — reaches an
arbitrary target by relabelling values to their target positions and
solving once, instead of routing through 1:n twice. About
half the word length of the old route.
cycle_shortcut() — shortens a path
by cutting across cycles: a combo looped from a point on the path can
rejoin a later state, replacing the stretch between them. Complements
short_path_bfs(). OpenMP-parallel; result verified against
the start state.
cayley_bfs_full() and
cayley_graph_diameter() — full BFS over
the reachable component with per-state distance, and graph diameter
(all-pairs or from-start, with max_pairs
sampling).
openmp_threads() is now
exported.
The ring-size cap of 63 is gone —
human_algorithm() and human_algorithm_to() now
run at n = 1000 and beyond, by storing tail offsets instead
of raw tile numbers in the finish table.
human_algorithm() — solver that
follows the way a person solves TopSpin by hand (C++,
src/human_algorithm.cpp). Phase 1 grows a sorted run one
value at a time; phase 2 finishes the tail with cycle primitives derived
by search per k and cached as a lookup table. Accepts an
arbitrary target, not just sorting to 1:n. Solves even ring
sizes with k from 3 to 6, including the classic
n = 20, k = 4 TopSpin.Disabled GPU for store_analyze_combos() — benchmarks
showed GPU (Vulkan via ggmlR) is ~24x slower than CPU (C++) for this
workload. ggmlR remains as optional dependency for other use
cases.
short_path_bfs.cpp —
short_path_bfs() rewritten entirely in C++ with
depth-limited BFS and multi-index lookup, replacing the previous R
implementation for significantly better performance.
find_path_iterative() now uses C++
StateStore backend instead of data.frame lists
— memory usage is linear instead of quadratic
analyze_top_combinations() still works but the new
store_analyze_combos() writes directly to C++ store without
intermediate data.frames
C++ StateStore — compact hash-indexed state
storage (src/state_store.h,
src/state_store.cpp):
vector<int> for states, separate metadata
vectors, unordered_map hash indexint (1/2/3) instead of strings
for cache efficiencystate_store_find_intersections() — O(min(N,M)) set
intersection via hashstate_store_find_best_match() — Manhattan distance on
flat arraystate_store_filter_middle() — skip first/last steps per
combostate_store_reconstruct_path() — full C++ path
reconstructionstate_store_to_dataframe() — convert to data.frame for
debuggingstore_analyze_combos() — C++ cycle
expansion writing directly to StateStore, bypassing all R-level
list/data.frame creation
sort_by parameter for
find_best_random_combinations():
"longest",
"shortest", "most_unique",
"least_unique", "most_repeated",
"least_repeated"c("shortest", "most_unique")repetition_ratio column in outputsort_by parameter propagated to
find_path_iterative()Bridge state output —
find_path_iterative() and find_path_bfs() now
print bridge state chains with 1-based numbering and labels
Direct vs hub distance check in
find_path_bfs() — compares Manhattan distance
start<->final vs hub_s<->hub_f, skips BFS hubs when direct
is closer
CelestialCoords struct extracted to shared header
(celestial_coords.h) for reuse across C++ files
find_path_bfs() now returns
bridge_states_start and bridge_states_final in
its result, including BFS hub states
Removed arrow dependency — all functions now return
plain data.frame instead of Arrow Tables
data.table moved from Imports to
Suggests — package works without it, uses
data.table for speed when available
Significantly faster installation: removed heavy
arrow dependency (~50+ MB)
Lightweight by default: only Rcpp is
required
GPU acceleration via ggmlR Vulkan backend (optional):
cayley_gpu_available(), cayley_gpu_init(),
cayley_gpu_status(), cayley_gpu_free() — GPU
infrastructure with lazy initializationcalculate_differences(..., use_gpu = TRUE) — Manhattan
distance on GPU (sub -> abs -> sum_rows)apply_operations_batch_gpu() — batch permutation
operations via matrix multiplication on GPUmanhattan_distance_matrix_gpu() — pairwise N*M
Manhattan distance matrix using 3D tensorsSparse BFS: sparse_bfs(),
reconstruct_bfs_path() — sparse BFS with hybrid hub/random
selection
BFS pathfinding: find_path_bfs() —
find path via BFS highways + iterative connector
Path shortening: short_path_bfs() —
greedy BFS hopping to shorten existing paths
Bidirectional BFS pathfinding:
bidirectional_bfs() for shortest path between permutation
states
Iterative path solver:
find_path_iterative() for finding paths via cycle
expansion
Celestial coordinates:
convert_LRX_to_celestial(),
calculate_angular_distance_z(),
calculate_midpoint_z(),
find_closest_to_coords() — map operation counts to
spherical coordinates
Combination analysis:
analyze_top_combinations() for full cycle analysis of top
operation sequences
State utilities: generate_state(),
generate_unique_states_df(), select_unique(),
check_duplicates(), save_bridge_states(),
find_combination_in_states(),
convert_digits()
Path utilities: invert_path(),
validate_and_simplify_path(),
reconstruct_full_path()
Distance metrics:
manhattan_distance(), breakpoint_distance(),
short_position()
Simple operation variants: shift_left_simple(),
shift_right_simple(),
reverse_prefix_simple()
C++ implementations of all core operations via Rcpp with OpenMP
GPU functions fall back to CPU automatically when ggmlR/Vulkan is unavailable
shift_left(),
shift_right(), reverse_prefix()get_reachable_states(),
get_reachable_states_light()find_best_random_combinations()