Changeset 7950:a28e81ccc92b in orange


Ignore:
Timestamp:
05/27/11 14:25:48 (3 years ago)
Author:
miha <miha.stajdohar@…>
Branch:
default
Convert:
bc6650ad1afb082b448ac38c43baf992970b62db
Message:

Read Pajek file format to NetworkX graph now in C++.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orange/Orange/network/readwrite.py

    r7873 r7950  
    1 import Orange 
     1import os.path 
     2import warnings 
     3import itertools 
     4 
    25import networkx as nx 
    36import networkx.readwrite as rw 
    4 import warnings 
    5 import itertools 
     7from networkx.utils import _get_fh 
     8 
     9import orangeom 
     10import Orange 
    611import Orange.network 
    712 
    8 from networkx.utils import _get_fh 
    9  
    10 __all__ = ['generate_pajek', 'write_pajek', 'read_pajek', 'parse_pajek'] 
     13__all__ = ['read', 'generate_pajek', 'write_pajek', 'read_pajek', 'parse_pajek'] 
    1114 
    1215def _wrap(g): 
     
    1922    return g 
    2023 
    21 def read_pajek(path,encoding='UTF-8'): 
     24def read(path, encoding='UTF-8'): 
     25    #supported = ['.net', '.gml', '.gpickle', '.gz', '.bz2', '.graphml'] 
     26    supported = ['.net'] 
     27     
     28    if not os.path.isfile(path): 
     29        return None 
     30     
     31    root, ext = os.path.splitext(path) 
     32    if not ext in supported: 
     33        return None 
     34     
     35    if ext == '.net': 
     36        return read_pajek(path, encoding) 
     37         
     38 
     39def read_pajek(path, encoding='UTF-8'): 
     40    """  
     41    Read Pajek file. 
    2242    """ 
    23     A copy&paste of networkx's function. Calls the local parse_pajek(). 
    24     """ 
    25     fh=_get_fh(path, 'rb') 
    26     lines = (line.decode(encoding) for line in fh) 
    27     return parse_pajek(lines) 
     43    edges, arcs, items = orangeom.GraphLayout().readPajek(path) 
     44    if len(arcs) > 0: 
     45        # directed graph 
     46        G = Orange.network.DiGraph() 
     47        G.add_edges_from(((u,v,{'weight':d}) for u,v,d in edges)) 
     48        G.add_edges_from(((v,u,{'weight':d}) for u,v,d in edges)) 
     49        G.add_edges_from(((u,v,{'weight':d}) for u,v,d in arcs)) 
     50        G.set_items(items) 
     51    else: 
     52        G = Orange.network.Graph() 
     53        G.add_edges_from(((u,v,{'weight':d}) for u,v,d in edges)) 
     54        G.set_items(items) 
     55         
     56    return G 
     57    #fh=_get_fh(path, 'rb') 
     58    #lines = (line.decode(encoding) for line in fh) 
     59    #return parse_pajek(lines) 
    2860 
    2961def parse_pajek(lines): 
    3062    """ 
    31     A copy&paste of networkx's function with some bugs fixed: 
    32       - make it a Graph or DiGraph if there is no reason to have a Multi*, 
    33       - do not lose graph's name during its conversion. 
     63    Parse string in Pajek file format. 
    3464    """ 
    35     import shlex 
    36     from networkx.utils import is_string_like 
    37     multigraph=False 
    38     if is_string_like(lines): lines=iter(lines.split('\n')) 
    39     lines = iter([line.rstrip('\n') for line in lines]) 
    40     G=nx.MultiDiGraph() # are multiedges allowed in Pajek? assume yes 
    41     directed=True # assume this is a directed network for now 
    42     while lines: 
    43         try: 
    44             l=next(lines) 
    45         except: #EOF 
    46             break 
    47         if l.lower().startswith("*network"): 
    48             label,name=l.split(None, 1) 
    49             G.name=name 
    50         if l.lower().startswith("*vertices"): 
    51             nodelabels={} 
    52             l,nnodes=l.split() 
    53             for i in range(int(nnodes)): 
    54                 splitline=shlex.split(str(next(lines))) 
    55                 id,label=splitline[0:2] 
    56                 G.add_node(label) 
    57                 nodelabels[id]=label 
    58                 G.node[label]={'id':id} 
    59                 try:  
    60                     x,y,shape=splitline[2:5] 
    61                     G.node[label].update({'x':float(x), 
    62                                           'y':float(y), 
    63                                           'shape':shape}) 
    64                 except: 
    65                     pass 
    66                 extra_attr=zip(splitline[5::2],splitline[6::2]) 
    67                 G.node[label].update(extra_attr) 
    68         if l.lower().startswith("*edges") or l.lower().startswith("*arcs"): 
    69             if l.lower().startswith("*edge"): 
    70                # switch from multi digraph to multi graph 
    71                 G=nx.MultiGraph(G, name=G.name) 
    72             for l in lines: 
    73                 splitline=shlex.split(str(l)) 
    74                 ui,vi=splitline[0:2] 
    75                 u=nodelabels.get(ui,ui) 
    76                 v=nodelabels.get(vi,vi) 
    77                 # parse the data attached to this edge and put in a dictionary  
    78                 edge_data={} 
    79                 try: 
    80                     # there should always be a single value on the edge? 
    81                     w=splitline[2:3] 
    82                     edge_data.update({'weight':float(w[0])}) 
    83                 except: 
    84                     pass 
    85                     # if there isn't, just assign a 1 
    86 #                    edge_data.update({'value':1}) 
    87                 extra_attr=zip(splitline[3::2],splitline[4::2]) 
    88                 edge_data.update(extra_attr) 
    89                 if G.has_edge(u,v): 
    90                     multigraph=True 
    91                 G.add_edge(u,v,**edge_data) 
    92  
    93     if not multigraph: # use Graph/DiGraph if no parallel edges 
    94         if G.is_directed(): 
    95             G=nx.DiGraph(G, name=G.name) 
    96         else: 
    97             G=nx.Graph(G, name=G.name) 
    98     return _wrap(G) 
     65    return read_pajek(lines) 
    9966 
    10067def generate_pajek(G): 
Note: See TracChangeset for help on using the changeset viewer.