Djinni  2.2
TSPTWWorld.cc
00001 #include "TSPTWWorld.h"
00002 #include <iostream>
00003 #include <sstream>
00004 #include <fstream>
00005 
00006 using std::istream;
00007 using std::ostream;
00008 using std::getline;
00009 using std::string;
00010 using std::stringstream;
00011 using std::vector;
00012 using std::ifstream;
00013 using std::endl;
00014 using std::cerr;
00015 using std::cout;
00016 using std::back_inserter;
00017 using std::copy;
00018 
00019 namespace {
00020   void consume_lines(istream& is, int lines)
00021   {
00022     string discard;
00023     while (lines--)
00024       getline(is, discard);
00025   }
00026 
00027   void loadDumas(istream& is, TSPTWWorld& tsp)
00028   {
00029     string line;
00030 
00031     consume_lines(is, 5);
00032     while (is) {
00033       double row[6] = { 0, 0, 0, 0, 0, 0 };
00034       int discard;
00035       stringstream ss;
00036       getline(is, line);
00037       ss << line;
00038       ss >> discard;
00039       if (999 == discard)
00040         break;
00041       ss >> row[0] >> row[1] >> row[2] >> row[3]
00042          >> row[4] >> row[5];
00043       vector<double> Row(row, row + 6);
00044       tsp.data().push_back(Matrix<double, 1>(Row));
00045     }
00046   }
00047 
00048   void loadSolomon(istream& is, TSPTWWorld& tsp)
00049   {
00050     string line;
00051 
00052     consume_lines(is, 6);
00053     int custNum = 0;
00054     while (is) {
00055       double row[6] = { 0, 0, 0, 0, 0, 0 };
00056       int discard;
00057       stringstream ss;
00058       getline(is, line);
00059       if (line == "")
00060         break;
00061       ss << line;
00062       ss >> discard;
00063       if (discard < custNum++)
00064         break;
00065       ss >> row[0] >> row[1] >> row[2]
00066          >> row[3] >> row[4] >> row[5];
00067       vector<double> Row(row, row + 6);
00068       tsp.data().push_back(Matrix<double, 1>(Row));
00069     }
00070   }
00071 }
00072 
00073 TSPTWWorld::TSPTWWorld(const char* filename)
00074 {
00075   ifstream in(filename);
00076   string line;
00077 
00078   data().reset();
00079 
00080   getline(in, line);
00081   getline(in, line);
00082   getline(in, line);
00083   if (line.substr(0, 2) == "!!") {
00084     loadDumas(in, *this);
00085     computeTravelTimes();
00086   }
00087   else if (line.substr(0, 7) == "VEHICLE") {
00088     loadSolomon(in, *this);
00089     computeTravelTimes();
00090   }
00091 }
00092 
00093 TSPTWWorld::TSPTWWorld(const std::string& filename)
00094 {
00095   ifstream in(filename.c_str());
00096   string line;
00097 
00098   data().reset();
00099 
00100   getline(in, line);
00101   getline(in, line);
00102   getline(in, line);
00103   if (line.substr(0, 2) == "!!") {
00104     loadDumas(in, *this);
00105     computeTravelTimes();
00106   }
00107   else if (line.substr(0, 7) == "VEHICLE") {
00108     loadSolomon(in, *this);
00109     computeTravelTimes();
00110   }
00111 }
00112 
00113 ostream& operator<<(ostream& os, const TSPTWWorld& w)
00114 {
00115   for (unsigned int i = 0 ; i < w.data().size() ; i++)
00116     {
00117       for (unsigned j = 0 ; j < w.data()[i].size() ; j++)
00118         os << w.data()[i][j] << "\t";
00119       os << "\n";
00120     }
00121   return os;
00122 }
00123