def r_igraph_max_ave_degree(g): """ Compute local triangle count of graph g and save as necessary *Global graph attributes can only be stored in the graph* @param g: The igraph graph loaded via Rpy2 i.e. an R object @return: Same graph an input but with added invariant as an attribute """ mad = r_igraph_get_attr( g, "eigvals", "g") # See if we already have computed eigenvalues for the graph if mad == NULL: # Ok then compute top 1 eig ourself mad = r_igraph_eigs(g, 1, return_eigs=True, save_fn=None)[0] else: mad = float(mad[0].split(",")[0] [1:]) # The largest eigenvalue is held at index 0 if mad is not None: g = r_igraph_set_graph_attribute(g, "max_ave_degree", mad) else: # More than likely ran out of memory print "Failed to estimate max ave degree because eigensolver failed ..." return g # return so we can use for other attributes
if return_eigs: return eigs # used for MAD if save_fn: save_fn = os.path.abspath(save_fn) createSave(save_fn[0], eigs[0][0]) # eigenvalues createSave(save_fn[1], eigs[0][1]) # eigenvectors print "Eigenvalues saved as %s ..." % save_fn[0] print "eigenvectors ssaved as %s ..." % save_fn[1] else: global gl_eigvects gl_eigvects = eigs[0][1] print "Setting eigenvalues as graph attr ..." g = r_igraph_set_graph_attribute(g, "eigvals", "["+", ".join(map(cut, (eigs[0][0])))+"]") # Return a comma separated string eig_idx = eigs[1] print "Mapping eigenvectors ..." eigvects = map(get_str_eigvects, [(idx, idx+nev) for idx in xrange(0, ((len(eigs[1]))*nev), nev)]) del eigs print "Setting eigenvectors as vertex attr ..." g = r_igraph_set_vertex_attr(g, "latent_pos", value=eigvects, index=eig_idx, is_str=True) # Could not create char sequences only lists :-/ print "Eigenvalue computation not saved to disk. Eigen-pairs added as graph attributes ...." return g def get_str_eigvects(idx): """ Used for mapping to get eigenvectors that correspond to each vertex of the graph
if return_eigs: return eigs # used for MAD if save_fn: save_fn = os.path.abspath(save_fn) createSave(save_fn[0], eigs[0][0]) # eigenvalues createSave(save_fn[1], eigs[0][1]) # eigenvectors print "Eigenvalues saved as %s ..." % save_fn[0] print "eigenvectors ssaved as %s ..." % save_fn[1] else: global gl_eigvects gl_eigvects = eigs[0][1] print "Setting eigenvalues as graph attr ..." g = r_igraph_set_graph_attribute( g, "eigvals", "[" + ", ".join(map(cut, (eigs[0][0]))) + "]") # Return a comma separated string eig_idx = eigs[1] print "Mapping eigenvectors ..." eigvects = map(get_str_eigvects, [(idx, idx + nev) for idx in xrange(0, ((len(eigs[1])) * nev), nev)]) del eigs print "Setting eigenvectors as vertex attr ..." g = r_igraph_set_vertex_attr( g, "latent_pos", value=eigvects, index=eig_idx, is_str=True) # Could not create char sequences only lists :-/ print "Eigenvalue computation not saved to disk. Eigen-pairs added as graph attributes ...."