00001 #include<scil/constraints/submodular.h>
00002 #include<list>
00003
00004 using namespace SCIL;
00005
00006 submodular::status submodular::standard_separation(subproblem& S) {
00007 std::list< pair<double,int> > lQ;
00008 for( int i=0; i<n; i++ )
00009 lQ.push_back( make_pair<double,int>(S.value(VM[i]),i) );
00010
00011 lQ.sort();
00012
00013 int st;
00014 row r;
00015 double a;
00016 double lhs = 0.;
00017 double oldval = value();
00018 double val;
00019 for( int i=0; i<n; i++ ){
00020 st = (lQ.back()).second;
00021 lQ.pop_back();
00022 val = value(st);
00023 a = val - oldval;
00024 if( fabs(a) > feps ) {
00025 r += VM[st] * a;
00026 lhs += a * S.value(VM[st]);
00027 }
00028 oldval = val;
00029 }
00030 if( lhs > S.value(v) + .01 ) {
00031 r -= v;
00032 S.add_basic_constraint(r<=0.);
00033 return constraint_found;
00034 }
00035 return no_constraint_found;
00036 }