00001 #include<scil/cons_obj.h>
00002 #include<scil/var_obj.h>
00003 #include<scil/row.h>
00004 #include<scil/subproblem.h>
00005
00006 cons_obj::cons_obj (cons_sense s, double rhs__)
00007 {
00008 sense_ = s;
00009 rhs_ = rhs__;
00010
00011
00012 };
00013
00014 cons_obj::cons_obj ()
00015 {
00016 sense_ = Equal;
00017 rhs_ = 0;
00018
00019
00020 }
00021
00022 bool
00023 cons_obj::violated (subproblem & S)
00024 {
00025 row
00026 r;
00027 row_entry
00028 t;
00029 double
00030 x = 0;
00031 non_zero_entries(r);
00032 forall (t, r)
00033 {
00034 x += t.coeff * S.value (t.Var);
00035 };
00036
00037 if (sense () == Equal)
00038 return fabs (x - rhs ()) > 0.001;
00039 if (sense () == Less)
00040 return x - rhs () > 0.001;
00041 return x - rhs () < -0.001;
00042 }
00043
00044 void
00045 cons_obj::init ()
00046 {
00047 row r;
00048 non_zero_entries(r);
00049
00050 non_zeros=r.size();
00051 rows=new int[non_zeros];
00052 coeffs=new double[non_zeros];
00053
00054 row_entry v;
00055 int i=0;
00056 forall(v, r) {
00057 rows[i]=v.Var.index();
00058 coeffs[i]=v.coeff;
00059 i++;
00060 };
00061 }
00062
00063 void
00064 cons_obj::set_sense (cons_sense s)
00065 {
00066
00067 sense_ = s;
00068 };
00069
00070
00071 void
00072 cons_obj::set_rhs (double r)
00073 {
00074
00075 rhs_ = r;
00076 };
00077
00078 double
00079 cons_obj::rhs ()
00080 {
00081
00082 return rhs_;
00083 };
00084
00085
00086 cons_sense
00087 cons_obj::sense ()
00088 {
00089
00090 return sense_;
00091 }
00092
00093 void
00094 cons_obj::set (var_obj * v, double d)
00095 {
00096 CM[v] = d;
00097 }
00098
00099 double
00100 cons_obj::upper_bound() {
00101 if(sense()==Greater) return 1e+30;
00102 return rhs();
00103 }
00104
00105 double
00106 cons_obj::lower_bound() {
00107 if(sense()==Less) return -1e+30;
00108 return rhs();
00109 };