indii/ml/data/TextFileReader.cpp

00001 #include "TextFileReader.hpp"
00002 
00003 namespace aux = indii::ml::aux;
00004 
00005 using namespace indii::ml::data;
00006 
00007 TextFileReader::TextFileReader(std::istream* in) : Reader(in) {
00008   nextLine();
00009 }
00010 
00011 TextFileReader::TextFileReader(const std::string& file) : Reader(file) {
00012   nextLine();
00013 }
00014 
00015 TextFileReader::TextFileReader(std::istream* in, unsigned int col) :
00016     Reader(in, col) {
00017   nextLine();
00018 }
00019 
00020 TextFileReader::TextFileReader(const std::string& file, unsigned int col) :
00021     Reader(file, col) {
00022   nextLine();
00023 }
00024 
00025 TextFileReader::TextFileReader(std::istream* in,
00026     const std::vector<unsigned int>& cols) : Reader(in, cols) {
00027   nextLine();
00028 }
00029 
00030 TextFileReader::TextFileReader(const std::string& file,
00031     const std::vector<unsigned int>& cols) : Reader(file, cols) {
00032   nextLine();
00033 }
00034 
00035 TextFileReader::~TextFileReader() {
00036   //
00037 }
00038 
00039 unsigned int TextFileReader::read(double* into) {
00040   if (in->eof()) {
00041     return 0;
00042   } else {
00043     if (cols.empty()) {
00044       /* all values of interest, return next */
00045       *into = values[nextIndex];
00046       nextIndex++;
00047       if (nextIndex >= values.size()) {
00048         nextLine();
00049       }
00050     } else {
00051       /* return next value of interest */
00052       *into = values[cols[nextIndex]];
00053       nextIndex++;
00054       if (nextIndex >= cols.size() || cols[nextIndex] > values.size()) {
00055         nextLine();
00056       }
00057     }
00058     return 1;
00059   }
00060 }
00061 
00062 unsigned int TextFileReader::read(aux::vector* into) {
00063   double x;
00064   unsigned int i = 0;
00065   unsigned int size = into->size();
00066 
00067   while (i < size && read(&x) > 0) {
00068     (*into)(i) = x;
00069     i++;
00070   }
00071   return i;
00072 }
00073 
00074 unsigned int TextFileReader::read(aux::matrix* into) {
00075   double x;
00076   unsigned int numRead = 0;
00077   unsigned int i = 0, j = 0;
00078   unsigned int size1 = into->size1(), size2 = into->size2();
00079 
00080   for (j = 0; j < size2; j++) {
00081     for (i = 0; i < size1 && read(&x) > 0; i++) {
00082       numRead++;
00083       (*into)(i,j) = x;
00084     }
00085   }
00086 
00087   return numRead;
00088 }
00089 
00090 unsigned int TextFileReader::read(aux::symmetric_matrix* into) {
00091   double x;
00092   unsigned int numRead = 0;
00093   unsigned int i, j;
00094   unsigned int size = into->size1();
00095   for (j = 0; j < size; j++) {
00096     for (i = j; i < size && read(&x) > 0; i++) {
00097       numRead++;
00098       (*into)(i,j) = x;
00099     }
00100   }
00101 
00102   return numRead;
00103 }
00104 
00105 void TextFileReader::nextLine() {
00106   double value;
00107   std::string line;
00108   std::stringstream lineStream;
00109 
00110   nextIndex = 0;
00111   values.clear();
00112 
00113   std::getline(*in, line);
00114   if (!in->eof()) {
00115     /* read in all values on this line */
00116     lineStream.str(line);
00117     do {
00118       lineStream >> value;
00119       values.push_back(value);
00120     } while (!lineStream.eof());
00121   }
00122 }
00123 

Generated on Wed Dec 17 15:11:57 2008 for dysii Dynamical Systems Library by  doxygen 1.5.3