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

Go to the documentation of this file.
00001 /* $Id: fillDependence.cpp 259 2009-10-04 14:20:13Z 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 Common Public License (CPL)
00009  */
00010 
00011 #include <vector>
00012 #include <set>
00013 
00014 #include "CouenneProblem.hpp"
00015 
00016 
00020 
00021 void CouenneProblem::fillDependence (Bonmin::BabSetupBase *base, CouenneCutGenerator *cg) {
00022 
00023   // initialize vector of empty sets
00024   for (int i=nVars (); i--;)
00025     dependence_.push_back (std::set <int> ());
00026 
00027   // empty object to fill space for linear-defined auxiliaries and for
00028   // originals
00029   //CouenneObject nullObject;
00030 
00031   for (std::vector <exprVar *>::iterator i = variables_.begin (); 
00032        i != variables_.end (); ++i) {
00033 
00034     if (((*i) -> Type () == AUX)                           // consider auxs only
00035         && ((*i) -> Image () -> Linearity () > LINEAR)) {  // and nonlinear
00036 
00037       CouenneObject *infeasObj = (*i) -> properObject (cg, this, base, jnlst_);
00038 
00039       if (!(infeasObj -> Reference ())) // found something that will never be infeasible
00040         continue;
00041 
00042       // add object for this variable
00043       objects_.push_back (infeasObj);
00044 
00045       std::set <int> deplist;
00046 
00047       // fill the set of independent variables on which the expression
00048       // associated with *i depends; if empty (should not happen...), skip
00049       if ((*i) -> Image () -> DepList (deplist, STOP_AT_AUX) == 0)
00050         continue;
00051 
00052       // build dependence set for this variable
00053       for (std::set <int>::iterator j = deplist.begin (); j != deplist.end (); ++j) {
00054 
00055         std::set <int> &obj = dependence_ [*j];
00056         int ind = (*i) -> Index ();
00057         if (obj.find (ind) == obj.end ())
00058           obj.insert (ind);
00059       }
00060 
00061     } else objects_.push_back (new CouenneObject ()); 
00062     // null object for original and linear auxiliaries
00063   }
00064 }

Generated on Thu Aug 5 03:02:57 2010 by  doxygen 1.4.7