Last updated on 2026-07-15 23:51:18 CEST.
| Flavor | Version | Tinstall | Tcheck | Ttotal | Status | Flags |
|---|---|---|---|---|---|---|
| r-devel-linux-x86_64-debian-clang | 0.7.8 | 107.97 | 223.54 | 331.51 | OK | |
| r-devel-linux-x86_64-debian-gcc | 0.8.1 | 82.51 | 217.14 | 299.65 | OK | |
| r-devel-linux-x86_64-fedora-clang | 0.7.8 | 158.00 | 525.42 | 683.42 | OK | |
| r-devel-linux-x86_64-fedora-gcc | 0.8.1 | 88.00 | 200.61 | 288.61 | ERROR | |
| r-devel-windows-x86_64 | 0.8.1 | 157.00 | 474.00 | 631.00 | OK | |
| r-patched-linux-x86_64 | 0.7.8 | 117.61 | 208.74 | 326.35 | OK | |
| r-release-linux-x86_64 | 0.7.8 | 107.49 | 208.84 | 316.33 | OK | |
| r-release-macos-arm64 | 0.8.1 | 26.00 | 83.00 | 109.00 | OK | |
| r-release-macos-x86_64 | 0.8.1 | 82.00 | 379.00 | 461.00 | OK | |
| r-release-windows-x86_64 | 0.8.1 | 160.00 | 465.00 | 625.00 | OK | |
| r-oldrel-macos-arm64 | 0.8.1 | 23.00 | 89.00 | 112.00 | OK | |
| r-oldrel-macos-x86_64 | 0.8.1 | 78.00 | 375.00 | 453.00 | OK | |
| r-oldrel-windows-x86_64 | 0.8.1 | 175.00 | 538.00 | 713.00 | OK |
Version: 0.8.1
Check: tests
Result: ERROR
Running ‘testthat.R’ [46s/49s]
Running the tests in ‘tests/testthat.R’ failed.
Complete output:
> library(testthat)
> library(ggmlR)
>
> if (requireNamespace("mlr3", quietly = TRUE)) library(mlr3)
> if (requireNamespace("parsnip", quietly = TRUE)) library(parsnip)
>
> heavy <- c(
+ "normalization",
+ "sequence-ops",
+ "binary-operations",
+ "glu",
+ "nn-sequential",
+ "matrix-ops",
+ "callbacks",
+ "onnx-quant",
+ "cpu-backend",
+ "onnx-elementwise",
+ "onnx-norm",
+ "onnx-misc",
+ "onnx-logic",
+ "onnx-gemm",
+ "onnx-resize",
+ "onnx-nn",
+ "nn-functional",
+ "activations-extended",
+ "onnx-ops",
+ "transformer-ops",
+ "onnx-shape",
+ "math-operations",
+ "activations",
+ "backend-extended",
+ "helpers",
+ "onnx-reduce",
+ "chain-sequential-batchnorm",
+ "chain-patterns",
+ "onnx-chain-quant",
+ "onnx-chain-qlinearconv",
+ "onnx-chain-uncovered-ops",
+ "onnx-chain-transformer",
+ "onnx-chain-broadcast-strict",
+ "onnx-chain-maskrcnn-broadcast",
+ "onnx-chain-erf-gelu",
+ "onnx-chain-resize-broadcast",
+ "onnx-chain-constantofshape-int64",
+ "onnx-chain-roberta-attn",
+ "onnx-chain-batched-matmul",
+ "onnx-chain-classify",
+ "onnx-chain-xcit-dynamic",
+ "onnx-chain-fpn",
+ "onnx-chain-pooling",
+ "onnx-chain-unet",
+ "onnx-chain-audio",
+ "onnx-chain-superres",
+ "onnx-chain-convtranspose",
+ "onnx-chain-eyelike",
+ "onnx-chain-decoder",
+ "onnx-chain-detect",
+ "onnx-chain-powernorm",
+ "onnx-chain-bert-mlp",
+ "onnx-chain-position",
+ "onnx-chain-attn-mask",
+ "onnx-chain-postprocess",
+ "onnx-chain-cast",
+ "onnx-chain-preprocess",
+ "model-ops",
+ "onnx-boundary",
+ "onnx-edge",
+ "parsnip",
+ "parsnip-tidymodels",
+ "parsnip-broom",
+ "seed",
+ "upscale",
+ "rope-multi",
+ "mlr3-learner",
+ "keras-api",
+ "quants-iq-degenerate",
+ "getrows-offload-vulkan",
+ "gpu-linalg"
+ )
>
> # Under the valgrind memtest, running the full light suite (~67 files) blows
> # the memory limit: valgrind's shadow memory accumulates across every
> # ggml_init / backend buffer and never returns to the OS, so the process grows
> # to several GiB and gets SIGKILLed regardless of any single test's size.
> # valgrind's purpose here is to catch C-level memory bugs (use-after-free,
> # invalid reads/writes) in the ggml bindings — a small core suite that
> # exercises context/tensor lifecycle, basic ops and the backend is enough for
> # that. So under valgrind we run an explicit whitelist instead of the full set.
> valgrind_core <- c(
+ "tensors", # tensor create/free lifecycle
+ "context", # ggml_init / ggml_free
+ "ggml", # core library smoke
+ "types", # type helpers
+ "operations-extended",
+ "tensor-utils",
+ "backend", # backend init/free + buffers
+ "memory",
+ "quants" # quant/dequant round-trips
+ )
>
> # Detect valgrind via several independent signals (any one is enough):
> # 1. vgpreload_*.so injected into the process (visible in /proc/self/maps)
> # 2. the RUNNING_ON_VALGRIND env var some setups export
> # 3. R's own valgrind marker in the session (R_CHECK_*/loaded vg libs)
> detect_valgrind <- function() {
+ if (nzchar(Sys.getenv("RUNNING_ON_VALGRIND"))) return(TRUE)
+ # /proc/self/maps holds vgpreload_core / vgpreload_memcheck under valgrind
+ m <- tryCatch(readLines("/proc/self/maps", warn = FALSE),
+ error = function(e) character(0))
+ if (any(grepl("valgrind|vgpreload", m, ignore.case = TRUE))) return(TRUE)
+ # /proc/self/cmdline of the wrapping process: valgrind launches R
+ s <- tryCatch(readLines("/proc/self/status", warn = FALSE),
+ error = function(e) character(0))
+ ppid <- sub("^PPid:\\s*", "", grep("^PPid:", s, value = TRUE))
+ if (length(ppid) == 1L) {
+ pcmd <- tryCatch(
+ readChar(file.path("/proc", ppid, "cmdline"), 1e4, useBytes = TRUE),
+ error = function(e) "")
+ if (grepl("valgrind", pcmd, ignore.case = TRUE)) return(TRUE)
+ }
+ FALSE
+ }
> under_valgrind <- isTRUE(detect_valgrind())
Warning message:
In readChar(file.path("/proc", ppid, "cmdline"), 10000, useBytes = TRUE) :
truncating string with embedded nuls
> message("valgrind detected: ", under_valgrind)
valgrind detected: FALSE
>
> # Disable OpenMP thread pool under valgrind: GOMP_parallel → pthread_create
> # allocates 352b TLS per worker thread which valgrind flags as "possibly lost".
> # Under valgrind we test correctness, not throughput — 1 thread is sufficient.
> if (under_valgrind) {
+ Sys.setenv(OMP_NUM_THREADS = "1")
+ }
>
> on_cran <- !identical(Sys.getenv("NOT_CRAN"), "true")
>
> test_dir <- if (dir.exists("testthat")) "testthat" else "tests/testthat"
>
> if (on_cran) {
+ message("--- RUNNING LIGHT TESTS ONLY ---")
+
+ all_tests <- list.files(test_dir, pattern = "^test-.*\\.R$")
+ all_names <- sub("^test-(.*)\\.R$", "\\1", all_tests)
+
+ if (under_valgrind) {
+ message("--- VALGRIND DETECTED: running small core suite only ---")
+ # Whitelist intersected with what actually exists in the package.
+ light_tests <- intersect(valgrind_core, all_names)
+ } else {
+ light_tests <- setdiff(all_names, heavy)
+ }
+ message("Tests to run: ", paste(light_tests, collapse = ", "))
+
+ if (length(light_tests) == 0) {
+ # fallback
+ test_check("ggmlR")
+ } else {
+ # testthat applies `filter` as grepl(filter, <test name>) with no anchors,
+ # so anchor each name with ^...$ to avoid e.g. "backend" also matching
+ # "backend-buffers"/"backend-extended" (which would re-bloat the set).
+ filter_regex <- paste0("^(", paste(light_tests, collapse = "|"), ")$")
+ test_check("ggmlR", filter = filter_regex)
+ }
+ } else {
+ test_check("ggmlR")
+ }
--- RUNNING LIGHT TESTS ONLY ---
Tests to run: 5d-ops, ag-device, ag-layers, ag-mha, ag-save, ag-training, autograd-missing, autograd-ops, autograd, backend-buffers, backend, chain-ag-early-stopping, context, conv-transpose-numeric, conv2d-cpu-gpu, conv2d-dw-numeric, conv2d-numeric, convolution-pooling, cpu-features, diagnostics, flash-attn-q4k, flash-attn-quants, functional-shared-layers, ggml, gguf, graph-extended, graph-utils, headers-sync, inplace-ops, logging, memory-extended, memory, meta-backend, misc-ops, mlr3-autograd, new-functions, new-ops-numeric, nn-functional-missing, onnx-activations, onnx-chain-roialign-nms, onnx-chain-scatter-gnn, onnx-helpers, onnx-math, onnx-meta, operations-extended, optimizer, print-methods, q4k-matmul-vulkan, quantization, quantize-fns, quants-missing, quants, reduction-ops, reset, reshape, sc-chunked, sc-knn-gpu, sc-largest-gene, sc-neighbors, sc-normalize-sparse, sc-sce, sc-seurat, sc-umap, scheduler, set-operations, softmax, static-lib, tensor-info, tensor-utils, tensors-extended, tensors, threading, types, version, vulkan-caps, vulkan-push-constants, vulkan-tensor-parallel, vulkan
Using CPU backend
GGML library loaded successfully!
GGML version: 0.11.0
Tensor overhead: 448 bytes
Saving _problems/test-sc-umap-339.R
GGML library loaded successfully!
GGML version: 0.11.0
Tensor overhead: 448 bytes
Vulkan: NOT AVAILABLE
To enable: install libvulkan-dev and glslc, then reinstall ggmlR
Ubuntu/Debian: sudo apt install libvulkan-dev glslc
[ FAIL 1 | WARN 0 | SKIP 72 | PASS 1537 ]
══ Skipped tests (72) ══════════════════════════════════════════════════════════
• No Vulkan GPU (7): 'test-sc-seurat.R:145:3', 'test-sc-seurat.R:281:3',
'test-sc-seurat.R:309:3', 'test-sc-seurat.R:321:3', 'test-sc-seurat.R:338:3',
'test-sc-seurat.R:359:3', 'test-sc-seurat.R:445:3'
• No Vulkan GPU available (7): 'test-conv2d-cpu-gpu.R:55:3',
'test-conv2d-cpu-gpu.R:61:3', 'test-conv2d-cpu-gpu.R:71:3',
'test-conv2d-cpu-gpu.R:78:3', 'test-conv2d-cpu-gpu.R:88:3',
'test-conv2d-cpu-gpu.R:98:3', 'test-conv2d-cpu-gpu.R:108:3'
• Overlapping pooling requires specific tensor layout - tested in 2D pooling
(1): 'test-convolution-pooling.R:156:3'
• Platform-dependent behavior (1): 'test-ggml.R:18:3'
• Slow test (6): 'test-quants-missing.R:4:3', 'test-quants-missing.R:17:3',
'test-quants-missing.R:30:3', 'test-quants-missing.R:43:3',
'test-quants-missing.R:56:3', 'test-quants-missing.R:69:3'
• Slow test - set GGMLR_SLOW_TESTS=1 to run (6): 'test-quants.R:142:3',
'test-quants.R:168:3', 'test-quants.R:218:3', 'test-quants.R:234:3',
'test-quants.R:250:3', 'test-quants.R:266:3'
• Vulkan GPU not available (18): 'test-conv2d-numeric.R:68:3',
'test-flash-attn-q4k.R:42:3', 'test-flash-attn-quants.R:44:7',
'test-flash-attn-quants.R:44:7', 'test-flash-attn-quants.R:44:7',
'test-flash-attn-quants.R:44:7', 'test-flash-attn-quants.R:44:7',
'test-flash-attn-quants.R:44:7', 'test-q4k-matmul-vulkan.R:49:3',
'test-q4k-matmul-vulkan.R:55:3', 'test-q4k-matmul-vulkan.R:62:3',
'test-sc-normalize-sparse.R:77:3', 'test-sc-normalize-sparse.R:95:3',
'test-sc-umap.R:87:3', 'test-sc-umap.R:106:3', 'test-sc-umap.R:179:3',
'test-sc-umap.R:230:3', 'test-sc-umap.R:251:3'
• Vulkan not available (15): 'test-scheduler.R:2:3', 'test-scheduler.R:28:3',
'test-scheduler.R:55:3', 'test-scheduler.R:109:3', 'test-scheduler.R:172:3',
'test-scheduler.R:188:3', 'test-scheduler.R:223:3', 'test-vulkan-caps.R:4:3',
'test-vulkan-caps.R:39:3', 'test-vulkan-push-constants.R:11:3',
'test-vulkan-push-constants.R:20:3', 'test-vulkan-push-constants.R:26:3',
'test-vulkan-push-constants.R:36:3', 'test-vulkan-push-constants.R:88:3',
'test-vulkan-push-constants.R:131:3'
• Vulkan not available or no devices found (1): 'test-vulkan.R:321:5'
• Vulkan not compiled in (1): 'test-vulkan-tensor-parallel.R:10:1'
• ggml_flash_attn_back not implemented (TODO in ggml.c) (1):
'test-misc-ops.R:81:3'
• ggml_graph_reset requires a backward graph with gradients allocated (1):
'test-graph-utils.R:44:3'
• multi-input shared-layer predict not implemented (backend buffer not set)
(1): 'test-functional-shared-layers.R:81:3'
• no Vulkan GPU (4): 'test-sc-knn-gpu.R:50:3', 'test-sc-knn-gpu.R:76:3',
'test-sc-knn-gpu.R:89:3', 'test-sc-knn-gpu.R:95:3'
• src/ directory not found (1): 'test-headers-sync.R:17:3'
• src/ggml.h not found (1): 'test-headers-sync.R:42:3'
══ Failed tests ════════════════════════════════════════════════════════════════
── Failure ('test-sc-umap.R:339:3'): op = 'umap' keeps known clusters separated (quality, not just shape) ──
Expected `ss` < `4 * ss_uwot`.
Actual comparison: 0.0197 >= 0.0184
Difference: 0.0013 >= 0
[ FAIL 1 | WARN 0 | SKIP 72 | PASS 1537 ]
Error:
! Test failures.
Execution halted
Flavor: r-devel-linux-x86_64-fedora-gcc