gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Backed out changeset a6eb9698c321 (#360, #51)
0 2 0
default
2 files changed with 4 insertions and 55 deletions:
↑ Collapse diff ↑
Ignore white space 256 line context
1 1
/* -*- C++ -*-
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
#ifndef LEMON_BELLMAN_FORD_H
20 20
#define LEMON_BELLMAN_FORD_H
21 21

	
22 22
/// \ingroup shortest_path
23 23
/// \file
24 24
/// \brief Bellman-Ford algorithm.
25 25

	
26 26
#include <lemon/list_graph.h>
27 27
#include <lemon/bits/path_dump.h>
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/maps.h>
31
#include <lemon/tolerance.h>
32 31
#include <lemon/path.h>
33 32

	
34 33
#include <limits>
35 34

	
36 35
namespace lemon {
37 36

	
38
  /// \brief Default operation traits for the BellmanFord algorithm class.
37
  /// \brief Default OperationTraits for the BellmanFord algorithm class.
39 38
  ///  
40 39
  /// This operation traits class defines all computational operations
41 40
  /// and constants that are used in the Bellman-Ford algorithm.
42 41
  /// The default implementation is based on the \c numeric_limits class.
43 42
  /// If the numeric type does not have infinity value, then the maximum
44 43
  /// value is used as extremal infinity value.
45
  ///
46
  /// \see BellmanFordToleranceOperationTraits
47 44
  template <
48 45
    typename V, 
49 46
    bool has_inf = std::numeric_limits<V>::has_infinity>
50 47
  struct BellmanFordDefaultOperationTraits {
51
    /// \brief Value type for the algorithm.
48
    /// \e
52 49
    typedef V Value;
53 50
    /// \brief Gives back the zero value of the type.
54 51
    static Value zero() {
55 52
      return static_cast<Value>(0);
56 53
    }
57 54
    /// \brief Gives back the positive infinity value of the type.
58 55
    static Value infinity() {
59 56
      return std::numeric_limits<Value>::infinity();
60 57
    }
61 58
    /// \brief Gives back the sum of the given two elements.
62 59
    static Value plus(const Value& left, const Value& right) {
63 60
      return left + right;
64 61
    }
65 62
    /// \brief Gives back \c true only if the first value is less than
66 63
    /// the second.
67 64
    static bool less(const Value& left, const Value& right) {
68 65
      return left < right;
69 66
    }
70 67
  };
71 68

	
72 69
  template <typename V>
73 70
  struct BellmanFordDefaultOperationTraits<V, false> {
74 71
    typedef V Value;
75 72
    static Value zero() {
76 73
      return static_cast<Value>(0);
77 74
    }
78 75
    static Value infinity() {
79 76
      return std::numeric_limits<Value>::max();
80 77
    }
81 78
    static Value plus(const Value& left, const Value& right) {
82 79
      if (left == infinity() || right == infinity()) return infinity();
83 80
      return left + right;
84 81
    }
85 82
    static bool less(const Value& left, const Value& right) {
86 83
      return left < right;
87 84
    }
88 85
  };
89 86
  
90
  /// \brief Operation traits for the BellmanFord algorithm class
91
  /// using tolerance.
92
  ///
93
  /// This operation traits class defines all computational operations
94
  /// and constants that are used in the Bellman-Ford algorithm.
95
  /// The only difference between this implementation and
96
  /// \ref BellmanFordDefaultOperationTraits is that this class uses
97
  /// the \ref Tolerance "tolerance technique" in its \ref less()
98
  /// function.
99
  ///
100
  /// \tparam V The value type.
101
  /// \tparam eps The epsilon value for the \ref less() function.
102
  /// By default, it is the epsilon value used by \ref Tolerance
103
  /// "Tolerance<V>".
104
  ///
105
  /// \see BellmanFordDefaultOperationTraits
106
#ifdef DOXYGEN
107
  template <typename V, V eps>
108
#else
109
  template <
110
    typename V,
111
    V eps = Tolerance<V>::def_epsilon>
112
#endif
113
  struct BellmanFordToleranceOperationTraits {
114
    /// \brief Value type for the algorithm.
115
    typedef V Value;
116
    /// \brief Gives back the zero value of the type.
117
    static Value zero() {
118
      return static_cast<Value>(0);
119
    }
120
    /// \brief Gives back the positive infinity value of the type.
121
    static Value infinity() {
122
      return std::numeric_limits<Value>::infinity();
123
    }
124
    /// \brief Gives back the sum of the given two elements.
125
    static Value plus(const Value& left, const Value& right) {
126
      return left + right;
127
    }
128
    /// \brief Gives back \c true only if the first value is less than
129
    /// the second.
130
    static bool less(const Value& left, const Value& right) {
131
      return left + eps < right;
132
    }
133
  };
134

	
135 87
  /// \brief Default traits class of BellmanFord class.
136 88
  ///
137 89
  /// Default traits class of BellmanFord class.
138 90
  /// \param GR The type of the digraph.
139 91
  /// \param LEN The type of the length map.
140 92
  template<typename GR, typename LEN>
141 93
  struct BellmanFordDefaultTraits {
142 94
    /// The type of the digraph the algorithm runs on. 
143 95
    typedef GR Digraph;
144 96

	
145 97
    /// \brief The type of the map that stores the arc lengths.
146 98
    ///
147 99
    /// The type of the map that stores the arc lengths.
148 100
    /// It must conform to the \ref concepts::ReadMap "ReadMap" concept.
149 101
    typedef LEN LengthMap;
150 102

	
151 103
    /// The type of the arc lengths.
152 104
    typedef typename LEN::Value Value;
153 105

	
154 106
    /// \brief Operation traits for Bellman-Ford algorithm.
155 107
    ///
156 108
    /// It defines the used operations and the infinity value for the
157 109
    /// given \c Value type.
158
    /// \see BellmanFordDefaultOperationTraits,
159
    /// BellmanFordToleranceOperationTraits
110
    /// \see BellmanFordDefaultOperationTraits
160 111
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
161 112
 
162 113
    /// \brief The type of the map that stores the last arcs of the 
163 114
    /// shortest paths.
164 115
    /// 
165 116
    /// The type of the map that stores the last
166 117
    /// arcs of the shortest paths.
167 118
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
168 119
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
169 120

	
170 121
    /// \brief Instantiates a \c PredMap.
171 122
    /// 
172 123
    /// This function instantiates a \ref PredMap. 
173 124
    /// \param g is the digraph to which we would like to define the
174 125
    /// \ref PredMap.
175 126
    static PredMap *createPredMap(const GR& g) {
176 127
      return new PredMap(g);
177 128
    }
178 129

	
179 130
    /// \brief The type of the map that stores the distances of the nodes.
180 131
    ///
181 132
    /// The type of the map that stores the distances of the nodes.
182 133
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
183 134
    typedef typename GR::template NodeMap<typename LEN::Value> DistMap;
184 135

	
185 136
    /// \brief Instantiates a \c DistMap.
186 137
    ///
187 138
    /// This function instantiates a \ref DistMap. 
188 139
    /// \param g is the digraph to which we would like to define the 
189 140
    /// \ref DistMap.
190 141
    static DistMap *createDistMap(const GR& g) {
191 142
      return new DistMap(g);
192 143
    }
193 144

	
194 145
  };
195 146
  
196 147
  /// \brief %BellmanFord algorithm class.
197 148
  ///
198 149
  /// \ingroup shortest_path
199 150
  /// This class provides an efficient implementation of the Bellman-Ford 
200 151
  /// algorithm. The maximum time complexity of the algorithm is
201 152
  /// <tt>O(ne)</tt>.
202 153
  ///
203 154
  /// The Bellman-Ford algorithm solves the single-source shortest path
204 155
  /// problem when the arcs can have negative lengths, but the digraph
205 156
  /// should not contain directed cycles with negative total length.
206 157
  /// If all arc costs are non-negative, consider to use the Dijkstra
207 158
  /// algorithm instead, since it is more efficient.
208 159
  ///
209 160
  /// The arc lengths are passed to the algorithm using a
210 161
  /// \ref concepts::ReadMap "ReadMap", so it is easy to change it to any 
211 162
  /// kind of length. The type of the length values is determined by the
212 163
  /// \ref concepts::ReadMap::Value "Value" type of the length map.
213 164
  ///
214 165
  /// There is also a \ref bellmanFord() "function-type interface" for the
215 166
  /// Bellman-Ford algorithm, which is convenient in the simplier cases and
216 167
  /// it can be used easier.
217 168
  ///
218 169
  /// \tparam GR The type of the digraph the algorithm runs on.
219 170
  /// The default type is \ref ListDigraph.
220 171
  /// \tparam LEN A \ref concepts::ReadMap "readable" arc map that specifies
221 172
  /// the lengths of the arcs. The default map type is
222 173
  /// \ref concepts::Digraph::ArcMap "GR::ArcMap<int>".
223 174
  /// \tparam TR The traits class that defines various types used by the
224 175
  /// algorithm. By default, it is \ref BellmanFordDefaultTraits
225 176
  /// "BellmanFordDefaultTraits<GR, LEN>".
226 177
  /// In most cases, this parameter should not be set directly,
227 178
  /// consider to use the named template parameters instead.
228 179
#ifdef DOXYGEN
229 180
  template <typename GR, typename LEN, typename TR>
230 181
#else
231 182
  template <typename GR=ListDigraph,
232 183
            typename LEN=typename GR::template ArcMap<int>,
233 184
            typename TR=BellmanFordDefaultTraits<GR,LEN> >
234 185
#endif
235 186
  class BellmanFord {
236 187
  public:
237 188

	
238 189
    ///The type of the underlying digraph.
239 190
    typedef typename TR::Digraph Digraph;
240 191
    
241 192
    /// \brief The type of the arc lengths.
242 193
    typedef typename TR::LengthMap::Value Value;
243 194
    /// \brief The type of the map that stores the arc lengths.
244 195
    typedef typename TR::LengthMap LengthMap;
245 196
    /// \brief The type of the map that stores the last
246 197
    /// arcs of the shortest paths.
247 198
    typedef typename TR::PredMap PredMap;
248 199
    /// \brief The type of the map that stores the distances of the nodes.
249 200
    typedef typename TR::DistMap DistMap;
250 201
    /// The type of the paths.
251 202
    typedef PredMapPath<Digraph, PredMap> Path;
252 203
    ///\brief The \ref BellmanFordDefaultOperationTraits
253 204
    /// "operation traits class" of the algorithm.
254 205
    typedef typename TR::OperationTraits OperationTraits;
255 206

	
256 207
    ///The \ref BellmanFordDefaultTraits "traits class" of the algorithm.
257 208
    typedef TR Traits;
258 209

	
259 210
  private:
260 211

	
261 212
    typedef typename Digraph::Node Node;
262 213
    typedef typename Digraph::NodeIt NodeIt;
263 214
    typedef typename Digraph::Arc Arc;
264 215
    typedef typename Digraph::OutArcIt OutArcIt;
265 216

	
266 217
    // Pointer to the underlying digraph.
267 218
    const Digraph *_gr;
268 219
    // Pointer to the length map
269 220
    const LengthMap *_length;
270 221
    // Pointer to the map of predecessors arcs.
271 222
    PredMap *_pred;
272 223
    // Indicates if _pred is locally allocated (true) or not.
273 224
    bool _local_pred;
274 225
    // Pointer to the map of distances.
275 226
    DistMap *_dist;
276 227
    // Indicates if _dist is locally allocated (true) or not.
277 228
    bool _local_dist;
278 229

	
279 230
    typedef typename Digraph::template NodeMap<bool> MaskMap;
280 231
    MaskMap *_mask;
281 232

	
282 233
    std::vector<Node> _process;
283 234

	
284 235
    // Creates the maps if necessary.
285 236
    void create_maps() {
286 237
      if(!_pred) {
287 238
	_local_pred = true;
... ...
@@ -761,258 +712,257 @@
761 712
    /// \brief The distance of the given node from the root(s).
762 713
    ///
763 714
    /// Returns the distance of the given node from the root(s).
764 715
    ///
765 716
    /// \warning If node \c v is not reached from the root(s), then
766 717
    /// the return value of this function is undefined.
767 718
    ///
768 719
    /// \pre Either \ref run() or \ref init() must be called before
769 720
    /// using this function.
770 721
    Value dist(Node v) const { return (*_dist)[v]; }
771 722

	
772 723
    /// \brief Returns the 'previous arc' of the shortest path tree for
773 724
    /// the given node.
774 725
    ///
775 726
    /// This function returns the 'previous arc' of the shortest path
776 727
    /// tree for node \c v, i.e. it returns the last arc of a
777 728
    /// shortest path from a root to \c v. It is \c INVALID if \c v
778 729
    /// is not reached from the root(s) or if \c v is a root.
779 730
    ///
780 731
    /// The shortest path tree used here is equal to the shortest path
781 732
    /// tree used in \ref predNode() and \ref predMap().
782 733
    ///
783 734
    /// \pre Either \ref run() or \ref init() must be called before
784 735
    /// using this function.
785 736
    Arc predArc(Node v) const { return (*_pred)[v]; }
786 737

	
787 738
    /// \brief Returns the 'previous node' of the shortest path tree for
788 739
    /// the given node.
789 740
    ///
790 741
    /// This function returns the 'previous node' of the shortest path
791 742
    /// tree for node \c v, i.e. it returns the last but one node of
792 743
    /// a shortest path from a root to \c v. It is \c INVALID if \c v
793 744
    /// is not reached from the root(s) or if \c v is a root.
794 745
    ///
795 746
    /// The shortest path tree used here is equal to the shortest path
796 747
    /// tree used in \ref predArc() and \ref predMap().
797 748
    ///
798 749
    /// \pre Either \ref run() or \ref init() must be called before
799 750
    /// using this function.
800 751
    Node predNode(Node v) const { 
801 752
      return (*_pred)[v] == INVALID ? INVALID : _gr->source((*_pred)[v]); 
802 753
    }
803 754
    
804 755
    /// \brief Returns a const reference to the node map that stores the
805 756
    /// distances of the nodes.
806 757
    ///
807 758
    /// Returns a const reference to the node map that stores the distances
808 759
    /// of the nodes calculated by the algorithm.
809 760
    ///
810 761
    /// \pre Either \ref run() or \ref init() must be called before
811 762
    /// using this function.
812 763
    const DistMap &distMap() const { return *_dist;}
813 764
 
814 765
    /// \brief Returns a const reference to the node map that stores the
815 766
    /// predecessor arcs.
816 767
    ///
817 768
    /// Returns a const reference to the node map that stores the predecessor
818 769
    /// arcs, which form the shortest path tree (forest).
819 770
    ///
820 771
    /// \pre Either \ref run() or \ref init() must be called before
821 772
    /// using this function.
822 773
    const PredMap &predMap() const { return *_pred; }
823 774
 
824 775
    /// \brief Checks if a node is reached from the root(s).
825 776
    ///
826 777
    /// Returns \c true if \c v is reached from the root(s).
827 778
    ///
828 779
    /// \pre Either \ref run() or \ref init() must be called before
829 780
    /// using this function.
830 781
    bool reached(Node v) const {
831 782
      return (*_dist)[v] != OperationTraits::infinity();
832 783
    }
833 784

	
834 785
    /// \brief Gives back a negative cycle.
835 786
    ///    
836 787
    /// This function gives back a directed cycle with negative total
837 788
    /// length if the algorithm has already found one.
838 789
    /// Otherwise it gives back an empty path.
839 790
    lemon::Path<Digraph> negativeCycle() const {
840 791
      typename Digraph::template NodeMap<int> state(*_gr, -1);
841 792
      lemon::Path<Digraph> cycle;
842 793
      for (int i = 0; i < int(_process.size()); ++i) {
843 794
        if (state[_process[i]] != -1) continue;
844 795
        for (Node v = _process[i]; (*_pred)[v] != INVALID;
845 796
             v = _gr->source((*_pred)[v])) {
846 797
          if (state[v] == i) {
847 798
            cycle.addFront((*_pred)[v]);
848 799
            for (Node u = _gr->source((*_pred)[v]); u != v;
849 800
                 u = _gr->source((*_pred)[u])) {
850 801
              cycle.addFront((*_pred)[u]);
851 802
            }
852 803
            return cycle;
853 804
          }
854 805
          else if (state[v] >= 0) {
855 806
            break;
856 807
          }
857 808
          state[v] = i;
858 809
        }
859 810
      }
860 811
      return cycle;
861 812
    }
862 813
    
863 814
    ///@}
864 815
  };
865 816
 
866 817
  /// \brief Default traits class of bellmanFord() function.
867 818
  ///
868 819
  /// Default traits class of bellmanFord() function.
869 820
  /// \tparam GR The type of the digraph.
870 821
  /// \tparam LEN The type of the length map.
871 822
  template <typename GR, typename LEN>
872 823
  struct BellmanFordWizardDefaultTraits {
873 824
    /// The type of the digraph the algorithm runs on. 
874 825
    typedef GR Digraph;
875 826

	
876 827
    /// \brief The type of the map that stores the arc lengths.
877 828
    ///
878 829
    /// The type of the map that stores the arc lengths.
879 830
    /// It must meet the \ref concepts::ReadMap "ReadMap" concept.
880 831
    typedef LEN LengthMap;
881 832

	
882 833
    /// The type of the arc lengths.
883 834
    typedef typename LEN::Value Value;
884 835

	
885 836
    /// \brief Operation traits for Bellman-Ford algorithm.
886 837
    ///
887 838
    /// It defines the used operations and the infinity value for the
888 839
    /// given \c Value type.
889
    /// \see BellmanFordDefaultOperationTraits,
890
    /// BellmanFordToleranceOperationTraits
840
    /// \see BellmanFordDefaultOperationTraits
891 841
    typedef BellmanFordDefaultOperationTraits<Value> OperationTraits;
892 842

	
893 843
    /// \brief The type of the map that stores the last
894 844
    /// arcs of the shortest paths.
895 845
    /// 
896 846
    /// The type of the map that stores the last arcs of the shortest paths.
897 847
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
898 848
    typedef typename GR::template NodeMap<typename GR::Arc> PredMap;
899 849

	
900 850
    /// \brief Instantiates a \c PredMap.
901 851
    /// 
902 852
    /// This function instantiates a \ref PredMap.
903 853
    /// \param g is the digraph to which we would like to define the
904 854
    /// \ref PredMap.
905 855
    static PredMap *createPredMap(const GR &g) {
906 856
      return new PredMap(g);
907 857
    }
908 858

	
909 859
    /// \brief The type of the map that stores the distances of the nodes.
910 860
    ///
911 861
    /// The type of the map that stores the distances of the nodes.
912 862
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
913 863
    typedef typename GR::template NodeMap<Value> DistMap;
914 864

	
915 865
    /// \brief Instantiates a \c DistMap.
916 866
    ///
917 867
    /// This function instantiates a \ref DistMap. 
918 868
    /// \param g is the digraph to which we would like to define the
919 869
    /// \ref DistMap.
920 870
    static DistMap *createDistMap(const GR &g) {
921 871
      return new DistMap(g);
922 872
    }
923 873

	
924 874
    ///The type of the shortest paths.
925 875

	
926 876
    ///The type of the shortest paths.
927 877
    ///It must meet the \ref concepts::Path "Path" concept.
928 878
    typedef lemon::Path<Digraph> Path;
929 879
  };
930 880
  
931 881
  /// \brief Default traits class used by BellmanFordWizard.
932 882
  ///
933 883
  /// Default traits class used by BellmanFordWizard.
934 884
  /// \tparam GR The type of the digraph.
935 885
  /// \tparam LEN The type of the length map.
936 886
  template <typename GR, typename LEN>
937 887
  class BellmanFordWizardBase 
938 888
    : public BellmanFordWizardDefaultTraits<GR, LEN> {
939 889

	
940 890
    typedef BellmanFordWizardDefaultTraits<GR, LEN> Base;
941 891
  protected:
942 892
    // Type of the nodes in the digraph.
943 893
    typedef typename Base::Digraph::Node Node;
944 894

	
945 895
    // Pointer to the underlying digraph.
946 896
    void *_graph;
947 897
    // Pointer to the length map
948 898
    void *_length;
949 899
    // Pointer to the map of predecessors arcs.
950 900
    void *_pred;
951 901
    // Pointer to the map of distances.
952 902
    void *_dist;
953 903
    //Pointer to the shortest path to the target node.
954 904
    void *_path;
955 905
    //Pointer to the distance of the target node.
956 906
    void *_di;
957 907

	
958 908
    public:
959 909
    /// Constructor.
960 910
    
961 911
    /// This constructor does not require parameters, it initiates
962 912
    /// all of the attributes to default values \c 0.
963 913
    BellmanFordWizardBase() :
964 914
      _graph(0), _length(0), _pred(0), _dist(0), _path(0), _di(0) {}
965 915

	
966 916
    /// Constructor.
967 917
    
968 918
    /// This constructor requires two parameters,
969 919
    /// others are initiated to \c 0.
970 920
    /// \param gr The digraph the algorithm runs on.
971 921
    /// \param len The length map.
972 922
    BellmanFordWizardBase(const GR& gr, 
973 923
			  const LEN& len) :
974 924
      _graph(reinterpret_cast<void*>(const_cast<GR*>(&gr))), 
975 925
      _length(reinterpret_cast<void*>(const_cast<LEN*>(&len))), 
976 926
      _pred(0), _dist(0), _path(0), _di(0) {}
977 927

	
978 928
  };
979 929
  
980 930
  /// \brief Auxiliary class for the function-type interface of the
981 931
  /// \ref BellmanFord "Bellman-Ford" algorithm.
982 932
  ///
983 933
  /// This auxiliary class is created to implement the
984 934
  /// \ref bellmanFord() "function-type interface" of the
985 935
  /// \ref BellmanFord "Bellman-Ford" algorithm.
986 936
  /// It does not have own \ref run() method, it uses the
987 937
  /// functions and features of the plain \ref BellmanFord.
988 938
  ///
989 939
  /// This class should only be used through the \ref bellmanFord()
990 940
  /// function, which makes it easier to use the algorithm.
991 941
  ///
992 942
  /// \tparam TR The traits class that defines various types used by the
993 943
  /// algorithm.
994 944
  template<class TR>
995 945
  class BellmanFordWizard : public TR {
996 946
    typedef TR Base;
997 947

	
998 948
    typedef typename TR::Digraph Digraph;
999 949

	
1000 950
    typedef typename Digraph::Node Node;
1001 951
    typedef typename Digraph::NodeIt NodeIt;
1002 952
    typedef typename Digraph::Arc Arc;
1003 953
    typedef typename Digraph::OutArcIt ArcIt;
1004 954
    
1005 955
    typedef typename TR::LengthMap LengthMap;
1006 956
    typedef typename LengthMap::Value Value;
1007 957
    typedef typename TR::PredMap PredMap;
1008 958
    typedef typename TR::DistMap DistMap;
1009 959
    typedef typename TR::Path Path;
1010 960

	
1011 961
  public:
1012 962
    /// Constructor.
1013 963
    BellmanFordWizard() : TR() {}
1014 964

	
1015 965
    /// \brief Constructor that requires parameters.
1016 966
    ///
1017 967
    /// Constructor that requires parameters.
1018 968
    /// These parameters will be the default values for the traits class.
Ignore white space 6 line context
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-2009
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 <lemon/concepts/digraph.h>
20 20
#include <lemon/smart_graph.h>
21 21
#include <lemon/list_graph.h>
22 22
#include <lemon/lgf_reader.h>
23 23
#include <lemon/bellman_ford.h>
24 24
#include <lemon/path.h>
25 25

	
26 26
#include "graph_test.h"
27 27
#include "test_tools.h"
28 28

	
29 29
using namespace lemon;
30 30

	
31 31
char test_lgf[] =
32 32
  "@nodes\n"
33 33
  "label\n"
34 34
  "0\n"
35 35
  "1\n"
36 36
  "2\n"
37 37
  "3\n"
38 38
  "4\n"
39 39
  "@arcs\n"
40 40
  "    length\n"
41 41
  "0 1 3\n"
42 42
  "1 2 -3\n"
43 43
  "1 2 -5\n"
44 44
  "1 3 -2\n"
45 45
  "0 2 -1\n"
46 46
  "1 2 -4\n"
47 47
  "0 3 2\n"
48 48
  "4 2 -5\n"
49 49
  "2 3 1\n"
50 50
  "@attributes\n"
51 51
  "source 0\n"
52 52
  "target 3\n";
53 53

	
54 54

	
55 55
void checkBellmanFordCompile()
56 56
{
57 57
  typedef int Value;
58 58
  typedef concepts::Digraph Digraph;
59 59
  typedef concepts::ReadMap<Digraph::Arc,Value> LengthMap;
60 60
  typedef BellmanFord<Digraph, LengthMap> BF;
61 61
  typedef Digraph::Node Node;
62 62
  typedef Digraph::Arc Arc;
63 63

	
64 64
  Digraph gr;
65 65
  Node s, t, n;
66 66
  Arc e;
67 67
  Value l;
68 68
  int k=3;
69 69
  bool b;
70 70
  BF::DistMap d(gr);
71 71
  BF::PredMap p(gr);
72 72
  LengthMap length;
73 73
  concepts::Path<Digraph> pp;
74 74

	
75 75
  {
76 76
    BF bf_test(gr,length);
77 77
    const BF& const_bf_test = bf_test;
78 78

	
79 79
    bf_test.run(s);
80 80
    bf_test.run(s,k);
81 81

	
82 82
    bf_test.init();
83 83
    bf_test.addSource(s);
84 84
    bf_test.addSource(s, 1);
85 85
    b = bf_test.processNextRound();
86 86
    b = bf_test.processNextWeakRound();
87 87

	
88 88
    bf_test.start();
89 89
    bf_test.checkedStart();
90 90
    bf_test.limitedStart(k);
91 91

	
92 92
    l  = const_bf_test.dist(t);
93 93
    e  = const_bf_test.predArc(t);
94 94
    s  = const_bf_test.predNode(t);
95 95
    b  = const_bf_test.reached(t);
96 96
    d  = const_bf_test.distMap();
97 97
    p  = const_bf_test.predMap();
98 98
    pp = const_bf_test.path(t);
99 99
    pp = const_bf_test.negativeCycle();
100 100
    
101 101
    for (BF::ActiveIt it(const_bf_test); it != INVALID; ++it) {}
102 102
  }
103 103
  {
104 104
    BF::SetPredMap<concepts::ReadWriteMap<Node,Arc> >
105 105
      ::SetDistMap<concepts::ReadWriteMap<Node,Value> >
106 106
      ::SetOperationTraits<BellmanFordDefaultOperationTraits<Value> >
107
      ::SetOperationTraits<BellmanFordToleranceOperationTraits<Value, 0> >
108 107
      ::Create bf_test(gr,length);
109 108

	
110 109
    LengthMap length_map;
111 110
    concepts::ReadWriteMap<Node,Arc> pred_map;
112 111
    concepts::ReadWriteMap<Node,Value> dist_map;
113 112
    
114 113
    bf_test
115 114
      .lengthMap(length_map)
116 115
      .predMap(pred_map)
117 116
      .distMap(dist_map);
118 117

	
119 118
    bf_test.run(s);
120 119
    bf_test.run(s,k);
121 120

	
122 121
    bf_test.init();
123 122
    bf_test.addSource(s);
124 123
    bf_test.addSource(s, 1);
125 124
    b = bf_test.processNextRound();
126 125
    b = bf_test.processNextWeakRound();
127 126

	
128 127
    bf_test.start();
129 128
    bf_test.checkedStart();
130 129
    bf_test.limitedStart(k);
131 130

	
132 131
    l  = bf_test.dist(t);
133 132
    e  = bf_test.predArc(t);
134 133
    s  = bf_test.predNode(t);
135 134
    b  = bf_test.reached(t);
136 135
    pp = bf_test.path(t);
137 136
    pp = bf_test.negativeCycle();
138 137
  }
139 138
}
140 139

	
141 140
void checkBellmanFordFunctionCompile()
142 141
{
143 142
  typedef int Value;
144 143
  typedef concepts::Digraph Digraph;
145 144
  typedef Digraph::Arc Arc;
146 145
  typedef Digraph::Node Node;
147 146
  typedef concepts::ReadMap<Digraph::Arc,Value> LengthMap;
148 147

	
149 148
  Digraph g;
150 149
  bool b;
151 150
  bellmanFord(g,LengthMap()).run(Node());
152 151
  b = bellmanFord(g,LengthMap()).run(Node(),Node());
153 152
  bellmanFord(g,LengthMap())
154 153
    .predMap(concepts::ReadWriteMap<Node,Arc>())
155 154
    .distMap(concepts::ReadWriteMap<Node,Value>())
156 155
    .run(Node());
157 156
  b=bellmanFord(g,LengthMap())
158 157
    .predMap(concepts::ReadWriteMap<Node,Arc>())
159 158
    .distMap(concepts::ReadWriteMap<Node,Value>())
160 159
    .path(concepts::Path<Digraph>())
161 160
    .dist(Value())
162 161
    .run(Node(),Node());
163 162
}
164 163

	
165 164

	
166 165
template <typename Digraph, typename Value>
167 166
void checkBellmanFord() {
168 167
  TEMPLATE_DIGRAPH_TYPEDEFS(Digraph);
169 168
  typedef typename Digraph::template ArcMap<Value> LengthMap;
170 169

	
171 170
  Digraph gr;
172 171
  Node s, t;
173 172
  LengthMap length(gr);
174 173

	
175 174
  std::istringstream input(test_lgf);
176 175
  digraphReader(gr, input).
177 176
    arcMap("length", length).
178 177
    node("source", s).
179 178
    node("target", t).
180 179
    run();
181 180

	
182 181
  BellmanFord<Digraph, LengthMap>
183 182
    bf(gr, length);
184 183
  bf.run(s);
185 184
  Path<Digraph> p = bf.path(t);
186 185

	
187 186
  check(bf.reached(t) && bf.dist(t) == -1, "Bellman-Ford found a wrong path.");
188 187
  check(p.length() == 3, "path() found a wrong path.");
189 188
  check(checkPath(gr, p), "path() found a wrong path.");
190 189
  check(pathSource(gr, p) == s, "path() found a wrong path.");
191 190
  check(pathTarget(gr, p) == t, "path() found a wrong path.");
192 191
  
193 192
  ListPath<Digraph> path;
194 193
  Value dist;
195 194
  bool reached = bellmanFord(gr,length).path(path).dist(dist).run(s,t);
196 195

	
197 196
  check(reached && dist == -1, "Bellman-Ford found a wrong path.");
198 197
  check(path.length() == 3, "path() found a wrong path.");
199 198
  check(checkPath(gr, path), "path() found a wrong path.");
200 199
  check(pathSource(gr, path) == s, "path() found a wrong path.");
201 200
  check(pathTarget(gr, path) == t, "path() found a wrong path.");
202 201

	
203 202
  for(ArcIt e(gr); e!=INVALID; ++e) {
204 203
    Node u=gr.source(e);
205 204
    Node v=gr.target(e);
206 205
    check(!bf.reached(u) || (bf.dist(v) - bf.dist(u) <= length[e]),
207 206
          "Wrong output. dist(target)-dist(source)-arc_length=" <<
208 207
          bf.dist(v) - bf.dist(u) - length[e]);
209 208
  }
210 209

	
211 210
  for(NodeIt v(gr); v!=INVALID; ++v) {
212 211
    if (bf.reached(v)) {
213 212
      check(v==s || bf.predArc(v)!=INVALID, "Wrong tree.");
214 213
      if (bf.predArc(v)!=INVALID ) {
215 214
        Arc e=bf.predArc(v);
216 215
        Node u=gr.source(e);
217 216
        check(u==bf.predNode(v),"Wrong tree.");
218 217
        check(bf.dist(v) - bf.dist(u) == length[e],
219 218
              "Wrong distance! Difference: " <<
220 219
              bf.dist(v) - bf.dist(u) - length[e]);
221 220
      }
222 221
    }
223 222
  }
224 223
}
225 224

	
226 225
void checkBellmanFordNegativeCycle() {
227 226
  DIGRAPH_TYPEDEFS(SmartDigraph);
228 227

	
229 228
  SmartDigraph gr;
230 229
  IntArcMap length(gr);
231 230
  
232 231
  Node n1 = gr.addNode();
233 232
  Node n2 = gr.addNode();
234 233
  Node n3 = gr.addNode();
235 234
  Node n4 = gr.addNode();
0 comments (0 inline)