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 }