# 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
|
|
1738 | 1738 | self._cg) |
1739 | 1739 | # Sparse |
1740 | 1740 | 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 | |
1746 | 1748 | # Dense |
1747 | 1749 | 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) |
1753 | 1755 | |
1754 | 1756 | def iterator_out_nbrs(self, v): |
1755 | 1757 | """ |
… |
… |
|
1782 | 1784 | self.vertex_ints, |
1783 | 1785 | self.vertex_labels, |
1784 | 1786 | 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) |
1790 | 1793 | |
1791 | 1794 | def iterator_verts(self, verts=None): |
1792 | 1795 | """ |
… |
… |
|
1827 | 1830 | cdef object v |
1828 | 1831 | if verts is None: |
1829 | 1832 | S = set(self.vertex_ints.iterkeys()) |
| 1833 | for v in S: |
| 1834 | yield v |
1830 | 1835 | for i from 0 <= i < (<CGraph>self._cg).active_vertices.size: |
1831 | 1836 | if (i not in self.vertex_labels and |
1832 | 1837 | 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 |
1835 | 1841 | is_hashable = False |
1836 | 1842 | try: |
1837 | 1843 | v = hash(verts) |
… |
… |
|
1839 | 1845 | except StandardError: |
1840 | 1846 | pass |
1841 | 1847 | if is_hashable and self.has_vertex(verts): |
1842 | | return iter([verts]) |
| 1848 | yield verts |
1843 | 1849 | else: |
1844 | | L = [] |
1845 | 1850 | for v in verts: |
1846 | 1851 | if self.has_vertex(v): |
1847 | | L.append(v) |
1848 | | return iter(L) |
| 1852 | yield v |
1849 | 1853 | |
1850 | 1854 | def loops(self, new=None): |
1851 | 1855 | """ |
diff --git a/sage/graphs/base/sparse_graph.pyx b/sage/graphs/base/sparse_graph.pyx
a
|
b
|
|
1831 | 1831 | [(1, 2, 3)] |
1832 | 1832 | |
1833 | 1833 | """ |
1834 | | cdef object v, l, L |
| 1834 | cdef object u, v, l |
1835 | 1835 | vertices = [get_vertex(v, self.vertex_ints, self.vertex_labels, |
1836 | 1836 | self._cg) for v in vertices if self.has_vertex(v)] |
1837 | 1837 | cdef int u_int, v_int, l_int |
1838 | 1838 | if labels: |
1839 | | L = [] |
1840 | 1839 | for v_int in vertices: |
1841 | 1840 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
1842 | 1841 | for u_int in self._cg.out_neighbors(v_int): |
… |
… |
|
1846 | 1845 | l = None |
1847 | 1846 | else: |
1848 | 1847 | 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 |
1854 | 1854 | else: |
1855 | | L = [] |
1856 | 1855 | for v_int in vertices: |
1857 | 1856 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
1858 | 1857 | for u_int in self._cg.out_neighbors(v_int): |
1859 | 1858 | if u_int >= v_int or u_int not in vertices: |
1860 | 1859 | 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 |
1866 | 1866 | |
1867 | 1867 | def iterator_in_edges(self, object vertices, bint labels): |
1868 | 1868 | """ |
… |
… |
|
1884 | 1884 | [(1, 2, 3)] |
1885 | 1885 | |
1886 | 1886 | """ |
1887 | | cdef object v, L, l |
| 1887 | cdef object u, v, l |
1888 | 1888 | vertices = [get_vertex(v, self.vertex_ints, self.vertex_labels, |
1889 | 1889 | self._cg) for v in vertices if self.has_vertex(v)] |
1890 | 1890 | cdef int u_int, v_int, l_int |
… |
… |
|
1899 | 1899 | l = None |
1900 | 1900 | else: |
1901 | 1901 | 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 |
1907 | 1905 | else: |
1908 | 1906 | L = [] |
1909 | 1907 | for v_int in vertices: |
1910 | 1908 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
1911 | 1909 | for u_int in self._cg_rev.out_neighbors(v_int): |
1912 | 1910 | 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 |
1917 | 1914 | else: |
1918 | 1915 | if labels: |
1919 | | L = [] |
1920 | 1916 | for v_int in vertices: |
1921 | 1917 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
1922 | 1918 | for u_int in self._cg_rev.out_neighbors(v_int): |
… |
… |
|
1925 | 1921 | l = None |
1926 | 1922 | else: |
1927 | 1923 | 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 |
1933 | 1927 | else: |
1934 | | L = [] |
1935 | 1928 | for v_int in vertices: |
1936 | 1929 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
1937 | 1930 | 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 |
1942 | 1934 | |
1943 | 1935 | def iterator_out_edges(self, object vertices, bint labels): |
1944 | 1936 | """ |
… |
… |
|
1960 | 1952 | [(1, 2, 3)] |
1961 | 1953 | |
1962 | 1954 | """ |
1963 | | cdef object u, v, L, l |
| 1955 | cdef object u, v, l |
1964 | 1956 | vertices = [get_vertex(v, self.vertex_ints, self.vertex_labels, |
1965 | 1957 | self._cg) for v in vertices if self.has_vertex(v)] |
1966 | 1958 | cdef int u_int, v_int, l_int |
… |
… |
|
1975 | 1967 | l = None |
1976 | 1968 | else: |
1977 | 1969 | 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 |
1983 | 1973 | else: |
1984 | 1974 | L = [] |
1985 | 1975 | for v_int in vertices: |
1986 | 1976 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
1987 | 1977 | for u_int in self._cg.out_neighbors(v_int): |
1988 | 1978 | 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 |
1993 | 1982 | else: |
1994 | 1983 | if labels: |
1995 | | L = [] |
1996 | 1984 | for v_int in vertices: |
1997 | 1985 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
1998 | 1986 | for u_int in self._cg.out_neighbors(v_int): |
… |
… |
|
2001 | 1989 | l = None |
2002 | 1990 | else: |
2003 | 1991 | 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 |
2009 | 1995 | else: |
2010 | 1996 | L = [] |
2011 | 1997 | for v_int in vertices: |
2012 | 1998 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
2013 | 1999 | 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 |
2018 | 2003 | |
2019 | 2004 | def multiple_edges(self, new): |
2020 | 2005 | """ |
diff --git a/sage/graphs/digraph.py b/sage/graphs/digraph.py
a
|
b
|
|
1142 | 1142 | 1 |
1143 | 1143 | 4 |
1144 | 1144 | """ |
1145 | | return iter(set(self._backend.iterator_in_nbrs(vertex))) |
| 1145 | return self._backend.iterator_in_nbrs(vertex) |
1146 | 1146 | |
1147 | 1147 | predecessor_iterator = deprecated_function_alias(7634, neighbor_in_iterator) |
1148 | 1148 | |
… |
… |
|
1177 | 1177 | 2 |
1178 | 1178 | 3 |
1179 | 1179 | """ |
1180 | | return iter(set(self._backend.iterator_out_nbrs(vertex))) |
| 1180 | return self._backend.iterator_out_nbrs(vertex) |
1181 | 1181 | |
1182 | 1182 | successor_iterator = deprecated_function_alias(7634, neighbor_out_iterator) |
1183 | 1183 | |
diff --git a/sage/graphs/generic_graph.py b/sage/graphs/generic_graph.py
a
|
b
|
|
7875 | 7875 | return iter(set(self.neighbor_out_iterator(vertex)) \ |
7876 | 7876 | | set(self.neighbor_in_iterator(vertex))) |
7877 | 7877 | else: |
7878 | | return iter(set(self._backend.iterator_nbrs(vertex))) |
| 7878 | return self._backend.iterator_nbrs(vertex) |
7879 | 7879 | |
7880 | 7880 | def vertices(self, key=None, boundary_first=False): |
7881 | 7881 | r""" |