/home/coin/SVN-release/OS-2.1.1/Bonmin/src/Interfaces/BonBoundsReader.cpp

Go to the documentation of this file.
00001 // (C) Copyright Carnegie Mellon University 2005
00002 // All Rights Reserved.
00003 // This code is published under the Common Public License.
00004 //
00005 // Authors :
00006 // Pierre Bonami, Carnegie Mellon University,
00007 //
00008 // Date : 26/05/2005
00009 
00010 #include "BonBoundsReader.hpp"
00011 
00012 #include <fstream>
00013 
00014 namespace Bonmin {
00015 BoundsReader::~BoundsReader()
00016 {
00017   gutsOfDestructor();
00018 }
00019 void BoundsReader::gutsOfDestructor()
00020 {
00021   if(nLower_ > 0) {
00022     assert(lowerBounds_!= NULL);
00023     delete [] lowerBounds_;
00024     lowerBounds_ = NULL;
00025     assert(indexLowers_ != NULL);
00026     delete [] indexLowers_;
00027     indexLowers_ = NULL;
00028   }
00029   else {
00030     assert(lowerBounds_ == NULL);
00031     assert(indexLowers_ == NULL);
00032   }
00033   if(nUpper_ > 0) {
00034     assert(upperBounds_!= NULL);
00035     delete [] upperBounds_;
00036     upperBounds_ = NULL;
00037     assert(indexUppers_ != NULL);
00038     delete [] indexUppers_;
00039     indexUppers_ = NULL;
00040   }
00041   else {
00042     assert(upperBounds_ == NULL);
00043     assert(indexUppers_ == NULL);
00044   }
00045   nLower_=0;
00046   nUpper_=0;
00047 }
00048 
00049 void BoundsReader::read(const std::string &fileName)
00050 {
00051   setFileName(fileName);
00052   read();
00053 }
00054 
00055 void BoundsReader::read()
00056 {
00057   gutsOfDestructor();
00058   //First count the number of lower and upper bounds resp
00059   std::string lo="LO";
00060   std::string up="UP";
00061   std::string in;
00062   {
00063     std::ifstream fin(fileName_.c_str());
00064     //std::streampos begin = fin.tellg();
00065     while(!fin.eof()) {
00066       fin>>in;
00067       if(in==lo)
00068         nLower_++;
00069       else if(in==up)
00070         nUpper_++;
00071       else
00072         throw;
00073       fin.ignore(10000,'\n');
00074     }
00075   }
00076   if(nLower_ > 0) {
00077     lowerBounds_ = new double[nLower_];
00078     indexLowers_ = new int[nLower_];
00079   }
00080   if(nUpper_ > 0) {
00081     upperBounds_ = new double[nUpper_];
00082     indexUppers_ = new int[nUpper_];
00083   }
00084   //fin.seekg(0);
00085   // fin.seekg( 0, std::ios::beg);
00086   nLower_ = 0;
00087   nUpper_ = 0;
00088   {
00089     std::ifstream fin2(fileName_.c_str());
00090     //fin.close();
00091     //fin.open(fileName_.c_str());
00092     while(!fin2.eof()) {
00093       int index;
00094       double bound;
00095       fin2>>in>>index>>bound;
00096       if(in==lo) {
00097         lowerBounds_[nLower_] = bound;
00098         indexLowers_[nLower_++] = index;
00099       }
00100       else if(in==up) {
00101         upperBounds_[nUpper_] = bound;
00102         indexUppers_[nUpper_++] = index;
00103       }
00104       else
00105         throw;
00106       fin2.ignore(10000,'\n');
00107     }
00108   }
00109 }
00110 
00111 void BoundsReader::readAndApply(OsiTMINLPInterface * solver)
00112 {
00113   read();
00114   for(int i = 0 ; i < nLower_ ; i++) {
00115     solver->setColLower(indexLowers_[i], lowerBounds_[i]);
00116   }
00117   for(int i = 0 ; i < nUpper_ ; i++) {
00118     solver->setColUpper(indexUppers_[i], upperBounds_[i]);
00119   }
00120 }
00121 }

Generated on Mon May 3 03:05:16 2010 by  doxygen 1.4.7