/* $Id$ * * Name: lqelems.hpp * Author: Pietro Belotti * Purpose: definition of elemental elements of linear and bilinear expressions * * (C) Carnegie-Mellon University, 2007. * This file is licensed under the Eclipse Public License (EPL) */ #ifndef COUENNE_LQELEMS_H #define COUENNE_LQELEMS_H #include #include "CouenneConfig.h" #include "CouenneTypes.hpp" namespace Couenne { class COUENNELIB_EXPORT quadElem { private: exprVar *varI_; exprVar *varJ_; CouNumber coeff_; public: quadElem (exprVar *i, exprVar *j, CouNumber c): varI_ (i), varJ_ (j), coeff_ (c) {} quadElem (const quadElem &src): varI_ (src.varI_), varJ_ (src.varJ_), coeff_ (src.coeff_) {} quadElem *clone () {return new quadElem (*this);} inline exprVar *varI () {return varI_;} inline exprVar *varJ () {return varJ_;} inline CouNumber coeff () {return coeff_;} }; class COUENNELIB_EXPORT LinMap { private: std::map lmap_; public: /// public access std::map &Map () {return lmap_;} /// insert a pair into a map for linear terms void insert (int index, CouNumber coe) { std::map ::iterator i = lmap_.find (index); if (i != lmap_.end()) { if (fabs (i -> second += coe) < COUENNE_EPS) lmap_.erase (i); } else { std::pair npair (index, coe); lmap_.insert (npair); } } }; class COUENNELIB_EXPORT QuadMap { private: std::map , CouNumber> qmap_; public: /// public access std::map , CouNumber> &Map () {return qmap_;} /// insert a pair <,CouNumber> into a map for quadratic terms void insert (int indI, int indJ, CouNumber coe) { std::pair nind (indI, indJ); std::map , CouNumber>::iterator i = qmap_.find (nind); if (i != qmap_.end()) { if (fabs (i -> second += coe) < COUENNE_EPS) qmap_.erase (i); } else { std::pair , CouNumber> npair (nind, coe); qmap_.insert (npair); } } }; } #endif