Changeset 8208:6dd4f7570df5 in orange


Ignore:
Timestamp:
08/18/11 09:26:15 (3 years ago)
Author:
matija <matija.polajnar@…>
Branch:
default
Convert:
af424f3ea372d6a801d880e138456efead8a5017
Message:

Added support for reading Pajek Project files (with multiple networks).

Files:
2 edited

Legend:

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

    r8042 r8208  
    169169_add_doc(write_gpickle, rwgpickle.write_gpickle) 
    170170 
    171 def read_pajek(path, encoding='UTF-8'): 
     171def read_pajek(path, encoding='UTF-8', project=False): 
    172172    """A completely reimplemented method for reading Pajek files. Written in  
    173173    C++ for maximum performance.   
     
    197197    """ 
    198198     
    199     edges, arcs, items = orangeom.GraphLayout().readPajek(path) 
    200     if len(arcs) > 0: 
    201         # directed graph 
    202         G = Orange.network.DiGraph() 
    203         G.add_nodes_from(range(len(items))) 
    204         G.add_edges_from(((u,v,{'weight':d}) for u,v,d in edges)) 
    205         G.add_edges_from(((v,u,{'weight':d}) for u,v,d in edges)) 
    206         G.add_edges_from(((u,v,{'weight':d}) for u,v,d in arcs)) 
    207         G.set_items(items) 
    208     else: 
    209         G = Orange.network.Graph() 
    210         G.add_nodes_from(range(len(items))) 
    211         G.add_edges_from(((u,v,{'weight':d}) for u,v,d in edges)) 
    212         G.set_items(items) 
    213          
    214     return G 
     199    input = orangeom.GraphLayout().readPajek(path, project) 
     200    result = [] 
     201    for g in input if project else [input]: 
     202        graphname, edges, arcs, items = g 
     203        if len(arcs) > 0: 
     204            # directed graph 
     205            G = Orange.network.DiGraph() 
     206            G.add_nodes_from(range(len(items))) 
     207            G.add_edges_from(((u,v,{'weight':d}) for u,v,d in edges)) 
     208            G.add_edges_from(((v,u,{'weight':d}) for u,v,d in edges)) 
     209            G.add_edges_from(((u,v,{'weight':d}) for u,v,d in arcs)) 
     210            G.set_items(items) 
     211        else: 
     212            G = Orange.network.Graph() 
     213            G.add_nodes_from(range(len(items))) 
     214            G.add_edges_from(((u,v,{'weight':d}) for u,v,d in edges)) 
     215            G.set_items(items) 
     216        G.name = graphname 
     217         
     218        result.append(G) 
     219         
     220    if not project: 
     221        result = result[0] 
     222         
     223    return result 
    215224    #fh=_get_fh(path, 'rb') 
    216225    #lines = (line.decode(encoding) for line in fh) 
  • source/orangeom/graph_layout.cpp

    r8174 r8208  
    12391239} 
    12401240 
    1241 PyObject *GraphLayout_readPajek(PyObject *self, PyObject *args) PYARGS(METH_VARARGS, "(fn) -> Edge List") 
     1241PyObject *GraphLayout_readPajek(PyObject *self, PyObject *args) PYARGS(METH_VARARGS, "(fn, project) -> Edge List") 
    12421242{ 
    12431243  PyTRY 
    12441244    TDomain *domain = new TDomain(); 
    12451245    PDomain wdomain = domain; 
    1246     TExampleTable *table; 
    1247     PExampleTable wtable; 
    1248     PyObject *edgeList = PyList_New(0); 
    1249     PyObject *arcList = PyList_New(0); 
    12501246    char *fn; 
    1251  
    1252     if (!PyArg_ParseTuple(args, "s:GraphLayout.readPajek", &fn)) 
    1253         PYERROR(PyExc_TypeError, "invalid arguments (string expected)", PYNULL); 
     1247    unsigned char project = 0; 
     1248    bool hasGraph = 0; 
     1249 
     1250    if (!PyArg_ParseTuple(args, "s|b:GraphLayout.readPajek", &fn, &project)) 
     1251        PYERROR(PyExc_TypeError, "invalid arguments (a string and optionally a boolean expected)", PYNULL); 
    12541252 
    12551253    string line; 
     
    12871285    domain->addVariable(new TStringVariable("boundary color")); 
    12881286    domain->addVariable(new TFloatVariable("boundary width")); 
    1289     table = new TExampleTable(domain); 
    1290     wtable = table; 
     1287 
    12911288    vector<string> words; 
    12921289 
     1290    PyObject *networks; 
     1291    TExampleTable *table; 
     1292    PExampleTable wtable; 
     1293    PyObject *edgeList; 
     1294    PyObject *arcList; 
     1295    if (project) 
     1296        networks = PyList_New(0); 
     1297 
    12931298    // read head 
     1299    bool hasLine = 0; 
     1300    int n; 
    12941301    while (!stream->eof()) { 
    1295         getline(*stream, line); 
    1296         int n = getWords1(line, words); 
     1302        if (!hasLine) { 
     1303            getline(*stream, line); 
     1304            n = getWords1(line, words); 
     1305        } 
     1306        hasLine = 0; 
     1307 
    12971308        if (n > 0)  { 
    12981309            std::transform(words[0].begin(), words[0].end(), words[0].begin(), ::tolower); 
    12991310            if (words[0].compare("*network") == 0) { 
     1311                if (hasGraph && !project) 
     1312                    PYERROR(PyExc_SystemError, "Invalid file format. More than one network in a non-project file (parameter project is set to FALSE).", PYNULL); 
     1313 
     1314                hasGraph = 1; 
     1315                edgeList = PyList_New(0); 
     1316                arcList = PyList_New(0); 
     1317                table = new TExampleTable(domain); 
     1318                wtable = table; 
     1319 
    13001320                if (n > 1) { 
    13011321                    graphName = words[1]; 
    1302                 } 
    1303             } else if (words[0].compare("*description") == 0) { 
     1322                } else { 
     1323                    graphName = ""; 
     1324                } 
     1325 
     1326                if (project) { 
     1327                    PyObject *net = Py_BuildValue("sNNN", graphName.c_str(), edgeList, arcList, WrapOrange(wtable)); 
     1328                    PyList_Append(networks, net); 
     1329                } 
     1330 
     1331                continue; 
     1332            } 
     1333 
     1334            if (hasGraph && (words[0].compare("*description") == 0)) { 
    13041335                if (n > 1) { 
    13051336                    description = words[1]; 
    13061337                } 
    1307             } else if (words[0].compare("*vertices") == 0) { 
     1338                continue; 
     1339            } 
     1340 
     1341            if (hasGraph && (words[0].compare("*vertices") == 0)) { 
    13081342                if (n > 1) { 
    13091343                    nVertices = atoi(words[1].c_str()); 
     
    13251359                    getline(*stream, line); 
    13261360                    int n = getWords1(line, words); 
     1361                    hasLine = 1; 
    13271362                    if (n > 0) { 
    13281363                        std::transform(words[0].begin(), words[0].end(), words[0].begin(), ::tolower); 
    1329                         if (words[0].compare("*arcs") == 0 || words[0].compare("*edges") == 0) 
     1364                        if (words[0][0] == '*') 
    13301365                            break; 
    13311366 
     
    14051440                    row++; 
    14061441                } 
    1407             } 
    1408             if (words[0].compare("*arcs") == 0) { 
     1442                continue; 
     1443            } 
     1444 
     1445            if (hasGraph && (words[0].compare("*arcs") == 0)) { 
    14091446                // read arcs 
    14101447                while (!stream->eof()) { 
    14111448                    getline(*stream, line); 
    1412                     //vector<string> words; 
    14131449                    int n = getWords1(line, words); 
     1450                    hasLine = 1; 
    14141451                    if (n > 0) { 
    14151452                        std::transform(words[0].begin(), words[0].end(), words[0].begin(), ::tolower); 
    1416                         if (words[0].compare("*edges") == 0) { 
     1453                        if (words[0][0]=='*') { 
    14171454                            break; 
    14181455                        } 
     
    14411478                    } 
    14421479                } 
    1443             } 
    1444             if (words[0].compare("*edges") == 0) { 
     1480                continue; 
     1481            } 
     1482 
     1483            if (hasGraph && (words[0].compare("*edges") == 0)) { 
    14451484                // read edges 
    14461485                while (!stream->eof()) { 
    14471486                    getline(*stream, line); 
    14481487                    int n = getWords1(line, words); 
     1488                    hasLine = 1; 
     1489                    if (n > 0) { 
     1490                        std::transform(words[0].begin(), words[0].end(), words[0].begin(), ::tolower); 
     1491                        if (words[0][0]=='*') { 
     1492                            break; 
     1493                        } 
     1494                    } 
    14491495                    if (n > 1) { 
    14501496                        int i1 = -1; istringstream strI1(words[0]); strI1 >> i1; 
     
    14701516                    } 
    14711517                } 
    1472             } 
     1518                continue; 
     1519            } 
     1520 
     1521            if ((words[0][0]=='*') && project) 
     1522                hasGraph = 0; 
     1523            else 
     1524                PYERROR(PyExc_SystemError, "Invalid file format. Invalid keyword.", PYNULL); 
    14731525        } 
    14741526    } 
    14751527    file.close(); 
    1476     return Py_BuildValue("NNN", edgeList, arcList, WrapOrange(wtable)); 
     1528    if (project) 
     1529        return Py_BuildValue("N", networks); 
     1530    else if (hasGraph) 
     1531        return Py_BuildValue("sNNN", graphName.c_str(), edgeList, arcList, WrapOrange(wtable)); 
     1532    else 
     1533        return Py_BuildValue(""); 
    14771534  PyCATCH 
    14781535} 
Note: See TracChangeset for help on using the changeset viewer.