As usual, the source can be obtained from the GitHub releases page.
A summary of changes in 1.0.1 is below.
exit() from the igraph shared library. These were accidentally introduced into igraph 1.0.0 through Qhull and Infomap.std::cout from the igraph shared library, as required by CRAN.igraph_hub_and_authority_scores() that printed a warning about zero entries in the result even when the number of zeros was below the threshold used in the corresponding checks._POSIX_C_SOURCE feature test macro and standard C++ headers. Now _DARWIN_C_SOURCE is defined when compiling igraph on Apple systems.s_copy() and s_cat(). This restores compatibility with emscripten.VERSIONING.md.
As usual, the source can be obtained from the GitHub releases page.
A summary of changes in 1.0.0 is below.
This section lists API-breaking changes in this version, and provides guidance on adapting code written for igraph 0.10.x.
igraph_setup() is now recommended to be called before using the library. This function may gain essential functions in the future. See the “Added” section below for details.igraph_integer_t was renamed to igraph_int_t, but igraph_integer_t is kept as an alias and it will remain available for at least the next major version. Library headers and source code uses igraph_int_t from now on.igraph_rng_set_default() now returns a pointer to the previous default RNG. Furthermore, this function now only stores a pointer to the igraph_rng_t struct passed to it, instead of copying the struct. Thus the igraph_rng_t object must continue to exist for as long as it is used as the default RNG.void * argument anymore; this is relevant to maintainers of higher-level interfaces only.igraph_bool_t instead of an igraph_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() and IGRAPH_STATUSF()) do not convert error codes to IGRAPH_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, report IGRAPH_INTERRUPTED explicitly. It is the responsibility of higher-level interfaces to handle this error code appropriately.RNG_BEGIN() and RNG_END() macros were removed. You are now responsible for seeding the RNG before using any igraph function that may use random numbers by calling igraph_rng_seed(igraph_rng_default(), ...), or by simply ensuring that igraph_setup() was called before the first use of the library.<igraph.h> header. While an igraph installation includes several sub-headers, these are for organizational purposes only, and their contents may change without notice. Only #include <igraph.h> is supported.IGRAPH_EINVEVECTOR error code was removed; igraph_create() and igraph_add_edges() that used to return this error code for invalid edge vectors will now return IGRAPH_EINVAL instead.IGRAPH_NONSQUARE error code was removed; functions that used this error code now return IGRAPH_EINVAL instead when encountering a non-square matrix.IGRAPH_EGLP error code and all other GLP-specific error codes (starting with IGRAPH_GLP_) were removed; functions that used this error code now return IGRAPH_FAILURE instead, providing more details in the message associated to the error code.IGRAPH_ELAPACK error code was removed; functions that used this error code now return IGRAPH_FAILURE instead, providing more details in the message associated to the error code.IGRAPH_CPUTIME error code was removed in favour of the interruption mechanism built into igraph.IGRAPH_EDIVZERO and IGRAPH_EATTRIBUTES error codes were removed with no replacement.IGRAPH_ENEGLOOP was removed. Use IGRAPH_ENEGCYCLE instead. The underlying numerical value is the same as it was for IGRAPH_ENEGLOOP.IGRAPH_ARPACK_...) were replaced with a single IGRAPH_EARPACK error code. Details about the underlying ARPACK failure are provided in the error message.IGRAPH_EINVEID was added for cases when an invalid edge ID was encountered in an edge ID vector.igraph_strvector_push_back_len() now takes a length parameter of size_t instead of igraph_int_t.igraph_strvector_print() no longer takes a file parameter. Use igraph_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() and igraph_matrix_swap() no longer return an error code.igraph_vector_list_swap() and igraph_graph_list_swap() no longer return an error code.igraph_vector_swap_elements() no longer returns an error code.igraph_vector_list_swap_elements() and igraph_graph_list_swap_elements() no longer return an error code.igraph_matrix_copy_to() gained an igraph_matrix_storage_t storage parameter that specifies whether the data should be written in column-major or row-major format.igraph_vector_view(), igraph_matrix_view(), igraph_matrix_view_from_vector(), and igraph_vector_ptr_view() now return their result as a return value instead of an output parameter. This allows assigning the value to a const variable without triggering warnings with modern compilers.igraph_attribute_handler_t members that formerly took an untyped igraph_vector_ptr_t argument are now taking a typed igraph_attribute_record_list_t argument instead.IGRAPH_ATTRIBUTE_DEFAULT value of the igraph_attribute_type_t enum was removed.gettype member of igraph_attribute_table_t was renamed to get_type for consistency with the naming scheme of other struct members.value member of igraph_attribute_record_t is now a union that can be used to formally treat the associated pointer as an igraph_vector_t *, igraph_strvector_t * or igraph_vector_bool_t *.igraph_delete_vertices_map() (formerly called igraph_delete_vertices_idx()) and igraph_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 new igraph_bool_t bycol argument that determines the order in which the edges are returned. bycol = false reproduces the existing behaviour, while bycol = true returns the edges suitable for a matrix stored in column-wise order.igraph_neighbors() and igraph_vs_adj() gained two extra arguments, igraph_loops_t loops and igraph_bool_t multiple to specify what to do with loop and multiple edges. This makes their interfaces consistent with igraph_adjlist_init(). Use loops = IGRAPH_LOOPS_TWICE and multiple = true to reproduce the previous behavior.igraph_incident() and igraph_es_incident() gained an extra igraph_loops_t loops argument to specify what to do with loop edges. This makes their interfaces consistent with igraph_inclist_init(). Use loops = IGRAPH_LOOPS_TWICE to reproduce the previous behavior.igraph_multiple_t enum type was removed from the public API as it was essentially a Boolean. The symbolic constants IGRAPH_MULTIPLE (same as true) and IGRAPH_NO_MULTIPLE (same as false) were kept to improve readability of code written directly in C.igraph_density() now takes an optional weights parameter.igraph_is_simple() gained an extra igraph_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 to IGRAPH_UNDIRECTED (which treats the graph as if it was undirected).loops argument of igraph_adjlist_init_complementer(), igraph_centralization_degree(), igraph_centralization_degree_tmax(), igraph_degree(), igraph_maxdegree(), igraph_sort_vertex_ids_by_degree() and igraph_strength() was changed to igraph_loops_t from igraph_bool_t, allowing finer-grained control about how loop edges are treated. Pass IGRAPH_LOOPS_TWICE and IGRAPH_NO_LOOPS to reproduce the previous behaviour of true and false.igraph_get_biadjacency() now takes a weights parameter, and can optionally create weighted biadjacency matrices.igraph_adjacency() now treats IGRAPH_LOOPS_TWICE as IGRAPH_LOOPS_ONCE when the mode is IGRAPH_ADJ_DIRECTED, IGRAPH_ADJ_UPPER or IGRAPH_ADJ_LOWER. For directed graphs, this is for the sake of consistency with the rest of the library where IGRAPH_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.igraph_barabasi_game(), igraph_barabasi_aging_game(), igraph_recent_degree_game() and igraph_recent_degree_aging_game() no longer interprets an empty outseq vector as a missing out-degree sequence. Pass NULL 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, pass NULL for in-degrees.igraph_erdos_renyi_game_gnm() uses a igraph_edge_type_sw_t allowed_edge_types parameter instead of igraph_bool_t loops, and can now uniformly sample not only simple graphs but also multigraphs. It also gained an edge_labeled Boolean parameter which controls whether to sample from the set of ordered edge lists (equivalent to igraph_iea_game() for multigraphs).igraph_erdos_renyi_game_gnp() uses a igraph_edge_type_sw_t allowed_edge_types parameter instead of igraph_bool_t loops, and can now sample multigraphs from a maximum entropy model with a prescribed expected edge multiplicity. It also gained an edge_labeled Boolean parameter which controls whether to sample from the set of ordered edge lists.igraph_bipartite_game_gnm() gained an igraph_edge_type_sw_t allowed_edge_types parameter, and can now uniformly sample not only simple graphs but also multigraphs. It also gained an edge_labeled Boolean parameter which controls whether to sample from the set of ordered edge lists (equivalent to igraph_bipartite_iea_game() for multigraphs).igraph_bipartite_game_gnp() gained an igraph_edge_type_sw_t allowed_edge_types parameter, and can now sample multigraphs from a maximum entropy model with a prescribed expected edge multiplicity. It also gained an edge_labeled Boolean parameter which controls whether to sample from the set of ordered edge lists.igraph_lcf() was renamed to igraph_lcf_small() and igraph_lcf_vector() was renamed to igraph_lcf(). Now igraph_lcf() takes shifts as a vector input, while igraph_lcf_small() accepts a shorthand notation where shifts are given as a variable number of function arguments.igraph_sbm_game() uses an igraph_edge_type_sw_t allowed_edge_types parameter instead of igraph_bool_t loops and now supports generating graphs with multi-edges. The parameter determining the total number of vertices (n) was removed as it was redundant.igraph_rewire_edges() uses an igraph_edge_type_sw_t allowed_edge_types parameter instead of loops and multiple.igraph_rewire() now takes an igraph_edge_type_sw_t allowed_edge_types parameter to specify whether to create self-loops. The igraph_rewiring_t enum type was removed. Instead of the old IGRAPH_REWIRING_SIMPLE, use IGRAPH_SIMPLE_SW. Instead of the old IGRAPH_REWIRING_SIMPLE_LOOPS, use IGRAPH_LOOPS_SW.igraph_rewire() now takes an optional igraph_rewiring_stats_t * output argument. You can pass the appropriate struct there to find out the number of successful swaps during the rewiring operation.igraph_watts_strogatz_game() uses an igraph_edge_type_sw_t allowed_edge_types parameter instead of loops and multiple.igraph_static_fitness_game() uses an igraph_edge_type_sw_t allowed_edge_types parameter instead of loops and multiple.igraph_static_power_law_game() uses an igraph_edge_type_sw_t allowed_edge_types parameter instead of loops and multiple.igraph_correlated_game() now takes the graph being constructed as the first argument to remain consistent with other graph constructors. Earlier versions used to take the original graph as the first argument.permutation argument of igraph_correlated_game() and igraph_correlated_pair_game() has changed: the i-th element of the vector now contains the index of the original vertex that will be mapped to the i-th vertex in the new graph. This is consistent with how igraph_permute_vertices() operates (which has also changed in igraph 1.0).igraph_distances(), igraph_distances_cutoff(), igraph_get_shortest_path(), igraph_get_shortest_paths() and igraph_get_all_shortest_paths() gained a weights argument. The functions now automatically select the appropriate implementation (unweighted, Dijkstra, Bellman-Ford or Johnson) algorithm based on whether weights are present and whether there are negative weights or not. You can still call the individual methods by their more specific names.igraph_distances_johnson() now takes an igraph_neimode_t mode parameter to determine in which direction paths should be followed.igraph_similarity_jaccard() and igraph_similarity_dice() now take two sets of vertices to create vertex pairs of, instead of one.igraph_diameter(), igraph_pseudo_diameter(), igraph_radius(), igraph_graph_center(), igraph_eccentricity() and igraph_average_path_length() were merged into the undirected ones by adding a new argument named weights in the second position.weights parameter of igraph_average_path_length(), igraph_global_efficiency(), igraph_local_efficiency() and igraph_average_local_efficiency() were moved to the second position, after the graph itself, for consistency with other functions.igraph_get_all_simple_paths() returns its results in an integer vector list (igraph_vector_int_list_t) instead of a single integer vector.igraph_get_all_simple_paths() now has an additional parameter that allows restricting paths by minimum length as well, and its mode parameter was moved to before the path length limit parameters.igraph_get_all_simple_paths() gained a max_results parameter to limit the number of returned results. Pass 1 to return a single result, or IGRAPH_UNLIMITED to return all results.igraph_simple_cycles() gained a max_results parameter to limit the number of returned results. Pass 1 to return a single result, or IGRAPH_UNLIMITED to return all results.igraph_community_edge_betweenness() now takes both a weights and a lengths parameter. Edge weights (interpreted as connection strengths) are used to divide betweenness scores before selecting them for removal as well as for the modularity computation. Edge lengths are used for defining shortest path lengths during the betweenness computation. This fixes issues #2229 and #1040.igraph_community_infomap() now supports regularization and gained the is_regularized and regularization_strength parameters.igraph_community_label_propagation() changed signature to allow specification of label propagation algorithm (LPA) variants. A new fast label propagation variant was added.igraph_community_leiden() now takes two vertex_out_weights and vertex_in_weights parameters in order to support directed graphs, instead of the previous single node_weights parameter. To obtain the old behavior for undirected graphs, pass the vertex weights as vertex_out_weights and set vertex_in_weights to NULL.history parameter of igraph_community_leading_eigenvector() is now a pointer to an igraph_vector_int_t instead of an igraph_vector_t.igraph_community_optimal_modularity() now takes a resolution parameter and its weight parameter was moved to the second place.igraph_community_spinglass_single() now uses igraph_real_t for its inner_links and outer_links output parameters, as these return not simply edge counts, but the sum of the weights of some edges.igraph_count_automorphisms() has been renamed to igraph_count_automorphisms_bliss() because it has a BLISS-specific interface. A new igraph_count_automorphisms() function was added with a simplified interface that does not depend on BLISS.igraph_automorphism_group() has been renamed to igraph_automorphism_group_bliss() because it has a BLISS-specific interface. A new igraph_automorphism_group() function was added with a simplified interface that does not depend on BLISS.igraph_canonical_permutation() has been renamed to igraph_canonical_permutation_bliss() because it has a BLISS-specific interface. A new igraph_canonical_permutation() function was added with a simplified interface that does not depend on BLISS.igraph_subisomorphic_lad() does not have a CPU time limit parameter any more. If you wish to stop the calculation from another thread or a higher level interface, use igraph’s interruption mechanism.igraph_permute_vertices() permutation argument has changed: the i-th element of the vector now contains the index of the original vertex that will be mapped to the i-th vertex in the new graph. This is now consistent with how other igraph functions treat permutations and vertex index vectors; for instance, you can now pass the result of igraph_topological_sorting() directly to igraph_permute_vertices() to obtain a new graph where the vertices are sorted topologically.igraph_permute_vertices() permutation argument, the semantics of the permutations returned from igraph_canonical_permutation() and igraph_canonical_permutation_bliss() have also been inverted to maintain the invariant that the output of these functions can be fed into igraph_permute_vertices() directly.igraph_isoclass_subgraph() now takes a parameter of type igraph_vs_t vids instead of igraph_vector_int_t vids. Apply igraph_vss_vector() to the vector of vertex IDs to convert it to an igraph_vs_t.normalized parameter to support normalizing the result by the number of vertex pairs in the graph. At the same time, their parameter ordering was standardized. The following functions are affected: igraph_betweenness(), igraph_betweenness_cutoff(), igraph_edge_betweenness(), igraph_edge_betweenness_cutoff(), igraph_betweenness_subset(), igraph_edge_betweenness_subset().igraph_edge_betweenness() and igraph_edge_betweenness_cutoff() now have an eids parameter to return only a subset of results. This makes their interface consistent with other betweenness functions.igraph_eigenvector_centrality(), igraph_centralization_eigenvector_centrality() and igraph_centralization_eigenvector_centrality_tmax() now use a mode parameter with possible values IGRAPH_OUT, IGRAPH_IN or IGRAPH_ALL to control how edge directions are considered. Previously they used a boolean directed parameter.igraph_eigenvector_centrality(), igraph_centralization_eigenvector_centrality() and igraph_centralization_eigenvector_centrality_tmax() no longer have a scale parameter. The result is now always scaled so that the largest centrality value is 1.igraph_hub_and_authority_scores() no longer has a scale parameter. The result is now always scaled so that the largest hub and authority scores are each 1.igraph_pagerank(), igraph_personalized_pagerank() and igraph_personalized_pagerank_vs() had their parameter ordering standardized.igraph_cliques(), igraph_weighed_cliques(), igraph_maximal_cliques(), igraph_maximal_cliques_file(), igraph_maximal_cliques_subset(), igraph_independent_sets() and igraph_maximal_independent_sets() received a max_results parameter to limit the number of returned results. Pass 1 to return a single result, or IGRAPH_UNLIMITED to return all results.igraph_maximal_independent_sets() received min_size and max_size parameters that control the range of independent set sizes that are returned.igraph_weighted_cliques() had its parameter ordering standardized: the igraph_bool_t maximal parameter now comes before the min_weight / max_weight parameters.igraph_maximal_cliques_callback() had its parameter ordering standardized: the igraph_clique_handler_t *cliquehandler_fn, void *arg parameter pair now comes at the end, making this function consistent with igraph_cliques_callback().igraph_layout_sugiyama() does not return an “extended graph” anymore. The bends in the edges of the layout are encoded in a list of matrices instead; each item in the list belongs to an edge of the original graph and contains the control points of the edge in a row-wise fashion. The matrix will have no rows if no control points are needed on the edge.igraph_minimum_spanning_tree() takes a new method parameter that controls the algorithm used for finding the spanning tree. Kruskal’s algorithm was added.igraph_rng_get_dirichlet() function was removed.igraph_motifs_randesu_no() and igraph_motifs_randesu_estimate() now take an igraph_real_t as their result argument to prevent overflows when igraph is compiled with 32-bit integers.igraph_motifs_handler_t callback type now takes a const igraph_vector_int_t *vids parameter. Previously this was not formally const, even though it was not allowed to modify vids. This affects uses of igraph_motifs_randesu_callback().igraph_fundamental_cycles() and igraph_minimum_cycle_basis() now use the type igraph_real_t for their bfs_cutoff parameter, and had their weights parameter moved to the 2nd position.igraph_read_graph_ncol() and igraph_read_graph_lgl() now uses a default edge weight of 1 instead of 0 for files that do not contain edge weights for at least some of the edges.igraph_setup() performs all initialization tasks that are recommended before using the igraph library. Right now this function only initializes igraph’s internal random number generator with a practically random seed, but it may also perform other tasks in the future. It is recommended to call this function before using any other function from the library (although most of the functions will work fine now even if this function is not called).igraph_iea_game() samples random multigraphs through independent edge assignment.igraph_bipartite_iea_game() samples random bipartite multigraph through independent edge assignment.igraph_weighted_biadjacency() creates a weighted graph from a bipartite adjacency matrix.igraph_vector_ptr_capacity() returns the allocated capacity of a pointer vector.igraph_vector_ptr_resize_min() deallocates unused capacity of a pointer vector.igraph_strvector_fprint() prints a string vector to a file.igraph_rng_sample_dirichlet(), igraph_rng_sample_sphere_volume() and igraph_rng_sample_sphere_surface() samples vectors from a Dirichlet distribution or from the volume or surface of a sphere while allowing the user to specify the random number generator to use.igraph_nearest_neighbor_graph() computes a neighborhood graph of spatial points based on a neighbor count, cutoff distance, and chosen metric (experimental function). Thanks to Arnór Friðriksson @Zepeacedust for implementing this in #2788!igraph_delaunay_graph() computes a Delaunay graph of a spatial point set (experimental function). Thanks to Arnór Friðriksson @Zepeacedust for implementing this in #2806!igraph_gabriel_graph() computes the Gabriel graph of a spatial point set (experimental function). Thanks to Arnór Friðriksson @Zepeacedust for implementing this in #2827!igraph_relative_neighborhood_graph() computes the relative neighborhood graph of a spatial point set (experimental function). Thanks to Arnór Friðriksson @Zepeacedust for implementing this in #2827!igraph_lune_beta_skeleton() and igraph_circle_beta_skeleton() compute the lune and circle based β-skeletons of a spatial point set (experimental function). Thanks to Arnór Friðriksson @Zepeacedust for implementing this in #2827!igraph_beta_weighted_gabriel_graph() computes a Gabriel graph of a spatial point set, along with a threshold β value for each edge, at which the edge ceases to be part of the lune-based β-skeleton (experimental function). Thanks to Arnór Friðriksson @Zepeacedust for implementing this in #2827!igraph_spatial_edge_lengths() computes edge lengths based on spatial vertex coordinates (experimental function).igraph_community_leiden_simple() is a simplified interface to igraph_community_leiden() that allows selecting the objective function to maximize directly.igraph_vector_difference_and_intersection_sorted() calculates the intersection and the differences of two vectors simultaneously.IGRAPH_UNLIMITED, defined to -1, is a convenience constant for use with various “size limit” parameters, such as number of cliques returned, maximum path length, number of results returned, etc. It indicates that no limit should be used.name vertex attribute in igraph. The id attribute is no longer used.igraph_minimum_size_separators() no longer returns any separating vertex sets for complete graphs. Prior to igraph 1.0, it would return all n - 1 size vertex subsets where n is the vertex count.igraph_community_edge_betweenness() now treats edges with large weights as strong connections.igraph_biadjacency() now truncates non-integer matrix entries to their integer part instead of rounding them up. This brings consistency with related functions such as igraph_adjacency().igraph_(weighted_)adjacency() and igraph_biadjacency() has changed. Note that these functions do not guarantee any specific edge order.igraph_eigenvector_centrality() now warns about eigenvector centralities equal to zero, as these indicate a disconnected graph, for which eigenvector centrality is not meaningful.igraph_hub_and_authority_scores() now warns when a large fraction of centrality scores are zero, as this indicates a non-unique solution, and thus the returned result may not be meaningful.igraph_hub_and_authority_scores() now warns when providing an undirected graph as input, and falls back to the equivalent eigenvector centrality computation.igraph_get_stochastic_sparse() no longer throws an error when some row or column sums are zero. This brings its behaviour in line with igraph_get_stochastic().igraph_vector_append(), igraph_strvector_append() and igraph_vector_ptr_append() now use a different allocation strategy: if the to vector has insufficient capacity, they double its capacity. Previously they reserved precisely as much capacity as needed for appending the from vector.igraph_community_infomap() has been updated with a more recent version (2.8.0). Isolated vertices are now supported.igraph_vector_difference_sorted() now handles multisets properly (and documents how the multiplicities are handled).igraph_count_loops(), igraph_count_reachable(), igraph_degree_correlation_vector, igraph_distances_cutoff(), igraph_distances_floyd_warshall(), igraph_distances_dijkstra_cutoff(), igraph_ecc(), igraph_enter_safelocale(), igraph_exit_safelocale(), igraph_feedback_vertex_set(), igraph_find_cycle(), igraph_get_shortest_path_astar(), igraph_graph_power(), igraph_hexagonal_lattice(), igraph_hypercube(), igraph_is_bipartite_coloring(), igraph_is_clique(), igraph_is_complete(), igraph_is_edge_coloring(), igraph_is_vertex_coloring(), igraph_is_independent_vertex_set(), igraph_join(),igraph_joint_degree_distribution(), igraph_joint_degree_matrix(), igraph_joint_type_distribution(), igraph_layout_align(), igraph_layout_merge_dla(), igraph_mean_degree(), igraph_radius(), igraph_realize_bipartite_degree_sequence(), igraph_reachability(), igraph_transitive_closure(), igraph_tree_from_parent_vector(), igraph_triangular_lattice(), igraph_vector_intersection_size_sorted(), igraph_voronoi().igraph_community_spinglass_single() now uses igraph_real_t for its inner_links and outer_links output parameters, as these return not simply edge counts, but the sum of the weights of some edges. Thus these results are no longer incorrectly rounded.igraph_correlated_game() and igraph_correlated_pair_game() validate their permutation argument.igraph_Calloc(), igraph_Realloc() and igraph_Free(). Use IGRAPH_CALLOC(), IGRAPH_REALLOC() and IGRAPH_FREE() instead.igraph_adjacent_triangles() was removed. Use igraph_count_adjacent_triangles() instead.igraph_are_connected() was removed. Use igraph_are_adjacent() instead.igraph_automorphisms() was removed. Use igraph_count_automorphisms() or igraph_count_automorphisms_bliss() instead.igraph_convex_hull() was removed. Use igraph_convex_hull_2d() instead.igraph_decompose_destroy() was removed.igraph_hub_score() and igraph_authority_score() were removed.igraph_vs_seq(), igraph_vss_seq(), igraph_es_seq(), igraph_ess_range(), and igraph_vector_init_seq() were removed. Use the range alternatives instead of the old seq ones.igraph_erdos_renyi_game() and igraph_bipartite_game() were removed. Use the corresponding functions with _gnm() and _gnp() in the name instead.igraph_tree() was removed. Use igraph_kary_tree() instead.igraph_lattice() was removed. Use igraph_square_lattice() instead.igraph_minimum_spanning_tree_prim() was removed. Use igraph_minimum_spanning_tree() in conjunction with igraph_subgraph_from_edges() instead.igraph_minimum_spanning_tree_unweighted() was removed. Use igraph_minimum_spanning_tree() in conjunction with igraph_subgraph_from_edges() instead.igraph_get_sparsemat() was removed. Use igraph_get_adjacency_sparse() instead.igraph_get_stochastic_sparsemat() was removed. Use igraph_get_stochastic_sparse() instead.igraph_laplacian() was removed. Use igraph_get_laplacian() or igraph_get_laplacian_sparse() instead.igraph_subgraph_edges() was removed. Use igraph_subgraph_from_edges() instead.igraph_read_graph_dimacs() and igraph_write_graph_dimacs() were removed. These names may be re-used in the future. Use igraph_read_graph_dimacs_flow() and igraph_write_graph_dimacs_flow() instead.igraph_isomorphic_function_vf2() was removed. Use igraph_get_isomorphisms_vf2_callback() instead.igraph_subisomorphic_function_vf2() was removed. Use igraph_get_subisomorphisms_vf2_callback() instead.igraph_isomorphic_34() was removed. Its functionality is accessible through igraph_isomorphic().igraph_transitive_closure_dag() was removed. Use igraph_transitive_closure() instead, which works for all graphs, not just DAGs.igraph_sparsemat_copy() was removed. Use igraph_sparsemat_init_copy() instead.igraph_sparsemat_eye() was removed. Use igraph_sparsemat_init_eye() instead.igraph_sparsemat_diag() was removed. Use igraph_sparsemat_init_diag() instead.igraph_sparsemat() and igraph_weighted_sparsemat() functions were removed; use igraph_get_adjacency_sparse() instead.igraph_random_edge_walk() was removed. Its functionality is incorporated in igraph_random_walk().igraph_vector_qsort_ind() was removed. Use igraph_vector_sort_ind() instead.igraph_vector_binsearch2() was removed. Use igraph_vector_contains_sorted() instead.igraph_vector_copy() and igraph_matrix_copy() were removed. Use igraph_vector_init_copy() and igraph_matrix_init_copy() instead.igraph_vector_e(), igraph_vector_e_ptr(), igraph_matrix_e() and igraph_matrix_e_ptr() were removed. Use the alternatives ending in _get() and _get_ptr() instead.igraph_vector_move_interval2() was removed.igraph_zeroin() was removed.igraph_deterministic_optimal_imitation(), igraph_moran_process(), igraph_roulette_wheel_imitation() and igraph_stochastic_imitation() functions were removed.igraph_sample_dirichlet(), igraph_sample_sphere_surface() and igraph_sample_sphere_volume() were removed in favour of igraph_rng_sample_dirichlet(), igraph_rng_sample_sphere_surface() and igraph_rng_sample_sphere_volume(), which allow the user to specify the random number generator to use.igraph_fileformat_type_t was removed.IGRAPH_POSINFINITY and IGRAPH_NEGINFINITY were removed. Use IGRAPH_INFINITY and -IGRAPH_INFINITY instead.igraph_sparsemat_view() as its design was broken and required the user to reach into the internals of igraph_sparmsemat_t to destroy it properly.igraph_delete_vertices_idx() is now deprecated in favour of igraph_delete_vertices_map(), which is functionally equivalent but has a name that is consistent with igraph_induced_subgraph_map().igraph_adjacency() and igraph_weighted_adjacency()).This is the last planned release of the 0.x series. A new 1.0 release with a stable API will arrive soon, with quite a few breaking changes that were necessary to evolve igraph’s API into a form that we can commit ourselves to for a longer period of time. If you do not want to update your existing code, you should stick to 0.10.17 in your own projects.
A summary of changes in 0.10.17 is below.
igraph_layout_align() attempts to align a graph layout with the coordinate axes in a visually pleasing manner (experimental function).igraph_product() supports the lexicographic, strong and modular graph products. Thanks to Gulshan Kumar @gulshan-123 for contributing this functionality in #2772 and #2793!igraph_rooted_product() computes the rooted graph product (experimental function). Thanks to Gulshan Kumar @gulshan-123 for contributing this functionality in #2793!igraph_mycielskian() (experimental function) and igraph_mycielski_graph() compute a Mycielski transformation of a graph, and a Mycielski graph, respectively. Thanks to Gulshan Kumar @gulshan-123 for contributing this functionality in #2741!igraph_path_graph() is a convenience wrapper for igraph_ring() with circular=false.igraph_cycle_graph() is a convenience wrapper for igraph_ring() with circular=true.igraph_site_percolation(), igraph_bond_percolation() and igraph_edgelist_percolation() compute the evolution of the size of the giant component of a graph when vertices (site percolation) or edges (bond percolation) are added one by one in a given order (experimental functions). Thanks to Arnór Friðriksson @Zepeacedust for implementing this in #2778!igraph_invert_permutation() inverts a permutation stored in an integer vector.igraph_is_vertex_coloring() and igraph_is_edge_coloring() check if a vertex or edge coloring is valid, i.e. whether adjacent vertices/edges always have distinct colors (experimental functions). Thanks to Sarah Rashidi @its-serah for contributing this in #2807!igraph_is_bipartite_coloring() checks if a bipartite type assignment is valid, i.e. whether adjacent vertices always have different types (experimental function). Thanks to Sarah Rashidi @its-serah for contributing this in #2807!igraph_rich_club_sequence() calculates how the density of a graph changes as vertices are removed (experimental function). Thanks to Zara Zong @minifinity for contributing this in #2740!igraph_bipartite_game_gnp() can now generate graphs with more than a hundred million vertices. Thanks to Dev Lohani @devlohani99 for implementing this in #2767!igraph_reindex_membership() now supports arbitrary cluster indices. Previously, it would error when indices are not within 0 .. n-1 where n is the membership vector length.igraph_modularity() now supports arbitrary cluster indices. However, ensuring that cluster indices are within the range 0 .. n-1, where n is the vertex count, allows for better performance.igraph_layout_kamada_kawai_3d().igraph_community_leiden() did not iterate until the partition ceased to change when n_iterations < 0. Thanks to Lucas Lopes Felipe @lucaslopes for fixing this in #2799!igraph_widest_path_widths_floyd_warshall(), igraph_widest_path_widths_dijkstra(), igraph_get_widest_paths(), and igraph_get_widest_path() incorrectly ignored edges with positive infinite width. Now they ignore edges with negative infinite width.igraph_cliques_callback() would sometimes fail to respect a request to stop (i.e. returning IGRAPH_STOP) from the callback. This is now corrected.igraph_hypercube() now validates the hypercube dimension and prevents negative values.igraph_sparsemat_view() checks for out-of-memory conditions.igraph_simple_cycles_callback() by returning IGRAPH_STOP from the callback.igraph_sparsemat() and igraph_weighted_sparsemat() are now deprecated; their functionality is duplicated by igraph_get_adjacency_sparse(). They will be removed in version 1.0.igraph_convex_hull() is deprecated in favour of igraph_convex_hull_2d() and scheduled for removal in 1.0.igraph_simple_cycles() and igraph_simple_cycles_callback()) is sped up by skipping cycle search from some redundant start vertices. Thanks to Tim Bernhard @GenieTim for contributing this improvement in #2714!igraph_realize_degree_sequence() is significantly sped up for simple undirected graphs, and now has near-linear complexity for this case. Thanks to Zara Zong @ minifinity for implementing this in #2786!One year ago, a small group of us at cynkra submitted a project proposal to the R Consortium’s ISC, which got approved. We are very grateful for this support. In this post we shall explain what the motivation for our project was, what we accomplished… and what we hope to work on next!
The first version of the igraph R package was published on CRAN in 2006. Since then, the igraph C library that forms the core of the R package, and the R package itself, have been further developed and widely used. Over the years, the R package has also accrued a bit of documentation debt and technical debt, that we wanted to tackle to set up igraph for success in the next decade. Both aspects had the potential to simplify further updates of the package.
To provide a more consistent interface, part of igraph functions or arguments are slowly but consistently being deprecated. Some of them used to be deprecated using custom solutions or base R deprecations. In contrast, now all deprecations happen through the lifecycle package. On manual pages, deprecation badges indicate the maintenance status of functions or arguments.
library("igraph")
#>
#> Attaching package: 'igraph'
#> The following objects are masked from 'package:stats':
#>
#> decompose, spectrum
#> The following object is masked from 'package:base':
#>
#> union
g <- sample_gnp(10, 0.5)
graph.density(g)
#> Warning: `graph.density()` was deprecated in igraph 2.0.0.
#> ℹ Please use `edge_density()` instead.
#> This warning is displayed once every 8 hours.
#> Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
#> generated.
#> [1] 0.5111111
Having everything in the “lifecycle system” now means the interface and documentation is consistent for users, and also that we can more easily increase deprecation levels over time by searching for lifecycle calls. Last, but not least, all deprecations are listed in a vignette.
Besides the documentation of lifecycle, we created and used a custom roxygen2 tags to link to the C docs from manual pages. Example.
We have made a conscious effort to port errors from base R to cli, at the same time improving phrasing of errors. For instance,
stop("invalid value supplied for `weighted' argument, please see docs.")
became
cli::cli_abort(c(
"{.arg weighted} can't be {.obj_type_friendly {weighted}}.",
i = "See {.help graph_from_biadjacency_matrix}'s manual page."
))
which is more informative about the invalid value supplied, and which directly links to the manual page.
We have also fixed some bugs (example).
We did a lot of refactoring!
Most of it was focussed on tests, as previously explained on this blog: merging some test files to ensure alignment between R scripts and test files, refactoring test files for better readability and future debugging, updating the testthat usage by removing old expectations.
We also worked in the R/folder, for instance we replaced the usage of an embedded version of lazyeval with rlang calls
(PR 1, PR 2).
We shared our experience working on igraph in part of a talk and in various blog posts:
We are proud of the progress made in the igraph codebase but we don’t want to stop here! In particular, we’d really like to do more work on open issues to improve the state of the issue tracker and to ensure easier future triage ; to better describe and execute the scope differences between the C and R libraries ; and to make the documentation more complete and clearer.
]]>A summary of changes in 0.10.15 is below.
igraph_bitset_update() copies the contents of one bitset into another (experimental function).igraph_vector_sort_ind() (rename of igraph_vector_qsort_ind()).igraph_vector_contains_sorted() (rename of igraph_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 an igraph_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() and igraph_simple_cycles_callback() find all simple cycles in a graph, optionally with an upper bound on the cycle length (experimental functions). Many thanks to @GenieTim for contributing this functionality in #2181.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. with IGRAPH_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() and igraph_motifs_randesu_no() now accept NULL for their cut_prob parameter, signifying that a complete search should be performed.igraph_centralization_eigenvector_centrality_tmax() and igraph_centralization_eigenvector_centrality() cannot produce meaningful results without normalizing vertex-level eigenvector centrality in a well-defined way. This was not the case when using scale=false. These functions now ignore the value of the scale 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 call igraph_centralization() to compute the centralization.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.igraph_layout_drl() and igraph_layout_drl_3d() would crash with an assertion failure when interrupted. This is now fixed.igraph_community_spinglass_single().igraph_community_multilevel() could enter an infinite loop. This is now corrected.igraph_community_voronoi() when requesting modularity but not membership.igraph_community_optimal_modularity() when requesting modularity but not membership and passing a null graph or singleton graph.igraph_layout_umap() and igraph_layout_umap_3d() would crash when passing distances=NULL and distances_are_weights=true. This is now fixed.igraph_layout_umap() and igraph_layout_umap_3d() would crash on interruption. This is now fixed.igraph_read_graph_pajek() now warns about duplicate vertex IDs in input files.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(), and igraph_centralization_eigenvector_centrality_tmax() now validate their nodes parameter.igraph_centralization_degree_tmax(), igraph_centralization_betweenness_tmax(), igraph_centralization_closeness_tmax(), and igraph_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 bipartite types vector.igraph_minimum_spanning_tree_prim() and igraph_minimum_spanning_tree_unweighted() are deprecated. Use igraph_minimum_spanning_tree() in conjunction with igraph_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 of igraph_vector_sort_ind().igraph_vector_binsearch2() is deprecated in favour of igraph_vector_contains_sorted().The preferred way of installing the Python interface is via pip; typing pip install igraph should install a pre-compiled Python wheel on most supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the source code are also available from the Python Package Index page.
Read on for more details about the changes in version 0.11.8.
Graph.feedback_vertex_set() to calculate a feedback vertex set of the graph.Graph.feedback_arc_set() that allows the user to select the specific integer problem formulation used by the underlying solver.Graph.get_shortest_path_astar() heuristic function callback.The preferred way of installing the Python interface is via pip; typing pip install igraph should install a pre-compiled Python wheel on most supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the source code are also available from the Python Package Index page.
Read on for more details about the changes in version 0.11.6.
Graph.Hypercube() for creating n-dimensional hypercube graphs.Graph.Chung_Lu() for sampling from the Chung-Lu model as well as several related models.Graph.is_complete() to test if there is a connection between all distinct pairs of vertices.Graph.is_clique() to test if a set of vertices forms a clique.Graph.is_independent_vertex_set() to test if some vertices form an independent set.Graph.mean_degree() for a convenient way to compute the average degree of a graph.Graph.rewire() now attempts to perform edge swaps 10 times the number of edges by default.A summary of changes in 0.10.13 is below.
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).igraph_init_adjlist() was called with IGRAPH_NO_LOOPS and IGRAPH_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.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.igraph_bitset_countl_zero() when IGRAPH_INTEGER_SIZE was set to 32. This fallback implementation was not used with GCC, Clang, or MSVC.igraph_is_graphical() and igraph_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 as proot to guide the layout. Previously it used an unspecified (arbitrary) spanning tree.igraph_arpack_rssolve() and igraph_arpack_rnsolve(), to improve the robustness of calculations.igraph_hub_and_authority_scores(), igraph_eigenvector_centrality() and igraph_(personalized_)pagerank() with IGRAPH_PAGERANK_ALGO_ARPACK. This improves the robustness and convergence of calculations.igraph_vector_intersect_sorted() has better performance when the input vector sizes are similar.This major release brings development in line with the igraph C library. Version 1.6.0 of the R package used version 0.9.10 of the C core. The changes in the 0.10 series of the C core are now taken up in version 2.0 of the R package. Having the R package use the latest version of the C core was a huge undertaking, and is a great milestone which makes the many improvements from version 0.10 of the C core available to R users.
Improvements made in the C core will be made available more easily in functions in the R package. See the complete changelog of the C core. While we tried to maintain compatibility with version 1.6.0 of the R interface, it wasn’t always possible. Refer to the “Breaking changes” sections in the changelog of the R package (breaking changes section). If you maintain a package that depends on igraph, you may have heard from us.
The move to version 0.10 of C/igraph brings many quality improvements, including support for graphs with billions of vertices and edges on 64-bit computers, much more stringent error checking, as well as lots of improvements to robustness, reliability and mathematical consistency across functions.
Future work will aim at further automating the generation of R code from C code, making improved C core functionality more quickly available to R users. Additionally, we plan to expose more C core functions, since not all functions are available to R users just yet.
The igraph R package now has a website, generated with the popular pkgdown R package, that is to say, a website that has a predictable structure and that includes a search functionality. The website now features an introductory vignette contributed by Adrian Diaz and Fabio Zanini in both English and Spanish.
We are in the middle of efforts aimed at making the lifecycle of functions more explicit so that you might know what function is deprecated, and which function is more experimental.
For instance, we will slowly be removing most “dotted-names functions”,
like add.edges() that is now add_edges(), although both versions currently still work.
The is_biconnected()
function is an example of an experimental function, that is to say, a C function that was just exposed.
We’d be thankful to hear from you if you experience any difficulty with the new release. Please cast us a line (and a reprex!) in the issue tracker. For further feedback, please use igraph’s discussion forum. Do not hesitate to share about the release… in your networks. 😉
Thanks a ton to all the contributors who helped us craft the new igraph package: @a-lambda, @Antonov548, @barracuda156, @bebejhun, @bockthom, @brooksambrose, @CdeMills, @clpippel, @csqsiew, @dmurdoch, @Flu09, @Ganson2018, @gherrarte, @gwfs521, @jefferis, @jeroen, @jessijessi, @joshua-zh, @kalibera, @knwng, @krlmlr, @Lighter-k, @louisaslett, @lptolik, @lufuhao, @maelle, @maksymiuks, @Matyasch, @mfansler, @ngmaclaren, @noriakis, @reuning, @ntamas, @snowGlint, @stephenashton-dhsc, @szhorvat, @tdhock, @vtraag, @xinguo1236, and @Zhaoju-Deng.
]]>The preferred way of installing the Python interface is via pip; typing pip install igraph should install a pre-compiled Python wheel on most supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the source code are also available from the Python Package Index page.
Read on for more details about the changes in version 0.11.5.
prefixattr=... keyword argument to Graph.write_graphml() that allows the user to strip the g_, v_ and e_ prefixes from GraphML files written by igraph.Graph.are_connected() has now been renamed to Graph.are_adjacent(), following up a similar change in the C core. The old name of the function is deprecated but will be kept around until at least 0.12.0.PyCObject API calls in the C code were replaced by calls to PyCapsule, thanks to @DavidRConnell in #763get_shortest_path() documentation was clarified by @JDPowell648 in #764This release brings a large number of quality enhancements, including many bug fixes and performance improvements. Upgrading is highly recommended for all igraph users.
This will be one of the last—if not the last—releases of the 0.10 series, with igraph 1.0 planned for release early summer this year. Pre-releases will be made available for feedback from the community.
A summary of changes in 0.10.12 is below.
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).igraph_bitset_t, and a set of corresponding functions (experimental functionality).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 with IGRAPH_ADJ_MAX, and correctly recognizes symmetric adjacency matrices containing NaN values with IGRAPH_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-bit igraph_integer_t size.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.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.igraph_transitive_closure_dag() is deprecated in favour of igraph_transitive_closure()igraph_strength() and igraph_degree(loops=false) are now faster when calculating values for all vertices (contributed by @gendelpiekel in #2602)This release brings a large number of quality enhancements, including many bug fixes and performance improvements. Upgrading is highly recommended for all igraph users.
This will be one of the last—if not the last—releases of the 0.10 series, with igraph 1.0 planned for release early summer this year. Pre-releases will be made available for feedback from the community.
A summary of changes in 0.10.11 is below.
igraph_is_complete() checks whether there is a connection between all pairs of vertices (experimental function, contributed by Aymeric Agon-Rambosson in #2510).igraph_write_graph_gml() for certain invalid GML files.igraph_write_graph_lgl() when vertex names were present but edge weights were not.igraph_subgraph_from_edges().igraph_sparsemat_as_matrix() when sparse matrix object did not make use of its full allocated capacity.igraph_write_graph_ncol() and igraph_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 called edge or node with a warning. Writing these would create an invalid GML file that igraph couldn’t read back.igraph_disjoint_union() and igraph_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 of attr.type are not accepted anymore.<key> tags of GraphML files as this is a violation of the GraphML specification.igraph_is_separator() and igraph_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 with igraph_minimum_size_separators().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.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.igraph_is_simple() now makes more granular use of the cache.igraph_degree() now makes use of the cache when checking for self-loops.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 in #2537).The source can be obtained from the GitHub releases page.
This is primarily a maintenance release with bug fixes, in particular a caching issue in igraph_is_forest().
Read on for more details about the changes in version 0.10.10.
igraph_is_forest() determined that a graph is not a directed forest, and the roots output parameter was set to NULL, 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.igraph_are_connected() is renamed to igraph_are_adjacent(); the old name is kept available until at least igraph 1.0.The source can be obtained from the GitHub releases page.
This is primarily a maintenance release with bug fixes, but it also adds functions to check whether a graph is biconnected and to construct a bipartite graph from a bidegree sequence.
Read on for more details about the changes in version 0.10.9.
igraph_is_biconnected() checks if a graph is biconnected.igraph_igraph_realize_bipartite_degree_sequence() constructs a bipartite graph that has the given bidegree sequence, optionally ensuring that it is connected.igraph_hrg_sample_many().igraph_community_fastgreedy() no longer crashes when providing a modularity vector only, but not a merges matrix of membership vector.bool was not 1 byte (#2477).STR() is deprecated; use the function igraph_strvector_get() instead.igraph_strvector_t.igraph_is_bipartite().The preferred way of installing the Python interface is via pip; typing pip install igraph should install a pre-compiled Python wheel on most supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the source code are also available from the Python Package Index page.
Read on for more details about the changes in version 0.11.3, including those that became possible by updating the C core to 0.10.8.
Graph.__invalidate_cache() for debugging and benchmarking purposes.size is now dropped, and support for the font 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.\n and ", respectively).loops=... argument of Graph.is_bigraphical().Graph.induced_subgraph() no longer cause a crash.Graph.subisomorphic_lad() now returns a single null map when the pattern is the null graph.Graph.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.The source can be obtained from the GitHub releases page.
This is primarily a maintenance release with bug fixes, but it also adds functions to compute the joint degree matrix, the joint degree distribution and the degree correlation function of graphs as well as a generalized joint distribution of arbitrary vertex categories at the endpoints of edges.
Read on for more details about the changes in version 0.10.8.
igraph_joint_degree_matrix() computes the joint degree matrix, i.e. counts connections between vertices of different degrees.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.size is now dropped, and support for the font 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.\n and ", respectively).igraph_avg_nearest_neighbor_degree() now supports non-simple graphs.igraph_induced_subgraph().igraph_vector_which_min() and igraph_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() and igraph_erdos_renyi_game_gnp() are now interruptible.igraph_de_bruijn() and igraph_kautz() are now interruptible.igraph_full(), igraph_full_citation(), igraph_full_multipartite() and igraph_turan() are now interruptible.igraph_avg_nearest_neighbor_degree() did not compute knnk correctly in the weighted case.igraph_matrix_print(), as well as test suite failures, on some platforms. 32-bit x86 was affected when setting IGRAPH_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() and igraph_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 the flow argument was non-NULL.The preferred way of installing the Python interface is via pip; typing pip install igraph should install a pre-compiled Python wheel on most supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the source code are also available from the Python Package Index page.
The source can be obtained from the GitHub releases page.
This is primarily a maintenance release with bug fixes, but it also adds weighted variants of igraph_radius() and igraph_graph_center() as experimental functions. Their API will be finalized in version 0.11.0 (although we do not anticipate any changes compared to the current version).
Read on for more details about the changes in version 0.10.7.
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).igraph_full_bipartite() now checks for overflow.igraph_bipartite_game_gnm() and igraph_bipartite_game_gnp() are now more robust to overflow.igraph_write_graph_dot() now quotes real numbers written in exponential notation as necessary.igraph_bipartite_game() is now deprecated; use igraph_bipartite_game_gnm() and igraph_bipartite_game_gnp() instead.The source can be obtained from the GitHub releases page.
This is a maintenance release bringing bug fixes only. In particular, we fixed convergence failures in igraph_community_voronoi() in certain cases on certain platforms, and ensured compatibility with libxml2 2.11.
Read on for more details about the changes in version 0.10.6.
igraph_community_voronoi().IGRAPH_CALLOC() and IGRAPH_REALLOC() now check for overflow.install target of the CMake build system are now relocatable, i.e. the generated igraph-targets.cmake file does not contain absolute paths any more.The source can be obtained from the GitHub releases page.
This is a maintenance release bringing bug fixes, performance improvements, as well as new experimental features.
Read on for more details about the changes in version 0.10.5.
igraph_graph_power() computes the kth power of a graph (experimental function).igraph_community_voronoi() for detecting communities using Voronoi partitioning (experimental function).igraph_community_walktrap() no longer requires modularity and merges to be non-NULL when membership is non-NULL.igraph_isomorphic() now supports multigraphs.igraph_hub_and_authority_scores(), igraph_hub_score() and igraph_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 igraph_eigenvector_centrality() on loopy undirected graphs. This is now corrected.igraph_community_infomap() now checks edge and vertex weights for validity.igraph_minimum_spanning_tree() and igraph_minimum_spanning_tree_prim() now check that edge weights are not NaN.igraph_arpack_rssolve() and igraph_arpack_rnsolve(), i.e. the ARPACK interface in igraph, are now interruptible. As a result, several other functions that rely on ARPACK (eigenvector centrality, hub and authority scores, etc.) also became interruptible.igraph_get_shortest_paths_dijkstra(), igraph_get_all_shortest_paths_dijkstra() and igraph_get_shortest_paths_bellman_ford() now validate the from vertex.igraph_local_scan_1_ecount() for weighted undirected graphs which would miscount loops and multi-edges.igraph_automorphisms() is now deprecated; its new name is igraph_count_automorphisms(). The old name is kept available until at least igraph 0.11.igraph_hub_score() and igraph_authority_score() are now deprecated. Use igraph_hub_and_authority_scores() instead.igraph_get_incidence() is now deprecated; its new name is igraph_get_biadjacency() to reflect that the returned matrix is an adjacency matrix between pairs of vertices and not an incidence matrix between vertices and edges. The new name is kept available until at least igraph 0.11. We plan to re-use the name in later versions to provide a proper incidence matrix where the rows are vertices and the columns are edges.igraph_hrg_dendrogram() is deprecated because it requires an attribute handler and it goes against the convention of returning attributes in vectors where possible. Use igraph_from_hrg_dendrogram() instead, which constructs the dendrogram as an igraph graph and returns the associated probabilities in a vector.igraph_vertex_connectivity().igraph_simplify() makes use of the cache, and avoids simplification when the graph is already known to be simple.strtod() does not respect the locale on macOS 13 Ventura, causing the example::safelocale test to fail within igraph’s test suite. This is a bug in macOS 13. This issue will be inconsequential for most users. It affects use cases when igraph is run within a process whose numeric locale has been explicitly set to one that does not use a decimal point, and then igraph_enter_safelocale() (or other means) are used to temporarily set the locale to "C" before calling igraph functions. See the following links for more details:
ARPACK-NG 3.9.0 fails to produce a result under rare circumstances. This issue can affect any use of ARPACK-NG in principle, and may cause igraph’s example::centralization and test::centralization tests to fail, depending on the specific configuration and BLAS implementation that is being used. For more details, see:
The source can be obtained from the GitHub releases page.
This release adds support for finding a shortest path with the A* algorithm and for finding a greedy vertex coloring with the DSatur heuristics. It also adds interruption support for the Bellman-Ford and Floyd-Warshall shortest path finder algorithms.
Read on for more details about the changes in version 0.10.4.
igraph_get_shortest_path_astar() finds a shortest path with the A* algorithm.igraph_vertex_coloring_greedy() now supports the DSatur heuristics (#2284, thanks to @professorcode1).test build target now only runs the unit tests, but it does not build them. In order to both build and run tests, use the check target, which continues to behave as before (PR #2291).igraph_distances_floyd_warshall() now has from and to parameters for choosing source and target vertices.igraph_distances_floyd_warshall() now has an additional method parameter to select a specific algorithm. A faster “Tree” variant of the Floyd-Warshall algorithm is now available (#2267, thanks to @rfulekjames).ctest executable after configuring a project in order to determine test executables. Use the build_tests target to build the tests first, or use the check target to both build and run all unit tests (PR #2291).igraph_widest_path_widths_floyd_warshall().The source can be obtained from the GitHub releases page.
This release adds support for generating triangular and hexagonal lattices, constructing trees from a “parent” vector, and retrieving the IDs of the edges in the induced subgraph of a vertex set. It also refines the experimental API of the UMAP layout function, fixes a few bugs and improves the documentation.
Read on for more details about the changes in version 0.10.3.
igraph_matrix_init_array() to initialize an igraph matrix by copying an existing C array in column-major or row-major order.igraph_layout_umap_compute_weights() computes weights for the UMAP layout algorithm from distances. This used to be part of igraph_layout_umap(), but it is now in a separate function to allow the user to experiment with different weighting schemes.igraph_triangular_lattice() to generate triangular lattices of various kinds.igraph_hexagonal_lattice() to generate hexagonal lattices of various kinds.igraph_tree_from_parent_vector() to create a tree or a forest from a parent vector (i.e. a vector that encodes the parent vertex of each vertex).igraph_induced_subgraph_edges() produces the IDs of edges contained within a subgraph induced by the given vertices.igraph_layout_umap() function changed; the last argument is now a Boolean that specifies whether distances should already be treated as weights, and the sampling probability argument was removed.igraph_transitivity_barrat(), igraph_community_fluid_communities(), igraph_sir(), igraph_trussness() and graphlet functions did not correctly detect when a directed input graph had effective multi-edges due to ignoring edge directions. Such graphs are now rejected by these functions.igraph_2dgrid_move() that sometimes crashed the Large Graph Layout function when a grid cell became empty.igraph_pagerank() and igraph_personalized_pagerank() would fail to converge when the ARPACK implementation was used and a vertex had more than one outgoing edge but all these edges had zero weights.igraph_pagerank() and igraph_personalized_pagerank() no longer allow negative weights. Previously, edges with negative weights were silently ignored when using the PRPACK implementation. The ARPACK implementation would issue a warning saying that they are ignored, but in fact it computed an incorrect result.igraph_all_st_cuts() and igraph_all_st_mincuts() no longer trigger the “Finally stack too large” fatal error when called on certain large graphs. This was a regression in igraph 0.10.igraph_community_label_propagation() no longer rounds weights to integers. This was a regression in igraph 0.10.igraph_read_graph_graphdb() does more thorough checks on the input file.igraph_calloc() did not zero-initialize the allocated memory. This is now corrected. Note that the macro IGRAPH_CALLOC() was not affected.igraph_subgraph_edges() is now deprecated to avoid confusion with igraph_induced_subgraph_edges(); its new name is igraph_subgraph_from_edges(). The old name is kept available until at least igraph 0.11.igraph_matrix_transpose().Get["https://raw.githubusercontent.com/szhorvat/IGraphM/master/IGInstaller.m"]
Other:
Added:
IGBetaWeightedGabrielGraph for computing the β value where each edge of a lune-based β-skeleton would disappear (experimental function).IGModularityMatrix gives the modularity matrix of a network.IGCanonicalLabeledGraph creates a canonical representation of a labeled graph without changing vertex names. Graphs which are considered equivalent by IGSameGraphQ have the same canonical representation. It is intended for removing duplicate graphs using DeleteDuplicatesBy.IGCanonicalEdgeList creates a canonical representation of an edge list, in a manner similar to IGCanonicalLabeledGraph.Other:
The preferred way of installing the Python interface is via pip; typing pip install igraph should install a pre-compiled Python wheel on most supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the source code are also available from the Python Package Index page.
The documentation of the project has also been moved to Read The Docs.
]]>The source can be obtained from the GitHub releases page.
This release mostly includes bug fixes and documentation improvements, but it also adds a few new functions (shortest paths with cutoff, Floyd-Warshall algorithm and Voronoi partitioning) with an experimental API that might still change in upcoming releases. Experimental functions are clearly marked both here and in the documentation. The API of these functions will be finalized in 0.11.0, after which no further changes are expected.
Read on for more details about the changes in version 0.10.2.
igraph_distances_cutoff() and igraph_distances_dijkstra_cutoff() calculate shortest paths with an upper limit on the path length (experimental functions).igraph_distances_floyd_warshall() for computing all-pairs shortest path lengths in dense graphs (experimental function).igraph_ecc() computes the edge clustering coefficient of some edges (experimental function).igraph_voronoi() computes a Voronoi partitioning of vertices (experimental function).igraph_count_multiple_1() determines the multiplicity of a single edge in the graph.igraph_dqueue_get() accesses an element in a queue by index.igraph_degree_1() efficiently retrieves the degee of a single vertex.igraph_lazy_adjlist_has() and igraph_lazy_inclist_has() to check if adjacent vertices / incident edges have already been computed and stored for a given vertex in a lazy adjlist / inclist.igraph_edge() now verifies that the input edge ID is valid.igraph_community_leading_eigenvector(), igraph_adjacency_spectral_embedding(), igraph_laplacian_spectral_embedding(), igraph_arpack_rssolve() and igraph_arpack_rnsolve() now generate a random starting vector using igraph’s own RNG if needed instead of relying on LAPACK or ARPACK to do so. This makes sure that the results obtained from these functions remain the same if igraph’s RNG is seeded with the same value.igraph_community_leading_eigenvector() does not stop the splitting process any more when there are multiple equally likely splits (indicated by the multiplicity of the leading eigenvector being larger than 1). The algorithm picks an arbitrary split instead and proceeds normally.igraph_get_k_shortest_paths() that sometimes yielded incorrect results on undirected graphs when the mode argument was set to IGRAPH_OUT or IGRAPH_IN.igraph_trussness() is now interruptible.igraph_spanner() is now interruptible.igraph_layout_umap() and igraph_layout_umap3d() are now interruptible.igraph_distance_johnson() to fail on graphs with negative weights.igraph_eulerian_cycle() and igraph_eulerian_path() now returns a more specific error code (IGRAPH_ENOSOL) when the graph contains no Eulerian cycle or path.igraph_heap_init_array() did not copy the array data correctly for non-real specializations.igraph_layout_umap_3d() now actually uses three dimensions.igraph_layout_umap() and igraph_layout_umap_3d() are now interruptible.igraph_vit_create() and igraph_eit_create() no longer fails when trying to create an iterator for the null graph or edgeless graph from an empty range-based vertex or edge selector.igraph_write_graph_leda() did not correctly print attribute names in some warning messages.Requires.private section instead of the Libs.private one.igraph_bfgs() function.igraph_complex_mod(). Use igraph_complex_abs() instead, as it has identical functionality.IGRAPH_EDRL error code was deprecated; the DrL algorithm now returns IGRAPH_FAILURE when it used to return IGRAPH_EDRL (not likely to happen in practice).igraph_dqueue_e() is now deprecated and replaced by igraph_dqueue_get().igraph_finite(), igraph_is_nan(), igraph_is_inf(), igraph_is_posinf() and igraph_is_neginf() are now deprecated. They were relics from a time when no standard alternatives existed. Use the C99 standard isfinite(), isnan() and isinf() instead.Get["https://raw.githubusercontent.com/szhorvat/IGraphM/master/IGInstaller.m"]
Changed:
IGraphM::invv instead of VertexIndex::inv.Fixed:
IGCommunitiesLeadingEigenvector is less likely to fail to converge now.IGCommunitiesLeadingEigenvector now respects random seeds set in Mathematica. These affect only the random starting vector it uses internally, which can very rarely cause non-deterministic output.IGBarabasiAlbertGame no longer accepts negative or zero exponents, as these were not handled correctly.IGBridges is no longer prone to stack overflow when given very large graphs.Other:
IGGraphEditor.The preferred way of installing the Python interface is via pip; typing pip install igraph should install a pre-compiled Python wheel on most supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the source code are also available from the Python Package Index page.
See the changelog on Github for relevant changes in 0.10.0 and 0.10.1:
]]>The source can be obtained from the GitHub releases page.
This release focuses on infrastructural improvements, stability, and making the igraph interface more consistent, more predictable and easier to use. It contains many API-breaking changes and function renamings, in preparation for a future 1.0 release, at which point the API will become stable. Changes in this direction are likely to continue through a 0.11 release. It is recommended that you migrate your code from 0.9 to 0.10 soon, to make the eventual transition to 1.0 easier.
Read on for more details about the changes in version 0.10.0.
Since the changelog for this release is huge, we are going to list only the most important highlights of this release:
igraph_integer_t consistently for all indices and most integer
quantities, both in the API and internally. This type is 64-bit by default
on all 64-bit systems, bringing support for very large graphs with more than
2 billion vertices. Previously, vertex and edge indices were often
represented as igraph_real_t. The move to an igraph_integer_t also
implies a change from igraph_vector_t to igraph_vector_int_t in many
functions.igraph_integer_t is now possible. Similarly, the
sampling of random reals has been improved to utilize almost the full range
of the mantissa of an igraph_real_t.igraph_vector_list_t), replacing most previous uses of the non-managed
igraph_vector_ptr_t. Functions that previously used igraph_vector_ptr_t
to return results and relied on the user to manage memory appropriately are
now using igraph_vector_list_t, igraph_graph_list_t or similar and
manage memory on their own.igraph_invalidate_cache() function is provided for
debugging purposes. It will invaidate all cache entries.You can find the full changelog on the GitHub release page.
]]>The source can be obtained from the GitHub releases page.
This release includes bug fixes and documentation improvements, and it is likely to be the last patch release of the 0.9.x series. Version 0.10.0 will follow soon with lots of breaking changes as we clean up the API in preparation for a future 1.0 release.
If you have a project that currently relies on igraph 0.9, it is advised that you update the project to use 0.9.10 and then start adapting it as soon as possible to support 0.10.0 once it is released.
Read on for more details about the changes in version 0.9.9.
igraph_reverse_edges() reverses the specified edges in the graph while preserving all attributes.IGRAPH_ARPACK_PROD error code is no longer used. Instead, the specific error encountered while doing matrix multiplication is reported.< or " still work.igraph_local_scan_1_ecount() when the graph was directed but the mode was IGRAPH_ALL and some nodes had loop edges. See issue #2092.igraph_local_scan_neighborhood_ecount() when the graph was undirected.igraph_pagerank() with the ARPACK method and igraph_hub_score() / igraph_authority_score() could return incorrect results. The problem could be detected by checking that the returned eigenvalue is not negative. See issue #2090.igraph_permute_vertices() now checks for out-of-range indices and duplicates in the permutation vector.igraph_create() now checks for non-finite vertex indices in the edges vector.igraph_eigenvector_centrality() would return incorrect scores when some weights were negative.igraph_es_seq() and igraph_ess_seq() did not include the to vertex in the sequence.igraph_eit_create() and igraph_vit_create() now check that all edge/vertex indices are in range when creating iterators from sequence-type selectors.igraph_grg_game() now validates its arguments.igraph_layout_drl() and its 3D version now validate their inputs.igraph_layout_kamada_kawai(), igraph_layout_fruchterman_reingold(), igraph_layout_drl(), as well as their 3D versions now check for non-positive weights.igraph_asymmetric_preference_game() interpreted its type_dist_matrix argument incorrectly.igraph_community_spinglass() for null and singleton graphs.igraph_layout_gem() does not crash any more for graphs with only a single vertex.igraph_bridges() no longer uses recursion and thus is no longer prone to stack overflow.Since this version is a release candidate only, it is meant primarily for developers who are working on a project that depends on the igraph library and who want to be prepared in advance for the upcoming changes in igraph 0.10.0. There is no official tarball on the igraph.org homepage as the latest stable version is still 0.9.9 - you need to get the tarball from the Github releases page instead. Here is a direct link to the tarball – note that you will need to download the asset named igraph-0.10.0-rc.2.tar.gz as the link titled “Source code” is simply a snapshot of the Github repository.
For more details and a short description of breaking changes, please refer to the announcement in our Discourse group.
]]>Since this version is a release candidate only, it is meant primarily for developers who are working on a project that depends on the igraph library and who want to be prepared in advance for the upcoming changes in igraph 0.10.0. There is no official tarball on the igraph.org homepage as the latest stable version is still 0.9.9 - you need to get the tarball from the Github releases page instead. Here is a direct link to the tarball – note that you will need to download the asset named igraph-0.10.0-rc.1.tar.gz as the link titled “Source code” is simply a snapshot of the Github repository.
For more details and a short description of breaking changes, please refer to the announcement in our Discourse group.
]]>As always, you can update to the latest version by evaluating the following:
Get["https://raw.githubusercontent.com/szhorvat/IGraphM/master/IGInstaller.m"]
The earliest supported Mathematica version is now 11.0, or 12.2 on the Raspberry Pi.
Please report any issues you may find on GitHub or on our forum.
This version is based on the 0.9 series of C/igraph.
Added:
IGHarmonicCentrality and IGHarmonicCentralityCutoff compute the harmonic centrality and range-limited harmonic centrality.IGLinkRank and IGPersonalizedLinkRank compute the equivalent of PageRank for edges.IGNeighborhoodCloseness computes the range-limited closeness centrality, as well as the number of vertices reachable within the given range.IGFamousGraph exposes the igraph C library’s built-in graph database.IGPreferenceGame and IGAsymmetricPreferenceGame create non-growing random graphs based on vertex types.IGReingoldTilford and IGReingoldTilfordCircular now support the DirectedEdges option.IGFruchtermanReingold now supports constraining the coordinates of a subset of vertices.IGPercolationCurve for efficiently computing the size of the largest component as a function of mean degree while removing edges.IGShortestPathTree for computing a shortest path tree rooted in a given vertex.IGGraphEditor is an experimental interactive graph editor.IGraphM`Progress` context.Changed:
IGConnectedQ and IGWeaklyConnectedQ now consider the null graph to be disconnected; this is consistent with other functions such as IGTreeQ.IGAveragePathLength now has a "ByComponents" option, controlling the handling of disconnected graphs.IGCloseness now computes the normalized closeness, i.e. the inverse of the mean distance to other vertices, by default. Use Normalized -> False to get the previous behaviour.IGCloseness now uses the distances only to reachable vertices when computing the closeness. In undirected disconnected graphs, it effectively computes the closeness per component. For isolated vertices (or sinks in directed graphs) it now returns Indeterminate.IGBetweenness and IGBetweennessCentralization no longer uses the Method option. The calculations are always fast and precise. The precision has been improved.IGBetweennessEstimate, IGEdgeBetweennessEstimate and IGClosenessEstimate have been renamed to IGBetweennessCutoff, IGEdgeBetweennessCutoff and IGClosenessCutoff.IGRelativeNeighborhoodGraph now assumes the β -> 2, β < 2 limit instead of β = 2.IGGirth now returns Infinity for the null graph.IGDiameter now returns Indeterminate for the null graph.IGChordalQ, IGChordalCompletion and IGMaximumCardinalitySearch now support non-simple graphs.IGReingoldTilford and IGReingoldTilfordCircular use a new automatic root selection algorithm. The root selection heuristic may change in the future without notice. Specify roots manually for a consistent result.IGPotentiallyConnectedQ no longer supports directed sequences. This feature was flawed in 0.5. It may be re-added in a future version.IGLayoutKamadaKawai and IGLayoutKamadaKawai3D perform more iterations by default, and produce more pleasing layouts.IGPersonalizedPageRank allows specifying the reset weights as an association from vertex names to values.Fixed:
IGPageRank and IGPersonalizedPageRank will now warn if the calculation did not converge with the "Arnoldi" method. This happens only in rare cases.IGPersonalizedPageRank: the default "PRPACK" method returned an incorrect result when the graph was not connected and the personalization vector was not uniform.IGVertexMap would evaluate the mapped functions twice instead of once.IGMaximumCardinalitySearch returned incorrect ranks for graphs whose vertex names differed from their vertex indices.IGDistanceWeighted no longer fails on edgeless graphs.IGCallawayTraisGame no longer rejects zeros in the preference matrix.IGMotifsVertexParticipation would fail with Mathematica 12.2 or later.Other:
As always, we tried to do our best not to cause breaking changes for users of igraph from R, but in case we have made unintentional mistakes, please report issues in the Github issue tracker.
The C core is updated to 0.9.9, fixing a range of bugs.
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.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.graph_from_adjacency_matrix() now works with sparse matrices even if the
cell values in the sparse matrix are unspecified.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".vertex.frame.width plotting parameter now allows zero and negative
values; these will simply remove the outline of the corresponding vertex.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."power" algorithm of page_rank() have been removed from
the documentation, as this method is no longer available.The preferred way of installing the Python interface is via pip; typing
pip install igraph should install a pre-compiled Python wheel on most
supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the
source code are also available from the Python Package Index
page.
This is the first release that provides pre-compiled musllinux wheels for
environments running Alpine Linux.
See the changelog on Github for relevant changes in 0.9.11:
]]>The source can be obtained from the GitHub releases page.
This release includes bug fixes and documentation improvements, focusing mainly on community detection and visualization functions. Read on for more details.
igraph_community_walktrap() now uses double precision floating point operations internally instead of single precision.igraph_community_leiden(), the nb_clusters output parameter is now optional (i.e. it can be NULL).igraph_read_graph_graphml() no longer attempts to temporarily set the C locale, and will therefore not work correctly if the current locale uses a decimal comma.igraph_community_walktrap() would return an invalid modularity vector when the merges matrix was not requested.igraph_community_walktrap() would return a modularity vector that was too long for disconnected graphs. This would cause a failure in some weighted graphs when the membership vector was requested.igraph_community_walktrap() now checks the weight vector: only non-negative weights are accepted, and all vertices must have non-zero strength.igraph_community_walktrap() now returns a modularity score of NaN for graphs with no edges.igraph_community_fast_greedy() now returns a modularity score of NaN for graphs with no edges.igraph_community_edge_betweenness() now returns a modularity vector with a single NaN entry for graph with no edges. Previously it returned a zero-length vector.igraph_community_leading_eigenvector() does not ignore non-ARPACK-related errors from igraph_arpack_rssolve() any more.igraph_preference_game() now works correctly when fixed_size is true and type_dist is not given; earlier versions had a bug where more than half of the vertices mistakenly ended up in group 0.igraph_hrg_fit() when using start=1.igraph_write_graph_dot() now outputs NaN values unchanged.igraph_write_graph_dot() no longer produces invalid DOT files when empty string attributes are present.igraph_layout_fruchterman_reingold() and igraph_layout_kamada_kawai(), as well as their 3D versions, did not respect vertex coordinate bounds (xmin, xmax, etc.) when minimum values were large or maximum values were small. This is now fixed.igraph_layout_kamada_kawai() and igraph_layout_kamada_kawai_3d()) are chosen to be more in line with the original publication, improving the stability of the result. See issue #963. This changes the output of the function for the same graph, compared with previous versions. To obtain the same layout, initialize coordinates with igraph_layout_circle() (in 2D) or igraph_layout_sphere() (in 3D).igraph_layout_fruchterman_reingold() and its 3D version. This fixes using the “grid” variant of the algorithm on disconnected graphs.igraph_psumtree_search() would consider search interval opens on the left and closed on the right, contrary to the documentation. This is now corrected to closed on the left and open on the right. In some cases this lead to a zero-weight element being returned for a zero search value. See issue #2080.Due to the underlying changes in the C core of igraph between the 0.8 series and 0.9.7, there are some cases when we needed to make extra efforts in the R interface to keep things compatible with previous releases. For instance, igraph 0.9.7 now interprets zero cutoff in the closeness, betweenness and edge betweenness centrality functions literally, while igraph 0.8 interpreted zero as “no cutoff”. The R interface keeps the old behaviour in such cases but prints a deprecation warning; the old behaviour will be gone in igraph 1.4.0 or 2.0.0, whichever comes first.
A patch release of R/igraph is coming soon in the next few days, which will hopefully (finally) catch up with the 0.9 branch of the C core. We aim to let R/igraph stabilize for a few weeks now while we work on further improvements in the C core.
Even though we tried to do our best not to cause breaking changes for users of igraph from R, we may have made unintentional mistakes, so please keep on reporting issues in the Github issue tracker.
The C core is updated to 0.9.7, fixing a range of bugs and introducing a number of new functions.
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 rootto_prufer() converts a tree graph into its Prufer sequencemake_from_prufer() creates a tree graph from its Prufer sequencesample_tree() to sample labelled trees uniformly at randomsample_spanning_tree() to sample spanning trees of an undirected graph uniformly at randomautomorphisms() and canonical_permutation() now supports vertex colorsrandom_edge_walk() to record the edges traversed during a random walkharmonic_centrality() calculates the harmonic centrality of vertices, optionally with a cutoff on path lengthsmean_distance() now supports edge weights and it can also return the number of unconnected vertex pairs when details=TRUE is passed as an argumentgreedy_vertex_coloring() finds vertex colorings based on a simple greedy algorithm.bridges() finds the bridges (cut-edges) of a graphframe.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 Michał Bojanowski.is_connected() now returns FALSE for the null graphlength() 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 #85bfs() and dfs() callback functions now correctly receive 1-based vertex indices and ranks; it used to be zero-based in earlier versionsbfs() or dfs() callback does not crash R any moreprint() 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 #179as_adjacency_matrix(edges=TRUE, sparse=TRUE) now consistently returns the last edge ID for each cell in the matrix instead of summing them.+ and - operators with a path() object consisting of two vertices is now handled correctly; fixes #355topo_sort() now throws an error if the input graph is not acyclic instead of returning an incorrect partial ordering.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.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.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.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.edges argument of as_adjacency_matrix() is deprecated; it will be removed in igraph 1.4.0.page_rank_old() function and the deprecated power method of page_rank() were removed.The source can be obtained from the GitHub releases page.
This release includes bug fixes and documentation improvements only. Read on for more details.
igraph_bfs() when an empty roots or restricted vector was provided.igraph_diversity() now returns 0 for degree-1 vertices. Previously it incorrectly returned NaN or +-Inf depending on roundoff errors.igraph_community_walktrap() does not crash any more when provided with
modularity=NULL and membership=NULL.The source can be obtained from the GitHub releases page.
This release includes bug fixes, build system tweaks and minor (performance and non-performance-related) improvements. Read on for more details.
igraph_get_all_shortest_paths_dijsktra() now uses tolerances when comparing path
lengths, and is thus robust to numerical roundoff errors.igraph_vector_*_swap and igraph_matrix_swap now take O(1) instead of O(n) and accept all sizes.igraph_vector_init() no longer accepts negative vector sizes.igraph_assortativity_nominal() crashed on the null graph.igraph_rng_get_integer() and RNG_INTEGER() were incorrect,
one larger than they should have been.igraph_community_walktrap() now checks its steps input argument.igraph_community_walktrap() was
incorrect (it was always zero). This is now fixed.igraph_correlated_game() would return incorrect results, or exhaust the memory,
for most input graphs that were not generated with igraph_erdos_renyi_game_gnp().The preferred way of installing the Python interface is via pip; typing
pip install igraph should install a pre-compiled Python wheel on most
supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the
source code are also available from the Python Package Index
page.
ARM64 (Apple Silicon) wheels are now officially supported from this release.
See the changelog on Github for relevant changes in 0.9.9:
]]>The source can be obtained from the GitHub releases page.
This release includes bug fixes, build system tweaks and minor (performance and non-performance-related) improvements. Read on for more details.
igraph_isoclass(), igraph_isoclass_subgraph(),
igraph_isoclass_create) and motif finder functions (igraph_motifs_randesu(),
igraph_motifs_randesu_estimate(), igraph_motifs_randesu_callback()) now
support undirected (sub)graphs of sizes 5 and 6. Previsouly only sizes 3 and 4
were supported.abort() from vendored libraries, which could unexpectedly
shut down the host language of igraph’s high-level interfaces.igraph_community_label_propagation() no longer leaves any vertices unlabeled
when they were not reachable from any labeled ones, i.e. the returned membership
vector is guaranteed not to contain negative values (#1853).igraph_cmp_epsilon() that resulted in incorrect results for
edge betweenness calculations in certain rare cases with x87 floating point
math when LTO was also enabled (#1894).igraph_erdos_renyi_game_(gnm|gnp) would not produce self-loops for the singleton
graph.igraph_local_efficiency() that sometimes erroneously
reported zero as the local efficiency of a vertex in directed graphs.igraph_vector_update() (and its type-specific variants) did not check for
memory allocation failure.igraph_is_tree() has improved performance and memory usage.igraph_is_connected() has improved performance when checking weak connectedness.igraph_maximal_cliques() and related functions.plfit package was updated to 0.9.3.plfit instead of the vendored one.The source can be obtained from the GitHub releases page.
This release includes bug fixes and performance improvements only.
igraph_reindex_membership() does not allow negative membership indices any more.
igraph_rewire_directed_edges() now generates multigraphs when edge
directions are ignored, to make it consistent with the directed case.
Fixed a bug in igraph_gomory_hu_tree() that returned only the equivalent
flow tree instead of the cut tree.
Fixed a bug in the IGRAPH_TO_UNDIRECTED_COLLAPSE mode of
igraph_to_undirected() that provided an incorrect merge vector to the
attribute handler, leading to problems when edge attributes were merged
using an attribute combination.
Fixed the behaviour of the IGRAPH_ENABLE_LTO option when it was set to
AUTO; earlier versions had a bug where AUTO simply checked whether LTO
is supported but then did not use LTO even if it was supported.
When using igraph from a CMake project, it is now checked that the project has the C++ language enabled. This is necessary for linking to igraph with CMake.
Improved the root selection method for disconnected graphs in the Reingold-Tilford layout (#1836). The new root selection method provides nicer results if the graph is not a tree, although it is still recommended to use the Sugiyama layout instead, unless the input graph is almost a tree, in which case Reingold-Tilfold may still be preferred.
igraph_decompose() is now much faster for large graphs containing many
isolates or small components.
igraph_largest_cliques() and igraph_clique_number() were re-written to
use igraph_maximal_cliques_callback() so they are much faster now.
The vendored GLPK has been upgraded to GLPK 5.0.
Documentation improvements.
The only significant change in this release is that the Python interface of igraph has been renamed
from python-igraph to igraph on PyPI. We are very grateful to
Patrick Fuller, the previous owner of the
igraph package on PyPI for giving up the ownership of igraph and letting us
use the name instead.
The preferred way of installing the Python interface is still via pip; typing
pip install igraph should install a pre-compiled Python wheel on most
supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the
source code are also available from the Python Package Index
page.
python-igraph will keep on working on PyPI until September 1, 2022, but it is
now only a stub package that depends on igraph. Running pip install
python-igraph will in turn install the matching version of the
igraph package from PyPI.
Projects listing python-igraph in their dependencies should migrate to
using igraph as soon as possible to keep on receiving updates after
September 1, 2022.
Maintainers who provide pre-packaged versions of python-igraph in Linux
distributions should switch to following the
igraph package on PyPI instead of
python-igraph.
The preferred way of installing the Python interface is via pip; typing
pip install python-igraph should install a pre-compiled Python wheel on most
supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the
source code are also available from the Python Package Index
page.
See the changelog on Github for relevant changes in 0.9.7:
This release also adds support for Python 3.10 and provides experimental native Python wheels for ARM64 and Apple Silicon CPUs. Note that the Apple Silicon wheels are not tested in a CI environment yet; this will hopefully change in the near future when Github Actions starts supporting Apple Silicon. Until then, feel free to report any issues that you find with Apple Silicon wheels (or any other wheel) in the issue tracker on Github.
]]>This release is only the beginning; in the next few months we aim to process most of the issues on the Github issue tracker, close the ones that are not relevant any more, fix the ones that should be fixed, and then proceed with updating the R interface to version 0.9.4 of the C core, which is the most recent C core version at the time of writing.
Added:
cluster_leiden() added as an interface to the Leiden community detection
algorithm in the C core of igraph
(#399.cluster_fluid_communities() added as an interface to the fluid communities
algorithm of the C core of igraph
(#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).types argument of functions related to bipartite graphs now prints
a warning when the types are coerced to booleans
(#476).layout_with_sugiyama() returns a layout of type matrix even if there is
only one vertex in the graph (#408).Deprecated:
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:
To change version, click on the new button on the top left of the page on the relevant pages:
]]>Last year, the core library of igraph was enormously improved, making the library easier to build, easier to maintain and easier to use. However, most users are not using the C core directly, but are using it through one of the interfaces: Python, R or Mathematica. The CZI grant will support the igraph development team on improving these interfaces, by making them more intuitive to use and by integrating them more closely in the host language. Additionally, development efforts will be aimed at making the library and the interfaces easier to maintain, focusing on long-term sustainability. This ensures that igraph continues to be a useful tool for network scientists from various disciplines across the globe.
Having people committed to maintain and further develop igraph is critical to ensure its long-term viability. We made steps towards building a more inclusive and engaged community by opening a forum dedicated to igraph. We aim to enlarge and diversify the team of contributors and maintainers of the project. Making it easier to start using igraph and contributing to igraph is an important step. Improving documentation and tutorials helps achieve that goal, but we will also actively organize workshops for users and contributors, with a specific focus on women and non-binary people, and engage more actively on the community forum. Additionally, a mentorship programme will be setup specifically to facilitate women and non-binary people to use and contribute to igraph, paving the way for them to become maintainers of igraph. The CZI grant will enable us to engage more people in achieving these objectives.
]]>The preferred way of installing the Python interface is via pip; typing
pip install python-igraph should install a pre-compiled Python wheel on most
supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the
source code are also available from the Python Package Index
page.
This release provides a fix for a single plotting issue with the Matplotlib backend that was accidentally introduced in 0.9.5. See the changelog on Github for more details:
This release also provides experimental native Python wheels for Apple Silicon CPUs. Note that the Apple Silicon wheels are not tested in a CI environment yet; this will hopefully change in the near future when Github Actions starts supporting Apple Silicon. Until then, feel free to report any issues that you find with Apple Silicon wheels (or any other wheel) in the issue tracker on Github.
]]>The preferred way of installing the Python interface is via pip; typing
pip install python-igraph should install a pre-compiled Python wheel on most
supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the
source code are also available from the Python Package Index
page.
See the changelogs on Github for relevant changes in 0.9.5:
This release also provides experimental native Python wheels for Apple Silicon CPUs. Note that the Apple Silicon wheels are not tested in a CI environment yet; this will hopefully change in the near future when Github Actions starts supporting Apple Silicon. Until then, feel free to report any issues that you find with Apple Silicon wheels (or any other wheel) in the issue tracker on Github.
]]>The source can be obtained from the GitHub releases page.
This release includes bug fixes only.
igraph_transitivity_barrat() now returns an error code if the input graph has multiple edges (which is not handled correctly by the implementation yet).igraph_local_scan_k_ecount() now handles loops correctly.igraph_transitivity_avglocal_undirected() is no longer slower than igraph_transitivity_local_undirected().The preferred way of installing the Python interface is via pip; typing
pip install python-igraph should install a pre-compiled Python wheel on most
supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the
source code are also available from the Python Package Index
page.
This release brings python-igraph up-to-date with igraph 0.9.4. See the changelogs on Github for relevant changes in 0.9.4:
This release is also the first one that provides experimental native Python wheels for Apple Silicon CPUs. Note that the Apple Silicon wheels are not tested in a CI environment yet; this will hopefully change in the near future when Github Actions starts supporting Apple Silicon. Until then, feel free to report any issues that you find with Apple Silicon wheels (or any other wheel) in the issue tracker on Github.
]]>The source can be obtained from the GitHub releases page.
This release includes bug fixes only.
IGRAPH_OPENMP_SUPPORT=OFF at configuration time to disable this.igraph_get_incidence() no longer reads and writes out of bounds when given a non-bipartite graph, but gives a warning and ignores edges within a part.igraph_dyad_census() no longer reports an overflow on singleton graphs, and handles loops and multigraphs correctly. Undirected graphs are handled consistently and will no longer give a warning.igraph_vector_lex_cmp() and igraph_vector_colex_cmp() dereferenced their arguments only once instead of twice, and therefore did not work with igraph_vector_ptr_sort().igraph_maximal_cliques_subset() and igraph_transitivity_barrat() corrupted the error handling stack (“finally stack”) under some circumstances.CMAKE_INSTALL_LIBDIR. This only affected Linux distributions which install into lib64 or other locations instead of lib.libm) when this is not necessary._CRT_SECURE_NO_WARNINGS is now defined during compilation to enable compatibility with UWP.MSYS Makefiles CMake generator was used. Some source files in igraph were renamed as a consequence, but these should not affect users of the library.igraph_rng_min() is now deprecated; assume a constant zero as its return value if you used this function in your own code.The source can be obtained from the GitHub releases page.
This release includes bug fixes only. We have also added support for CMake package files, making it easier to use igraph in CMake-based projects.
find_package(igraph) to find igraph and detect the appropriate compilation options for projects that link to it.CMAKE_INSTALL_<dir> variables were absolute paths.libigraph.so.0.0.0, as it used to be for igraph 0.8 and earlier.igraph_get_shortest_paths_dijkstra() and igraph_get_shortest_paths_bellman_ford() that returned incorrect results for unreachable vertices.The preferred way of installing the Python interface is via pip; typing
pip install python-igraph should install a pre-compiled Python wheel on most
supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the
source code are also available from the Python Package Index
page.
This release brings python-igraph up-to-date with igraph 0.9.1. See the
changelogs on Github for relevant changes in 0.9.0 and 0.9.1:
The source can be obtained from the GitHub releases page.
This release includes bug fixes only, apart from a minor addition concerning lexicographic ordering of vectors, which was not substantial enough for a minor version bump. The changelog is below.
igraph_vector_lex_cmp() and igraph_vector_colex_cmp() for lexicographic
and colexicographic comparison of vectors. These functions may also be used
for sorting.igraph_community_multilevel() is now randomized (thanks to Daniel Noom).CMAKE_INSTALL_LIBDIR, were not respected.igraph_subcomponent(), igraph_stack_ptr_free_all(), igraph_stack_ptr_destroy_all(), igraph_status_handler_stderr(), igraph_progress_handler_stderr().igraph_rngtype_mt19937, igraph_rngtype_rand, igraph_rngtype_glibc2) were not exported from the shared library.igraph_layout_graphopt() no longer rounds the spring_length parameter to an integer.igraph_get_all_shortest_paths_dijkstra() no longer modifies the res vector’s item destructor.igraph_get_shortest_path_bellman_ford() did not work correctly when calculating paths to all vertices.igraph_arpack_rnsolve() checks its parameters more carefully.igraph_community_to_membership() does not crash anymore when csize is requested but membership is not.igraph_citing_cited_type_game(): fixed memory leaks (thanks to Daniel Noom.igraph_transitivity_undirected(), igraph_transitivity_avglocal_undirected() and igraph_transitivity_barrat() no longer trigger an assertion failure when used with the null graph.igraph_(personalized_)pagerank() would return incorrect results for weighted multigraphs with fewer than 128 vertices when using IGRAPH_PAGERANK_ALGO_PRPACK.igraph_diversity() now checks its input more carefully, and throws an error when the input graph has multi-edges or is directed.igraph_shortest_paths_johnson() would return incorrect results when the to argument differed from from (thanks to Daniel Noom).igraph_is_graphical() would fail to set the result variable for certain special degree sequences in the undirected simple graph case.PATH was sometimes not set correctly, causing the tests to fail.bison and flex.arith.h header for f2c when cross-compiling; see the Installation section of the documentation.IGRAPH_ENABLE_LTO build option now supports the AUTO value, which uses LTO only if the compiler supports it. Warning: CMake may not always be able to detect that LTO is not fully supported. Therefore, the default setting is OFF.igraph_grg_game(), igraph_sbm_game(), igraph_barabasi_game(), igraph_barabasi_aging_game().igraph_feedback_arc_set() and igraph_community_optimal_modularity() are now interruptible.-Wno-varargs flag.autotools-based build
system to a new one based on CMake. This results in faster
build times and the opportunity to use alternative build tools instead of
make; in particular, igraph now support ninja and
can also make use of a locally installed ccache
compiler cache for even faster builds.
We gratefully acknowledge support from CZI for the development of igraph. In addition, we would like to thank everyone who reported issues, contributed features or fixes, or edited the documentation. igraph is an open-source project run by volunteers. As always, your contributions are very welcome!
Most people use igraph through its high-level interfaces for R, Python or Mathematica. A new release of the Python interface, based on 0.9.0, is expected to be released in a few days. The R and Mathematica interfaces already include some of the improvements, and will continue to integrate more.
The sources and the changelog can be obtained from the GitHub releases page.
]]>The sources can be obtained from the GitHub releases page.
This release includes bug fixes only. The changelog is below.
igraph_write_graph_pajek(): the function now always uses the platform-native line endings (CRLF on Windows, LF on Unix and macOS). Earlier versions tried to enforce Windows line endings, but this was error-prone, and since all recent versions of Pajek support both line endings, enforcing Windows line endings is not necessary any more.igraph_layout_davidson_harel() was not interruptible; now it is.igraph_i_cattribute_combine_vertices().The sources can be obtained from the GitHub releases page.
This release includes bug fixes and documentation improvements. The changelog is below.
igraph_i_cattribute_combine_vertices(): fixed invalid cleanup code that eventually filled up the “finally” stack when combining vertices with attributes extensively.igraph_hrg_sample(): fixed incorrect function prototypeigraph_is_posinf() and igraph_is_neginf(): fixed incorrect result on platforms where the sign of the result of isinf() is not indicative of the sign of the input.The preferred way of installing the Python interface is via pip; typing
pip install python-igraph should install a pre-compiled Python wheel on most
supported platforms (Windows, Linux and macOS). The pre-compiled wheels and the
source code are also available from the Python Package Index
page.
This release brings python-igraph up-to-date with igraph 0.8.3, and it also
contains bug fixes and performance improvements. This release will also be the
last one whose version number is deliberately in sync with the version number
of the C core. The changelog is below.
Graph.community_leiden() now supports a negative number of iterations; it will keep on iterating until the algorithm reaches a stable partition.
Graph.Incidence() now supports weighted graphs, thanks to @PuneethaPai
You can now create a Graph object from a pandas dataframe with Graph.DataFrame, thanks to @iosonofabio
Added conversion to/from networkx and graph-tool with Graph.{to,from}_{networkx,graph_tool}, thanks to @iosonofabio
Graph.add_edges() and Graph.add_vertices() now supports specifying attributes for the newly added vertices and edges, thanks to @iosonofabio
Added Graph.dfs() and Graph.dfsiter(), thanks to @iosonofabio
Added Graph.bridges() to get the bridges of a graph.
Added Graph.clear() to remove all edges, vertices and graph attributes in a single call, thanks to @iosonofabio
Upgraded igraph C library to 0.8.3.
Graph union and intersection now supports graphs with vertex names, thanks to @iosonofabio
Graph.delete_vertices(None) and Graph.delete_edges(None) are now deprecated; use Graph.delete_vertices() and Graph.delete_edges() (without a positional argument) instead to delete all vertices or edges. The old syntax will be removed in 0.9.
setup.py now works on Windows with MinGW, thanks to @Parakoopa
Graph.difference() now treats loop edges correctly
summary() does not fail with non-string vertex names any more, thanks to @deeenes
The Reingold-Tilford layout should not produce edge crossings on tree graphs any more.
The postprocessing step of Graph.biconnected_components() is much faster now (#281); the earlier version was responsible for a significant speed difference between the C core and the Python interface.
Various documentation improvements, thanks to @chrisfalter, @iosonofabio, @kmankinen, @remysucre, @szhorvat
Graph.complementer() now allows keyword arguments (it used to support positional arguments only).
Dropped support for Python 3.5, added support for Python 3.9.
The sources can be obtained from the GitHub releases page.
This release includes bug fixes and performance improvements. The changelog is below.
igraph_vector_binsearch_slice() performs binary search on a sorted slice of a vector.igraph_eigenvector_centrality() assumes the adjacency matrix of undirected graphs to have twice the number of self-loops for each vertex on the diagonal. This makes the results consistent between an undirected graph and its directed equivalent when each edge is replaced by a mutual edge pair.igraph_isomorphic() now verifies that the input graphs have no multi-edges.igraph_difference() was creating superfluous self loops.igraph_count_multiple() was giving incorrect results for self-loops in directed graph.igraph_betweenness_estimate(): fixed incorrect results with finite cutoff.igraph_eigen_matrix_symmetric(): fixed incorrect matrix multiplication.igraph_realize_degree_sequence() did not correctly detect some non-graphical inputs.igraph_is_graphical_degree_sequence(): fixed incorrect results in undirected case.igraph_community_leiden(): fixed incorrect result when self-loops are present.igraph_eigenvector_centrality(): fixed incorrect value for isolated vertices in weighted graphs.igraph_eigenvector_centrality(): corrected the handling of self-loops.igraph_layout_reingold_tilford(): fixed an issue where branches of the tree would sometimes overlap.igraph_degree_sequence_game(): improved performance with IGRAPH_DEGSEQ_SIMPLE_NO_MULTIPLE_UNIFORM method.For years, the development of igraph was done on a voluntary basis. With funding available, we can make sure developers have more time available to dedicate to igraph. In particular, the funding will support Gábor Csárdi, Tamás Nepusz, Szabolcs Horvát, Vincent Traag and Fabio Zanini.
The core of igraph is written in C, but most people use igraph through its high-level interfaces for R, Python or Mathematica. Much of the development effort will be concentrated on the core of igraph, but the high-level interfaces will not be overlooked.
Even though we will dedicate more time to igraph, the project cannot survive without a vibrant community of users and contributors. Whether you reported issues, contributed code or improved the documentation, your contributions remain vital to the project. We hope that our new community forum will enable us to form a tighter and more supportive community, where you can ask questions, support others, or discuss recent advances in network analysis or graph theory.
The project will start from the 1st of September onwards, and will last for a year. The 1.0 version is planned to be released towards the end of the project.
]]>The sources can be obtained from the GitHub releases page.
This release includes no new features, only bug fixes and reliability improvements. The changelog is below.
igraph_all_st_mincuts() and igraph_sir()igraph_sir()igraph_community_leiden(): fixed crash when interruptingigraph_sir().The sources can be obtained from the GitHub releases page.
This release includes no new features, only bug fixes and reliability improvements. The changelog is below.
igraph_degree_sequence_game()igraph_forest_fire_game()igraph_community_edge_betweenness(): fix for graphs with no edges (PR #1312)igraph_bridges() now handles multigraphs correctly (PR #1335)igraph_avg_nearest_neighbor_degree(): fix for memory leak in weighted case (PR #1339)igraph_community_leiden(): fix crash bug (PR #1357)ACKOWLEDGEMENTS.mdpython-igraph is installed; the
tarball of python-igraph already bundles the appropriate version of the
C core in it.
Including the C core directly in the source tarball also allows us to decouple python-igraph’s version number from the version number of the C core in the future. This means that we no longer have to wait for a release of the C core in order to fix some bugs in the Python interface.
Starting from this release, we will also aim to provide pre-compiled Python
wheels for most platforms. The current release includes Python wheels for
Python 2.7, 3.5, 3.6, 3.7 and 3.8 on Windows, macOS and Linux, so most users will
not have to compile anything when installing python-igraph from pip.
Currently the only limitation is that the Windows wheels do not support GraphML
import; this will be fixed in the next patch release (0.8.1).
python-igraph 0.8.x will also be the last version that supports Python 2.7.
Since Python 2 has reached its end of life,
we will drop support for Python 2 before python-igraph 0.9 so we can simplify
some parts of the codebase where we needed to introduce additional code to
support both Python versions.
As for Python 3, we are committing ourselves to supporting at least the last three minor releases of Python 3.
Although we are not supporting PyPy officially, python-igraph will also be
tested with PyPy regularly in a CI environment, and we will strive to fix any
issues that arise with PyPy. If you use python-igraph with PyPy and you are
willing to become an official maintainer responsible for PyPy compatibility,
please let us know in the community forum.
Concurrently with the release of igraph 0.8, we have launched a new community
forum, which replaces the mailing list as
the main support channel. The community forum is also meant for users of
python-igraph, so If you are a current python-igraph user or just
interested in the project, please join!
We would like to thank everyone who reported issues, contributed features or fixes, or edited the documentation. igraph is an open-source project run by volunteers. As always, your contributions are very welcome!
]]>We would like to thank everyone who reported issues, contributed features or fixes, or edited the documentation. igraph is an open-source project run by volunteers. As always, your contributions are very welcome!
Most people use igraph through its high-level interfaces for R, Python or Mathematica. A new release of the Python interface, incorporating all these improvements, is expected to be released in a few weeks. The R and Mathematica interfaces already include some of the improvements, and will continue to integrate more.
Concurrently with the release of igraph 0.8, we are launching a new community forum, which will replace the mailing list as the main support channel. If you are a current igraph user or just interested in the project, please join!
]]>New releases of IGraph/M will be published on the GitHub page of the project.
]]>This is a new major release, with a lot of UI changes. We tried to make it easier to use, with short and easy to remember, consistent function names. Unfortunately this also means that many functions have new names now, but don’t worry, all the old names still work.
Apart from the new names, the biggest change in this release is
that most functions that used to return numeric vertex or edge ids,
return vertex/edge sequences now. This requires some time to get used
to and if you want the numeric ids instead, just use the as.vector()
function on the vertex/edge sequences.
We will update the documentation on this site, once the package is on CRAN and available for all architectures.
Other major changes:
make_graph() function to create graphs.layout_() (not the underscore!) function
to create graph layouts, see also add_layout_().upgrade_graph() on graphs created with previous igraph
versions.[[ operator now,
for easy viewing of vertex/edge metadata.as_ids() function to convert them to simple ids.layout_with_dh().layout_with_gem().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.local_scan() function calculates scan statistics.embed_adjacency_matrix() and embed_laplacian_matrix().*, the same graph multiple times. Can be also
used as rep().random_walk()adjacenct_vertices() and incident_edges() functions,
they are vectorized, as opposed to neighhors() and incident().as_long_data_frame().Main igraph repositories now:
Some bug fixes, to make sure that the code included in ‘Statistical Analysis of Network Data with R’ works. See http://github.com/kolaczyk/sand
Detailed changes:
igraph_constaint(), issue #580.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:
l,
not x, which is for complex attributes. Issue #578.communities objects, see create.communities().
Issue #547.constaint(), issue #580.simplify argument of graph.formula(), which was
broken, issue #586.crossing() adds better names to the result,
fixes issue #587.sir() function gives an error if the input graph is
not simple, fixes issue #582.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’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.
The igraph library’s homepage is now hosted at http://igraph.org/c, and it is brand new. We wanted to make it easier to use and better to look at.
You can download nightly builds from igraph at http://igraph.org/nightly.
igraph_adjlist_print(), igraph_adjlist_fprint(),
igraph_inclist_print(), igraph_inclist_fprinf() functions.igraph_modularity_matrix().igraph_layout_bipartite() function, a simple two-column layout
for bipartite graphs.igraph_barabasi_game(), algorithm psumtree-multiple
just froze.igraph_union() and igraph_union_many() to return mappings
for the edges.igraph_intersection(), it can now report edge mappings.igraph_rewire(): now supports the generation and destruction of
loops.igraph_get_shortest_paths[_dijkstra]().igraph_rewire() now shows the fraction of successful swaps in the
progress message.igraph_graphlets() and related functions.igraph_edge_connectivity(), because of an
un-initialized variable.igraph_atlas().igraph_closeness() and related functions.igraph_read_graph_gml() to crash when the ID
attribute was non-numeric.igraph_vector_t() and igraph_matrix_t().igraph_adjacenct_triangles().igraph_eigen_adjacency() function, eigenproblems on
adjacency matrices.igraph_gomory_hu_tree().igraph_community_optimal_modularity(),
closes #511.igraph_maximal_cliques_count().igraph_adjlist_t uses integer vectors now.igraph_sbm_game().normalized argument to closeness functions, fixes issue #3.start argument in igraph_hrg_fit (#225).igraph_density that resulted in incorrect values for
undirected graphs with loops.igraph_st_mincut and related functions.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’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.
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.
You can download nightly builds from igraph at http://igraph.org/nightly. Source and binary R packages (for windows and OSX), C library bundles, and Python source packages are built currently. We are planning to add binary Python packages soon.
Graph.layout_bipartite() function, a simple two-column layout
for bipartite graphs.Barabasi(), algorithm psumtree-multiple
just froze.Graph.st_mincut() method, to find a minimal s-t cut in a graph.Graph.mincut().Graph.rewire(): now supports the generation and destruction of loops.Graph.Random_Bipartite().Graph.__plot__().igraph_edge_connectivity(), because of an
un-initialized variable in the C code.Graph.closeness() and related functions.RunningMean.__length__().Graph.gomory_hu_tree().Vertex.constraint(),
closes #259.Graph.community_optimal_modularity(),
closes #511.Graph.isomorphic_vf2(), edge colors were ignored.Graph.SBM().start argument in igraph_hrg_fit (#225).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’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.
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.
You can download nightly builds from igraph at http://igraph.org/nightly. Source and binary R packages (for windows and OSX), are all built.
demo(hrg).mod.matrix().layout.bipartite() function, a simple two-column layout
for bipartite graphs.barabasi.game(), algorithm psumtree-multiple
just froze.layout.mds() by default returns a layout matrix now.plot.communities() (plot.igraph(), really) draws a border
around the marked groups by default.name graph attribute to charactervertex.attriubutes(), graph.attributes() and edge.attributes().graph.disjoint.union() handles attributes now.graph.union() to handle attributes properly.rewire(): now supports the generation and destruction of loops.bipartite.random.game().get_shortest_paths(), reorganized the output of
get.shortest.paths() completely.graphlets() and related functions.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().igraph_edge_connectivity(), because of an
un-initialized variable in the C code.closeness() and related functions.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.graph.bfs() and graph.dfs().is.chordal().centralization.closeness.tmax().arpack() now gives error message if unknown options are
given.igraphtest() function.add.edges() does not allow now zeros in the vertex set.adjacenct.triangles().graph.eigen() function, eigenproblems on adjacency matrices.decompose.graph() and graph.neighborhood() use it.
Fixes issue #508.optimal.community(), closes #511.graph.intersection.by.name(),
graph.union.by.name(), graph.difference.by.name().+ operator on graphs now calls graph.union() if both
argument graphs are named, and calls graph.disjoint.union()
otherwise.igraph.version().sbm.game().set.vertex/edge.attribute bug that changed both
graph objects, after copying (#533)barabasi.game that caused crashes.'which argument to bipartite.projection (#307).normalized argument to closeness functions, fixes issue #3.[[ on vertex/edge sets,
fixes #231.start argument in hrg.fit (#225).graph.density that resulted in incorrect values for
undirected graphs with loopsgraph.decompose), causing #550.graph.adjacency bugs for graphs with one edge,
and graphs with zero edges.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).sir function.graph.mincut and related functions.graph.bfs (#575).igraph 0.6.5 is a minor release that contains only few big changes, and fixes a number of very annoying bugs.
See at the end for the complete list of changes. First let’s see the most important new features and changes.
See more here:
igraph_read_graph_pajek.
We added some new functions if a sequence of integers is graphial, i.e. it can be the degree sequence of a simple graph. See more in the manual.
It is possible now to generate regular random graphs, faster than the general degree sequence based generator. See more in the reference manual.
This release includes the plfit library to maximum likelihood fit power laws to discrete or contiouous data. See more in the reference manual.
igraph_layout_mds() uses LAPACK instead of ARPACK.igraph_degree_sequence_game has a new method:
IGRAPH_DEGSEQ_SIMPLE_NO_MULTIPLE.igraph_is_degree_sequence() and
igraph_is_graphical_degree_sequence() functions.igraph_rewire() has a new method: IGRAPH_REWIRING_SIMPLE_LOOPS,
that can create loops.igraph_k_regular_game().Added igraph_power_law_fit.
igraph_barabasi_game when outseq was an empty vector.igraph_vector_ptr_pop_back.igraph_all_minimal_st_separators() bug, some vertex sets
were incorrectly reported as separators. Bug #1033045.igraph_shortest_paths_dijkstra(), thanks to Martin J Reed.NCV setting for ARPACK functions. It cannot be
bigger than the matrix size.igraph_layout_merge_dla uses better default parameter values now.igraph_layout_mds() that resulted vertices on top of
each other.IGRAPH_NAN for isomorphism classes
that are not motifs (i.e. not connected). Fixes bug #1050859.degree_sequence_game(), in_seq can be an empty vector as
well instead of NULL, for an undirected graph.igraph_eccentricity() (and also igraph_radius()),
the results were often simply wrong.igraph_get_all_shortest_paths_dijkstra() when edges
had zero weight.mode != ALL.igraph_has_multiple() that resulted in false negatives
for some undirected graphs.igraph 0.6.5 is a minor release that contains only few big changes, and fixes a number of very annoying bugs.
See at the end for the complete list of changes. First let’s see the most important new features and changes.
The Graph.TupleList()
static method in Python now allows easy conversion of lists of tuples (such as
database records or contents of CSV files) into graphs with named vertices and
edge attributes.
See more in the documentation.
We added some new functions if a sequence of integers is graphial, i.e. it can be the degree sequence of a simple graph. See more in the documentation.
It is possible now to generate regular random graphs, faster than the general degree sequence based generator. See more in the documentation.
This release includes the plfit library to maximum likelihood fit power laws to discrete or contiouous data. See more in the documentation.
Graph.Degree_Sequence() has a new method now: no_multiple.is_degree_sequence() and is_graphical_degree_sequence()
functions.rewire() has a new mode: loops, that can create loop edges.Graph.K_Regular().power_law_fit() now uses a C implementation.frame_width attribute or the vertex_frame_width keyword argument
in plot()Graph.write_svg(),
thanks to drlogGraph.delete_vertices()igraph.remote.gephi and igraph.drawing.graph.GephiGraphStreamingDrawer__repr__ output for Flow and Cut instancesGraph.TupleList, a function that allows one to create graphs with
edge attributes quickly from a list of tuples.plot() now also supports .eps as an extension, not only .ps
Graph.shortest_paths() (Dijkstra’s algorithm.) Thanks to
Martin J Reed.NCV setting for ARPACK functions. It cannot be
bigger than the matrix size.Graph.layout_mds() that resulted vertices on top of each
other.Graph.eccentricity() and Graph.radius(),
the results were often simply wrong.Graph.get.all.shortest.paths() when some edges
had zero weight.mode != ALL.Graph.layout_sugiyama() when the graph had no edges.Graph.community_label_propagation() when initial labels
contained -1 entries. Issue #1105460.DescartesCoordinateSystem class (which is not used
too frequently anyway)Graph was used in a
thread forked from the main Python interpreter threadhas_multiple() that resulted in false negatives
for some undirected graphs.igraph 0.6.5 is a minor release that contains only few big changes, and fixes a number of very annoying bugs.
See at the end for the complete list of changes. First let’s see the most important new features and changes.
It is now possible to create user-defined vertex shapes for drawing
graphs in R. See
vertex.shapes() in the R manual.
Function get.data.frame()
does the opposite of
graph.data.frame(), it converts a graph to one or two data frames
that contain vertex and/or edge data.
See more in the manual.
We added some new functions if a sequence of integers is graphial, i.e. it can be the degree sequence of a simple graph. See more in the manual.
It is possible now to generate regular random graphs, faster than the general degree sequence based generator. See more in the manual.
This release includes the plfit library to maximum likelihood fit power laws to discrete or contiouous data. See more in the manual.
Many basic graph operations (eg. printing the summary to the screen, querying attribute values) now avoid copying the graph, so these operations are now much faster in R.
get.data.frame() function, opposite of graph.data.frame().degree.sequence.game() has a new method now: simple_no_multiple.is.degree.sequence() and is.graphical.degree.sequence()
functions.rewire() has a new method: loops, that can create loop edges.layout.mds() returns a layout matrix now.layout.mds() uses LAPACK instead of ARPACK.~ character in write.graph and read.graph. Bug
#1066986.k.regular.game().power.law.fit() can now use a C implementation.
barabasi.game() when out.seq was an empty vector.graph.adjacency(). Bug #1019624.minimal.st.separators() bug, some vertex sets were incorrectly
reported as separators. Bug #1033045.\#1032819.shortest.paths() (Dijkstra’s algorithm.) Thanks to
Martin J Reed.V(graph) as vids if it is NULL.pie vertices were drawn together with other
vertex shapes.layout.merge()s DLA mode has better defaults now.layout.mds() that resulted vertices on top of each
other.layout.spring(), it was not working properly.layout.svd(), which was completely defunct.layout.graphopt() that caused warnings and on
some platforms crashes.community.to.membership(). Bug #1022850.graph.incidence() crash if it was called with a non-matrix
argument.get.shortest.paths() bug, when output was set to both.NA for isomorphism classes that are
not motifs (i.e. not connected). Fixes bug #1050859.get.adjacency() when attr is given, and the attribute has some
complex type. Bug #1025799.graph.adjacency() for dense matrices. Bug
#1066952.alpha.centrality().diag=FALSE. Closes
issue #1077425.eccentricity() and radius(), the results were often
simply wrong.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.NAs in vertex names. Fixes issue #1087215mode != ALL.has.multiple() that resulted in false negatives for
some undirected graphs.igraph 0.6 is a major new release of igraph. It contains many new features and major changes, a lot of bug fixes and improvements. As always, we are grateful to the people who sent comments, bug reports, questions, and specially to people who contributed code.
See below a list of major changes, with links to the relevant sections of the documentation. New features in R, Python, and C are all listed here.
See at the end for a (more) complete list of changes.
Community structure detection via exact modularity optimization. As
modularity optimization in an NP-complete problem, this works only for
small graphs. See
igraph_community_optimal_modularity.
The multi-level modularity optimization algorithm by Blondel et
al. was added. See
igraph_community_multilevel.
Hierarchical random graphs and community finding, based on the code from Aaron Clauset. See In the manual for details.
We support now the InfoMAP community finding method, thanks to
Emmanuel Navarro for the code. See
igraph_community_infomap.
The edge betweenness community detection method of Newman and Girvan now also works on weighted graphs. See the Reference manual.
We have added some functions to compare various community structures.
See
igraph_compare_communities.
Igraph now implements the Spectral Coarse Graining method, by David Morton, our implementation is based on his code. See the manual.
The cohesive block finding functions were rewritten from scratch in
C. They are much faster now, and they have a nicer API, too. See
igraph_cohesive_blocks.
Centralization scores for degree, closeness, betweenness and eigenvector centrality. See the manual.
Personalized PageRank scores. See the manual.
Authority and hub scores, betweenness and closeness calculations all support edge weights now. See the manual.
Igraph now implements the Sugiyama layout algorithm for layered
directed acyclic graphs. See
igraph_layout_sugiyama.
Igraph now implements the push-relabel algorithm and the Kuhn-Munkres algorithm (also known as the Hungarian method) to find maximum matchings in unweighted and weighted bipartite graphs. See the manual.
igraph_maximum_cardinality_search() and
chordality test: igraph_is_chordal().igraph_read_graph_dl(). See
http://www.analytictech.com/networks/dataentry.htm.igraph_bfs(), igraph_dfs()).igraph_centralization().igraph_sparsemat_t, a type that implements sparse
matrices based on the CXSparse library by Tim Davis.
See http://www.cise.ufl.edu/research/sparse/CXSparse/.igraph_personalized_pagerank() and
igraph_personalized_pagerank_vs().igraph_assortativity(),
igraph_assortativity_nominal(), and igraph_assortativity_degree().igraph_community_multilevel().igraph_version() function.igraph_layout_star().igraph_subgraph_edges().igraph_compare_communities().igraph_community_optimal_community().igraph_maxflow(), igraph_mincut(),
igraph_all_st_cuts(), igraph_all_st_mincuts().igraph_layout_mds().igraph_get_all_shortest_paths_dijkstra, for calculating all
non-negatively weighted shortest paths.igraph_is_dag().igraph_cohesive_blocks().igraph_status()
and related functions.igraph_write_graph_leda().igraph_contract_vertices().igraph_hrg_game(), igraph_hrg_fit(), etc.igraph_has_multiple() to decide whether a graph has multiple edges.igraph_layout_grid() and igraph_layout_grid_3d().igraph_integer_t is really an integer now, it used to be a double.igraph_minimum_spanning_tree(), calls either the weighted or
the unweighted implementation.igraph_eccentricity()), and radius (igraph_radius())
calculations.igraph_deterministic_optimal_imitation(),
igraph_stochastic_imitation(), igraph_roulette_wheel_imitation(),
igraph_moran_process(),igraph_layout_sugiyama().igraph_static_fitness_game(),
igraph_static_power_law_game().igraph_community_infomap().igraph_scg().igraph_diversity().igraph_authority_score()) and hub (igraph_hub_score()) scores
support edge weights now.igraph_laplacian()) supports edge
weights now.igraph_betweenness()) and closeness
(igraph_closeness()) calculations.igraph_isomorphic_vf2(), igraph_count_isomorphisms_vf2(),
igraph_get_isomorphisms_vf2(), igraph_subisomorphic_vf2(),
igraph_count_subisomorphisms_vf2(), igraph_get_subisomorphisms_vf2()).igraph_vector*_t, igraph_matrix*_t and
igraph_strvector_t types.igraph_biconnected_components())
can now return the components themselves.igraph_eigenvector_centrality()
now works for directed graphs.get_shortest_paths() and
get_shortest_paths_dijkstra() can now return the edges along the paths.igraph_bipartite_projection() calculates multiplicity of edges.igraph_barabasi_game() was rewritten and it supports three
algorithms now, the default algorithm does not generate multiple or
loop edges.igraph_watts_strogatz() can
now create graphs without loop edges.We also fixed numerous bugs, too many to include them here, sorry. You may look at our bug tracker at https://bugs.launchpad.net/igraph to check whether a bug was fixed or not. Thanks for all the people reporting bugs. Special thanks to Minh Van Nguyen for a lot of bug reports, documentation fixes and contributed code!
]]>igraph 0.6 is a major new release of igraph. It contains many new features and major changes, a lot of bug fixes and improvements. As always, we are grateful to the people who sent comments, bug reports, questions, and specially to people who contributed code.
See below a list of major changes, with links to the relevant sections of the documentation. New features are all listed here.
igraph supports the Nexus network repository from R and from Python. Nexus is an online database of network data sets. You can search Nexus and download network from it directly from R and Python. See the documentation for details.
The Python interface of igraph now supports Python 3. The current release was tested with Python 3.2 on Windows, Linux and Mac OS X. Please report any bugs you encounter when using igraph in Python 3.x through the usual channels.
Community structure detection via exact modularity optimization. As modularity optimization in an NP-complete problem, this works only for small graphs, Python manual.
The multi-level modularity optimization algorithm by Blondel et al. was added. See documentation.
We support now the InfoMAP community finding method, thanks to Emmanuel Navarro for the code. More.
The edge betweenness community detection method of Newman and Girvan now also works on weighted graphs. See the documentation.
We have added some functions to compare various community structures. See the documentation.
The cohesive block finding functions were rewritten from scratch in C. They are much faster now, and they have a nicer API, too. See the documentation.
Personalized PageRank scores. See the documentation.
Authority and hub scores, betweenness and closeness calculations all support edge weights now. See the documentation.
Igraph now implements the Sugiyama layout algorithm for layered directed acyclic graphs. See the documentation.
Igraph now implements the push-relabel algorithm and the Kuhn-Munkres algorithm (also known as the Hungarian method) to find maximum matchings in unweighted and weighted bipartite graphs. See the documentation.
The Python interface now treats the name attributes in a special way.
The values of the attribute are indexed in the background, allowing the retrieval of
a vertex with a given name in amortized constant time. Furthermore, most of the
graph query methods accept vertex names as well as vertex indices.
See the documentation
for more information.
The same graph summary format used by R is now also adopted by Python.
Printing a graph with the print statement now prints the
summary and the edge list in a concise format:
>>> print karate
IGRAPH UNW- 34 78 -- Zachary's karate club network
+ attr: Author (g), Citation (g), name (g), Faction (v), id (v), name(v),
weight (e)
+ edges (vertex names):
Mr Hi -- Actor 2, Actor 3, Actor 4, Actor 5, ...
Actor 2 -- Mr Hi, Actor 3, Actor 4, ...
...
Printing a graph with the summary() function (in
the igraph namespace) prints the short summary only, without the edge list:
>>> summary(karate)
IGRAPH UNW- 34 78 -- Zachary's karate club network
+ attr: Author (g), Citation (g), name (g), Faction (v), id (v), name(v),
weight (e)
Printing a graph with summary(graph, full=True) prints
the summary, the edge list, the vertex and the edge attributes as well.
You can treat the graph as a virtual adjacency matrix. See the details in the documentation.
You can mark vertex groups on graph plots, using shaded
areas. Communities and cohesive blocks are plotted using technique by
default. See the mark_groups argument of the
Graph.__plot__
function.
Graphs in the Python interface are plotted by graph drawer classes now instead of a monolithic plotting function. This allows one to replace the default graph drawer with custom graph drawers; for instance, a drawer that sends an igraph graph to an UbiGraph display or to Cytoscape. The default graph drawer also allows the partial customization of the plot with pluggable vertex shapes and edge drawers.
In R and Python, many igraph functions keep the vertex, edge and graph attributes
now, when one manipulates the graph. The attributes can also be
combined using a flexible API. See the
combine_edges and combine_attrs arguments
of many graph methods in the
Python documentation for more.
name vertex attribute.Nexus.get(), Nexus.info(), Nexus.list() and
Nexus.search().Graph.community_multilevel().compare_communities().Graph.community_optimal_modularity().Graph.community_infomap().Graph.community_edge_betweenness().Graph.eccentricity()), and radius (Graph.radius())
calculations.Graph.get_shortest_paths() can now
return the vertex or edge ids along the shortest paths.Graph.get_all_shortest_paths() now supports edge weights.Graph.neighborhood()Graph.pagerank().Graph.authority_score()) and hub (Graph.hub_score())
scores support edge weights now.Graph.evcent() now works for
directed graphs.Graph.read(). See
http://www.analytictech.com/networks/dataentry.htm.Graph.write().Graph.layout_star().Graph.layout_mds()Graph.layout_grid(), Graph.layout_grid_3d()Graph.layout_sugiyama().mark_groups
keyword argument of Graph.__plot__(). Communities and cohesive blocks are
plotted using this by default. Note that the same keyword argument is
also accepted by plot() of course.AbstractGraphDrawer. The framework allows the implementation of
custom graph drawers such as UbiGraphDrawer or CytoscapeDrawer.
Edges are drawn by edge drawer classes (derived from AbstractEdgeDrawer),
custom vertex shapes are now possible by ShapeDrawers.autocurve and edge_curved keyword arguments of
Graph.__plot__(). Note that these are also accepted by plot() of
course.rescale() function to rescale a list of numeric values to a
different range, suitable for plotting.Graph.Static_Fitness(), Graph.Static_Power_Law().Graph.Barabasi() 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.Graph.Watts_Strogatz() can
now create graphs without loop edges.combine_edges and combine_attrs keyword arguments of
Graph.simplify(), Graph.contract_vertices() and
Graph.to_undirected().print() prints a short information header and the edge list,
while summary() prints the heder only. summary() also
understands keyword arguments that control which parts of the
output should be added; see the GraphSummary class.Graph.motifs_randesu()Graph.transitivity_local_undirected()Graph.cohesive_blocks()Graph.feedback_arc_set()Graph.similarity_jaccard_pairs()
and similar functions.Graph.isomorphic_vf2(), Graph.count_isomorphisms.vf2(),
Graph.get_isomorphisms_vf2(), Graph.subisomorphic_vf2(),
Graph.count_subisomorphisms_vf2(), Graph.get_subisomorphisms_vf2()).Graph.assortativity(),
Graph.assortativity_nominal() and Graph.assortativity_degree().Graph.subgraph_edges().Graph.has_multiple() to decide whether a graph has multiple edges.Graph.diversity().Graph.laplacian()) supports edge
weights now.Graph.bipartite_projection() calculates multiplicity of edges.Graph.contract_vertices().We also fixed numerous bugs, too many to include them here, sorry. You may look at our bug tracker at https://bugs.launchpad.net/igraph to check whether a bug was fixed or not. Thanks for all the people reporting bugs. Special thanks to Minh Van Nguyen for a lot of bug reports, documentation fixes and contributed code!
]]>igraph 0.6 is a major new release of igraph. It contains many new features and major changes, a lot of bug fixes and improvements. As always, we are grateful to the people who sent comments, bug reports, questions, and specially to people who contributed code.
See below a list of major changes, with links to the relevant sections of the documentation. New features in R all listed here.
See at the end for a (more) complete list of changes.
igraph supports the Nexus network repository from R and from Python. Nexus is an online database of network data sets. You can search Nexus and download network from it directly from R and Python. See the manual for details.
The biggest change in the R interface is that starting from this version vertices and edges are numbered from one. This change might be painful for many people, because it makes already existing code incompatible with igraph 0.6. To make the switch easier, there is now an igraph0 package on CRAN; igraph0 uses 0-based vertex and edge ids, and it can be used to run old code. Note, however, that igraph0 will not be developed in the future. Please use the igraph package for current and future work.
(Also note that in Python and C vertices and edges are still numbered from zero, as these languages traditionally use zero-based indexing.)
Community structure detection via exact modularity optimization. As modularity optimization in an NP-complete problem, this works only for small graphs. See the manual.
The multi-level modularity optimization algorithm by Blondel et al. was added. See the documentation.
Hierarchical random graphs and community finding, based on the code from Aaron Clauset. See the manual.
We support now the InfoMAP community finding method, thanks to Emmanuel Navarro for the code. See the manual.
The edge betweenness community detection method of Newman and Girvan now also works on weighted graphs. See the documentation.
We have added some functions to compare various community structures. See thedocumentation.
Igraph now implements the Spectral Coarse Graining method, by David Morton, our implementation is based on his code. See the documentation.
The cohesive block finding functions were rewritten from scratch in C. They are much faster now, and they have a nicer API, too. See the documentation.
All community detection functions return a
communities object now. We have defined various
operations for these objects, see the
R manual for more.
Centralization scores for degree, closeness, betweenness and eigenvector centrality. See the documentation.
Personalized PageRank scores. See the documentation.
Authority and hub scores, betweenness and closeness calculations all support edge weights now. See the documentation.
Igraph now implements the Sugiyama layout algorithm for layered directed acyclic graphs. See the documentation.
Igraph now implements the push-relabel algorithm and the Kuhn-Munkres algorithm (also known as the Hungarian method) to find maximum matchings in unweighted and weighted bipartite graphs. See the documentation.
If you type in the name of an igraph object, the edges of the graph are not dumped to the screen any more, only a short summary of the graph is printed:
> karate
IGRAPH UNW- 34 78 -- Zachary's karate club network
+ attr: name (g/c), Citation (g/c), Author (g/c), Faction (v/n), name (v/c), weight (e/n)
To see the graph structure, you can use the str() function.
See more in the R
documentation.
There are now new and easier ways to add new vertices/edges to a graph, or remove existing ones. See the details in the R documentation. In Python, you can treat the graph as a virtual adjacency matrix. See the details in the Python documentation.
igraphdata packageThe new R package igraphdata contains some example graph data sets.
You can mark vertex groups on graph plots, using shaded
areas. Communities and cohesive blocks are plotted using technique by
default. See the mark.groups argument of
the plot.igraph()
function.
We have included some demos in the igraph R package, to get a list of the demos, type this at your R prompt:
> demo(package="igraph")
Demos in package ‘igraph’:
centrality Classic and other vertex centrality indices
cohesive Cohesive blocking, the Moody & White method
community Community structure detection
crashR A crash-course into R
smallworld Small-world networks
Many igraph functions keep the vertex, edge and graph attributes now, when one manipulates the graph. The attributes can also be combined using a flexible API. See the manual.
igraph0 package.[ 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.igraphdata, contains a number of data sets that can
be used directly in igraph.nexus.get(), nexus.info(), nexus.list() and
nexus.search().communities
object now, which has a bunch of useful operations, see
?communities for details.?attribute.combination.summary() was also updated
accordingly.demo(package="igraph").igraph.console().igraph.options() and
getIgraphOpt().multilevel.community().compare.communities().optimal.community().hrg.game(), hrg.fit(), etc.infomap.community().eccentricity()), and radius (radius()) calculations.get.shortest.paths() can now
return the edges along the shortest paths.get.all.shortest.paths() now supports edge weights.centralization.scores().page.rank().subgraph.centrality().authority.score()) and hub (hub.score()) scores support
edge weights now.bonpow(), Bonacich’s power centrality and alpha.centrality(),
Alpha centrality calculations now use sparse matrices by default.evcent() now works for
directed graphs.graph.read(). See
http://www.analytictech.com/networks/dataentry.htm.write.graph().layout.star().layout.mds().layout.grid() and layout.grid.3d().layout.sugiyama().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.igraph_watts_strogatz() can
now create graphs without loop edges.scg().cohesive.blocks() function was rewritten in C, it is much faster
now. It has a nicer API, too. See demo("cohesive").graph.bfs() and graph_dfs().graph.isomorphic.vf2(), graph.count.isomorphisms.vf2(),
graph.get.isomorphisms.vf2(), graph.subisomorphic.vf2(),
graph.count.subisomorphisms.vf2(), graph.get.subisomorphisms.vf2()).assortativity(), assortativity.nominal()
and assortativity.degree().graph.intersection.by.name(), graph.union.by.name(),
graph.difference.by.name(). Thanks to Magnus Torfason for
contributing his code!subgraph.edges().graph.maxflow(), graph.mincut(), stCuts(), stMincuts().is.dag().has.multiple() to decide whether a graph has multiple edges.graph.diversity().graph.laplacian()) supports edge
weights now.biconnected.components()
now returns the components themselves.bipartite.projection() calculates multiplicity of edges.maximum.cardinality.search() and
chordality test: is.chordal()convex.hull().contract.vertices().We also fixed numerous bugs, too many to include them here, sorry. You may look at our bug tracker at https://bugs.launchpad.net/igraph to check whether a bug was fixed or not. Thanks for all the people reporting bugs. Special thanks to Minh Van Nguyen for a lot of bug reports, documentation fixes and contributed code!
]]>long long int)igraph_community_spinglass, when csize was a NULL
pointer, but membership was notigraph_bipartite_projection that caused occasional
crashes on some systemsget_eid() considers edge directions by default from now onNaN and inf are treated correctly nowlong long int)igraph_community_spinglass, when csize was a NULL
pointer, but membership was notigraph_bipartite_projection that caused occasional
crashes on some systemsR CMD check cleangraph.incidence, the directed and mode arguments
were not handled correctlyigraph.from.graphNEL creates the right number of loop edges nowbipartite.projection() that caused occasional crashes
on some systemsThis is another bug fix release, with a couple of new features. Here are the important ones. See at the end for the complete list of changes.
Bipartite graphs have two kinds of vertices and edges are only allowed to connect opposite kinds. Think of the Hollywood movie graph with actors and movies. igraph 0.5.2 now contains some functions to deal with these kind of networks.
This is a simple and intuitive community finding algorithm, published by Raghavan et al. in 2007 (see docs for full citation). It works by assigning labels to the vertices and then updating the labels based on majority voting among the neighbors.
The DrL layout generator was extended to generate three dimensional layouts. Albeit slower than the regular 2D version, this is a nice addition for those who do visualization in 3D.
Johnson’s algorithm is a good choice for finding all shortest paths in a network that has some negative edge weights, but no negative cycles.
A new function was added to calculate the average degree of the neighbors of all or some vertices. It supports the edge weighted version of the measure as well.
Apart from the bug fixes, some functions were rewritten to speed them up.
igraph_betweenness() and
igraph_betweenness_estimate(), igraph_layout_drl()igraph_betweenness_estimate(), igraph_get_eid(),
igraph_are_connected(), igraph_get_eids()igraph_get_eid2()igraph_shortest_paths_johnson()igraph_avg_nearest_neighbor_degree()igraph_strength()igraph_full_bipartite(),
igraph_bipartite_projection(), igraph_create_bipartite(),
igraph_incidence(), igraph_get_incidence(),
igraph_bipartite_projection_size(), igraph_is_bipartite()igraph_community_label_propagation()examples/simple/random_seed.c)igraph_unfold_tree()igraph_layout_drl_3d()igraph_isomorphic_function_vf2(), affecting all VF2
graph isomorphism functionsigraph_degree_sequence_game() checks now that
the sum of the degrees is evenigraph_automorphisms(),
igraph_shortest_paths_bellman_ford(),
igraph_independent_vertex_sets()id attributencv ARPACK parameter for
igraph_community_leading_eigenvector()igraph_path_length_hist(), unconnected was wrong
for unconnected and undirected graphs.This is another bug fix release, with a couple of new features. Here are the important ones. See at the end for the complete list of changes.
Bipartite graphs have two kinds of vertices and edges are only allowed to connect opposite kinds. Think of the Hollywood movie graph with actors and movies. igraph 0.5.2 now contains some functions to deal with these kind of networks.
This is a simple and intuitive community finding algorithm, published by Raghavan et al. in 2007 (see docs for full citation). It works by assigning labels to the vertices and then updating the labels based on majority voting among the neighbors.
The DrL layout generator was extended to generate three dimensional layouts. Albeit slower than the regular 2D version, this is a nice addition for those who do visualization in 3D.
Johnson’s algorithm is a good choice for finding all shortest paths in a network that has some negative edge weights, but no negative cycles.
A new function was added to calculate the average degree of the neighbors of all or some vertices. It supports the edge weighted version of the measure as well.
Apart from the bug fixes, some functions were rewritten to speed them up.
Graph.shortest_paths() if needed)Graph.strength()Graph.Bipartite(),
Graph.is_bipartite(), Graph.get_indicence(), Graph.Incidence(),
Graph.bipartite_projection(), Graph.bipartite_projection_size()Graph.community_label_propagation()Graph.unfold_tree()setup.py script improvementsedge_arrow_size and edge_arrow_widthGraph.Formula to create small graphs from a simple notationVertexSeq and EdgeSeq objects can now be indexed by slicesigraph_isomorphic_function_vf2(), affecting all VF2
graph isomorphism functionsigraph_degree_sequence_game() checks now that
the sum of the degrees is evenigraph_automorphisms(),
igraph_shortest_paths_bellman_ford(),
igraph_independent_vertex_sets()id attributencv ARPACK parameter for
igraph_community_leading_eigenvector()igraph_path_length_hist(), unconnected was wrong
for unconnected and undirected graphs.This is another bug fix release, with a couple of new features. Here are the important ones. See at the end for the complete list of changes.
Bipartite graphs have two kinds of vertices and edges are only allowed to connect opposite kinds. Think of the Hollywood movie graph with actors and movies. igraph 0.5.2 now contains some functions to deal with these kind of networks.
This is a simple and intuitive community finding algorithm, published by Raghavan et al. in 2007 (see docs for full citation). It works by assigning labels to the vertices and then updating the labels based on majority voting among the neighbors.
The DrL layout generator was extended to generate three dimensional layouts. Albeit slower than the regular 2D version, this is a nice addition for those who do visualization in 3D.
A minimal, supported GUI is included now in the R package. It contains
only a small fraction of igraph capabilities, but can be still useful,
e.g. in teaching. You can start it by typing tkigraph(),
after loading the igraph package of course.
Johnson’s algorithm is a good choice for finding all shortest paths in a network that has some negative edge weights, but no negative cycles.
A new function was added to calculate the average degree of the neighbors of all or some vertices. It supports the edge weighted version of the measure as well.
Both plot() and tkplot() supports curved
edges. See ?igraph.plotting for more details.
Apart from the bug fixes, some functions were rewritten to speed them up.
beweenness() and
betweenness.estimate(), layout.drl()are.connected()shortest.paths() has now an algorithm argument to choose from the
various implementations manuallygraph.knn()graph.strength()graph.bipartite(),
is.bipartite(), get.indicence(), graph.incidence(),
bipartite.projection(), bipartite.projection.size()plot.igraph() and tkplot()alpha.centrality()label.propagation.community()cohesive.blocks() now has a cutsetHeuristic argument to choose
between two cutset algorithmsunfold.tree()tkplot() arguments to change the drawing areatkigraph()layout.drl() has a three dimensional mode
now.get.adjacency() and the graph was nameddegree.sequence.game() checks now that
the sum of the degrees is evengraph.automorphisms(), Bellman-Ford
shortest.paths(), independent.vertex.sets()cohesive.blocks() creates its temporary file in the session
temporary directorywrite.graph() and read.graph() now give error messages when unknown
arguments are givenid attributencv ARPACK parameter for
leading.eigenvector.community()path.length.hist(), unconnected was wrong
for unconnected and undirected graphsunloadNamespace() is usedgraph.adjacency() when the matrix is a sparse matrix
of class dgTMatrixigraph 0.5.1 is a bugfix release, but it actually contains many important new things as well. Here is a brief summary about each of them. See below for the complete list of changes.
This is a sophisticated and efficient layout generator written by Shawn Martin and colleagues. See more in the reference manual.
A nice random graph generator that conditions on the degree of vertices was added. It can generate undirected connected graphs. The algorithm and the implementation was done by Fabien Viger and Matthieu Latapy. See more in the reference manual.
Both the Dijkstra and the Belmann-Ford algorithms were added.
See more in the
reference manual.
Mutuality can be tested for each edge now. See more in the reference manual.
Inf for unreachable
vertices.igraph_adjlist can create igraph graphs from
adjacency lists.igraph_weighted_adjacency can create weighted graphs
from weight matrices.igraph_is_mutual to search for mutual edges.igraph_preference_game and igraph_asymmetric_preference_game were
rewritten, they are O(|V|+|E|) now, instead of O(|V|^2).igraph_get_shortest_paths, based on
Dijkstra’s algorithm.*Vertices
was missing.igraph_random_sample),
now it always generates unique numbers. This affects the
G(n,m) Erdos-Renyi generator, it always generates simple graphs now.igraph_empty_attrs, all functions
are expected to call this internally) now checks whether the number
of vertices is finite.igraph 0.5.1 is a bugfix release, but it actually contains many important new things as well. Here is a brief summary about each of them. See below for the complete list of changes.
This is a sophisticated and efficient layout generator written by Shawn Martin and colleagues. See more in the Python documentation.
A nice random graph generator that conditions on the degree of vertices was added. It can generate undirected connected graphs. The algorithm and the implementation was done by Fabien Viger and Matthieu Latapy. See more in the Python documentation.
Both the Dijkstra and the Belmann-Ford algorithms were added. See more in the Python manual.
Mutuality can be tested for each edge now. See more in the Python manual.
igraph.IN, igraph.OUT and igraph.ALL
constants now also accept these as strings ("in", "out" and "all").
Prefix matches also allowed as long as the prefix match is unique.Graph.shortest_paths() now supports edge weights (Dijkstra’s and
Bellman-Ford algorithm implemented)Graph.get_shortest_paths() also supports edge weights
(only Dijkstra’s algorithm yet)Graph.is_mutual() to find mutual edges in a directed graph.preference.game and asymmetric.preference.game were
rewritten, they are O(|V|+|E|) now, instead of O(|V|^2).Layout.to_radial() added – now you can create a top-down tree
layout by the Reingold-Tilford algorithm and then turn it to a
radial tree layoutGraph.write_pajek() to save graphs in Pajek formatVertexSeq and EdgeSeq, restricted to the current
vertex/edge sequence of courseGraph.mincut()Graph.Weighted_Adjacency() to create graphs from weighted
adjacency matricesGraph.Preference() and Graph.Asymmetric_Preference() were
rewritten, they are O(|V|+|E|) now, instead of O(|V|^2).Graph.constraint() now properly returns floats instead of integers
(thanks to Eytan Bakshy)Graph.Preference() now accepts floats in type distributionsGraph.community_edge_betweenness() correctedVertexSeq and EdgeSeq objects can now be subsetted by lists and
tuples as wellGraph.authority_score() now really returns the authority scores
instead of the hub scores (blame copypasting)*Vertices
was missing.igraph_random_sample),
now it always generates unique numbers. This affects the
G(n,m) Erdos-Renyi generator, it always generates simple graphs now.igraph 0.5.1 is a bugfix release, but it actually contains many important new things as well. Here is a brief summary about each of them. See below for the complete list of changes.
This is a sophisticated and efficient layout generator written by Shawn Martin and colleagues. See more in the manual.
A nice random graph generator that conditions on the degree of vertices was added. It can generate undirected connected graphs. The algorithm and the implementation was done by Fabien Viger and Matthieu Latapy. See more in the manual.
igraph includes some functions to convert graphs to and from
graphNEL objects as defined in the graph package
(igraph.to.graphNEL,
igraph.from.graphNEL) and
sparse matrices using the Matrix package
(get.adjacency,
graph.adjacency,
see the sparse argument).
A new function was added to create graphs from adjacency lists
(graph.adjlist),
and graph.data.frame
has an argument call vertices, this allows easy
construction of graphs with vertex and edge meta data.
Both the Dijkstra and the Belmann-Ford algorithms were added. See more in the documentation.
Mutuality can be tested for each edge now. See more in the documentation.
The R interface now supports different vertex shapes when plotting. See more in the R documentation.
plot.graph.adjlist creates igraph graphs from
adjacency lists.graph R package.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.Inf for unreachable vertices.is.mutual to find mutual edges in a directed graph.preference.game and asymmetric.preference.game were
rewritten, they are O(|V|+|E|) now, instead of O(|V|^2).get.shortest.paths, it uses
Dijkstra’s algorithm.write.pajek.bgraph.graph.adjacency.*Vertices
was missing.igraph_random_sample),
now it always generates unique numbers. This affects the
G(n,m) Erdos-Renyi generator, it always generates simple graphs now.igraph_empty_attrs, all functions
are expected to call this internally) now checks whether the number
of vertices is finite.There are a lot of improvements and corrections in this version. We would like to thank all the people who sent comments, bug reports, patches, or just questions. Without their contribution igraph would be definitely much less and worse than it is now. Please keep sending your comments and ideas!
Here is a list of major changes, with links to the relevant sections of the documentation. See below for the complete list of changes.
We took some step towards turning igraph to an efficient platform for implementing graph algorithms. In particular, we have a set of utility types that support general scientific computing and working with graphs: vectors, matrices, stacks, queues, heaps, adjacency lists, etc.
igraph includes the BLISS graph isomorphism algorithm and implementation now. This and the improved VF2 implementation, which can now calculate subgraph isomorphism, make igraph support the bleeding edge of graph isomorphism algorithms. Many thanks to the authors of BLISS. See the details in the Reference Manual.
ARPACK is a library for solving large scale sparse eigenvalue problems. In igraph it is very handy, as many centrality problems are in fact eigenvalue problems: Kleinberg’s hub and authority scores, PageRank, the leading eigenvector community detection algorithm are some examples. Many thanks to the authors of ARPACK and James Fowler, who suggested to include it in igraph.
See the details in the Reference Manual.
Some classic graphs can be created by giving their name. This is
very handy if one needs a test graph quickly. See
igraph_famous.
(The idea is based on Combinatorica, a Mathematica extension.)
Many functions were updated to handle weighted graphs: fast greedy community detection, Page Rank, modularity calculation, the Fruchterman-Reingold layout algorithm.
Some functions were added and improved to handle non-simple graphs
(i.e. graphs with loop and/or multiple edges) better: testing that a
graph is simple (
igraph_is_simple),
testing for multiple edges (
igraph_is_multiple), and counting the multiplicity of
edges (
igraph_count_multiple).
This is a nice force-based layout algorithm. See the documentation of
details (
igraph_layout_graphopt).
igraph can now write graphs to files in the DOT format, used by
GraphViz. See documentation:
igraph_write_graph_dot.
Classic social network analysis tools for classifying the dyads
(
igraph_dyad_census), and triads
(
igraph_triad_census) of a network.
igraph is now able to calculate biconnected components
(
igraph_biconnected_components), and articulation points
(
igraph_articulation_points).
These measures can be quickly estimated by specifying an upper bound
for path lengths to be considered. This is useful for larger graphs,
for which the calculation takes a long time. See documentation for
closeness (
igraph_closeness_estimate),
betweenness (
igraph_betweenness_estimate), and edge betweenness
(
igraph_edge_betweenness_estimate).
Two vertex similarity measures based on the number of common neighbors
are introduced, the Jaccard
(
igraph_similarity_jaccard), and the Dice
(
igraph_similarity_dice).
An experimental C attribute interface was added. This allows using graph/vertex/edge attributes when programming from C. See more here.
igraph_canonical_permutation, igraph_isomorphic_blissigraph_pagerank,
igraph_community_leading_eigenvector_*. New functions based on
ARPACK: igraph_eigenvector_centrality, igraph_hub_score,
igraph_authority_score, igraph_arpack_rssolve, igraph_arpack_rnsolveExperimental C attribute interface added. I.e. it is possible to use graph/vertex/edge attributes from C code now.
igraph_count_multiple addedigraph_is_loop and igraph_is_multiple “return” boolean vectorsigraph_layout_graphoptigraph_famousigraph_lcf, igraph_lcf_vectorigraph_add_edge adds a single edge to the graphigraph_is_simple addedigraph_full_citation to create full citation networksigraph_path_length_hist, create a histogram of path lengthsigraph_adjlist_t,
igraph_adjedgelist_t)igraph_le_community_to_membership)igraph_permute_vertices addedigraph_read_graph_* functions can handle all possible line
terminators now (\r, \n, \r\n, \n\r)cut vector was usedThere are a lot of improvements and corrections in this version. We would like to thank all the people who sent comments, bug reports, patches, or just questions. Without their contribution igraph would be definitely much less and worse than it is now. Please keep sending your comments and ideas!
Here is a list of major changes, with links to the relevant sections of the documentation. See below for the complete list of changes.
igraph includes the BLISS graph isomorphism algorithm and implementation now. This and the improved VF2 implementation, which can now calculate subgraph isomorphism, make igraph support the bleeding edge of graph isomorphism algorithms. Many thanks to the authors of BLISS. See the details in the Python documentation.
ARPACK is a library for solving large scale sparse eigenvalue problems. In igraph it is very handy, as many centrality problems are in fact eigenvalue problems: Kleinberg’s hub and authority scores, PageRank, the leading eigenvector community detection algorithm are some examples. Many thanks to the authors of ARPACK and James Fowler, who suggested to include it in igraph.
See the details in the evcent, pagerank, hub_score, etc. functions in the Python documentation.
Plotting functionality based on the Cairo graphics library (so you need to install python-cairo if you want to use it). Currently the following objects can be plotted: graphs, adjacency matrices and dendrograms. Some crude support for plotting histograms is also implemented. Plots can be saved in PNG, SVG and PDF formats.
See the details in the documentation.
igraph can now be invoked by calling the script called
igraph from the command line. The script launches the
Python interpreter and automatically imports igraph functions into the
main namespace.
Some classic graphs can be created by giving their name. This is very handy if one needs a test graph quickly. See Famous. (The idea is based on Combinatorica, a Mathematica extension.)
Many functions were updated to handle weighted graphs: fast greedy community detection, Page Rank, modularity calculation, the Fruchterman-Reingold layout algorithm.
Some functions were added and improved to handle non-simple graphs (i.e. graphs with loop and/or multiple edges) better: testing that a graph is simple, testing for loop edges, testing for multiple edges) and counting the multiplicity of edges.
igraph Graph objects can be serialized (pickled) in Python.
This is a nice force-based layout algorithm. See the documentation of details.
igraph can now write graphs to files in the DOT format, used by GraphViz. See documentation.
Classic social network analysis tools for classifying the dyads and triads of a network.
igraph is now able to calculate biconnected components and articulation points.
These measures can be quickly estimated by specifying an upper bound for path lengths to be considered. This is useful for larger graphs, for which the calculation takes a long time. See documentation for closeness, betweenness and edge betweenness.
Two vertex similarity measures based on the number of common neighbors are introduced, the Jaccard Jaccard and the Dice similarities.
igraph from the command line. The script launches the Python interpreter and
automatically imports igraph functions into the main namespaceGraph objectsGraph.layout method for accessing layout algorithmsVertexSeq and EdgeSeq objects can now be restricted to subsets of the
whole network (e.g., you can select vertices/edges based on attributes,
degree, centrality and so on)igraph_canonical_permutation, igraph_isomorphic_blissigraph_pagerank,
igraph_community_leading_eigenvector_*. New functions based on
ARPACK: igraph_eigenvector_centrality, igraph_hub_score,
igraph_authority_score, igraph_arpack_rssolve, igraph_arpack_rnsolveExperimental C attribute interface added. I.e. it is possible to use graph/vertex/edge attributes from C code now.
igraph_count_multiple addedigraph_is_loop and igraph_is_multiple “return” boolean vectorsigraph_layout_graphoptigraph_famousigraph_lcf, igraph_lcf_vectorigraph_add_edge adds a single edge to the graphigraph_is_simple addedigraph_full_citation to create full citation networksigraph_path_length_hist, create a histogram of path lengthsigraph_adjlist_t,
igraph_adjedgelist_t)igraph_le_community_to_membership)igraph_permute_vertices addedigraph_read_graph_* functions can handle all possible line
terminators now (\r, \n, \r\n, \n\r)cut vector was usedThere are a lot of improvements and corrections in this version. We would like to thank all the people who sent comments, bug reports, patches, or just questions. Without their contribution igraph would be definitely much less and worse than it is now. Please keep sending your comments and ideas!
Here is a list of major changes, with links to the relevant sections of the documentation. See below for the complete list of changes.
igraph includes the BLISS graph isomorphism algorithm and implementation now. This and the improved VF2 implementation, which can now calculate subgraph isomorphism, make igraph support the bleeding edge of graph isomorphism algorithms. Many thanks to the authors of BLISS. See the details in the Reference Manual, in the R documentation or in the Python documentation.
ARPACK is a library for solving large scale sparse eigenvalue problems. In igraph it is very handy, as many centrality problems are in fact eigenvalue problems: Kleinberg’s hub and authority scores, PageRank, the leading eigenvector community detection algorithm are some examples. Many thanks to the authors of ARPACK and James Fowler, who suggested to include it in igraph.
See the details in the documentation.
Some classic graphs can be created by giving their name. This is
very handy if one needs a test graph quickly. See
graph.famous().
(The idea is based on Combinatorica, a Mathematica extension.)
The new
graph.formula()
function provides a simple, concise way to create (small) graphs.
Numerous examples are included in the
manual page.
Many functions were updated to handle weighted graphs: fast greedy
community detection
(fastgreedy.community)
Page Rank (page.rank),
modularity calculation (modularity),
the Fruchterman-Reingold layout algorithm
(layout.fruchterman.reingold.
Some functions were added and improved to handle non-simple graphs
(i.e. graphs with loop and/or multiple edges) better: testing that a
graph is simple (simplify),
testing for loop edges
(is.loop),
testing for multiple edges
(is.multiple)
and counting the multiplicity of edges
(count.multiple.
This is a nice force-based layout algorithm. See the documentation for details.
igraph can now write graphs to files in the DOT format, used by GraphViz. See the documentation.
Classic social network analysis tools for classifying the dyads
(dyad.census) and triads
(triad.census.
igraph is now able to calculate
biconnected components and
articulation points.
There were some minor improvements in R graphics. New graphical
parameters: frame, asp, rescale
and shape for different vertex shapes, right now only
circles and squares are supported.
plot.igraph has as
argument (add) to plot many graphs on the same plot,
maybe on top of each other. It also supports the main and
sub arguments now. See more here.
In previous versions of the igraph R package the allocated memory was not freed if the computation was interrupted. This surely affected MS Windows platforms, maybe also OSX. (Not Linux.) igraph 0.5 correctly deallocates all memory on all platforms after an interruption.
These measures can be quickly estimated by specifying an upper bound for path lengths to be considered. This is useful for larger graphs, for which the calculation takes a long time. See documentation for closeness, betweenness, and edge betweenness.
Two vertex similarity measures based on the number of common neighbors are introduced, the Jaccard and Dice similarities. See the manual for details.
Up to now igraph warnings were dumped to the console when using the igraph R package. In many cases this meant that they were effectively lost. In the new version igraph warnings are converted to proper R warnings.
rescale, asp and frame graphical parameters were addedgraph.formula)get.adjlist and get.adjedgelist addedplot.igraph has an add argument now to compose plots with multiple
graphsplot.igraph supports the main and sub argumentslayout.norm is public now, it can normalize a layoutCTRL+C/ESC is pressed, in all operating
systemsplot.igraph can plot square vertices now, see the shape parametergraph.adjacency rewritten when creating weighted graphsWe use match.arg whenever possible. This means that character scalar
options can be abbreviated and they are always case insensitive
canonical.permutation, graph.isomorphic.blisspage.rank,
leading.eigenvector.community.*, evcent. New functions based on
ARPACK: hub.score, authority.score, arpack.layout.fruchterman.reingold).line.graph)graph.kautz, graph.de.bruijn)similarity.jaccard,
similarity.dice)count.multiple)layout.graphoptgraph.famous).graph.cf).dyad.census, triad.census)is.simple)graph.full.citation)path.length.hist)forest.fire.game)biconnected.components,
articulation.points)hub.score, authority.score)as.undirected handles attributes nowgrg.game) can return the
coordinates of the verticescommunity.le.to.membership)closeness.estimate,
betweenness.estimate, edge.betweenness.estimate)permute.vertices)read.graph can handle all possible line terminators now (\r, \n, \r\n, \n\r)cohesive.blocks, cohesive blocks were sometimes not
calculated correctlyJanuary 1, 2008
New:
New in the C library:
igraph_vector_bool_t data type.Bug fixed:
January 1, 2008
New:
Bug fixed:
January 1, 2008
New:
$.Bug fixed:
October 3, 2007
Some bugs were fixed:
October 3, 2007
Some bugs were fixed:
October 3, 2007
This release should work seemlessly with the new R 2.6.0 version. Some other bugs were also fixed:
August 13, 2007
The next one in the sequence of bugfix releases. Thanks to many people sending bug reports. Here are the changes:
August 13, 2007
The next one in the sequence of bugfix releases. Thanks to many people sending bug reports. Here are the changes:
August 13, 2007
The next one in the sequence of bugfix releases. Thanks to many people sending bug reports. Here are the changes:
June 7, 2007
This is another bugfix release.
Some other bits added:
June 7, 2007
This is another bugfix release. Some other bits added:
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:
arrow.size graphical edge parameter added in the R interface.May 23, 2007
This is a minor release, it corrects a number of bugs.
]]>May 23, 2007
This is a minor release, it corrects a number of bugs.
]]>May 23, 2007
This is a minor release, it corrects a number of bugs, mostly in the R package.
]]>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:
igraph_neighbors always returns an ordered listigraph_is_loop and igraph_is_multiple added
igraph_mincut cat calculate the actual minimum cutsupport for reading and writing GML files
igraph_community_to_membership supporting function added, creates
a membership vector from a community structure merge treeMay 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:
igraph_neighbors always returns an ordered listigraph_is_loop and igraph_is_multiple added
igraph_mincut cat calculate the actual minimum cutsupport for reading and writing GML files
igraph_community_to_membership supporting function added, creates
a membership vector from a community structure merge treeMay 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:
neighbors returns ordered lists
support for reading and writing GML files
community.to.membership supporting function added, creates
a membership vector from a community structure merge treemodularity calculation added
?igraph.plottingarrow.modebarabasi.gamerglplot layout is allowed to be two dimensional nowrglplot suspends updates while drawing, this makes it fasterloop edges are correctly plotted by all three plotting functions
is.igraph rewritten to make it possible to inherit from the igraph classigraph_connect_neighborhood(), nomen est omenigraph_watts_strogatz_game() and igraph_rewire_edges()igraph_coreness()igraph_cliques(), igraph_independent_vertex_sets(),
igraph_maximal_cliques(), igraph_maximal_independent_vertex_sets(),
igraph_independence_number(), `igraph_clique_number(),
Some of these function were ported from the very_nauty library
of Keith Briggs, thanks Keith!make install installs the library correctly on Cygwin nowigraph_connect_neighborhood(), nomen est omenigraph_watts_strogatz_game() and igraph_rewire_edges()igraph_coreness()igraph_cliques(), igraph_independent_vertex_sets(),
igraph_maximal_cliques(), igraph_maximal_independent_vertex_sets(),
igraph_independence_number(), `igraph_clique_number(),
Some of these function were ported from the very_nauty library
of Keith Briggs, thanks Keith!make install installs the library correctly on Cygwin nowconnect.neighborhood()watts.strogatz.game() and rewire.edges()graph.coreness()innei and outnei shorthands for vertex sequence indexing
see help(iterators)cliques, largest.cliques, maximal.cliques, clique.number,
independent.vertex.sets, largest.independent.vertex.sets,
maximal.independent.vertex.sets, independence.numberedge.lty argument added to plot.igraph and tkplotalpha.centrality added(), calculates Bonacich alpha centrality, see docs.make install installs the library correctly on Cygwin nowtkplot() bug with graphs containing a name attributeplot.igraph() when plotting loopsJanuary 8, 2007
The documentation of the Python interface is available. See section ‘documentation’ in the menu.
]]>December 19, 2006
This is a new major release, it contains many new things: geometric random graphs, local transitivity, etc.
igraph_maxdegree added, calculates the maximum degree in the graphigraph_grg_game, geometric random graphsigraph_density, graph density calculationigraph_maxflow_valueigraph_st_mincut_value, igraph_mincut_value, the Stoer-Wagner
algorithm is implemented for undirected graphsigraph_st_vertex_connectivity, igraph_vertex_connectivityigraph_st_edge_connectivity, igraph_edge_connectivityigraph_edge_disjoint_paths,
igraph_vertex_disjoint_paths, igraph_adhesion, igraph_cohesionigraph_to_directed handles attributesigraph_spinglass_community,
igraph_spinglass_my_communityigraph_extended_chordal_ring, it creates extended chordal ringsno argument added to igraph_clusters, it is possible to calculate
the number of clusters without calculating the clusters themselvesigraph_delete_vertices rewritten to allocate less memory for the new
graphigraph_neighborhood,
igraph_neighborhood_size, igraph_neighborhood_graphsigraph_preference_game and igraph_asymmetric_preference_gameigraph_laplacian functionigraph_read_graph_graphmligraph_read_graph_graphmlDecember 19, 2006
This is a new major release, it contains many new things: geometric random graphs, local transitivity, etc.
igraph_maxdegree added, calculates the maximum degree in the graphigraph_grg_game, geometric random graphsigraph_density, graph density calculationigraph_maxflow_valueigraph_st_mincut_value, igraph_mincut_value, the Stoer-Wagner
algorithm is implemented for undirected graphsigraph_st_vertex_connectivity, igraph_vertex_connectivityigraph_st_edge_connectivity, igraph_edge_connectivityigraph_edge_disjoint_paths,
igraph_vertex_disjoint_paths, igraph_adhesion, igraph_cohesionigraph_to_directed handles attributesigraph_spinglass_community,
igraph_spinglass_my_communityigraph_extended_chordal_ring, it creates extended chordal ringsno argument added to igraph_clusters, it is possible to calculate
the number of clusters without calculating the clusters themselvesigraph_delete_vertices rewritten to allocate less memory for the new
graphigraph_neighborhood,
igraph_neighborhood_size, igraph_neighborhood_graphsigraph_preference_game and igraph_asymmetric_preference_gameigraph_laplacian functionigraph_read_graph_graphmligraph_read_graph_graphmlgraph.laplacian when normalized
Laplacian is requestedget.all.shortest.paths in the R packageDecember 19, 2006
This is a new major release, it contains many new things: geometric random graphs, creating a graph with attributes from a data frame in R, local transitivity, etc.
bonpow function ported from SNA to calculate Bonacich power centralityget.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/1grg.game, geometric random graphsgraph.density, graph density calculationadd.edges or new vertices with add.verticesgraph.data.frame creates graph from data frames, this can be used to
create graphs with edge attributes easilyplot.igraph and tkplot can plot self-loop edges nowgraph.edgelist to create a graph from an edge list, can also handle
edge lists with symbolic namesget.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 returnedname attribute if present)graph.maxflow, graph.mincutedge.connectivity, vertex.connectivityedge.disjoint.paths,
vertex.disjoint.pathsgraph.adhesion, graph.cohesionas.directed handles attributes nowgraph.adjacencyspinglass.communitygraph.extended.chordal.ring, extended chordal ring generationno.clusters calculates the number of clusters without calculating
the clusters themselvestransitivity can calculate local transitivity as wellneighborhood,
neighborhood.size, graph.neighborhoodpreference.game and
asymmetric.preference.gameigraph_read_graph_graphmligraph_read_graph_graphmlgraph.laplacian when normalized
Laplacian is requestedget.all.shortest.paths in the R packageAugust 23, 2006
This is a bug-fix release. Bugs fixed:
August 23, 2006
This is a bug-fix release. Bugs fixed:
August 23, 2006
This is a bug-fix release. Bugs fixed:
August 18, 2006
Release time at last! There are many new things in igraph 0.2, the most important ones:
and many more.
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.
]]>August 18, 2006
Release time at last! There are many new things in igraph 0.2, the most important ones:
and many more.
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.
]]>August 18, 2006
Release time at last! There are many new things in igraph 0.2, the most important ones:
and many more.
New things in the R package:
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.
]]>August 18, 2006
I’ve set up two igraph mailing lists: igraph-help for general igraph questions and discussion and igraph-anonunce for announcements. See http://lists.nongnu.org/mailman/listinfo/igraph-help and http://lists.nongnu.org/mailman/listinfo/igraph-announce for subscription information, archives, etc.
]]>January 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.
]]>January 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.
]]>January 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.
]]>