From badc264c143e6312b5d4d95644c7a170b3263551 Mon Sep 17 00:00:00 2001 From: David Schoch Date: Fri, 22 May 2026 13:20:32 +0200 Subject: [PATCH] updated revdep issues --- revdep/examples/README.md | 72 ++- revdep/examples/cascade-circulant-issue.R | 24 - revdep/examples/cascade-circulant-issue.md | 33 -- revdep/examples/cascade-issue-draft.md | 34 -- revdep/examples/comato-layout-spring-issue.R | 31 ++ revdep/examples/comato-layout-spring-issue.md | 30 ++ .../cranly-eigen-centrality-scale-issue.R | 33 ++ .../cranly-eigen-centrality-scale-issue.md | 31 ++ revdep/examples/degreenet-reedmolloy-issue.R | 49 ++ revdep/examples/degreenet-reedmolloy-issue.md | 50 ++ revdep/examples/diagrammer-neighbors-issue.R | 36 -- revdep/examples/diagrammer-neighbors-issue.md | 48 -- revdep/examples/ecol-hub-score-issue.R | 30 ++ revdep/examples/ecol-hub-score-issue.md | 31 ++ .../frf2-deprecation-warnings-issue.R | 43 ++ .../frf2-deprecation-warnings-issue.md | 52 ++ .../examples/goodfitsbm-get-edge-ids-issue.R | 44 ++ .../examples/goodfitsbm-get-edge-ids-issue.md | 33 ++ revdep/examples/jewel-integer-issue.R | 43 -- revdep/examples/jewel-integer-issue.md | 51 -- revdep/examples/manynet-scalar-issue.R | 29 -- revdep/examples/manynet-scalar-issue.md | 37 -- .../migraph-create-ring-width-issue.R | 41 ++ .../migraph-create-ring-width-issue.md | 40 ++ revdep/examples/nat-dfs-father-issue.R | 30 ++ revdep/examples/nat-dfs-father-issue.md | 32 ++ .../qgraph-sample-degseq-method-issue.R | 34 ++ .../qgraph-sample-degseq-method-issue.md | 37 ++ .../r6causal-attribute-deprecations-issue.R | 41 ++ .../r6causal-attribute-deprecations-issue.md | 45 ++ revdep/examples/rspectral-modularity-issue.R | 56 -- revdep/examples/rspectral-modularity-issue.md | 55 -- revdep/examples/sfnetworks-from-issue.R | 30 -- revdep/examples/sfnetworks-from-issue.md | 37 -- revdep/examples/tidygraph-bfs-father-issue.R | 37 ++ revdep/examples/tidygraph-bfs-father-issue.md | 36 ++ revdep/examples/vkr-get-edge-missing-issue.R | 30 ++ revdep/examples/vkr-get-edge-missing-issue.md | 34 ++ revdep/problems-analysis.md | 480 +++++++++++------- 39 files changed, 1250 insertions(+), 709 deletions(-) delete mode 100644 revdep/examples/cascade-circulant-issue.R delete mode 100644 revdep/examples/cascade-circulant-issue.md delete mode 100644 revdep/examples/cascade-issue-draft.md create mode 100644 revdep/examples/comato-layout-spring-issue.R create mode 100644 revdep/examples/comato-layout-spring-issue.md create mode 100644 revdep/examples/cranly-eigen-centrality-scale-issue.R create mode 100644 revdep/examples/cranly-eigen-centrality-scale-issue.md create mode 100644 revdep/examples/degreenet-reedmolloy-issue.R create mode 100644 revdep/examples/degreenet-reedmolloy-issue.md delete mode 100644 revdep/examples/diagrammer-neighbors-issue.R delete mode 100644 revdep/examples/diagrammer-neighbors-issue.md create mode 100644 revdep/examples/ecol-hub-score-issue.R create mode 100644 revdep/examples/ecol-hub-score-issue.md create mode 100644 revdep/examples/frf2-deprecation-warnings-issue.R create mode 100644 revdep/examples/frf2-deprecation-warnings-issue.md create mode 100644 revdep/examples/goodfitsbm-get-edge-ids-issue.R create mode 100644 revdep/examples/goodfitsbm-get-edge-ids-issue.md delete mode 100644 revdep/examples/jewel-integer-issue.R delete mode 100644 revdep/examples/jewel-integer-issue.md delete mode 100644 revdep/examples/manynet-scalar-issue.R delete mode 100644 revdep/examples/manynet-scalar-issue.md create mode 100644 revdep/examples/migraph-create-ring-width-issue.R create mode 100644 revdep/examples/migraph-create-ring-width-issue.md create mode 100644 revdep/examples/nat-dfs-father-issue.R create mode 100644 revdep/examples/nat-dfs-father-issue.md create mode 100644 revdep/examples/qgraph-sample-degseq-method-issue.R create mode 100644 revdep/examples/qgraph-sample-degseq-method-issue.md create mode 100644 revdep/examples/r6causal-attribute-deprecations-issue.R create mode 100644 revdep/examples/r6causal-attribute-deprecations-issue.md delete mode 100644 revdep/examples/rspectral-modularity-issue.R delete mode 100644 revdep/examples/rspectral-modularity-issue.md delete mode 100644 revdep/examples/sfnetworks-from-issue.R delete mode 100644 revdep/examples/sfnetworks-from-issue.md create mode 100644 revdep/examples/tidygraph-bfs-father-issue.R create mode 100644 revdep/examples/tidygraph-bfs-father-issue.md create mode 100644 revdep/examples/vkr-get-edge-missing-issue.R create mode 100644 revdep/examples/vkr-get-edge-missing-issue.md diff --git a/revdep/examples/README.md b/revdep/examples/README.md index a9349d7e1c3..c59a153ff89 100644 --- a/revdep/examples/README.md +++ b/revdep/examples/README.md @@ -1,53 +1,81 @@ # Reverse Dependency Problem Examples -This directory contains minimal reproducible examples for packages that have newly broken checks compared to the most recent CRAN version of igraph. +This directory contains minimal reproducible examples for packages flagged as newly broken in the latest `revdepcheck` run against the development version of igraph. See [`../problems-analysis.md`](../problems-analysis.md) for the corresponding analysis and recommended fixes. ## Files Each issue has two files: -- `*.R` - Runnable R script with the minimal example -- `*.md` - Markdown documentation with example output (reprex-style) +- `*.R` — runnable R script with the minimal reproduction +- `*.md` — markdown documentation with reprex-style output ### Issues -1. **cascade-circulant-issue** - Namespace collision between `igraph::circulant` and `magic::circulant` -2. **diagrammer-neighbors-issue** - `neighbors()` now requires exactly one vertex -3. **jewel-integer-issue** - Strict integer validation in `rewire_impl()` -4. **manynet-scalar-issue** - Scalar integer validation in `sample_last_cit()` -5. **rspectral-modularity-issue** - Automatic weight usage in modularity calculations -6. **sfnetworks-from-issue** - `from` parameter must specify exactly one vertex +#### Group A — `bfs/dfs(father = )` argument defunct (igraph 2.2.0) +1. **tidygraph-bfs-father-issue** — `bfs(father = )` defunct (root of the dci/ggraph/scistreer cascade) +2. **nat-dfs-father-issue** — `dfs(father = )` defunct (direct caller) + +#### Group B — Defunct top-level functions +3. **comato-layout-spring-issue** — `layout.spring()` defunct +4. **ecol-hub-score-issue** — `hub.score()` defunct +5. **vkr-get-edge-missing-issue** — `igraph::get.edge` removed + +#### Group C — Defunct argument values / behaviors on retained functions +6. **cranly-eigen-centrality-scale-issue** — `eigen_centrality(scale = FALSE)` defunct +7. **qgraph-sample-degseq-method-issue** — `sample_degseq(method = "simple.no.multiple")` defunct +8. **goodfitsbm-get-edge-ids-issue** — `get_edge_ids(vp = <2xn matrix>)` orientation defunct + +#### Group D — Deprecation warnings surfacing as NOTE/WARNING +9. **frf2-deprecation-warnings-issue** — multiple deprecation warnings → NOTE +10. **r6causal-attribute-deprecations-issue** — install-time attribute getter/setter warnings +11. **migraph-create-ring-width-issue** — `create_ring(width = )` deprecation warning → test failure + +#### Group E — Indirect path through a defunct fallback +12. **degreenet-reedmolloy-issue** — defunct `sample_degseq(method = "simple.no.multiple")` fallback inside `reedmolloy()`'s retry loop + +Three packages from the failure set (dci, ggraph, scistreer) are pure cascades through tidygraph and have no separate reproducer — see `tidygraph-bfs-father-issue` for the root cause. ## Running the Examples Each R script can be run with: ```r -source("revdep/examples/cascade-circulant-issue.R") +source("revdep/examples/tidygraph-bfs-father-issue.R") ``` Or from the command line: ```bash -Rscript revdep/examples/cascade-circulant-issue.R +Rscript revdep/examples/tidygraph-bfs-father-issue.R ``` +The scripts are designed to be run against the **development version** of igraph (the version produced by `R CMD INSTALL .` from the repo root). Against the CRAN release of igraph many of them will not yet hard-error — they will only emit deprecation warnings. + ## Format The examples follow a simplified format: -- No `cat()` statements for output (comments instead) -- No `tryCatch()` blocks (commented out error cases) +- No `cat()` statements for output (use comments instead) +- No `tryCatch()` blocks (commented-out error cases) - Clean, runnable code that can be used with `reprex::reprex()` - Corresponding `.md` files show the expected output ## Summary of Issues | Package | Issue | Severity | Type | -|---------|-------|----------|------| -| Cascade | Namespace collision warning | Low | Inadvertent behavior change | -| DiagrammeR | `neighbors()` requires single vertex | High | API tightening | -| jewel | Integer validation error | High | Uncovered downstream bug | -| manynet | Scalar integer validation | High | API tightening | -| rSpectral | Modularity test failures | Medium | Behavior change with workaround | -| sfnetworks | `from` requires single vertex | High | API tightening | - -See `../problems-analysis.md` for detailed analysis and recommendations. +|---|---|---|---| +| tidygraph | `bfs(father=)` defunct | High | API rename (root of cascade) | +| nat | `dfs(father=)` defunct | High | API rename | +| dci | Cascades through tidygraph | High | Cascading | +| ggraph | Cascades through tidygraph | High | Cascading | +| scistreer | Cascades through tidygraph | High | Cascading | +| comato | `layout.spring()` defunct | High | Defunct function | +| ECoL | `hub.score()` defunct | High | Defunct function | +| vkR | `get.edge` removed | Medium | Removed function | +| cranly | `eigen_centrality(scale=)` defunct | High | Defunct argument value | +| qgraph | `sample_degseq(method=)` value defunct | High | Defunct argument value | +| GoodFitSBM | `get_edge_ids()` matrix orientation defunct | High | Defunct call form | +| FrF2 | Deprecation warnings → NOTE | Low | Pre-emptive rename needed | +| R6causal | Install-time deprecation warnings | Medium | Pre-emptive rename needed | +| migraph | `create_ring(width=)` warning → test failure | Low | Deprecated argument | +| degreenet | Defunct fallback `sample_degseq(method=)` value | High | Defunct argument value (indirect) | + +See [`../problems-analysis.md`](../problems-analysis.md) for detailed analysis and recommendations. diff --git a/revdep/examples/cascade-circulant-issue.R b/revdep/examples/cascade-circulant-issue.R deleted file mode 100644 index d38054735cd..00000000000 --- a/revdep/examples/cascade-circulant-issue.R +++ /dev/null @@ -1,24 +0,0 @@ -# Cascade namespace collision issue -# Issue: Warning when loading both igraph and magic packages - -library(igraph) - -# igraph now exports circulant() as a constructor alias -"circulant" %in% ls("package:igraph") - -# The preferred way is to use make_circulant() directly -g <- make_circulant(10, c(1, 3)) -vcount(g) -ecount(g) - -# Root cause: -# - igraph added make_circulant() and constructor alias circulant() in v2.2.1.9003 -# - magic package also has a circulant() function for creating circulant matrices -# - When both packages are loaded, there's a namespace collision -# - This produces: Warning: replacing previous import 'igraph::circulant' by 'magic::circulant' - -# Assessment: -# - This is an inadvertent behavior change in igraph -# - The circulant() function is primarily a constructor alias -# - Users should use make_circulant() directly -# - Cascade package can resolve by explicitly importing magic::circulant in NAMESPACE diff --git a/revdep/examples/cascade-circulant-issue.md b/revdep/examples/cascade-circulant-issue.md deleted file mode 100644 index 82bc9c10175..00000000000 --- a/revdep/examples/cascade-circulant-issue.md +++ /dev/null @@ -1,33 +0,0 @@ -# Cascade namespace collision issue - -## Issue -Warning when loading both igraph and magic packages - -## Reproducible Example - -```r -library(igraph) - -# igraph now exports circulant() as a constructor alias -"circulant" %in% ls("package:igraph") -#> [1] TRUE - -# The preferred way is to use make_circulant() directly -g <- make_circulant(10, c(1, 3)) -vcount(g) -#> [1] 10 -ecount(g) -#> [1] 20 -``` - -## Root Cause -- igraph added `make_circulant()` and constructor alias `circulant()` in v2.2.1.9003 -- magic package also has a `circulant()` function for creating circulant matrices -- When both packages are loaded, there's a namespace collision -- This produces: `Warning: replacing previous import 'igraph::circulant' by 'magic::circulant'` - -## Assessment -- This is an inadvertent behavior change in igraph -- The `circulant()` function is primarily a constructor alias -- Users should use `make_circulant()` directly -- Cascade package can resolve by explicitly importing `magic::circulant` in NAMESPACE diff --git a/revdep/examples/cascade-issue-draft.md b/revdep/examples/cascade-issue-draft.md deleted file mode 100644 index 05b17f2bf97..00000000000 --- a/revdep/examples/cascade-issue-draft.md +++ /dev/null @@ -1,34 +0,0 @@ -# Title - -Namespace collision warning when loading Cascade with igraph ≥ 2.3.0 - -# Body - -When loading **Cascade** alongside **igraph** 2.3.0 or later the following warning appears: - -``` -Warning: replacing previous import 'igraph::circulant' by 'magic::circulant' when loading 'Cascade' -``` - -This is a **non-breaking warning** — Cascade continues to work correctly, but the warning may alarm users and will surface in `R CMD check`. - -## Root cause - -igraph 2.3.0 added `make_circulant()` and a constructor alias `circulant()`. -Because **magic** also exports `circulant()`, R detects a conflict between the two imports when Cascade is loaded. - -## Suggested fix - -Explicitly import `magic::circulant` in your NAMESPACE so that R resolves the conflict deterministically (and silently): - -```r -# In NAMESPACE, or equivalently in a roxygen2 tag somewhere in the package: -importFrom(magic, circulant) -``` - -That single line removes the warning entirely. - ---- - -*This issue was identified during reverse-dependency checks for the upcoming igraph 2.3.0 release. -See the igraph repository for full analysis: https://github.com/igraph/rigraph* diff --git a/revdep/examples/comato-layout-spring-issue.R b/revdep/examples/comato-layout-spring-issue.R new file mode 100644 index 00000000000..47596c11629 --- /dev/null +++ b/revdep/examples/comato-layout-spring-issue.R @@ -0,0 +1,31 @@ +# comato layout.spring() defunct +# Issue: comato:::plot.conceptmaps() passes layout = "spring", which dispatches +# to igraph::layout.spring() -- defunct since igraph 2.1.0. + +library(igraph) + +g <- make_ring(10) + +# Old call -- now defunct in igraph 2.1.0 +# layout.spring(g) +# Error: +# ! `layout.spring()` was deprecated in igraph 2.1.0 and is now defunct. +# i Please use `layout_with_fr()` instead. + +# Working replacement +coords <- layout_with_fr(g) +dim(coords) + +# Root cause: +# - layout.spring(), layout.svd(), and layout.fruchterman.reingold.grid() +# all advanced from deprecated to defunct in #2634 +# - comato hardcodes layout = "spring" in plot.conceptmaps() + +# Assessment: +# - Bug in comato -- references a layout function deprecated since 2.1.0 + +# Recommendation: +# - For comato: switch layout = "spring" to the Fruchterman-Reingold layout, +# either by passing layout = layout_with_fr or by computing coordinates +# beforehand. Also rename graph.union() -> union() to silence the +# remaining deprecation warning. diff --git a/revdep/examples/comato-layout-spring-issue.md b/revdep/examples/comato-layout-spring-issue.md new file mode 100644 index 00000000000..3f6cbd84543 --- /dev/null +++ b/revdep/examples/comato-layout-spring-issue.md @@ -0,0 +1,30 @@ +# comato layout.spring() defunct + +## Issue +`comato:::plot.conceptmaps()` passes `layout = "spring"`, which dispatches to `igraph::layout.spring()` — defunct since igraph 2.1.0. The package also still calls `graph.union()` (currently deprecated but slated to become defunct). + +## Reproducible Example + +```r +library(igraph) + +g <- make_ring(10) + +# Old call -- now defunct +layout.spring(g) +#> Error: +#> ! `layout.spring()` was deprecated in igraph 2.1.0 and is now defunct. +#> i Please use `layout_with_fr()` instead. + +# Working replacement +coords <- layout_with_fr(g) +``` + +## Root Cause +`layout.spring()`, `layout.svd()`, and `layout.fruchterman.reingold.grid()` all advanced from deprecated to defunct in [#2634](https://github.com/igraph/rigraph/pull/2634). comato hardcodes `layout = "spring"`. + +## Assessment +Bug in comato — references a layout function deprecated since igraph 2.1.0. + +## Recommendation +**For comato**: switch `layout = "spring"` to a Fruchterman–Reingold layout (e.g. `layout = layout_with_fr` or precompute coordinates). Also rename `graph.union()` → `union()` to silence the remaining deprecation warning. diff --git a/revdep/examples/cranly-eigen-centrality-scale-issue.R b/revdep/examples/cranly-eigen-centrality-scale-issue.R new file mode 100644 index 00000000000..249481bd24e --- /dev/null +++ b/revdep/examples/cranly-eigen-centrality-scale-issue.R @@ -0,0 +1,33 @@ +# cranly eigen_centrality(scale = ) defunct +# Issue: cranly:::summary.cranly_network() calls +# igraph::eigen_centrality(cranly_graph, scale = FALSE), defunct since 2.1.1. + +library(igraph) + +g <- sample_gnp(20, 0.3) + +# Old call -- now defunct in igraph 2.1.1 +# eigen_centrality(g, scale = FALSE) +# Error: +# ! The `scale` argument of `eigen_centrality()` always as if TRUE as of +# igraph 2.1.1. +# i Normalization is always performed + +# Working replacement +res <- eigen_centrality(g) +str(res$vector) + +# If raw (un-normalized) values are needed, rescale manually after the call +# (e.g. multiply by some reference value) + +# Root cause: +# - eigen_centrality(scale = ) was deprecated in 2.1.1 (#1543); normalization +# is now mandatory +# - Advanced from deprecate_warn to deprecate_stop in #2634 + +# Assessment: +# - Bug in cranly -- relies on an argument whose effect has been removed + +# Recommendation: +# - For cranly: drop the `scale = FALSE` argument. If un-normalized values +# are genuinely needed downstream, scale them manually afterwards. diff --git a/revdep/examples/cranly-eigen-centrality-scale-issue.md b/revdep/examples/cranly-eigen-centrality-scale-issue.md new file mode 100644 index 00000000000..78eeba6a8a9 --- /dev/null +++ b/revdep/examples/cranly-eigen-centrality-scale-issue.md @@ -0,0 +1,31 @@ +# cranly eigen_centrality(scale = ) defunct + +## Issue +`cranly:::summary.cranly_network()` calls `igraph::eigen_centrality(cranly_graph, scale = FALSE)`. Defunct since igraph 2.1.1. Breaks the `cranly.Rmd` vignette re-build. + +## Reproducible Example + +```r +library(igraph) + +g <- sample_gnp(20, 0.3) + +eigen_centrality(g, scale = FALSE) +#> Error: +#> ! The `scale` argument of `eigen_centrality()` always as if TRUE as of +#> igraph 2.1.1. +#> i Normalization is always performed + +# Working replacement +res <- eigen_centrality(g) +res$vector +``` + +## Root Cause +`eigen_centrality(scale = )` was deprecated in igraph 2.1.1 ([#1543](https://github.com/igraph/rigraph/pull/1543)); normalization is now mandatory. Advanced from `deprecate_warn` to `deprecate_stop` in [#2634](https://github.com/igraph/rigraph/pull/2634). + +## Assessment +Bug in cranly — relies on an argument whose effect has been removed. + +## Recommendation +**For cranly**: drop the `scale = FALSE` argument. If un-normalized values are needed downstream, rescale manually afterwards. diff --git a/revdep/examples/degreenet-reedmolloy-issue.R b/revdep/examples/degreenet-reedmolloy-issue.R new file mode 100644 index 00000000000..2ac8f74d750 --- /dev/null +++ b/revdep/examples/degreenet-reedmolloy-issue.R @@ -0,0 +1,49 @@ +# degreenet reedmolloy() fails through a defunct fallback method +# Issue: reedmolloy() retries via igraph::degree.sequence.game(method = +# "simple.no.multiple") whenever its first attempt with method = "vl" fails. +# That fallback value is defunct in dev igraph, so the retry loop never +# succeeds and reedmolloy reports its own error. + +library(degreenet) +library(igraph) + +set.seed(2) +s4 <- simpln(n = 100, v = c(-1, 1)) +table(s4) +#> 1 2 3 4 5 6 +#> 65 18 7 4 4 2 + +# Step 1: confirm the VL call deterministically fails on this sequence (this +# is NOT a regression -- VL only produces connected graphs, and s4's 65 +# degree-1 vertices preclude a connected configuration in practice). +# Verified against CRAN igraph 2.3.1: 50/50 VL attempts errored. +res_vl <- try(sample_degseq(s4, method = "vl"), silent = TRUE) +cat("VL succeeded:", !inherits(res_vl, "try-error"), "\n") + +# Step 2: the fallback path -- works on CRAN 2.3.1 (with a deprecation +# warning), but hard-errors on dev igraph. +# sample_degseq(s4, method = "simple.no.multiple") +# Error on dev: +# ! The `method` argument of `sample_degseq()` must be fast.heur.simple +# instead of simple.no.multiple as of igraph 2.1.0. + +# Step 3: proper replacement -- works on every igraph 2.x version. +g_new <- sample_degseq(s4, method = "fast.heur.simple") +vcount(g_new); ecount(g_new) + +# Putting it together: reedmolloy(s4) succeeds on CRAN 2.3.1 because the +# fallback path produces a (warned) graph; it fails on dev igraph because +# the fallback is now defunct and .catchToList() converts the error into a +# retry, exhausting maxit and triggering reedmolloy's own error message. + +# Root cause: +# - The lifecycle promotion of sample_degseq(method = "simple.no.multiple") +# from deprecate_warn to deprecate_stop in #2634. + +# Assessment: +# - Bug in degreenet -- depends on the obsolete fallback method name. + +# Recommendation: +# - For degreenet: replace the fallback method with "fast.heur.simple". +# Also rename degree.sequence.game() -> sample_degseq() and +# get.edgelist() -> as_edgelist(). diff --git a/revdep/examples/degreenet-reedmolloy-issue.md b/revdep/examples/degreenet-reedmolloy-issue.md new file mode 100644 index 00000000000..2c016797f0c --- /dev/null +++ b/revdep/examples/degreenet-reedmolloy-issue.md @@ -0,0 +1,50 @@ +# degreenet reedmolloy() fails through a defunct fallback method + +## Issue +``` +> simr <- reedmolloy(s4) +Error in reedmolloy(s4) : + The reedmolloy function failed to form a valid network from the passed degree sequence. +``` + +No `lifecycle::deprecate_stop` trace is visible in the log because `degreenet::reedmolloy()` wraps its inner igraph calls in `.catchToList()`, which converts errors into retry attempts. After `maxit = 10` failed retries, `reedmolloy` emits its own error. + +## Reproducible Example + +```r +library(degreenet) +library(igraph) +set.seed(2) +s4 <- simpln(n = 100, v = c(-1, 1)) +table(s4) +#> 1 2 3 4 5 6 +#> 65 18 7 4 4 2 + +# Against CRAN igraph 2.3.1: succeeds. +# Against dev igraph 2.3.1.9005: fails. +reedmolloy(s4) +``` + +## What is happening + +`reedmolloy` first calls `igraph::degree.sequence.game(deg, method = "vl")` and falls back to `method = "simple.no.multiple"` inside a jitter+retry loop if the first call errors: + +1. **The VL call deterministically fails on this sequence.** Verified against CRAN igraph 2.3.1: VL errored 50/50 times. This is *not* a regression — VL only produces connected graphs, and `s4`'s 65 degree-1 vertices preclude a connected configuration here. +2. **Against CRAN 2.3.1** the fallback `method = "simple.no.multiple"` produces an igraph object with a deprecation warning, so `reedmolloy(s4)` succeeds. +3. **Against dev igraph** the fallback hard-errors: + ``` + ! The `method` argument of `sample_degseq()` must be fast.heur.simple + instead of simple.no.multiple as of igraph 2.1.0. + ``` + `.catchToList()` swallows it, the loop reaches `maxit`, and `reedmolloy` emits its own error. + +## Root Cause +Lifecycle promotion of `sample_degseq(method = "simple.no.multiple")` from `deprecate_warn` to `deprecate_stop` in [#2634](https://github.com/igraph/rigraph/pull/2634). + +## Assessment +Bug in degreenet — depends on the obsolete fallback method name. + +## Recommendation +**For degreenet**: +- Replace the fallback `method = "simple.no.multiple"` with `method = "fast.heur.simple"`. +- While there, rename `degree.sequence.game()` → `sample_degseq()` and `get.edgelist()` → `as_edgelist()`. diff --git a/revdep/examples/diagrammer-neighbors-issue.R b/revdep/examples/diagrammer-neighbors-issue.R deleted file mode 100644 index 0f758d846bb..00000000000 --- a/revdep/examples/diagrammer-neighbors-issue.R +++ /dev/null @@ -1,36 +0,0 @@ -# DiagrammeR neighbors() issue -# Issue: neighbors() now requires exactly one vertex - -library(igraph) - -# Create a simple graph -g <- make_ring(5) - -# This works - single vertex -neighbors(g, 1) - -# This fails - multiple vertices -# neighbors(g, c(1, 2)) -# Error: `vid` must specify exactly one vertex - -# This also fails - passing a non-scalar -# degree_vals <- degree(g) -# neighbors(g, degree_vals) -# Error: `vid` must specify exactly one vertex - -# Root cause: -# - igraph added stricter validation requiring exactly one vertex for neighbors() -# - DiagrammeR's get_leverage_centrality() passes degree_vals (a vector) to neighbors() -# - The code: mean(degree_vals[igraph::neighbors(ig_graph, degree_vals)]) -# - This previously may have worked with implicit vectorization or used first element - -# Assessment: -# - This is an intentional API tightening in igraph for safety -# - DiagrammeR needs to update to iterate over vertices individually -# - The fix should loop: lapply(seq_along(degree_vals), function(i) neighbors(g, i)) - -# Recommendation for DiagrammeR: -# Change from: -# neighbors(ig_graph, degree_vals) -# To: -# lapply(seq_along(degree_vals), function(i) neighbors(ig_graph, i)) diff --git a/revdep/examples/diagrammer-neighbors-issue.md b/revdep/examples/diagrammer-neighbors-issue.md deleted file mode 100644 index cb71fd96977..00000000000 --- a/revdep/examples/diagrammer-neighbors-issue.md +++ /dev/null @@ -1,48 +0,0 @@ -# DiagrammeR neighbors() issue - -## Issue -`neighbors()` now requires exactly one vertex - -## Reproducible Example - -```r -library(igraph) - -# Create a simple graph -g <- make_ring(5) - -# This works - single vertex -neighbors(g, 1) -#> + 2/5 vertices, from 7bb1be6: -#> [1] 5 2 - -# This fails - multiple vertices -neighbors(g, c(1, 2)) -#> Error: `vid` must specify exactly one vertex - -# This also fails - passing a vector -degree_vals <- degree(g) -neighbors(g, degree_vals) -#> Error: `vid` must specify exactly one vertex -``` - -## Root Cause -- igraph added stricter validation requiring exactly one vertex for `neighbors()` -- DiagrammeR's `get_leverage_centrality()` passes `degree_vals` (a vector) to `neighbors()` -- The code: `mean(degree_vals[igraph::neighbors(ig_graph, degree_vals)])` -- This previously may have worked with implicit vectorization or used first element - -## Assessment -- This is an intentional API tightening in igraph for safety -- DiagrammeR needs to update to iterate over vertices individually -- The fix should loop: `lapply(seq_along(degree_vals), function(i) neighbors(g, i))` - -## Recommendation for DiagrammeR -Change from: -```r -neighbors(ig_graph, degree_vals) -``` -To: -```r -lapply(seq_along(degree_vals), function(i) neighbors(ig_graph, i)) -``` diff --git a/revdep/examples/ecol-hub-score-issue.R b/revdep/examples/ecol-hub-score-issue.R new file mode 100644 index 00000000000..d61c14df52f --- /dev/null +++ b/revdep/examples/ecol-hub-score-issue.R @@ -0,0 +1,30 @@ +# ECoL hub.score() defunct +# Issue: ECoL:::c.Hubs() calls igraph::hub.score(graph), defunct in igraph 2.0.0. + +library(igraph) + +g <- sample_gnp(20, 0.2, directed = TRUE) + +# Old call -- now defunct +# hub.score(g) +# Error: +# ! `hub.score()` was deprecated in igraph 2.0.0 and is now defunct. +# i Please use `hits_scores()` instead. + +# Working replacement +scores <- hits_scores(g) +str(scores$hub) +str(scores$authority) + +# Root cause: +# - hub.score() and authority.score() were deprecated in igraph 2.0.0, +# both replaced by hits_scores() which returns hub and authority together +# - Both advanced from deprecate_warn to deprecate_stop in #2634 + +# Assessment: +# - Bug in ECoL -- uses a function name deprecated for the entire 2.x series + +# Recommendation: +# - For ECoL: replace `igraph::hub.score(graph)` with +# `igraph::hits_scores(graph)$hub`. If authority.score() is used elsewhere, +# replace with `hits_scores(graph)$authority`. diff --git a/revdep/examples/ecol-hub-score-issue.md b/revdep/examples/ecol-hub-score-issue.md new file mode 100644 index 00000000000..1d8361de7d3 --- /dev/null +++ b/revdep/examples/ecol-hub-score-issue.md @@ -0,0 +1,31 @@ +# ECoL hub.score() defunct + +## Issue +`ECoL:::c.Hubs()` calls `igraph::hub.score(graph)`, defunct in igraph 2.0.0. Breaks examples and 3 tests. + +## Reproducible Example + +```r +library(igraph) + +g <- sample_gnp(20, 0.2, directed = TRUE) + +hub.score(g) +#> Error: +#> ! `hub.score()` was deprecated in igraph 2.0.0 and is now defunct. +#> i Please use `hits_scores()` instead. + +# Working replacement +scores <- hits_scores(g) +scores$hub +scores$authority +``` + +## Root Cause +`hub.score()` and `authority.score()` were deprecated in igraph 2.0.0 (both replaced by `hits_scores()`, which returns both vectors). Advanced from `deprecate_warn` to `deprecate_stop` in [#2634](https://github.com/igraph/rigraph/pull/2634). + +## Assessment +Bug in ECoL — uses a function name deprecated for the entire 2.x series. + +## Recommendation +**For ECoL**: replace `igraph::hub.score(graph)` with `igraph::hits_scores(graph)$hub`. Replace any `authority.score()` calls with `hits_scores(graph)$authority`. diff --git a/revdep/examples/frf2-deprecation-warnings-issue.R b/revdep/examples/frf2-deprecation-warnings-issue.R new file mode 100644 index 00000000000..f1e06375f2f --- /dev/null +++ b/revdep/examples/frf2-deprecation-warnings-issue.R @@ -0,0 +1,43 @@ +# FrF2 deprecation warnings leak into .Rout.save +# Issue: FrF2 calls multiple deprecated igraph functions. The warnings appear +# in test output and diverge from the checked-in .Rout.save reference file, +# producing a NOTE. + +library(igraph) + +# All of the following emit deprecation warnings (not errors) on current dev igraph: + +# graph.empty() -- deprecated 2.1.0 -> make_empty_graph() +g1 <- graph.empty(n = 5, directed = FALSE) + +# add.edges() -- deprecated 2.0.0 -> add_edges() +g2 <- add.edges(g1, c(1, 2, 2, 3)) + +# independence.number() -- deprecated 2.0.0 -> ivs_size() +independence.number(g2) + +# clique.number() -- deprecated 2.0.0 -> clique_num() +clique.number(g2) + +# Working replacements (no warnings): +g1b <- make_empty_graph(n = 5, directed = FALSE) +g2b <- add_edges(g1b, c(1, 2, 2, 3)) +ivs_size(g2b) +clique_num(g2b) + +# Root cause: +# - None of these are defunct yet; they emit warnings +# - FrF2's tests diff their .Rout output against a checked-in .Rout.save; +# any extra warning lines cause a "NOTE" from the diff + +# Assessment: +# - Bug in FrF2 -- uses long-deprecated function names; will hard-fail when +# any of these is promoted to defunct in a future lifecycle pass + +# Recommendation: +# - For FrF2: rename to the current API +# graph.empty() -> make_empty_graph() +# add.edges() -> add_edges() +# independence.number() -> ivs_size() +# clique.number() -> clique_num() +# Then regenerate godolphintest.Rout.save (and any other .Rout.save files). diff --git a/revdep/examples/frf2-deprecation-warnings-issue.md b/revdep/examples/frf2-deprecation-warnings-issue.md new file mode 100644 index 00000000000..9d7956db9e6 --- /dev/null +++ b/revdep/examples/frf2-deprecation-warnings-issue.md @@ -0,0 +1,52 @@ +# FrF2 deprecation warnings leak into .Rout.save + +## Issue +`checking tests ... NOTE` — FrF2's `godolphintest.Rout` diverges from `godolphintest.Rout.save` because multiple igraph deprecation warnings appear in the new output. + +``` +< 4: `clique.number()` was deprecated in igraph 2.0.0. +< ℹ Please use `clique_num()` instead. +< 1: `graph.empty()` was deprecated in igraph 2.1.0. +< 2: `add.edges()` was deprecated in igraph 2.0.0. +< 3: `independence.number()` was deprecated in igraph 2.0.0. +``` + +## Reproducible Example + +```r +library(igraph) + +# All emit deprecation warnings on current dev igraph +g1 <- graph.empty(n = 5, directed = FALSE) +#> Warning: `graph.empty()` was deprecated in igraph 2.1.0. ... +g2 <- add.edges(g1, c(1, 2, 2, 3)) +#> Warning: `add.edges()` was deprecated in igraph 2.0.0. ... +independence.number(g2) +#> Warning: `independence.number()` was deprecated in igraph 2.0.0. ... +clique.number(g2) +#> Warning: `clique.number()` was deprecated in igraph 2.0.0. ... + +# Working replacements (no warnings) +g1b <- make_empty_graph(n = 5, directed = FALSE) +g2b <- add_edges(g1b, c(1, 2, 2, 3)) +ivs_size(g2b) +clique_num(g2b) +``` + +## Root Cause +None of these functions are defunct yet — they emit warnings. FrF2's tests diff `.Rout` output against a checked-in `.Rout.save`; any extra warning lines surface as a NOTE. + +## Assessment +Bug in FrF2 — uses long-deprecated function names; will hard-fail when any of these is promoted to defunct in a future lifecycle pass. + +## Recommendation +**For FrF2**: + +| Deprecated | Replacement | +|---|---| +| `graph.empty()` | `make_empty_graph()` | +| `add.edges()` | `add_edges()` | +| `independence.number()` | `ivs_size()` | +| `clique.number()` | `clique_num()` | + +Then regenerate `godolphintest.Rout.save` (and any other `.Rout.save` files affected). diff --git a/revdep/examples/goodfitsbm-get-edge-ids-issue.R b/revdep/examples/goodfitsbm-get-edge-ids-issue.R new file mode 100644 index 00000000000..150434f2515 --- /dev/null +++ b/revdep/examples/goodfitsbm-get-edge-ids-issue.R @@ -0,0 +1,44 @@ +# GoodFitSBM get_edge_ids() matrix orientation defunct +# Issue: GoodFitSBM:::Get.Induced.Subgraph() calls igraph::get.edge.ids(g, pairs) +# where `pairs` is a 2 x n matrix. Since igraph 2.1.5, the matrix form must be +# n x 2; the old orientation is now defunct. + +library(igraph) + +g <- make_ring(6) + +# Old (2 x n) orientation -- now defunct +# pairs_old <- matrix(c(1, 2, +# 2, 3, +# 3, 4), nrow = 2) +# get_edge_ids(g, pairs_old) +# Error: +# ! The `vp` argument of `get_edge_ids()` supplied as a matrix should be a +# n times 2 matrix, not 2 times n as of igraph 2.1.5. +# i either transpose the matrix with t() or convert it to a data.frame with +# two columns. + +# Working replacement -- n x 2 matrix +pairs <- matrix(c(1, 2, + 2, 3, + 3, 4), ncol = 2, byrow = TRUE) +get_edge_ids(g, pairs) + +# Alternative: a 2-column data frame works too +get_edge_ids(g, as.data.frame(pairs)) + +# Or just a flat vertex-pair vector +get_edge_ids(g, c(1, 2, 2, 3, 3, 4)) + +# Root cause: +# - The matrix-form `vp` argument orientation was corrected in igraph 2.1.5 +# (deprecation warning then); now defunct via #2634 +# - GoodFitSBM constructs `pairs` in the old 2 x n orientation + +# Assessment: +# - Bug in GoodFitSBM -- passes the matrix in the no-longer-accepted orientation + +# Recommendation: +# - For GoodFitSBM: transpose with t() before the call, or pass a 2-column +# data frame, or flatten the matrix to a vector. Also rename the deprecated +# alias get.edge.ids() -> get_edge_ids(). diff --git a/revdep/examples/goodfitsbm-get-edge-ids-issue.md b/revdep/examples/goodfitsbm-get-edge-ids-issue.md new file mode 100644 index 00000000000..68b89f031e0 --- /dev/null +++ b/revdep/examples/goodfitsbm-get-edge-ids-issue.md @@ -0,0 +1,33 @@ +# GoodFitSBM get_edge_ids() matrix orientation defunct + +## Issue +`GoodFitSBM:::Get.Induced.Subgraph()` calls `igraph::get.edge.ids(g, pairs)` where `pairs` is a 2 × n matrix. Since igraph 2.1.5 the matrix form must be n × 2; the old orientation is now defunct. + +## Reproducible Example + +```r +library(igraph) + +g <- make_ring(6) + +# Old 2 x n orientation -- now defunct +pairs_old <- matrix(c(1, 2, 2, 3, 3, 4), nrow = 2) +get_edge_ids(g, pairs_old) +#> Error: +#> ! The `vp` argument of `get_edge_ids()` supplied as a matrix should be a +#> n times 2 matrix, not 2 times n as of igraph 2.1.5. + +# Working replacement -- n x 2 matrix +pairs <- matrix(c(1, 2, 2, 3, 3, 4), ncol = 2, byrow = TRUE) +get_edge_ids(g, pairs) +#> [1] 1 2 3 +``` + +## Root Cause +The matrix-form `vp` argument's orientation was corrected in igraph 2.1.5; the old form was deprecation-warning at first and is now defunct via [#2634](https://github.com/igraph/rigraph/pull/2634). + +## Assessment +Bug in GoodFitSBM — passes the matrix in the no-longer-accepted orientation. + +## Recommendation +**For GoodFitSBM**: transpose with `t()` before the call, or pass a 2-column data frame, or flatten the matrix to a vector. Also rename the deprecated alias `get.edge.ids()` → `get_edge_ids()`. diff --git a/revdep/examples/jewel-integer-issue.R b/revdep/examples/jewel-integer-issue.R deleted file mode 100644 index 16855eaf5d7..00000000000 --- a/revdep/examples/jewel-integer-issue.R +++ /dev/null @@ -1,43 +0,0 @@ -# jewel integer validation issue -# Issue: rewire_impl now strictly validates that n is an integer - -library(igraph) - -# Create a simple graph for testing -g <- make_ring(10) - -# This works - integer value -result1 <- rewire(g, keeping_degseq(niter = 100)) -vcount(result1) -ecount(result1) - -# This fails - non-integer value -# rewire(g, keeping_degseq(niter = 2.45)) -# Error: The value 2.4500000000000002 is not representable as an integer - -# Simulating jewel package scenario -p <- 49 -niter <- p * 0.05 # = 2.45 - -# This also fails -# rewire(g, keeping_degseq(niter = niter)) -# Error: The value 2.4500000000000002 is not representable as an integer - -# Workaround using as.integer() -result2 <- rewire(g, keeping_degseq(niter = as.integer(niter))) -vcount(result2) - -# Root cause: -# - rewire_impl() converts n with as.numeric(), preserving fractional parts -# - C code in rinterface_extra.c now strictly validates integer values -# - Previously may have silently truncated, now explicitly rejects - -# Assessment: -# - This uncovered a bug in the jewel package -# - niter should logically be an integer (number of iterations) -# - jewel should use ceiling(), floor(), or round() on computed niter - -# Recommendation: -# - Fix in jewel: niter <- ceiling(p * 0.05) -# - OR fix in igraph for backward compatibility: -# Add as.integer() in rewire_keeping_degseq() before calling rewire_impl() diff --git a/revdep/examples/jewel-integer-issue.md b/revdep/examples/jewel-integer-issue.md deleted file mode 100644 index 5e3db7cc9ea..00000000000 --- a/revdep/examples/jewel-integer-issue.md +++ /dev/null @@ -1,51 +0,0 @@ -# jewel integer validation issue - -## Issue -`rewire_impl` now strictly validates that n is an integer - -## Reproducible Example - -```r -library(igraph) - -# Create a simple graph for testing -g <- make_ring(10) - -# This works - integer value -result1 <- rewire(g, keeping_degseq(niter = 100)) -vcount(result1) -#> [1] 10 -ecount(result1) -#> [1] 10 - -# This fails - non-integer value -rewire(g, keeping_degseq(niter = 2.45)) -#> Error: The value 2.4500000000000002 is not representable as an integer - -# Simulating jewel package scenario -p <- 49 -niter <- p * 0.05 # = 2.45 - -# This also fails -rewire(g, keeping_degseq(niter = niter)) -#> Error: The value 2.4500000000000002 is not representable as an integer - -# Workaround using as.integer() -result2 <- rewire(g, keeping_degseq(niter = as.integer(niter))) -vcount(result2) -#> [1] 10 -``` - -## Root Cause -- `rewire_impl()` converts n with `as.numeric()`, preserving fractional parts -- C code in `rinterface_extra.c` now strictly validates integer values -- Previously may have silently truncated, now explicitly rejects - -## Assessment -- This uncovered a bug in the jewel package -- `niter` should logically be an integer (number of iterations) -- jewel should use `ceiling()`, `floor()`, or `round()` on computed niter - -## Recommendation -- Fix in jewel: `niter <- ceiling(p * 0.05)` -- OR fix in igraph for backward compatibility: Add `as.integer()` in `rewire_keeping_degseq()` before calling `rewire_impl()` diff --git a/revdep/examples/manynet-scalar-issue.R b/revdep/examples/manynet-scalar-issue.R deleted file mode 100644 index 3c190d47bfe..00000000000 --- a/revdep/examples/manynet-scalar-issue.R +++ /dev/null @@ -1,29 +0,0 @@ -# manynet scalar integer issue -# Issue: lastcit_game_impl expects scalar integer but receives vector - -library(igraph) - -# This works - scalar values -g1 <- sample_last_cit(n = 10, edges = 5, agebins = 10, directed = TRUE) -vcount(g1) -ecount(g1) - -# This fails - vector for edges parameter -# edges_vec <- c(5, 10) -# g2 <- sample_last_cit(n = 10, edges = edges_vec, agebins = 10, directed = TRUE) -# Error: Expecting a scalar integer but received a vector of length 2 - -# Root cause: -# - igraph added stricter validation for scalar parameters -# - C code in rinterface_extra.c now validates that scalar parameters are indeed scalars -# - manynet's generate_citations() may be passing a vector where scalar is expected - -# Assessment: -# - This is stricter type checking in igraph -# - manynet needs to ensure it passes scalar values to sample_last_cit() -# - The error message clearly indicates the parameter should be scalar - -# Recommendation for manynet: -# - Check generate_citations() implementation -# - Ensure 'edges' parameter is scalar: edges <- edges[1] or similar -# - Or iterate if multiple values are intended: lapply(edges_vec, function(e) sample_last_cit(...)) diff --git a/revdep/examples/manynet-scalar-issue.md b/revdep/examples/manynet-scalar-issue.md deleted file mode 100644 index 2692b34e3e7..00000000000 --- a/revdep/examples/manynet-scalar-issue.md +++ /dev/null @@ -1,37 +0,0 @@ -# manynet scalar integer issue - -## Issue -`lastcit_game_impl` expects scalar integer but receives vector - -## Reproducible Example - -```r -library(igraph) - -# This works - scalar values -g1 <- sample_last_cit(n = 10, edges = 5, agebins = 10, directed = TRUE) -vcount(g1) -#> [1] 10 -ecount(g1) -#> [1] 50 - -# This fails - vector for edges parameter -edges_vec <- c(5, 10) -g2 <- sample_last_cit(n = 10, edges = edges_vec, agebins = 10, directed = TRUE) -#> Error: Expecting a scalar integer but received a vector of length 2 -``` - -## Root Cause -- igraph added stricter validation for scalar parameters -- C code in `rinterface_extra.c` now validates that scalar parameters are indeed scalars -- manynet's `generate_citations()` may be passing a vector where scalar is expected - -## Assessment -- This is stricter type checking in igraph -- manynet needs to ensure it passes scalar values to `sample_last_cit()` -- The error message clearly indicates the parameter should be scalar - -## Recommendation for manynet -- Check `generate_citations()` implementation -- Ensure 'edges' parameter is scalar: `edges <- edges[1]` or similar -- Or iterate if multiple values are intended: `lapply(edges_vec, function(e) sample_last_cit(...))` diff --git a/revdep/examples/migraph-create-ring-width-issue.R b/revdep/examples/migraph-create-ring-width-issue.R new file mode 100644 index 00000000000..b0b9a39d393 --- /dev/null +++ b/revdep/examples/migraph-create-ring-width-issue.R @@ -0,0 +1,41 @@ +# migraph create_ring(width = ) deprecation surfacing as test failure +# Issue: a migraph tutorial test asserts that no code expression emits a +# warning; `migraph::create_ring(32, width = 2)` now emits an igraph +# deprecation warning, breaking the assertion. +# +# Note: create_ring() is migraph's own wrapper; it internally calls into +# igraph and the deprecation originates from there. Without reading the +# migraph source we can't pin down the exact igraph function involved -- +# it is most likely a call to a layout/constructor argument that was +# deprecated in a recent igraph release. + +# Reproducer requires migraph: +# install.packages("migraph") +# library(migraph) +# w <- NULL +# withCallingHandlers( +# { +# rg <- create_ring(32, width = 2) +# }, +# warning = function(c) { w <<- c; invokeRestart("muffleWarning") } +# ) +# w # On dev igraph: a condition +# # On CRAN igraph 2.3.1: NULL + +# Assessment: +# - Bug in migraph -- its create_ring() passes an argument or calls an +# igraph function whose argument/value is deprecated. +# - The failure is visible only because migraph's tutorial test asserts no +# warning. + +# Recommendation: +# - For migraph: read the warning message produced by +# create_ring(32, width = 2) +# under dev igraph to identify the deprecated argument or function it is +# relaying. Then either switch the internal implementation to the current +# API, or change how `width = 2` is interpreted to avoid the deprecated +# path. +# - If the deprecation comes from an igraph constructor used with width-like +# semantics, the canonical replacement is typically +# make_lattice(length = N, dim = 1, circular = TRUE, nei = W) +# for a "thicker ring" of order W. diff --git a/revdep/examples/migraph-create-ring-width-issue.md b/revdep/examples/migraph-create-ring-width-issue.md new file mode 100644 index 00000000000..2a77cf2ac82 --- /dev/null +++ b/revdep/examples/migraph-create-ring-width-issue.md @@ -0,0 +1,40 @@ +# migraph create_ring(width = ) deprecation surfacing as test failure + +## Issue +A migraph tutorial test asserts that no code expression in the tutorial emits a warning. `migraph::create_ring(32, width = 2)` now emits an igraph deprecation warning, breaking the assertion: + +``` +── Failure ('test-tutorials_migraph.R:12:5'): migraph tutorial code runs without warnings or errors ── +Expected `w` to be NULL. +... +Warning in expression 17 : rg <- create_ring(32, width = 2) +``` + +`create_ring()` is migraph's own wrapper; it internally calls into igraph and the deprecation originates from there. Without reading the migraph source the exact igraph function involved cannot be pinned down. + +## Reproducible Example + +```r +# install.packages("migraph") +library(migraph) + +w <- NULL +withCallingHandlers( + rg <- create_ring(32, width = 2), + warning = function(c) { w <<- c; invokeRestart("muffleWarning") } +) +w +# On dev igraph: a condition +# On CRAN igraph 2.3.1: NULL +``` + +## Root Cause +A function or argument called inside `migraph:::create_ring(width = ...)` was deprecated in a recent igraph release. The migraph tutorial does not catch this warning, and its strict no-warning assertion fails. + +## Assessment +Bug in migraph — its `create_ring()` passes an argument or calls an igraph function whose argument is deprecated. + +## Recommendation +**For migraph**: +1. Run `create_ring(32, width = 2)` against dev igraph and read the warning message to identify the deprecated function/argument being relayed. +2. Switch the internal implementation to the current API. If the deprecation is about a "thicker ring" / `width`-style argument on an igraph constructor, the canonical replacement is typically `make_lattice(length = N, dim = 1, circular = TRUE, nei = W)`. diff --git a/revdep/examples/nat-dfs-father-issue.R b/revdep/examples/nat-dfs-father-issue.R new file mode 100644 index 00000000000..77f851681ac --- /dev/null +++ b/revdep/examples/nat-dfs-father-issue.R @@ -0,0 +1,30 @@ +# nat dfs(father = ) defunct argument +# Issue: nat::as.seglist.igraph() calls igraph::dfs(x, father = TRUE), +# which became defunct in igraph 2.2.0. + +library(igraph) + +g <- make_tree(10, children = 2, mode = "out") + +# Mirrors the call in nat:::as.seglist.igraph -- now defunct +# dfs(g, root = 1, father = TRUE, mode = "all") +# Error: +# ! The `father` argument of `dfs()` was deprecated in igraph 2.2.0 and is +# now defunct. +# i Please use the `parent` argument instead. + +# Working replacement +res <- dfs(g, root = 1, parent = TRUE, mode = "all") +res$parent + +# Root cause: +# - dfs(father = ) was deprecated in igraph 2.2.0 +# - Advanced from deprecate_warn to deprecate_stop in #2634 +# - nat:::as.seglist.igraph() still calls dfs(x, root = origin, father = TRUE, mode = "all") + +# Assessment: +# - Direct caller (not a cascade), intentional API rename in igraph + +# Recommendation: +# - For nat: change `father = TRUE` to `parent = TRUE` in as.seglist.igraph() +# and update consumers of `res$father` to read `res$parent` instead. diff --git a/revdep/examples/nat-dfs-father-issue.md b/revdep/examples/nat-dfs-father-issue.md new file mode 100644 index 00000000000..f94727e2a87 --- /dev/null +++ b/revdep/examples/nat-dfs-father-issue.md @@ -0,0 +1,32 @@ +# nat dfs(father = ) defunct argument + +## Issue +`nat:::as.seglist.igraph()` calls `igraph::dfs(x, root = origin, father = TRUE, mode = "all")`, which is defunct in igraph 2.2.0. Breaks examples, 38 test failures, and the `neurons-intro.Rmd` vignette. + +## Reproducible Example + +```r +library(igraph) + +g <- make_tree(10, children = 2, mode = "out") + +# Mirrors the call in nat -- now defunct +dfs(g, root = 1, father = TRUE, mode = "all") +#> Error: +#> ! The `father` argument of `dfs()` was deprecated in igraph 2.2.0 and is +#> now defunct. +#> i Please use the `parent` argument instead. + +# Working replacement +dfs(g, root = 1, parent = TRUE, mode = "all")$parent +``` + +## Root Cause +- `dfs(father = )` was deprecated in igraph 2.2.0 in favour of `parent =`. +- Advanced from `deprecate_warn` to `deprecate_stop` in [#2634](https://github.com/igraph/rigraph/pull/2634). + +## Assessment +Direct caller (not a cascade). Intentional API rename in igraph. + +## Recommendation +**For nat**: change `father = TRUE` to `parent = TRUE` in `as.seglist.igraph()` and update any code reading `res$father` to read `res$parent`. diff --git a/revdep/examples/qgraph-sample-degseq-method-issue.R b/revdep/examples/qgraph-sample-degseq-method-issue.R new file mode 100644 index 00000000000..ddb7143f997 --- /dev/null +++ b/revdep/examples/qgraph-sample-degseq-method-issue.R @@ -0,0 +1,34 @@ +# qgraph sample_degseq(method = "simple.no.multiple") defunct +# Issue: qgraph::smallworldness() calls the deprecated alias +# igraph::degree.sequence.game(deg.dist, method = "simple.no.multiple"), +# which now hard-errors because the "simple.no.multiple" method value is defunct. + +library(igraph) + +deg <- c(rep(2, 10)) # any graphical degree sequence + +# Old call -- now defunct in igraph 2.1.0 +# sample_degseq(deg, method = "simple.no.multiple") +# Error: +# ! The `method` argument of `sample_degseq()` must be fast.heur.simple +# instead of simple.no.multiple as of igraph 2.1.0. + +# Working replacement -- new method name +g <- sample_degseq(deg, method = "fast.heur.simple") +vcount(g); ecount(g) + +# Root cause: +# - sample_degseq() had three legacy method values renamed in 2.1.0: +# "simple" -> "configuration" +# "simple.no.multiple" -> "fast.heur.simple" +# "simple.no.multiple.uniform"-> "configuration.simple" +# - All three advanced from deprecate_warn to deprecate_stop in #2634 + +# Assessment: +# - Bug in qgraph -- pinned to an obsolete method name + +# Recommendation: +# - For qgraph: switch to method = "fast.heur.simple". Also rename the +# deprecated alias degree.sequence.game() itself -> sample_degseq() to +# silence the upstream warnings (watts.strogatz.game, average.path.length, +# degree.sequence.game). diff --git a/revdep/examples/qgraph-sample-degseq-method-issue.md b/revdep/examples/qgraph-sample-degseq-method-issue.md new file mode 100644 index 00000000000..1fbd04c6c9e --- /dev/null +++ b/revdep/examples/qgraph-sample-degseq-method-issue.md @@ -0,0 +1,37 @@ +# qgraph sample_degseq(method = "simple.no.multiple") defunct + +## Issue +`qgraph::smallworldness()` calls `igraph::degree.sequence.game(deg.dist, method = "simple.no.multiple")`, which hard-errors because the `"simple.no.multiple"` method value is defunct as of igraph 2.1.0. + +## Reproducible Example + +```r +library(igraph) + +deg <- rep(2, 10) + +sample_degseq(deg, method = "simple.no.multiple") +#> Error: +#> ! The `method` argument of `sample_degseq()` must be fast.heur.simple +#> instead of simple.no.multiple as of igraph 2.1.0. + +# Working replacement +sample_degseq(deg, method = "fast.heur.simple") +``` + +## Root Cause +`sample_degseq()` had three legacy method values renamed in 2.1.0: + +| Old value | New value | +|---|---| +| `"simple"` | `"configuration"` | +| `"simple.no.multiple"` | `"fast.heur.simple"` | +| `"simple.no.multiple.uniform"` | `"configuration.simple"` | + +All three advanced from `deprecate_warn` to `deprecate_stop` in [#2634](https://github.com/igraph/rigraph/pull/2634). + +## Assessment +Bug in qgraph — pinned to an obsolete method name. + +## Recommendation +**For qgraph**: switch to `method = "fast.heur.simple"`. While there, replace the deprecated alias `degree.sequence.game()` itself with `sample_degseq()` to silence the upstream warnings (`watts.strogatz.game`, `average.path.length`, `degree.sequence.game`). diff --git a/revdep/examples/r6causal-attribute-deprecations-issue.R b/revdep/examples/r6causal-attribute-deprecations-issue.R new file mode 100644 index 00000000000..31532a2dce7 --- /dev/null +++ b/revdep/examples/r6causal-attribute-deprecations-issue.R @@ -0,0 +1,41 @@ +# R6causal install-time attribute setter deprecation warnings +# Issue: R6causal calls deprecated igraph attribute getters/setters at package +# load time, producing significant warnings during install and a WARNING from +# R CMD check `checking whether package can be installed`. + +library(igraph) + +g <- make_ring(5) + +# All three are deprecated (warn only -- not yet defunct): + +# set.edge.attribute() -- deprecated 2.0.0 -> set_edge_attr() +g <- set.edge.attribute(g, "weight", value = 1:5) + +# induced.subgraph() -- deprecated 2.0.0 -> induced_subgraph() +sub <- induced.subgraph(g, 1:3) + +# get.vertex.attribute() -- deprecated 2.0.0 -> vertex_attr() +get.vertex.attribute(sub, "name") + +# Working replacements: +g2 <- make_ring(5) +g2 <- set_edge_attr(g2, "weight", value = 1:5) +sub2 <- induced_subgraph(g2, 1:3) +vertex_attr(sub2, "name") + +# Root cause: +# - All three were deprecated in igraph 2.0.0 +# - Still emit warnings (not yet defunct), but R CMD check escalates the +# warnings to a package-install WARNING when they appear during .onLoad +# or otherwise at package-build time + +# Assessment: +# - Bug in R6causal -- replace with current API names; will hard-fail when +# any of these is promoted to defunct in a future lifecycle pass + +# Recommendation: +# - For R6causal: +# set.edge.attribute() -> set_edge_attr() +# induced.subgraph() -> induced_subgraph() +# get.vertex.attribute() -> vertex_attr() diff --git a/revdep/examples/r6causal-attribute-deprecations-issue.md b/revdep/examples/r6causal-attribute-deprecations-issue.md new file mode 100644 index 00000000000..4780a7591fa --- /dev/null +++ b/revdep/examples/r6causal-attribute-deprecations-issue.md @@ -0,0 +1,45 @@ +# R6causal install-time attribute setter deprecation warnings + +## Issue +``` +checking whether package ‘R6causal’ can be installed ... WARNING +Found the following significant warnings: + Warning: `set.edge.attribute()` was deprecated in igraph 2.0.0. + Warning: `induced.subgraph()` was deprecated in igraph 2.0.0. + Warning: `get.vertex.attribute()` was deprecated in igraph 2.0.0. +``` + +## Reproducible Example + +```r +library(igraph) + +g <- make_ring(5) + +g <- set.edge.attribute(g, "weight", value = 1:5) +#> Warning: `set.edge.attribute()` was deprecated in igraph 2.0.0. ... +sub <- induced.subgraph(g, 1:3) +#> Warning: `induced.subgraph()` was deprecated in igraph 2.0.0. ... +get.vertex.attribute(sub, "name") +#> Warning: `get.vertex.attribute()` was deprecated in igraph 2.0.0. ... + +# Working replacements +g2 <- set_edge_attr(make_ring(5), "weight", value = 1:5) +sub2 <- induced_subgraph(g2, 1:3) +vertex_attr(sub2, "name") +``` + +## Root Cause +All three were deprecated in igraph 2.0.0 and still emit warnings (not yet defunct). R CMD check surfaces them as a package-install WARNING because they appear during `.onLoad` / package-build time. + +## Assessment +Bug in R6causal — replace with current API names; will hard-fail when any of these is promoted to defunct. + +## Recommendation +**For R6causal**: + +| Deprecated | Replacement | +|---|---| +| `set.edge.attribute()` | `set_edge_attr()` | +| `induced.subgraph()` | `induced_subgraph()` | +| `get.vertex.attribute()` | `vertex_attr()` | diff --git a/revdep/examples/rspectral-modularity-issue.R b/revdep/examples/rspectral-modularity-issue.R deleted file mode 100644 index e0ae10ff12c..00000000000 --- a/revdep/examples/rspectral-modularity-issue.R +++ /dev/null @@ -1,56 +0,0 @@ -# rSpectral modularity calculation issue -# Issue: Modularity values have changed due to automatic weight detection - -library(igraph) - -# Create a test graph -g <- make_full_graph(5) + make_full_graph(5) + make_full_graph(5) -membership <- c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3) - -# Test 1: Modularity without weights -mod1 <- modularity(g, membership, weights = NULL) -mod1 - -# Test 2: Modularity with default (may use weights if present) -mod2 <- modularity(g, membership) -mod2 - -# Add weights to demonstrate the issue -E(g)$weight <- 1.0 -mod3 <- modularity(g, membership) -mod3 - -# Different weights -set.seed(42) -E(g)$weight <- runif(ecount(g)) -mod4 <- modularity(g, membership) -mod4 - -# Test: weights = NULL doesn't disable auto-detection! -mod5 <- modularity(g, membership, weights = NULL) -mod5 # Same as mod4, not mod1! - -# WORKAROUND: Using weights = numeric() to disable auto-detection -mod6 <- modularity(g, membership, weights = numeric()) -mod6 # Matches mod1! - -# Root cause: -# - igraph v2.2.1.9004 added: 'Use "weights" edge attribute in modularity() if available' -# - modularity() now automatically uses edge weights if present -# - weights = NULL doesn't disable this auto-detection -# - numeric() is not NULL (skips auto-detection), but !all(is.na(numeric())) is FALSE, -# so weights gets set to NULL internally - -# Assessment: -# - This is an inadvertent behavior change in igraph -# - Modularity differences are small but significant for exact tests -# - Expected: 0.408, Actual: 0.432 (difference: +0.024) -# - Expected: 0.3776, Actual: 0.3758 (difference: -0.0018) - -# Recommendation for rSpectral: -# 1. Update saved graph objects using upgrade_graph() -# 2. Review whether graphs should have weights or not -# 3. WORKAROUND: Use weights = numeric() to get unweighted modularity -# Example: modularity(g, membership, weights = numeric()) -# 4. Or remove unintended weights: g <- delete_edge_attr(g, 'weight') -# 5. Update expected test values if the new weighted modularity is correct diff --git a/revdep/examples/rspectral-modularity-issue.md b/revdep/examples/rspectral-modularity-issue.md deleted file mode 100644 index ca934b0836f..00000000000 --- a/revdep/examples/rspectral-modularity-issue.md +++ /dev/null @@ -1,55 +0,0 @@ -# rSpectral modularity calculation issue - -## Issue -Modularity values have changed due to automatic weight detection - -## Reproducible Example - -```r -library(igraph) - -# Create a test graph -g <- make_full_graph(5) + make_full_graph(5) + make_full_graph(5) -membership <- c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3) - -# Test 1: Modularity without weights -mod1 <- modularity(g, membership, weights = NULL) -mod1 -#> [1] 0.6666667 - -# Add weights to demonstrate the issue -set.seed(42) -E(g)$weight <- runif(ecount(g)) -mod2 <- modularity(g, membership) -mod2 -#> [1] 0.6663506 - -# Test: weights = NULL doesn't disable auto-detection! -mod3 <- modularity(g, membership, weights = NULL) -mod3 # Same as mod2, not mod1! -#> [1] 0.6663506 - -# WORKAROUND: Using weights = numeric() to disable auto-detection -mod4 <- modularity(g, membership, weights = numeric()) -mod4 # Matches mod1! -#> [1] 0.6666667 -``` - -## Root Cause -- igraph v2.2.1.9004 added: 'Use "weights" edge attribute in modularity() if available' -- `modularity()` now automatically uses edge weights if present -- `weights = NULL` doesn't disable this auto-detection -- `numeric()` is not NULL (skips auto-detection), but `!all(is.na(numeric()))` is FALSE, so weights gets set to NULL internally - -## Assessment -- This is an inadvertent behavior change in igraph -- Modularity differences are small but significant for exact tests -- Expected: 0.408, Actual: 0.432 (difference: +0.024) -- Expected: 0.3776, Actual: 0.3758 (difference: -0.0018) - -## Recommendation for rSpectral -1. Update saved graph objects using `upgrade_graph()` -2. Review whether graphs should have weights or not -3. WORKAROUND: Use `weights = numeric()` to get unweighted modularity -4. Or remove unintended weights: `g <- delete_edge_attr(g, 'weight')` -5. Update expected test values if the new weighted modularity is correct diff --git a/revdep/examples/sfnetworks-from-issue.R b/revdep/examples/sfnetworks-from-issue.R deleted file mode 100644 index 6b2cb1e707f..00000000000 --- a/revdep/examples/sfnetworks-from-issue.R +++ /dev/null @@ -1,30 +0,0 @@ -# sfnetworks all_shortest_paths() issue -# Issue: from parameter must specify exactly one vertex - -library(igraph) - -# Create a simple graph -g <- make_ring(5) - -# This works - single vertex -paths1 <- all_shortest_paths(g, from = 1, to = 3) -length(paths1$res) - -# This fails - multiple vertices in 'from' -# paths2 <- all_shortest_paths(g, from = c(1, 2), to = 3) -# Error: `from` must specify exactly one vertex - -# Root cause: -# - igraph added stricter validation requiring exactly one vertex for 'from' parameter -# - sfnetworks passes multiple vertices to all_shortest_paths() -# - Previously may have used only the first vertex implicitly - -# Assessment: -# - This is an intentional API tightening in igraph for safety and clarity -# - sfnetworks needs to handle multiple 'from' vertices explicitly -# - The function should iterate or be clear about using only the first vertex - -# Recommendation for sfnetworks: -# - If only first vertex intended: from <- from[1] -# - If all vertices intended: lapply(from, function(f) all_shortest_paths(g, from = f, to = to)) -# - Or provide clear warning/error about multiple vertices diff --git a/revdep/examples/sfnetworks-from-issue.md b/revdep/examples/sfnetworks-from-issue.md deleted file mode 100644 index d1fa038f1a5..00000000000 --- a/revdep/examples/sfnetworks-from-issue.md +++ /dev/null @@ -1,37 +0,0 @@ -# sfnetworks all_shortest_paths() issue - -## Issue -`from` parameter must specify exactly one vertex - -## Reproducible Example - -```r -library(igraph) - -# Create a simple graph -g <- make_ring(5) - -# This works - single vertex -paths1 <- all_shortest_paths(g, from = 1, to = 3) -length(paths1$res) -#> [1] 2 - -# This fails - multiple vertices in 'from' -paths2 <- all_shortest_paths(g, from = c(1, 2), to = 3) -#> Error: `from` must specify exactly one vertex -``` - -## Root Cause -- igraph added stricter validation requiring exactly one vertex for 'from' parameter -- sfnetworks passes multiple vertices to `all_shortest_paths()` -- Previously may have used only the first vertex implicitly - -## Assessment -- This is an intentional API tightening in igraph for safety and clarity -- sfnetworks needs to handle multiple 'from' vertices explicitly -- The function should iterate or be clear about using only the first vertex - -## Recommendation for sfnetworks -- If only first vertex intended: `from <- from[1]` -- If all vertices intended: `lapply(from, function(f) all_shortest_paths(g, from = f, to = to))` -- Or provide clear warning/error about multiple vertices diff --git a/revdep/examples/tidygraph-bfs-father-issue.R b/revdep/examples/tidygraph-bfs-father-issue.R new file mode 100644 index 00000000000..c1845a043c7 --- /dev/null +++ b/revdep/examples/tidygraph-bfs-father-issue.R @@ -0,0 +1,37 @@ +# tidygraph bfs(father = ) defunct argument +# Issue: tidygraph's map_bfs* / map_dfs* family pass `father = TRUE` to +# igraph::bfs() / dfs(), which became defunct in igraph 2.2.0. + +library(igraph) + +g <- make_tree(10, children = 2, mode = "out") + +# Old call -- now defunct in igraph 2.2.0 +# bfs(g, root = 1, father = TRUE) +# Error: +# ! The `father` argument of `bfs()` was deprecated in igraph 2.2.0 and is +# now defunct. +# i Please use the `parent` argument instead. + +# Working replacement +res <- bfs(g, root = 1, parent = TRUE) +res$parent + +# Same change applies to dfs() +res2 <- dfs(g, root = 1, parent = TRUE) +res2$parent + +# Root cause: +# - bfs(father = ) and dfs(father = ) were deprecated in igraph 2.2.0 +# - Both advanced from deprecate_warn to deprecate_stop in #2634 +# - tidygraph's internal helper bfs_df() still uses `father = TRUE` + +# Assessment: +# - Intentional API rename in igraph +# - tidygraph is the root of the visible cascade -- dci, ggraph, scistreer +# all funnel through tidygraph::map_bfs* + +# Recommendation: +# - For tidygraph: rename `father` -> `parent` in every igraph::bfs() and +# igraph::dfs() call, and update any code that reads `$father` from the +# result to read `$parent` instead. diff --git a/revdep/examples/tidygraph-bfs-father-issue.md b/revdep/examples/tidygraph-bfs-father-issue.md new file mode 100644 index 00000000000..cda374a4efa --- /dev/null +++ b/revdep/examples/tidygraph-bfs-father-issue.md @@ -0,0 +1,36 @@ +# tidygraph bfs(father = ) defunct argument + +## Issue +`tidygraph::map_bfs*()` / `map_dfs*()` call `igraph::bfs(..., father = TRUE)`, which is defunct in igraph 2.2.0. The same call breaks the dci, ggraph, and scistreer downstream packages. + +## Reproducible Example + +```r +library(igraph) + +g <- make_tree(10, children = 2, mode = "out") + +# Old call -- now defunct +bfs(g, root = 1, father = TRUE) +#> Error: +#> ! The `father` argument of `bfs()` was deprecated in igraph 2.2.0 and is +#> now defunct. +#> i Please use the `parent` argument instead. + +# Working replacement +res <- bfs(g, root = 1, parent = TRUE) +res$parent +#> + 10/10 vertices, from : +#> [1] NA 1 1 2 2 3 3 4 4 5 +``` + +## Root Cause +- `bfs(father = )` and `dfs(father = )` were deprecated in igraph 2.2.0 in favour of `parent =`. +- Both advanced from `deprecate_warn` to `deprecate_stop` in [#2634](https://github.com/igraph/rigraph/pull/2634). +- `tidygraph:::bfs_df()` still passes `father = TRUE`. + +## Assessment +Intentional API rename in igraph. tidygraph is the root of the visible cascade — dci, ggraph, and scistreer all funnel through `tidygraph::map_bfs*`. + +## Recommendation +**For tidygraph**: rename `father` → `parent` in every `igraph::bfs()` and `igraph::dfs()` call, and update any code reading `$father` from the result to read `$parent` instead. Once tidygraph releases the fix, dci/ggraph/scistreer pass without changes. diff --git a/revdep/examples/vkr-get-edge-missing-issue.R b/revdep/examples/vkr-get-edge-missing-issue.R new file mode 100644 index 00000000000..0b297bb7807 --- /dev/null +++ b/revdep/examples/vkr-get-edge-missing-issue.R @@ -0,0 +1,30 @@ +# vkR igraph::get.edge missing +# Issue: vkR references igraph::get.edge, which has been removed. + +library(igraph) + +g <- make_ring(5) + +# Old call -- function has been removed +# igraph::get.edge(g, 1) +# Error: 'get.edge' is not an exported object from 'namespace:igraph' + +# Working replacement +ends(g, 1) # endpoints of edge 1 +ends(g, 1:3) # ends() is vectorised over edges + +# Root cause: +# - get.edge() was hard-deprecated and is now removed +# - Replacement is ends(graph, es) which is vectorised +# - vkR still references igraph::get.edge somewhere -- R CMD check surfaces it +# as `Missing or unexported object: 'igraph::get.edge'` + +# Assessment: +# - Bug in vkR -- references a function that no longer exists +# - Surfaces as a WARNING (in `checking dependencies in R code`); will become +# an error if/when the affected code path is exercised. + +# Recommendation: +# - For vkR: replace igraph::get.edge(graph, e) with igraph::ends(graph, e). +# Note that ends() accepts vectors of edges and returns an n x 2 matrix, +# so single-edge callers may need to extract the first row. diff --git a/revdep/examples/vkr-get-edge-missing-issue.md b/revdep/examples/vkr-get-edge-missing-issue.md new file mode 100644 index 00000000000..5fbcbd87ebe --- /dev/null +++ b/revdep/examples/vkr-get-edge-missing-issue.md @@ -0,0 +1,34 @@ +# vkR igraph::get.edge missing + +## Issue +``` +checking dependencies in R code ... WARNING + Missing or unexported object: 'igraph::get.edge' +``` + +`get.edge()` has been removed from igraph; `ends()` is its replacement. + +## Reproducible Example + +```r +library(igraph) + +g <- make_ring(5) + +igraph::get.edge(g, 1) +#> Error: 'get.edge' is not an exported object from 'namespace:igraph' + +# Working replacement +ends(g, 1) +#> [,1] [,2] +#> [1,] 1 2 +``` + +## Root Cause +`get.edge()` was hard-deprecated and removed. The replacement, `ends()`, has been the canonical API since igraph 1.x. + +## Assessment +Bug in vkR — references a function that no longer exists. Currently a WARNING; will become an error if/when the affected code path is exercised. + +## Recommendation +**For vkR**: replace `igraph::get.edge(graph, e)` with `igraph::ends(graph, e)`. `ends()` accepts a vector of edges and returns an n × 2 matrix, so single-edge callers may need `[1, ]`. diff --git a/revdep/problems-analysis.md b/revdep/problems-analysis.md index 5b68ad1fe79..0b4d06aa987 100644 --- a/revdep/problems-analysis.md +++ b/revdep/problems-analysis.md @@ -1,275 +1,407 @@ # Analysis of Reverse Dependency Problems -This document provides minimal reproducible examples and analysis for packages that now fail their checks compared to the most recent CRAN version. +This document provides analysis and recommended fixes for the packages flagged as **newly broken** in the most recent `revdepcheck` run against the development version of igraph. -**Note**: Runnable R scripts and markdown outputs demonstrating each issue can be found in the `examples/` directory. A draft response to the CRAN review email is in `cran-response-draft.md`. +Source data: [`problems.md`](problems.md), [`failures.md`](failures.md), [`cran.md`](cran.md), [`README.md`](README.md). Runnable reproducers and reprex-style outputs for each issue are in [`examples/`](examples/). ## Summary -Six packages have newly broken checks in our revdepcheck run; two additional packages (rgph, tmap.networks) appeared in the CRAN win-builder check: -1. **Cascade** (v2.3): Namespace collision warning -2. **DiagrammeR** (v1.0.11): `neighbors()` requires exactly one vertex -3. **jewel** (v2.0.2): Error due to strict integer validation -4. **manynet** (v1.7.0): Scalar integer validation in `sample_last_cit()` -5. **rSpectral** (v1.0.0.14): Test failures due to modularity calculation changes -6. **sfnetworks** (v0.6.5): `from` parameter requires exactly one vertex -7. **rgph** (v0.1.0): Under investigation (igraph is `Suggests` only; win-builder failure) -8. **tmap.networks** (v0.1): Cascading failure from sfnetworks +15 CRAN packages are newly broken. The dominant cause is a **single change in igraph's `Chore` advancing many already-deprecated functions and arguments from the `deprecated` lifecycle stage (a warning) to `defunct` (a hard error)**. Five distinct flavours appear: -## 1. Cascade - Namespace Collision Warning +| # | Group | Packages | +|---|---|---| +| A | `bfs/dfs(father = )` argument defunct in 2.2.0 | tidygraph, nat, dci, ggraph, scistreer | +| B | Defunct top-level functions (rename in caller) | comato, ECoL, vkR | +| C | Defunct argument values / behaviors on retained functions | cranly, qgraph, GoodFitSBM | +| D | Deprecation warnings surfacing as NOTE/WARNING | FrF2, R6causal, migraph | +| E | Indirect path through a defunct fallback | degreenet | -### Issue +(10 additional packages are listed under "failed to check" in [`README.md`](README.md); these are install-time failures unrelated to igraph and are out of scope for this analysis.) + +--- + +## Group A — `bfs/dfs(father = )` argument defunct (igraph 2.2.0) + +The `father` argument of `bfs()` and `dfs()` was renamed to `parent` in igraph 2.2.0 (deprecation warning then) and is now defunct (hard error). Affected packages call either function directly, or via `tidygraph::map_bfs*` / `map_dfs*`. + +### 1. tidygraph (1.3.1) + +#### Issue +``` +! The `father` argument of `bfs()` was deprecated in igraph 2.2.0 and is + now defunct. +ℹ Please use the `parent` argument instead. ``` -Warning: replacing previous import 'igraph::circulant' by 'magic::circulant' when loading 'Cascade' +Triggered from `tidygraph:::bfs_df()`, which calls `igraph::bfs(..., father = ...)`. Breaks examples and tests. + +#### Root cause +Lifecycle advancement of the `father` argument from `deprecate_warn` to `deprecate_stop`. + +#### Assessment +**Intentional API rename in igraph.** tidygraph is the root of the visible cascade — dci, ggraph, and scistreer all funnel through tidygraph's `map_bfs*` family. + +#### Recommendation +**For tidygraph**: rename `father` → `parent` in every call to `igraph::bfs()` and `igraph::dfs()`. + +**Severity**: High — package broken; blocks several downstream packages. + +--- + +### 2. nat (1.8.25) + +#### Issue +Same defunct-argument error as tidygraph, but from a direct call: +```r +igraph::dfs(x, root = origin, father = TRUE, mode = "all") ``` +in `nat:::as.seglist.igraph()`. Breaks examples, 38 test failures, vignette `neurons-intro.Rmd`. + +#### Root cause +Same as tidygraph — `father=` is defunct. + +#### Assessment +**Intentional API rename in igraph.** Direct caller; not a cascade. + +#### Recommendation +**For nat**: change to `igraph::dfs(x, root = origin, parent = TRUE, mode = "all")` (and update any downstream code that consumes the returned `father` element to read `parent` instead). + +**Severity**: High. -### Root Cause -igraph added `make_circulant()` and its constructor alias `circulant()` in version 2.2.1.9003, creating a namespace collision with `magic::circulant()`. +--- + +### 3. dci (1.0.3) + +#### Issue +Same error message; reached via `tidygraph::map_bfs()` in `dci:::node_labeling()`. Breaks examples, 3 tests, and the `user_guide.Rmd` vignette. + +#### Root cause +Cascade through tidygraph. + +#### Assessment +**Cascading failure** — will be resolved automatically once tidygraph updates. + +#### Recommendation +No direct fix needed in dci. Bump the minimum tidygraph version once tidygraph ships a fix. + +**Severity**: High (broken), but resolved on tidygraph release. + +--- + +### 4. ggraph (2.2.2) -### Assessment -**Inadvertent behavior change in igraph, not a bug in Cascade.** +#### Issue +Same error; via `tidygraph::map_bfs_chr()` / `map_bfs_back_chr()` used inside ggraph's examples and `Edges.Rmd` vignette. -The `circulant` function is exported as a constructor alias. Users should use `make_circulant()` directly. +#### Root cause +Cascade through tidygraph. -### Recommendation -- **For Cascade**: Explicitly import `magic::circulant` in NAMESPACE -- **For igraph**: Consider unexported the constructor alias or document this known collision +#### Assessment +**Cascading failure**. -**Severity**: Low - Warning only, no functionality broken +#### Recommendation +No direct fix needed in ggraph. Will be resolved by the tidygraph release. + +**Severity**: High (broken), but resolved on tidygraph release. + +--- + +### 5. scistreer (1.2.1) + +#### Issue +Same error; via `tidygraph::map_bfs()` inside `scistreer::annotate_tree() → mut_to_tree()`. Breaks examples. + +#### Root cause +Cascade through tidygraph. + +#### Assessment +**Cascading failure**. + +#### Recommendation +No direct fix needed in scistreer. Will be resolved by the tidygraph release. + +**Severity**: High (broken), but resolved on tidygraph release. --- -## 2. DiagrammeR - neighbors() Requires Single Vertex +## Group B — Defunct top-level functions + +### 6. comato (1.1) -### Issue +#### Issue ``` -Error in `igraph::neighbors()`: -! `vid` must specify exactly one vertex +! `layout.spring()` was deprecated in igraph 2.1.0 and is now defunct. +ℹ Please use `layout_with_fr()` instead. ``` +Triggered from `comato:::plot.conceptmaps()` which passes `layout = "spring"` to `plot()`, which dispatches to `igraph::layout.spring()`. Also still emits a deprecation warning for `graph.union()`. -### Root Cause -igraph added stricter validation requiring exactly one vertex for `neighbors()`. DiagrammeR's `get_leverage_centrality()` passes a vector to `neighbors()`, which previously may have used implicit vectorization or only the first element. +#### Root cause +`layout.spring()` advanced to defunct (also `layout.svd()` and `layout.fruchterman.reingold.grid()` in the same lifecycle pass). -### Assessment -**Intentional API tightening in igraph for safety and clarity.** +#### Assessment +**Bug in comato** — references a layout function that has been deprecated since igraph 2.1.0. -The code `mean(degree_vals[igraph::neighbors(ig_graph, degree_vals)])` attempts to pass a vector where a scalar is expected. +#### Recommendation +**For comato**: replace `layout.spring()` with `layout_with_fr()` (and address the `graph.union()` → `union()` warning at the same time). -### Recommendation -**For DiagrammeR**: Iterate over vertices individually: -```r -# Change from: -neighbors(ig_graph, degree_vals) +**Severity**: High — example error. + +--- -# To: -lapply(seq_along(degree_vals), function(i) neighbors(ig_graph, i)) +### 7. ECoL (0.3.0) + +#### Issue +``` +! `hub.score()` was deprecated in igraph 2.0.0 and is now defunct. +ℹ Please use `hits_scores()` instead. ``` +Triggered from `ECoL:::c.Hubs()` → `igraph::hub.score(graph)`. Breaks examples and 3 tests. -**Severity**: High - Package functionality broken +#### Root cause +`hub.score()` and `authority.score()` both advanced from deprecated to defunct; both replaced by `hits_scores()`. + +#### Assessment +**Bug in ECoL** — uses a function name deprecated since igraph 2.0.0. + +#### Recommendation +**For ECoL**: replace `igraph::hub.score(graph)` with `igraph::hits_scores(graph)$hub`. (And if `authority.score()` is also used elsewhere, replace with `hits_scores(graph)$authority`.) + +**Severity**: High — example and test errors. --- -## 3. jewel - Integer Validation Error +### 8. vkR (0.2) -### Issue +#### Issue ``` -Error in rewire_impl(rewire = graph, n = niter, mode = mode) : - The value 2.4500000000000002 is not representable as an integer. Invalid value +checking dependencies in R code ... WARNING + Missing or unexported object: 'igraph::get.edge' ``` -### Minimal Reproducible Example -See `examples/jewel-integer-issue.R` and `.md` +#### Root cause +`get.edge()` was hard-deprecated and then removed from igraph (NEWS: "`get.edge()` has been removed"). The replacement is `ends()`. -### Root Cause -- `rewire_impl()` converts n with `as.numeric()`, preserving fractional parts -- C code now strictly validates that numeric values are representable as integers -- Previously may have silently truncated, now explicitly rejects +#### Assessment +**Bug in vkR** — references a function that no longer exists. -### Assessment -**This uncovered a bug in the jewel package.** +#### Recommendation +**For vkR**: replace `igraph::get.edge(graph, e)` with `igraph::ends(graph, e)` (note the call signature changed — see `?ends`). -The `niter` parameter should logically be an integer (number of iterations). jewel computes `niter <- p * 0.05` which results in non-integer values. +**Severity**: Medium — R CMD check WARNING; will become an error if/when the affected code path is exercised. -### Recommendation -**For jewel**: Use integer rounding: -```r -niter <- ceiling(p * 0.05) # or floor() or round() +--- + +## Group C — Defunct argument values / behaviors on retained functions + +### 9. cranly (0.6.0) + +#### Issue ``` +The `scale` argument of `eigen_centrality()` always as if TRUE as of +igraph 2.1.1. +ℹ Normalization is always performed +``` +Triggered from `summary.cranly_network()` via `igraph::eigen_centrality(cranly_graph, scale = FALSE)`. Breaks the `cranly.Rmd` vignette re-build. + +#### Root cause +`eigen_centrality(scale = )` was deprecated in igraph 2.1.1 (#1543) and is now defunct: normalization is now mandatory. -**For igraph** (backward compatibility option): Add `as.integer()` in `rewire_keeping_degseq()` before calling `rewire_impl()`. +#### Assessment +**Bug in cranly** — relies on an argument whose effect has been removed. -**Severity**: High - Package functionality broken +#### Recommendation +**For cranly**: drop the `scale = FALSE` argument: `igraph::eigen_centrality(cranly_graph)`. If un-normalized values are genuinely needed downstream, scale them manually afterwards. + +**Severity**: High — vignette error. --- -## 4. manynet - Scalar Integer Validation +### 10. qgraph (1.9.8) -### Issue +#### Issue ``` -Error in `lastcit_game_impl(...)`: -Expecting a scalar integer but received a vector of length 2. +! The `method` argument of `sample_degseq()` must be fast.heur.simple + instead of simple.no.multiple as of igraph 2.1.0. ``` +Triggered from `qgraph::smallworldness()` via the deprecated alias `igraph::degree.sequence.game(deg.dist, method = "simple.no.multiple")`. -### Root Cause -igraph added stricter validation for scalar parameters. The C code now validates that parameters expecting scalars are indeed scalars, not vectors. +#### Root cause +`sample_degseq()` had three legacy method values (`"simple"`, `"simple.no.multiple"`, `"simple.no.multiple.uniform"`) which were renamed in 2.1.0 and have now been advanced to defunct (`deprecate_stop`). -### Assessment -**Stricter type checking in igraph.** +#### Assessment +**Bug in qgraph** — pinned to an obsolete method name. -manynet's `generate_citations()` may be passing a vector where a scalar is expected. +#### Recommendation +**For qgraph**: replace `method = "simple.no.multiple"` with `method = "fast.heur.simple"`. While there, replace the deprecated alias `degree.sequence.game()` itself with `sample_degseq()` to silence the upstream warnings (`watts.strogatz.game`, `average.path.length`, `degree.sequence.game`). -### Recommendation -**For manynet**: Ensure scalar values: -```r -# If only first value intended: -edges <- edges[1] +**Severity**: High — example error. + +--- + +### 11. GoodFitSBM (0.0.1) -# If multiple values intended, iterate: -lapply(edges_vec, function(e) sample_last_cit(n, edges = e, ...)) +#### Issue ``` +! The `vp` argument of `get_edge_ids()` supplied as a matrix should be a + n times 2 matrix, not 2 times n as of igraph 2.1.5. +ℹ either transpose the matrix with t() or convert it to a data.frame with two + columns. +``` +Triggered from `GoodFitSBM:::Get.Induced.Subgraph()` via `igraph::get.edge.ids(g, pairs)`. -**Severity**: High - Package functionality broken +#### Root cause +The matrix-form `vp` argument's orientation was corrected in igraph 2.1.5 (previously 2×n, now n×2). The behavior was deprecation-warning at first; this lifecycle pass advanced it to defunct. ---- +#### Assessment +**Bug in GoodFitSBM** — passes the matrix in the old, no-longer-accepted orientation. -## 5. rSpectral - Modularity Calculation Changes +#### Recommendation +**For GoodFitSBM**: transpose the matrix before the call (`t(pairs)`), or convert to a 2-column data frame, or pass a flat vertex-pair vector. Also rename the deprecated alias `get.edge.ids()` → `get_edge_ids()`. -### Issue -Test failures due to different modularity values: -- Expected: 0.408, Actual: 0.432 (difference: +0.024) -- Expected: 0.3776, Actual: 0.3758 (difference: -0.0018) +**Severity**: High — example error. -### Minimal Reproducible Example -See `examples/rspectral-modularity-issue.R` and `.md` +--- -### Root Cause -igraph v2.2.1.9004 changed `modularity()` to automatically use the `"weight"` edge attribute if present: +## Group D — Deprecation warnings surfacing as NOTE/WARNING -```r -if (is.null(weights) && "weight" %in% edge_attr_names(graph)) { - weights <- E(graph)$weight -} -``` +These packages do not yet hard-error against the dev igraph; their checks fail because deprecation warnings leak into output where none are expected. -### Hacky workaround (do not recommend to revdep maintainers) -Passing `weights = numeric()` happens to disable auto-detection due to implementation details: +### 12. FrF2 (2.3-4) -```r -modularity(g, membership, weights = numeric()) -``` +#### Issue +`checking tests ... NOTE` — multiple igraph deprecation warnings (`graph.empty()`, `add.edges()`, `independence.number()`, `clique.number()`) appear in `godolphintest.Rout` and diverge from `godolphintest.Rout.save`. -This is **not** a robust solution and should **not** be recommended to rSpectral or other downstream maintainers, as it relies on internal behavior that may change. +#### Root cause +None of those functions are defunct yet; they emit warnings. The `.Rout.save` comparison treats any new output as a check failure. -### Assessment -**Inadvertent breaking change in igraph. igraph needs to provide a clean fix.** +#### Assessment +**Bug in FrF2** — uses long-deprecated function names; will hard-fail when the next lifecycle pass advances any of these to defunct. -### Recommendation -**For igraph** (action required before notifying revdep maintainers): -- Add a proper `weights = NA` mechanism to explicitly disable weight auto-detection, with a documented user-facing contract. -- Document this as a breaking change in NEWS.md. -- Until a clean solution exists, the recommendation to rSpectral maintainers should be to remove unintended weight attributes: `g <- delete_edge_attr(g, "weight")` +#### Recommendation +**For FrF2**: rename to the current API: +- `graph.empty()` → `make_empty_graph()` +- `add.edges()` → `add_edges()` +- `independence.number()` → `ivs_size()` +- `clique.number()` → `clique_num()` -**For rSpectral** (once root cause is understood): -1. Determine whether graphs are *intended* to have a `"weight"` attribute -2. If not: `g <- igraph::delete_edge_attr(g, "weight")` before calling `modularity()` -3. If yes: update expected test values to the weighted modularity -4. Call `igraph::upgrade_graph()` on stored graph objects +Then regenerate the `.Rout.save` files. -**Severity**: Medium - Tests fail; igraph behavior change needs a clean fix +**Severity**: Low (NOTE only), but pre-emptive: these functions are queued for defunct. --- -## 6. sfnetworks - from Parameter Requires Single Vertex +### 13. R6causal (0.8.3) -### Issue +#### Issue +`checking whether package ‘R6causal’ can be installed ... WARNING` — significant install-time deprecation warnings: ``` -Error in `all_shortest_paths(x, from, to, weights = weights, ...)`: -! `from` must specify exactly one vertex +Warning: `set.edge.attribute()` was deprecated in igraph 2.0.0. +Warning: `induced.subgraph()` was deprecated in igraph 2.0.0. +Warning: `get.vertex.attribute()` was deprecated in igraph 2.0.0. ``` -### Root Cause -igraph added stricter validation requiring exactly one vertex for the `from` parameter in `all_shortest_paths()`. sfnetworks passes multiple vertices, which previously may have used only the first vertex implicitly. +#### Root cause +Deprecated alias names still being called at package load / `.onLoad` time. -### Assessment -**Intentional API tightening in igraph for safety and clarity.** +#### Assessment +**Bug in R6causal** — replace with current names; will hard-fail on the next lifecycle pass. -### Recommendation -**For sfnetworks**: -```r -# If only first vertex intended: -from <- from[1] +#### Recommendation +**For R6causal**: +- `set.edge.attribute()` → `set_edge_attr()` +- `induced.subgraph()` → `induced_subgraph()` +- `get.vertex.attribute()` → `vertex_attr()` + +**Severity**: Medium — install WARNING (and pre-emptive). + +--- -# If all vertices intended, iterate: -lapply(from, function(f) all_shortest_paths(g, from = f, to = to)) +### 14. migraph (1.6.2) -# Or provide clear warning about multiple vertices +#### Issue +``` +── Failure ('test-tutorials_migraph.R:12:5'): migraph tutorial code runs without warnings or errors ── +Expected `w` to be NULL. +... +Warning in expression 17 : rg <- create_ring(32, width = 2) ``` +A migraph tutorial test asserts that none of its code expressions emit warnings; `igraph::create_ring(32, width = 2)` now emits a deprecation warning about the `width` argument. -**Severity**: High - Package functionality broken +#### Root cause +The `width` argument of `create_ring()` is deprecated (most likely in favour of using `make_lattice()` or another constructor — verify against `?create_ring`). ---- +#### Assessment +**Bug in migraph** — depends on a deprecated argument, exposed by a strict no-warning assertion. -## 7. rgph (0.1.0) – Under Investigation +#### Recommendation +**For migraph**: stop passing `width = 2` to `create_ring()`. If the original intent was a "thicker" ring (each vertex connected to multiple neighbours on each side), use the documented replacement (likely `connect(create_ring(32), order = 2)` or `make_lattice(length = 32, dim = 1, circular = TRUE, nei = 2)` — check `?create_ring` for the precise migration path). -### Issue -Reported as failing in the CRAN win-builder check for igraph 2.3.0. Not reproduced in our Linux-based `revdepcheck` run. +**Severity**: Low — one test failure. -### Root Cause (preliminary) -rgph lists igraph only as a `Suggests` dependency. Failures likely occur in tests or examples that optionally use igraph. The most probable cause, given the other patterns in this release, is either the `neighbors()` scalar validation or another strict type-checking change. +--- -### Assessment -Preliminary assessment: likely a downstream issue (using undocumented behavior of igraph). Investigation ongoing. +## Group E — Indirect path through a defunct fallback -### Recommendation -Run targeted checks to reproduce: -```r -install.packages("rgph") -tools::testInstalledPackage("rgph") # or devtools::check() +### 15. degreenet (1.3-6) + +#### Issue +``` +> simr <- reedmolloy(s4) +Error in reedmolloy(s4) : + The reedmolloy function failed to form a valid network from the passed degree sequence. ``` -Once the error is reproduced, contact the rgph maintainer with a targeted fix. +No `lifecycle::deprecate_stop` trace is visible in the revdep log because `degreenet::reedmolloy()` wraps its inner `igraph` calls in `.catchToList()`, which converts the error into a retry loop. After `maxit = 10` failed retries the function emits its own error. -**Severity**: Unknown – under investigation +#### Reproduction (confirmed) +```r +library(degreenet) +set.seed(2) +s4 <- simpln(n = 100, v = c(-1, 1)) +reedmolloy(s4) +``` ---- +#### Root cause +`reedmolloy` first calls `igraph::degree.sequence.game(deg, method = "vl")` and falls back to `method = "simple.no.multiple"` inside a jitter+retry loop if the first call errors. -## 8. tmap.networks (0.1) – Cascading Failure from sfnetworks +What's actually happening: -### Issue -tmap.networks imports sfnetworks directly. Since sfnetworks fails due to the `all_shortest_paths()` `from` validation change, tmap.networks fails as a cascade. +1. The VL call **deterministically fails** on this degree sequence (`s4` has 65 vertices of degree 1, which often does not admit a connected graph — VL only produces connected graphs). Verified against CRAN igraph 2.3.1: VL errored 50/50 times in a small experiment. So this is **not** a behavioural change in the VL method; it has always failed for this input. +2. Against CRAN 2.3.1 the fallback `method = "simple.no.multiple"` produces an igraph object with a deprecation warning, so `reedmolloy(s4)` succeeds. +3. Against dev igraph the fallback now hard-errors (`deprecate_stop`), `.catchToList` swallows it, the loop reaches `maxit`, and `reedmolloy` emits its own error. -### Root Cause -Not a direct bug in tmap.networks; it inherits the sfnetworks breakage. +The root cause is therefore purely the lifecycle promotion of `sample_degseq(method = "simple.no.multiple")` from `deprecate_warn` to `deprecate_stop` in [#2634](https://github.com/igraph/rigraph/pull/2634). -### Assessment -**Cascading failure**: tmap.networks will pass once sfnetworks is fixed. +#### Assessment +**Bug in degreenet** — it depends on the `"simple.no.multiple"` fallback name being available, which has been a documented deprecation since igraph 2.1.0. -### Recommendation -No action needed for tmap.networks directly. Once sfnetworks is updated, inform the tmap.networks maintainer that a new sfnetworks release is available. +#### Recommendation +**For degreenet**: +- Replace `degree.sequence.game(deg, method = "simple.no.multiple")` in the fallback path with `sample_degseq(deg, method = "fast.heur.simple")`. +- While there, also replace the deprecated alias `degree.sequence.game()` itself with `sample_degseq()`, and `get.edgelist()` with `as_edgelist()`. -**Severity**: High (package broken), but resolved automatically when sfnetworks is fixed +**Severity**: High — example error; clear fix on degreenet's side. --- ## Conclusion -| Package | Issue Type | Root Cause | Severity | Action | -|---------|-----------|------------|----------|--------| -| Cascade | Namespace collision | New `circulant()` export | Low | Fix in Cascade NAMESPACE; igraph to reconsider export | -| DiagrammeR | API tightening | `neighbors()` requires scalar | High | DiagrammeR to iterate vertices | -| jewel | Type validation | Stricter integer checking | High | jewel to use `ceiling()` on computed niter | -| manynet | Type validation | Scalar parameter checking | High | manynet to ensure scalar inputs | -| rSpectral | Behavior change | Automatic weight usage | Medium | igraph needs clean fix; rSpectral to check weight intent | -| sfnetworks | API tightening | `from` requires scalar | High | sfnetworks to iterate vertices | -| rgph | Under investigation | Likely API tightening | Unknown | Reproduce and contact maintainer | -| tmap.networks | Cascading | sfnetworks failure | High | Wait for sfnetworks fix | - -### Overall Assessment - -- **1 namespace collision** (Cascade) – Minor impact; inadvertent igraph export -- **3 API tightening changes** (DiagrammeR, manynet, sfnetworks) – Intentional safety improvements; downstream bugs exposed -- **1 uncovered downstream bug** (jewel) – Should use integer values -- **1 behavior change needing igraph fix** (rSpectral) – Automatic weights; igraph must provide a clean `NA` mechanism -- **1 cascading failure** (tmap.networks) – Resolved when sfnetworks is fixed -- **1 under investigation** (rgph) – Likely API tightening - -Most issues stem from igraph's improved type safety and parameter validation. These are generally positive changes. However, the modularity weight auto-detection change (rSpectral) requires a proper igraph-side fix before we can issue clear guidance to downstream maintainers. +| Package | Issue type | Root cause | Severity | Action | +|---|---|---|---|---| +| tidygraph | Defunct argument | `bfs(father=)` → `parent=` | High | tidygraph to rename argument | +| nat | Defunct argument | `dfs(father=)` → `parent=` | High | nat to rename argument | +| dci | Cascading | tidygraph failure | High | Resolved when tidygraph updates | +| ggraph | Cascading | tidygraph failure | High | Resolved when tidygraph updates | +| scistreer | Cascading | tidygraph failure | High | Resolved when tidygraph updates | +| comato | Defunct function | `layout.spring()` → `layout_with_fr()` | High | comato to rename | +| ECoL | Defunct function | `hub.score()` → `hits_scores()` | High | ECoL to rename | +| vkR | Removed function | `get.edge()` removed | Medium | vkR to switch to `ends()` | +| cranly | Defunct argument value | `eigen_centrality(scale=)` always TRUE | High | cranly to drop the argument | +| qgraph | Defunct argument value | `sample_degseq(method=)` value renamed | High | qgraph to switch method value | +| GoodFitSBM | Defunct call form | `get_edge_ids(vp=)` matrix orientation | High | GoodFitSBM to transpose matrix | +| FrF2 | Deprecation warnings → NOTE | Multiple deprecated names | Low | FrF2 to rename pre-emptively | +| R6causal | Install-time WARNING | Deprecated attribute getters/setters | Medium | R6causal to rename pre-emptively | +| migraph | Strict no-warning test | `create_ring(width=)` deprecated | Low | migraph to stop using the argument | +| degreenet | Defunct argument value | `sample_degseq(method = "simple.no.multiple")` defunct in fallback path | High | degreenet to switch the fallback method value | + +### Overall assessment + +All fifteen failures are direct consequences of [#2634](https://github.com/igraph/rigraph/pull/2634) advancing previously-deprecated names, argument names, and argument values from `deprecate_warn` to `deprecate_stop`. They are intentional and all have straightforward downstream fixes; three of the five Group A packages are pure cascades through tidygraph. The degreenet case is unusual only in that the defunct call is wrapped in `tryCatch`-style logic that converted a clear lifecycle error into a generic "failed to form a valid network" message — but the underlying cause is the same.