                        Changes in version 2.3.4                        

Bug fixes

  - Avoid deprecated special names in structure() calls and add \usage
    to the documentation of %>%, for compatibility with R-devel.

Testing

  - Skip the layout_with_mds() stress test with BLIS, where LAPACK's
    DSYEVR fails to converge for some random graphs.

                     Changes in version 2.3.3.9042                      

Chore

  - Auto-update from GitHub Actions (#2930).

                     Changes in version 2.3.3.9041                      

Bug fixes

ci

  - Scope the touchstone comment concurrency group to the PR branch
    (#2924).

                     Changes in version 2.3.3.9040                      

Continuous integration

touchstone

  - Benchmark incident_edges(), neighbors(), union() and indexed edge
    attribute assignment (#2914).

                     Changes in version 2.3.3.9039                      

Bug fixes

ci

  - Append the GLPK flags to ~/.R/Makevars instead of overwriting it
    (#2911).

ci

  - Restore the custom actions and the workflows the template sync
    deleted (#2910).

Continuous integration

  - Run coverage checks after pkgdown push.

Uncategorized

  - Feat(ci): Render README.md and index.md in CI
    (cynkra/cynkratemplate#118).

                     Changes in version 2.3.3.9038                      

Chore

  - Remove Copilot setup steps.

  - Auto-update from GitHub Actions (#2901).

Documentation

  - Drop the branch from the coverage badge (#2902).

Refactoring

  - Snake_case attr-comb options & arguments, soft-deprecate dotted
    names (#2742).

Uncategorized

  - Refactor(ci): Serve the revdep scripts with the actions instead of
    copying them (cynkra/cynkratemplate#149).

  - Feat: Build a binary package in every check job and share it as an
    artifact (cynkra/cynkratemplate#141).

  - Fix(ci): Collect the fleet's workflow fixes after the move to
    central actions (cynkra/cynkratemplate#139).

  - Refactor(ci): Serve the actions from this repository instead of
    copying them (cynkra/cynkratemplate#121).

  - Fix(ci): Keep the raw name expression out of the running job's step
    list (cynkra/cynkratemplate#119).

  - Fix(fledge): Push the bump to the default branch wherever that is
    allowed (cynkra/cynkratemplate#117).

  - Fix(ci): Make a failing rcc run say what failed, and link to it
    (cynkra/cynkratemplate#115).

  - Fix(ci): Exempt deprecation warnings from the roxygenize warning
    gate (cynkra/cynkratemplate#114).

  - Perf(revdepx): Compile the revdeps' checks through ccache.

  - Fix(ci): Survive an archived CRAN package, and install it from where
    it still lives.

  - Ci: Fail the roxygenize step on roxygen2 warnings (#111).

                     Changes in version 2.3.3.9037                      

Chore

  - Improve errors in iterators.R (#1891, #2006).

  - Increase R minimal version to R4.0.0 (#2876).

Documentation

  - Fix dots docs thanks to roxygen2's warning about useless
    inheritParams (#2868).

                     Changes in version 2.3.3.9036                      

Chore

  - Update standalone files (#2881).

                     Changes in version 2.3.3.9035                      

Bug fixes

ci

  - Align the workflow kit with cynkratemplate (#2892).

ci

  - Filter OS-restricted packages out of the revdep plan (#2889).

ci

  - Backport kit fixes from rigraph, duckdb-r and dm.

Features

ci

  - Make the revdep driver log's timing record durable and visible
    (#2891).

Chore

ci

  - Retire the pair engine from the revdepx core (#2885).

  - Re-run the reverse-dependency check (most, depth 2) (#2883).

  - Breaking change: rm unused argument in layout_with_mds() (#2730,
    #2869).

  - Some Jarl fixes (#2874).

Documentation

  - Rm deprecations vignette as it is not useful (#2848, #2873).

Breaking changes

  - Breaking change: rm unused argument in layout_with_mds() (#2730,
    #2869).

                     Changes in version 2.3.3.9034                      

Bug fixes

ci

  - Cap check-container cores and raise the timeout floor (#2875).

Features

ci

  - Add revdep4, sequential halves driven by a two-ended bash work queue
    (#2857).

Documentation

  - Other roxygen2 warning (#2870).

Performance

touchstone

  - Measure warm, repeated calls instead of one cold call (#2882).

                     Changes in version 2.3.3.9033                      

Bug fixes

ci

  - Upload a shard's results three times, not once (#2854).

ci

  - Stop reporting a check that never ran as ok (#2849).

ci

  - Install the system requirements of the packages being checked
    (#2853).

Performance

ci

  - Bigger install chunks, a shard resource sampler, and lower-priority
    checks (#2852).

                     Changes in version 2.3.3.9032                      

Bug fixes

  - simplify() honours edge.attr.comb on an already-simple graph again
    (#2843).

  - as_adjacency_matrix(attr = NULL) is unweighted again (#2842).

Features

ci

  - Make revdep2 runs comparable, resilient, and honest about what they
    checked (#2834).

                     Changes in version 2.3.3.9031                      

Continuous integration

revdep2

  - Put a clock on every call that can hang (#2832).

revdep2

  - Install in chunks, and diagnose a preflight that is killed rather
    than failed (#2830).

                     Changes in version 2.3.3.9030                      

Bug fixes

ci

  - Check windows-11-arm with error_on = "error" (#2821).

Features

ci

  - Commit the revdep2 report, and re-check what it lists (#2827).

Continuous integration

  - Wrap the commit status update into an action.

  - Route ccache through one-word compiler wrappers on Unix.

  - Name every step and restore the log entry setup-pandoc swallows.

                     Changes in version 2.3.3.9029                      

Bug fixes

ci

  - Let a revdep2 run survive its preflight, and finish the shard-count
    follow-ups (#2820).

migrations

  - Recover legacy arguments against the old signature (#2812).

Features

ci

  - Size revdep2 shards by the parallel capacity, calibrated from
    measured timings (#2819).

                     Changes in version 2.3.3.9028                      

Bug fixes

ci

  - Carry revdep2 run ids as strings, and make its summary
    self-contained (#2816).

Continuous integration

  - Move the revdep2 library artifact steps to their Node 24 releases
    (#2817).

                     Changes in version 2.3.3.9027                      

Bug fixes

ci

  - Quote gh arguments in the revdep2 plan job (#2811).

Features

ci

  - Reuse prebuilt packages in revdep2 instead of rebuilding them
    (#2814).

Continuous integration

  - Move remaining Node 20 actions to their Node 24 releases (#2813).

  - Add sharded revdep2 workflow.

Uncategorized

  - Ci: Harden workflow_run workflows against untrusted pull requests
    (#106).

  - Ci: Pin third-party actions to commits and let Renovate keep them
    pinned (#105).

                     Changes in version 2.3.3.9026                      

Features

migrations

  - Require constant defaults, resolve complex ones in the body (#2784).

Chore

  - Auto-update from GitHub Actions (#2807).

  - Auto-update from GitHub Actions (#2806).

Continuous integration

  - Remove unused pr-commands workflow.

Documentation

  - Zoning rules for arguments around the ellipsis (#2757).

  - Revdep results before PR.

  - Revdep problems for PR.

Uncategorized

  - Ci: Give every workflow and job an explicit permissions block
    (#103).

  - Ci: Pass workflow context through the environment, not into script
    text (#102).

  - Ci: Add a Windows arm64 (windows-11-arm) check on R-release (#99).

                     Changes in version 2.3.3.9025                      

Continuous integration

  - Use the daily-rebuilt r-debug sanitizer image, and fix the leak it
    uncovered (#2802).

                     Changes in version 2.3.3.9024                      

Bug fixes

  - Name norm_coords() arguments at the rglplot.igraph() call site
    (#2801).

                     Changes in version 2.3.3.9023                      

Bug fixes

  - Heal main — unleak warnPartialMatchArgs on R 4.2 and name args at
    norm_coords()/make_star() call sites for the lifecycle-errors leg
    (#2799).

  - Initialize c_options in the Stimulus type definition (#2792).

Features

migrations

  - Allow head/recoverable prefix overlaps, guarded at run time (#2787).

Continuous integration

  - Sync R-CMD-check workflow; drop matrix-env plumbing from custom
    action (#2798).

Refactoring

  - Move optional arguments of games functions behind the ellipsis
    (#2760).

  - Move optional arguments of layout functions behind the ellipsis
    (#2762).

  - Move optional arguments of make functions behind the ellipsis
    (#2761).

  - Move optional arguments of topology functions behind the ellipsis
    (#2768).

  - Move optional arguments of conversion functions behind the ellipsis
    (#2766).

  - Move optional arguments of hrg-embedding functions behind the
    ellipsis (#2771).

  - Move optional arguments of flow functions behind the ellipsis
    (#2767).

  - Move optional arguments of plotting functions behind the ellipsis
    (#2777).

  - Move optional arguments of interface functions behind the ellipsis
    (#2770).

  - Move optional arguments of similarity-efficiency functions behind
    the ellipsis (#2776).

  - Move optional arguments of cliques functions behind the ellipsis
    (#2769).

  - Move optional arguments of motifs-graphlets functions behind the
    ellipsis (#2772).

  - Move optional arguments of misc functions behind the ellipsis
    (#2778).

  - Move optional arguments of bipartite-degseq functions behind the
    ellipsis (#2774).

  - Move optional arguments of walks-cycles functions behind the
    ellipsis (#2775).

  - Move optional arguments of trees functions behind the ellipsis
    (#2758).

  - Move optional arguments of operators functions behind the ellipsis
    (#2773).

Testing

  - Cover migrated centrality, community, and centralization signatures
    (#2786).

  - Make unasserted lifecycle deprecations fail the test suite (opt-in)
    (#2782).

  - Cover migrated structural-properties signatures (#2785).

Uncategorized

  - Ci: Run all smoke-test checks even when one fails (#97).

  - Ci: Link the responsible workflow run in snapshot update PRs (#96).

                     Changes in version 2.3.3.9022                      

Bug fixes

  - Use canonical structure() attribute names (#2755).

Chore

  - Restore one-value-per-line layout of long enum defaults (#2781).

Continuous integration

  - Let pak ignore Bioconductor graph on R < 4.4 (#2753).

Refactoring

  - Move optional arguments of structural-properties functions behind
    the ellipsis (#2759).

  - Move optional arguments of centrality functions behind the ellipsis
    (#2763).

  - Move optional arguments of community functions behind the ellipsis
    (#2765).

  - Move optional arguments of centralization functions behind the
    ellipsis (#2764).

migrations

  - Split the registry into per-topic files (#2779).

                     Changes in version 2.3.3.9021                      

Continuous integration

  - Lock down format-suggest egress (audit → block).

                     Changes in version 2.3.3.9020                      

Bug fixes

ci

  - Emit empty package matrix when there are no (rev)deps.

Uncategorized

  - Ci: Harden format-suggest against pull_request_target pwn requests
    (#93).

                     Changes in version 2.3.3.9019                      

Continuous integration

  - Run on Ubuntu 26.04.

  - Align workflows with template.

                     Changes in version 2.3.3.9018                      

Bug fixes

  - Remove generated src/Makevars in cleanup scripts (#2746).

  - Fix test issues with new withr version (#2701, #2705).

migrations

  - Guard against head/recoverable prefix clashes (#2743).

  - Fix test issues with new withr version (#2701, #2705).

  - BFS reports all requested root vertices instead of only the first
    (#1639, #2693).

  - Resolve roxygen2 warnings (#2641, #2692).

  - Touchstone empty results table for branches with a slash (#2689).

  - Harden air support and broaden migration fixture to the full
    arg-matching matrix (#2686).

  - Repair touchstone benchmark CI (#2688).

  - cut_at() handles partial dendrograms from cluster_leading_eigen()
    (#58, #2599).

  - Stricter bipartite type checking (#710, #2598).

  - Vector logic (#2653).

  - seq_len() rather than seq() (#2655).

  - Unreachable code (#2656).

  - rowMeans() and rowSums() (#2657).

  - Add check.attributes=FALSE to is_symmetric() to ignore dimnames
    mismatch (#2671, #2672).

  - Resolve CRAN Fortran obsolescent character length warning in ARPACK
    (#2644).

  - Avoid memory overflow in ensure_no_na() for large sparse matrices
    with mode="lower" or mode="upper" (#2626, #2627).

Features

  - Add attribute combination support to graph operators (#57, #2676).

  - Retire attr in favor of weights for adjacency matrix functions
    (#906, #1137, #2677).

  - Modern cli-styled print output (#1959, #2682).

  - Added simple check to graph_from_literal() (#824, #1981).

  - Add touchstone benchmarks (#1338, #2685).

  - Add tooling for parameter migration (#2684).

Chore

  - Rm unused lines (#2728).

  - Rm empty arguments (#2740).

  - Rm a few outer negations with Jarl (#2739).

  - Rm two more unused vars (#2735).

  - Unused object + rename in hrg.R (#2734).

  - Rm unused variable from idx.R (#2733).

  - Stop naming mode in indexing.R (#2732).

  - Rm modifs of variable not used in logic branch (#2726).

  - Rm unused code from iterators.R (#2731).

  - Rm two unused lines (#2729).

  - Rm unused variable (#2725).

  - Rm unused code (#2724).

  - Rm unused object (#2723).

  - Rm unused objects in plot scripts (#2727).

  - Auto-update from GitHub Actions (#2718).

  - Separate and annotate top-level vs helper functions in
    rinterface_extra.c (#2105, #2708).

  - Auto-update from GitHub Actions (#2702).

  - Implicit assignments (#2664).

  - Use max.print consistently in adjacency-list graph printing (#1462,
    #2680).

  - Refactor internal tmp locals to descriptive names (#1328, #2678).

  - Unused functions (#2669).

  - Ignore true_false_symbol for now (#2668).

  - Numeric_leading_zero (#2667).

  - Exception comments for jarl's duplicated arguments check (#2658).

  - startsWith() (#2659).

  - Outer negation (#2666).

  - seq_along(), seq_len() (#2665).

  - Do not namespace internal functions (#2662).

  - inherits() (#2661).

  - anyDuplicated() (jarl), anyNA() (jarl), nzchar()(me) (#2660).

  - lengths() (#2663).

  - Add jarl config (#2654).

  - Split generated R/aaa-auto.R into per-category R/aaa-<cat>.R files
    (#2621).

  - Remove console() and tkplot() (#2615).

  - Advance lifecycle stage for many functions (#2634).

  - Add ccache to .gitignore and .Rbuildignore.

  - Auto-update from GitHub Actions (#2624).

Continuous integration

  - Update ccache-action reference.

  - Bump action version.

  - Create snapshot update PR against correct branch.

  - Add reference to /apply-patch workflow in commit message.

  - Clarify rationale for not deploying on schedule.

  - Really deploy pkgdown only on push.

  - Disable vendoring workflow to avoid noise.

  - Only run fledge on pushes to main.

  - Tweak fledge workflow and ccache action.

  - Cosmetics.

  - Bump action versions.

  - Install clang-format-21.

  - Align fledge workflow.

  - Harmonize.

Documentation

  - More common location for default value in community.R (#2716,
    #2737).

  - Clarify make_ vs sample_ (#801, #2738).

  - Describe logical params more consistently (#2487, #2707).

  - Use "ID"/"IDs" consistently in documentation prose (#1683, #2694).

  - Updated revdep issues (#2647).

revdep

  - Analyze and document reverse dependency problems for igraph 2.3.0
    (#2499, #2500).

  - document() with latest roxygen2 -- for clean diffs (#2642).

Performance

  - Speed up .apply_modifiers() in make.R (#1468, #2600).

Testing

  - Replace expect_snapshot_error( with expect_snapshot(error = …
    (#2721{=html}, #2736`{=html}).

  - Withr-free local seed and RNG-state leak fixes (#2713, #2714).

  - Jarl fixes (#2670).

Uncategorized

  - Fix: do not wrap roxygenize in try() (#2679) (#2690) (#2679).

  - Merge tag 'v2.3.2'.
    
    Place the 2.3.2 release section directly above 2.3.1 in NEWS, below
    the development entries, and bump the development version
    to 2.3.2.9008.
    
    https://claude.ai/code/session_01QRKAaBDSAQTfysLRc1C3W2

  - Ci: Unify fledge.yaml across cynkratemplate and fledge (#86).

  - Merge branch 'krlmlr-main'.

                        Changes in version 2.3.3                        

Bug fixes

  - Compatibility fix for withr update (#2705).

                     Changes in version 2.3.2.9017                      

Bug fixes

migrations

  - Guard against head/recoverable prefix clashes (#2743).

Features

  - Add attribute combination support to graph operators (#57, #2676).

Chore

  - Rm unused lines (#2728).

  - Rm empty arguments (#2740).

  - Rm a few outer negations with Jarl (#2739).

  - Rm two more unused vars (#2735).

  - Unused object + rename in hrg.R (#2734).

  - Rm unused variable from idx.R (#2733).

  - Stop naming mode in indexing.R (#2732).

  - Rm modifs of variable not used in logic branch (#2726).

  - Rm unused code from iterators.R (#2731).

  - Rm two unused lines (#2729).

  - Rm unused variable (#2725).

  - Rm unused code (#2724).

  - Rm unused object (#2723).

  - Rm unused objects in plot scripts (#2727).

Documentation

  - More common location for default value in community.R (#2716,
    #2737).

  - Clarify make_ vs sample_ (#801, #2738).

  - Describe logical params more consistently (#2487, #2707).

Testing

  - Replace expect_snapshot_error( with expect_snapshot(error = …
    (#2721{=html}, #2736`{=html}).

  - Withr-free local seed and RNG-state leak fixes (#2713, #2714).

                     Changes in version 2.3.2.9016                      

Chore

  - Auto-update from GitHub Actions (#2718).

                     Changes in version 2.3.2.9015                      

Bug fixes

  - Fix test issues with new withr version (#2701, #2705).

Chore

  - Separate and annotate top-level vs helper functions in
    rinterface_extra.c (#2105, #2708).

  - Auto-update from GitHub Actions (#2702).

                     Changes in version 2.3.2.9014                      

Features

  - Retire attr in favor of weights for adjacency matrix functions
    (#906, #1137, #2677).

                     Changes in version 2.3.2.9013                      

Features

  - Modern cli-styled print output (#1959, #2682).

  - Added simple check to graph_from_literal() (#824, #1981).

                     Changes in version 2.3.2.9012                      

Bug fixes

  - BFS reports all requested root vertices instead of only the first
    (#1639, #2693).

  - Resolve roxygen2 warnings (#2641, #2692).

Documentation

  - Use "ID"/"IDs" consistently in documentation prose (#1683, #2694).

Uncategorized

  - Fix: do not wrap roxygenize in try() (#2679) (#2690) (#2679).

                     Changes in version 2.3.2.9011                      

Bug fixes

  - Touchstone empty results table for branches with a slash (#2689).

  - Harden air support and broaden migration fixture to the full
    arg-matching matrix (#2686).

  - Repair touchstone benchmark CI (#2688).

Features

  - Add touchstone benchmarks (#1338, #2685).

Chore

  - Implicit assignments (#2664).

                     Changes in version 2.3.2.9010                      

Features

  - Add tooling for parameter migration (#2684).

                     Changes in version 2.3.2.9009                      

Bug fixes

  - cut_at() handles partial dendrograms from cluster_leading_eigen()
    (#58, #2599).

  - Stricter bipartite type checking (#710, #2598).

  - Vector logic (#2653).

  - seq_len() rather than seq() (#2655).

  - Unreachable code (#2656).

  - rowMeans() and rowSums() (#2657).

  - Add check.attributes=FALSE to is_symmetric() to ignore dimnames
    mismatch (#2671, #2672).

  - Resolve CRAN Fortran obsolescent character length warning in ARPACK
    (#2644).

  - Avoid memory overflow in ensure_no_na() for large sparse matrices
    with mode="lower" or mode="upper" (#2626, #2627).

Chore

  - Use max.print consistently in adjacency-list graph printing (#1462,
    #2680).

  - Refactor internal tmp locals to descriptive names (#1328, #2678).

  - Unused functions (#2669).

  - Ignore true_false_symbol for now (#2668).

  - Numeric_leading_zero (#2667).

  - Exception comments for jarl's duplicated arguments check (#2658).

  - startsWith() (#2659).

  - Outer negation (#2666).

  - seq_along(), seq_len() (#2665).

  - Do not namespace internal functions (#2662).

  - inherits() (#2661).

  - anyDuplicated() (jarl), anyNA() (jarl), nzchar()(me) (#2660).

  - lengths() (#2663).

  - Add jarl config (#2654).

  - Split generated R/aaa-auto.R into per-category R/aaa-<cat>.R files
    (#2621).

  - Remove console() and tkplot() (#2615).

  - Advance lifecycle stage for many functions (#2634).

  - Add ccache to .gitignore and .Rbuildignore.

  - Auto-update from GitHub Actions (#2624).

Continuous integration

  - Update ccache-action reference.

  - Bump action version.

  - Create snapshot update PR against correct branch.

  - Add reference to /apply-patch workflow in commit message.

  - Clarify rationale for not deploying on schedule.

  - Really deploy pkgdown only on push.

  - Disable vendoring workflow to avoid noise.

  - Only run fledge on pushes to main.

  - Tweak fledge workflow and ccache action.

  - Cosmetics.

  - Bump action versions.

  - Install clang-format-21.

  - Align fledge workflow.

  - Harmonize.

Documentation

  - Updated revdep issues (#2647).

revdep

  - Analyze and document reverse dependency problems for igraph 2.3.0
    (#2499, #2500).

  - document() with latest roxygen2 -- for clean diffs (#2642).

Performance

  - Speed up .apply_modifiers() in make.R (#1468, #2600).

Testing

  - Jarl fixes (#2670).

Uncategorized

  - Merge tag 'v2.3.2'.
    
    Place the 2.3.2 release section directly above 2.3.1 in NEWS, below
    the development entries, and bump the development version
    to 2.3.2.9008.
    
    https://claude.ai/code/session_01QRKAaBDSAQTfysLRc1C3W2

  - Ci: Unify fledge.yaml across cynkratemplate and fledge (#86).

  - Merge branch 'krlmlr-main'.

                        Changes in version 2.3.2                        

Bug fixes

  - Fix obsolete Fortran syntax (#2644).

                     Changes in version 2.3.1.9008                      

Chore

  - Add jarl config (#2654).

Documentation

  - Updated revdep issues (#2647).

                     Changes in version 2.3.1.9007                      

Chore

  - Split generated R/aaa-auto.R into per-category R/aaa-<cat>.R files
    (#2621).

                     Changes in version 2.3.1.9006                      

Chore

  - Remove console() and tkplot() (#2615).

Continuous integration

  - Update ccache-action reference.

  - Bump action version.

                     Changes in version 2.3.1.9005                      

Bug fixes

  - Resolve CRAN Fortran obsolescent character length warning in ARPACK
    (#2644).

  - Avoid memory overflow in ensure_no_na() for large sparse matrices
    with mode="lower" or mode="upper" (#2626, #2627).

Chore

  - Advance lifecycle stage for many functions (#2634).

Documentation

revdep

  - Analyze and document reverse dependency problems for igraph 2.3.0
    (#2499, #2500).

                     Changes in version 2.3.1.9004                      

Deprecated and defunct

  - autocurve.edges() is now deprecated with a warning instead of a
    message.
  - igraph.version() is now deprecated with a warning instead of a
    message.
  - permute.vertices() is now deprecated with a warning instead of a
    message.
  - automorphisms() is now deprecated with a warning instead of a
    message.
  - tkplot.setcoords() is now deprecated with a warning instead of a
    message.
  - tkplot.rotate() is now deprecated with a warning instead of a
    message.
  - tkplot.reshape() is now deprecated with a warning instead of a
    message.
  - tkplot.off() is now deprecated with a warning instead of a message.
  - tkplot.getcoords() is now deprecated with a warning instead of a
    message.
  - tkplot.fit.to.screen() is now deprecated with a warning instead of a
    message.
  - tkplot.close() is now deprecated with a warning instead of a
    message.
  - tkplot.center() is now deprecated with a warning instead of a
    message.
  - tkplot.canvas() is now deprecated with a warning instead of a
    message.
  - are.connected() is now deprecated with a warning instead of a
    message.
  - get.shortest.paths() is now deprecated with a warning instead of a
    message.
  - get.diameter() is now deprecated with a warning instead of a
    message.
  - unfold.tree() is now deprecated with a warning instead of a message.
  - topological.sort() is now deprecated with a warning instead of a
    message.
  - shortest.paths() is now deprecated with a warning instead of a
    message.
  - neighborhood.size() is now deprecated with a warning instead of a
    message.
  - is.mutual() is now deprecated with a warning instead of a message.
  - is.multiple() is now deprecated with a warning instead of a message.
  - is.matching() is now deprecated with a warning instead of a message.
  - is.loop() is now deprecated with a warning instead of a message.
  - is.connected() is now deprecated with a warning instead of a
    message.
  - induced.subgraph() is now deprecated with a warning instead of a
    message.
  - has.multiple() is now deprecated with a warning instead of a
    message.
  - graph.neighborhood() is now deprecated with a warning instead of a
    message.
  - graph.laplacian() is now deprecated with a warning instead of a
    message.
  - graph.knn() is now deprecated with a warning instead of a message.
  - graph.dfs() is now deprecated with a warning instead of a message.
  - graph.density() is now deprecated with a warning instead of a
    message.
  - graph.coreness() is now deprecated with a warning instead of a
    message.
  - graph.bfs() is now deprecated with a warning instead of a message.
  - farthest.nodes() is now deprecated with a warning instead of a
    message.
  - count.multiple() is now deprecated with a warning instead of a
    message.
  - clusters() is now deprecated with a warning instead of a message.
  - average.path.length() is now deprecated with a warning instead of a
    message.
  - bfs() is now defunct (errors instead of warning).
  - dfs() is now defunct (errors instead of warning).
  - get.stochastic() is now deprecated with a warning instead of a
    message.
  - is.simple() is now deprecated with a warning instead of a message.
  - igraph.shape.noplot() is now deprecated with a warning instead of a
    message.
  - igraph.shape.noclip() is now deprecated with a warning instead of a
    message.
  - vertex.shapes() is now deprecated with a warning instead of a
    message.
  - add.vertex.shape() is now deprecated with a warning instead of a
    message.
  - path.length.hist() is now deprecated with a warning instead of a
    message.
  - is.dag() is now deprecated with a warning instead of a message.
  - igraph.options() is now deprecated with a warning instead of a
    message.
  - getIgraphOpt() is now deprecated with a warning instead of a
    message.
  - running.mean() is now deprecated with a warning instead of a
    message.
  - igraph.sample() is now deprecated with a warning instead of a
    message.
  - convex.hull() is now deprecated with a warning instead of a message.
  - graph.intersection() is now deprecated with a warning instead of a
    message.
  - graph.union() is now deprecated with a warning instead of a message.
  - graph.difference() is now deprecated with a warning instead of a
    message.
  - graph.compose() is now deprecated with a warning instead of a
    message.
  - graph.complementer() is now deprecated with a warning instead of a
    message.
  - triad.census() is now deprecated with a warning instead of a
    message.
  - graph.motifs.no() is now deprecated with a warning instead of a
    message.
  - graph.motifs.est() is now deprecated with a warning instead of a
    message.
  - graph.motifs() is now deprecated with a warning instead of a
    message.
  - dyad.census() is now deprecated with a warning instead of a message.
  - minimum.spanning.tree() is now deprecated with a warning instead of
    a message.
  - graph() is now deprecated with a warning instead of a message.
  - graph.famous() is now deprecated with a warning instead of a
    message.
  - line.graph() is now deprecated with a warning instead of a message.
  - graph.ring() is now deprecated with a warning instead of a message.
  - graph.tree() is now deprecated with a warning instead of a message.
  - graph.star() is now deprecated with a warning instead of a message.
  - graph.lcf() is now deprecated with a warning instead of a message.
  - graph.lattice() is now deprecated with a warning instead of a
    message.
  - graph.lattice() is now deprecated with a warning instead of a
    message.
  - graph.kautz() is now deprecated with a warning instead of a message.
  - graph.full.citation() is now deprecated with a warning instead of a
    message.
  - graph.full.bipartite() is now deprecated with a warning instead of a
    message.
  - graph.full() is now deprecated with a warning instead of a message.
  - graph.formula() is now deprecated with a warning instead of a
    message.
  - graph.extended.chordal.ring() is now deprecated with a warning
    instead of a message.
  - graph.empty() is now deprecated with a warning instead of a message.
  - graph.de.bruijn() is now deprecated with a warning instead of a
    message.
  - graph.bipartite() is now deprecated with a warning instead of a
    message.
  - graph.atlas() is now deprecated with a warning instead of a message.
  - graph_() is now deprecated with a warning instead of a message.
  - make_lattice() is now deprecated with a warning instead of a
    message.
  - layout.grid.3d() has been removed.
  - piecewise.layout() is now deprecated with a warning instead of a
    message.
  - layout.sugiyama() is now deprecated with a warning instead of a
    message.
  - layout.star() is now deprecated with a warning instead of a message.
  - layout.norm() is now deprecated with a warning instead of a message.
  - layout.merge() is now deprecated with a warning instead of a
    message.
  - layout.mds() is now deprecated with a warning instead of a message.
  - layout.grid() is now deprecated with a warning instead of a message.
  - layout.graphopt() is now deprecated with a warning instead of a
    message.
  - layout.gem() is now deprecated with a warning instead of a message.
  - layout.davidson.harel() is now deprecated with a warning instead of
    a message.
  - layout.bipartite() is now deprecated with a warning instead of a
    message.
  - layout.auto() is now deprecated with a warning instead of a message.
  - layout.reingold.tilford() is now deprecated with a warning instead
    of a message.
  - layout.circle() is now deprecated with a warning instead of a
    message.
  - layout.sphere() is now deprecated with a warning instead of a
    message.
  - layout.random() is now deprecated with a warning instead of a
    message.
  - layout.fruchterman.reingold() is now deprecated with a warning
    instead of a message.
  - layout.kamada.kawai() is now deprecated with a warning instead of a
    message.
  - layout.lgl() is now deprecated with a warning instead of a message.
  - layout_with_mds() is now deprecated with a warning instead of a
    message.
  - layout.spring() is now defunct (errors instead of warning).
  - layout.svd() is now defunct (errors instead of warning).
  - layout.fruchterman.reingold.grid() is now defunct (errors instead of
    warning).
  - layout.drl() is now deprecated with a warning instead of a message.
  - nei() has been removed.
  - innei() has been removed.
  - outnei() has been removed.
  - inc() has been removed.
  - adj() has been removed.
  - from() has been removed.
  - to() has been removed.
  - adj() has been removed.
  - inc() has been removed.
  - from() has been removed.
  - to() has been removed.
  - is.directed() is now deprecated with a warning instead of a message.
  - delete.vertices() is now deprecated with a warning instead of a
    message.
  - delete.edges() is now deprecated with a warning instead of a
    message.
  - add.vertices() is now deprecated with a warning instead of a
    message.
  - add.edges() is now deprecated with a warning instead of a message.
  - get_edge_ids() is now defunct (errors instead of warning).
  - get.edge.ids() is now deprecated with a warning instead of a
    message.
  - get.edge.ids() is now deprecated with a warning instead of a
    message.
  - graph.incidence() is now deprecated with a warning instead of a
    message.
  - graph_from_incidence_matrix() is now deprecated with a warning
    instead of a message.
  - graph_from_incidence_matrix() is now deprecated with a warning
    instead of a message.
  - hrg.predict() is now deprecated with a warning instead of a message.
  - hrg.fit() is now deprecated with a warning instead of a message.
  - hrg.game() is now deprecated with a warning instead of a message.
  - hrg.dendrogram() is now deprecated with a warning instead of a
    message.
  - hrg.create() is now deprecated with a warning instead of a message.
  - hrg.consensus() is now deprecated with a warning instead of a
    message.
  - graphlets.project() is now deprecated with a warning instead of a
    message.
  - graphlets.candidate.basis() is now deprecated with a warning instead
    of a message.
  - watts.strogatz.game() is now deprecated with a warning instead of a
    message.
  - static.power.law.game() is now deprecated with a warning instead of
    a message.
  - static.fitness.game() is now deprecated with a warning instead of a
    message.
  - sbm.game() is now deprecated with a warning instead of a message.
  - preference.game() is now deprecated with a warning instead of a
    message.
  - lastcit.game() is now deprecated with a warning instead of a
    message.
  - k.regular.game() is now deprecated with a warning instead of a
    message.
  - interconnected.islands.game() is now deprecated with a warning
    instead of a message.
  - grg.game() is now deprecated with a warning instead of a message.
  - growing.random.game() is now deprecated with a warning instead of a
    message.
  - forest.fire.game() is now deprecated with a warning instead of a
    message.
  - establishment.game() is now deprecated with a warning instead of a
    message.
  - degree.sequence.game() is now deprecated with a warning instead of a
    message.
  - connect.neighborhood() is now deprecated with a warning instead of a
    message.
  - citing.cited.type.game() is now deprecated with a warning instead of
    a message.
  - cited.type.game() is now deprecated with a warning instead of a
    message.
  - callaway.traits.game() is now deprecated with a warning instead of a
    message.
  - bipartite.random.game() is now defunct (errors instead of warning).
  - barabasi.game() is now deprecated with a warning instead of a
    message.
  - ba.game() is now deprecated with a warning instead of a message.
  - asymmetric.preference.game() is now deprecated with a warning
    instead of a message.
  - aging.barabasi.game() is now deprecated with a warning instead of a
    message.
  - aging.ba.game() is now deprecated with a warning instead of a
    message.
  - aging.prefatt.game() is now deprecated with a warning instead of a
    message.
  - erdos.renyi.game() is now deprecated with a warning instead of a
    message.
  - erdos.renyi.game() is now deprecated with a warning instead of a
    message.
  - random.graph.game() is now deprecated with a warning instead of a
    message.
  - random.graph.game() is now deprecated with a warning instead of a
    message.
  - sample_degseq() is now defunct (errors instead of warning).
  - sample_degseq() is now defunct (errors instead of warning).
  - sample_degseq() is now defunct (errors instead of warning).
  - sample_bipartite() is now deprecated with a warning instead of a
    message.
  - sample_bipartite() is now deprecated with a warning instead of a
    message.
  - bipartite() is now deprecated with a warning instead of a message.
  - bipartite() is now deprecated with a warning instead of a message.
  - write.graph() is now deprecated with a warning instead of a message.
  - read.graph() is now deprecated with a warning instead of a message.
  - graph.graphdb() is now deprecated with a warning instead of a
    message.
  - vertex.disjoint.paths() is now deprecated with a warning instead of
    a message.
  - vertex.connectivity() is now deprecated with a warning instead of a
    message.
  - stMincuts() is now deprecated with a warning instead of a message.
  - stCuts() is now deprecated with a warning instead of a message.
  - minimum.size.separators() is now deprecated with a warning instead
    of a message.
  - minimal.st.separators() is now deprecated with a warning instead of
    a message.
  - is.separator() is now deprecated with a warning instead of a
    message.
  - is.minimal.separator() is now deprecated with a warning instead of a
    message.
  - graph.mincut() is now deprecated with a warning instead of a
    message.
  - graph.maxflow() is now deprecated with a warning instead of a
    message.
  - graph.adhesion() is now deprecated with a warning instead of a
    message.
  - edge.disjoint.paths() is now deprecated with a warning instead of a
    message.
  - edge.connectivity() is now deprecated with a warning instead of a
    message.
  - dominator.tree() is now deprecated with a warning instead of a
    message.
  - power.law.fit() is now deprecated with a warning instead of a
    message.
  - is.graphical.degree.sequence() is now deprecated with a warning
    instead of a message.
  - is.degree.sequence() is now deprecated with a warning instead of a
    message.
  - is.chordal() is now deprecated with a warning instead of a message.
  - igraph.to.graphNEL() is now deprecated with a warning instead of a
    message.
  - igraph.from.graphNEL() is now deprecated with a warning instead of a
    message.
  - graph.adjlist() is now deprecated with a warning instead of a
    message.
  - get.incidence() is now deprecated with a warning instead of a
    message.
  - get.edgelist() is now deprecated with a warning instead of a
    message.
  - get.data.frame() is now deprecated with a warning instead of a
    message.
  - get.adjacency() is now deprecated with a warning instead of a
    message.
  - get.adjlist() is now deprecated with a warning instead of a message.
  - get.adjedgelist() is now deprecated with a warning instead of a
    message.
  - get.adjacency.dense() is now deprecated with a warning instead of a
    message.
  - as_adj() is now deprecated with a warning instead of a message.
  - as_incidence_matrix() is now deprecated with a warning instead of a
    message.
  - as.directed() is now deprecated with a warning instead of a message.
  - as.undirected() is now deprecated with a warning instead of a
    message.
  - graph.edgelist() is now deprecated with a warning instead of a
    message.
  - graph.data.frame() is now deprecated with a warning instead of a
    message.
  - igraph.console() is now deprecated with a warning instead of a
    message.
  - no.clusters() is now deprecated with a warning instead of a message.
  - decompose.graph() is now deprecated with a warning instead of a
    message.
  - cluster.distribution() is now deprecated with a warning instead of a
    message.
  - biconnected.components() is now deprecated with a warning instead of
    a message.
  - articulation.points() is now deprecated with a warning instead of a
    message.
  - create.communities() is now deprecated with a warning instead of a
    message.
  - walktrap.community() is now deprecated with a warning instead of a
    message.
  - spinglass.community() is now deprecated with a warning instead of a
    message.
  - showtrace() is now deprecated with a warning instead of a message.
  - optimal.community() is now deprecated with a warning instead of a
    message.
  - multilevel.community() is now deprecated with a warning instead of a
    message.
  - mod.matrix() is now deprecated with a warning instead of a message.
  - leading.eigenvector.community() is now deprecated with a warning
    instead of a message.
  - label.propagation.community() is now deprecated with a warning
    instead of a message.
  - is.hierarchical() is now deprecated with a warning instead of a
    message.
  - infomap.community() is now deprecated with a warning instead of a
    message.
  - fastgreedy.community() is now deprecated with a warning instead of a
    message.
  - edge.betweenness.community() is now deprecated with a warning
    instead of a message.
  - dendPlot() is now deprecated with a warning instead of a message.
  - cutat() is now deprecated with a warning instead of a message.
  - contract.vertices() is now deprecated with a warning instead of a
    message.
  - code.length() is now deprecated with a warning instead of a message.
  - modularity_matrix() is now defunct (errors instead of warning).
  - cluster_leiden() is now deprecated with a warning instead of a
    message.
  - cluster_leading_eigen() is now deprecated with a warning instead of
    a message.
  - cluster_label_prop() is now deprecated with a warning instead of a
    message.
  - exportPajek() is now deprecated with a warning instead of a message.
  - plotHierarchy() is now deprecated with a warning instead of a
    message.
  - maxcohesion() is now deprecated with a warning instead of a message.
  - graph.cohesion() is now deprecated with a warning instead of a
    message.
  - cohesive.blocks() is now deprecated with a warning instead of a
    message.
  - blockGraphs() is now deprecated with a warning instead of a message.
  - maximal.independent.vertex.sets() is now deprecated with a warning
    instead of a message.
  - maximal.cliques.count() is now deprecated with a warning instead of
    a message.
  - maximal.cliques() is now deprecated with a warning instead of a
    message.
  - largest.independent.vertex.sets() is now deprecated with a warning
    instead of a message.
  - largest.cliques() is now deprecated with a warning instead of a
    message.
  - independent.vertex.sets() is now deprecated with a warning instead
    of a message.
  - independence.number() is now deprecated with a warning instead of a
    message.
  - clique.number() is now deprecated with a warning instead of a
    message.
  - maximal_ivs() is now deprecated with a warning instead of a message.
  - centralize.scores() is now deprecated with a warning instead of a
    message.
  - centralization.evcent.tmax() is now deprecated with a warning
    instead of a message.
  - centralization.evcent() is now deprecated with a warning instead of
    a message.
  - centralization.degree.tmax() is now deprecated with a warning
    instead of a message.
  - centralization.degree() is now deprecated with a warning instead of
    a message.
  - centralization.closeness.tmax() is now deprecated with a warning
    instead of a message.
  - centralization.closeness() is now deprecated with a warning instead
    of a message.
  - centralization.betweenness.tmax() is now deprecated with a warning
    instead of a message.
  - centralization.betweenness() is now deprecated with a warning
    instead of a message.
  - centr_degree_tmax() is now defunct (errors instead of warning).
  - centr_eigen() is now deprecated with a warning instead of a message.
  - centr_eigen_tmax() is now deprecated with a warning instead of a
    message.
  - subgraph.centrality() is now deprecated with a warning instead of a
    message.
  - page.rank() is now deprecated with a warning instead of a message.
  - hub.score() is now defunct (errors instead of warning).
  - authority.score() is now defunct (errors instead of warning).
  - graph.strength() is now deprecated with a warning instead of a
    message.
  - graph.eigen() is now deprecated with a warning instead of a message.
  - graph.diversity() is now deprecated with a warning instead of a
    message.
  - evcent() is now deprecated with a warning instead of a message.
  - edge.betweenness() is now deprecated with a warning instead of a
    message.
  - bonpow() is now deprecated with a warning instead of a message.
  - alpha.centrality() is now deprecated with a warning instead of a
    message.
  - estimate_betweenness() is now deprecated with a warning instead of a
    message.
  - estimate_edge_betweenness() is now deprecated with a warning instead
    of a message.
  - estimate_closeness() is now deprecated with a warning instead of a
    message.
  - arpack() is now deprecated with a warning instead of a message.
  - spectrum() is now deprecated with a warning instead of a message.
  - eigen_centrality() is now deprecated with a warning instead of a
    message.
  - eigen_centrality() is now deprecated with a warning instead of a
    message.
  - eigen_centrality() is now defunct (errors instead of warning).
  - authority_score() is now deprecated with a warning instead of a
    message.
  - arpack_defaults() is now deprecated with a warning instead of a
    message.
  - hub_score() is now deprecated with a warning instead of a message.
  - arpack_defaults() is now deprecated with a warning instead of a
    message.
  - bipartite.projection.size() is now deprecated with a warning instead
    of a message.
  - bipartite.projection() is now deprecated with a warning instead of a
    message.
  - bipartite.mapping() is now deprecated with a warning instead of a
    message.
  - get.edge() has been removed.
  - is.igraph() is now deprecated with a warning instead of a message.
  - set.vertex.attribute() is now deprecated with a warning instead of a
    message.
  - set.graph.attribute() is now deprecated with a warning instead of a
    message.
  - set.edge.attribute() is now deprecated with a warning instead of a
    message.
  - remove.vertex.attribute() is now deprecated with a warning instead
    of a message.
  - remove.graph.attribute() is now deprecated with a warning instead of
    a message.
  - remove.edge.attribute() is now deprecated with a warning instead of
    a message.
  - list.vertex.attributes() is now deprecated with a warning instead of
    a message.
  - list.graph.attributes() is now deprecated with a warning instead of
    a message.
  - list.edge.attributes() is now deprecated with a warning instead of a
    message.
  - is.weighted() is now deprecated with a warning instead of a message.
  - is.named() is now deprecated with a warning instead of a message.
  - is.bipartite() is now deprecated with a warning instead of a
    message.
  - get.vertex.attribute() is now deprecated with a warning instead of a
    message.
  - get.graph.attribute() is now deprecated with a warning instead of a
    message.
  - get.edge.attribute() is now deprecated with a warning instead of a
    message.
  - assortativity.nominal() is now deprecated with a warning instead of
    a message.
  - assortativity.degree() is now deprecated with a warning instead of a
    message.
  - assortativity() is now deprecated with a warning instead of a
    message.
  - assortativity() is now deprecated with a warning instead of a
    message.
  - assortativity() is now deprecated with a warning instead of a
    message.
  - ape::as.phylo() is now deprecated with a warning instead of a
    message.
  - graph.adjacency() is now deprecated with a warning instead of a
    message.
  - graph_from_adjacency_matrix() is now deprecated with a warning
    instead of a message.
  - graph_from_adjacency_matrix() is now deprecated with a warning
    instead of a message.

Documentation

  - document() with latest roxygen2 -- for clean diffs (#2642).

                     Changes in version 2.3.1.9003                      

  - Ci: Unify fledge.yaml across cynkratemplate and fledge (#86).

                     Changes in version 2.3.1.9002                      

Chore

  - Add ccache to .gitignore and .Rbuildignore.

Continuous integration

  - Create snapshot update PR against correct branch.

  - Add reference to /apply-patch workflow in commit message.

  - Clarify rationale for not deploying on schedule.

  - Really deploy pkgdown only on push.

  - Disable vendoring workflow to avoid noise.

  - Only run fledge on pushes to main.

  - Tweak fledge workflow and ccache action.

  - Cosmetics.

  - Bump action versions.

  - Install clang-format-21.

  - Align fledge workflow.

  - Harmonize.

Uncategorized

  - Merge branch 'krlmlr-main'.

                     Changes in version 2.3.1.9001                      

Chore

  - Auto-update from GitHub Actions (#2624).

                     Changes in version 2.3.1.9000                      

  - Switching to development version.

                        Changes in version 2.3.1                        

Bug fixes

  - Fix mismatches between C function signatures and function calls.
    This only affects private functions that are defined but not yet
    used (#2620).

                        Changes in version 2.3.0                        

New features

  - Add make_wheel() to expose igraph_wheel() (#1561, #2409).

  - Add transitive_closure() function to compute the transitive closure
    of a graph (#1350, #2413).

  - Add make_full_multipartite() and make_turan() graph constructors
    (#1562, #2406).

  - Add count_loops() (#1379, #2414).

  - Add make_circulant() to expose igraph_circulant() (#1563, #2407).

  - Add mean_degree() (#1380, #2415).

  - Add count_reachable() function (#1349, #2412).

  - Add invalidate_cache() (#1387, #2416).

  - graphlet_basis() returns a list of vertices in the "cliques"
    component instead of a raw integer matrix (#2470, #2472).

  - vertices() now errors on duplicate attribute names (#1248, #2430).

  - Implement generic mechanism for layout_() modifiers, allowing layout
    algorithms to be composed and adjusted uniformly (#1473, #2435).

  - Change graph constructors to use explicit named arguments instead of
    positional ones (#2466, #2467).

  - Improve formatting of error messages originating from the C library
    (#2202, #2515).

  - Functions that accept a single vertex now check that exactly one
    vertex is passed (#2556).

Bug fixes

  - Error call in with_vertex_()/with_edge_() should report the public
    make_() function, not the internal helper (#2609).

  - Not all loops are plotted when a graph has multiple loops at the
    same vertex (#2594, #2595).

  - Fix hrg_game_impl() which produced incorrect results (#2577, #2578).

  - graphlet_proj() no longer erroneously assigns class "igraphHRG" to
    the returned graph.

  - Support character labels in assortativity_nominal() in addition to
    integer type codes (#1283, #2432).

  - Fix uninitialized variable warnings when building with R 4.5 on
    Windows (#2526, #2527).

  - modularity() now uses the "weights" edge attribute automatically
    when no weights argument is supplied.

  - Fix alpha_centrality() crash when weights is set to a custom edge
    attribute name rather than a numeric vector (#915, #2403).

  - Fix matrix lists for output when returning multiple matrices from C.

Documentation

  - Error messages throughout the package now use the cli package for
    consistent, styled output instead of base R stop() (#731, #2588).

  - The R Consortium is listed as a funder with its ROR ID in the
    package metadata (#2587).

  - Fixes to the pkgdown reference index (#2590, #2592).

  - Documentation pages for R functions now automatically link to the
    corresponding C library documentation (#2518).

Testing

  - Structured unit tests alongside snapshot tests have been added for
    all autogenerated _impl functions in test-aaa-auto.R, verifying
    argument passing and return values (#2448, #2449).

Internal

  - The R interface for most C library functions is now autogenerated
    using the py-stimulus framework, covering 108+ functions including
    BFS and DFS callbacks, leading-eigenvector community detection,
    motif callbacks, sparse matrix operations, and graph-list
    constructors. Arguments use snake_case naming throughout for
    consistency (#2152, #2424, #2442, #2461, #2462, #2464, #2465, #2484,
    #2485, #2531, #2532, #2533, #2534, #2540, #2550, #2551, #2552,
    #2553, #2554, #2555).

  - Most direct .Call() invocations to C library functions have been
    replaced with autogenerated _impl() wrapper functions that use
    explicit named arguments, covering all R source files
    (R/assortativity.R, R/bipartite.R, R/centrality.R,
    R/centralization.R, R/cliques.R, R/coloring.R, R/embedding.R,
    R/flow.R, R/games.R, R/layout.R, R/make.R, R/other.R, R/simple.R,
    R/structural-properties.R, R/topology.R, R/trees.R, R/triangles.R,
    and others) (#2332, #2334, #2345, #2347, #2348, #2351, #2352, #2355,
    #2357, #2358, #2359, #2361, #2362, #2363, #2364, #2365, #2366,
    #2367, #2368, #2369, #2370, #2372, #2373, #2374, #2379, #2380,
    #2382, #2383, #2384, #2386, #2388, #2398, #2422, #2423, #2428,
    #2429, #2434, #2443, #2471, #2476, #2477, #2478, #2539, #2541,
    #2545, #2546).

                        Changes in version 2.2.3                        

Chore

  - Remove calls to non-API functions.

                        Changes in version 2.2.2                        

Chore

  - Remove calls to unused APIs only used in the conversion of very old
    graph objects.

                        Changes in version 2.2.1                        

Chore

  - Fix ASAN checks.

  - Add protection to fix rchk error.

Testing

  - Improve centralitystress test (#2214).

  - Fix flaky test.

                        Changes in version 2.2.0                        

Update C core to version 0.10.17. See
https://github.com/igraph/rigraph/blob/20552ef94aed6ae4b23465ae8c7e4d3b0e558c71/src/vendor/cigraph/CHANGELOG.md
for a complete changelog, in particular the section "Breaking changes".

Features

  - Generate almost all R implementations (#2047).

  - Expose align_layout() and add to layout_nicely() to align layout
    with axis automatically (#1907, #1957, #1958).

  - Expose simple_cycles() which lists all simple cycles (#1573, #1580).

  - Expose is_complete(), is_clique() and is_ivs() (#1316, #1388,
    #1581).

  - Expose find_cycle() (#1471, #1571).

  - Expose feedback_vertex_set() to find a minimum feedback vertex set
    in a graph (#1446, #1447, #1560).

  - Add weights parameter to local_scan() (#1082, #1448, #1982).

  - Add more layouts to tkplot() (#160, #1967).

  - Add plot(mark.lwd = ) to change line width of mark.groups (#306,
    #1898).

  - Add plot(vertex.label.angle = , vertex.label.adj = ) arguments to
    rotate vertex labels (#106, #1899).

  - Add relative size scaling to vertices in plot() (@gvegayon, #172).

  - Split sample_bipartite() into two functions for the G(n, m) and G(n,
    p) case (#630, #1692).

  - Implement multi attribute assignment (#55, #1916) and adding
    attributes via data frames (#1373, #1669, #1716). Support factors in
    graph_from_data_frame() (#34, #1829).

  - All _hrg() functions check their argument (#1074, #1699).

  - HRG printing with type = "auto" uses "plain" for large trees
    (#1879).

  - get_edge_ids() accepts data frames and matrices (#1663).

  - igraph_version() returns version of C core in an attribute (#1208,
    #1781).

Breaking changes

  - Breaking change: change arguments default and order for
    graph_from_lcf() (#1858, #1872).

  - Breaking change: Subset assignment of a graph avoids addition of
    double edges and ignores loops unless the new loops argument is set
    to TRUE (#1662, #1661).

  - Breaking change: remove deprecated neimode parameter from bfs() and
    dfs() (#1105, #1526).

  - Breaking change: stricter deprecation of non-functional parameters
    of layout_with_kk() and layout_with_fr() (#1108, #1628).

Bug fixes

  - NA attribute values are replaced with default values in plot()
    (#293, #1707).

  - NA checking only in from/to columns of edge data frame (#1906).

  - Keep vertex attribute type for disjoint_union() (#1640, #1909).

  - Error in bipartite projection if type is not a vertex attribute
    (#898, #1889).

  - Do not try to destroy non-initialized SIR objects upon error
    (#1888).

  - Added proper NA handling for matrix inputs (#917, #918, #1828).

  - Remove string matrix support from functions operating on biadjacency
    matrices (#1540, #1542, #1803).

  - Integer vectors are validated before transferring them to the C
    library (#1434, #1582).

  - Changed base location for graph_from_graphdb() and added tests
    (#1712, #1732).

  - Recycling of logical vectors when indexing into edge/vertex
    selectors now throws an error (#848, #1731).

  - Use function() instead of (x) in arrow.mode (#1722).

  - Temporarily disable generating an interface for
    igraph_simple_cycles_callback() as the framework for handling
    callback functions is not yet present.

Plotting bug fixes

  - Adjust loop position to vertex size in plot() (#1980).

  - Don't rescale plot coordinates to [-1,1] x [-1,1] by default (#1492,
    #1956, #1962).

  - Fail if "layout" attribute doesn't match the number of vertices
    (#1880).

  - Automatically arrange loops in plot() (#407, #556, #1881).

  - Vectorized drawing of arrows in plot() (#257, #1904).

  - Allow more than one edge label font family in plot() (#37, #1896).

  - Pie shapes now work as intended (#1882, #1883).

  - Loops not plotted on canvas (#1799, #1800).

  - Replace NA values in label attributes in plot() with default values
    (#1796, #1797).

  - Removed duplicated plotting of arrow heads (#640, #1709).

  - Correct mapping of edge label properties in plots when loops are
    present (#157, #1706).

Documentation

  - Welcome Maëlle Salmon and David Schoch as authors (#1733), add
    author links (#1821).

  - Remove demos (#2008).

  - Add 2023 preprint (#1240, #1984).

  - Update allcontributors info (#1975).

  - Link to replacements of deprecated functions (#1823).

  - Add documentation of all file formats to read_graph() and
    write_graph() (#777, #1969). Recommend saveRDS() and readRDS() for
    saving and loading graphs (#1242, #1700).

  - Document return value of make_clusters() (#1794).

  - Clarify that girth() returns Inf for acyclic graphs (@eqmooring,
    #1831).

  - Clarify the use of weights in layout_with_kk().

  - Refer to current latest version of R in troubleshooting page.

  - Fix typos in laplacian_matrix() documentation.

  - Document ellipsis in cohesion() (#971, #1985).

  - Correct the description of the weights parameter of hits_scores().

  - Better describe output of all_shortest_paths() (#1029, #1778).

  - make_graph() now supports "Groetzsch" as an alias of "Grotzsch".
    This change was implemented in the C core.

  - Update description of order parameter of ego() and related functions
    (#1746).

  - Added lifecycle table (#1525).

  - Add more about igraph.r2cdocs in the contributing guide (#1686,
    #1697).

Performance

  - Accelerate check if an index sequence corresponds to the entire list
    of vertices (#1427, #1818).

  - Faster single bracket querying of a graph (#1465, #1658).

                        Changes in version 2.1.4                        

Testing

  - Tweak tests that use the graph package.

                        Changes in version 2.1.3                        

Features

  - Use _pv destroy functions to satisfy ASAN checks (#1630).

  - Use safe accessor to vector elements (#1633).

Chore

  - Replace graph.isomorphic() with isomorphic() (#1583, #1623).

Documentation

  - Convert plot.common.Rd to roxygen2 (#1424, #1636).

  - Remove broken example from graph_from_graphdb() manual page (#1622,
    #1637).

  - Document argument for NCOL format in read_graph() (#1621).

  - Make documentation of disjoint_union() consistent with behavior
    (#1587, #1641).

  - Add central note about experimental functions (#1624).

                        Changes in version 2.1.2                        

Bug fixes

  - adjacent_vertices() and incident_edges() are now correct if the
    "return.vs.es" option is FALSE (@stibu81, #1605, #1606).

  - Fix protection errors reported by rchk (#1592).

  - Fix the incorrect handling of the sample parameter in
    sample_motifs() and ensure that the default sample.size is integer
    (#1568).

Documentation

  - Clarify what type of graph each community detection function
    supports.

  - Improve ?read_graph and ?write_graph documentation.

  - Improve all_simple_paths() documentation.

  - cluster_optimal() does support directed graphs.

Testing

  - Test handling of "return.vs.es" in several functions (@stibu81,
    #1610).

                        Changes in version 2.1.1                        

See
https://github.com/igraph/rigraph/blob/9828d7b11be330f994f07ae93a071b356eced903/src/vendor/cigraph/CHANGELOG.md
for a complete changelog, in particular the section "Breaking changes".

Features

  - Add p.value and p.precision arguments to fit_power_law() to control
    the computation of the p-value (#1546).

Bug fixes

  - Preserve as.undirected() signature thanks to @jhollway, regression
    introduced in igraph 2.1.0 (#1536).

Lifecycle

  - Deprecate eigen_centrality(scale = ) (#1543).
  - Put deprecation message at the beginning not the end of the
    similarity functions (#1549).

Documentation

  - Update allcontributors table (#1552).
  - Use mathjax for now (#1538).

Internal

  - Prepare for libxml2 depending on bcrypt, use pkg-config (#1556,
    @kalibera).

                        Changes in version 2.1.0                        

See
https://github.com/igraph/rigraph/blob/05973441b83decdeab8cc9c500a642c00b924770/src/vendor/cigraph/CHANGELOG.md
for a complete changelog, in particular the section "Breaking changes".

Lifecycle

Breaking changes

  - Breaking change: remove tkigraph from {igraph} proper (#1474).
  - Breaking change: Hard-deprecate get.edge() and layout.grid.3d()
    which have been deprecated for 10 years (#1398).
  - Breaking change: use rlang::arg_match() in igraph.match.arg()
    (#1165).

In-progress deprecations

We are working towards a more consistent interface, especially as
regards function naming: ultimately we want the igraph functions to use
snake case. Please update your scripts and codebases as soon as you can.

  - Add independence_number() as an alias of ivs_size() (#1522).
  - Add get_edge_ids() as an alias of get.edge.ids() (#1510).
  - Increase the deprecation signal to a warning for hub.score() and
    authority.score() both replaced by hits_scores() (#1352).
  - Soft-deprecate erdos.renyi.game() and random.graph.game() (#1509).

Features

C library

  - Update vendored C/igraph sources to
    igraph/igraph@d2e0f4eb567dfc505227c346a015bef574c4ccd1.

New functionality

  - Support fit_power_law(implementation = "plfit.p") to compute the
    P-value (#1386).
  - Add max_degree() (#1403).
  - Add experimental sample_chung_lu() (#1416).
  - Rename methods available for sample_degseq() and add the
    "edge.switching.simple" method (#1376).
  - Weight support for eccentricity() and radius() (#1211).
  - Add some argument checking to add_shape() (#1478).

More informative errors

  - Export .from() etc. with behavior similar to dplyr::across()
    (#1436): functions like .from() are meant to be used inside [ but
    now if an user misuses them, the error is more informative.

Bug fixes

  - Fix including diagonal elements in dense adjacency matrices (#1437).
  - Align the body of graph.lattice() with its replacement
    make_lattice() (#1439).
  - Use deprecated() as default value for circular argument to
    make_lattice() (#1431).
  - subgraph_centrality() now ignores edge directions (#1414).
  - Remove unintended type conversions when using disjoint_union()
    (#1375).
  - Add missing PROTECT() (#1382).
  - Fix reading of LGL and NCOL files (broken in 2.0.0) (#1347).
  - Fixed potential memory leak in R_igraph_community_to_membership2()
    (#1367).

Documentation

  - Improve the manual page of sample_() (#1477).
  - Improve cross-links from make_() manual page (#1476).
  - Update is_separator() documentation based on C docs (#1467).
  - Add DOI to citation (#1450).
  - Improve documentation of normalization methods for
    laplacian_matrix() (#1420).
  - Fix typos in ?plot.common (@gvegayon) (#1413).
  - Fix sample_degseq() example (#1297).
  - Fix graph_from_adjacency_matrix() examples to avoid warnings
    (#1302).
  - Replace \dontrun{} with @examplesIf (#1307).
  - Improve sample_gnp() examples.
  - Improve centralization docs.
  - Further clarifications for betweenness() (#1489).
  - Clarify how betweenness with cutoff is normalized.
  - Fix centr_eigen_tmax() docs.
  - Make edge_density() examples relevant.
  - Improve eigen_centrality() documentation.
  - Improved cluster_edge_betweenness() documentation.
  - sample_forestfire() tests and example (#1318).

Developer-facing docs

  - Add slightly tweaked boilerplate CONTRIBUTING.md (#1423).
  - Update troubleshooting document.
  - Use {devtag} for internal function docs (#1507).
  - Make .igraph.progress() and .igraph.status() more internal (#1516).

                        Changes in version 2.0.3                        

See
https://github.com/igraph/rigraph/blob/3299d31/src/vendor/cigraph/CHANGELOG.md
for a complete changelog of the bundled C core, and
https://github.com/igraph/rigraph/compare/f3fa58b..3299d31#diff-aeb78e0159780a9b26daabaf6f95f450b0cfec7161fc735f27ad69145a57dc84
for the changes since the igraph 2.0.1. (A permanent link to the most
recent changelog of the C core used in the R package is
https://github.com/igraph/rigraph/blob/main/src/vendor/cigraph/CHANGELOG.md.)

Features

  - GMP is no longer a dependency (#1256), libxml2 (#1282) and glpk are
    optional.
  - Update vendored sources to
    igraph/igraph@857a125069c226f266562b3781b82833fe1d59d9.
  - New voronoi_cells() to compute the Voronoi partitioning of a graph
    (#1173).

Bug fixes

  - Fix rglplot(edge_label = ) (#1267).

Continuous integration

  - Run examples with sanitizer (#1288).
  - Add scheduled builds.

Documentation

  - Make x11() usage in example happen only in interactive sessions
    (#1301).
  - Remove misleading comment about warning given as no warning is given
    (#1294).
  - Improve min_st_separators() documentation (#1264).
  - Add link to discussion forum (#1279) and logo (#1280).
  - Add code finding duplicate @seealso, and use it (#1270).
  - Remove duplicate @seealso from ?sample_pa (#1268).
  - Remove incorrect claim about handling of complete graphs by
    is_separator() and is_min_separator() (#1263).
  - Fix error messages mentioning to mention upgrade_graph() instead of
    the nonexisting upgrade_version() (#1252).
  - Split is_bipartite() manual page from other manual page (#1230).
  - Improve bug report template.
  - CITATION.cff contains only the first three version components.
  - Install lock workflow to lock stale discussions after one year
    (#1304).

Internal

  - Replace use of deprecated barabasi.game() with sample_pa() (#1291).
  - Auto-generate are_adjacent(), avoid deprecated
    igraph_are_connected() C function (#1254).

                        Changes in version 2.0.2                        

See
https://github.com/igraph/rigraph/blob/f3fa58b/src/vendor/cigraph/CHANGELOG.md
for a complete changelog of the bundled C core, and
https://github.com/igraph/rigraph/compare/1bd2bf79..f3fa58b#diff-aeb78e0159780a9b26daabaf6f95f450b0cfec7161fc735f27ad69145a57dc84
for the changes since the igraph 2.0.1. (A permanent link to the most
recent changelog of the C core used in the R package is
https://github.com/igraph/rigraph/blob/main/src/vendor/cigraph/CHANGELOG.md.)

Bug fixes

  - g + vertices(1, 2, foo = 3) works again, regression introduced in
    igraph 2.0.0 (#1247).
  - sample_pa() respects the out.seq and out.dist arguments again,
    regression introduced in igraph 2.0.0 (#1226).
  - isomorphisms() and subgraph_isomorphisims(method = "vf2") work
    again, regression introduced in 2.0.0 (#1219).
  - biconnected_components() now returns edge and vertex sequences
    again, regression introduced in 2.0.0 (#1213).
  - Remove zeros from the order and order.out components returned by
    dfs(), regression introduced in 2.0.0 (#1179).
  - Memory leaks when converting data to C (#1196).

Features

  - realize_bipartite_degseq() creates a bipartite graph from two degree
    sequences (#1212).
  - is_biconnected() checks if a graph is biconnected (#1204).
  - distances() now supports the Floyd-Warshall algorithm (#1186).

Documentation

  - Use more culturally diverse names in intro vignettes (#1246).
  - Formatting tweaks in introductory vignettes (#1243).
  - Recommend {pak} instead of {remotes} (#1228).
  - Fix typo in mean_distance() docs.
  - Update troubleshooting document, emphasize issues with Anaconda
    environments (#1209).
  - Improved docs for shortest path functions (#1201).
  - Document "dsatur" heuristic for greedy_vertex_coloring() (#1206).
  - Remove scg related docs (#1167).
  - Fix typo in ?articulation_points (#1191).
  - Improve installation and troubleshooting instructions (#1184).
  - Improve docs of assortativity (#1151).

Testing

  - Add tests for isomorphisms() and subgraph_isomorphisms() (#1225).

Packaging

  - Always use bundled mini-gmp (#1233).
  - config.h defines HAVE___UINT128_T (#1216).
  - Do not rely on which program during configuration (#1232).
  - configure manage libxml multiple include paths (#1197).
  - Remove empty string in configure (#1235).
  - Link Fortran runtime on Windows as needed by arpack. (#1215).
  - Workaround for deprecated enum values not being supported with old
    GCC (#1205).
  - HAVE_GFORTRAN flag for win and ucrt (#1171).
  - make_empty_graph() is now fully auto-generated (#1068).
  - Eliminate manual edits from autogenerated files (#1207).
  - Add read-only comments for RStudio IDE (#1152).

Internal

  - Remove unused patch files (#1234).
  - Update stimulus to 0.21.4 (#1210).
  - Avoid duplicate objects (#1223).
  - Eliminate a compiler warning from simpleraytracer (#1185).

                       Changes in version 2.0.1.1                       

Bug fixes

  - Avoid is.R() which is deprecated in R 4.4.0.

                        Changes in version 2.0.1                        

Bug fixes

  - Use cpp11 for simpleraytracer glue to avoid -Wlto warnings (#1163).

                        Changes in version 2.0.0                        

This major release brings development in line with the C core at
https://github.com/igraph/igraph. See
https://github.com/igraph/rigraph/blob/1bd2bf79/src/vendor/cigraph/CHANGELOG.md
for a complete changelog, in particular the section "Breaking changes".
(A permanent link to the most recent changelog of the C core used in the
R package is
https://github.com/igraph/rigraph/blob/main/src/vendor/cigraph/CHANGELOG.md.)

Version 1.6.0 of the R package used version 0.9.9 of the C core. The
changes in the 0.10 series of the C core are relevant for version 2.0.0
of the R package, but not all C core functions are exposed in the R
interface. Changes to the implementation of some functions in the C core
may be reflected in functions in the R package.

The change log below is a summary of the additional changes in the R
interface.

Breaking changes

  - get.edge.ids(multi = TRUE) and as_adjacency_matrix(edges = ) are no
    longer supported (#1101, #1080).

  - Remove NA padding for dfs(unreachable = FALSE)$order and $order.out
    and for bfs(unreachable = FALSE)$order, also for
    igraph_options(return.vs.es = FALSE) (#1062, #1124).

  - laplacian_matrix(normalized = TRUE) uses a different normalization
    method (#1102).

  - fit_power_law() no longer returns a KS.p component.

  - Remove default value for loops argument of centr_degree_tmax()
    (#1114).

  - as_adjacency_matrix() no longer supports attributes of type
    character (#1072).

  - Remove graph.isomorphic.34() (#1065, #1067).

  - Use lifecycle::deprecate_soft() for most deprecated functions
    (#1024, #1025, #1104).

  - The system libraries GLPK, GMP, and libxml2 are now mandatory for
    compiling from source.

Bug fixes

  - Add scalar conversion checks in a few critical places (#1069).

  - Check that we receive a scalar when expecting a scalar in C code
    (#1051).

  - Check that matrix sizes are in the supported range before passing
    them to R (#1066).

  - transitivity() now produces a named vector in the local (weighted)
    case (#1057).

  - plot() correctly computes intersections between edges and rectangle
    vertices (#1021).

  - Fix compilation on Windows with spaces in the Rtools path (#1000).

Features

  - Use 30 bits of R's RNG (#1079).

  - Breaking change: Remove NA padding for dfs(unreachable =
    FALSE)$order and $order.out and for bfs(unreachable = FALSE)$order,
    also for igraph_options(return.vs.es = FALSE) (#1062, #1124).

  - New k_shortest_paths() to compute the first k shortest paths between
    two vertices (#1028).

Documentation

  - Add GitHub bug report form.

  - New vignette("deprecated-dot-case") that lists deprecated functions
    and their alternatives (#1013).

  - Move deprecation badge to top of doc pages.

  - Remove usage of get.adjacency() from intro vignettes (#1084).

  - Fix math formatting in fit_power_law() docs.

  - Fix incorrect usage in subgraph.edges() example.

  - Clarify that Infomap considers edge directions.

  - Improve edge connectivity docs (#1119).

  - Add some missing diacritics.

Internal

  - Use [] assignment for converting matrices (#1035).

  - Move towards autogenerating all bindings (#1043).

  - Use %||% from rlang (#1112).

  - Replace loop by lapply() when returning vertex and edge sets
    (#1033).

  - Do not duplicate prototypes, use a common header for rinterface.c
    and rinterface_extra.c (#1055).

  - Clean up some auto-generation code (#1031), remove unused parts from
    code generation (#1032), eliminate the use of some deprecated C
    functions.

  - Use integers for mode enum in cluster_label_prop().

  - Standardize the handling of some stimulus enum types (#1064).

  - Remove unused vectorlist / matrixlist destructors (#1070).

  - Remove unused stimulus type VERTEXSETLIST_INT (#1049).

  - Remove unused types (#1060).

  - Fix Stimulus definitions (#997).

  - Avoid deprecated R_igraph_automorphisms() (#999).

  - Use new ARPACK_DEFAULTS symbol from C core for default arpack
    options.

  - Ignore upstream CITATION file to avoid R CMD check NOTE (#1007).

  - Add Aviator configuration.

Testing

  - Add as_biadjacency_matrix() tests for named vectors (#1154, #1155).

  - Test transferring colors in isomorphism functions (#1050).

                        Changes in version 1.6.0                        

Breaking changes

  - New arpack_defaults() replaces igraph.arpack.default and
    arpack_defaults lists (#800), with consistent usage checks (#966).

  - Define methods for ape::as.phylo() instead of own as_phylo()
    generic, remove deprecated asPhylo() (#763).

  - bfs() with unreachable nodes returns zero instead of NaN as rank
    (#956), and negative instead of NaN for dist (#926).

  - random_walk() adds one more step, the resulting list of vertices is
    of length steps + 1 (#934).

  - girth() returns Inf for acyclic graphs (#931).

  - Remove some behaviour / parameters that were deprecated in 1.3
    (#842).

  - Remove scg_eps(), scg_group() and scg_semi_proj(), broken and no
    longer maintained (#946).

Bug fixes

  - Fix printf() warning (#975).

  - Fix calls to isSymmetric() for matrix objects with a class (#965).

  - Reduce frequency of interruption checks (#957).

Features

  - Change "incidence matrix" naming to "biadjacency matrix" (#962).

  - Add aliases using the neighborhood terminology for all ego
    functions: (#950).

  - Rename arguments to assortativity(values, values.in) from types1 and
    types2 (#952).

  - Add ellipsis to cluster_label_prop() (#954).

  - Placeholders for is_acyclic() and is_forest(), to be implemented in
    igraph 2.0.0 (#945).

  - is_tree(details = TRUE) designates the first vertex as root for
    non-trees (#935).

  - all_shortest_paths() returns the vertex list in both res and vpaths
    components (#930).

  - Improve symmetry check for adjacency matrices on input (#911).

  - Warn if non-symmetric undirected adjacency matrix (#904).

Documentation

  - Remove duplicate \seealso{} (#948).

  - Update knnk() and sir() docs.

  - Fix formula in reciprocity() docs.

  - strength() does not give a warning when no weights are given.

  - Update sample_smallworld() manual page (#895).

  - Correct documentation for weighted cliques.

  - Update Erdos-Renyi model docs.

Testing

  - Clean up tests (#967).

  - Stabilize tests for cluster_label_prop() (#932), sample_pa() (#927),
    cluster_louvain() (#933), SIR (#936), sample_forestfire() (#929).

  - Hard-code graph used in test (#928).

  - Update GML test file (#925).

  - Improve test for sampling from Dirichlet distribution (#923).

  - Omit test that no longer holds with igraph 0.10 (#922).

  - Stabilize test in preparation for upgrade (#920).

  - Stabilize plot test (#919).

  - Fix checks.

                        Changes in version 1.5.1                        

Breaking changes

  - Breaking change: start deprecation of estimate_betweenness(),
    estimate_edge_betweenness(), estimate_closeness() (#852).

Bug fixes

  - identical_graphs() now correctly detects identical graphs without
    node or edge attributes (#757).

Internal

  - Change ownership rules of attribute objects (#870).

  - R_SEXP_to_igraph() and R_SEXP_to_igraph_copy() get igraph_t object
    from external pointer (#865).

  - Remove ETIME() call from Fortran code, already in CRAN
    version 1.5.0.1 (#858).

  - Ensure that _GNU_SOURCE is always defined (#877).

  - Fix make clean (#860).

  - Fix generation of code for functions with VERTEX_COLOR out-arguments
    (#850).

  - Use -lquadmath in Makevars.win, for compatibility with alternative R
    distributions such as Microsoft R Open (#855).

  - getRversion() uses strings.

Documentation

  - Add cffr file and a GHA workflow that updates it automatically
    (#873).

  - Undeprecate neighborhood() (#851).

  - Remove redundant reference to AUTHORS from DESCRIPTION.

Refactoring

  - Breaking change: start deprecation of estimate_betweenness(),
    estimate_edge_betweenness(), estimate_closeness() (#852).

                        Changes in version 1.5.0                        

Breaking changes

The internal format of graph objects has changed in a mostly
backward-compatible way, to prepare for upgrading the C core to 0.10.
Details are described at
https://github.com/igraph/rigraph/wiki/The-igraph-object-format.
Accessing graph objects that have been created with an older igraph
version give a clean error message with instructions (#832). The new
format cannot be read by igraph 1.4.3 or older, the following error is
raised when trying to do so:

This graph was created by an old(er) igraph version.
  Call upgrade_graph() on it to use with the current igraph version
  For now we convert it on the fly...
Error in is_directed(object) :
  REAL() can only be applied to a 'numeric', not a 'NULL'

The only supported remedy is to upgrade the igraph package to
version 1.5.0 or later.

graph_version() now returns an integer scalar (#832, #847), 4 as of
igraph 1.5.0 (#835).

Features

  - Vertex and edge sequences are converted to numeric vectors when used
    in attributes (#808).

  - New largest_component() returns the largest connected component
    (#786, @ngmaclaren).

Bug fixes

  - Fix error message in make_graph() when simplify = ... is used with a
    non-formula (#834).

Testing

  - Add more tests for graph_from_literal() (#826).

  - Reenable serialization test and tests for dyad_census(), stabilize
    tests (#809, #822, #823).

Documentation

  - The documentation for the R package is now hosted at
    https://r.igraph.org/ (#780).

  - Update vignette("installation-troubleshooting").

  - Fix use of deprecated functions in examples, e.g., replace gsize()
    by ecount() (#827).

  - Fix typos in ?eigen_centrality docs (@JJ).

  - Update CONTRIBUTING.md and ORCID information (#791, #774).

  - Add DOI to CITATION (#773).

Internal

  - Add data for old igraph versions as constructed objects, and tests
    (#838).

  - Ensure we're always using named indexes to access the internal data
    structure (#784).

  - Prepare migration to igraph/C 0.10 (#781).

  - Update generated interface (#765).

                        Changes in version 1.4.3                        

Internal

  - Fix tests for dev waldo (#779, @hadley).

  - Fix linking on Windows: gfortran needs quadmath. (#778).

Documentation

  - Mention limitation of Pajek reader (#776).

                        Changes in version 1.4.2                        

Breaking changes

  - Remove igraph.eigen.default() and eigen_defaults, introduce internal
    eigen_defaults() as a function (#741).

  - Remove broken nexus*() functions (#705), and srand() (#701).

C core

  - Update C core.

  - ARPACK-based calculations are now interruptible.

  - shortest_paths() and all_shortest_paths() no longer crash when an
    invalid from vertex is passed and weights are being used.

See diff for details.

Printing

  - Use true vertex names for printing vertex sets. If a vertex set
    captures a relationship between vertices (e.g., the father component
    of bfs()), the vertex set is printed as a named vector (#754).

  - Suggest restarting R session after fatal error (#745).

Bug fixes

  - as_long_data_frame() now correctly processes vertex attributes and
    works with graphs without vertex attributes (#748).

  - as.hclust(hrg.fit(g)) works again (#721).

Documentation

  - The documentation is now available at https://igraph.org/ (#743).

  - Reorganize function reference (#662).

  - Replace graph() with make_graph() in examples (#738).

  - Add docs for as.hclust.igraphHRG() (#733).

  - Merged man page of hub_score() and authority_score() (#698).

  - Refactor contributors listing (#647).

  - Improve "family" titles (#679).

  - Improve docs of ego/neighborhood functions.

  - Improve transitivity() docs.

Internal

  - Introduce cpp11 package to improve error handling in the long run
    (#720).

  - Avoid longjmp for error handling and interrupts (#751).

  - as.hclust.igraphHRG uses .Call() interface (#727).

                        Changes in version 1.4.1                        

Bug fixes

  - console() now works again and provides a Tcl/Tk based UI where
    igraph can post status messages and progress info (#664).

  - Fix errors when printing long vertex names (#677, @ahmohamed).

  - Fix regression that broke builds on some systems (e.g., GCC
    version 5 or earlier), introduced in igraph 1.4.0 (#670, #671).

  - fit_hrg() does not crash any more when called with a graph that has
    less than three vertices.

Documentation

  - Various improvements (#663, @maelle; #667).

Internal

  - Fix warning about yyget_leng() returning wrong type when using LTO
    (#676).

  - Don't mention C++11 or C++17 for best compatibility with both newest
    R and older compilers, while still requesting a C++ compiler for
    linking.

  - Don't ignore build/ when building the package because the vignette
    index is built there.

  - Skip plot test entirely on R-devel.

  - Avoid submodules for building igraph (#674).

  - Makevars cleanup (#671).

  - Add Zenodo configuration file.

                        Changes in version 1.4.0                        

Breaking changes

  - Breaking change: Allow change of attribute type when setting
    attribute for all vertices or edges; only attributes of length 1 or
    the length of the target set allowed (#633).

Added

  - tkplot() gained a palette argument and it is now using the same
    palette as plot() by default, for sake of consistency.
  - plot.igraph() gained a loop.size argument that can be used to scale
    the common radius of the loop edges.

Fixed

  - The default maximum number of iterations for ARPACK has been
    increased to 3000 to match that of the igraph C core.
  - Rare convergence problems have been corrected in
    cluster_leading_eigen().
  - All ARPACK-based functions now respect random seeds set in R when
    generating a random starting vector.
  - igraph_version() returned an invalid value in 1.3.4, this is now
    corrected.
  - The value of par(xpd=...) is now restored after plotting a graph.
  - Fixed a bug in as.dendrogram.communities() for large dendrograms,
    thanks to @pkharchenko (see PR #292).
  - Fixed two bugs in graph_from_incidence_matrix() that prevented the
    creation of directed graphs with mode="all" from dense or sparse
    matrices.
  - dfs() accidentally returned zero-based root vertex indices in the
    result object; this is now fixed and the indices are now 1-based.
  - as_graphnel() does not duplicate loop edges any more.
  - as_graphnel() now checks that the input graph has no multi-edges.
    Multi-edges are not supported by the graphNEL class.
  - convex_hull() now returns the vertices of the convex hull
    with 1-based indexing.
  - Some rgl.*() function calls in the codebase were replaced with
    equivalent *3d() function calls in preparation for upcoming
    deprecations in rgl (see PR #619)
  - plot.igraph() does not use the frame=... partial argument any more
    when calling plot.default(). The default NULL value of frame.plot is
    now also handled correctly.
  - hub_score() and authority_score() considered self-loops only once on
    the diagonal of the adjacency matrix of undirected graphs, thus the
    result was not identical to that obtained by eigen_centrality() on
    loopy undirected graphs. This is now corrected.
  - distances() no longer ignores the mode parameter when
    algorithm='johnson'.

Deprecated

  - automorphisms() was renamed to count_automorphisms(); the old name
    is still available, but it is deprecated.

Other

  - Documentation improvements.
  - The Github repository was now moved to a single-branch setup where
    the package can be built from the main branch directly.
  - Added igraph extended tutorial as an R vignette (#587).
  - igraph now has a homepage based on pkgdown thanks to @maelle (see
    #645). This will eventually become the official homepage.

                        Changes in version 1.3.5                        

Added:

  - mark.groups=... argument of plot.igraph() now accepts communities
    objects

Fixed:

  - Negative degree exponents are not allowed any more in sample_pa()
    and sample_aging_pa().

  - Package updated to be compatible with Matrix 1.5.

Other:

  - Documentation improvements and fixes.

                        Changes in version 1.3.4                        

Added:

  - sample_asym_pref() now returns the generated types of the vertices
    in the vertex attributes named outtype and intype.

Fixed:

  - layout_nicely() does not recurse infinitely any more if it is
    assigned to the layout attribute of a graph

  - layout_nicely() now ignores edge weights when there are non-positive
    edge weights. This is needed because igraph 1.3.3 started validating
    edge weights in layout_with_fr() and layout_with_drl(), resulting in
    errors when layout_nicely() was used on weighted graphs with
    negative weights. Since layout_nicely() is the default layout
    algorithm for plot(), most users were not even aware that they were
    using the FR or DrL layouts behind the scenes. Now the policy is
    that layout_nicely() attempts to get the job done without errors if
    possible, even if that means that edge weights must be ignored. A
    warning is printed if this is the case.

                        Changes in version 1.3.3                        

Added:

  - reverse_edges() reverses specific or all edges in a graph.

  - Single-bracket indexing of V() and E() resolves attribute names in
    the indexing expressions by default (for instance, E(g)[weight > x]
    matches edges with a weight larger than a threshold). This can be
    problematic if the attribute masks one of the variables in the local
    evaluation context. We now have a pronoun called .env (similarly to
    rlang::.env) that allows you to force attribute name lookup to the
    calling environment. For sake of completeness, we also provide .data
    (similarly to rlang::.data) to force attribute name lookup to the
    vertex / edge attributes only. These pronouns are automatically
    injected into the environment where the indexing expression is
    evaluated.

Deprecated:

  - Names of functions that can be used inside a V() or E() indexing
    start with a dot since igraph 1.1.1; however, the old dotless names
    did not print a deprecation warning so this may have gone unnoticed
    for years. We are introducting a deprecation warning for nei(),
    innei(), outnei(), inc(), from() and to() inside single-bracket
    indexing of vertex and edge sequences and will remove the old
    variants soon.

                        Changes in version 1.3.2                        

The C core is updated to 0.9.9, fixing a range of bugs.

Fixed:

  - The length of size-zero communities objects is now reported
    correctly.
  - layout_with_kk() would fail to produce reasonable results with the
    default initial coordinates. This has been corrected, however, this
    function no longer produces precisely the same output for a given
    graph as before. To restore the previous behaviour, use
    layout_with_kk(g, coord=layout_in_circle(g)) in 2D or
    layout_with_kk(g, dim=3, coord=layout_on_sphere(g)) in 3D.
  - Indexing an igraph.vs object with v[x, na_ok=T] now correctly
    handles the na_ok argument in all cases; previous versions ignored
    it when x was a single number.

Other:

  - Documentation improvements and fixes.

                        Changes in version 1.3.1                        

Fixed:

  - graph_from_adjacency_matrix() now works with sparse matrices even if
    the cell values in the sparse matrix are unspecified.
  - Fixed crash in cluster_walktrap() when modularity=FALSE and
    membership=FALSE.
  - cluster_walktrap() no longer accepts invalid weight vectors.
  - cluster_walktrap() no longer returns a modularity vector of invalid
    length for disconnected graphs. This also fixes some rare failures
    of this function on weighted disconnected graphs.
  - edge_attr() does not ignore its index=... argument any more.
  - automorphisms(), automorphism_group() and canonical_permutation()
    now allow all possible values supported by the C core in the sh
    argument. Earlier versions supported only "fm".
  - The vertex.frame.width plotting parameter now allows zero and
    negative values; these will simply remove the outline of the
    corresponding vertex.
  - The documentation of the sh argument of the BLISS isomorphism
    algorithm in isomorphic() was fixed; earlier versions incorrectly
    referred to sh1 and sh2.
  - dominator_tree() now conforms to its documentation with respect to
    the dom component of the result: it contains the indices of the
    dominator vertices for each vertex and -1 for the root of the
    dominator tree.
  - Mentions of the "power" algorithm of page_rank() have been removed
    from the documentation, as this method is no longer available.
  - Several other documentation fixes to bring the docs up to date with
    new behaviours in igraph 1.3.

                        Changes in version 1.3.0                        

The C core is updated to 0.9.7, fixing a range of bugs and introducing a
number of new functions.

Added:

  - has_eulerian_path() and has_eulerian_cycle() decides whether there
    is an Eulerian path or cycle in the graph.
  - eulerian_path() and eulerian_cycle() returns the edges and vertices
    in an Eulerian path or cycle in the graph.
  - any_loop() checks whether a graph contains at least one loop edge.
  - is_tree() checks whether a graph is a tree and also finds a possible
    root
  - to_prufer() converts a tree graph into its Prufer sequence
  - make_from_prufer() creates a tree graph from its Prufer sequence
  - sample_tree() to sample labelled trees uniformly at random
  - sample_spanning_tree() to sample spanning trees of an undirected
    graph uniformly at random
  - automorphisms() and canonical_permutation() now supports vertex
    colors
  - random_edge_walk() to record the edges traversed during a random
    walk
  - harmonic_centrality() calculates the harmonic centrality of
    vertices, optionally with a cutoff on path lengths
  - mean_distance() now supports edge weights and it can also return the
    number of unconnected vertex pairs when details=TRUE is passed as an
    argument
  - greedy_vertex_coloring() finds vertex colorings based on a simple
    greedy algorithm.
  - bridges() finds the bridges (cut-edges) of a graph
  - The frame width of circle, rectangle and square vertex shapes can
    now be adjusted on plots with the frame.width vertex attribute or
    the vertex.frame.width keyword argument, thanks to @simoncarrignon .
    See PR #500 for more details.
  - automorphism_group() returns a possible (not necessarily minimal)
    generating set of the automorphism group of a graph.
  - global_efficiency() calculates the global efficiency of the graph.
  - local_efficiency() calculates the local efficiency of each vertex in
    a graph.
  - average_local_efficiency() calculates the average local efficiency
    across the set of vertices in a graph.
  - rewire(each_edge(...)) now supports rewiring only one endpoint of
    each edge.
  - realize_degseq() generates graphs from degree sequences in a
    deterministic manner. It is also available as make_(degseq(...,
    deterministic=TRUE)).
  - clique_size_counts() counts cliques of different sizes without
    storing them all.
  - feedback_arc_set() finds a minimum-weight feedback arc set in a
    graph, either with an exact integer programming algorithm or with a
    linear-time approximation.
  - make_bipartite_graph() now handles vertices with names.
  - shortest_paths() now supports graphs with negative edge weights.
  - min_cut() now supports s-t mincuts even if value.only=FALSE.
  - as.matrix() now supports converting an igraph graph to an adjacency
    or edge list matrix representation. See as.matrix.igraph() for more
    details. This function was migrated from intergraph; thanks to
    Michal Bojanowski.

Fixed:

  - is_connected() now returns FALSE for the null graph
  - Calling length() on a graph now returns the number of vertices to
    make it consistent with indexing the graph with [[.
  - diameter() now corrently returns infinity for disconnected graphs
    when unconnected=FALSE. Previous versions returned the number of
    vertices plus one, which was clearly invalid for weighted graphs.
  - mean_distance() now correctly treats the path length between
    disconnected vertices as infinite when unconnected=FALSE. Previous
    versions used the number of vertices plus one, adding a bias towards
    this number, even if the graph was weighted and the number of
    vertices plus one was not a path length that could safely have been
    considered as being longer than any "valid" path.
  - layout_with_sugiyama() now handles the case of exactly one extra
    virtual node correctly; fixes #85
  - bfs() and dfs() callback functions now correctly receive 1-based
    vertex indices and ranks; it used to be zero-based in earlier
    versions
  - Accidentally returning a non-logical value from a bfs() or dfs()
    callback does not crash R any more
  - Calling print() on a graph with a small max.lines value (smaller
    than the number of lines needed to print the attribute list and the
    header) does not raise an error any more; fixes #179
  - as_adjacency_matrix(edges=TRUE, sparse=TRUE) now consistently
    returns the last edge ID for each cell in the matrix instead of
    summing them.
  - Using the + and - operators with a path() object consisting of two
    vertices is now handled correctly; fixes #355
  - topo_sort() now throws an error if the input graph is not acyclic
    instead of returning an incorrect partial ordering.
  - Weighted transitivity calculations (i.e. transitivity(mode="barrat")
    now throw an error for multigraphs; the implementation does not work
    correctly for multigraphs and earlier versions did not warn about
    this.

Changed:

  - The neimode argument of bfs() and dfs() was renamed to mode for sake
    of consistency with other functions. The old argument name is
    deprecated and will be removed in 1.4.0.
  - bfs() and dfs() callback functions now correctly receive 1-based
    vertex indices and ranks; it used to be zero-based in earlier
    versions. (This is actually a bugfix so it's also mentioned in the
    "Fixed" section).
  - closeness(), betweenness() and edge_betweenness() now all take a
    cutoff argument on their own. estimate_closeness(),
    estimate_betweenness() and estimate_edge_betweenness() became
    aliases, with identical signature. They are not deprecated but their
    implementation might change in future versions to provide proper
    estimation schemes instead of a simple cutoff-based approximation.
    If you explicitly need cutoffs and you want your results to be
    reproducible with future versions, use closeness(), betweenness()
    and edge_betweenness() in your code with a cutoff argument.
  - closeness() now only considers reachable vertices during the
    calculation; in other words, closeness centrality is now calculated
    on a per-component basis for disconnected graphs. Earlier versions
    considered all vertices.

Deprecated:

  - Using cutoff=0 for closeness(), betweenness() and edge_betweenness()
    is deprecated; if you want exact scores, use a negative cutoff.
    cutoff=0 will be interpreted literally from igraph 1.4.0.
  - centr_degree_tmax() now prints a warning when it is invoked without
    an explicit loops argument. loops will be mandatory from
    igraph 1.4.0.
  - The nexus_list(), nexus_info(), nexus_get() and nexus_search()
    functions now return an error informing the user that the Nexus
    graph repository has been taken offline (actually, several years
    ago). These functions will be removed in 1.4.0.
  - The edges argument of as_adjacency_matrix() is deprecated; it will
    be removed in igraph 1.4.0.

Removed:

  - The deprecated page_rank_old() function and the deprecated power
    method of page_rank() were removed.

                       Changes in version 1.2.11                        

Dec 27, 2021

No user visible changes.

                       Changes in version 1.2.10                        

Dec 14, 2021

Fixed:

  - The macOS versions of igraph were accidentally built without GraphML
    support on CRAN; this should now be fixed.

                        Changes in version 1.2.9                        

Nov 22, 2021

No user visible changes.

                        Changes in version 1.2.8                        

Oct 26, 2021

No user visible changes.

                        Changes in version 1.2.7                        

Oct 15, 2021

The C core is updated to 0.8.5, fixing a range of bugs and introducing a
number of new functions.

Added:

  - cluster_leiden added (#399).
  - cluster_fluid_communities added (#454)

Fixed:

  - make_lattice() correctly rounds length to the nearest integer while
    printing a warning (#115).
  - make_empty_graph(NULL) now prints an error instead of producing an
    invalid graph (#404).
  - make_graph(c()) now produces an empty graph instead of printing a
    misleading error message (#431).
  - Printing a graph where some edges have NA as the names of both
    endpoints does not produce a misleading error message any more
    (#410).
  - The types argument of functions related to bipartite graphs now
    prints a warning when the types are coerced to booleans (#476).
  - Betweenness normalisation no longer overflows (#442).
  - layout_with_sugiyama() returns a layout of type matrix even if there
    is only one vertex in the graph (#408).
  - Plotting a null graph (i.e. a graph with no vertices) does not throw
    an error any more (#387).

Deprecated:

  - The membership argument of modularity.matrix() is now deprecated as
    the function never needed it anyway.
  - modularity() now prints a warning when it is applied on a directed
    graph because the implementation in igraph's C core does not support
    directed graphs as of version 0.8.5. The warning will be turned into
    an error in the next minor (1.3.0) version of the R interface; the
    error will be removed later when the C core is updated to a version
    that supports modularity for directed networks.
  - transitivity() now prints a warning when its local variant
    (type="local") is called on a directed graph or a graph with
    multiple edges beecause the implementation in the C core of igraph
    does not work reliably in these cases as of version 0.8.5. The
    warning will be turned into an error in the next minor (1.3.0)
    version of the R interface; the error will be removed later when the
    C core is updated to a version that supports transitivity for
    networks with multiple edges.

Misc:

  - Documentation improvements.

                        Changes in version 1.2.6                        

Oct 5, 2020

No user visible changes.

                        Changes in version 1.2.5                        

Mar 27, 2020

No user visible changes.

                        Changes in version 1.2.4                        

Feb 13, 2019

No user visible changes.

                        Changes in version 1.2.3                        

Jan 27, 2019

No user visible changes.

                        Changes in version 1.2.2                        

Jul 27, 2018

No user visible changes.

                        Changes in version 1.2.1                        

  - The GLPK library is optional, if it is not available, then the
    cluster_optimal() function does not work. Unfortunately we cannot
    bundle the GLPK library into igraph on CRAN any more, because CRAN
    maintainers forbid the pragmas in its source code.
  - Removed the NMF package dependency, and related functions.
  - Fix compilation without libxml2

                        Changes in version 1.1.2                        

Jul 20, 2017

  - Fix compilation on Solaris

                        Changes in version 1.1.1                        

Jul 13, 2017

  - Graph id is printed in the header, and a graph_id function was added
  - Fix edge_attr for some index values
  - Fix a bfs() bug, restricted argument was zero-based
  - match_vertices is exported now
  - %>% is re-exported in a better way, to avoid interference with other
    packages
  - ego_ functions default to order = 1 now
  - New function igraph_with_opt to run code with temporary igraph
    options settings
  - Fix broken sample_asym_pref function
  - Fix curve_multiple to avoid warnings for graphs with self-loops.
  - The NMF package is only suggested now, it is not a hard dependency
  - Fix gen_uid.c _SVID_SOURCE issues
  - Avoid drawing straight lines as Bezier curves
  - Use the pkgconfig package for options. This allows setting options
    on a per-package basis. E.g. a package using igraph can set
    return.vs.es to FALSE in its .onLoad() function, and then igraph
    will return plain numeric vectors instead of vertex/edge sequences
    if called from this package.
  - igraph_options() returns the old values of the updated options, this
    is actually useful, returning the new values was not.
  - with_igraph_opt() function to temporarily change values of igraph
    options.
  - get.edge() is deprecated, use ends() instead. (This was already the
    case for igraph 1.0.0, but we forgot to add a NEWS point for it.)
  - Do not redefine .Call(), to make native calls faster.
  - Speed up special cases of indexing vertex sequences.
  - Removed an anyNA() call, to be compatible with older R versions.
  - Fixed a fast-greedy community finding bug,
    https://github.com/igraph/igraph/issues/836
  - Fixed head_of() and tail_of(), they were mixed up.
  - Plot: make label.dist independent of label lengths, fixes #63.
  - Plot: no error for unknown graphical parameters.
  - Import functions from base packages, to eliminate R CMD check NOTEs.
  - Re-add support for edge weights in Fruchterman-Reingold layout
  - Check membership vector in modularity().
  - Rename str.igraph() to print_all().
  - Use the igraph version in exported graphs, instead of @VERSION@ #75.
  - Functions that can be used inside a V() or E() indexing now begin
    with a dot. Old names are deprecated. New names: .nei(), .innei(),
    .outnei(), .inc(), .from(), .to(). #22
  - Fix packages that convert graphs to graph::graphNEL: they don't need
    to attach 'graph' manually any more.
  - Fix a bugs in layout_with_dh, layout_with_gem and
    layout_with_sugiyama. They crashed in some cases.

                        Changes in version 1.0.1                        

June 26, 2015

Some minor updates:

  - Documentation fixes.
  - Do not require a C++-11 compiler any more.
  - Fedora, Solaris and Windows compilation fixes.

                        Changes in version 1.0.0                        

June 21, 2015

Release notes

This is a new major version of igraph, and then why not call it 1.0.0.
This does not mean that it is ready, it'll never be ready.

The biggest changes in the release are

  - the new function names. Most functions were renamed to make them
    more consistent and readable. (Relax, old names can still be used,
    no need to update any code.)
  - Better operations for vertex and edge sequences. Most functions
    return proper vertex/edge sequences instead of numeric ids.
  - The versatile make_() and make_graph() functions to create graphs.

Major changes

  - Many functions were renamed. Old names are not documented, but can
    still be used.
  - A generic make_graph() function to create graphs.
  - A generic layout_() (not the underscore!) function to create graph
    layouts, see also add_layout_().
  - The igraph data type has changed. You need to call upgrade_graph()
    on graphs created with previous igraph versions.
  - Vertex and edge sequence operations: union, intersection, etc.
  - Vertex and edge sequences can only be used with the graphs they
    belong to. This is now strictly checked.
  - Most functions that return a (sub)set of vertices or edges return
    vertex or edge sequences instead.
  - Vertex and edge sequences have a [[ operator now, for easy viewing
    of vertex/edge metadata.
  - Vertex and edge sequences are implemented as weak references. See
    also the as_ids() function to convert them to simple ids.
  - Vertex order can be specified for the circle layout now.
  - Davidson-Harel layout algorithm layout_with_dh().
  - GEM layout algorithm layout_with_gem().
  - Neighborhood functions have a mindist parameter for the smallest
    distance to consider.
  - all_simple_paths() function to list all simple paths in a graph.
  - triangles() lists all triangles in a graph.
  - Fruchterman-Reingold and Kamada-Kawai layout algorithms rewritten
    from scratch. They are much faster and follow the original
    publications closely.
  - Nicer printing of graphs, vertex and edge sequences.
  - local_scan() function calculates scan statistics.
  - Embeddings: embed_adjacency_matrix() and embed_laplacian_matrix().
  - Product operator: *, the same graph multiple times. Can be also used
    as rep().
  - Better default colors, color palettes for vertices.
  - Random walk on a graph: random_walk()
  - adjacent_vertices() and incident_edges() functions, they are
    vectorized, as opposed to neighhors() and incident().
  - Convert a graph to a long data frame with as_long_data_frame().

Bug fixes

Too many to list. Please try if your issue was fixed and (re-)report it
if not. Thanks!

                        Changes in version 0.7.1                        

April 21, 2014

Release Notes

Some bug fixes, to make sure that the code included in 'Statistical
Analysis of Network Data with R' works. See
https://github.com/kolaczyk/sand

Detailed changes:

  - Graph drawing: fix labels of curved edges, issue #181.
  - Graph drawing: allow fixing edge labels at given positions, issue
    #181.
  - Drop the 'type' vertex attribute after bipartite projection, the
    projections are not bipartite any more, issue #255.
  - Print logical attributes in header properly (i.e. encoded by l, not
    x, which is for complex attributes. Issue #578.
  - Add a constructor for communities objects, see create.communities().
    Issue #547.
  - Better error handling in the GraphML parser.
  - GraphML reader is a bit more lenient now; makes it possible to read
    GraphML files saved from yWorks apps.
  - Fixed a bug in constaint(), issue #580.
  - Bipartite projection now detects invalid edges instead of giving a
    cryptic error, issue #543.
  - Fixed the simplify argument of graph.formula(), which was broken,
    issue #586.
  - The function crossing() adds better names to the result, fixes issue
    #587.
  - The sir() function gives an error if the input graph is not simple,
    fixes issue #582.
  - Calling igraph functions from igraph callbacks is not allowed now,
    fixes issue #571.

                        Changes in version 0.7.0                        

February 4, 2014

Release Notes

There are a bunch of new features in the library itself, and other
important changes in the life of the project. Thanks everyone for
sending code and reporting bugs!

igraph @ github

igraph's development has moved from Launchpad to github. This has
actually happened several month ago, but never announced officially. The
place for reporting bugs is at https://github.com/igraph/igraph/issues.

New homepage

igraph's homepage is now hosted at http://igraph.org, and it is brand
new. We wanted to make it easier to use and modern.

Better nightly downloads

You can download nightly builds from igraph at
http://igraph.org/nightly. Source and binary R packages (for windows and
OSX), are all built.

New features and bug fixes

  - Added a demo for hierarchical random graphs, invoke it via
    demo(hrg).
  - Make attribute prefixes optional when writing a GraphML file.
  - Added function mod.matrix().
  - Support edge weights in leading eigenvector community detection.
  - Added the LAD library for checking (sub)graph isomorphism,
    version 1.
  - Logical attributes.
  - Added layout.bipartite() function, a simple two-column layout for
    bipartite graphs.
  - Support incidence matrices in bipartite Pajek files.
  - Pajek files in matrix format are now directed by default, unless
    they are bipartite.
  - Support weighted (and signed) networks in Pajek when file is in
    matrix format.
  - Fixed a bug in barabasi.game(), algorithm psumtree-multiple just
    froze.
  - Function layout.mds() by default returns a layout matrix now.
  - Added support for Boolean attributes in the GraphML and GML readers
    and writer.
  - Change MDS layout coordinates, first dim is according to first
    eigenvalue, etc.
  - plot.communities() (plot.igraph(), really) draws a border around the
    marked groups by default.
  - printing graphs now converts the name graph attribute to character
  - Convenience functions to query and set all attributes at once:
    vertex.attriubutes(), graph.attributes() and edge.attributes().
  - Function graph.disjoint.union() handles attributes now.
  - Rewrite graph.union() to handle attributes properly.
  - rewire(): now supports the generation and destruction of loops.
  - Erdos-Renyi type bipartite random graphs: bipartite.random.game().
  - Support the new options (predecessors and inbound_edges) of
    get_shortest_paths(), reorganized the output of get.shortest.paths()
    completely.
  - Added graphlets() and related functions.
  - Fix modularity values of multilevel community if there are no merges
    at all.
  - Fixed bug when deleting edges with FALSE in the matrix notation.
  - Fix bonpow() and alpha.centrality() and make sure that the sparse
    solver is called.
  - tkplot() news: enable setting coordinates from the command line via
    tkplot.setcoords() and access to the canvas via tkplot.canvas().
  - Fixed a potential crash in igraph_edge_connectivity(), because of an
    un-initialized variable in the C code.
  - Avoiding overflow in closeness() and related functions.
  - Check for NAs after converting 'type' to logical in
    bipartite.projection().
  - graphNEL conversion functions only load the 'graph' package if it
    was not loaded before and they load it at the end of the search
    path, to minimize conflicts.
  - Fixed a bug when creating graphs from adjacency matrices, we now
    convert them to double, in case they are integers.
  - Fixed an invalid memory read (and a potential crash) in the infomap
    community detection.
  - Fixed a memory leak in the functions with attribute combinations.
  - Removed some memory leaks from the SCG functions.
  - Fixed some memory leaks in the ray tracer.
  - Fixed memory leak in graph.bfs() and graph.dfs().
  - Fix a bug in triad census that set the first element of the result
    to NaN.
  - Fixed a crash in is.chordal().
  - Fixed a bug in weighted modularity calculation, sum of the weights
    was truncated to an integer.
  - Fixed a bug in weighted multilevel communtiies, the maximum weight
    was rounded to an integer.
  - Fixed a bug in centralization.closeness.tmax().
  - Reimplement push-relabel maximum flow with gap heuristics.
  - Maximum flow functions now return some statistics about the push
    relabel algorithm steps.
  - Function arpack() now gives error message if unknown options are
    given.
  - Fixed missing whitespace in Pajek writer when the ID attribute was
    numeric.
  - Fixed a bug that caused the GML reader to crash when the ID
    attribute was non-numeric.
  - Fixed issue #500, potential segfault if the two graphs in BLISS
    differ in the number of vertices or edges.
  - Added igraphtest() function.
  - Fix dyad census instability, sometimes incorrect results were
    reported.
  - Dyad census detects integer overflow now and gives a warning.
  - Function add.edges() does not allow now zeros in the vertex set.
  - Added a function to count the number of adjacent triangles:
    adjacent.triangles().
  - Added graph.eigen() function, eigenproblems on adjacency matrices.
  - Added some workarounds for functions that create a lot of graphs,
    decompose.graph() and graph.neighborhood() use it. Fixes issue #508.
  - Added weights support for optimal.community(), closes #511.
  - Faster maximal clique finding.
  - Added a function to count maximum cliques.
  - Set operations: union, intersection, disjoint, union, difference,
    compose now work based on vertex names (if they are present) and
    keep attributes, closes #20.
  - Removed functions graph.intersection.by.name(),
    graph.union.by.name(), graph.difference.by.name().
  - The + operator on graphs now calls graph.union() if both argument
    graphs are named, and calls graph.disjoint.union() otherwise.
  - Added function igraph.version().
  - Generate graphs from a stochastic block model: sbm.game().
  - Do not suggest the stats, XML, jpeg and png packages any more.
  - Fixed a set.vertex/edge.attribute bug that changed both graph
    objects, after copying (#533)
  - Fixed a bug in barabasi.game that caused crashes.
  - We use PRPACK to calculate PageRank scores see
    https://github.com/dgleich/prpack
  - Added'which argument to bipartite.projection (#307).
  - Add normalized argument to closeness functions, fixes issue #3.
  - R: better handling of complex attributes, [[ on vertex/edge sets,
    fixes #231.
  - Implement the start argument in hrg.fit (#225).
  - Set root vertex in Reingold-Tilford layout, solves #473.
  - Fix betweenness normalization for directed graphs.
  - Fixed a bug in graph.density that resulted in incorrect values for
    undirected graphs with loops
  - Fixed a bug when many graphs were created in one C call (e.g. by
    graph.decompose), causing #550.
  - Fixed sparse graph.adjacency bugs for graphs with one edge, and
    graphs with zero edges.
  - Fixed a bug that made Bellman-Ford shortest paths calculations fail.
  - Fixed a graph.adjacency bug for undirected, weighted graphs and
    sparse matrices.
  - main, sub, xlab and ylab are proper graphics parameters now (#555).
  - graph.data.frame coerces arguments to data frame (#557).
  - Fixed a minimum cut bug for weighted undirected graphs (#564).
  - Functions for simulating epidemics (SIR model) on networks, see the
    sir function.
  - Fixed argument ordering in graph.mincut and related functions.
  - Avoid copying attributes in query functions and print (#573), these
    functions are much faster now for graphs with many vertices/edges
    and attributes.
  - Speed up writing GML and GraphML files, if some attributes are
    integer. It was really-really slow.
  - Fix multiple root vertices in graph.bfs (#575).

                        Changes in version 0.6.6                        

Released Oct 28, 2013

Some bugs fixed:

  - Fixed a potential crash in the infomap.community() function.
  - Various fixed for the operators that work on vertex names (#136).
  - Fixed an example in the arpack() manual page.
  - arpack() now gives error message if unknown options are supplied
    (#492).
  - Better arpack() error messages.
  - Fixed missing whitespace in Pajek writer when ID attribute was
    numeric.
  - Fixed dyad census instability, sometimes incorrect results were
    reported (#496).
  - Fixed a bug that caused the GML reader to crash when the ID
    attribute was non-numeric
  - Fixed a potential segfault if the two graphs in BLISS differ in the
    number of vertices or edges (#500).
  - Added the igraphtest() function to run tests from R (#485).
  - Dyad census detects integer overflow now and gives a warning (#497).
  - R: add.edges() does not allow now zeros in the vertex set (#503).
  - Add C++ namespace to the files that didn't have one. Fixes some
    incompatibility with other packages (e.g. rgl) and mysterious
    crashes (#523).
  - Fixed a bug that caused a side effect in set.vertex.attributes(),
    set.edge.attributes() and set.graph.attributes() (#533).
  - Fixed a bug in degree.distribution() and cluster.distribution()
    (#257).

                       Changes in version 0.6.5-2                       

Released May 16, 2013

Worked two CRAN check problems, and a gfortran bug (string bound
checking does not work if code is called from C and without string
length arguments at the "right" place).

Otherwise identical to 0.6.5-1.

                       Changes in version 0.6.5-1                       

Released February 27, 2013

Fixing an annoying bug, that broke two other packages on CRAN:

  - Setting graph attributes failed sometimes, if the attributes were
    lists or other complex objects.

                        Changes in version 0.6.5                        

Released February 24, 2013

This is a minor release, to fix some very annoying bugs in 0.6.4:

  - igraph should now work well with older R versions.
  - Eliminate gap between vertex and edge when plotting an edge without
    an arrow. Fixes #1118448.
  - Fixed an out-of-bounds array indexing error in the DrL layout, that
    potentially caused crashes.
  - Fixed a crash in weighted betweenness calculation.
  - Plotting: fixed a bug that caused misplaced arrows at rectangle
    vertex shapes.

                        Changes in version 0.6.4                        

Released February 2, 2013

The version number is not a mistake, we jump to 0.6.4 from 0.6, for
technical reasons. This version was actually never really released, but
some R packages of this version were uploaded to CRAN, so we include
this version in this NEW file.

New features and bug fixes

  - Added a vertex shape API for defining new vertex shapes, and also a
    couple of new vertex shapes.

  - Added the get.data.frame() function, opposite of graph.data.frame().

  - Added bipartite support to the Pajek reader and writer, closes bug
    #1042298.

  - degree.sequence.game() has a new method now: "simple_no_multiple".

  - Added the is.degree.sequence() and is.graphical.degree.sequence()
    functions.

  - rewire() has a new method: "loops", that can create loop edges.

  - Walktrap community detection now handles isolates.

  - layout.mds() returns a layout matrix now.

  - layout.mds() uses LAPACK instead of ARPACK.

  - Handle the '~' character in write.graph and read.graph. Bug
    #1066986.

  - Added k.regular.game().

  - Use vertex names to plot if no labels are specified in the function
    call or as vertex attributes. Fixes issue #1085431.

  - power.law.fit() can now use a C implementation.

  - Fixed a bug in barabasi.game() when out.seq was an empty vector.

  - Fixed a bug that made functions with a progress bar fail if called
    from another package.

  - Fixed a bug when creating graphs from a weighted integer adjacency
    matrix via graph.adjacency(). Bug #1019624.

  - Fixed overflow issues in centralization calculations.

  - Fixed a minimal.st.separators() bug, some vertex sets were
    incorrectly reported as separators. Bug #1033045.

  - Fixed a bug that mishandled vertex colors in VF2 isomorphism
    functions. Bug #1032819.

  - Pajek exporter now always quotes strings, thanks to Elena Tea Russo.

  - Fixed a bug with handling small edge weights in shortest paths
    calculation in shortest.paths() (Dijkstra's algorithm.) Thanks to
    Martin J Reed.

  - Weighted transitivity uses V(graph) as 'vids' if it is NULL.

  - Fixed a bug when 'pie' vertices were drawn together with other
    vertex shapes.

  - Speed up printing graphs.

  - Speed up attribute queries and other basic operations, by avoiding
    copying of the graph. Bug #1043616.

  - Fixed a bug in the NCV setting for ARPACK functions. It cannot be
    bigger than the matrix size.

  - layout.merge()'s DLA mode has better defaults now.

  - Fixed a bug in layout.mds() that resulted vertices on top of each
    other.

  - Fixed a bug in layout.spring(), it was not working properly.

  - Fixed layout.svd(), which was completely defunct.

  - Fixed a bug in layout.graphopt() that caused warnings and on some
    platforms crashes.

  - Fixed community.to.membership(). Bug #1022850.

  - Fixed a graph.incidence() crash if it was called with a non-matrix
    argument.

  - Fixed a get.shortest.paths bug, when output was set to "both".

  - Motif finding functions return NA for isomorphism classes that are
    not motifs (i.e. not connected). Fixes bug #1050859.

  - Fixed get.adjacency() when attr is given, and the attribute has some
    complex type. Bug #1025799.

  - Fixed attribute name in graph.adjacency() for dense matrices. Bug
    #1066952.

  - Fixed erratic behavior of alpha.centrality().

  - Fixed igraph indexing, when attr is given. Bug #1073705.

  - Fixed a bug when calculating the largest cliques of a directed
    graph. Bug #1073800.

  - Fixed a bug in the maximal clique search, closes #1074402.

  - Warn for negative weights when calculating PageRank.

  - Fixed dense, unweighted graph.adjacency when diag=FALSE. Closes
    issue #1077425.

  - Fixed a bug in eccentricity() and radius(), the results were often
    simply wrong.

  - Fixed a bug in get.all.shortest.paths() when some edges had zero
    weight.

  - graph.data.frame() is more careful when vertex names are numbers, to
    avoid their scientific notation. Fixes issue #1082221.

  - Better check for NAs in vertex names. Fixes issue #1087215

  - Fixed a potential crash in the DrL layout generator.

  - Fixed a bug in the Reingold-Tilford layout when the graph is
    directed and mode != ALL.

                         Changes in version 0.6                         

Released June 11, 2012

See also the release notes at http://igraph.sf.net/relnotes-0.6.html

R: Major new features

  - Vertices and edges are numbered from 1 instead of 0. Note that this
    makes most of the old R igraph code incompatible with igraph 0.6. If
    you want to use your old code, please use the igraph0 package. See
    more at http://igraph.sf.net/relnotes-0.6.html.
  - The '[' and '[[' operators can now be used on igraph graphs, for '['
    the graph behaves as an adjacency matrix, for '[[' is is treated as
    an adjacency list. It is also much simpler to manipulate the graph
    structure, i.e. add/remove edges and vertices, with some new
    operators. See more at ?graph.structure.
  - In all functions that take a vector or list of vertices or edges,
    vertex/edge names can be given instead of the numeric ids.
  - New package 'igraphdata', contains a number of data sets that can be
    used directly in igraph.
  - Igraph now supports loading graphs from the Nexus online data
    repository, see nexus.get(), nexus.info(), nexus.list() and
    nexus.search().
  - All the community structure finding algorithm return a 'communities'
    object now, which has a bunch of useful operations, see ?communities
    for details.
  - Vertex and edge attributes are handled much better now. They are
    kept whenever possible, and can be combined via a flexible API. See
    ?attribute.combination.
  - R now prints igraph graphs to the screen in a more structured and
    informative way. The output of summary() was also updated
    accordingly.

R: Other new features

  - It is possible to mark vertex groups on plots, via shading.
    Communities and cohesive blocks are plotted using this by default.
  - Some igraph demos are now available, see a list via
    'demo(package="igraph")'.
  - igraph now tries to select the optimal layout algorithm, when
    plotting a graph.
  - Added a simple console, using Tcl/Tk. It contains a text area for
    status messages and also a status bar. See igraph.console().
  - Reimplemented igraph options support, see igraph.options() and
    getIgraphOpt().
  - Igraph functions can now print status messages.

R: New or updated functions

Community detection

  - The multi-level modularity optimization community structure
    detection algorithm by Blondel et al. was added, see
    multilevel.community().
  - Distance between two community structures: compare.communities().
  - Community structure via exact modularity optimization,
    optimal.community().
  - Hierarchical random graphs and community finding, porting the code
    from Aaron Clauset. See hrg.game(), hrg.fit(), etc.
  - Added the InfoMAP community finding method, thanks to Emmanuel
    Navarro for the code. See infomap.community().

Shortest paths

  - Eccentricity (eccentricity()), and radius (radius()) calculations.
  - Shortest path calculations with get.shortest.paths() can now return
    the edges along the shortest paths.
  - get.all.shortest.paths() now supports edge weights.

Centrality

  - Centralization scores for degree, closeness, betweenness and
    eigenvector centrality. See centralization.scores().
  - Personalized Page-Rank scores, see page.rank().
  - Subgraph centrality, subgraph.centrality().
  - Authority (authority.score()) and hub (hub.score()) scores support
    edge weights now.
  - Support edge weights in betweenness and closeness calculations.
  - bonpow(), Bonacich's power centrality and alpha.centrality(), Alpha
    centrality calculations now use sparse matrices by default.
  - Eigenvector centrality calculation, evcent() now works for directed
    graphs.
  - Betweenness calculation can now use arbitrarily large integers, this
    is required for some lattice-like graphs to avoid overflow.

Input/output and file formats

  - Support the DL file format in graph.read(). See
    http://www.analytictech.com/networks/dataentry.htm.
  - Support writing the LEDA file format in write.graph().

Plotting and layouts

  - Star layout: layout.star().
  - Layout based on multidimensional scaling, layout.mds().
  - New layouts layout.grid() and layout.grid.3d().
  - Sugiyama layout algorithm for layered directed acyclic graphs,
    layout.sugiyama().

Graph generators

  - New graph generators: static.fitness.game(),
    static.power.law.game().
  - barabasi.game() was rewritten and it supports three algorithms now,
    the default algorithm does not generate multiple or loop edges. The
    graph generation process can now start from a supplied graph.
  - The Watts-Strogatz graph generator, igraph_watts_strogatz() can now
    create graphs without loop edges.

Others

  - Added the Spectral Coarse Graining algorithm, see scg().
  - The cohesive.blocks() function was rewritten in C, it is much faster
    now. It has a nicer API, too. See demo("cohesive").
  - Added generic breadth-first and depth-first search implementations
    with many callbacks, graph.bfs() and graph_dfs().
  - Support vertex and edge coloring in the VF2 (sub)graph isomorphism
    functions (graph.isomorphic.vf2(), graph.count.isomorphisms.vf2(),
    graph.get.isomorphisms.vf2(), graph.subisomorphic.vf2(),
    graph.count.subisomorphisms.vf2(), graph.get.subisomorphisms.vf2()).
  - Assortativity coefficient, assortativity(), assortativity.nominal()
    and assortativity.degree().
  - Vertex operators that work by vertex names:
    graph.intersection.by.name(), graph.union.by.name(),
    graph.difference.by.name(). Thanks to Magnus Torfason for
    contributing his code!
  - Function to calculate a non-induced subgraph: subgraph.edges().
  - More comprehensive maximum flow and minimum cut calculation, see
    functions graph.maxflow(), graph.mincut(), stCuts(), stMincuts().
  - Check whether a directed graph is a DAG, is.dag().
  - has.multiple() to decide whether a graph has multiple edges.
  - Added a function to calculate a diversity score for the vertices,
    graph.diversity().
  - Graph Laplacian calculation (graph.laplacian()) supports edge
    weights now.
  - Biconnected component calculation, biconnected.components() now
    returns the components themselves.
  - bipartite.projection() calculates multiplicity of edges.
  - Maximum cardinality search: maximum.cardinality.search() and
    chordality test: is.chordal()
  - Convex hull computation, convex.hull().
  - Contract vertices, contract.vertices().

                        Changes in version 0.5.3                        

Released November 22, 2009

Bugs corrected in the R interface

  - Some small changes to make 'R CMD check' clean
  - Fixed a bug in graph.incidence, the 'directed' and 'mode' arguments
    were not handled correctly
  - Betweenness and edge betweenness functions work for graphs with many
    shortest paths now (up to the limit of long long int)
  - When compiling the package, the configure script fails if there is
    no C compiler available
  - igraph.from.graphNEL creates the right number of loop edges now
  - Fixed a bug in bipartite.projection() that caused occasional crashes
    on some systems

                        Changes in version 0.5.2                        

Released April 10, 2009

See also the release notes at http://igraph.sf.net/relnotes-0.5.2.html

New in the R interface

  - Added progress bar support to beweenness() and
    betweenness.estimate(), layout.drl()
  - Speeded up betweenness estimation
  - Speeded up are.connected()
  - Johnson's shortest paths algorithm added
  - shortest.paths() has now an 'algorithm' argument to choose from the
    various implementations manually
  - Always quote symbolic vertex names when printing graphs or edges
  - Average nearest neighbor degree calculation, graph.knn()
  - Weighted degree (also called strength) calculation, graph.strength()
  - Some new functions to support bipartite graphs: graph.bipartite(),
    is.bipartite(), get.incidence(), graph.incidence(),
    bipartite.projection(), bipartite.projection.size()
  - Support for plotting curved edges with plot.igraph() and tkplot()
  - Added support for weighted graphs in alpha.centrality()
  - Added the label propagation community detection algorithm by
    Raghavan et al., label.propagation.community()
  - cohesive.blocks() now has a 'cutsetHeuristic' argument to choose
    between two cutset algorithms
  - Added a function to "unfold" a tree, unfold.tree()
  - New tkplot() arguments to change the drawing area
  - Added a minimal GUI, invoke it with tkigraph()
  - The DrL layout generator, layout.drl() has a three dimensional mode
    now.

Bugs corrected in the R interface

  - Fixed a bug in VF2 graph isomorphism functions
  - Fixed a bug when a sparse adjacency matrix was requested in
    get.adjacency() and the graph was named
  - VL graph generator in degree.sequence.game() checks now that the sum
    of the degrees is even
  - Many fixes for supporting various compilers, e.g. GCC 4.4 and Sun's
    C compiler
  - Fixed memory leaks in graph.automorphisms(), Bellman-Ford
    shortest.paths(), independent.vertex.sets()
  - Fix a bug when a graph was imported from LGL and exported to NCOL
    format (#289596)
  - cohesive.blocks() creates its temporary file in the session
    temporary directory
  - write.graph() and read.graph() now give error messages when unknown
    arguments are given
  - The GraphML reader checks the name of the attributes to avoid adding
    a duplicate 'id' attribute
  - It is possible to change the 'ncv' ARPACK parameter for
    leading.eigenvector.community()
  - Fixed a bug in path.length.hist(), 'unconnected' was wrong for
    unconnected and undirected graphs
  - Better handling of attribute assingment via iterators, this is now
    also clarified in the manual
  - Better error messages for unknown vertex shapes
  - Make R package unload cleanly if unloadNamespace() is used
  - Fixed a bug in plotting square shaped vertices (#325244)
  - Fixed a bug in graph.adjacency() when the matrix is a sparse matrix
    of class "dgTMatrix"

                        Changes in version 0.5.1                        

Released July 14, 2008

See also the release notes at http://igraph.sf.net/relnotes-0.5.1.html

New in the R interface

  - A new layout generator called DrL.
  - Uniform sampling of random connected undirected graphs with a given
    degree sequence.
  - Edge labels are plotted at 1/3 of the edge, this is better if the
    graph has mutual edges.
  - Initial and experimental vertex shape support in 'plot'.
  - New function, 'graph.adjlist' creates igraph graphs from adjacency
    lists.
  - Conversion to/from graphNEL graphs, from the 'graph' R package.
  - Fastgreedy community detection can utilize edge weights now, this
    was missing from the R interface.
  - The 'arrow.width' graphical parameter was added.
  - graph.data.frame has a new argument 'vertices'.
  - graph.adjacency and get.adjacency support sparse matrices, the
    'Matrix' package is required to use this functionality.
  - graph.adjacency adds column/row names as 'name' attribute.
  - Weighted shortest paths using Dijkstra's or the Belmann-Ford
    algorithm.
  - Shortest path functions return 'Inf' for unreachable vertices.
  - New function 'is.mutual' to find mutual edges in a directed graph.
  - Added inverse log-weighted similarity measure (a.k.a. Adamic/Adar
    similarity).
  - preference.game and asymmetric.preference.game were rewritten, they
    are O(|V|+|E|) now, instead of O(|V|^2).
  - Edge weight support in function 'get.shortest.paths', it uses
    Dijkstra's algorithm.

Bugs corrected in the R interface

  - A bug was corrected in write.pajek.bgraph.
  - Several bugs were corrected in graph.adjacency.
  - Pajek reader bug corrected, used to segfault if '*Vertices' was
    missing.
  - Directedness is handled correctly when writing GML files. (But note
    that 'correct' conflicts the standard here.)
  - Corrected a bug when calculating weighted, directed PageRank on an
    undirected graph. (Which does not make sense anyway.)
  - Several bugs were fixed in the Reingold-Tilford layout to avoid edge
    crossings.
  - A bug was fixed in the GraphML reader, when the value of a graph
    attribute was not specified.
  - Fixed a bug in the graph isomorphism routine for small (3-4
    vertices) graphs.
  - Corrected the random sampling implementation (igraph_random_sample),
    now it always generates unique numbers. This affects the Gnm
    Erdos-Renyi generator, it always generates simple graphs now.
  - The basic igraph constructor (igraph_empty_attrs, all functions are
    expected to call this internally) now checks whether the number of
    vertices is finite.
  - The LGL, NCOL and Pajek graph readers handle errors properly now.
  - The non-symmetric ARPACK solver returns results in a consistent form
    now.
  - The fast greedy community detection routine now checks that the
    graph is simple.
  - The LGL and NCOL parsers were corrected to work with all kinds of
    end-of-line encodings.
  - Hub & authority score calculations initialize ARPACK parameters now.
  - Fixed a bug in the Walktrap community detection routine, when
    applied to unconnected graphs.
  - Several small memory leaks were removed, and a big one from the
    Spinglass community structure detection function

                         Changes in version 0.5                         

Released February 14, 2008

See also the release notes at http://igraph.sf.net/relnotes-0.5.html

New in the R interface

  - The 'rescale', 'asp' and 'frame' graphical parameters were added

  - Create graphs from a formula notation (graph.formula)

  - Handle graph attributes properly

  - Calculate the actual minimum cut for undirected graphs

  - Adjacency lists, get.adjlist and get.adjedgelist added

  - Eigenvector centrality computation is much faster now

  - Proper R warnings, instead of writing the warning to the terminal

  - R checks graphical parameters now, the unknown ones are not just
    ignored, but an error message is given

  - plot.igraph has an 'add' argument now to compose plots with multiple
    graphs

  - plot.igraph supports the 'main' and 'sub' arguments

  - layout.norm is public now, it can normalize a layout

  - It is possible to supply startup positions to layout generators

  - Always free memory when CTRL+C/ESC is pressed, in all operating
    systems

  - plot.igraph can plot square vertices now, see the 'shape' parameter

  - graph.adjacency rewritten when creating weighted graphs

  - We use match.arg whenever possible. This means that character scalar
    options can be abbreviated and they are always case insensitive

  - VF2 graph isomorphism routines can check subgraph isomorphism now,
    and they are able to return matching(s)

  - The BLISS graph isomorphism algorithm is included in igraph now. See
    canonical.permutation, graph.isomorphic.bliss

  - We use ARPACK for eigenvalue/eigenvector calculation. This means
    that the following functions were rewritten: page.rank,
    leading.eigenvector.community.*, evcent. New functions based on
    ARPACK: hub.score, authority.score, arpack.

  - Edge weights for Fruchterman-Reingold layout
    (layout.fruchterman.reingold).

  - Line graph calculation (line.graph)

  - Kautz and de Bruijn graph generators (graph.kautz, graph.de.bruijn)

  - Support for writing graphs in DOT format

  - Jaccard and Dice similarity coefficients added (similarity.jaccard,
    similarity.dice)

  - Counting the multiplicity of edges (count.multiple)

  - The graphopt layout algorithm was added, layout.graphopt

  - Generation of "famous" graphs (graph.famous).

  - Create graphs from LCF notation (graph.cf).

  - Dyad census and triad cencus functions (dyad.census, triad.census)

  - Cheking for simple graphs (is.simple)

  - Create full citation networks (graph.full.citation)

  - Create a histogram of path lengths (path.length.hist)

  - Forest fire model added (forest.fire.game)

  - DIMACS reader can handle different file types now

  - Biconnected components and articulation points
    (biconnected.components, articulation.points)

  - Kleinberg's hub and authority scores (hub.score, authority.score)

  - as.undirected handles attributes now

  - Geometric random graph generator (grg.game) can return the
    coordinates of the vertices

  - Function added to convert leading eigenvector community structure
    result to a membership vector (community.le.to.membership)

  - Weighted fast greedy community detection

  - Weighted page rank calculation

  - Functions for estimating closeness, betweenness, edge betweenness by
    introducing a cutoff for path lengths (closeness.estimate,
    betweenness.estimate, edge.betweenness.estimate)

  - Weighted modularity calculation

  - Function for permuting vertices (permute.vertices)

  - Betweenness and closeness calculations are speeded up

  - read.graph can handle all possible line terminators now (\r, \n,
    \r\n, \n\r)

  - Error handling was rewritten for walktrap community detection, the
    calculation can be interrupted now

  - The maxflow/mincut functions allow to supply NULL pointer for edge
    capacities, implying unit capacities for all edges

Bugs corrected in the R interface

  - Fixed a bug in cohesive.blocks, cohesive blocks were sometimes not
    calculated correctly

                        Changes in version 0.4.5                        

Released January 1, 2008

New:

  - Cohesive block finding in the R interface, thanks to Peter McMahan
    for contributing his code. See James Moody and Douglas R. White,
    2003, in Structural Cohesion and Embeddedness: A Hierarchical
    Conception of Social Groups American Sociological Review 68(1):1-25
  - Biconnected components and articulation points.
  - R interface: better printing of attributes.
  - R interface: graph attributes can be used via '$'.

Bug fixed:

  - Erdos-Renyi random graph generators rewritten.

                        Changes in version 0.4.4                        

Released October 3, 2007

This release should work seamlessly with the new R 2.6.0 version. Some
other bugs were also fixed:

  - A bug was fixed in the Erdos-Renyi graph generator, which sometimes
    added an extra vertex.

                        Changes in version 0.4.3                        

Released August 13, 2007

The next one in the sequence of bugfix releases. Thanks to many people
sending bug reports. Here are the changes:

  - Some memory leaks removed when using attributes from R or Python.
  - GraphML parser: entities and character data in multiple chunks are
    now handled correctly.
  - A bug corrected in edge betweenness community structure detection,
    it failed if called many times from the same program/session.
  - Edge betweeness community structure: handle unconnected graphs
    properly.
  - Fixed bug related to fast greedy community detection in unconnected
    graphs.
  - Use a different kind of parser (Push) for reading GraphML files.
    This is almost invisible for users but fixed a nondeterministic bug
    when reading in GraphML files.
  - R interface: plot now handles properly if called with a vector as
    the edge.width argument for directed graphs.
  - R interface: bug (typo) corrected for walktrap.community and
    weighted graphs.

                        Changes in version 0.4.2                        

Released June 7, 2007

This is another bugfix release, as there was a serious bug in the R
package of the previous version: it could not read and write graphs to
files in any format under MS Windows.

Some other bits added:

  - circular Reingold-Tilford layout generator for trees
  - corrected a bug, Pajek files are written properly under MS Windows
    now.
  - arrow.size graphical edge parameter added in the R interface.

                        Changes in version 0.4.1                        

Released May 23, 2007

This is a minor release, it corrects a number of bugs, mostly in the R
package.

                         Changes in version 0.4                         

Released May 21, 2007

The major new additions in this release is a bunch of community
detection algorithms and support for the GML file format. Here is the
complete list of changes:

New in the R interface

  - as the internal representation changed, graphs stored with 'save'
    with an older igraph version cannot be read back with the new
    version reliably.

  - neighbors returns ordered lists

  - is.loop and is.multiple were added

  - topological sorting

  - VF2 isomorphism algorithm

  - support for reading graphs from the Graph Database for isomorphism

  - graph.mincut can calculate the actual minimum cut

  - girth calculation added, thanks to Keith Briggs

  - support for reading and writing GML files

  - Walktrap community detection algorithm added, thanks to Matthieu
    Latapy and Pascal Pons

  - edge betweenness based community detection algorithm added

  - fast greedy algorithm for community detection by Clauset et al.
    added thanks to Aaron Clauset for sharing his code

  - leading eigenvector community detection algorithm by Mark Newman
    added

  - functions for creating dendrograms from the output of the community
    detection algorithms added

  - community.membership supporting function added, creates a membership
    vector from a community structure merge tree

  - modularity calculation added

  - graphics parameter handling is completely rewritten, uniform
    handling of colors and fonts, make sure you read ?igraph.plotting

  - new plotting parameter for edges: arrow.mode

  - a bug corrected when playing a nonlinear barabasi.game

  - better looking plotting in 3d using rglplot: edges are 3d too

  - rglplot layout is allowed to be two dimensional now

  - rglplot suspends updates while drawing, this makes it faster

  - loop edges are correctly plotted by all three plotting functions

  - better printing of attributes when printing graphs

  - summary of a graph prints attribute names

  - is.igraph rewritten to make it possible to inherit from the 'igraph'
    class

  - somewhat better looking progress meter for functions which support
    it

Others

  - many functions benefit from the new internal representation and are
    faster now: transitivity, reciprocity, graph operator functions like
    intersection and union, etc.

Bugs corrected

  - corrected a bug when reading Pajek files: directed graphs were read
    as undirected

                        Changes in version 0.3.2                        

Released Dec 19, 2006

This is a new major release, it contains many new things:

Changes in the R interface

  - bonpow function ported from SNA to calculate Bonacich power
    centrality
  - get.adjacency supports attributes now, this means that it sets the
    colnames and rownames attributes and can return attribute values in
    the matrix instead of 0/1
  - grg.game, geometric random graphs
  - graph.density, graph density calculation
  - edge and vertex attributes can be added easily now when added new
    edges with add.edges or new vertices with add.vertices
  - graph.data.frame creates graph from data frames, this can be used to
    create graphs with edge attributes easily
  - plot.igraph and tkplot can plot self-loop edges now
  - graph.edgelist to create a graph from an edge list, can also handle
    edge lists with symbolic names
  - get.edgelist has now a 'names' argument and can return symbolic
    vertex names instead of vertex ids, by default id uses the 'name'
    vertex attribute is returned
  - printing graphs on screen also prints symbolic symbolic names (the
    'name' attribute if present)
  - maximum flow and minimum cut functions: graph.maxflow, graph.mincut
  - vertex and edge connectivity: edge.connectivity, vertex.connectivity
  - edge and vertex disjoint paths: edge.disjoint.paths,
    vertex.disjoint.paths
  - White's cohesion and adhesion measure: graph.adhesion,
    graph.cohesion
  - dimacs file format added
  - as.directed handles attributes now
  - constraint corrected, it handles weighted graphs as well now
  - weighted attribute to graph.adjacency
  - spinglass-based community structure detection, the Joerg Reichardt
    -- Stefan Bornholdt algorithm added: spinglass.community
  - graph.extended.chordal.ring, extended chordal ring generation
  - no.clusters calculates the number of clusters without calculating
    the clusters themselves
  - minimum spanning tree functions updated to keep attributes
  - transitivity can calculate local transitivity as well
  - neighborhood related functions added: neighborhood,
    neighborhood.size, graph.neighborhood
  - new graph generators based on vertex types: preference.game and
    asymmetric.preference.game

Bugs corrected

  - attribute handling bug when deleting edges corrected
  - GraphML escaping and NaN handling corrected
  - bug corrected to make it possible compile the R package without the
    libxml2 library
  - a bug in Erdos-Renyi graph generation corrected: it had problems
    with generating large directed graphs
  - bug in constraint calculation corrected, it works well now
  - fixed memory leaks in the GraphML reader
  - error handling bug corrected in the GraphML reader
  - bug corrected in R version of graph.laplacian when normalized
    Laplacian is requested
  - memory leak corrected in get.all.shortest.paths in the R package

                        Changes in version 0.2.1                        

Released Aug 23, 2006

This is a bug-fix release. Bugs fixed:

  - reciprocity corrected to avoid segfaults
  - some docs updates
  - various R package updates to make it conform to the CRAN rules

                         Changes in version 0.2                         

Released Aug 18, 2006

Release time at last! There are many new things in igraph 0.2, the most
important ones:

  - reading writing Pajek and GraphML formats with attributes (not all
    Pajek and GraphML files are supported, see documentation for
    details)
  - the RANDEDU fast motif search algorithm is implemented
  - many new graph generators, both games and regular graphs
  - many new structural properties: transitivity, reciprocity, etc.
  - graph operators: union, intersection, difference, structural holes,
    etc.
  - conversion between directed and undirected graphs
  - new layout algorithms for trees and large graphs, 3D layouts and
    many more.

New things specifically in the R package:

  - support for CTRL+C
  - new functions: Graph Laplacian, Burt's constraint, etc.
  - vertex/edge sequences totally rewritten, smart indexing (see manual)
  - new R manual and tutorial: `Network Analysis with igraph', still
    under development but useful
  - very basic 3D plotting using OpenGL

Although this release was somewhat tested on Linux, MS Windows, Mac OSX,
Solaris 8 and FreeBSD, no heavy testing was done, so it might contain
bugs, and we kindly ask you to send bug reports to make igraph better.

                         Changes in version 0.1                         

Released Jan 30, 2006

After about a year of development this is the first "official" release
of the igraph library. This release should be considered as beta
software, but it should be useful in general. Please send your questions
and comments.
