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 }