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

Go to the documentation of this file.
00001 /* $Id: CouenneRestoreUnused.cpp 490 2011-01-14 16:07:12Z pbelotti $
00002  *
00003  * Name:    CouenneRestoreUnused.cpp
00004  * Authors: Pietro Belotti, Lehigh University
00005  * Purpose: Restore a consistent value of duplicate variables 
00006  *
00007  * This file is licensed under the Eclipse Public License (EPL)
00008  */
00009 
00010 #include "CouenneProblem.hpp"
00011 #include "CouenneExprVar.hpp"
00012 
00013 using namespace Couenne;
00014 
00019 void CouenneProblem::createUnusedOriginals () {
00020 
00021   if (nUnusedOriginals_ < 0) { // no structure yet, identify and store
00022 
00023     nUnusedOriginals_ = 0;
00024 
00025     int 
00026       nOrig = nOrigVars (),
00027       nvars = nVars     ();
00028 
00029     unusedOriginalsIndices_ = (int *) malloc (nvars * sizeof (int)); // will trim it later
00030 
00031     for (int i=0; i<nvars; i++) {
00032 
00033       int indVar = numbering_ [i];
00034 
00035       if ((indVar < nOrig) && 
00036           (variables_ [indVar] -> Multiplicity () <= 0)) // found neglected variable!
00037         unusedOriginalsIndices_ [nUnusedOriginals_++] = indVar;
00038     }
00039 
00040     if (nUnusedOriginals_)
00041       unusedOriginalsIndices_ = (int *) realloc (unusedOriginalsIndices_, 
00042                                                  nUnusedOriginals_ * sizeof (int));
00043     else {
00044       free (unusedOriginalsIndices_);
00045       unusedOriginalsIndices_ = NULL;
00046     }
00047   }
00048 }
00049 
00050 
00054 void CouenneProblem::restoreUnusedOriginals (CouNumber *x) const {
00055 
00056   if (nUnusedOriginals_ <= 0) return;
00057 
00058   if (x)
00059     domain_.push (nVars(), x, NULL, NULL, false); // no need for another copy
00060 
00061   for (int i=0; i<nUnusedOriginals_; i++) {
00062 
00063     int indVar = unusedOriginalsIndices_ [i];
00064     expression *img = variables_ [indVar] -> Image ();
00065 
00066     if (img) {
00067 
00068       CouNumber value = (*img) ();
00069 
00070       X  (indVar) = value;
00071 
00072       if (x)
00073         x  [indVar] = value;
00074     }
00075   }
00076 
00077   if (x)
00078     domain_. pop ();
00079 }

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