gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge bugfix #368
0 1 0
merge default
1 file changed with 2 insertions and 2 deletions:
↑ Collapse diff ↑
Ignore white space 768 line context
... ...
@@ -696,926 +696,926 @@
696 696
    NetworkSimplex& upperMap(const UpperMap& map) {
697 697
      for (ArcIt a(_graph); a != INVALID; ++a) {
698 698
        _upper[_arc_id[a]] = map[a];
699 699
      }
700 700
      return *this;
701 701
    }
702 702

	
703 703
    /// \brief Set the costs of the arcs.
704 704
    ///
705 705
    /// This function sets the costs of the arcs.
706 706
    /// If it is not used before calling \ref run(), the costs
707 707
    /// will be set to \c 1 on all arcs.
708 708
    ///
709 709
    /// \param map An arc map storing the costs.
710 710
    /// Its \c Value type must be convertible to the \c Cost type
711 711
    /// of the algorithm.
712 712
    ///
713 713
    /// \return <tt>(*this)</tt>
714 714
    template<typename CostMap>
715 715
    NetworkSimplex& costMap(const CostMap& map) {
716 716
      for (ArcIt a(_graph); a != INVALID; ++a) {
717 717
        _cost[_arc_id[a]] = map[a];
718 718
      }
719 719
      return *this;
720 720
    }
721 721

	
722 722
    /// \brief Set the supply values of the nodes.
723 723
    ///
724 724
    /// This function sets the supply values of the nodes.
725 725
    /// If neither this function nor \ref stSupply() is used before
726 726
    /// calling \ref run(), the supply of each node will be set to zero.
727 727
    ///
728 728
    /// \param map A node map storing the supply values.
729 729
    /// Its \c Value type must be convertible to the \c Value type
730 730
    /// of the algorithm.
731 731
    ///
732 732
    /// \return <tt>(*this)</tt>
733 733
    template<typename SupplyMap>
734 734
    NetworkSimplex& supplyMap(const SupplyMap& map) {
735 735
      for (NodeIt n(_graph); n != INVALID; ++n) {
736 736
        _supply[_node_id[n]] = map[n];
737 737
      }
738 738
      return *this;
739 739
    }
740 740

	
741 741
    /// \brief Set single source and target nodes and a supply value.
742 742
    ///
743 743
    /// This function sets a single source node and a single target node
744 744
    /// and the required flow value.
745 745
    /// If neither this function nor \ref supplyMap() is used before
746 746
    /// calling \ref run(), the supply of each node will be set to zero.
747 747
    ///
748 748
    /// Using this function has the same effect as using \ref supplyMap()
749 749
    /// with such a map in which \c k is assigned to \c s, \c -k is
750 750
    /// assigned to \c t and all other nodes have zero supply value.
751 751
    ///
752 752
    /// \param s The source node.
753 753
    /// \param t The target node.
754 754
    /// \param k The required amount of flow from node \c s to node \c t
755 755
    /// (i.e. the supply of \c s and the demand of \c t).
756 756
    ///
757 757
    /// \return <tt>(*this)</tt>
758 758
    NetworkSimplex& stSupply(const Node& s, const Node& t, Value k) {
759 759
      for (int i = 0; i != _node_num; ++i) {
760 760
        _supply[i] = 0;
761 761
      }
762 762
      _supply[_node_id[s]] =  k;
763 763
      _supply[_node_id[t]] = -k;
764 764
      return *this;
765 765
    }
766 766

	
767 767
    /// \brief Set the type of the supply constraints.
768 768
    ///
769 769
    /// This function sets the type of the supply/demand constraints.
770 770
    /// If it is not used before calling \ref run(), the \ref GEQ supply
771 771
    /// type will be used.
772 772
    ///
773 773
    /// For more information, see \ref SupplyType.
774 774
    ///
775 775
    /// \return <tt>(*this)</tt>
776 776
    NetworkSimplex& supplyType(SupplyType supply_type) {
777 777
      _stype = supply_type;
778 778
      return *this;
779 779
    }
780 780

	
781 781
    /// @}
782 782

	
783 783
    /// \name Execution Control
784 784
    /// The algorithm can be executed using \ref run().
785 785

	
786 786
    /// @{
787 787

	
788 788
    /// \brief Run the algorithm.
789 789
    ///
790 790
    /// This function runs the algorithm.
791 791
    /// The paramters can be specified using functions \ref lowerMap(),
792 792
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(),
793 793
    /// \ref supplyType().
794 794
    /// For example,
795 795
    /// \code
796 796
    ///   NetworkSimplex<ListDigraph> ns(graph);
797 797
    ///   ns.lowerMap(lower).upperMap(upper).costMap(cost)
798 798
    ///     .supplyMap(sup).run();
799 799
    /// \endcode
800 800
    ///
801 801
    /// This function can be called more than once. All the given parameters
802 802
    /// are kept for the next call, unless \ref resetParams() or \ref reset()
803 803
    /// is used, thus only the modified parameters have to be set again.
804 804
    /// If the underlying digraph was also modified after the construction
805 805
    /// of the class (or the last \ref reset() call), then the \ref reset()
806 806
    /// function must be called.
807 807
    ///
808 808
    /// \param pivot_rule The pivot rule that will be used during the
809 809
    /// algorithm. For more information, see \ref PivotRule.
810 810
    ///
811 811
    /// \return \c INFEASIBLE if no feasible flow exists,
812 812
    /// \n \c OPTIMAL if the problem has optimal solution
813 813
    /// (i.e. it is feasible and bounded), and the algorithm has found
814 814
    /// optimal flow and node potentials (primal and dual solutions),
815 815
    /// \n \c UNBOUNDED if the objective function of the problem is
816 816
    /// unbounded, i.e. there is a directed cycle having negative total
817 817
    /// cost and infinite upper bound.
818 818
    ///
819 819
    /// \see ProblemType, PivotRule
820 820
    /// \see resetParams(), reset()
821 821
    ProblemType run(PivotRule pivot_rule = BLOCK_SEARCH) {
822 822
      if (!init()) return INFEASIBLE;
823 823
      return start(pivot_rule);
824 824
    }
825 825

	
826 826
    /// \brief Reset all the parameters that have been given before.
827 827
    ///
828 828
    /// This function resets all the paramaters that have been given
829 829
    /// before using functions \ref lowerMap(), \ref upperMap(),
830 830
    /// \ref costMap(), \ref supplyMap(), \ref stSupply(), \ref supplyType().
831 831
    ///
832 832
    /// It is useful for multiple \ref run() calls. Basically, all the given
833 833
    /// parameters are kept for the next \ref run() call, unless
834 834
    /// \ref resetParams() or \ref reset() is used.
835 835
    /// If the underlying digraph was also modified after the construction
836 836
    /// of the class or the last \ref reset() call, then the \ref reset()
837 837
    /// function must be used, otherwise \ref resetParams() is sufficient.
838 838
    ///
839 839
    /// For example,
840 840
    /// \code
841 841
    ///   NetworkSimplex<ListDigraph> ns(graph);
842 842
    ///
843 843
    ///   // First run
844 844
    ///   ns.lowerMap(lower).upperMap(upper).costMap(cost)
845 845
    ///     .supplyMap(sup).run();
846 846
    ///
847 847
    ///   // Run again with modified cost map (resetParams() is not called,
848 848
    ///   // so only the cost map have to be set again)
849 849
    ///   cost[e] += 100;
850 850
    ///   ns.costMap(cost).run();
851 851
    ///
852 852
    ///   // Run again from scratch using resetParams()
853 853
    ///   // (the lower bounds will be set to zero on all arcs)
854 854
    ///   ns.resetParams();
855 855
    ///   ns.upperMap(capacity).costMap(cost)
856 856
    ///     .supplyMap(sup).run();
857 857
    /// \endcode
858 858
    ///
859 859
    /// \return <tt>(*this)</tt>
860 860
    ///
861 861
    /// \see reset(), run()
862 862
    NetworkSimplex& resetParams() {
863 863
      for (int i = 0; i != _node_num; ++i) {
864 864
        _supply[i] = 0;
865 865
      }
866 866
      for (int i = 0; i != _arc_num; ++i) {
867 867
        _lower[i] = 0;
868 868
        _upper[i] = INF;
869 869
        _cost[i] = 1;
870 870
      }
871 871
      _have_lower = false;
872 872
      _stype = GEQ;
873 873
      return *this;
874 874
    }
875 875

	
876 876
    /// \brief Reset the internal data structures and all the parameters
877 877
    /// that have been given before.
878 878
    ///
879 879
    /// This function resets the internal data structures and all the
880 880
    /// paramaters that have been given before using functions \ref lowerMap(),
881 881
    /// \ref upperMap(), \ref costMap(), \ref supplyMap(), \ref stSupply(),
882 882
    /// \ref supplyType().
883 883
    ///
884 884
    /// It is useful for multiple \ref run() calls. Basically, all the given
885 885
    /// parameters are kept for the next \ref run() call, unless
886 886
    /// \ref resetParams() or \ref reset() is used.
887 887
    /// If the underlying digraph was also modified after the construction
888 888
    /// of the class or the last \ref reset() call, then the \ref reset()
889 889
    /// function must be used, otherwise \ref resetParams() is sufficient.
890 890
    ///
891 891
    /// See \ref resetParams() for examples.
892 892
    ///
893 893
    /// \return <tt>(*this)</tt>
894 894
    ///
895 895
    /// \see resetParams(), run()
896 896
    NetworkSimplex& reset() {
897 897
      // Resize vectors
898 898
      _node_num = countNodes(_graph);
899 899
      _arc_num = countArcs(_graph);
900 900
      int all_node_num = _node_num + 1;
901 901
      int max_arc_num = _arc_num + 2 * _node_num;
902 902

	
903 903
      _source.resize(max_arc_num);
904 904
      _target.resize(max_arc_num);
905 905

	
906 906
      _lower.resize(_arc_num);
907 907
      _upper.resize(_arc_num);
908 908
      _cap.resize(max_arc_num);
909 909
      _cost.resize(max_arc_num);
910 910
      _supply.resize(all_node_num);
911 911
      _flow.resize(max_arc_num);
912 912
      _pi.resize(all_node_num);
913 913

	
914 914
      _parent.resize(all_node_num);
915 915
      _pred.resize(all_node_num);
916 916
      _forward.resize(all_node_num);
917 917
      _thread.resize(all_node_num);
918 918
      _rev_thread.resize(all_node_num);
919 919
      _succ_num.resize(all_node_num);
920 920
      _last_succ.resize(all_node_num);
921 921
      _state.resize(max_arc_num);
922 922

	
923 923
      // Copy the graph
924 924
      int i = 0;
925 925
      for (NodeIt n(_graph); n != INVALID; ++n, ++i) {
926 926
        _node_id[n] = i;
927 927
      }
928 928
      if (_arc_mixing) {
929 929
        // Store the arcs in a mixed order
930 930
        int k = std::max(int(std::sqrt(double(_arc_num))), 10);
931 931
        int i = 0, j = 0;
932 932
        for (ArcIt a(_graph); a != INVALID; ++a) {
933 933
          _arc_id[a] = i;
934 934
          _source[i] = _node_id[_graph.source(a)];
935 935
          _target[i] = _node_id[_graph.target(a)];
936 936
          if ((i += k) >= _arc_num) i = ++j;
937 937
        }
938 938
      } else {
939 939
        // Store the arcs in the original order
940 940
        int i = 0;
941 941
        for (ArcIt a(_graph); a != INVALID; ++a, ++i) {
942 942
          _arc_id[a] = i;
943 943
          _source[i] = _node_id[_graph.source(a)];
944 944
          _target[i] = _node_id[_graph.target(a)];
945 945
        }
946 946
      }
947 947

	
948 948
      // Reset parameters
949 949
      resetParams();
950 950
      return *this;
951 951
    }
952 952

	
953 953
    /// @}
954 954

	
955 955
    /// \name Query Functions
956 956
    /// The results of the algorithm can be obtained using these
957 957
    /// functions.\n
958 958
    /// The \ref run() function must be called before using them.
959 959

	
960 960
    /// @{
961 961

	
962 962
    /// \brief Return the total cost of the found flow.
963 963
    ///
964 964
    /// This function returns the total cost of the found flow.
965 965
    /// Its complexity is O(e).
966 966
    ///
967 967
    /// \note The return type of the function can be specified as a
968 968
    /// template parameter. For example,
969 969
    /// \code
970 970
    ///   ns.totalCost<double>();
971 971
    /// \endcode
972 972
    /// It is useful if the total cost cannot be stored in the \c Cost
973 973
    /// type of the algorithm, which is the default return type of the
974 974
    /// function.
975 975
    ///
976 976
    /// \pre \ref run() must be called before using this function.
977 977
    template <typename Number>
978 978
    Number totalCost() const {
979 979
      Number c = 0;
980 980
      for (ArcIt a(_graph); a != INVALID; ++a) {
981 981
        int i = _arc_id[a];
982 982
        c += Number(_flow[i]) * Number(_cost[i]);
983 983
      }
984 984
      return c;
985 985
    }
986 986

	
987 987
#ifndef DOXYGEN
988 988
    Cost totalCost() const {
989 989
      return totalCost<Cost>();
990 990
    }
991 991
#endif
992 992

	
993 993
    /// \brief Return the flow on the given arc.
994 994
    ///
995 995
    /// This function returns the flow on the given arc.
996 996
    ///
997 997
    /// \pre \ref run() must be called before using this function.
998 998
    Value flow(const Arc& a) const {
999 999
      return _flow[_arc_id[a]];
1000 1000
    }
1001 1001

	
1002 1002
    /// \brief Return the flow map (the primal solution).
1003 1003
    ///
1004 1004
    /// This function copies the flow value on each arc into the given
1005 1005
    /// map. The \c Value type of the algorithm must be convertible to
1006 1006
    /// the \c Value type of the map.
1007 1007
    ///
1008 1008
    /// \pre \ref run() must be called before using this function.
1009 1009
    template <typename FlowMap>
1010 1010
    void flowMap(FlowMap &map) const {
1011 1011
      for (ArcIt a(_graph); a != INVALID; ++a) {
1012 1012
        map.set(a, _flow[_arc_id[a]]);
1013 1013
      }
1014 1014
    }
1015 1015

	
1016 1016
    /// \brief Return the potential (dual value) of the given node.
1017 1017
    ///
1018 1018
    /// This function returns the potential (dual value) of the
1019 1019
    /// given node.
1020 1020
    ///
1021 1021
    /// \pre \ref run() must be called before using this function.
1022 1022
    Cost potential(const Node& n) const {
1023 1023
      return _pi[_node_id[n]];
1024 1024
    }
1025 1025

	
1026 1026
    /// \brief Return the potential map (the dual solution).
1027 1027
    ///
1028 1028
    /// This function copies the potential (dual value) of each node
1029 1029
    /// into the given map.
1030 1030
    /// The \c Cost type of the algorithm must be convertible to the
1031 1031
    /// \c Value type of the map.
1032 1032
    ///
1033 1033
    /// \pre \ref run() must be called before using this function.
1034 1034
    template <typename PotentialMap>
1035 1035
    void potentialMap(PotentialMap &map) const {
1036 1036
      for (NodeIt n(_graph); n != INVALID; ++n) {
1037 1037
        map.set(n, _pi[_node_id[n]]);
1038 1038
      }
1039 1039
    }
1040 1040

	
1041 1041
    /// @}
1042 1042

	
1043 1043
  private:
1044 1044

	
1045 1045
    // Initialize internal data structures
1046 1046
    bool init() {
1047 1047
      if (_node_num == 0) return false;
1048 1048

	
1049 1049
      // Check the sum of supply values
1050 1050
      _sum_supply = 0;
1051 1051
      for (int i = 0; i != _node_num; ++i) {
1052 1052
        _sum_supply += _supply[i];
1053 1053
      }
1054 1054
      if ( !((_stype == GEQ && _sum_supply <= 0) ||
1055 1055
             (_stype == LEQ && _sum_supply >= 0)) ) return false;
1056 1056

	
1057 1057
      // Remove non-zero lower bounds
1058 1058
      if (_have_lower) {
1059 1059
        for (int i = 0; i != _arc_num; ++i) {
1060 1060
          Value c = _lower[i];
1061 1061
          if (c >= 0) {
1062 1062
            _cap[i] = _upper[i] < MAX ? _upper[i] - c : INF;
1063 1063
          } else {
1064 1064
            _cap[i] = _upper[i] < MAX + c ? _upper[i] - c : INF;
1065 1065
          }
1066 1066
          _supply[_source[i]] -= c;
1067 1067
          _supply[_target[i]] += c;
1068 1068
        }
1069 1069
      } else {
1070 1070
        for (int i = 0; i != _arc_num; ++i) {
1071 1071
          _cap[i] = _upper[i];
1072 1072
        }
1073 1073
      }
1074 1074

	
1075 1075
      // Initialize artifical cost
1076 1076
      Cost ART_COST;
1077 1077
      if (std::numeric_limits<Cost>::is_exact) {
1078 1078
        ART_COST = std::numeric_limits<Cost>::max() / 2 + 1;
1079 1079
      } else {
1080
        ART_COST = std::numeric_limits<Cost>::min();
1080
        ART_COST = 0;
1081 1081
        for (int i = 0; i != _arc_num; ++i) {
1082 1082
          if (_cost[i] > ART_COST) ART_COST = _cost[i];
1083 1083
        }
1084 1084
        ART_COST = (ART_COST + 1) * _node_num;
1085 1085
      }
1086 1086

	
1087 1087
      // Initialize arc maps
1088 1088
      for (int i = 0; i != _arc_num; ++i) {
1089 1089
        _flow[i] = 0;
1090 1090
        _state[i] = STATE_LOWER;
1091 1091
      }
1092 1092

	
1093 1093
      // Set data for the artificial root node
1094 1094
      _root = _node_num;
1095 1095
      _parent[_root] = -1;
1096 1096
      _pred[_root] = -1;
1097 1097
      _thread[_root] = 0;
1098 1098
      _rev_thread[0] = _root;
1099 1099
      _succ_num[_root] = _node_num + 1;
1100 1100
      _last_succ[_root] = _root - 1;
1101 1101
      _supply[_root] = -_sum_supply;
1102 1102
      _pi[_root] = 0;
1103 1103

	
1104 1104
      // Add artificial arcs and initialize the spanning tree data structure
1105 1105
      if (_sum_supply == 0) {
1106 1106
        // EQ supply constraints
1107 1107
        _search_arc_num = _arc_num;
1108 1108
        _all_arc_num = _arc_num + _node_num;
1109 1109
        for (int u = 0, e = _arc_num; u != _node_num; ++u, ++e) {
1110 1110
          _parent[u] = _root;
1111 1111
          _pred[u] = e;
1112 1112
          _thread[u] = u + 1;
1113 1113
          _rev_thread[u + 1] = u;
1114 1114
          _succ_num[u] = 1;
1115 1115
          _last_succ[u] = u;
1116 1116
          _cap[e] = INF;
1117 1117
          _state[e] = STATE_TREE;
1118 1118
          if (_supply[u] >= 0) {
1119 1119
            _forward[u] = true;
1120 1120
            _pi[u] = 0;
1121 1121
            _source[e] = u;
1122 1122
            _target[e] = _root;
1123 1123
            _flow[e] = _supply[u];
1124 1124
            _cost[e] = 0;
1125 1125
          } else {
1126 1126
            _forward[u] = false;
1127 1127
            _pi[u] = ART_COST;
1128 1128
            _source[e] = _root;
1129 1129
            _target[e] = u;
1130 1130
            _flow[e] = -_supply[u];
1131 1131
            _cost[e] = ART_COST;
1132 1132
          }
1133 1133
        }
1134 1134
      }
1135 1135
      else if (_sum_supply > 0) {
1136 1136
        // LEQ supply constraints
1137 1137
        _search_arc_num = _arc_num + _node_num;
1138 1138
        int f = _arc_num + _node_num;
1139 1139
        for (int u = 0, e = _arc_num; u != _node_num; ++u, ++e) {
1140 1140
          _parent[u] = _root;
1141 1141
          _thread[u] = u + 1;
1142 1142
          _rev_thread[u + 1] = u;
1143 1143
          _succ_num[u] = 1;
1144 1144
          _last_succ[u] = u;
1145 1145
          if (_supply[u] >= 0) {
1146 1146
            _forward[u] = true;
1147 1147
            _pi[u] = 0;
1148 1148
            _pred[u] = e;
1149 1149
            _source[e] = u;
1150 1150
            _target[e] = _root;
1151 1151
            _cap[e] = INF;
1152 1152
            _flow[e] = _supply[u];
1153 1153
            _cost[e] = 0;
1154 1154
            _state[e] = STATE_TREE;
1155 1155
          } else {
1156 1156
            _forward[u] = false;
1157 1157
            _pi[u] = ART_COST;
1158 1158
            _pred[u] = f;
1159 1159
            _source[f] = _root;
1160 1160
            _target[f] = u;
1161 1161
            _cap[f] = INF;
1162 1162
            _flow[f] = -_supply[u];
1163 1163
            _cost[f] = ART_COST;
1164 1164
            _state[f] = STATE_TREE;
1165 1165
            _source[e] = u;
1166 1166
            _target[e] = _root;
1167 1167
            _cap[e] = INF;
1168 1168
            _flow[e] = 0;
1169 1169
            _cost[e] = 0;
1170 1170
            _state[e] = STATE_LOWER;
1171 1171
            ++f;
1172 1172
          }
1173 1173
        }
1174 1174
        _all_arc_num = f;
1175 1175
      }
1176 1176
      else {
1177 1177
        // GEQ supply constraints
1178 1178
        _search_arc_num = _arc_num + _node_num;
1179 1179
        int f = _arc_num + _node_num;
1180 1180
        for (int u = 0, e = _arc_num; u != _node_num; ++u, ++e) {
1181 1181
          _parent[u] = _root;
1182 1182
          _thread[u] = u + 1;
1183 1183
          _rev_thread[u + 1] = u;
1184 1184
          _succ_num[u] = 1;
1185 1185
          _last_succ[u] = u;
1186 1186
          if (_supply[u] <= 0) {
1187 1187
            _forward[u] = false;
1188 1188
            _pi[u] = 0;
1189 1189
            _pred[u] = e;
1190 1190
            _source[e] = _root;
1191 1191
            _target[e] = u;
1192 1192
            _cap[e] = INF;
1193 1193
            _flow[e] = -_supply[u];
1194 1194
            _cost[e] = 0;
1195 1195
            _state[e] = STATE_TREE;
1196 1196
          } else {
1197 1197
            _forward[u] = true;
1198 1198
            _pi[u] = -ART_COST;
1199 1199
            _pred[u] = f;
1200 1200
            _source[f] = u;
1201 1201
            _target[f] = _root;
1202 1202
            _cap[f] = INF;
1203 1203
            _flow[f] = _supply[u];
1204 1204
            _state[f] = STATE_TREE;
1205 1205
            _cost[f] = ART_COST;
1206 1206
            _source[e] = _root;
1207 1207
            _target[e] = u;
1208 1208
            _cap[e] = INF;
1209 1209
            _flow[e] = 0;
1210 1210
            _cost[e] = 0;
1211 1211
            _state[e] = STATE_LOWER;
1212 1212
            ++f;
1213 1213
          }
1214 1214
        }
1215 1215
        _all_arc_num = f;
1216 1216
      }
1217 1217

	
1218 1218
      return true;
1219 1219
    }
1220 1220

	
1221 1221
    // Find the join node
1222 1222
    void findJoinNode() {
1223 1223
      int u = _source[in_arc];
1224 1224
      int v = _target[in_arc];
1225 1225
      while (u != v) {
1226 1226
        if (_succ_num[u] < _succ_num[v]) {
1227 1227
          u = _parent[u];
1228 1228
        } else {
1229 1229
          v = _parent[v];
1230 1230
        }
1231 1231
      }
1232 1232
      join = u;
1233 1233
    }
1234 1234

	
1235 1235
    // Find the leaving arc of the cycle and returns true if the
1236 1236
    // leaving arc is not the same as the entering arc
1237 1237
    bool findLeavingArc() {
1238 1238
      // Initialize first and second nodes according to the direction
1239 1239
      // of the cycle
1240 1240
      if (_state[in_arc] == STATE_LOWER) {
1241 1241
        first  = _source[in_arc];
1242 1242
        second = _target[in_arc];
1243 1243
      } else {
1244 1244
        first  = _target[in_arc];
1245 1245
        second = _source[in_arc];
1246 1246
      }
1247 1247
      delta = _cap[in_arc];
1248 1248
      int result = 0;
1249 1249
      Value d;
1250 1250
      int e;
1251 1251

	
1252 1252
      // Search the cycle along the path form the first node to the root
1253 1253
      for (int u = first; u != join; u = _parent[u]) {
1254 1254
        e = _pred[u];
1255 1255
        d = _forward[u] ?
1256 1256
          _flow[e] : (_cap[e] >= MAX ? INF : _cap[e] - _flow[e]);
1257 1257
        if (d < delta) {
1258 1258
          delta = d;
1259 1259
          u_out = u;
1260 1260
          result = 1;
1261 1261
        }
1262 1262
      }
1263 1263
      // Search the cycle along the path form the second node to the root
1264 1264
      for (int u = second; u != join; u = _parent[u]) {
1265 1265
        e = _pred[u];
1266 1266
        d = _forward[u] ?
1267 1267
          (_cap[e] >= MAX ? INF : _cap[e] - _flow[e]) : _flow[e];
1268 1268
        if (d <= delta) {
1269 1269
          delta = d;
1270 1270
          u_out = u;
1271 1271
          result = 2;
1272 1272
        }
1273 1273
      }
1274 1274

	
1275 1275
      if (result == 1) {
1276 1276
        u_in = first;
1277 1277
        v_in = second;
1278 1278
      } else {
1279 1279
        u_in = second;
1280 1280
        v_in = first;
1281 1281
      }
1282 1282
      return result != 0;
1283 1283
    }
1284 1284

	
1285 1285
    // Change _flow and _state vectors
1286 1286
    void changeFlow(bool change) {
1287 1287
      // Augment along the cycle
1288 1288
      if (delta > 0) {
1289 1289
        Value val = _state[in_arc] * delta;
1290 1290
        _flow[in_arc] += val;
1291 1291
        for (int u = _source[in_arc]; u != join; u = _parent[u]) {
1292 1292
          _flow[_pred[u]] += _forward[u] ? -val : val;
1293 1293
        }
1294 1294
        for (int u = _target[in_arc]; u != join; u = _parent[u]) {
1295 1295
          _flow[_pred[u]] += _forward[u] ? val : -val;
1296 1296
        }
1297 1297
      }
1298 1298
      // Update the state of the entering and leaving arcs
1299 1299
      if (change) {
1300 1300
        _state[in_arc] = STATE_TREE;
1301 1301
        _state[_pred[u_out]] =
1302 1302
          (_flow[_pred[u_out]] == 0) ? STATE_LOWER : STATE_UPPER;
1303 1303
      } else {
1304 1304
        _state[in_arc] = -_state[in_arc];
1305 1305
      }
1306 1306
    }
1307 1307

	
1308 1308
    // Update the tree structure
1309 1309
    void updateTreeStructure() {
1310 1310
      int u, w;
1311 1311
      int old_rev_thread = _rev_thread[u_out];
1312 1312
      int old_succ_num = _succ_num[u_out];
1313 1313
      int old_last_succ = _last_succ[u_out];
1314 1314
      v_out = _parent[u_out];
1315 1315

	
1316 1316
      u = _last_succ[u_in];  // the last successor of u_in
1317 1317
      right = _thread[u];    // the node after it
1318 1318

	
1319 1319
      // Handle the case when old_rev_thread equals to v_in
1320 1320
      // (it also means that join and v_out coincide)
1321 1321
      if (old_rev_thread == v_in) {
1322 1322
        last = _thread[_last_succ[u_out]];
1323 1323
      } else {
1324 1324
        last = _thread[v_in];
1325 1325
      }
1326 1326

	
1327 1327
      // Update _thread and _parent along the stem nodes (i.e. the nodes
1328 1328
      // between u_in and u_out, whose parent have to be changed)
1329 1329
      _thread[v_in] = stem = u_in;
1330 1330
      _dirty_revs.clear();
1331 1331
      _dirty_revs.push_back(v_in);
1332 1332
      par_stem = v_in;
1333 1333
      while (stem != u_out) {
1334 1334
        // Insert the next stem node into the thread list
1335 1335
        new_stem = _parent[stem];
1336 1336
        _thread[u] = new_stem;
1337 1337
        _dirty_revs.push_back(u);
1338 1338

	
1339 1339
        // Remove the subtree of stem from the thread list
1340 1340
        w = _rev_thread[stem];
1341 1341
        _thread[w] = right;
1342 1342
        _rev_thread[right] = w;
1343 1343

	
1344 1344
        // Change the parent node and shift stem nodes
1345 1345
        _parent[stem] = par_stem;
1346 1346
        par_stem = stem;
1347 1347
        stem = new_stem;
1348 1348

	
1349 1349
        // Update u and right
1350 1350
        u = _last_succ[stem] == _last_succ[par_stem] ?
1351 1351
          _rev_thread[par_stem] : _last_succ[stem];
1352 1352
        right = _thread[u];
1353 1353
      }
1354 1354
      _parent[u_out] = par_stem;
1355 1355
      _thread[u] = last;
1356 1356
      _rev_thread[last] = u;
1357 1357
      _last_succ[u_out] = u;
1358 1358

	
1359 1359
      // Remove the subtree of u_out from the thread list except for
1360 1360
      // the case when old_rev_thread equals to v_in
1361 1361
      // (it also means that join and v_out coincide)
1362 1362
      if (old_rev_thread != v_in) {
1363 1363
        _thread[old_rev_thread] = right;
1364 1364
        _rev_thread[right] = old_rev_thread;
1365 1365
      }
1366 1366

	
1367 1367
      // Update _rev_thread using the new _thread values
1368 1368
      for (int i = 0; i != int(_dirty_revs.size()); ++i) {
1369 1369
        u = _dirty_revs[i];
1370 1370
        _rev_thread[_thread[u]] = u;
1371 1371
      }
1372 1372

	
1373 1373
      // Update _pred, _forward, _last_succ and _succ_num for the
1374 1374
      // stem nodes from u_out to u_in
1375 1375
      int tmp_sc = 0, tmp_ls = _last_succ[u_out];
1376 1376
      u = u_out;
1377 1377
      while (u != u_in) {
1378 1378
        w = _parent[u];
1379 1379
        _pred[u] = _pred[w];
1380 1380
        _forward[u] = !_forward[w];
1381 1381
        tmp_sc += _succ_num[u] - _succ_num[w];
1382 1382
        _succ_num[u] = tmp_sc;
1383 1383
        _last_succ[w] = tmp_ls;
1384 1384
        u = w;
1385 1385
      }
1386 1386
      _pred[u_in] = in_arc;
1387 1387
      _forward[u_in] = (u_in == _source[in_arc]);
1388 1388
      _succ_num[u_in] = old_succ_num;
1389 1389

	
1390 1390
      // Set limits for updating _last_succ form v_in and v_out
1391 1391
      // towards the root
1392 1392
      int up_limit_in = -1;
1393 1393
      int up_limit_out = -1;
1394 1394
      if (_last_succ[join] == v_in) {
1395 1395
        up_limit_out = join;
1396 1396
      } else {
1397 1397
        up_limit_in = join;
1398 1398
      }
1399 1399

	
1400 1400
      // Update _last_succ from v_in towards the root
1401 1401
      for (u = v_in; u != up_limit_in && _last_succ[u] == v_in;
1402 1402
           u = _parent[u]) {
1403 1403
        _last_succ[u] = _last_succ[u_out];
1404 1404
      }
1405 1405
      // Update _last_succ from v_out towards the root
1406 1406
      if (join != old_rev_thread && v_in != old_rev_thread) {
1407 1407
        for (u = v_out; u != up_limit_out && _last_succ[u] == old_last_succ;
1408 1408
             u = _parent[u]) {
1409 1409
          _last_succ[u] = old_rev_thread;
1410 1410
        }
1411 1411
      } else {
1412 1412
        for (u = v_out; u != up_limit_out && _last_succ[u] == old_last_succ;
1413 1413
             u = _parent[u]) {
1414 1414
          _last_succ[u] = _last_succ[u_out];
1415 1415
        }
1416 1416
      }
1417 1417

	
1418 1418
      // Update _succ_num from v_in to join
1419 1419
      for (u = v_in; u != join; u = _parent[u]) {
1420 1420
        _succ_num[u] += old_succ_num;
1421 1421
      }
1422 1422
      // Update _succ_num from v_out to join
1423 1423
      for (u = v_out; u != join; u = _parent[u]) {
1424 1424
        _succ_num[u] -= old_succ_num;
1425 1425
      }
1426 1426
    }
1427 1427

	
1428 1428
    // Update potentials
1429 1429
    void updatePotential() {
1430 1430
      Cost sigma = _forward[u_in] ?
1431 1431
        _pi[v_in] - _pi[u_in] - _cost[_pred[u_in]] :
1432 1432
        _pi[v_in] - _pi[u_in] + _cost[_pred[u_in]];
1433 1433
      // Update potentials in the subtree, which has been moved
1434 1434
      int end = _thread[_last_succ[u_in]];
1435 1435
      for (int u = u_in; u != end; u = _thread[u]) {
1436 1436
        _pi[u] += sigma;
1437 1437
      }
1438 1438
    }
1439 1439

	
1440 1440
    // Heuristic initial pivots
1441 1441
    bool initialPivots() {
1442 1442
      Value curr, total = 0;
1443 1443
      std::vector<Node> supply_nodes, demand_nodes;
1444 1444
      for (NodeIt u(_graph); u != INVALID; ++u) {
1445 1445
        curr = _supply[_node_id[u]];
1446 1446
        if (curr > 0) {
1447 1447
          total += curr;
1448 1448
          supply_nodes.push_back(u);
1449 1449
        }
1450 1450
        else if (curr < 0) {
1451 1451
          demand_nodes.push_back(u);
1452 1452
        }
1453 1453
      }
1454 1454
      if (_sum_supply > 0) total -= _sum_supply;
1455 1455
      if (total <= 0) return true;
1456 1456

	
1457 1457
      IntVector arc_vector;
1458 1458
      if (_sum_supply >= 0) {
1459 1459
        if (supply_nodes.size() == 1 && demand_nodes.size() == 1) {
1460 1460
          // Perform a reverse graph search from the sink to the source
1461 1461
          typename GR::template NodeMap<bool> reached(_graph, false);
1462 1462
          Node s = supply_nodes[0], t = demand_nodes[0];
1463 1463
          std::vector<Node> stack;
1464 1464
          reached[t] = true;
1465 1465
          stack.push_back(t);
1466 1466
          while (!stack.empty()) {
1467 1467
            Node u, v = stack.back();
1468 1468
            stack.pop_back();
1469 1469
            if (v == s) break;
1470 1470
            for (InArcIt a(_graph, v); a != INVALID; ++a) {
1471 1471
              if (reached[u = _graph.source(a)]) continue;
1472 1472
              int j = _arc_id[a];
1473 1473
              if (_cap[j] >= total) {
1474 1474
                arc_vector.push_back(j);
1475 1475
                reached[u] = true;
1476 1476
                stack.push_back(u);
1477 1477
              }
1478 1478
            }
1479 1479
          }
1480 1480
        } else {
1481 1481
          // Find the min. cost incomming arc for each demand node
1482 1482
          for (int i = 0; i != int(demand_nodes.size()); ++i) {
1483 1483
            Node v = demand_nodes[i];
1484 1484
            Cost c, min_cost = std::numeric_limits<Cost>::max();
1485 1485
            Arc min_arc = INVALID;
1486 1486
            for (InArcIt a(_graph, v); a != INVALID; ++a) {
1487 1487
              c = _cost[_arc_id[a]];
1488 1488
              if (c < min_cost) {
1489 1489
                min_cost = c;
1490 1490
                min_arc = a;
1491 1491
              }
1492 1492
            }
1493 1493
            if (min_arc != INVALID) {
1494 1494
              arc_vector.push_back(_arc_id[min_arc]);
1495 1495
            }
1496 1496
          }
1497 1497
        }
1498 1498
      } else {
1499 1499
        // Find the min. cost outgoing arc for each supply node
1500 1500
        for (int i = 0; i != int(supply_nodes.size()); ++i) {
1501 1501
          Node u = supply_nodes[i];
1502 1502
          Cost c, min_cost = std::numeric_limits<Cost>::max();
1503 1503
          Arc min_arc = INVALID;
1504 1504
          for (OutArcIt a(_graph, u); a != INVALID; ++a) {
1505 1505
            c = _cost[_arc_id[a]];
1506 1506
            if (c < min_cost) {
1507 1507
              min_cost = c;
1508 1508
              min_arc = a;
1509 1509
            }
1510 1510
          }
1511 1511
          if (min_arc != INVALID) {
1512 1512
            arc_vector.push_back(_arc_id[min_arc]);
1513 1513
          }
1514 1514
        }
1515 1515
      }
1516 1516

	
1517 1517
      // Perform heuristic initial pivots
1518 1518
      for (int i = 0; i != int(arc_vector.size()); ++i) {
1519 1519
        in_arc = arc_vector[i];
1520 1520
        if (_state[in_arc] * (_cost[in_arc] + _pi[_source[in_arc]] -
1521 1521
            _pi[_target[in_arc]]) >= 0) continue;
1522 1522
        findJoinNode();
1523 1523
        bool change = findLeavingArc();
1524 1524
        if (delta >= MAX) return false;
1525 1525
        changeFlow(change);
1526 1526
        if (change) {
1527 1527
          updateTreeStructure();
1528 1528
          updatePotential();
1529 1529
        }
1530 1530
      }
1531 1531
      return true;
1532 1532
    }
1533 1533

	
1534 1534
    // Execute the algorithm
1535 1535
    ProblemType start(PivotRule pivot_rule) {
1536 1536
      // Select the pivot rule implementation
1537 1537
      switch (pivot_rule) {
1538 1538
        case FIRST_ELIGIBLE:
1539 1539
          return start<FirstEligiblePivotRule>();
1540 1540
        case BEST_ELIGIBLE:
1541 1541
          return start<BestEligiblePivotRule>();
1542 1542
        case BLOCK_SEARCH:
1543 1543
          return start<BlockSearchPivotRule>();
1544 1544
        case CANDIDATE_LIST:
1545 1545
          return start<CandidateListPivotRule>();
1546 1546
        case ALTERING_LIST:
1547 1547
          return start<AlteringListPivotRule>();
1548 1548
      }
1549 1549
      return INFEASIBLE; // avoid warning
1550 1550
    }
1551 1551

	
1552 1552
    template <typename PivotRuleImpl>
1553 1553
    ProblemType start() {
1554 1554
      PivotRuleImpl pivot(*this);
1555 1555

	
1556 1556
      // Perform heuristic initial pivots
1557 1557
      if (!initialPivots()) return UNBOUNDED;
1558 1558

	
1559 1559
      // Execute the Network Simplex algorithm
1560 1560
      while (pivot.findEnteringArc()) {
1561 1561
        findJoinNode();
1562 1562
        bool change = findLeavingArc();
1563 1563
        if (delta >= MAX) return UNBOUNDED;
1564 1564
        changeFlow(change);
1565 1565
        if (change) {
1566 1566
          updateTreeStructure();
1567 1567
          updatePotential();
1568 1568
        }
1569 1569
      }
1570 1570

	
1571 1571
      // Check feasibility
1572 1572
      for (int e = _search_arc_num; e != _all_arc_num; ++e) {
1573 1573
        if (_flow[e] != 0) return INFEASIBLE;
1574 1574
      }
1575 1575

	
1576 1576
      // Transform the solution and the supply map to the original form
1577 1577
      if (_have_lower) {
1578 1578
        for (int i = 0; i != _arc_num; ++i) {
1579 1579
          Value c = _lower[i];
1580 1580
          if (c != 0) {
1581 1581
            _flow[i] += c;
1582 1582
            _supply[_source[i]] += c;
1583 1583
            _supply[_target[i]] -= c;
1584 1584
          }
1585 1585
        }
1586 1586
      }
1587 1587

	
1588 1588
      // Shift potentials to meet the requirements of the GEQ/LEQ type
1589 1589
      // optimality conditions
1590 1590
      if (_sum_supply == 0) {
1591 1591
        if (_stype == GEQ) {
1592
          Cost max_pot = std::numeric_limits<Cost>::min();
1592
          Cost max_pot = -std::numeric_limits<Cost>::max();
1593 1593
          for (int i = 0; i != _node_num; ++i) {
1594 1594
            if (_pi[i] > max_pot) max_pot = _pi[i];
1595 1595
          }
1596 1596
          if (max_pot > 0) {
1597 1597
            for (int i = 0; i != _node_num; ++i)
1598 1598
              _pi[i] -= max_pot;
1599 1599
          }
1600 1600
        } else {
1601 1601
          Cost min_pot = std::numeric_limits<Cost>::max();
1602 1602
          for (int i = 0; i != _node_num; ++i) {
1603 1603
            if (_pi[i] < min_pot) min_pot = _pi[i];
1604 1604
          }
1605 1605
          if (min_pot < 0) {
1606 1606
            for (int i = 0; i != _node_num; ++i)
1607 1607
              _pi[i] -= min_pot;
1608 1608
          }
1609 1609
        }
1610 1610
      }
1611 1611

	
1612 1612
      return OPTIMAL;
1613 1613
    }
1614 1614

	
1615 1615
  }; //class NetworkSimplex
1616 1616

	
1617 1617
  ///@}
1618 1618

	
1619 1619
} //namespace lemon
1620 1620

	
1621 1621
#endif //LEMON_NETWORK_SIMPLEX_H
0 comments (0 inline)