00001 #ifndef KNAPSACK_H
00002 #define KNAPSACK_H
00003
00004 #include <scil/scil.h>
00005 #include <set>
00006 #include <vector>
00007
00008 namespace SCIL {
00009
00010 class LCI : public cons_obj {
00011
00012 public:
00013
00014 std::vector<int> coeff_array ;
00015 int rhs ;
00016 std::map<int,var>& item_index_map ;
00017
00018 LCI(std::vector<int> coeff,int r, std::map<int,var>& map);
00019 ~LCI();
00020
00021
00022
00023
00024
00025 virtual void non_zero_entries(row& r);
00026
00027 };
00028
00029 class CP_KNAPSACK : public sym_constraint {
00030
00031 private:
00032
00033 cons_obj* KC ;
00034 std::map<int,var> item_index_map;
00035 double violation_tolerance ;
00036 bool lifted_in_C2 ;
00037 bool lifted_in_F ;
00038 int index ;
00039 int rightsum ;
00041 int gammasum ;
00042 int Ti ;
00043 int number_variables ;
00044 int r ;
00045 int previous_lift_index ;
00046 int righthandside ;
00047 bool no_sep ;
00048 std::list<int> negative_coeff_indices ;
00049 std::vector<int> liftcoeffs ;
00050 std::vector<int> coeffs ;
00051
00052 std::map<int,double> fractional_point ;
00053 std::vector<int> sort_array ;
00054 std::vector<int> liftsequence_on_R ;
00055 std::vector<int> liftsequence_on_C2 ;
00056 std::vector<int>* W1 ;
00057 std::vector<int>* W2 ;
00058 std::set<int> F ;
00059 std::set<int> R ;
00060 std::set<int> C1 ;
00061 std::set<int> C2 ;
00062 std::set<int> to_lift_in_F ;
00063 std::set<int> to_lift_in_C2 ;
00064 std::set<int> to_lift_in_R ;
00065 std::set<int> N ;
00066
00070 int find_largest_index(std::vector<int> vec, int val);
00071
00072 public:
00073
00075 CP_KNAPSACK(cons_obj* KCt, double tolerance=0.001);
00076
00079 void init(subproblem& S);
00080
00081
00085 void update_Ti(int x);
00086
00091 void update_gammasum(int x);
00092
00096 int init_righthandsum();
00097
00104 int update_righthandsum(int x);
00105
00106
00109 bool compute_cover();
00110
00111 void lift_on_F( std::vector<int>* W );
00112
00113 void lift_on_C2 ( std::vector<int>* W );
00114
00115 void lift_on_R ( std::vector<int>* W );
00116
00117 void compute_first_row();
00118
00119 void compute_next_row();
00120
00121 void setup_values(subproblem& S);
00122
00125 status standard_separation(subproblem& S);
00126
00129 void info();
00130 };
00131
00132 }
00133
00134 #endif