예제 #1
0
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
예제 #2
0
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

    
예제 #3
0
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
예제 #4
0
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