def multiplex_configuration_independent(mg,seed=None): """Run configuration model independently for each layer. Parameters ---------- mg : Multinet Multiplex network to be configured. seed : object Seed for the configuration model. Return ------ A new Multinet instance. """ layers = mg.layers() nl = len(layers) seeds = _random_int_list(nl,seed=seed) nmg = Multinet() for layer in layers: sg = mg.sub_layer(layer,remove_isolates=True) nodes = sg.in_degree().keys() in_degs = sg.in_degree().values() out_degs = sg.out_degree().values() rsg = nx.directed_configuration_model(in_degs,out_degs,create_using=nx.DiGraph(),seed=seeds.pop()) rnodes = rsg.nodes() mapping = dict(zip(rnodes,nodes)) nrsg = nx.relabel_nodes(rsg,mapping) nmg.add_layer(nrsg,layer) return nmg
def multiplex_erdos_renyi(mg,seed=None,include_all=True): """Return a Multinet such that each layer is an Erdos-Renyi network with same p as the original Multinet given. Parameters ---------- mg : Multinet Multiplex network to be configured. seed : object Seed for the model. Return ------ A new Multinet instance. """ layers = mg.layers() nl = len(layers) seeds = _random_int_list(nl,seed=seed) nmg = Multinet() for layer in layers: sg = mg.sub_layer(layer,remove_isolates=not include_all) nodes = sg.nodes() nnode = sg.number_of_nodes() nedge = sg.number_of_edges() p = float(nedge)/pow(nnode,2) rsg = nx.erdos_renyi_graph(nnode,p,seed=seeds.pop(),directed=True) rnodes = rsg.nodes() mapping = dict(zip(rnodes,nodes)) nrsg = nx.relabel_nodes(rsg,mapping) nmg.add_layer(nrsg,layer) return nmg
def reconstruct_from_bipartite(bg): """Reconstruct a multiplex network from a layer-edge bipartite graph. Parameters: ----------- bg: nx.Graph A layer-edge bipartite graph that used to reconstruct the multiplex network. """ top,bottom = bipartite_sets(bg) mg = Multinet() layers = map(_remove_prefix,list(top)) for nodes in bottom: mg.add_nodes_from(nodes) u = nodes[0] v = nodes[1] for layer in bg[nodes]: layer = _remove_prefix(layer) mg.add_edge(u,v,layer) return mg
def multinet_from_csv( file_name, filter_func=util.default_filter, weight_func=util.default_weight, layer_func=util.default_layer, ow='ORIGIN',dw='DEST', **csv_reader_argv): """Build Multinet from csv files. Parameters: ----------- filename: str The path to csv file. filter_func: func A function takes line description and a line from the csv file and return a bool. See util/filter_helper for detail. weight_func: func or str A function takes line description and a line from the csv file and return a number. See util/weight_helper for detail. layer_func: func or str A function takes line description and a line from the csv file and return a str. See util/layer_helper for detail. ow, dw: str The key to get nodes name. csv_reader_argv: Arguments for internal csv reader. If not specified, use default settings. See Python csv module for detail. """ index_dict = {} mg = Multinet() if type(weight_func) == str: weight_func = util.weight_from_string(weight_func) if type(layer_func) == str: layer_func = util.layer_from_string(layer_func) with open(file_name) as netfile: if not csv_reader_argv: netreader = csv.reader(netfile,delimiter=',',quotechar='\"',quoting=csv.QUOTE_NONNUMERIC) else: netreader = csv.reader(netfile,**csv_reader_argv) index_line = netreader.next() index = 0 for item in index_line: index_dict[item] = index index += 1 origin_index = index_dict[ow] dest_index = index_dict[dw] for line in netreader: if not filter_func(index_dict,line): continue origin = line[origin_index] dest = line[dest_index] layer = layer_func(index_dict,line) weight = weight_func(index_dict,line) mg.add_node(origin) mg.add_node(dest) mg.aggregate_edge(origin,dest,layer,weight) return mg