00001 #ifndef SCIL_BOOLFUNCTION
00002 #define SCIL_BOOLFUNCTION
00003
00004 #include<scil/variable.h>
00005 #include<scil/scil.h>
00006
00007 namespace SCIL {
00008
00017 class boolfunction {
00018
00019 friend class bool_inst;
00020
00021 private:
00023 row rLinear;
00025 var v;
00027 boolfunction* left;
00029 boolfunction* right;
00031 boolOperator op;
00033 bool negated;
00040 std::string originalTerm;
00042 void remove_negation(bool root=true);
00045 void remove_xor_equ();
00046
00048 inline void set_rLinear(row r) { rLinear = r;}
00049
00051 inline void set_left(boolfunction* _left) { left = _left; }
00052
00054 inline void set_right(boolfunction* _right) { right = _right; }
00055
00057 inline void set_op(boolOperator _op) { op = _op; }
00058
00059
00060 public:
00061 boolfunction() : left(NULL), right(NULL), v(NULL), negated(false), rLinear(0) {};
00063 boolfunction(var _v, bool _negated = false)
00064 : left(NULL), right(NULL), v(_v), op(BASIC), negated(_negated), rLinear(0) { };
00065
00067 boolfunction(var _v1, var _v2, boolOperator _op, bool _negated = false)
00068 : v(NULL), op(_op), negated(_negated), rLinear(0) {
00069 left = new boolfunction(_v1);
00070 right = new boolfunction(_v2);
00071 };
00072
00074 boolfunction(boolfunction* _left, var _v2, boolOperator _op, bool _negated = false)
00075 : v(NULL), op(_op), negated(_negated), left(_left->copy()), rLinear(0) {
00076 right = new boolfunction(_v2);
00077 }
00078
00080 boolfunction(var _v1, boolfunction* _right, boolOperator _op, bool _negated = false)
00081 : v(NULL), op(_op), negated(_negated), right(_right->copy()), rLinear(0) {
00082 left = new boolfunction(_v1);
00083 }
00084
00086 boolfunction(boolfunction* _left, boolfunction* _right, boolOperator _op, bool _negated = false)
00087 : v(NULL), op(_op), negated(_negated), left(_left->copy()), right(_right->copy()), rLinear(0) { };
00088
00089 ~boolfunction() {
00090 if(left!=NULL)
00091 delete left;
00092 if(right!=NULL)
00093 delete right;
00094 }
00095
00097 boolfunction* copy();
00098
00100 inline row get_rLinear() const { return rLinear; }
00101
00103 inline boolfunction* get_left() const { return left; }
00104
00106 inline boolfunction* get_right() const { return right; }
00107
00111 inline var get_v() const { return v; }
00112
00114 inline boolOperator get_op() const { return op; }
00115
00117 inline bool is_negated() const { return negated; }
00118
00120 inline void negate() { negated = !negated; }
00121
00123 void add(boolOperator _op, var _v, bool negated = false);
00124
00126 void add(var _v, boolOperator _op, bool negated = false);
00127
00129 void add(boolfunction* _left, boolOperator _op, bool negated = false);
00130
00132 void add(boolOperator _op, boolfunction* _right, bool negated = false);
00133
00135 var& linearize(ILP_Problem& IP);
00136
00142 void simplify();
00143
00145 bool evaluate(solution& S);
00146
00148 inline std::string get_originalTerm() {return originalTerm;}
00149
00151 std::string toString();
00152
00155 bool isHomogeneous(boolOperator _op = BASIC);
00156
00158 std::vector<var> get_vars();
00159
00160
00161 };
00162
00164 std::ostream& operator<<(std::ostream& o, const boolfunction* bf);
00165
00167 bool bfcompare_less(const boolfunction* bf1, const boolfunction* bf2);
00168
00170 bool bfcompare_equal(const boolfunction* bf1, const boolfunction* bf2);
00171 };
00172 #endif
00173
00174
00175
00176
00177