00001 /* $Id: exprBQuad.hpp 141 2009-06-03 04:19:19Z pbelotti $ */ 00002 /* 00003 * Name: exprBQuad.hpp 00004 * Author: Pietro Belotti 00005 * Purpose: definition of operators to compute lower/upper bounds of quadratic forms 00006 * 00007 * (C) Carnegie-Mellon University, 2006. 00008 * This file is licensed under the Common Public License (CPL) 00009 */ 00010 00011 #ifndef COUENNE_EXPRBQUAD_H 00012 #define COUENNE_EXPRBQUAD_H 00013 00014 #include "exprOp.hpp" 00015 #include "exprQuad.hpp" 00016 00017 00020 00021 class exprLBQuad: public expression { 00022 00023 exprQuad *ref_; 00024 00025 public: 00026 00028 exprLBQuad (exprQuad *ref): 00029 ref_ (ref) {} 00030 00032 exprLBQuad (const exprLBQuad &src, Domain *d = NULL): 00033 ref_ (dynamic_cast <exprQuad *> (src.ref_ -> isaCopy () ? 00034 src.ref_ -> Copy () -> clone (d) : 00035 src.ref_ -> clone (d))) {} 00036 00038 ~exprLBQuad () {} 00039 00041 expression *clone (Domain *d = NULL) const 00042 {return new exprLBQuad (*this, d);} 00043 00045 inline CouNumber operator () () 00046 {return ref_ -> computeQBound (-1);} 00047 00049 virtual void print (std::ostream &s = std::cout, //< output stream 00050 bool descend = false) const //< descend into auxiliaries' image? 00051 00052 {s << "quadLower("; ref_ -> print (s, descend); s << ')';} 00053 }; 00054 00055 00058 00059 class exprUBQuad: public expression { 00060 00061 exprQuad *ref_; 00062 00063 public: 00064 00066 exprUBQuad (exprQuad *ref): 00067 ref_ (ref) {} 00068 00070 exprUBQuad (const exprUBQuad &src, Domain *d = NULL): 00071 ref_ (dynamic_cast <exprQuad *> (src.ref_ -> isaCopy () ? 00072 src.ref_ -> Copy () -> clone (d) : 00073 src.ref_ -> clone (d))) {} 00074 00076 ~exprUBQuad () {} 00077 00079 expression *clone (Domain *d = NULL) const 00080 {return new exprUBQuad (*this, d);} 00081 00083 inline CouNumber operator () () 00084 {return ref_ -> computeQBound (1);} 00085 00087 virtual void print (std::ostream &s = std::cout, //< output stream 00088 bool descend = false) const //< descend into auxiliaries' image? 00089 00090 {s << "quadUpper("; ref_ -> print (s, descend); s << ')';} 00091 }; 00092 00093 #endif