Sandia Home Sandia Home
Main Page | Publications | Downloads | Configuration | Running the Code | Solver Parameters | FAQ | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

APPSPACK_List.cpp

Go to the documentation of this file.
00001 // $Id: APPSPACK_List.cpp,v 1.8 2004/04/12 17:43:55 tgkolda Exp $ 
00002 // $Source: /space/CVS-Acro/acro/packages/appspack/appspack/src/APPSPACK_List.cpp,v $ 
00003 
00004 //@HEADER
00005 // ************************************************************************
00006 // 
00007 //          APPSPACK: Asynchronous Parallel Pattern Search
00008 //                 Copyright (2003) Sandia Corporation
00009 // 
00010 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00011 // license for use of this work by or on behalf of the U.S. Government.
00012 // 
00013 // This library is free software; you can redistribute it and/or modify
00014 // it under the terms of the GNU Lesser General Public License as
00015 // published by the Free Software Foundation; either version 2.1 of the
00016 // License, or (at your option) any later version.
00017 //  
00018 // This library is distributed in the hope that it will be useful, but
00019 // WITHOUT ANY WARRANTY; without even the implied warranty of
00020 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00021 // Lesser General Public License for more details.
00022 //                                                                                 
00023 // You should have received a copy of the GNU Lesser General Public
00024 // License along with this library; if not, write to the Free Software
00025 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00026 // USA.                                                                           .
00027 // 
00028 // Questions? Contact Tammy Kolda (tgkolda@sandia.gov) 
00029 // 
00030 // ************************************************************************
00031 //@HEADER
00032 
00038 #include "APPSPACK_List.hpp"
00039 #include "APPSPACK_Print.hpp"
00040 
00041 APPSPACK::List::List() :
00042   isValidBest(false)
00043 {
00044 
00045 }
00046 
00047 APPSPACK::List::~List()
00048 {
00049   prune();
00050 }
00051 
00052 bool APPSPACK::List::isEmpty() const
00053 {
00054   return tpl.empty();
00055 }
00056 
00057 bool APPSPACK::List::isNotEmpty() const
00058 {
00059   return !(tpl.empty());
00060 }
00061 
00062 int APPSPACK::List::size() const
00063 {
00064   return tpl.size();
00065 }
00066 
00067 void APPSPACK::List::push(Point* pushed)
00068 {
00069   isValidBest = false;
00070   tpl.push_front(pushed);
00071 }
00072 
00073 void APPSPACK::List::insertList(List& source)
00074 {
00075   isValidBest = false;
00076   tpl.insert(tpl.begin(), source.tpl.begin(), source.tpl.end());
00077   source.tpl.clear();
00078 }
00079 
00080 void APPSPACK::List::prune(int n)
00081 {
00082   if (n <= 0)
00083   {
00084     for (TPL::iterator tpi = tpl.begin(); tpi != tpl.end(); tpi ++)
00085       delete *tpi;
00086     
00087     tpl.clear();
00088   }
00089   else
00090   {
00091     int p = size() - n;
00092     Point* popped;
00093     for (int i = 0; i < p; i ++)
00094     {
00095       popped = pop();
00096       delete popped;
00097     }
00098   }
00099 }
00100 
00101 APPSPACK::Point* APPSPACK::List::pop()
00102 {
00103   if (tpl.empty())
00104     return NULL;
00105 
00106   isValidBest = false;
00107   Point* popped = tpl.back();
00108   tpl.pop_back();
00109   return popped;
00110 }
00111 
00112 APPSPACK::Point* APPSPACK::List::pop(int tag)
00113 {
00114   if (tpl.empty())
00115     return NULL;
00116 
00117   TPL::iterator tpi = tpl.begin();
00118   for (; tpi != tpl.end(); tpi ++)
00119     if (((*tpi)->getTag()) == tag)
00120       break;
00121 
00122   if (tpi == tpl.end())
00123     return NULL;
00124 
00125   isValidBest = false;
00126   Point* popped = *tpi;
00127   tpl.erase(tpi);
00128 
00129   return popped;
00130 }
00131 
00132 void APPSPACK::List::moveBestToEndOfList() 
00133 {
00134   if (isValidBest) 
00135     return;
00136 
00137   if (tpl.empty())
00138   {
00139     cerr << "APPSPACK::List::moveBestToEndOfList - "
00140          << "Trying to find the best in an empty list!" << endl;
00141     throw "APPSPACK Error";
00142   }
00143 
00144   if (tpl.size() == 1)
00145     return;
00146 
00147   // Find the index of the best point
00148   TPL::iterator bestIterator = tpl.begin();
00149   TPL::iterator tpi = tpl.begin();
00150 
00151   for (tpi ++; tpi != tpl.end(); tpi ++)
00152     if (**tpi < **bestIterator)
00153       bestIterator = tpi;
00154 
00155   // Swap the best point to the end of the list
00156   Point* tmp = *bestIterator;
00157   *bestIterator = tpl.back();
00158   tpl.back() = tmp;
00159 
00160   isValidBest = true;
00161 }
00162 
00163 const APPSPACK::Point& APPSPACK::List::best() 
00164 {
00165   moveBestToEndOfList();
00166   return *tpl.back();
00167 }
00168 
00169 APPSPACK::Point* APPSPACK::List::popBest()
00170 {
00171   moveBestToEndOfList();
00172   return pop();
00173 }
00174 
00175 void APPSPACK::List::print(const string label) const
00176 {
00177   cout << "\n" << label << ":\n";
00178 
00179   if (tpl.empty())
00180   {
00181     cout << "<empty>" << endl;
00182     return;
00183   }
00184 
00185   for (TPL::const_reverse_iterator tpi = tpl.rbegin(); tpi != tpl.rend(); tpi ++)
00186     cout << *(*tpi) << endl;
00187 }

 

© Sandia Corporation | Site Contact | Privacy and Security

Generated on Fri Feb 16 10:33:35 2007 for APPSPACK 5.0.1 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2002