0
2
0
| ... | ... |
@@ -1658,789 +1658,384 @@ |
| 1658 | 1658 |
/// This function just returns an \ref LessMap class. |
| 1659 | 1659 |
/// |
| 1660 | 1660 |
/// For example, if \c m1 and \c m2 are maps with keys and values of |
| 1661 | 1661 |
/// the same type, then <tt>lessMap(m1,m2)[x]</tt> will be equal to |
| 1662 | 1662 |
/// <tt>m1[x]<m2[x]</tt>. |
| 1663 | 1663 |
/// |
| 1664 | 1664 |
/// \relates LessMap |
| 1665 | 1665 |
template<typename M1, typename M2> |
| 1666 | 1666 |
inline LessMap<M1, M2> lessMap(const M1 &m1, const M2 &m2) {
|
| 1667 | 1667 |
return LessMap<M1, M2>(m1,m2); |
| 1668 | 1668 |
} |
| 1669 | 1669 |
|
| 1670 | 1670 |
namespace _maps_bits {
|
| 1671 | 1671 |
|
| 1672 | 1672 |
template <typename _Iterator, typename Enable = void> |
| 1673 | 1673 |
struct IteratorTraits {
|
| 1674 | 1674 |
typedef typename std::iterator_traits<_Iterator>::value_type Value; |
| 1675 | 1675 |
}; |
| 1676 | 1676 |
|
| 1677 | 1677 |
template <typename _Iterator> |
| 1678 | 1678 |
struct IteratorTraits<_Iterator, |
| 1679 | 1679 |
typename exists<typename _Iterator::container_type>::type> |
| 1680 | 1680 |
{
|
| 1681 | 1681 |
typedef typename _Iterator::container_type::value_type Value; |
| 1682 | 1682 |
}; |
| 1683 | 1683 |
|
| 1684 | 1684 |
} |
| 1685 | 1685 |
|
| 1686 | 1686 |
/// \brief Writable bool map for logging each \c true assigned element |
| 1687 | 1687 |
/// |
| 1688 | 1688 |
/// A \ref concepts::WriteMap "writable" bool map for logging |
| 1689 | 1689 |
/// each \c true assigned element, i.e it copies subsequently each |
| 1690 | 1690 |
/// keys set to \c true to the given iterator. |
| 1691 | 1691 |
/// The most important usage of it is storing certain nodes or arcs |
| 1692 | 1692 |
/// that were marked \c true by an algorithm. |
| 1693 | 1693 |
/// |
| 1694 | 1694 |
/// There are several algorithms that provide solutions through bool |
| 1695 | 1695 |
/// maps and most of them assign \c true at most once for each key. |
| 1696 | 1696 |
/// In these cases it is a natural request to store each \c true |
| 1697 | 1697 |
/// assigned elements (in order of the assignment), which can be |
| 1698 | 1698 |
/// easily done with LoggerBoolMap. |
| 1699 | 1699 |
/// |
| 1700 | 1700 |
/// The simplest way of using this map is through the loggerBoolMap() |
| 1701 | 1701 |
/// function. |
| 1702 | 1702 |
/// |
| 1703 | 1703 |
/// \tparam It The type of the iterator. |
| 1704 | 1704 |
/// \tparam Ke The key type of the map. The default value set |
| 1705 | 1705 |
/// according to the iterator type should work in most cases. |
| 1706 | 1706 |
/// |
| 1707 | 1707 |
/// \note The container of the iterator must contain enough space |
| 1708 | 1708 |
/// for the elements or the iterator should be an inserter iterator. |
| 1709 | 1709 |
#ifdef DOXYGEN |
| 1710 | 1710 |
template <typename It, typename Ke> |
| 1711 | 1711 |
#else |
| 1712 | 1712 |
template <typename It, |
| 1713 | 1713 |
typename Ke=typename _maps_bits::IteratorTraits<It>::Value> |
| 1714 | 1714 |
#endif |
| 1715 | 1715 |
class LoggerBoolMap {
|
| 1716 | 1716 |
public: |
| 1717 | 1717 |
typedef It Iterator; |
| 1718 | 1718 |
|
| 1719 | 1719 |
typedef Ke Key; |
| 1720 | 1720 |
typedef bool Value; |
| 1721 | 1721 |
|
| 1722 | 1722 |
/// Constructor |
| 1723 | 1723 |
LoggerBoolMap(Iterator it) |
| 1724 | 1724 |
: _begin(it), _end(it) {}
|
| 1725 | 1725 |
|
| 1726 | 1726 |
/// Gives back the given iterator set for the first key |
| 1727 | 1727 |
Iterator begin() const {
|
| 1728 | 1728 |
return _begin; |
| 1729 | 1729 |
} |
| 1730 | 1730 |
|
| 1731 | 1731 |
/// Gives back the the 'after the last' iterator |
| 1732 | 1732 |
Iterator end() const {
|
| 1733 | 1733 |
return _end; |
| 1734 | 1734 |
} |
| 1735 | 1735 |
|
| 1736 | 1736 |
/// The set function of the map |
| 1737 | 1737 |
void set(const Key& key, Value value) {
|
| 1738 | 1738 |
if (value) {
|
| 1739 | 1739 |
*_end++ = key; |
| 1740 | 1740 |
} |
| 1741 | 1741 |
} |
| 1742 | 1742 |
|
| 1743 | 1743 |
private: |
| 1744 | 1744 |
Iterator _begin; |
| 1745 | 1745 |
Iterator _end; |
| 1746 | 1746 |
}; |
| 1747 | 1747 |
|
| 1748 | 1748 |
/// Returns a \ref LoggerBoolMap class |
| 1749 | 1749 |
|
| 1750 | 1750 |
/// This function just returns a \ref LoggerBoolMap class. |
| 1751 | 1751 |
/// |
| 1752 | 1752 |
/// The most important usage of it is storing certain nodes or arcs |
| 1753 | 1753 |
/// that were marked \c true by an algorithm. |
| 1754 | 1754 |
/// For example it makes easier to store the nodes in the processing |
| 1755 | 1755 |
/// order of Dfs algorithm, as the following examples show. |
| 1756 | 1756 |
/// \code |
| 1757 | 1757 |
/// std::vector<Node> v; |
| 1758 | 1758 |
/// dfs(g,s).processedMap(loggerBoolMap(std::back_inserter(v))).run(); |
| 1759 | 1759 |
/// \endcode |
| 1760 | 1760 |
/// \code |
| 1761 | 1761 |
/// std::vector<Node> v(countNodes(g)); |
| 1762 | 1762 |
/// dfs(g,s).processedMap(loggerBoolMap(v.begin())).run(); |
| 1763 | 1763 |
/// \endcode |
| 1764 | 1764 |
/// |
| 1765 | 1765 |
/// \note The container of the iterator must contain enough space |
| 1766 | 1766 |
/// for the elements or the iterator should be an inserter iterator. |
| 1767 | 1767 |
/// |
| 1768 | 1768 |
/// \note LoggerBoolMap is just \ref concepts::WriteMap "writable", so |
| 1769 | 1769 |
/// it cannot be used when a readable map is needed, for example as |
| 1770 | 1770 |
/// \c ReachedMap for \ref Bfs, \ref Dfs and \ref Dijkstra algorithms. |
| 1771 | 1771 |
/// |
| 1772 | 1772 |
/// \relates LoggerBoolMap |
| 1773 | 1773 |
template<typename Iterator> |
| 1774 | 1774 |
inline LoggerBoolMap<Iterator> loggerBoolMap(Iterator it) {
|
| 1775 | 1775 |
return LoggerBoolMap<Iterator>(it); |
| 1776 | 1776 |
} |
| 1777 | 1777 |
|
| 1778 | 1778 |
/// Provides an immutable and unique id for each item in the graph. |
| 1779 | 1779 |
|
| 1780 | 1780 |
/// The IdMap class provides a unique and immutable id for each item of the |
| 1781 | 1781 |
/// same type (e.g. node) in the graph. This id is <ul><li>\b unique: |
| 1782 | 1782 |
/// different items (nodes) get different ids <li>\b immutable: the id of an |
| 1783 | 1783 |
/// item (node) does not change (even if you delete other nodes). </ul> |
| 1784 | 1784 |
/// Through this map you get access (i.e. can read) the inner id values of |
| 1785 | 1785 |
/// the items stored in the graph. This map can be inverted with its member |
| 1786 | 1786 |
/// class \c InverseMap or with the \c operator() member. |
| 1787 | 1787 |
/// |
| 1788 | 1788 |
template <typename _Graph, typename _Item> |
| 1789 | 1789 |
class IdMap {
|
| 1790 | 1790 |
public: |
| 1791 | 1791 |
typedef _Graph Graph; |
| 1792 | 1792 |
typedef int Value; |
| 1793 | 1793 |
typedef _Item Item; |
| 1794 | 1794 |
typedef _Item Key; |
| 1795 | 1795 |
|
| 1796 | 1796 |
/// \brief Constructor. |
| 1797 | 1797 |
/// |
| 1798 | 1798 |
/// Constructor of the map. |
| 1799 | 1799 |
explicit IdMap(const Graph& graph) : _graph(&graph) {}
|
| 1800 | 1800 |
|
| 1801 | 1801 |
/// \brief Gives back the \e id of the item. |
| 1802 | 1802 |
/// |
| 1803 | 1803 |
/// Gives back the immutable and unique \e id of the item. |
| 1804 | 1804 |
int operator[](const Item& item) const { return _graph->id(item);}
|
| 1805 | 1805 |
|
| 1806 | 1806 |
/// \brief Gives back the item by its id. |
| 1807 | 1807 |
/// |
| 1808 | 1808 |
/// Gives back the item by its id. |
| 1809 | 1809 |
Item operator()(int id) { return _graph->fromId(id, Item()); }
|
| 1810 | 1810 |
|
| 1811 | 1811 |
private: |
| 1812 | 1812 |
const Graph* _graph; |
| 1813 | 1813 |
|
| 1814 | 1814 |
public: |
| 1815 | 1815 |
|
| 1816 | 1816 |
/// \brief The class represents the inverse of its owner (IdMap). |
| 1817 | 1817 |
/// |
| 1818 | 1818 |
/// The class represents the inverse of its owner (IdMap). |
| 1819 | 1819 |
/// \see inverse() |
| 1820 | 1820 |
class InverseMap {
|
| 1821 | 1821 |
public: |
| 1822 | 1822 |
|
| 1823 | 1823 |
/// \brief Constructor. |
| 1824 | 1824 |
/// |
| 1825 | 1825 |
/// Constructor for creating an id-to-item map. |
| 1826 | 1826 |
explicit InverseMap(const Graph& graph) : _graph(&graph) {}
|
| 1827 | 1827 |
|
| 1828 | 1828 |
/// \brief Constructor. |
| 1829 | 1829 |
/// |
| 1830 | 1830 |
/// Constructor for creating an id-to-item map. |
| 1831 | 1831 |
explicit InverseMap(const IdMap& map) : _graph(map._graph) {}
|
| 1832 | 1832 |
|
| 1833 | 1833 |
/// \brief Gives back the given item from its id. |
| 1834 | 1834 |
/// |
| 1835 | 1835 |
/// Gives back the given item from its id. |
| 1836 | 1836 |
/// |
| 1837 | 1837 |
Item operator[](int id) const { return _graph->fromId(id, Item());}
|
| 1838 | 1838 |
|
| 1839 | 1839 |
private: |
| 1840 | 1840 |
const Graph* _graph; |
| 1841 | 1841 |
}; |
| 1842 | 1842 |
|
| 1843 | 1843 |
/// \brief Gives back the inverse of the map. |
| 1844 | 1844 |
/// |
| 1845 | 1845 |
/// Gives back the inverse of the IdMap. |
| 1846 | 1846 |
InverseMap inverse() const { return InverseMap(*_graph);}
|
| 1847 | 1847 |
|
| 1848 | 1848 |
}; |
| 1849 | 1849 |
|
| 1850 |
|
|
| 1851 |
/// \brief General invertable graph-map type. |
|
| 1852 |
|
|
| 1853 |
/// This type provides simple invertable graph-maps. |
|
| 1854 |
/// The InvertableMap wraps an arbitrary ReadWriteMap |
|
| 1855 |
/// and if a key is set to a new value then store it |
|
| 1856 |
/// in the inverse map. |
|
| 1857 |
/// |
|
| 1858 |
/// The values of the map can be accessed |
|
| 1859 |
/// with stl compatible forward iterator. |
|
| 1860 |
/// |
|
| 1861 |
/// \tparam _Graph The graph type. |
|
| 1862 |
/// \tparam _Item The item type of the graph. |
|
| 1863 |
/// \tparam _Value The value type of the map. |
|
| 1864 |
/// |
|
| 1865 |
/// \see IterableValueMap |
|
| 1866 |
template <typename _Graph, typename _Item, typename _Value> |
|
| 1867 |
class InvertableMap |
|
| 1868 |
: protected ItemSetTraits<_Graph, _Item>::template Map<_Value>::Type {
|
|
| 1869 |
private: |
|
| 1870 |
|
|
| 1871 |
typedef typename ItemSetTraits<_Graph, _Item>:: |
|
| 1872 |
template Map<_Value>::Type Map; |
|
| 1873 |
typedef _Graph Graph; |
|
| 1874 |
|
|
| 1875 |
typedef std::map<_Value, _Item> Container; |
|
| 1876 |
Container _inv_map; |
|
| 1877 |
|
|
| 1878 |
public: |
|
| 1879 |
|
|
| 1880 |
/// The key type of InvertableMap (Node, Arc, Edge). |
|
| 1881 |
typedef typename Map::Key Key; |
|
| 1882 |
/// The value type of the InvertableMap. |
|
| 1883 |
typedef typename Map::Value Value; |
|
| 1884 |
|
|
| 1885 |
|
|
| 1886 |
|
|
| 1887 |
/// \brief Constructor. |
|
| 1888 |
/// |
|
| 1889 |
/// Construct a new InvertableMap for the graph. |
|
| 1890 |
/// |
|
| 1891 |
explicit InvertableMap(const Graph& graph) : Map(graph) {}
|
|
| 1892 |
|
|
| 1893 |
/// \brief Forward iterator for values. |
|
| 1894 |
/// |
|
| 1895 |
/// This iterator is an stl compatible forward |
|
| 1896 |
/// iterator on the values of the map. The values can |
|
| 1897 |
/// be accessed in the [beginValue, endValue) range. |
|
| 1898 |
/// |
|
| 1899 |
class ValueIterator |
|
| 1900 |
: public std::iterator<std::forward_iterator_tag, Value> {
|
|
| 1901 |
friend class InvertableMap; |
|
| 1902 |
private: |
|
| 1903 |
ValueIterator(typename Container::const_iterator _it) |
|
| 1904 |
: it(_it) {}
|
|
| 1905 |
public: |
|
| 1906 |
|
|
| 1907 |
ValueIterator() {}
|
|
| 1908 |
|
|
| 1909 |
ValueIterator& operator++() { ++it; return *this; }
|
|
| 1910 |
ValueIterator operator++(int) {
|
|
| 1911 |
ValueIterator tmp(*this); |
|
| 1912 |
operator++(); |
|
| 1913 |
return tmp; |
|
| 1914 |
} |
|
| 1915 |
|
|
| 1916 |
const Value& operator*() const { return it->first; }
|
|
| 1917 |
const Value* operator->() const { return &(it->first); }
|
|
| 1918 |
|
|
| 1919 |
bool operator==(ValueIterator jt) const { return it == jt.it; }
|
|
| 1920 |
bool operator!=(ValueIterator jt) const { return it != jt.it; }
|
|
| 1921 |
|
|
| 1922 |
private: |
|
| 1923 |
typename Container::const_iterator it; |
|
| 1924 |
}; |
|
| 1925 |
|
|
| 1926 |
/// \brief Returns an iterator to the first value. |
|
| 1927 |
/// |
|
| 1928 |
/// Returns an stl compatible iterator to the |
|
| 1929 |
/// first value of the map. The values of the |
|
| 1930 |
/// map can be accessed in the [beginValue, endValue) |
|
| 1931 |
/// range. |
|
| 1932 |
ValueIterator beginValue() const {
|
|
| 1933 |
return ValueIterator(_inv_map.begin()); |
|
| 1934 |
} |
|
| 1935 |
|
|
| 1936 |
/// \brief Returns an iterator after the last value. |
|
| 1937 |
/// |
|
| 1938 |
/// Returns an stl compatible iterator after the |
|
| 1939 |
/// last value of the map. The values of the |
|
| 1940 |
/// map can be accessed in the [beginValue, endValue) |
|
| 1941 |
/// range. |
|
| 1942 |
ValueIterator endValue() const {
|
|
| 1943 |
return ValueIterator(_inv_map.end()); |
|
| 1944 |
} |
|
| 1945 |
|
|
| 1946 |
/// \brief The setter function of the map. |
|
| 1947 |
/// |
|
| 1948 |
/// Sets the mapped value. |
|
| 1949 |
void set(const Key& key, const Value& val) {
|
|
| 1950 |
Value oldval = Map::operator[](key); |
|
| 1951 |
typename Container::iterator it = _inv_map.find(oldval); |
|
| 1952 |
if (it != _inv_map.end() && it->second == key) {
|
|
| 1953 |
_inv_map.erase(it); |
|
| 1954 |
} |
|
| 1955 |
_inv_map.insert(make_pair(val, key)); |
|
| 1956 |
Map::set(key, val); |
|
| 1957 |
} |
|
| 1958 |
|
|
| 1959 |
/// \brief The getter function of the map. |
|
| 1960 |
/// |
|
| 1961 |
/// It gives back the value associated with the key. |
|
| 1962 |
typename MapTraits<Map>::ConstReturnValue |
|
| 1963 |
operator[](const Key& key) const {
|
|
| 1964 |
return Map::operator[](key); |
|
| 1965 |
} |
|
| 1966 |
|
|
| 1967 |
/// \brief Gives back the item by its value. |
|
| 1968 |
/// |
|
| 1969 |
/// Gives back the item by its value. |
|
| 1970 |
Key operator()(const Value& key) const {
|
|
| 1971 |
typename Container::const_iterator it = _inv_map.find(key); |
|
| 1972 |
return it != _inv_map.end() ? it->second : INVALID; |
|
| 1973 |
} |
|
| 1974 |
|
|
| 1975 |
protected: |
|
| 1976 |
|
|
| 1977 |
/// \brief Erase the key from the map. |
|
| 1978 |
/// |
|
| 1979 |
/// Erase the key to the map. It is called by the |
|
| 1980 |
/// \c AlterationNotifier. |
|
| 1981 |
virtual void erase(const Key& key) {
|
|
| 1982 |
Value val = Map::operator[](key); |
|
| 1983 |
typename Container::iterator it = _inv_map.find(val); |
|
| 1984 |
if (it != _inv_map.end() && it->second == key) {
|
|
| 1985 |
_inv_map.erase(it); |
|
| 1986 |
} |
|
| 1987 |
Map::erase(key); |
|
| 1988 |
} |
|
| 1989 |
|
|
| 1990 |
/// \brief Erase more keys from the map. |
|
| 1991 |
/// |
|
| 1992 |
/// Erase more keys from the map. It is called by the |
|
| 1993 |
/// \c AlterationNotifier. |
|
| 1994 |
virtual void erase(const std::vector<Key>& keys) {
|
|
| 1995 |
for (int i = 0; i < int(keys.size()); ++i) {
|
|
| 1996 |
Value val = Map::operator[](keys[i]); |
|
| 1997 |
typename Container::iterator it = _inv_map.find(val); |
|
| 1998 |
if (it != _inv_map.end() && it->second == keys[i]) {
|
|
| 1999 |
_inv_map.erase(it); |
|
| 2000 |
} |
|
| 2001 |
} |
|
| 2002 |
Map::erase(keys); |
|
| 2003 |
} |
|
| 2004 |
|
|
| 2005 |
/// \brief Clear the keys from the map and inverse map. |
|
| 2006 |
/// |
|
| 2007 |
/// Clear the keys from the map and inverse map. It is called by the |
|
| 2008 |
/// \c AlterationNotifier. |
|
| 2009 |
virtual void clear() {
|
|
| 2010 |
_inv_map.clear(); |
|
| 2011 |
Map::clear(); |
|
| 2012 |
} |
|
| 2013 |
|
|
| 2014 |
public: |
|
| 2015 |
|
|
| 2016 |
/// \brief The inverse map type. |
|
| 2017 |
/// |
|
| 2018 |
/// The inverse of this map. The subscript operator of the map |
|
| 2019 |
/// gives back always the item what was last assigned to the value. |
|
| 2020 |
class InverseMap {
|
|
| 2021 |
public: |
|
| 2022 |
/// \brief Constructor of the InverseMap. |
|
| 2023 |
/// |
|
| 2024 |
/// Constructor of the InverseMap. |
|
| 2025 |
explicit InverseMap(const InvertableMap& inverted) |
|
| 2026 |
: _inverted(inverted) {}
|
|
| 2027 |
|
|
| 2028 |
/// The value type of the InverseMap. |
|
| 2029 |
typedef typename InvertableMap::Key Value; |
|
| 2030 |
/// The key type of the InverseMap. |
|
| 2031 |
typedef typename InvertableMap::Value Key; |
|
| 2032 |
|
|
| 2033 |
/// \brief Subscript operator. |
|
| 2034 |
/// |
|
| 2035 |
/// Subscript operator. It gives back always the item |
|
| 2036 |
/// what was last assigned to the value. |
|
| 2037 |
Value operator[](const Key& key) const {
|
|
| 2038 |
return _inverted(key); |
|
| 2039 |
} |
|
| 2040 |
|
|
| 2041 |
private: |
|
| 2042 |
const InvertableMap& _inverted; |
|
| 2043 |
}; |
|
| 2044 |
|
|
| 2045 |
/// \brief It gives back the just readable inverse map. |
|
| 2046 |
/// |
|
| 2047 |
/// It gives back the just readable inverse map. |
|
| 2048 |
InverseMap inverse() const {
|
|
| 2049 |
return InverseMap(*this); |
|
| 2050 |
} |
|
| 2051 |
|
|
| 2052 |
|
|
| 2053 |
|
|
| 2054 |
}; |
|
| 2055 |
|
|
| 2056 |
/// \brief Provides a mutable, continuous and unique descriptor for each |
|
| 2057 |
/// item in the graph. |
|
| 2058 |
/// |
|
| 2059 |
/// The DescriptorMap class provides a unique and continuous (but mutable) |
|
| 2060 |
/// descriptor (id) for each item of the same type (e.g. node) in the |
|
| 2061 |
/// graph. This id is <ul><li>\b unique: different items (nodes) get |
|
| 2062 |
/// different ids <li>\b continuous: the range of the ids is the set of |
|
| 2063 |
/// integers between 0 and \c n-1, where \c n is the number of the items of |
|
| 2064 |
/// this type (e.g. nodes) (so the id of a node can change if you delete an |
|
| 2065 |
/// other node, i.e. this id is mutable). </ul> This map can be inverted |
|
| 2066 |
/// with its member class \c InverseMap, or with the \c operator() member. |
|
| 2067 |
/// |
|
| 2068 |
/// \tparam _Graph The graph class the \c DescriptorMap belongs to. |
|
| 2069 |
/// \tparam _Item The Item is the Key of the Map. It may be Node, Arc or |
|
| 2070 |
/// Edge. |
|
| 2071 |
template <typename _Graph, typename _Item> |
|
| 2072 |
class DescriptorMap |
|
| 2073 |
: protected ItemSetTraits<_Graph, _Item>::template Map<int>::Type {
|
|
| 2074 |
|
|
| 2075 |
typedef _Item Item; |
|
| 2076 |
typedef typename ItemSetTraits<_Graph, _Item>::template Map<int>::Type Map; |
|
| 2077 |
|
|
| 2078 |
public: |
|
| 2079 |
/// The graph class of DescriptorMap. |
|
| 2080 |
typedef _Graph Graph; |
|
| 2081 |
|
|
| 2082 |
/// The key type of DescriptorMap (Node, Arc, Edge). |
|
| 2083 |
typedef typename Map::Key Key; |
|
| 2084 |
/// The value type of DescriptorMap. |
|
| 2085 |
typedef typename Map::Value Value; |
|
| 2086 |
|
|
| 2087 |
/// \brief Constructor. |
|
| 2088 |
/// |
|
| 2089 |
/// Constructor for descriptor map. |
|
| 2090 |
explicit DescriptorMap(const Graph& _graph) : Map(_graph) {
|
|
| 2091 |
Item it; |
|
| 2092 |
const typename Map::Notifier* nf = Map::notifier(); |
|
| 2093 |
for (nf->first(it); it != INVALID; nf->next(it)) {
|
|
| 2094 |
Map::set(it, _inv_map.size()); |
|
| 2095 |
_inv_map.push_back(it); |
|
| 2096 |
} |
|
| 2097 |
} |
|
| 2098 |
|
|
| 2099 |
protected: |
|
| 2100 |
|
|
| 2101 |
/// \brief Add a new key to the map. |
|
| 2102 |
/// |
|
| 2103 |
/// Add a new key to the map. It is called by the |
|
| 2104 |
/// \c AlterationNotifier. |
|
| 2105 |
virtual void add(const Item& item) {
|
|
| 2106 |
Map::add(item); |
|
| 2107 |
Map::set(item, _inv_map.size()); |
|
| 2108 |
_inv_map.push_back(item); |
|
| 2109 |
} |
|
| 2110 |
|
|
| 2111 |
/// \brief Add more new keys to the map. |
|
| 2112 |
/// |
|
| 2113 |
/// Add more new keys to the map. It is called by the |
|
| 2114 |
/// \c AlterationNotifier. |
|
| 2115 |
virtual void add(const std::vector<Item>& items) {
|
|
| 2116 |
Map::add(items); |
|
| 2117 |
for (int i = 0; i < int(items.size()); ++i) {
|
|
| 2118 |
Map::set(items[i], _inv_map.size()); |
|
| 2119 |
_inv_map.push_back(items[i]); |
|
| 2120 |
} |
|
| 2121 |
} |
|
| 2122 |
|
|
| 2123 |
/// \brief Erase the key from the map. |
|
| 2124 |
/// |
|
| 2125 |
/// Erase the key from the map. It is called by the |
|
| 2126 |
/// \c AlterationNotifier. |
|
| 2127 |
virtual void erase(const Item& item) {
|
|
| 2128 |
Map::set(_inv_map.back(), Map::operator[](item)); |
|
| 2129 |
_inv_map[Map::operator[](item)] = _inv_map.back(); |
|
| 2130 |
_inv_map.pop_back(); |
|
| 2131 |
Map::erase(item); |
|
| 2132 |
} |
|
| 2133 |
|
|
| 2134 |
/// \brief Erase more keys from the map. |
|
| 2135 |
/// |
|
| 2136 |
/// Erase more keys from the map. It is called by the |
|
| 2137 |
/// \c AlterationNotifier. |
|
| 2138 |
virtual void erase(const std::vector<Item>& items) {
|
|
| 2139 |
for (int i = 0; i < int(items.size()); ++i) {
|
|
| 2140 |
Map::set(_inv_map.back(), Map::operator[](items[i])); |
|
| 2141 |
_inv_map[Map::operator[](items[i])] = _inv_map.back(); |
|
| 2142 |
_inv_map.pop_back(); |
|
| 2143 |
} |
|
| 2144 |
Map::erase(items); |
|
| 2145 |
} |
|
| 2146 |
|
|
| 2147 |
/// \brief Build the unique map. |
|
| 2148 |
/// |
|
| 2149 |
/// Build the unique map. It is called by the |
|
| 2150 |
/// \c AlterationNotifier. |
|
| 2151 |
virtual void build() {
|
|
| 2152 |
Map::build(); |
|
| 2153 |
Item it; |
|
| 2154 |
const typename Map::Notifier* nf = Map::notifier(); |
|
| 2155 |
for (nf->first(it); it != INVALID; nf->next(it)) {
|
|
| 2156 |
Map::set(it, _inv_map.size()); |
|
| 2157 |
_inv_map.push_back(it); |
|
| 2158 |
} |
|
| 2159 |
} |
|
| 2160 |
|
|
| 2161 |
/// \brief Clear the keys from the map. |
|
| 2162 |
/// |
|
| 2163 |
/// Clear the keys from the map. It is called by the |
|
| 2164 |
/// \c AlterationNotifier. |
|
| 2165 |
virtual void clear() {
|
|
| 2166 |
_inv_map.clear(); |
|
| 2167 |
Map::clear(); |
|
| 2168 |
} |
|
| 2169 |
|
|
| 2170 |
public: |
|
| 2171 |
|
|
| 2172 |
/// \brief Returns the maximal value plus one. |
|
| 2173 |
/// |
|
| 2174 |
/// Returns the maximal value plus one in the map. |
|
| 2175 |
unsigned int size() const {
|
|
| 2176 |
return _inv_map.size(); |
|
| 2177 |
} |
|
| 2178 |
|
|
| 2179 |
/// \brief Swaps the position of the two items in the map. |
|
| 2180 |
/// |
|
| 2181 |
/// Swaps the position of the two items in the map. |
|
| 2182 |
void swap(const Item& p, const Item& q) {
|
|
| 2183 |
int pi = Map::operator[](p); |
|
| 2184 |
int qi = Map::operator[](q); |
|
| 2185 |
Map::set(p, qi); |
|
| 2186 |
_inv_map[qi] = p; |
|
| 2187 |
Map::set(q, pi); |
|
| 2188 |
_inv_map[pi] = q; |
|
| 2189 |
} |
|
| 2190 |
|
|
| 2191 |
/// \brief Gives back the \e descriptor of the item. |
|
| 2192 |
/// |
|
| 2193 |
/// Gives back the mutable and unique \e descriptor of the map. |
|
| 2194 |
int operator[](const Item& item) const {
|
|
| 2195 |
return Map::operator[](item); |
|
| 2196 |
} |
|
| 2197 |
|
|
| 2198 |
/// \brief Gives back the item by its descriptor. |
|
| 2199 |
/// |
|
| 2200 |
/// Gives back th item by its descriptor. |
|
| 2201 |
Item operator()(int id) const {
|
|
| 2202 |
return _inv_map[id]; |
|
| 2203 |
} |
|
| 2204 |
|
|
| 2205 |
private: |
|
| 2206 |
|
|
| 2207 |
typedef std::vector<Item> Container; |
|
| 2208 |
Container _inv_map; |
|
| 2209 |
|
|
| 2210 |
public: |
|
| 2211 |
/// \brief The inverse map type of DescriptorMap. |
|
| 2212 |
/// |
|
| 2213 |
/// The inverse map type of DescriptorMap. |
|
| 2214 |
class InverseMap {
|
|
| 2215 |
public: |
|
| 2216 |
/// \brief Constructor of the InverseMap. |
|
| 2217 |
/// |
|
| 2218 |
/// Constructor of the InverseMap. |
|
| 2219 |
explicit InverseMap(const DescriptorMap& inverted) |
|
| 2220 |
: _inverted(inverted) {}
|
|
| 2221 |
|
|
| 2222 |
|
|
| 2223 |
/// The value type of the InverseMap. |
|
| 2224 |
typedef typename DescriptorMap::Key Value; |
|
| 2225 |
/// The key type of the InverseMap. |
|
| 2226 |
typedef typename DescriptorMap::Value Key; |
|
| 2227 |
|
|
| 2228 |
/// \brief Subscript operator. |
|
| 2229 |
/// |
|
| 2230 |
/// Subscript operator. It gives back the item |
|
| 2231 |
/// that the descriptor belongs to currently. |
|
| 2232 |
Value operator[](const Key& key) const {
|
|
| 2233 |
return _inverted(key); |
|
| 2234 |
} |
|
| 2235 |
|
|
| 2236 |
/// \brief Size of the map. |
|
| 2237 |
/// |
|
| 2238 |
/// Returns the size of the map. |
|
| 2239 |
unsigned int size() const {
|
|
| 2240 |
return _inverted.size(); |
|
| 2241 |
} |
|
| 2242 |
|
|
| 2243 |
private: |
|
| 2244 |
const DescriptorMap& _inverted; |
|
| 2245 |
}; |
|
| 2246 |
|
|
| 2247 |
/// \brief Gives back the inverse of the map. |
|
| 2248 |
/// |
|
| 2249 |
/// Gives back the inverse of the map. |
|
| 2250 |
const InverseMap inverse() const {
|
|
| 2251 |
return InverseMap(*this); |
|
| 2252 |
} |
|
| 2253 |
}; |
|
| 2254 |
|
|
| 2255 | 1850 |
/// \brief Returns the source of the given arc. |
| 2256 | 1851 |
/// |
| 2257 | 1852 |
/// The SourceMap gives back the source Node of the given arc. |
| 2258 | 1853 |
/// \see TargetMap |
| 2259 | 1854 |
template <typename Digraph> |
| 2260 | 1855 |
class SourceMap {
|
| 2261 | 1856 |
public: |
| 2262 | 1857 |
|
| 2263 | 1858 |
typedef typename Digraph::Node Value; |
| 2264 | 1859 |
typedef typename Digraph::Arc Key; |
| 2265 | 1860 |
|
| 2266 | 1861 |
/// \brief Constructor |
| 2267 | 1862 |
/// |
| 2268 | 1863 |
/// Constructor |
| 2269 | 1864 |
/// \param _digraph The digraph that the map belongs to. |
| 2270 | 1865 |
explicit SourceMap(const Digraph& digraph) : _digraph(digraph) {}
|
| 2271 | 1866 |
|
| 2272 | 1867 |
/// \brief The subscript operator. |
| 2273 | 1868 |
/// |
| 2274 | 1869 |
/// The subscript operator. |
| 2275 | 1870 |
/// \param arc The arc |
| 2276 | 1871 |
/// \return The source of the arc |
| 2277 | 1872 |
Value operator[](const Key& arc) const {
|
| 2278 | 1873 |
return _digraph.source(arc); |
| 2279 | 1874 |
} |
| 2280 | 1875 |
|
| 2281 | 1876 |
private: |
| 2282 | 1877 |
const Digraph& _digraph; |
| 2283 | 1878 |
}; |
| 2284 | 1879 |
|
| 2285 | 1880 |
/// \brief Returns a \ref SourceMap class. |
| 2286 | 1881 |
/// |
| 2287 | 1882 |
/// This function just returns an \ref SourceMap class. |
| 2288 | 1883 |
/// \relates SourceMap |
| 2289 | 1884 |
template <typename Digraph> |
| 2290 | 1885 |
inline SourceMap<Digraph> sourceMap(const Digraph& digraph) {
|
| 2291 | 1886 |
return SourceMap<Digraph>(digraph); |
| 2292 | 1887 |
} |
| 2293 | 1888 |
|
| 2294 | 1889 |
/// \brief Returns the target of the given arc. |
| 2295 | 1890 |
/// |
| 2296 | 1891 |
/// The TargetMap gives back the target Node of the given arc. |
| 2297 | 1892 |
/// \see SourceMap |
| 2298 | 1893 |
template <typename Digraph> |
| 2299 | 1894 |
class TargetMap {
|
| 2300 | 1895 |
public: |
| 2301 | 1896 |
|
| 2302 | 1897 |
typedef typename Digraph::Node Value; |
| 2303 | 1898 |
typedef typename Digraph::Arc Key; |
| 2304 | 1899 |
|
| 2305 | 1900 |
/// \brief Constructor |
| 2306 | 1901 |
/// |
| 2307 | 1902 |
/// Constructor |
| 2308 | 1903 |
/// \param _digraph The digraph that the map belongs to. |
| 2309 | 1904 |
explicit TargetMap(const Digraph& digraph) : _digraph(digraph) {}
|
| 2310 | 1905 |
|
| 2311 | 1906 |
/// \brief The subscript operator. |
| 2312 | 1907 |
/// |
| 2313 | 1908 |
/// The subscript operator. |
| 2314 | 1909 |
/// \param e The arc |
| 2315 | 1910 |
/// \return The target of the arc |
| 2316 | 1911 |
Value operator[](const Key& e) const {
|
| 2317 | 1912 |
return _digraph.target(e); |
| 2318 | 1913 |
} |
| 2319 | 1914 |
|
| 2320 | 1915 |
private: |
| 2321 | 1916 |
const Digraph& _digraph; |
| 2322 | 1917 |
}; |
| 2323 | 1918 |
|
| 2324 | 1919 |
/// \brief Returns a \ref TargetMap class. |
| 2325 | 1920 |
/// |
| 2326 | 1921 |
/// This function just returns a \ref TargetMap class. |
| 2327 | 1922 |
/// \relates TargetMap |
| 2328 | 1923 |
template <typename Digraph> |
| 2329 | 1924 |
inline TargetMap<Digraph> targetMap(const Digraph& digraph) {
|
| 2330 | 1925 |
return TargetMap<Digraph>(digraph); |
| 2331 | 1926 |
} |
| 2332 | 1927 |
|
| 2333 | 1928 |
/// \brief Returns the "forward" directed arc view of an edge. |
| 2334 | 1929 |
/// |
| 2335 | 1930 |
/// Returns the "forward" directed arc view of an edge. |
| 2336 | 1931 |
/// \see BackwardMap |
| 2337 | 1932 |
template <typename Graph> |
| 2338 | 1933 |
class ForwardMap {
|
| 2339 | 1934 |
public: |
| 2340 | 1935 |
|
| 2341 | 1936 |
typedef typename Graph::Arc Value; |
| 2342 | 1937 |
typedef typename Graph::Edge Key; |
| 2343 | 1938 |
|
| 2344 | 1939 |
/// \brief Constructor |
| 2345 | 1940 |
/// |
| 2346 | 1941 |
/// Constructor |
| 2347 | 1942 |
/// \param _graph The graph that the map belongs to. |
| 2348 | 1943 |
explicit ForwardMap(const Graph& graph) : _graph(graph) {}
|
| 2349 | 1944 |
|
| 2350 | 1945 |
/// \brief The subscript operator. |
| 2351 | 1946 |
/// |
| 2352 | 1947 |
/// The subscript operator. |
| 2353 | 1948 |
/// \param key An edge |
| 2354 | 1949 |
/// \return The "forward" directed arc view of edge |
| 2355 | 1950 |
Value operator[](const Key& key) const {
|
| 2356 | 1951 |
return _graph.direct(key, true); |
| 2357 | 1952 |
} |
| 2358 | 1953 |
|
| 2359 | 1954 |
private: |
| 2360 | 1955 |
const Graph& _graph; |
| 2361 | 1956 |
}; |
| 2362 | 1957 |
|
| 2363 | 1958 |
/// \brief Returns a \ref ForwardMap class. |
| 2364 | 1959 |
/// |
| 2365 | 1960 |
/// This function just returns an \ref ForwardMap class. |
| 2366 | 1961 |
/// \relates ForwardMap |
| 2367 | 1962 |
template <typename Graph> |
| 2368 | 1963 |
inline ForwardMap<Graph> forwardMap(const Graph& graph) {
|
| 2369 | 1964 |
return ForwardMap<Graph>(graph); |
| 2370 | 1965 |
} |
| 2371 | 1966 |
|
| 2372 | 1967 |
/// \brief Returns the "backward" directed arc view of an edge. |
| 2373 | 1968 |
/// |
| 2374 | 1969 |
/// Returns the "backward" directed arc view of an edge. |
| 2375 | 1970 |
/// \see ForwardMap |
| 2376 | 1971 |
template <typename Graph> |
| 2377 | 1972 |
class BackwardMap {
|
| 2378 | 1973 |
public: |
| 2379 | 1974 |
|
| 2380 | 1975 |
typedef typename Graph::Arc Value; |
| 2381 | 1976 |
typedef typename Graph::Edge Key; |
| 2382 | 1977 |
|
| 2383 | 1978 |
/// \brief Constructor |
| 2384 | 1979 |
/// |
| 2385 | 1980 |
/// Constructor |
| 2386 | 1981 |
/// \param _graph The graph that the map belongs to. |
| 2387 | 1982 |
explicit BackwardMap(const Graph& graph) : _graph(graph) {}
|
| 2388 | 1983 |
|
| 2389 | 1984 |
/// \brief The subscript operator. |
| 2390 | 1985 |
/// |
| 2391 | 1986 |
/// The subscript operator. |
| 2392 | 1987 |
/// \param key An edge |
| 2393 | 1988 |
/// \return The "backward" directed arc view of edge |
| 2394 | 1989 |
Value operator[](const Key& key) const {
|
| 2395 | 1990 |
return _graph.direct(key, false); |
| 2396 | 1991 |
} |
| 2397 | 1992 |
|
| 2398 | 1993 |
private: |
| 2399 | 1994 |
const Graph& _graph; |
| 2400 | 1995 |
}; |
| 2401 | 1996 |
|
| 2402 | 1997 |
/// \brief Returns a \ref BackwardMap class |
| 2403 | 1998 |
|
| 2404 | 1999 |
/// This function just returns a \ref BackwardMap class. |
| 2405 | 2000 |
/// \relates BackwardMap |
| 2406 | 2001 |
template <typename Graph> |
| 2407 | 2002 |
inline BackwardMap<Graph> backwardMap(const Graph& graph) {
|
| 2408 | 2003 |
return BackwardMap<Graph>(graph); |
| 2409 | 2004 |
} |
| 2410 | 2005 |
|
| 2411 | 2006 |
/// \brief Potential difference map |
| 2412 | 2007 |
/// |
| 2413 | 2008 |
/// If there is an potential map on the nodes then we |
| 2414 | 2009 |
/// can get an arc map as we get the substraction of the |
| 2415 | 2010 |
/// values of the target and source. |
| 2416 | 2011 |
template <typename Digraph, typename NodeMap> |
| 2417 | 2012 |
class PotentialDifferenceMap {
|
| 2418 | 2013 |
public: |
| 2419 | 2014 |
typedef typename Digraph::Arc Key; |
| 2420 | 2015 |
typedef typename NodeMap::Value Value; |
| 2421 | 2016 |
|
| 2422 | 2017 |
/// \brief Constructor |
| 2423 | 2018 |
/// |
| 2424 | 2019 |
/// Contructor of the map |
| 2425 | 2020 |
explicit PotentialDifferenceMap(const Digraph& digraph, |
| 2426 | 2021 |
const NodeMap& potential) |
| 2427 | 2022 |
: _digraph(digraph), _potential(potential) {}
|
| 2428 | 2023 |
|
| 2429 | 2024 |
/// \brief Const subscription operator |
| 2430 | 2025 |
/// |
| 2431 | 2026 |
/// Const subscription operator |
| 2432 | 2027 |
Value operator[](const Key& arc) const {
|
| 2433 | 2028 |
return _potential[_digraph.target(arc)] - |
| 2434 | 2029 |
_potential[_digraph.source(arc)]; |
| 2435 | 2030 |
} |
| 2436 | 2031 |
|
| 2437 | 2032 |
private: |
| 2438 | 2033 |
const Digraph& _digraph; |
| 2439 | 2034 |
const NodeMap& _potential; |
| 2440 | 2035 |
}; |
| 2441 | 2036 |
|
| 2442 | 2037 |
/// \brief Returns a PotentialDifferenceMap. |
| 2443 | 2038 |
/// |
| 2444 | 2039 |
/// This function just returns a PotentialDifferenceMap. |
| 2445 | 2040 |
/// \relates PotentialDifferenceMap |
| 2446 | 2041 |
template <typename Digraph, typename NodeMap> |
| 1 | 1 |
/* -*- mode: C++; indent-tabs-mode: nil; -*- |
| 2 | 2 |
* |
| 3 | 3 |
* This file is a part of LEMON, a generic C++ optimization library. |
| 4 | 4 |
* |
| 5 | 5 |
* Copyright (C) 2003-2008 |
| 6 | 6 |
* Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport |
| 7 | 7 |
* (Egervary Research Group on Combinatorial Optimization, EGRES). |
| 8 | 8 |
* |
| 9 | 9 |
* Permission to use, modify and distribute this software is granted |
| 10 | 10 |
* provided that this copyright notice appears in all copies. For |
| 11 | 11 |
* precise terms see the accompanying LICENSE file. |
| 12 | 12 |
* |
| 13 | 13 |
* This software is provided "AS IS" with no warranty of any kind, |
| 14 | 14 |
* express or implied, and with no claim as to its suitability for any |
| 15 | 15 |
* purpose. |
| 16 | 16 |
* |
| 17 | 17 |
*/ |
| 18 | 18 |
|
| 19 | 19 |
#include <cstdlib> |
| 20 | 20 |
#include <ctime> |
| 21 | 21 |
|
| 22 | 22 |
#include <lemon/random.h> |
| 23 | 23 |
#include <lemon/list_graph.h> |
| 24 | 24 |
#include <lemon/smart_graph.h> |
| 25 | 25 |
#include <lemon/maps.h> |
| 26 | 26 |
|
| 27 | 27 |
#include "graph_test.h" |
| 28 | 28 |
#include "test_tools.h" |
| 29 | 29 |
|
| 30 | 30 |
using namespace lemon; |
| 31 | 31 |
|
| 32 | 32 |
template <typename Digraph> |
| 33 | 33 |
void checkFindArcs() {
|
| 34 | 34 |
TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); |
| 35 | 35 |
|
| 36 | 36 |
{
|
| 37 | 37 |
Digraph digraph; |
| 38 |
typename Digraph::template NodeMap<int> nodes(digraph); |
|
| 39 |
std::vector<Node> invNodes; |
|
| 38 | 40 |
for (int i = 0; i < 10; ++i) {
|
| 39 |
digraph.addNode(); |
|
| 41 |
invNodes.push_back(digraph.addNode()); |
|
| 42 |
nodes[invNodes.back()]=invNodes.size()-1; |
|
| 40 | 43 |
} |
| 41 |
DescriptorMap<Digraph, Node> nodes(digraph); |
|
| 42 |
typename DescriptorMap<Digraph, Node>::InverseMap invNodes(nodes); |
|
| 43 | 44 |
for (int i = 0; i < 100; ++i) {
|
| 44 | 45 |
int src = rnd[invNodes.size()]; |
| 45 | 46 |
int trg = rnd[invNodes.size()]; |
| 46 | 47 |
digraph.addArc(invNodes[src], invNodes[trg]); |
| 47 | 48 |
} |
| 48 | 49 |
typename Digraph::template ArcMap<bool> found(digraph, false); |
| 49 |
DescriptorMap<Digraph, Arc> arcs(digraph); |
|
| 50 | 50 |
for (NodeIt src(digraph); src != INVALID; ++src) {
|
| 51 | 51 |
for (NodeIt trg(digraph); trg != INVALID; ++trg) {
|
| 52 | 52 |
for (ConArcIt<Digraph> con(digraph, src, trg); con != INVALID; ++con) {
|
| 53 | 53 |
check(digraph.source(con) == src, "Wrong source."); |
| 54 | 54 |
check(digraph.target(con) == trg, "Wrong target."); |
| 55 | 55 |
check(found[con] == false, "The arc found already."); |
| 56 | 56 |
found[con] = true; |
| 57 | 57 |
} |
| 58 | 58 |
} |
| 59 | 59 |
} |
| 60 | 60 |
for (ArcIt it(digraph); it != INVALID; ++it) {
|
| 61 | 61 |
check(found[it] == true, "The arc is not found."); |
| 62 | 62 |
} |
| 63 | 63 |
} |
| 64 | 64 |
|
| 65 | 65 |
{
|
| 66 | 66 |
int num = 5; |
| 67 | 67 |
Digraph fg; |
| 68 | 68 |
std::vector<Node> nodes; |
| 69 | 69 |
for (int i = 0; i < num; ++i) {
|
| 70 | 70 |
nodes.push_back(fg.addNode()); |
| 71 | 71 |
} |
| 72 | 72 |
for (int i = 0; i < num * num; ++i) {
|
| 73 | 73 |
fg.addArc(nodes[i / num], nodes[i % num]); |
| 74 | 74 |
} |
| 75 | 75 |
check(countNodes(fg) == num, "Wrong node number."); |
| 76 | 76 |
check(countArcs(fg) == num*num, "Wrong arc number."); |
| 77 | 77 |
for (NodeIt src(fg); src != INVALID; ++src) {
|
| 78 | 78 |
for (NodeIt trg(fg); trg != INVALID; ++trg) {
|
| 79 | 79 |
ConArcIt<Digraph> con(fg, src, trg); |
| 80 | 80 |
check(con != INVALID, "There is no connecting arc."); |
| 81 | 81 |
check(fg.source(con) == src, "Wrong source."); |
| 82 | 82 |
check(fg.target(con) == trg, "Wrong target."); |
| 83 | 83 |
check(++con == INVALID, "There is more connecting arc."); |
| 84 | 84 |
} |
| 85 | 85 |
} |
| 86 | 86 |
ArcLookUp<Digraph> al1(fg); |
| 87 | 87 |
DynArcLookUp<Digraph> al2(fg); |
| 88 | 88 |
AllArcLookUp<Digraph> al3(fg); |
| 89 | 89 |
for (NodeIt src(fg); src != INVALID; ++src) {
|
| 90 | 90 |
for (NodeIt trg(fg); trg != INVALID; ++trg) {
|
| 91 | 91 |
Arc con1 = al1(src, trg); |
| 92 | 92 |
Arc con2 = al2(src, trg); |
| 93 | 93 |
Arc con3 = al3(src, trg); |
| 94 | 94 |
Arc con4 = findArc(fg, src, trg); |
| 95 | 95 |
check(con1 == con2 && con2 == con3 && con3 == con4, |
| 96 | 96 |
"Different results.") |
| 97 | 97 |
check(con1 != INVALID, "There is no connecting arc."); |
| 98 | 98 |
check(fg.source(con1) == src, "Wrong source."); |
| 99 | 99 |
check(fg.target(con1) == trg, "Wrong target."); |
| 100 | 100 |
check(al3(src, trg, con3) == INVALID, |
| 101 | 101 |
"There is more connecting arc."); |
| 102 | 102 |
check(findArc(fg, src, trg, con4) == INVALID, |
| 103 | 103 |
"There is more connecting arc."); |
| 104 | 104 |
} |
| 105 | 105 |
} |
| 106 | 106 |
} |
| 107 | 107 |
} |
| 108 | 108 |
|
| 109 | 109 |
template <typename Graph> |
| 110 | 110 |
void checkFindEdges() {
|
| 111 | 111 |
TEMPLATE_GRAPH_TYPEDEFS(Graph); |
| 112 | 112 |
Graph graph; |
| 113 |
typename Graph::template NodeMap<int> nodes(graph); |
|
| 114 |
std::vector<Node> invNodes; |
|
| 113 | 115 |
for (int i = 0; i < 10; ++i) {
|
| 114 |
graph.addNode(); |
|
| 116 |
invNodes.push_back(graph.addNode()); |
|
| 117 |
nodes[invNodes.back()]=invNodes.size()-1; |
|
| 115 | 118 |
} |
| 116 |
DescriptorMap<Graph, Node> nodes(graph); |
|
| 117 |
typename DescriptorMap<Graph, Node>::InverseMap invNodes(nodes); |
|
| 118 | 119 |
for (int i = 0; i < 100; ++i) {
|
| 119 | 120 |
int src = rnd[invNodes.size()]; |
| 120 | 121 |
int trg = rnd[invNodes.size()]; |
| 121 | 122 |
graph.addEdge(invNodes[src], invNodes[trg]); |
| 122 | 123 |
} |
| 123 | 124 |
typename Graph::template EdgeMap<int> found(graph, 0); |
| 124 |
DescriptorMap<Graph, Edge> edges(graph); |
|
| 125 | 125 |
for (NodeIt src(graph); src != INVALID; ++src) {
|
| 126 | 126 |
for (NodeIt trg(graph); trg != INVALID; ++trg) {
|
| 127 | 127 |
for (ConEdgeIt<Graph> con(graph, src, trg); con != INVALID; ++con) {
|
| 128 | 128 |
check( (graph.u(con) == src && graph.v(con) == trg) || |
| 129 | 129 |
(graph.v(con) == src && graph.u(con) == trg), |
| 130 | 130 |
"Wrong end nodes."); |
| 131 | 131 |
++found[con]; |
| 132 | 132 |
check(found[con] <= 2, "The edge found more than twice."); |
| 133 | 133 |
} |
| 134 | 134 |
} |
| 135 | 135 |
} |
| 136 | 136 |
for (EdgeIt it(graph); it != INVALID; ++it) {
|
| 137 | 137 |
check( (graph.u(it) != graph.v(it) && found[it] == 2) || |
| 138 | 138 |
(graph.u(it) == graph.v(it) && found[it] == 1), |
| 139 | 139 |
"The edge is not found correctly."); |
| 140 | 140 |
} |
| 141 | 141 |
} |
| 142 | 142 |
|
| 143 | 143 |
template <class Digraph> |
| 144 | 144 |
void checkDeg() |
| 145 | 145 |
{
|
| 146 | 146 |
TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); |
| 147 | 147 |
|
| 148 | 148 |
const int nodeNum = 10; |
| 149 | 149 |
const int arcNum = 100; |
| 150 | 150 |
Digraph digraph; |
| 151 | 151 |
InDegMap<Digraph> inDeg(digraph); |
| 152 | 152 |
OutDegMap<Digraph> outDeg(digraph); |
| 153 | 153 |
std::vector<Node> nodes(nodeNum); |
| 154 | 154 |
for (int i = 0; i < nodeNum; ++i) {
|
| 155 | 155 |
nodes[i] = digraph.addNode(); |
| 156 | 156 |
} |
| 157 | 157 |
std::vector<Arc> arcs(arcNum); |
| 158 | 158 |
for (int i = 0; i < arcNum; ++i) {
|
| 159 | 159 |
arcs[i] = digraph.addArc(nodes[rnd[nodeNum]], nodes[rnd[nodeNum]]); |
| 160 | 160 |
} |
| 161 | 161 |
for (int i = 0; i < nodeNum; ++i) {
|
| 162 | 162 |
check(inDeg[nodes[i]] == countInArcs(digraph, nodes[i]), |
| 163 | 163 |
"Wrong in degree map"); |
| 164 | 164 |
} |
| 165 | 165 |
for (int i = 0; i < nodeNum; ++i) {
|
| 166 | 166 |
check(outDeg[nodes[i]] == countOutArcs(digraph, nodes[i]), |
| 167 | 167 |
"Wrong out degree map"); |
| 168 | 168 |
} |
| 169 | 169 |
} |
| 170 | 170 |
|
| 171 | 171 |
template <class Digraph> |
| 172 | 172 |
void checkSnapDeg() |
| 173 | 173 |
{
|
| 174 | 174 |
TEMPLATE_DIGRAPH_TYPEDEFS(Digraph); |
| 175 | 175 |
|
| 176 | 176 |
Digraph g; |
| 177 | 177 |
Node n1=g.addNode(); |
| 178 | 178 |
Node n2=g.addNode(); |
| 179 | 179 |
|
| 180 | 180 |
InDegMap<Digraph> ind(g); |
| 181 | 181 |
|
| 182 | 182 |
g.addArc(n1,n2); |
| 183 | 183 |
|
| 184 | 184 |
typename Digraph::Snapshot snap(g); |
| 185 | 185 |
|
| 186 | 186 |
OutDegMap<Digraph> outd(g); |
| 187 | 187 |
|
| 188 | 188 |
check(ind[n1]==0 && ind[n2]==1, "Wrong InDegMap value."); |
| 189 | 189 |
check(outd[n1]==1 && outd[n2]==0, "Wrong OutDegMap value."); |
| 190 | 190 |
|
| 191 | 191 |
g.addArc(n1,n2); |
| 192 | 192 |
g.addArc(n2,n1); |
| 193 | 193 |
|
| 194 | 194 |
check(ind[n1]==1 && ind[n2]==2, "Wrong InDegMap value."); |
| 195 | 195 |
check(outd[n1]==2 && outd[n2]==1, "Wrong OutDegMap value."); |
| 196 | 196 |
|
| 197 | 197 |
snap.restore(); |
| 198 | 198 |
|
| 199 | 199 |
check(ind[n1]==0 && ind[n2]==1, "Wrong InDegMap value."); |
| 200 | 200 |
check(outd[n1]==1 && outd[n2]==0, "Wrong OutDegMap value."); |
| 201 | 201 |
} |
| 202 | 202 |
|
| 203 | 203 |
int main() {
|
| 204 | 204 |
// Checking ConArcIt, ConEdgeIt, ArcLookUp, AllArcLookUp, and DynArcLookUp |
| 205 | 205 |
checkFindArcs<ListDigraph>(); |
| 206 | 206 |
checkFindArcs<SmartDigraph>(); |
| 207 | 207 |
checkFindEdges<ListGraph>(); |
| 208 | 208 |
checkFindEdges<SmartGraph>(); |
| 209 | 209 |
|
| 210 | 210 |
// Checking In/OutDegMap (and Snapshot feature) |
| 211 | 211 |
checkDeg<ListDigraph>(); |
| 212 | 212 |
checkDeg<SmartDigraph>(); |
| 213 | 213 |
checkSnapDeg<ListDigraph>(); |
| 214 | 214 |
checkSnapDeg<SmartDigraph>(); |
| 215 | 215 |
|
| 216 | 216 |
return 0; |
| 217 | 217 |
} |
0 comments (0 inline)