# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1227262225 -3600
# Node ID d21271cbdc09705c48e22240837a37bae2054636
# Parent 09acd23a35bdd78e83868cc10d819d96081bf5d7
Doc improvements for elevator classes (#174)
diff --git a/lemon/elevator.h b/lemon/elevator.h
a
|
b
|
|
27 | 27 | ///for labeling items in push-relabel type algorithms. |
28 | 28 | /// |
29 | 29 | |
30 | | #include <test/test_tools.h> |
| 30 | #include <lemon/bits/traits.h> |
| 31 | |
31 | 32 | namespace lemon { |
32 | 33 | |
33 | 34 | ///Class for handling "labels" in push-relabel type algorithms. |
… |
… |
|
44 | 45 | /// |
45 | 46 | ///\sa LinkedElevator |
46 | 47 | /// |
47 | | ///\param Graph the underlying graph type |
| 48 | ///\param Graph Type of the underlying graph. |
48 | 49 | ///\param Item Type of the items the data is assigned to (Graph::Node, |
49 | | ///Graph::Edge, Graph::UEdge) |
| 50 | ///Graph::Arc, Graph::Edge). |
50 | 51 | template<class Graph, class Item> |
51 | 52 | class Elevator |
52 | 53 | { |
… |
… |
|
100 | 101 | |
101 | 102 | ///Constructor with given maximum level. |
102 | 103 | /// |
103 | | ///\param g The underlying graph |
104 | | ///\param max_level Set the range of the possible labels to |
105 | | ///[0...\c max_level] |
106 | | Elevator(const Graph &g,int max_level) : |
107 | | _g(g), |
| 104 | ///\param graph The underlying graph. |
| 105 | ///\param max_level The maximum allowed level. |
| 106 | ///Set the range of the possible labels to <tt>[0..max_level]</tt>. |
| 107 | Elevator(const Graph &graph,int max_level) : |
| 108 | _g(graph), |
108 | 109 | _max_level(max_level), |
109 | 110 | _item_num(_max_level), |
110 | | _where(g), |
111 | | _level(g,0), |
| 111 | _where(graph), |
| 112 | _level(graph,0), |
112 | 113 | _items(_max_level), |
113 | 114 | _first(_max_level+2), |
114 | 115 | _last_active(_max_level+2), |
… |
… |
|
117 | 118 | |
118 | 119 | ///Constructor. |
119 | 120 | /// |
120 | | ///\param g The underlying graph |
121 | | ///The range of the possible labels is [0...\c max_level], |
| 121 | ///\param graph The underlying graph. |
| 122 | ///Set the range of the possible labels to <tt>[0..max_level]</tt>, |
122 | 123 | ///where \c max_level is equal to the number of labeled items in the graph. |
123 | | Elevator(const Graph &g) : |
124 | | _g(g), |
125 | | _max_level(countItems<Graph, Item>(g)), |
| 124 | Elevator(const Graph &graph) : |
| 125 | _g(graph), |
| 126 | _max_level(countItems<Graph, Item>(graph)), |
126 | 127 | _item_num(_max_level), |
127 | | _where(g), |
128 | | _level(g,0), |
| 128 | _where(graph), |
| 129 | _level(graph,0), |
129 | 130 | _items(_max_level), |
130 | 131 | _first(_max_level+2), |
131 | 132 | _last_active(_max_level+2), |
… |
… |
|
167 | 168 | { |
168 | 169 | return _first[l+1]-_first[l]; |
169 | 170 | } |
170 | | ///Return true if the level is empty. |
| 171 | ///Return true if level \c l is empty. |
171 | 172 | bool emptyLevel(int l) const |
172 | 173 | { |
173 | 174 | return _first[l+1]-_first[l]==0; |
… |
… |
|
182 | 183 | { |
183 | 184 | return _last_active[l]-_first[l]+1; |
184 | 185 | } |
185 | | ///Return true if there is not active item on level \c l. |
| 186 | ///Return true if there is no active item on level \c l. |
186 | 187 | bool activeFree(int l) const |
187 | 188 | { |
188 | 189 | return _last_active[l]<_first[l]; |
… |
… |
|
201 | 202 | |
202 | 203 | ///Return a highest level active item. |
203 | 204 | |
204 | | ///Return a highest level active item. |
205 | | /// |
206 | | ///\return the highest level active item or INVALID if there is no active |
| 205 | ///Return a highest level active item or INVALID if there is no active |
207 | 206 | ///item. |
208 | 207 | Item highestActive() const |
209 | 208 | { |
210 | 209 | return _highest_active>=0?*_last_active[_highest_active]:INVALID; |
211 | 210 | } |
212 | 211 | |
213 | | ///Return a highest active level. |
| 212 | ///Return the highest active level. |
214 | 213 | |
215 | | ///Return a highest active level. |
216 | | /// |
217 | | ///\return the level of the highest active item or -1 if there is no active |
| 214 | ///Return the level of the highest active item or -1 if there is no active |
218 | 215 | ///item. |
219 | 216 | int highestActiveLevel() const |
220 | 217 | { |
… |
… |
|
233 | 230 | --_first[++_highest_active]; |
234 | 231 | } |
235 | 232 | |
236 | | ///Lift the highest active item. |
| 233 | ///Lift the highest active item to the given level. |
237 | 234 | |
238 | 235 | ///Lift the item returned by highestActive() to level \c new_level. |
239 | 236 | /// |
… |
… |
|
255 | 252 | _highest_active=new_level; |
256 | 253 | } |
257 | 254 | |
258 | | ///Lift the highest active item. |
| 255 | ///Lift the highest active item to the top level. |
259 | 256 | |
260 | 257 | ///Lift the item returned by highestActive() to the top level and |
261 | | ///deactivates it. |
262 | | /// |
263 | | ///\warning \c new_level must be strictly higher |
264 | | ///than the current level. |
265 | | /// |
| 258 | ///deactivate it. |
266 | 259 | void liftHighestActiveToTop() |
267 | 260 | { |
268 | 261 | const Item li = *_last_active[_highest_active]; |
… |
… |
|
289 | 282 | |
290 | 283 | ///@{ |
291 | 284 | |
292 | | ///Returns an active item on level \c l. |
| 285 | ///Return an active item on level \c l. |
293 | 286 | |
294 | | ///Returns an active item on level \c l. |
295 | | /// |
296 | | ///Returns an active item on level \c l or \ref INVALID if there is no such |
| 287 | ///Return an active item on level \c l or \ref INVALID if there is no such |
297 | 288 | ///an item. (\c l must be from the range [0...\c max_level]. |
298 | 289 | Item activeOn(int l) const |
299 | 290 | { |
300 | 291 | return _last_active[l]>=_first[l]?*_last_active[l]:INVALID; |
301 | 292 | } |
302 | 293 | |
303 | | ///Lifts the active item returned by \c activeOn() member function. |
| 294 | ///Lift the active item returned by \c activeOn(level) by one. |
304 | 295 | |
305 | | ///Lifts the active item returned by \c activeOn() member function |
| 296 | ///Lift the active item returned by \ref activeOn() "activeOn(level)" |
306 | 297 | ///by one. |
307 | 298 | Item liftActiveOn(int level) |
308 | 299 | { |
… |
… |
|
312 | 303 | if (level+1>_highest_active) ++_highest_active; |
313 | 304 | } |
314 | 305 | |
315 | | ///Lifts the active item returned by \c activeOn() member function. |
| 306 | ///Lift the active item returned by \c activeOn(level) to the given level. |
316 | 307 | |
317 | | ///Lifts the active item returned by \c activeOn() member function |
| 308 | ///Lift the active item returned by \ref activeOn() "activeOn(level)" |
318 | 309 | ///to the given level. |
319 | 310 | void liftActiveOn(int level, int new_level) |
320 | 311 | { |
… |
… |
|
331 | 322 | if (new_level>_highest_active) _highest_active=new_level; |
332 | 323 | } |
333 | 324 | |
334 | | ///Lifts the active item returned by \c activeOn() member function. |
| 325 | ///Lift the active item returned by \c activeOn(level) to the top level. |
335 | 326 | |
336 | | ///Lifts the active item returned by \c activeOn() member function |
337 | | ///to the top level. |
| 327 | ///Lift the active item returned by \ref activeOn() "activeOn(level)" |
| 328 | ///to the top level and deactivate it. |
338 | 329 | void liftActiveToTop(int level) |
339 | 330 | { |
340 | 331 | const Item ai = *_last_active[level]; |
… |
… |
|
384 | 375 | |
385 | 376 | ///Move an inactive item to the top but one level (in a dirty way). |
386 | 377 | |
387 | | ///This function moves an inactive item to the top but one level. |
388 | | ///It makes the underlying datastructure corrupt, so use is only if |
389 | | ///you really know what it is for. |
| 378 | ///This function moves an inactive item from the top level to the top |
| 379 | ///but one level (in a dirty way). |
| 380 | ///\warning It makes the underlying datastructure corrupt, so use it |
| 381 | ///only if you really know what it is for. |
390 | 382 | ///\pre The item is on the top level. |
391 | 383 | void dirtyTopButOne(Item i) { |
392 | 384 | _level.set(i,_max_level - 1); |
393 | 385 | } |
394 | 386 | |
395 | | ///Lift all items on and above a level to the top (and deactivate them). |
| 387 | ///Lift all items on and above the given level to the top level. |
396 | 388 | |
397 | | ///This function lifts all items on and above level \c l to \c |
398 | | ///maxLevel(), and also deactivates them. |
| 389 | ///This function lifts all items on and above level \c l to the top |
| 390 | ///level and deactivates them. |
399 | 391 | void liftToTop(int l) |
400 | 392 | { |
401 | 393 | const Vit f=_first[l]; |
… |
… |
|
420 | 412 | public: |
421 | 413 | |
422 | 414 | ///\name Initialization |
423 | | ///Using this function you can initialize the levels of the item. |
| 415 | ///Using these functions you can initialize the levels of the items. |
424 | 416 | ///\n |
425 | | ///This initializatios is started with calling \c initStart(). |
426 | | ///Then the |
427 | | ///items should be listed levels by levels statring with the lowest one |
428 | | ///(with level 0). This is done by using \c initAddItem() |
429 | | ///and \c initNewLevel(). Finally \c initFinish() must be called. |
430 | | ///The items not listed will be put on the highest level. |
| 417 | ///The initialization must be started with calling \c initStart(). |
| 418 | ///Then the items should be listed level by level starting with the |
| 419 | ///lowest one (level 0) using \c initAddItem() and \c initNewLevel(). |
| 420 | ///Finally \c initFinish() must be called. |
| 421 | ///The items not listed are put on the highest level. |
431 | 422 | ///@{ |
432 | 423 | |
433 | 424 | ///Start the initialization process. |
434 | | |
435 | 425 | void initStart() |
436 | 426 | { |
437 | 427 | _init_lev=0; |
… |
… |
|
449 | 439 | } |
450 | 440 | |
451 | 441 | ///Add an item to the current level. |
452 | | |
453 | 442 | void initAddItem(Item i) |
454 | 443 | { |
455 | 444 | swap(_where[i],_init_num); |
… |
… |
|
469 | 458 | } |
470 | 459 | |
471 | 460 | ///Finalize the initialization process. |
472 | | |
473 | 461 | void initFinish() |
474 | 462 | { |
475 | 463 | for(_init_lev++;_init_lev<=_max_level;_init_lev++) |
… |
… |
|
500 | 488 | /// |
501 | 489 | ///\sa Elevator |
502 | 490 | /// |
503 | | ///\param Graph the underlying graph type |
| 491 | ///\param Graph Type of the underlying graph. |
504 | 492 | ///\param Item Type of the items the data is assigned to (Graph::Node, |
505 | | ///Graph::Edge, Graph::UEdge) |
| 493 | ///Graph::Arc, Graph::Edge). |
506 | 494 | template <class Graph, class Item> |
507 | 495 | class LinkedElevator { |
508 | 496 | public: |
… |
… |
|
533 | 521 | |
534 | 522 | ///Constructor with given maximum level. |
535 | 523 | /// |
536 | | ///\param g The underlying graph |
537 | | ///\param max_level Set the range of the possible labels to |
538 | | ///[0...\c max_level] |
| 524 | ///\param graph The underlying graph. |
| 525 | ///\param max_level The maximum allowed level. |
| 526 | ///Set the range of the possible labels to <tt>[0..max_level]</tt>. |
539 | 527 | LinkedElevator(const Graph& graph, int max_level) |
540 | 528 | : _graph(graph), _max_level(max_level), _item_num(_max_level), |
541 | 529 | _first(_max_level + 1), _last(_max_level + 1), |
… |
… |
|
546 | 534 | |
547 | 535 | ///Constructor. |
548 | 536 | /// |
549 | | ///\param g The underlying graph |
550 | | ///The range of the possible labels is [0...\c max_level], |
| 537 | ///\param graph The underlying graph. |
| 538 | ///Set the range of the possible labels to <tt>[0..max_level]</tt>, |
551 | 539 | ///where \c max_level is equal to the number of labeled items in the graph. |
552 | 540 | LinkedElevator(const Graph& graph) |
553 | 541 | : _graph(graph), _max_level(countItems<Graph, Item>(graph)), |
… |
… |
|
657 | 645 | return num; |
658 | 646 | } |
659 | 647 | |
660 | | ///Return true if there is not active item on level \c l. |
| 648 | ///Return true if there is no active item on level \c l. |
661 | 649 | bool activeFree(int l) const { |
662 | 650 | return _first[l] == INVALID || !_active[_first[l]]; |
663 | 651 | } |
… |
… |
|
675 | 663 | |
676 | 664 | ///Return a highest level active item. |
677 | 665 | |
678 | | ///Return a highest level active item. |
679 | | /// |
680 | | ///\return the highest level active item or INVALID if there is no |
681 | | ///active item. |
| 666 | ///Return a highest level active item or INVALID if there is no active |
| 667 | ///item. |
682 | 668 | Item highestActive() const { |
683 | 669 | return _highest_active >= 0 ? _first[_highest_active] : INVALID; |
684 | 670 | } |
685 | 671 | |
686 | | ///Return a highest active level. |
| 672 | ///Return the highest active level. |
687 | 673 | |
688 | | ///Return a highest active level. |
689 | | /// |
690 | | ///\return the level of the highest active item or -1 if there is |
691 | | ///no active item. |
| 674 | ///Return the level of the highest active item or -1 if there is no active |
| 675 | ///item. |
692 | 676 | int highestActiveLevel() const { |
693 | 677 | return _highest_active; |
694 | 678 | } |
… |
… |
|
719 | 703 | } |
720 | 704 | } |
721 | 705 | |
722 | | ///Lift the highest active item. |
| 706 | ///Lift the highest active item to the given level. |
723 | 707 | |
724 | 708 | ///Lift the item returned by highestActive() to level \c new_level. |
725 | 709 | /// |
… |
… |
|
747 | 731 | } |
748 | 732 | } |
749 | 733 | |
750 | | ///Lift the highest active to top. |
| 734 | ///Lift the highest active item to the top level. |
751 | 735 | |
752 | 736 | ///Lift the item returned by highestActive() to the top level and |
753 | | ///deactivates the item. |
754 | | /// |
| 737 | ///deactivate it. |
755 | 738 | void liftHighestActiveToTop() { |
756 | 739 | Item i = _first[_highest_active]; |
757 | 740 | _level.set(i, _max_level); |
… |
… |
|
773 | 756 | |
774 | 757 | ///@{ |
775 | 758 | |
776 | | ///Returns an active item on level \c l. |
| 759 | ///Return an active item on level \c l. |
777 | 760 | |
778 | | ///Returns an active item on level \c l. |
779 | | /// |
780 | | ///Returns an active item on level \c l or \ref INVALID if there is no such |
| 761 | ///Return an active item on level \c l or \ref INVALID if there is no such |
781 | 762 | ///an item. (\c l must be from the range [0...\c max_level]. |
782 | 763 | Item activeOn(int l) const |
783 | 764 | { |
784 | 765 | return _active[_first[l]] ? _first[l] : INVALID; |
785 | 766 | } |
786 | 767 | |
787 | | ///Lifts the active item returned by \c activeOn() member function. |
| 768 | ///Lift the active item returned by \c activeOn(l) by one. |
788 | 769 | |
789 | | ///Lifts the active item returned by \c activeOn() member function |
| 770 | ///Lift the active item returned by \ref activeOn() "activeOn(l)" |
790 | 771 | ///by one. |
791 | 772 | Item liftActiveOn(int l) |
792 | 773 | { |
… |
… |
|
813 | 794 | } |
814 | 795 | } |
815 | 796 | |
816 | | /// \brief Lifts the active item returned by \c activeOn() member function. |
817 | | /// |
818 | | /// Lifts the active item returned by \c activeOn() member function |
819 | | /// to the given level. |
| 797 | ///Lift the active item returned by \c activeOn(l) to the given level. |
| 798 | |
| 799 | ///Lift the active item returned by \ref activeOn() "activeOn(l)" |
| 800 | ///to the given level. |
820 | 801 | void liftActiveOn(int l, int new_level) |
821 | 802 | { |
822 | 803 | Item i = _first[l]; |
… |
… |
|
842 | 823 | } |
843 | 824 | } |
844 | 825 | |
845 | | ///Lifts the active item returned by \c activeOn() member function. |
| 826 | ///Lift the active item returned by \c activeOn(l) to the top level. |
846 | 827 | |
847 | | ///Lifts the active item returned by \c activeOn() member function |
848 | | ///to the top level. |
| 828 | ///Lift the active item returned by \ref activeOn() "activeOn(l)" |
| 829 | ///to the top level and deactivate it. |
849 | 830 | void liftActiveToTop(int l) |
850 | 831 | { |
851 | 832 | Item i = _first[l]; |
… |
… |
|
900 | 881 | |
901 | 882 | ///Move an inactive item to the top but one level (in a dirty way). |
902 | 883 | |
903 | | ///This function moves an inactive item to the top but one level. |
904 | | ///It makes the underlying datastructure corrupt, so use is only if |
905 | | ///you really know what it is for. |
| 884 | ///This function moves an inactive item from the top level to the top |
| 885 | ///but one level (in a dirty way). |
| 886 | ///\warning It makes the underlying datastructure corrupt, so use it |
| 887 | ///only if you really know what it is for. |
906 | 888 | ///\pre The item is on the top level. |
907 | 889 | void dirtyTopButOne(Item i) { |
908 | 890 | _level.set(i, _max_level - 1); |
909 | 891 | } |
910 | 892 | |
911 | | ///Lift all items on and above a level to the top (and deactivate them). |
| 893 | ///Lift all items on and above the given level to the top level. |
912 | 894 | |
913 | | ///This function lifts all items on and above level \c l to \c |
914 | | ///maxLevel(), and also deactivates them. |
| 895 | ///This function lifts all items on and above level \c l to the top |
| 896 | ///level and deactivates them. |
915 | 897 | void liftToTop(int l) { |
916 | 898 | for (int i = l + 1; _first[i] != INVALID; ++i) { |
917 | 899 | Item n = _first[i]; |
… |
… |
|
936 | 918 | public: |
937 | 919 | |
938 | 920 | ///\name Initialization |
939 | | ///Using this function you can initialize the levels of the item. |
| 921 | ///Using these functions you can initialize the levels of the items. |
940 | 922 | ///\n |
941 | | ///This initializatios is started with calling \c initStart(). |
942 | | ///Then the |
943 | | ///items should be listed levels by levels statring with the lowest one |
944 | | ///(with level 0). This is done by using \c initAddItem() |
945 | | ///and \c initNewLevel(). Finally \c initFinish() must be called. |
946 | | ///The items not listed will be put on the highest level. |
| 923 | ///The initialization must be started with calling \c initStart(). |
| 924 | ///Then the items should be listed level by level starting with the |
| 925 | ///lowest one (level 0) using \c initAddItem() and \c initNewLevel(). |
| 926 | ///Finally \c initFinish() must be called. |
| 927 | ///The items not listed are put on the highest level. |
947 | 928 | ///@{ |
948 | 929 | |
949 | 930 | ///Start the initialization process. |
950 | | |
951 | 931 | void initStart() { |
952 | 932 | |
953 | 933 | for (int i = 0; i <= _max_level; ++i) { |
… |
… |
|
962 | 942 | } |
963 | 943 | |
964 | 944 | ///Add an item to the current level. |
965 | | |
966 | 945 | void initAddItem(Item i) { |
967 | 946 | _level.set(i, _init_level); |
968 | 947 | if (_last[_init_level] == INVALID) { |
… |
… |
|
987 | 966 | } |
988 | 967 | |
989 | 968 | ///Finalize the initialization process. |
990 | | |
991 | 969 | void initFinish() { |
992 | 970 | _highest_active = -1; |
993 | 971 | } |