Ticket #13730: trac_13730-v2-vd.patch

File trac_13730-v2-vd.patch, 12.5 KB (added by vdelecroix, 6 years ago)
  • sage/graphs/base/c_graph.pyx

    # HG changeset patch
    # User Vincent Delecroix <20100.delecroix at gmail.com>
    # Date 1370592939 -7200
    # Node ID fdcfc57ce1ef271765d1e58f6e0fdbde6e7815c6
    # Parent  16768eaa774a10ee080f972ed1a80ab32baeaad9
    trac 13730: slow iterator in graphs
    
    replace iter(set(iterator)) by return iterator in graph classes
    
    diff --git a/sage/graphs/base/c_graph.pyx b/sage/graphs/base/c_graph.pyx
    a b  
    17381738                                    self._cg)
    17391739        # Sparse
    17401740        if self._cg_rev is not None:
    1741             return iter([vertex_label(u_int,
    1742                                       self.vertex_ints,
    1743                                       self.vertex_labels,
    1744                                       self._cg)
    1745                          for u_int in self._cg_rev.out_neighbors(v_int)])
     1741            for u_int in self._cg_rev.out_neighbors(v_int):
     1742                yield vertex_label(u_int,
     1743                                    self.vertex_ints,
     1744                                    self.vertex_labels,
     1745                                    self._cg)
     1746            return
     1747
    17461748        # Dense
    17471749        else:
    1748             return iter([vertex_label(u_int,
    1749                                       self.vertex_ints,
    1750                                       self.vertex_labels,
    1751                                       self._cg)
    1752                          for u_int in self._cg.in_neighbors(v_int)])
     1750            for u_int in self._cg.in_neighbors(v_int):
     1751                yield vertex_label(u_int,
     1752                                   self.vertex_ints,
     1753                                   self.vertex_labels,
     1754                                   self._cg)
    17531755
    17541756    def iterator_out_nbrs(self, v):
    17551757        """
     
    17821784                                    self.vertex_ints,
    17831785                                    self.vertex_labels,
    17841786                                    self._cg)
    1785         return iter([vertex_label(u_int,
    1786                                   self.vertex_ints,
    1787                                   self.vertex_labels,
    1788                                   self._cg)
    1789                      for u_int in self._cg.out_neighbors(v_int)])
     1787
     1788        for u_int in self._cg.out_neighbors(v_int):
     1789            yield vertex_label(u_int,
     1790                               self.vertex_ints,
     1791                               self.vertex_labels,
     1792                               self._cg)
    17901793
    17911794    def iterator_verts(self, verts=None):
    17921795        """
     
    18271830        cdef object v
    18281831        if verts is None:
    18291832            S = set(self.vertex_ints.iterkeys())
     1833            for v in S:
     1834                yield v
    18301835            for i from 0 <= i < (<CGraph>self._cg).active_vertices.size:
    18311836                if (i not in self.vertex_labels and
    18321837                    bitset_in((<CGraph>self._cg).active_vertices, i)):
    1833                     S.add(i)
    1834             return iter(S)
     1838                    if i not in S:
     1839                        yield i
     1840            return
    18351841        is_hashable = False
    18361842        try:
    18371843            v = hash(verts)
     
    18391845        except StandardError:
    18401846            pass
    18411847        if is_hashable and self.has_vertex(verts):
    1842             return iter([verts])
     1848            yield verts
    18431849        else:
    1844             L = []
    18451850            for v in verts:
    18461851                if self.has_vertex(v):
    1847                     L.append(v)
    1848             return iter(L)
     1852                    yield v
    18491853
    18501854    def loops(self, new=None):
    18511855        """
  • sage/graphs/base/sparse_graph.pyx

    diff --git a/sage/graphs/base/sparse_graph.pyx b/sage/graphs/base/sparse_graph.pyx
    a b  
    18311831            [(1, 2, 3)]
    18321832
    18331833        """
    1834         cdef object v, l, L
     1834        cdef object u, v, l
    18351835        vertices = [get_vertex(v, self.vertex_ints, self.vertex_labels,
    18361836                    self._cg) for v in vertices if self.has_vertex(v)]
    18371837        cdef int u_int, v_int, l_int
    18381838        if labels:
    1839             L = []
    18401839            for v_int in vertices:
    18411840                v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg)
    18421841                for u_int in self._cg.out_neighbors(v_int):
     
    18461845                                l = None
    18471846                            else:
    18481847                                l = self.edge_labels[l_int]
    1849                             L.append(tuple(sorted(
    1850             (v,
    1851              vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)
    1852             )))+(l,))
    1853             return iter(L)
     1848                            u = vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)
     1849                            if v < u:
     1850                                yield (v,u,l)
     1851                            else:
     1852                                yield (u,v,l)
     1853            return
    18541854        else:
    1855             L = []
    18561855            for v_int in vertices:
    18571856                v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg)
    18581857                for u_int in self._cg.out_neighbors(v_int):
    18591858                    if u_int >= v_int or u_int not in vertices:
    18601859                        for l_int in self._cg.all_arcs(v_int, u_int):
    1861                             L.append(tuple(sorted(
    1862             (v,
    1863              vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)
    1864             ))))
    1865             return iter(L)
     1860                            u = vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)
     1861                            if v < u:
     1862                                yield (v,u)
     1863                            else:
     1864                                yield (u,v)
     1865            return
    18661866
    18671867    def iterator_in_edges(self, object vertices, bint labels):
    18681868        """
     
    18841884            [(1, 2, 3)]
    18851885
    18861886        """
    1887         cdef object v, L, l
     1887        cdef object u, v, l
    18881888        vertices = [get_vertex(v, self.vertex_ints, self.vertex_labels,
    18891889                    self._cg) for v in vertices if self.has_vertex(v)]
    18901890        cdef int u_int, v_int, l_int
     
    18991899                                l = None
    19001900                            else:
    19011901                                l = self.edge_labels[l_int]
    1902                             L.append(
    1903                 (vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg),
    1904                  v,
    1905                  l))
    1906                 return iter(L)
     1902                            u = vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)
     1903                            yield (u,v,l)
     1904                return
    19071905            else:
    19081906                L = []
    19091907                for v_int in vertices:
    19101908                    v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg)
    19111909                    for u_int in self._cg_rev.out_neighbors(v_int):
    19121910                        for l_int in self._cg.all_arcs(u_int, v_int):
    1913                             L.append(
    1914                 (vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg),
    1915                  v))
    1916                 return iter(L)
     1911                            u = vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)
     1912                            yield (u,v)
     1913                return
    19171914        else:
    19181915            if labels:
    1919                 L = []
    19201916                for v_int in vertices:
    19211917                    v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg)
    19221918                    for u_int in self._cg_rev.out_neighbors(v_int):
     
    19251921                            l = None
    19261922                        else:
    19271923                            l = self.edge_labels[l_int]
    1928                         L.append(
    1929                 (vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg),
    1930                  v,
    1931                  l))
    1932                 return iter(L)
     1924                        u = vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)
     1925                        yield (u,v,l)
     1926                return
    19331927            else:
    1934                 L = []
    19351928                for v_int in vertices:
    19361929                    v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg)
    19371930                    for u_int in self._cg_rev.out_neighbors(v_int):
    1938                         L.append(
    1939                 (vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg),
    1940                  v))
    1941                 return iter(L)
     1931                        u = vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)
     1932                        yield (u,v)
     1933                return
    19421934
    19431935    def iterator_out_edges(self, object vertices, bint labels):
    19441936        """
     
    19601952            [(1, 2, 3)]
    19611953
    19621954        """
    1963         cdef object u, v, L, l
     1955        cdef object u, v, l
    19641956        vertices = [get_vertex(v, self.vertex_ints, self.vertex_labels,
    19651957                    self._cg) for v in vertices if self.has_vertex(v)]
    19661958        cdef int u_int, v_int, l_int
     
    19751967                                l = None
    19761968                            else:
    19771969                                l = self.edge_labels[l_int]
    1978                             L.append(
    1979                 (v,
    1980                  vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg),
    1981                  l))
    1982                 return iter(L)
     1970                            u = vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)
     1971                            yield (v,u,l)
     1972                return
    19831973            else:
    19841974                L = []
    19851975                for v_int in vertices:
    19861976                    v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg)
    19871977                    for u_int in self._cg.out_neighbors(v_int):
    19881978                        for l_int in self._cg.all_arcs(v_int, u_int):
    1989                             L.append(
    1990                 (v,
    1991                  vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)))
    1992                 return iter(L)
     1979                            u = vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)
     1980                            yield (v,u)
     1981                return
    19931982        else:
    19941983            if labels:
    1995                 L = []
    19961984                for v_int in vertices:
    19971985                    v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg)
    19981986                    for u_int in self._cg.out_neighbors(v_int):
     
    20011989                            l = None
    20021990                        else:
    20031991                            l = self.edge_labels[l_int]
    2004                         L.append(
    2005                 (v,
    2006                  vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg),
    2007                  l))
    2008                 return iter(L)
     1992                        u = vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)
     1993                        yield (v,u,l)
     1994                return
    20091995            else:
    20101996                L = []
    20111997                for v_int in vertices:
    20121998                    v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg)
    20131999                    for u_int in self._cg.out_neighbors(v_int):
    2014                         L.append(
    2015                 (v,
    2016                  vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)))
    2017                 return iter(L)
     2000                        u = vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)
     2001                        yield (v,u)
     2002                return
    20182003
    20192004    def multiple_edges(self, new):
    20202005        """
  • sage/graphs/digraph.py

    diff --git a/sage/graphs/digraph.py b/sage/graphs/digraph.py
    a b  
    11421142            1
    11431143            4
    11441144        """
    1145         return iter(set(self._backend.iterator_in_nbrs(vertex)))
     1145        return self._backend.iterator_in_nbrs(vertex)
    11461146
    11471147    predecessor_iterator = deprecated_function_alias(7634, neighbor_in_iterator)
    11481148
     
    11771177            2
    11781178            3
    11791179        """
    1180         return iter(set(self._backend.iterator_out_nbrs(vertex)))
     1180        return self._backend.iterator_out_nbrs(vertex)
    11811181
    11821182    successor_iterator = deprecated_function_alias(7634, neighbor_out_iterator)
    11831183
  • sage/graphs/generic_graph.py

    diff --git a/sage/graphs/generic_graph.py b/sage/graphs/generic_graph.py
    a b  
    78757875            return iter(set(self.neighbor_out_iterator(vertex)) \
    78767876                    | set(self.neighbor_in_iterator(vertex)))
    78777877        else:
    7878             return iter(set(self._backend.iterator_nbrs(vertex)))
     7878            return self._backend.iterator_nbrs(vertex)
    78797879
    78807880    def vertices(self, key=None, boundary_first=False):
    78817881        r"""