00001 #ifndef SUBMODULAR_H 00002 #define SUBMODULAR_H 00003 00004 #include<scil/scil.h> 00005 #include<queue> 00006 00007 namespace SCIL { 00008 00009 class submodular : public sym_constraint { 00010 00011 public: 00012 var v; 00013 var_map<int>& VM; 00014 int n; 00015 solution TS; 00016 double oldval; 00017 00018 public: 00020 submodular(var& v_, var_map<int>& VM_, int n_) 00021 : v(v_), VM(VM_), n(n_) { 00022 feps = 1.0e-4; 00023 } 00024 00025 virtual void init(subproblem& S) { 00026 return; 00027 } 00028 00029 status standard_separation(subproblem& S); 00030 00031 status feasible(solution& Sol) { 00032 return (Sol.value(v) > value(Sol) - .0001) ? feasible_solution : infeasible_solution; 00033 } 00034 00035 virtual double value(solution& Sol) = 0; 00036 private: 00038 virtual double value(int p) { 00039 TS.set_value(VM[p], 1.); 00040 return value(TS); 00041 } 00043 virtual double value() { 00044 TS.set_zero(); 00045 oldval = 0.; 00046 return 0.; 00047 } 00048 }; 00049 00050 }; 00051 #endif