Releases: igraph/igraph
Releases · igraph/igraph
igraph 1.0.0-rc1
This is the first release candidate of the upcoming 1.0.0 igraph release. Some API changes are still expected in the next few days. The changelog posted here is merged from the changelogs of the master
and develop
branches, and it represents all the changes compared to the latest stable release (0.10.16). These changes will be repeated in the changelog of 1.0.0 when we are ready.
Breaking changes
This section gives detailed on breaking changes you need to consider when updating code written for igraph 0.10.x.
General changes
- igraph now requires a C++ compiler that supports the C++14 standard.
igraph_setup()
is now recommended to be called before using the library. This function may gain essential functions in the future. See below for details.igraph_integer_t
was renamed toigraph_int_t
, butigraph_integer_t
is kept as an alias and it will remain available for at least the next major version. Library headers and source code usesigraph_int_t
from now on.igraph_rng_set_default()
now returns a pointer to the previous RNG. Furthermore, this function now only stores a pointer to theigraph_rng_t
struct passed to it, instead of copying the struct. Thus theigraph_rng_t
must continue to exist for as long as it is used as the default RNG.- Interruption handlers do not take a
void*
argument any more; this is relevant to maintainers of higher-level interfaces only. - Interruption handlers now return an
igraph_bool_t
instead of anigraph_error_t
; the returned value must be true if the calculation has to be interrupted and false otherwise. igraph_status()
,igraph_statusf()
and their macro versions (IGRAPH_STATUS()
andIGRAPH_STATUSF()
) do not convert error codes toIGRAPH_INTERRUPTED
any more. Any error code returned from the status handler function is forwarded intact to the caller. If you want to trigger the interruption of the current calculation from the status handler without reporting an error, reportIGRAPH_INTERRUPTED
explicitly. It is the responsibility of higher-level interfaces to handle this error code appropriately.- The
RNG_BEGIN()
andRNG_END()
macros were removed. You are now responsible for seeding the RNG before using any igraph function that may use random numbers by callingigraph_rng_seed(igraph_rng_default(), ...)
, or by simply ensuring thatigraph_setup()
was called before the first use of the library.
Error codes
- The
IGRAPH_EINVEVECTOR
error code was removed;igraph_create()
andigraph_add_edges()
that used to return this error code for invalid edge vectors will now returnIGRAPH_EINVAL
instead. - The
IGRAPH_NONSQUARE
error code was removed; functions that used this error code now returnIGRAPH_EINVAL
instead when encountering a non-square matrix. - The
IGRAPH_EGLP
error code and all other GLP-specific error codes (starting withIGRAPH_GLP_
) were removed; functions that used this error code now returnIGRAPH_FAILURE
instead, providing more details in the message associated to the error code. - The
IGRAPH_ELAPACK
error code was removed; functions that used this error code now returnIGRAPH_FAILURE
instead, providing more details in the message associated to the error code. - The
IGRAPH_CPUTIME
error code was removed in favour of the interruption mechanism built into igraph. - The unused
IGRAPH_EDIVZERO
andIGRAPH_EATTRIBUTES
error codes were removed with no replacement. - The deprecated error code
IGRAPH_ENEGLOOP
was removed. UseIGRAPH_ENEGCYCLE
instead. The underlying numerical value is the same as it was forIGRAPH_ENEGLOOP
. - ARPACK-specific error codes (starting with
IGRAPH_ARPACK_...
) were replaced with a singleIGRAPH_EARPACK
error code. Details about the underlying ARPACK failure are provided in the error message. - A new error code called
IGRAPH_EINVEID
was added for cases when an invalid edge ID was encountered in an edge ID vector.
Core data structures
igraph_strvector_push_back_len()
now takes a length parameter ofsize_t
instead ofigraph_integer_t
.igraph_strvector_print()
no longer takes a file parameter. Useigraph_strvector_fprint()
to print to a file.igraph_vector_reverse()
no longer returns an error code.igraph_vector_shuffle()
no longer returns an error code.igraph_vector_swap()
andigraph_matrix_swap()
no longer return an error code.igraph_vector_list_swap()
andigraph_graph_list_swap()
no longer return an error code.igraph_vector_swap_elements()
no longer returns an error code.igraph_vector_list_swap_elements()
andigraph_graph_list_swap_elements()
no longer return an error code.igraph_matrix_copy_to()
gained anigraph_matrix_storage_t storage
parameter that specifies whether the data should be written in column-major or row-major format.
Attribute handling
igraph_attribute_handler_t
members that formerly took an untypedigraph_vector_ptr_t
argument are now taking a typedigraph_attribute_record_list_t
argument instead.- The deprecated
IGRAPH_ATTRIBUTE_DEFAULT
value of theigraph_attribute_type_t
enum was removed. - The
gettype
member ofigraph_attribute_table_t
was renamed toget_type
for sake of consistency with the naming scheme of other struct members. - Attribute table members that retrieve graph, vertex or edge attributes must not clear the incoming result vector any more; results must be appended to the end of the provided result vector instead.
- The
value
member ofigraph_attribute_record_t
is now a union that can be used to formally treat the associated pointer as anigraph_vector_t *
,igraph_strvector_t *
origraph_vector_bool_t *
.
Core graph manipulation
igraph_delete_vertices_map()
(formerly calledigraph_delete_vertices_idx()
) andigraph_induced_subgraph_map()
now use-1
to represent unmapped vertices in the returned forward mapping vector and they do not offset vertex indices by 1 any more. (Note that the inverse map always behaved this way, this change makes the two mappings consistent).igraph_edges()
gained a newbycol
argument that determines the order in which the edges are returned.bycol = false
reproduces the existing behaviour, whilebycol = true
returns the edges suitable for a matrix stored in column-wise order.igraph_neighbors()
andigraph_vs_adj()
gained two extra arguments to specify what to do with loop and multiple edges. This makes their interfaces consistent withigraph_adjlist_init()
.igraph_incident()
andigraph_es_incident()
gained an extra arguments to specify what to do with loop edges. This makes their interfaces consistent withigraph_inclist_init()
.igraph_multiple_t
was removed from the public API as it is essentially a boolean. The symbolic constantsIGRAPH_MULTIPLE
andIGRAPH_NO_MULTIPLE
were kept to improve readability of code written directly in C.
Basic graph properties
igraph_density()
now takes an optionalweights
parameter.igraph_is_simple()
gained an extraigraph_bool_t
argument that decides whether edge directions should be considered. Directed graphs with a mutual edge pair are treated as non-simple if this argument is set toIGRAPH_UNDIRECTED
(which treats the graph as if it was undirected).- The type of the
loops
argument ofigraph_adjlist_init_complementer()
,igraph_centralization_degree()
,igraph_centralization_degree_tmax()
,igraph_degree()
,igraph_maxdegree()
,igraph_sort_vertex_ids_by_degree()
andigraph_strength()
was changed toigraph_loops_t
fromigraph_bool_t
, allowing finer-grained control about how loop edges are treated. igraph_get_biadjacency()
now takes aweights
parameter, and can optionally create weighted biadjacency matrices.igraph_adjacency()
now treatsIGRAPH_LOOPS_TWICE
asIGRAPH_LOOPS_ONCE
when the mode isIGRAPH_ADJ_DIRECTED
,IGRAPH_ADJ_UPPER
orIGRAPH_ADJ_LOWER
. For directed graphs, this is for the sake of consistency with the rest of the library whereIGRAPH_LOOPS_TWICE
is considered for undirected graphs only. For the "upper" and "lower" modes, double-counting the diagonal makes no sense because the double-counting artifact appears when you add the transpose of an upper (or lower) diagonal matrix on top of the matrix itself. See Github issue #2501 for more context.
Graph generators
igraph_barabasi_game()
,igraph_barabasi_aging_game()
,igraph_recent_degree_game()
andigraph_recent_degree_aging_game()
no longer interprets an emptyoutseq
vector as a missing out-degree sequence. PassNULL
if you don't wish to specify an out-degree sequence.igraph_degree_sequence_game()
no longer interprets an empty in-degree vector as a request for generating undirected graphs. To generate undirected graphs, passNULL
for in-degrees.igraph_lcf()
was renamed toigraph_lcf_small()
andigraph_lcf_vector()
was renamed toigraph_lcf()
. Nowigraph_lcf()
takes shifts as a vector input, whileigraph_lcf_small()
accepts a shorthand notation where shifts are given as a variable number of function arguments.igraph_sbm_game()
uses anigraph_edge_type_sw_t allowed_edge_types
parameter instead ofigraph_bool_t loops
and supports generating graphs with mutli-edges. The parameter determining the total number of vertices (n
) was removed as it was redundant.igraph_rewire_edges()
uses anigraph_edge_type_sw_t allowed_edge_types
parameter instead ofloops
andmultiple
.igraph_watts_strogatz_game()
uses anigraph_edge_type_sw_t allowed_edge_types
parameter instead ofloops
andmultiple
.igraph_static_fitness_game()
uses anigraph_edge_type_sw_t allowed_edge_types
parameter instead ofloops
andmultiple
.igraph_static_power_law_game()
uses anigraph_edge_type_sw_t allowed_edge_types
parame...
igraph 0.10.16
Added
igraph_count_triangles()
counts undirected triangles in a graph.igraph_count_adjacent_triangles()
(rename ofigraph_adjacent_triangles()
).igraph_rng_get_bool()
andRNG_BOOL()
produce a single random boolean.igraph_product()
computes various kinds of graph products of two graphs. Thanks to Gulshan Kumar @gulshan-123 for contributing this functionality in #2748!
Changed
igraph_neighborhood_size()
,igraph_neighborhood()
andigraph_neighborhood_graphs()
now accept a negativeorder
value and interpret it as infinite order. Previously, a negativeorder
value was disallowed.igraph_famous()
now acceptsGroetzsch
as an alias ofGrotzsch
.igraph_vertex_path_from_edge_path()
can now determine the start vertex automatically.
Fixed
igraph_largest_independent_vertex_sets()
andigraph_maximal_independent_vertex_sets()
would sometimes return incorrect results for graphs with self-loops. This is now corrected.igraph_vertex_path_from_edge_path()
now validates the start vertex.- Fixed a memory leak in the GraphML parser for cases when the
id
attribute was specified multiple times within the same XML tag.
Deprecated
- The undocumented function
igraph_vector_sumsq()
is deprecated. Useigraph_blas_dnrm2()
to compute the Euclidean norm of real vectors. igraph_adjacent_triangles()
is deprecated and scheduled for removal in 1.0.igraph_deterministic_optimal_imitation()
,igraph_moran_process()
,igraph_roulette_wheel_imitation()
andigraph_stochastic_imitation()
are now deprecated and scheduled for removal in 1.0.igraph_rng_get_dirichlet()
is deprecated and scheduled for removal in 1.0. Its interface is inconsistent with the otherigraph_rng_get_...()
functions and we have a replacemenet for it inigraph_sample_dirichlet()
. igraph 1.0 will gain anigraph_rng_sample_dirichlet()
function that lets the caller pass in anigraph_rng_t
instance as well.
Other
- Workaround for bug in CMake 3.31.0, see https://gitlab.kitware.com/cmake/cmake/-/issues/26449
- Updated the vendored
plfit
library to version 1.0.0. This works around a bug in some MSVC / Windows SDK versions that define aNAN
macro that is not a compile-time constant. - Updated vendored BLAS to 3.12.0 and vendored ARPACK to ARPACK-NG 3.7.0.
- Re-translated vendored BLAS/LAPACK/ARPACK sources with f2c version 20240504.
- The performance of
igraph_transitivity_undirected()
is improved by a factor of about 2.5. - The performance of
igraph_degree_sequence_game()
is improved when usingIGRAPH_DEGSEQ_CONFIGURATION_SIMPLE
. - Documentation improvements and fixes.
igraph 0.10.15
Added
igraph_bitset_update()
copies the contents of one bitset into another (experimental function).igraph_vector_sort_ind()
(rename ofigraph_vector_qsort_ind()
).igraph_vector_contains_sorted()
(rename ofigraph_vector_binsearch2()
).igraph_vector_reverse_section()
reverses a contiguous section of a vector.igraph_vector_rotate_left()
applies a cyclic permutation to a vector.igraph_strvector_swap_elements()
swaps two strings in anigraph_strvector_t
.igraph_find_cycle()
finds a single cycle in a graph, if it exists (experimental function).igraph_feedback_vertex_set()
finds a minimum feedback vertex set in a directed or undirected graph (experimental function).igraph_simple_cycles()
andigraph_simple_cycles_callback()
find all simple cycles in a graph, optionally with an upper bound on the cycle length (experimental functions). Many thanks to Tim Bernhard @GenieTim for contributing this functionality in #2181.
Changed
igraph_feedback_arc_set()
uses a much faster method for solving the exact minimum feedback arc set problem. The new method (IGRAPH_FAS_EXACT_IP_CG
) is used by default (i.e. withIGRAPH_FAS_EXACT_IP
), but the previous method is also kept available (IGRAPH_FAS_EXACT_IP_TI
).igraph_motifs_randesu()
,igraph_motifs_randesu_callback()
,igraph_motifs_randesu_estimate()
andigraph_motifs_randesu_no()
now acceptNULL
for theircut_prob
parameter, signifying that a complete search should be performed.igraph_centralization_eigenvector_centrality_tmax()
andigraph_centralization_eigenvector_centrality()
cannot produce meaningful results without normalizing vertex-level eigenvector centrality in a well-defined way. This was not the case when usingscale=false
. These functions now ignore the value of thescale
parameter and always scale vertex-level centrality scores to have a maximum of 1. If you require a different type of normalization for the vertex-level eigenvector centrality scores, perform this normalization manually, and calligraph_centralization()
to compute the centralization.- When
igraph_eigenvector_centrality()
receives a directed acyclic graph as input, it now produces an eigenvector which has 1s in sink vertices and 0s everywhere else. Previously, it would return an all-zero vector. Note that eigenvector centrality is not uniquely defined for graphs that are not (strongly) connected, and both of these results can be considered valid. This change is to ensure consistency with the definition of the theoretical maximum of eigenvector centralization, which assumes the in-star to be the most centralized directed network.
Fixed
igraph_layout_drl()
andigraph_layout_drl_3d()
would crash with an assertion failure when interrupted. This is now fixed.- Removed broken interruption support from
igraph_community_spinglass_single()
. - In rare cases
igraph_community_multilevel()
could enter an infinite loop. This is now corrected. - Fixed null-dereference in
igraph_community_voronoi()
when requestingmodularity
but notmembership
. - Fixed null-dereference in
igraph_community_optimal_modularity()
when requestingmodularity
but notmembership
and passing a null graph or singleton graph. igraph_layout_umap()
andigraph_layout_umap_3d()
would crash when passingdistances=NULL
anddistances_are_weights=true
. This is now fixed.igraph_layout_umap()
andigraph_layout_umap_3d()
would crash on interruption. This is now fixed.igraph_read_graph_pajek()
now warns about duplicate vertex IDs in input files.- The documented
igraph_strvector_resize_min()
was missing from headers. igraph_feedback_arc_set()
now validates the edge weights.igraph_layout_lgl()
was not working correctly since igraph 0.10.0 due to a poor choice of initial coordinates. This is now fixed.igraph_centralization_degree_tmax()
,igraph_centralization_betweenness_tmax()
,igraph_centralization_closeness_tmax()
, andigraph_centralization_eigenvector_centrality_tmax()
now validate theirnodes
parameter.igraph_centralization_degree_tmax()
,igraph_centralization_betweenness_tmax()
,igraph_centralization_closeness_tmax()
, andigraph_centralization_eigenvector_centrality_tmax()
now return NaN for zero-vertex graphs. Previously they would return invalid values.igraph_centralization_eigenvector_centrality_tmax()
now returns 0 for the undirected singleton graph. Previous it would return an invalid value.igraph_motifs_randesu_estimate()
now validates the sample size.igraph_bipartite_projection_size()
now validates the bipartitetypes
vector.
Deprecated
igraph_minimum_spanning_tree_prim()
andigraph_minimum_spanning_tree_unweighted()
are deprecated. Useigraph_minimum_spanning_tree()
in conjunction withigraph_subgraph_from_edges()
instead.igraph_array3_t
and all associated functions are deprecated and scheduled for removal in igraph 1.0.igraph_vector_qsort_ind()
is deprecated in favour ofigraph_vector_sort_ind()
.igraph_vector_binsearch2()
is deprecated in favour ofigraph_vector_contains_sorted()
.
Other
- Fixed multiple memory leaks in benchmark programs.
- Documentation improvements.
igraph 0.10.13
Added
igraph_bitset_fill()
sets all elements of a bitset to the same value (experimental function).igraph_bitset_null()
clears all elements of a bitset (experimental function).igraph_bitset_is_all_zero()
,igraph_bitset_is_all_one()
,igraph_bitset_is_any_zero()
,igraph_bitset_is_any_one()
check if any/all elements of a bitset are zeros/ones (experimental functions).igraph_chung_lu_game()
implements the classic Chung-Lu model, as well as a number of its variants (experimental function).igraph_mean_degree()
computes the average of vertex degrees (experimental function).igraph_count_loops()
counts self-loops in the graph (experimental function).igraph_is_clique()
checks if all pairs within a set of vertices are connected (experimental function).igraph_is_independent_vertex_set()
checks if no pairs within a set of vertices are connected (experimental function).igraph_hypercube()
creates a hypercube graph (experimental function).igraph_vector_intersection_size_sorted()
counts elements common to two sorted vectors (experimental function).igraph_stack_capacity()
returns the allocated capacity of a stack.igraph_vector_is_all_finite()
checks if all elements in a vector are finite (i.e. neither NaN nor Inf).
Fixed
- Fixed a bug that incorrectly cached that a graph has no multiple edges when
igraph_init_adjlist()
was called withIGRAPH_NO_LOOPS
andIGRAPH_NO_MULTIPLE
and all the multi-edges were loop edges. igraph_is_forest()
would fail to set the result variable when testing for a directed forest, and it was already cached that the graph was not an undirected forest.igraph_hub_and_authority_scores()
no longer clips negative results to zeros when negative weights are present.- Fixed an assertion failure in
igraph_realize_bipartite_degree_sequence()
with some non-graphical degree sequences when requesting simple bipartite graphs. igraph_static_fitness_game()
checks the input more carefully, and avoids an infinite loop in rare edge cases, such as when (almost) all fitness scores are zero.igraph_arpack_rnsolve()
used the incorrect error message text for some errors. This is now corrected.- Corrected the detection of some MSVC-specific bitset intrinsics during configuration.
- Corrected a bug in the fallback implementation of
igraph_bitset_countl_zero()
whenIGRAPH_INTEGER_SIZE
was set to 32. This fallback implementation was not used with GCC, Clang, or MSVC.
Changed
igraph_is_graphical()
andigraph_is_bigraphical()
are now linear-time in all cases, and generally several times faster than before (thanks to @gendelpiekel, contributed in #2605).igraph_erdos_renyi_game_gnp()
can now generate graphs with more than a hundred million vertices.igraph_hub_and_authority_scores()
now warns when negative edge weights are present.igraph_layout_lgl()
now uses a BFS tree rooted in the vertex specified asproot
to guide the layout. Previously it used an unspecified (arbitrary) spanning tree.- Updated the internal heuristics used by igraph's ARPACK interface,
igraph_arpack_rssolve()
andigraph_arpack_rnsolve()
, to improve the robustness of calculations. - Updated the initial vector construction in
igraph_hub_and_authority_scores()
,igraph_eigenvector_centrality()
andigraph_(personalized_)pagerank()
withIGRAPH_PAGERANK_ALGO_ARPACK
. This improves the robustness and convergence of calculations.
Other
- Documentation improvements.
- Reduced the memory usage of several functions by using bitsets instead of Boolean vectors.
igraph_vector_intersect_sorted()
has better performance when the input vector sizes are similar.
igraph 0.10.12
Added
igraph_transitive_closure()
computes the transitive closure of a graph (experimental function).igraph_reachability()
determines which vertices are reachable from each other in a graph (experimental function).igraph_count_reachable()
counts how many vertices are reachable from each vertex (experimental function).- Added a bitset data structure,
igraph_bitset_t
, and a set of corresponding functions (experimental functionality).
Fixed
igraph_community_label_propagation()
is now interruptible.igraph_is_bipartite()
would on rare occasions return invalid results when the cache was employed.igraph_weighted_adjacency()
correctly passes through NaN values withIGRAPH_ADJ_MAX
, and correctly recognizes symmetric adjacency matrices containing NaN values withIGRAPH_ADJ_UNDIRECTED
.igraph_read_graph_gml()
can now read GML files that use ids larger than what is representable on 32 bits, provided that igraph was configured with a 64-bitigraph_integer_t
size.- Fixed a performance issue in
igraph_read_graph_graphml()
with files containing a very large number of entities, such as>
. igraph_read_graph_pajek()
has improved vertex ID validation that better matches that of Pajek's own behavior.
Changed
igraph_eigenvector_centrality()
no longer issues a warning when the input is directed and weighted. When using this function, keep in mind that eigenvector centrality is well-defined only for (strongly) connected graphs, and edges with a zero weights are effectively treated as absent.
Deprecated
igraph_transitive_closure_dag()
is deprecated in favour ofigraph_transitive_closure()
Other
- Documentation improvements.
igraph_strength()
andigraph_degree(loops=false)
are now faster when calculating values for all vertices (contributed by @gendelpiekel in #2602)
igraph 0.10.11
Added
igraph_is_complete()
checks whether there is a connection between all pairs of vertices (experimental function, contributed by Aymeric Agon-Rambosson @aagon in #2510).igraph_join()
creates the join of two graphs (experimental function, contributed by Quinn Buratynski @GanzuraTheConsumer in #2508).
Fixed
- Fixed a corruption of the "finally" stack in
igraph_write_graph_gml()
for certain invalid GML files. - Fixed a memory leak in
igraph_write_graph_lgl()
when vertex names were present but edge weights were not. - Fixed the handling of duplicate edge IDs in
igraph_subgraph_from_edges()
. - Fixed conversion of sparse matrices to dense with
igraph_sparsemat_as_matrix()
when sparse matrix object did not make use of its full allocated capacity. igraph_write_graph_ncol()
andigraph_write_graph_lgl()
now refuse to write vertex names which would result in an invalid file that cannot be read back in.igraph_write_graph_gml()
now ignores graph attributes callededge
ornode
with a warning. Writing these would create an invalid GML file that igraph couldn't read back.igraph_disjoint_union()
andigraph_disjoint_union_many()
now check for overflow.igraph_read_graph_graphml()
now correctly compares attribute values with certain expected values, meaning that prefixes of valid values ofattr.type
are not accepted anymore.- Empty IDs are not allowed any more in
<key>
tags of GraphML files as this is a violation of the GraphML specification. igraph_is_separator()
andigraph_is_minimal_separator()
now work correctly with disconnected graphs.igraph_linegraph()
now considers self-loops to be self-adjacent in undirected graphs, bringing consistency with how directed graphs were already handled in previous versions.igraph_all_st_mincuts()
now correctly returns all minimum cuts. This also fixes a problem withigraph_minimum_size_separators()
.- Corrected minor error in
igraph_community_label_propagation()
when adding labels to isolated nodes with some fixed labels present. igraph_community_spinglass()
no longer crashes when passing an edgeless graph and an empty weight vector.igraph_rewire()
no longer crashes on graphs with more than three vertices but fewer than two edges.
Changed
igraph_rewire()
on longer throws an error on graphs with fewer than four vertices. These graphs are now returned unchanged, just like other graphs which are the unique realization of their degree sequence.
Other
- Performance:
igraph_is_simple()
now makes more granular use of the cache. - Performance:
igraph_degree()
now makes use of the cache when checking for self-loops. - The performance of
igraph_is_minimal_separator()
was improved. igraph_is_graphical()
now performs graphicality checks for degree sequences of simple directed graphs in linear time, an improvement from the previously used quadratic algorithm (contributed by Arnar Bjarni Arnarson @Tagl in #2537).- Documentation improvements.
igraph 0.10.10
Fixed
- When
igraph_is_forest()
determined that a graph is not a directed forest, and theroots
output parameter was set toNULL
, it would incorrectly cache that the graph is also not an undirected forest. igraph_spanner()
now correctly ignores edge directions, and no longer crashes on directed graphs.
Deprecated
igraph_are_connected()
is renamed toigraph_are_adjacent()
; the old name is kept available until at least igraph 1.0.
Other
- Documentation improvements.
igraph 0.10.9
Added
igraph_is_biconnected()
checks if a graph is biconnected.igraph_realize_bipartite_degree_sequence()
constructs a bipartite graph that has the given bidegree sequence, optionally ensuring that it is connected (PR #2425 by Lára Margrét Hólmfríðardóttir @larah19).
Fixed
- More robust error handling in HRG code.
- Fixed infinite loop in
igraph_hrg_sample_many()
. igraph_community_fastgreedy()
no longer crashes when providing a modularity vector only, but not a merges matrix of membership vector.- The graph property cache was not initialized correctly on systems where the size of
bool
was not 1 byte (#2477). - Compatibility with libxml2 version 2.12 (#2442).
Deprecated
- The macro
STR()
is deprecated; use the functionigraph_strvector_get()
instead.
Other
- Performance: Reduced memory usage and improved initialization performance for
igraph_strvector_t
. - Performance: Improved cache use by
igraph_is_bipartite()
. - The documentation is now also generated in Texinfo format.
- Documentation improvements
igraph 0.10.8
Added
igraph_joint_degree_matrix()
computes the joint degree matrix, i.e. counts connections between vertices of different degrees. (PR #2407 by Lára Margrét Hólmfríðardóttir @larah19)igraph_joint_degree_distribution()
computes the joint distribution of degrees at either end of edges.igraph_joint_type_distribution()
computes the joint distribution of vertex categories at either end of edges, i.e. the mixing matrix.igraph_degree_correlation_vector()
computes the degree correlation function and its various directed generalizations.
Changed
- The behaviour of the Pajek format reader and writer is now more closely aligned with the Pajek software and the reader is more tolerant of input it cannot interpret. Only those vertex and edge parameters are treated as valid which Pajek itself understands, therefore support for
size
is now dropped, and support for thefont
edge parameter is added. See http://mrvar.fdv.uni-lj.si/pajek/DrawEPS.htm for more information. Invalid/unrecognized parameters are now converted to igraph attributes by the reader, but just as before, they are not output by the writer. - The Pajek format writer now encodes newline and quotation mark characters in a Pajek-compatible manner (
\n
and"
, respectively). igraph_avg_nearest_neighbor_degree()
now supports non-simple graphs.
Fixed
- Resolved "ignoring duplicate libraries" warning when building tests with Xcode 15 on macOS.
- Fixed the handling of duplicate vertex IDs in
igraph_induced_subgraph()
. igraph_vector_which_min()
andigraph_vector_which_max()
no longer allow zero-length input, which makes them consistent with other similar functions, and was the originally intended behaviour. Passing zero-length input is invalid use and currently triggers an assertion failure.igraph_erdos_renyi_game_gnm()
andigraph_erdos_renyi_game_gnp()
are now interruptible.igraph_de_bruijn()
andigraph_kautz()
are now interruptible.igraph_full()
,igraph_full_citation()
,igraph_full_multipartite()
andigraph_turan()
are now interruptible.igraph_avg_nearest_neighbor_degree()
did not computeknnk
correctly in the weighted case.- Fixed variadic arguments of invalid types, which could cause incorrect behaviour with
igraph_matrix_print()
, as well as test suite failures, on some platforms. 32-bit x86 was affected when settingIGRAPH_INTEGER_SIZE
to 64. igraph_subisomorphic_lad()
now returns a single null map when the pattern is the null graph.igraph_community_spinglass()
now checks its parameters more carefully.igraph_similarity_dice_pairs()
andigraph_similarity_jaccard_pairs()
now validate vertex IDs.igraph_maxflow()
now returns an error code if the source and target vertices are the same. It used to get stuck in an infinite loop in earlier versions when theflow
argument was non-NULL.
igraph 0.10.7
Added
igraph_radius_dijkstra()
computes the graph radius with weighted edges (experimental function).igraph_graph_center_dijkstra()
computes the graph center, i.e. the set of minimum eccentricity vertices, with weighted edges (experimental function).
Fixed
igraph_full_bipartite()
now checks for overflow.igraph_bipartite_game_gnm()
andigraph_bipartite_game_gnp()
are now more robust to overflow.- Bipartite graph creation functions now check input arguments.
igraph_write_graph_dot()
now quotes real numbers written in exponential notation as necessary.- Independent vertex set finding functions could trigger the fatal error "Finally stack too large" when called on large graphs.
Deprecated
igraph_bipartite_game()
is now deprecated; useigraph_bipartite_game_gnm()
andigraph_bipartite_game_gnp()
instead.
Other
- Documentation improvements.