# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1253038155 -7200
# Node ID 2ee24622f87bf4841af1f46c650a34c8417a1882
# Parent 50d28aa826bb5e2196c8522ed54269c3c92cab06
Traits class + named parameter for CapacityScaling (#180)
to specify the heap used in internal Dijkstra computations.
diff --git a/lemon/capacity_scaling.h b/lemon/capacity_scaling.h
a
|
b
|
|
31 | 31 | |
32 | 32 | namespace lemon { |
33 | 33 | |
| 34 | /// \brief Default traits class of CapacityScaling algorithm. |
| 35 | /// |
| 36 | /// Default traits class of CapacityScaling algorithm. |
| 37 | /// \tparam GR Digraph type. |
| 38 | /// \tparam V The value type used for flow amounts, capacity bounds |
| 39 | /// and supply values. By default it is \c int. |
| 40 | /// \tparam C The value type used for costs and potentials. |
| 41 | /// By default it is the same as \c V. |
| 42 | template <typename GR, typename V = int, typename C = V> |
| 43 | struct CapacityScalingDefaultTraits |
| 44 | { |
| 45 | /// The type of the digraph |
| 46 | typedef GR Digraph; |
| 47 | /// The type of the flow amounts, capacity bounds and supply values |
| 48 | typedef V Value; |
| 49 | /// The type of the arc costs |
| 50 | typedef C Cost; |
| 51 | |
| 52 | /// \brief The type of the heap used for internal Dijkstra computations. |
| 53 | /// |
| 54 | /// The type of the heap used for internal Dijkstra computations. |
| 55 | /// It must conform to the \ref lemon::concepts::Heap "Heap" concept, |
| 56 | /// its priority type must be \c Cost and its cross reference type |
| 57 | /// must be \ref RangeMap "RangeMap<int>". |
| 58 | typedef BinHeap<Cost, RangeMap<int> > Heap; |
| 59 | }; |
| 60 | |
34 | 61 | /// \addtogroup min_cost_flow_algs |
35 | 62 | /// @{ |
36 | 63 | |
… |
… |
|
57 | 84 | /// be integer. |
58 | 85 | /// \warning This algorithm does not support negative costs for such |
59 | 86 | /// arcs that have infinite upper bound. |
60 | | template <typename GR, typename V = int, typename C = V> |
| 87 | #ifdef DOXYGEN |
| 88 | template <typename GR, typename V, typename C, typename TR> |
| 89 | #else |
| 90 | template < typename GR, typename V = int, typename C = V, |
| 91 | typename TR = CapacityScalingDefaultTraits<GR, V, C> > |
| 92 | #endif |
61 | 93 | class CapacityScaling |
62 | 94 | { |
63 | 95 | public: |
64 | 96 | |
| 97 | /// The type of the digraph |
| 98 | typedef typename TR::Digraph Digraph; |
65 | 99 | /// The type of the flow amounts, capacity bounds and supply values |
66 | | typedef V Value; |
| 100 | typedef typename TR::Value Value; |
67 | 101 | /// The type of the arc costs |
68 | | typedef C Cost; |
| 102 | typedef typename TR::Cost Cost; |
| 103 | |
| 104 | /// The type of the heap used for internal Dijkstra computations |
| 105 | typedef typename TR::Heap Heap; |
| 106 | |
| 107 | /// The \ref CapacityScalingDefaultTraits "traits class" of the algorithm |
| 108 | typedef TR Traits; |
69 | 109 | |
70 | 110 | public: |
71 | 111 | |
… |
… |
|
92 | 132 | |
93 | 133 | TEMPLATE_DIGRAPH_TYPEDEFS(GR); |
94 | 134 | |
95 | | typedef std::vector<Arc> ArcVector; |
96 | | typedef std::vector<Node> NodeVector; |
97 | 135 | typedef std::vector<int> IntVector; |
98 | 136 | typedef std::vector<bool> BoolVector; |
99 | 137 | typedef std::vector<Value> ValueVector; |
… |
… |
|
155 | 193 | // potentials according to the found distance labels. |
156 | 194 | class ResidualDijkstra |
157 | 195 | { |
158 | | typedef RangeMap<int> HeapCrossRef; |
159 | | typedef BinHeap<Cost, HeapCrossRef> Heap; |
160 | | |
161 | 196 | private: |
162 | 197 | |
163 | 198 | int _node_num; |
… |
… |
|
182 | 217 | {} |
183 | 218 | |
184 | 219 | int run(int s, Value delta = 1) { |
185 | | HeapCrossRef heap_cross_ref(_node_num, Heap::PRE_HEAP); |
| 220 | RangeMap<int> heap_cross_ref(_node_num, Heap::PRE_HEAP); |
186 | 221 | Heap heap(heap_cross_ref); |
187 | 222 | heap.push(s, 0); |
188 | 223 | _pred[s] = -1; |
… |
… |
|
233 | 268 | |
234 | 269 | public: |
235 | 270 | |
| 271 | /// \name Named Template Parameters |
| 272 | /// @{ |
| 273 | |
| 274 | template <typename T> |
| 275 | struct SetHeapTraits : public Traits { |
| 276 | typedef T Heap; |
| 277 | }; |
| 278 | |
| 279 | /// \brief \ref named-templ-param "Named parameter" for setting |
| 280 | /// \c Heap type. |
| 281 | /// |
| 282 | /// \ref named-templ-param "Named parameter" for setting \c Heap |
| 283 | /// type, which is used for internal Dijkstra computations. |
| 284 | /// It must conform to the \ref lemon::concepts::Heap "Heap" concept, |
| 285 | /// its priority type must be \c Cost and its cross reference type |
| 286 | /// must be \ref RangeMap "RangeMap<int>". |
| 287 | template <typename T> |
| 288 | struct SetHeap |
| 289 | : public CapacityScaling<GR, V, C, SetHeapTraits<T> > { |
| 290 | typedef CapacityScaling<GR, V, C, SetHeapTraits<T> > Create; |
| 291 | }; |
| 292 | |
| 293 | /// @} |
| 294 | |
| 295 | public: |
| 296 | |
236 | 297 | /// \brief Constructor. |
237 | 298 | /// |
238 | 299 | /// The constructor of the class. |
… |
… |
|
431 | 492 | /// @} |
432 | 493 | |
433 | 494 | /// \name Execution control |
| 495 | /// The algorithm can be executed using \ref run(). |
434 | 496 | |
435 | 497 | /// @{ |
436 | 498 | |
… |
… |
|
747 | 809 | |
748 | 810 | // Execute the capacity scaling algorithm |
749 | 811 | ProblemType startWithScaling() { |
750 | | // Process capacity scaling phases |
| 812 | // Perform capacity scaling phases |
751 | 813 | int s, t; |
752 | 814 | int phase_cnt = 0; |
753 | 815 | int factor = 4; |
diff --git a/test/min_cost_flow_test.cc b/test/min_cost_flow_test.cc
a
|
b
|
|
27 | 27 | #include <lemon/capacity_scaling.h> |
28 | 28 | |
29 | 29 | #include <lemon/concepts/digraph.h> |
| 30 | #include <lemon/concepts/heap.h> |
30 | 31 | #include <lemon/concept_check.h> |
31 | 32 | |
32 | 33 | #include "test_tools.h" |
… |
… |
|
287 | 288 | CapacityScaling<GR, double> >(); |
288 | 289 | checkConcept< McfClassConcept<GR, int, double>, |
289 | 290 | CapacityScaling<GR, int, double> >(); |
| 291 | typedef CapacityScaling<GR>:: |
| 292 | SetHeap<concepts::Heap<int, RangeMap<int> > >::Create CAS; |
| 293 | checkConcept< McfClassConcept<GR, int, int>, CAS >(); |
290 | 294 | } |
291 | 295 | |
292 | 296 | // Run various MCF tests |