Ticket #11181: trac_11181.patch

File trac_11181.patch, 16.9 KB (added by rlm, 10 years ago)
  • sage/graphs/base/sparse_graph.pxd

    # HG changeset patch
    # User Robert L. Miller <rlm@rlmiller.org>
    # Date 1302648827 25200
    # Node ID ff47d66a934a9dfc0a37efd5957d056dec15312e
    # Parent  d8e432f69c743e664f671f0dc1cf77f4084b5cca
    #11181: edge labels should be unique
    
    diff -r d8e432f69c74 -r ff47d66a934a sage/graphs/base/sparse_graph.pxd
    a b  
    3636    cdef int has_arc_label_unsafe(self, int, int, int)
    3737    cpdef bint has_arc_label(self, int u, int v, int l)
    3838   
    39 cdef int check_edge_label(object l, dict edge_labels)
     39cdef int new_edge_label(object l, dict edge_labels)
  • sage/graphs/base/sparse_graph.pyx

    diff -r d8e432f69c74 -r ff47d66a934a sage/graphs/base/sparse_graph.pyx
    a b  
    13841384from c_graph import CGraphBackend
    13851385from c_graph cimport get_vertex, check_vertex, vertex_label
    13861386
    1387 cdef int check_edge_label(object l, dict edge_labels):
     1387cdef int new_edge_label(object l, dict edge_labels):
    13881388    """
    1389     Returns an int representing the arbitrary label l.
     1389    Finds a new int representing the arbitrary label l.
    13901390    """
     1391    if l is None:
     1392        return 0
    13911393    cdef int l_int, max = 0
    13921394    for l_int in edge_labels:
    1393         if edge_labels[l_int] == l:
    1394             return l_int
    13951395        if max < l_int:
    13961396            max = l_int
    1397     l_int = max+1
    1398     return l_int
     1397    edge_labels[max+1] = l
     1398    return max+1
    13991399
    14001400class SparseGraphBackend(CGraphBackend):
    14011401    """
     
    14511451        self._directed = directed
    14521452        self.vertex_labels = {}
    14531453        self.vertex_ints = {}
    1454         self.edge_labels = {0:None}
     1454        self.edge_labels = {}
    14551455
    14561456    def add_edge(self, object u, object v, object l, bint directed):
    14571457        """
     
    14691469            sage: D.add_edge(0,1,None,False)
    14701470            sage: list(D.iterator_edges(range(9), True))
    14711471            [(0, 1, None)]
    1472 
     1472       
     1473        TESTS::
     1474       
     1475            sage: D = DiGraph(implementation='c_graph', sparse=True)
     1476            sage: D.add_edge(0,1,2)
     1477            sage: D.add_edge(0,1,3)
     1478            sage: D.edges()
     1479            [(0, 1, 3)]
     1480       
    14731481        """
    14741482        cdef int u_int = check_vertex(u, self.vertex_ints, self.vertex_labels,
    14751483                      self._cg, self._cg_rev, self._directed)
     1484        cdef int v_int = check_vertex(v, self.vertex_ints, self.vertex_labels,
     1485                      self._cg, self._cg_rev, self._directed)
    14761486        if not self._cg.has_vertex(u_int):
    14771487            self._cg.add_vertex(u_int)
    1478         cdef int v_int = check_vertex(v, self.vertex_ints, self.vertex_labels,
    1479                       self._cg, self._cg_rev, self._directed)
    14801488        if not self._cg.has_vertex(v_int):
    14811489            self._cg.add_vertex(v_int)
    1482 
    1483         cdef int l_int = check_edge_label(l, self.edge_labels)
    1484         if l_int not in self.edge_labels:
    1485             self.edge_labels[l_int] = l
    1486 
    1487         if (self.multiple_edges(None) or not self._cg.has_arc_label(u_int, v_int, l_int)) and \
    1488             (self.loops(None) or u_int != v_int):
    1489             if directed:
    1490                 self._cg.add_arc_label(u_int, v_int, l_int)
    1491                 self._cg_rev.add_arc_label(v_int, u_int, l_int)
    1492             elif u_int == v_int:
    1493                 self._cg.add_arc_label(u_int, v_int, l_int)
     1490       
     1491        cdef int l_int
     1492        if l is None:
     1493            l_int = 0
     1494        else:
     1495            l_int = new_edge_label(l, self.edge_labels)
     1496       
     1497        if (not self.loops(None)) and u_int == v_int:
     1498            return
     1499        if not self.multiple_edges(None):
     1500            if self._cg.has_arc_label(u_int, v_int, l_int):
     1501                return
    14941502            else:
    1495                 self._cg.add_arc_label(u_int, v_int, l_int)
    1496                 self._cg.add_arc_label(v_int, u_int, l_int)
     1503                self._cg.del_all_arcs(u_int, v_int)
     1504        if directed:
     1505            self._cg.add_arc_label(u_int, v_int, l_int)
     1506            self._cg_rev.add_arc_label(v_int, u_int, l_int)
     1507        elif u_int == v_int:
     1508            self._cg.add_arc_label(u_int, v_int, l_int)
     1509        else:
     1510            self._cg.add_arc_label(u_int, v_int, l_int)
     1511            self._cg.add_arc_label(v_int, u_int, l_int)
    14971512
    14981513    def add_edges(self, object edges, bint directed):
    14991514        """
     
    15531568             (5, 4, None),
    15541569             (5, 6, None),
    15551570             (6, 5, None)]
    1556 
     1571       
     1572        TESTS::
     1573       
     1574            sage: G = Graph(implementation='c_graph', sparse=True)
     1575            sage: G.add_edge(0,1,2)
     1576            sage: G.delete_edge(0,1)
     1577            sage: G.edges()
     1578            []
     1579       
     1580            sage: G = Graph(multiedges=True, implementation='c_graph', sparse=True)
     1581            sage: G.add_edge(0,1,2)
     1582            sage: G.add_edge(0,1,None)
     1583            sage: G.delete_edge(0,1)
     1584            sage: G.edges()
     1585            [(0, 1, 2)]
     1586       
    15571587        """
    15581588        if not ( self.has_vertex(u) and self.has_vertex(v) ):
    15591589            return
     
    15611591                      self._cg, self._cg_rev, self._directed)
    15621592        cdef int v_int = check_vertex(v, self.vertex_ints, self.vertex_labels,
    15631593                      self._cg, self._cg_rev, self._directed)
    1564         cdef int l_int = check_edge_label(l, self.edge_labels)
    1565         if l_int not in self.edge_labels:
    1566             return
    1567         if l_int == 0:
    1568             l_int = self._cg.arc_label(u_int, v_int)
     1594        for l_int in self.edge_labels:
     1595            if self.edge_labels[l_int] == l and self._cg.has_arc_label(u_int, v_int, l_int):
     1596                break
     1597        else:
     1598            if l is None:
     1599                if self._cg.has_arc_label(u_int, v_int, 0):
     1600                    l_int = 0
     1601                else: l_int = self._cg.arc_label(u_int, v_int)
     1602            else: return
    15691603        if directed:
    15701604            self._cg.del_arc_label(u_int, v_int, l_int)
    15711605            self._cg_rev.del_arc_label(v_int, u_int, l_int)
     
    15871621            sage: D.add_edges([(0,1,1), (2,3,2), (4,5,3), (5,6,2)], False)
    15881622            sage: list(D.iterator_edges(range(9), True))
    15891623            [(0, 1, 1), (2, 3, 2), (4, 5, 3), (5, 6, 2)]
    1590             sage: D.del_edge(0,1,None,True) # "None" is equivalent to not providing a label
    1591             sage: list(D.iterator_edges(range(9), True))
    1592             [(2, 3, 2), (4, 5, 3), (5, 6, 2)]
    15931624            sage: D.get_edge_label(3,2)
    15941625            2
    15951626
     
    16061637        if not (<SparseGraph>self._cg).has_arc_unsafe(u_int, v_int):
    16071638            raise RuntimeError("%s, %s not an edge of the graph."%(u,v))
    16081639        if self.multiple_edges(None):
    1609             return [self.edge_labels[l_int] for l_int in self._cg.all_arcs(u_int, v_int)]
     1640            return [self.edge_labels[l_int] if l_int != 0 else None
     1641                     for l_int in self._cg.all_arcs(u_int, v_int)]
    16101642        l_int = self._cg.arc_label(u_int, v_int)
    1611         return self.edge_labels[l_int]
     1643        return self.edge_labels[l_int] if l_int else None
    16121644
    16131645    def has_edge(self, object u, object v, object l):
    16141646        """
     
    16351667                      self._cg)
    16361668        cdef int v_int = get_vertex(v, self.vertex_ints, self.vertex_labels,
    16371669                      self._cg)
    1638         cdef int l_int = check_edge_label(l, self.edge_labels)
    1639         if l_int not in self.edge_labels:
    1640             return False
    1641         if l_int == 0:
     1670        if l is None:
    16421671            return self._cg.has_arc(u_int, v_int)
    1643         return self._cg.has_arc_label(u_int, v_int, l_int)
     1672        for l_int in self.edge_labels:
     1673            if self.edge_labels[l_int] == l and self._cg.has_arc_label(u_int, v_int, l_int):
     1674                return True
     1675        return False
    16441676
    16451677    def iterator_edges(self, object vertices, bint labels):
    16461678        """
     
    16611693            [(1, 2, 3)]
    16621694
    16631695        """
    1664         cdef object v, l
     1696        cdef object v, l, L
    16651697        vertices = [get_vertex(v, self.vertex_ints, self.vertex_labels,
    16661698                    self._cg) for v in vertices if self.has_vertex(v)]
    16671699        cdef int u_int, v_int, l_int
    16681700        if labels:
    1669             return iter([tuple(sorted(
     1701            L = []
     1702            for v_int in vertices:
     1703                for u_int in self._cg.out_neighbors(v_int):
     1704                    if u_int >= v_int or u_int not in vertices:
     1705                        for l_int in self._cg.all_arcs(v_int, u_int):
     1706                            if l_int == 0:
     1707                                l = None
     1708                            else:
     1709                                l = self.edge_labels[l_int]
     1710                            L.append(tuple(sorted(
    16701711            (vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg),
    16711712             vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)
    1672             )))+(self.edge_labels[l_int],)
    1673                 for v_int in vertices
    1674                     for u_int in self._cg.out_neighbors(v_int)
    1675                         if u_int >= v_int or u_int not in vertices
    1676                             for l_int in self._cg.all_arcs(v_int, u_int)])
     1713            )))+(l,))
     1714            return iter(L)
    16771715        else:
    16781716            return iter([tuple(sorted(
    16791717            (vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg),
     
    17041742            [(1, 2, 3)]
    17051743
    17061744        """
    1707         cdef object v
     1745        cdef object v, L, l
    17081746        vertices = [get_vertex(v, self.vertex_ints, self.vertex_labels,
    17091747                    self._cg) for v in vertices if self.has_vertex(v)]
    17101748        cdef int u_int, v_int, l_int
    17111749        if self.multiple_edges(None):
    17121750            if labels:
    1713                 return iter([
     1751                L = []
     1752                for v_int in vertices:
     1753                    for u_int in self._cg_rev.out_neighbors(v_int):
     1754                        for l_int in self._cg.all_arcs(u_int, v_int):
     1755                            if l_int == 0:
     1756                                l = None
     1757                            else:
     1758                                l = self.edge_labels[l_int]
     1759                            L.append(
    17141760                (vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg),
    17151761                 vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg),
    1716                  self.edge_labels[l_int])
    1717                     for v_int in vertices
    1718                         for u_int in self._cg_rev.out_neighbors(v_int)
    1719                             for l_int in self._cg.all_arcs(u_int, v_int)])
     1762                 l))
     1763                return iter(L)
    17201764            else:
    17211765                return iter([
    17221766                (vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg),
     
    17261770                            for l_int in self._cg.all_arcs(u_int, v_int)])
    17271771        else:
    17281772            if labels:
    1729                 return iter([
     1773                L = []
     1774                for v_int in vertices:
     1775                    for u_int in self._cg_rev.out_neighbors(v_int):
     1776                        l_int = self._cg.arc_label(u_int, v_int)
     1777                        if l_int == 0:
     1778                            l = None
     1779                        else:
     1780                            l = self.edge_labels[l_int]
     1781                        L.append(
    17301782                (vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg),
    17311783                 vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg),
    1732                  self.edge_labels[self._cg.arc_label(u_int, v_int)])
    1733                     for v_int in vertices
    1734                         for u_int in self._cg_rev.out_neighbors(v_int)])
     1784                 l))
     1785                return iter(L)
    17351786            else:
    17361787                return iter([
    17371788                (vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg),
     
    17591810            [(1, 2, 3)]
    17601811
    17611812        """
    1762         cdef object u, v
     1813        cdef object u, v, L, l
    17631814        vertices = [get_vertex(v, self.vertex_ints, self.vertex_labels,
    17641815                    self._cg) for v in vertices if self.has_vertex(v)]
    17651816        cdef int u_int, v_int, l_int
    17661817        if self.multiple_edges(None):
    17671818            if labels:
    1768                 return iter([
     1819                L = []
     1820                for v_int in vertices:
     1821                    for u_int in self._cg.out_neighbors(v_int):
     1822                        for l_int in self._cg.all_arcs(v_int, u_int):
     1823                            if l_int == 0:
     1824                                l = None
     1825                            else:
     1826                                l = self.edge_labels[l_int]
     1827                            L.append(
    17691828                (vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg),
    17701829                 vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg),
    1771                  self.edge_labels[l_int])
    1772                     for v_int in vertices
    1773                         for u_int in self._cg.out_neighbors(v_int)
    1774                             for l_int in self._cg.all_arcs(v_int, u_int)])
     1830                 l))
     1831                return iter(L)
    17751832            else:
    17761833                return iter([
    17771834                (vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg),
     
    17811838                            for l_int in self._cg.all_arcs(v_int, u_int)])
    17821839        else:
    17831840            if labels:
    1784                 return iter([
     1841                L = []
     1842                for v_int in vertices:
     1843                    for u_int in self._cg.out_neighbors(v_int):
     1844                        l_int = self._cg.arc_label(v_int, u_int)
     1845                        if l_int == 0:
     1846                            l = None
     1847                        else:
     1848                            l = self.edge_labels[l_int]
     1849                        L.append(
    17851850                (vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg),
    17861851                 vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg),
    1787                  self.edge_labels[self._cg.arc_label(v_int, u_int)])
    1788                     for v_int in vertices
    1789                         for u_int in self._cg.out_neighbors(v_int)])
     1852                 l))
     1853                return iter(L)
    17901854            else:
    17911855                return iter([
    17921856                (vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg),
     
    18341898        EXAMPLE::
    18351899
    18361900            sage: G = sage.graphs.base.sparse_graph.SparseGraphBackend(9)
    1837             sage: G.add_edge(1,2,0,None)
     1901            sage: G.add_edge(1,2,None,True)
    18381902            sage: G.set_edge_label(1,2,'a',True)
    18391903            sage: list(G.iterator_edges(range(9), True))
    18401904            [(1, 2, 'a')]
     
    18521916            if len(self.get_edge_label(u, v)) > 1:
    18531917                raise RuntimeError("Cannot set edge label, since there are multiple edges from %s to %s."%(u,v))
    18541918        # now we know there is exactly one edge from u to v
    1855         cdef int l_int = check_edge_label(l, self.edge_labels), ll_int
    1856         if l_int not in self.edge_labels:
    1857             self.edge_labels[l_int] = l
     1919        cdef int l_int, ll_int
     1920        if l is None:
     1921            l_int = 0
     1922        else:
     1923            l_int = new_edge_label(l, self.edge_labels)
    18581924        cdef int u_int = get_vertex(u, self.vertex_ints, self.vertex_labels,
    18591925                      self._cg)
    18601926        cdef int v_int = get_vertex(v, self.vertex_ints, self.vertex_labels,
    18611927                      self._cg)
     1928        if not (<SparseGraph>self._cg).has_arc_unsafe(u_int, v_int):
     1929            return
    18621930        ll_int = (<SparseGraph>self._cg).arc_label_unsafe(u_int, v_int)
     1931        if ll_int:
     1932            self.edge_labels.pop(ll_int)
    18631933        if directed:
    18641934            self._cg.del_arc_label(u_int, v_int, ll_int)
    18651935            self._cg_rev.del_arc_label(v_int, u_int, ll_int)
  • sage/graphs/bipartite_graph.py

    diff -r d8e432f69c74 -r ff47d66a934a sage/graphs/bipartite_graph.py
    a b  
    964964            ...               if b != b2:
    965965            ...                   print "Load/save failed for code with edges:"
    966966            ...                   print b.edges()
    967             ...                   print b2.edges()
     967            ...                   break
    968968            ...           except:
    969969            ...               print "Exception encountered for graph of order "+ str(order)
    970970            ...               print "with edges: "
  • sage/graphs/generic_graph.py

    diff -r d8e432f69c74 -r ff47d66a934a sage/graphs/generic_graph.py
    a b  
    80958095            [None, None, None, None, None]
    80968096            sage: sorted(G.edge_label(0,1))
    80978097            [1, 2, 3, 4, 5]
     8098       
     8099        TESTS::
     8100       
     8101            sage: G = Graph()
     8102            sage: G.add_edge(0,1,[7])
     8103            sage: G.add_edge(0,2,[7])
     8104            sage: G.edge_label(0,1)[0] += 1
     8105            sage: G.edges()
     8106            [(0, 1, [8]), (0, 2, [7])]
     8107       
    80988108        """
    80998109        return self._backend.get_edge_label(u,v)
    81008110