# HG changeset patch
# User Nathann Cohen <nathann.cohen@gmail.com>
# Date 1302946654 -7200
# Node ID 45df855df2f78b8c5ca1ac36c8a3e94177666337
# Parent 4a146163550960311a01148224ec3563f93ca8aa
trac 11181 -- edge labels should be unique (reviewer's patch)
diff -r 4a1461635509 -r 45df855df2f7 sage/graphs/base/sparse_graph.pyx
a
|
b
|
|
1386 | 1386 | |
1387 | 1387 | cdef int new_edge_label(object l, dict edge_labels): |
1388 | 1388 | """ |
1389 | | Finds a new int representing the arbitrary label l. |
| 1389 | Returns a new unique int representing the arbitrary label l. |
1390 | 1390 | """ |
1391 | 1391 | if l is None: |
1392 | 1392 | return 0 |
… |
… |
|
1591 | 1591 | self._cg, self._cg_rev, self._directed) |
1592 | 1592 | cdef int v_int = check_vertex(v, self.vertex_ints, self.vertex_labels, |
1593 | 1593 | self._cg, self._cg_rev, self._directed) |
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 |
| 1594 | |
| 1595 | if l is None: |
| 1596 | if self._cg.has_arc_label(u_int, v_int, 0): |
| 1597 | l_int = 0 |
| 1598 | else: |
| 1599 | l_int = self._cg.arc_label(u_int, v_int) |
1597 | 1600 | 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 |
| 1601 | for l_int in self.edge_labels: |
| 1602 | if self.edge_labels[l_int] == l and self._cg.has_arc_label(u_int, v_int, l_int): |
| 1603 | break |
| 1604 | else: |
| 1605 | return |
| 1606 | |
1603 | 1607 | if directed: |
1604 | 1608 | self._cg.del_arc_label(u_int, v_int, l_int) |
1605 | 1609 | self._cg_rev.del_arc_label(v_int, u_int, l_int) |
| 1610 | if l_int: |
| 1611 | self.edge_labels.pop(l_int) |
1606 | 1612 | else: |
1607 | 1613 | self._cg.del_arc_label(u_int, v_int, l_int) |
1608 | 1614 | self._cg.del_arc_label(v_int, u_int, l_int) |
| 1615 | if l_int: |
| 1616 | self.edge_labels.pop(l_int) |
1609 | 1617 | |
1610 | 1618 | def get_edge_label(self, object u, object v): |
1611 | 1619 | """ |
… |
… |
|
1700 | 1708 | if labels: |
1701 | 1709 | L = [] |
1702 | 1710 | for v_int in vertices: |
| 1711 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
1703 | 1712 | for u_int in self._cg.out_neighbors(v_int): |
1704 | 1713 | if u_int >= v_int or u_int not in vertices: |
1705 | 1714 | for l_int in self._cg.all_arcs(v_int, u_int): |
… |
… |
|
1708 | 1717 | else: |
1709 | 1718 | l = self.edge_labels[l_int] |
1710 | 1719 | L.append(tuple(sorted( |
1711 | | (vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg), |
| 1720 | (v, |
1712 | 1721 | vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg) |
1713 | 1722 | )))+(l,)) |
1714 | 1723 | return iter(L) |
1715 | 1724 | else: |
1716 | | return iter([tuple(sorted( |
1717 | | (vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg), |
| 1725 | L = [] |
| 1726 | for v_int in vertices: |
| 1727 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
| 1728 | for u_int in self._cg.out_neighbors(v_int): |
| 1729 | if u_int >= v_int or u_int not in vertices: |
| 1730 | for l_int in self._cg.all_arcs(v_int, u_int): |
| 1731 | L.append(tuple(sorted( |
| 1732 | (v, |
1718 | 1733 | vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg) |
1719 | | ))) |
1720 | | for v_int in vertices |
1721 | | for u_int in self._cg.out_neighbors(v_int) |
1722 | | if u_int >= v_int or u_int not in vertices |
1723 | | for l_int in self._cg.all_arcs(v_int, u_int)]) |
| 1734 | )))) |
| 1735 | return iter(L) |
1724 | 1736 | |
1725 | 1737 | def iterator_in_edges(self, object vertices, bint labels): |
1726 | 1738 | """ |
… |
… |
|
1750 | 1762 | if labels: |
1751 | 1763 | L = [] |
1752 | 1764 | for v_int in vertices: |
| 1765 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
1753 | 1766 | for u_int in self._cg_rev.out_neighbors(v_int): |
1754 | 1767 | for l_int in self._cg.all_arcs(u_int, v_int): |
1755 | 1768 | if l_int == 0: |
… |
… |
|
1758 | 1771 | l = self.edge_labels[l_int] |
1759 | 1772 | L.append( |
1760 | 1773 | (vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg), |
1761 | | vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg), |
| 1774 | v, |
1762 | 1775 | l)) |
1763 | 1776 | return iter(L) |
1764 | 1777 | else: |
1765 | | return iter([ |
| 1778 | L = [] |
| 1779 | for v_int in vertices: |
| 1780 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
| 1781 | for u_int in self._cg_rev.out_neighbors(v_int): |
| 1782 | for l_int in self._cg.all_arcs(u_int, v_int): |
| 1783 | L.append( |
1766 | 1784 | (vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg), |
1767 | | vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg)) |
1768 | | for v_int in vertices |
1769 | | for u_int in self._cg_rev.out_neighbors(v_int) |
1770 | | for l_int in self._cg.all_arcs(u_int, v_int)]) |
| 1785 | v)) |
| 1786 | return iter(L) |
1771 | 1787 | else: |
1772 | 1788 | if labels: |
1773 | 1789 | L = [] |
1774 | 1790 | for v_int in vertices: |
| 1791 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
1775 | 1792 | for u_int in self._cg_rev.out_neighbors(v_int): |
1776 | 1793 | l_int = self._cg.arc_label(u_int, v_int) |
1777 | 1794 | if l_int == 0: |
… |
… |
|
1780 | 1797 | l = self.edge_labels[l_int] |
1781 | 1798 | L.append( |
1782 | 1799 | (vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg), |
1783 | | vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg), |
| 1800 | v, |
1784 | 1801 | l)) |
1785 | 1802 | return iter(L) |
1786 | 1803 | else: |
1787 | | return iter([ |
| 1804 | L = [] |
| 1805 | for v_int in vertices: |
| 1806 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
| 1807 | for u_int in self._cg_rev.out_neighbors(v_int): |
| 1808 | L.append( |
1788 | 1809 | (vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg), |
1789 | | vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg)) |
1790 | | for v_int in vertices |
1791 | | for u_int in self._cg_rev.out_neighbors(v_int)]) |
| 1810 | v)) |
| 1811 | return iter(L) |
1792 | 1812 | |
1793 | 1813 | def iterator_out_edges(self, object vertices, bint labels): |
1794 | 1814 | """ |
… |
… |
|
1818 | 1838 | if labels: |
1819 | 1839 | L = [] |
1820 | 1840 | for v_int in vertices: |
| 1841 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
1821 | 1842 | for u_int in self._cg.out_neighbors(v_int): |
1822 | 1843 | for l_int in self._cg.all_arcs(v_int, u_int): |
1823 | 1844 | if l_int == 0: |
… |
… |
|
1825 | 1846 | else: |
1826 | 1847 | l = self.edge_labels[l_int] |
1827 | 1848 | L.append( |
1828 | | (vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg), |
| 1849 | (v, |
1829 | 1850 | vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg), |
1830 | 1851 | l)) |
1831 | 1852 | return iter(L) |
1832 | 1853 | else: |
1833 | | return iter([ |
1834 | | (vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg), |
1835 | | vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)) |
1836 | | for v_int in vertices |
1837 | | for u_int in self._cg.out_neighbors(v_int) |
1838 | | for l_int in self._cg.all_arcs(v_int, u_int)]) |
| 1854 | L = [] |
| 1855 | for v_int in vertices: |
| 1856 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
| 1857 | for u_int in self._cg.out_neighbors(v_int): |
| 1858 | for l_int in self._cg.all_arcs(v_int, u_int): |
| 1859 | L.append( |
| 1860 | (v, |
| 1861 | vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg))) |
| 1862 | return iter(L) |
1839 | 1863 | else: |
1840 | 1864 | if labels: |
1841 | 1865 | L = [] |
1842 | 1866 | for v_int in vertices: |
| 1867 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
1843 | 1868 | for u_int in self._cg.out_neighbors(v_int): |
1844 | 1869 | l_int = self._cg.arc_label(v_int, u_int) |
1845 | 1870 | if l_int == 0: |
… |
… |
|
1847 | 1872 | else: |
1848 | 1873 | l = self.edge_labels[l_int] |
1849 | 1874 | L.append( |
1850 | | (vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg), |
| 1875 | (v, |
1851 | 1876 | vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg), |
1852 | 1877 | l)) |
1853 | 1878 | return iter(L) |
1854 | 1879 | else: |
1855 | | return iter([ |
1856 | | (vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg), |
1857 | | vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg)) |
1858 | | for v_int in vertices |
1859 | | for u_int in self._cg.out_neighbors(v_int)]) |
| 1880 | L = [] |
| 1881 | for v_int in vertices: |
| 1882 | v = vertex_label(v_int, self.vertex_ints, self.vertex_labels, self._cg) |
| 1883 | for u_int in self._cg.out_neighbors(v_int): |
| 1884 | L.append( |
| 1885 | (v, |
| 1886 | vertex_label(u_int, self.vertex_ints, self.vertex_labels, self._cg))) |
| 1887 | return iter(L) |
1860 | 1888 | |
1861 | 1889 | def multiple_edges(self, new): |
1862 | 1890 | """ |