Changeset 8212:854823d4e40f in orange


Ignore:
Timestamp:
08/18/11 11:12:50 (3 years ago)
Author:
matija <matija.polajnar@…>
Branch:
default
Convert:
1a98f6f474258e818efed03f049604ce222021dc
Message:

Support for additional attributes on Pajek networks.

Files:
2 edited

Legend:

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

    r8208 r8212  
    175175    :param path: File or filename to write. 
    176176    :type path: string 
    177          
    178     Return the network of type :obj:`Orange.network.Graph` or  
    179     :obj:`Orange.network.DiGraph`. 
     177     
     178    :param encoding: Encoding of input text file, default 'UTF-8'. 
     179    :type encoding: string 
     180     
     181    :param project: Determines whether the input file is a Pajek project file, 
     182        possibly containing multiple networks and other data. If :obj:`True`, 
     183        a list of networks is returned instead of just a network. Default is 
     184        :obj:`False`. 
     185    :type project: boolean. 
     186         
     187    Return the network (or a list of networks if project=:obj:`True`) of type 
     188    :obj:`Orange.network.Graph` or :obj:`Orange.network.DiGraph`. 
    180189 
    181190 
     
    200209    result = [] 
    201210    for g in input if project else [input]: 
    202         graphname, edges, arcs, items = g 
     211        graphname, vertices, edges, arcs, items = g 
    203212        if len(arcs) > 0: 
    204213            # directed graph 
    205214            G = Orange.network.DiGraph() 
    206215            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)) 
     216            G.add_edges_from(((u,v,dict(d.items()+[('weight',w)])) for u,v,w,d in edges)) 
     217            G.add_edges_from(((v,u,dict(d.items()+[('weight',w)])) for u,v,w,d in edges)) 
     218            G.add_edges_from(((u,v,dict(d.items()+[('weight',w)])) for u,v,w,d in arcs)) 
    210219            G.set_items(items) 
    211220        else: 
    212221            G = Orange.network.Graph() 
    213222            G.add_nodes_from(range(len(items))) 
    214             G.add_edges_from(((u,v,{'weight':d}) for u,v,d in edges)) 
     223            G.add_edges_from(((u,v,dict(d.items()+[('weight',w)])) for u,v,w,d in edges)) 
    215224            G.set_items(items) 
     225        for i, vdata in zip(range(len(G.node)), vertices): 
     226            G.node[i].update(vdata) 
    216227        G.name = graphname 
    217228         
  • source/orangeom/graph_layout.cpp

    r8208 r8212  
    12911291    TExampleTable *table; 
    12921292    PExampleTable wtable; 
     1293    PyObject *vertexList; 
    12931294    PyObject *edgeList; 
    12941295    PyObject *arcList; 
     
    13131314 
    13141315                hasGraph = 1; 
     1316                vertexList = PyList_New(0); 
    13151317                edgeList = PyList_New(0); 
    13161318                arcList = PyList_New(0); 
     
    13251327 
    13261328                if (project) { 
    1327                     PyObject *net = Py_BuildValue("sNNN", graphName.c_str(), edgeList, arcList, WrapOrange(wtable)); 
     1329                    PyObject *net = Py_BuildValue("sNNNN", graphName.c_str(), vertexList, edgeList, arcList, WrapOrange(wtable)); 
    13281330                    PyList_Append(networks, net); 
    13291331                } 
     
    13671369                        TExample *example = new TExample(domain); 
    13681370                        float index = -1; istringstream strIndex(words[0]); strIndex >> index; 
    1369                              
     1371 
     1372                        PyObject *vData = PyDict_New(); 
     1373                        PyList_Append(vertexList, vData); 
     1374 
    13701375                        if ((index <= 0) || (index > nVertices)) { 
    13711376                            file.close(); 
     
    13941399                            } 
    13951400                            // read attributes 
    1396                             while (i < n) { 
     1401                            while (i+1 < n) { 
    13971402                                if (stricmp(words[i].c_str(), "s_size") == 0) { 
    1398                                     if (i + 1 < n) { 
    1399                                         i++; 
    1400                                     } else { 
    1401                                         file.close(); 
    1402                                         PYERROR(PyExc_SystemError, "invalid file format. Error reading vertex size.", PYNULL); 
    1403                                     } 
    1404                                     float size = -1; istringstream strSize(words[i]); strSize >> size; 
     1403                                    float size = -1; istringstream strSize(words[i+1]); strSize >> size; 
    14051404                                    (*example)[6] = TValue(size); 
    1406  
    14071405                                } else if (stricmp(words[i].c_str(), "ic") == 0) { 
    1408                                     if (i + 1 < n) { 
    1409                                         i++; 
    1410                                     } else { 
    1411                                         file.close(); 
    1412                                         PYERROR(PyExc_SystemError, "invalid file format. Error reading vertex color.", PYNULL); 
    1413                                     } 
    1414                                     (*example)[7] = TValue(new TStringValue(words[i]), STRINGVAR); 
    1415  
     1406                                    (*example)[7] = TValue(new TStringValue(words[i+1]), STRINGVAR); 
    14161407                                } else if (stricmp(words[i].c_str(), "bc") == 0) { 
    1417                                     if (i + 1 < n) { 
    1418                                         i++; 
    1419                                     } else { 
    1420                                         file.close(); 
    1421                                         PYERROR(PyExc_SystemError, "invalid file format. Error reading boundary color.", PYNULL); 
    1422                                     } 
    1423                                     (*example)[8] = TValue(new TStringValue(words[i]), STRINGVAR); 
     1408                                    (*example)[8] = TValue(new TStringValue(words[i+1]), STRINGVAR); 
    14241409                                } else if (stricmp(words[i].c_str(), "bw") == 0) { 
    1425                                     if (i + 1 < n) { 
    1426                                         i++; 
    1427                                     } else { 
    1428                                         file.close(); 
    1429                                         PYERROR(PyExc_SystemError, "invalid file format. Error reading boundary width.", PYNULL); 
    1430                                     } 
    14311410                                    float bwidth = -1; istringstream strBWidth(words[i]); strBWidth >> bwidth; 
    14321411                                    (*example)[9] = TValue(bwidth); 
    14331412                                } 
    1434                                 i++; 
     1413 
     1414                                PyDict_SetItemString(vData, words[i].c_str(), 
     1415                                        PyUnicode_FromString(words[i+1].c_str())); 
     1416                                i += 2; 
    14351417                            } 
    14361418                        } 
     
    14641446 
    14651447                            if (i1 == i2) continue; 
     1448 
     1449                            // read attributes 
     1450                            PyObject *aData = PyDict_New(); 
     1451                            int i = 3; 
     1452                            while(i+1<n) { 
     1453                                PyDict_SetItemString(aData, words[i].c_str(), 
     1454                                        PyUnicode_FromString(words[i+1].c_str())); 
     1455                                i += 2; 
     1456                            } 
     1457 
     1458                            // read weights 
    14661459                            if (n > 2) { 
    14671460                                vector<string> weights; 
     
    14701463                                for (i=0; i < m; i++) { 
    14711464                                    double i3 = 0; istringstream strI3(weights[i]); strI3 >> i3; 
    1472                                     PyObject *nel = Py_BuildValue("iid", i1 - 1, i2 - 1, i3); 
     1465                                    PyObject *nel = Py_BuildValue("iidN", i1 - 1, i2 - 1, i3, aData); 
    14731466                                    PyList_Append(arcList, nel); 
    14741467                                    Py_DECREF(nel); 
     
    15031496 
    15041497                        if (i1 == i2) continue; 
     1498 
     1499                        // read attributes 
     1500                        PyObject *eData = PyDict_New(); 
     1501                        int i = 3; 
     1502                        while(i+1<n) { 
     1503                            PyDict_SetItemString(eData, words[i].c_str(), 
     1504                                    PyUnicode_FromString(words[i+1].c_str())); 
     1505                            i += 2; 
     1506                        } 
     1507 
     1508                        // read weights 
    15051509                        if (n > 2) { 
    15061510                            vector<string> weights; 
     
    15091513                            for (i=0; i < m; i++) { 
    15101514                                double i3 = 0; istringstream strI3(weights[i]); strI3 >> i3; 
    1511                                 PyObject *nel = Py_BuildValue("iid", i1 - 1, i2 - 1, i3); 
     1515                                PyObject *nel = Py_BuildValue("iidN", i1 - 1, i2 - 1, i3, eData); 
    15121516                                PyList_Append(edgeList, nel); 
    15131517                                Py_DECREF(nel); 
     
    15291533        return Py_BuildValue("N", networks); 
    15301534    else if (hasGraph) 
    1531         return Py_BuildValue("sNNN", graphName.c_str(), edgeList, arcList, WrapOrange(wtable)); 
     1535        return Py_BuildValue("sNNNN", graphName.c_str(), vertexList, edgeList, arcList, WrapOrange(wtable)); 
    15321536    else 
    15331537        return Py_BuildValue(""); 
Note: See TracChangeset for help on using the changeset viewer.