00001 /* $Id: CouenneExprBQuad.hpp 490 2011-01-14 16:07:12Z 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 Eclipse Public License (EPL) 00009 */ 00010 00011 #ifndef COUENNE_EXPRBQUAD_H 00012 #define COUENNE_EXPRBQUAD_H 00013 00014 #include "CouenneExprOp.hpp" 00015 #include "CouenneExprQuad.hpp" 00016 00017 namespace Couenne { 00018 00021 00022 class exprLBQuad: public expression { 00023 00024 exprQuad *ref_; 00025 00026 public: 00027 00029 exprLBQuad (exprQuad *ref): 00030 ref_ (ref) {} 00031 00033 exprLBQuad (const exprLBQuad &src, Domain *d = NULL): 00034 ref_ (dynamic_cast <exprQuad *> (src.ref_ -> isaCopy () ? 00035 src.ref_ -> Copy () -> clone (d) : 00036 src.ref_ -> clone (d))) {} 00037 00039 ~exprLBQuad () {} 00040 00042 expression *clone (Domain *d = NULL) const 00043 {return new exprLBQuad (*this, d);} 00044 00046 inline CouNumber operator () () 00047 {return ref_ -> computeQBound (-1);} 00048 00050 virtual void print (std::ostream &s = std::cout, //< output stream 00051 bool descend = false) const //< descend into auxiliaries' image? 00052 00053 {s << "quadLower("; ref_ -> print (s, descend); s << ')';} 00054 }; 00055 00056 00059 00060 class exprUBQuad: public expression { 00061 00062 exprQuad *ref_; 00063 00064 public: 00065 00067 exprUBQuad (exprQuad *ref): 00068 ref_ (ref) {} 00069 00071 exprUBQuad (const exprUBQuad &src, Domain *d = NULL): 00072 ref_ (dynamic_cast <exprQuad *> (src.ref_ -> isaCopy () ? 00073 src.ref_ -> Copy () -> clone (d) : 00074 src.ref_ -> clone (d))) {} 00075 00077 ~exprUBQuad () {} 00078 00080 expression *clone (Domain *d = NULL) const 00081 {return new exprUBQuad (*this, d);} 00082 00084 inline CouNumber operator () () 00085 {return ref_ -> computeQBound (1);} 00086 00088 virtual void print (std::ostream &s = std::cout, //< output stream 00089 bool descend = false) const //< descend into auxiliaries' image? 00090 00091 {s << "quadUpper("; ref_ -> print (s, descend); s << ')';} 00092 }; 00093 00094 } 00095 00096 #endif