/home/coin/SVN-release/OS-2.4.0/Couenne/src/problem/fillDependence.cpp

Go to the documentation of this file.
00001 /* $Id: fillDependence.cpp 490 2011-01-14 16:07:12Z pbelotti $
00002  *
00003  * Name:    fillDependence.cpp
00004  * Author:  Pietro Belotti
00005  * Purpose: fill in inverse dependence structure, for CouenneObject
00006  *
00007  * (C) Carnegie-Mellon University, 2008-09.
00008  * This file is licensed under the Eclipse Public License (EPL)
00009  */
00010 
00011 #include <vector>
00012 #include <set>
00013 
00014 #include "CouenneObject.hpp"
00015 #include "CouenneProblem.hpp"
00016 
00017 using namespace Couenne;
00018 
00022 
00023 void CouenneProblem::fillDependence (Bonmin::BabSetupBase *base, CouenneCutGenerator *cg) {
00024 
00025   // initialize vector of empty sets
00026   for (int i=nVars (); i--;)
00027     dependence_.push_back (std::set <int> ());
00028 
00029   for (std::vector <exprVar *>::iterator i = variables_.begin (); 
00030        i != variables_.end (); ++i) {
00031 
00032     if (((*i) -> Type () == AUX)                           // consider auxs only
00033         && ((*i) -> Image () -> Linearity () > LINEAR)) {  // and nonlinear
00034 
00035       CouenneObject *infeasObj = (*i) -> properObject (cg, this, base, jnlst_);
00036 
00037       if (!(infeasObj -> Reference ())) // found something that will never be infeasible
00038         continue;
00039 
00040       // add object for this variable
00041       objects_.push_back (infeasObj);
00042 
00043       std::set <int> deplist;
00044 
00045       // fill the set of independent variables on which the expression
00046       // associated with *i depends; if empty (should not happen...), skip
00047       if ((*i) -> Image () -> DepList (deplist, STOP_AT_AUX) == 0)
00048         continue;
00049 
00050       // build dependence set for this variable
00051       for (std::set <int>::iterator j = deplist.begin (); j != deplist.end (); ++j) {
00052 
00053         std::set <int> &obj = dependence_ [*j];
00054         int ind = (*i) -> Index ();
00055         if (obj.find (ind) == obj.end ())
00056           obj.insert (ind);
00057       }
00058 
00059     } else objects_.push_back (new CouenneObject ()); 
00060     // null object for original and linear auxiliaries
00061   }
00062 }

Generated on Thu Sep 22 03:05:59 2011 by  doxygen 1.4.7