source: trunk/lib/classifier/Target.cc @ 505

Last change on this file since 505 was 505, checked in by Markus Ringnér, 17 years ago

Continuing with adding validation functionality to EnsembleBuilder?. Structure is there but also bugs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 4.1 KB
Line 
1// $Id: Target.cc 505 2006-02-02 16:34:38Z markus $
2
3#include <c++_tools/classifier/Target.h>
4#include <c++_tools/utility/stl_utility.h>
5#include <c++_tools/utility/utility.h>
6
7#include <sstream>
8#include <utility>
9#include <vector>
10#include <iostream>
11
12namespace theplu {
13namespace classifier {
14
15  Target::Target(const std::vector<int>& vec)
16    : vector_(vec)
17  {
18    init_classes();
19  }
20 
21  Target::Target(const Target& t, 
22                 const std::vector<size_t>& index)
23  {
24    vector_.resize(index.size());
25    for (size_t i=0; i<index.size(); i++) 
26      vector_[i]=t(index[i]);
27    // Peter which of the two below do we want here?
28    //    init_classes();
29    classes_=t.classes_;
30  }
31
32
33  // Peter to Markus, align with gslapi
34  Target::Target(std::istream& is, char sep) 
35    throw (utility::IO_error,std::exception)
36  {
37    // read the data file and store in stl vectors (dynamically
38    // expandable)
39    std::vector<std::vector<int> > data_matrix;
40    u_int nof_columns=0;
41    u_int nof_rows=0;
42    std::string line;
43    while(getline(is, line, '\n')) {
44      // Empty lines
45      if (!line.size())
46          continue;
47      nof_rows++;
48     
49      std::vector<int> v;
50      std::string element;
51      std::stringstream ss(line);
52      bool ok=true;
53      while(ok) {
54        if(sep=='\0')
55          ok=(ss>>element);
56        else 
57          ok=getline(ss, element, sep);
58        if(!ok)
59          break;       
60
61        if(utility::is_int(element)) {
62          v.push_back(atoi(element.c_str()));
63        }
64        else if (!element.size() || utility::is_nan(element)) {
65          v.push_back(std::numeric_limits<int>::quiet_NaN());
66        }
67        else {
68          // Jari, this should be communicated with as an exception.
69          // std::cerr << "Warning: '" << element
70          //           << "' is not an integer." << std::endl;
71        }
72      } 
73      if(sep!='\0' && line[line.size()-1]==sep) // add NaN for final separator
74          v.push_back(std::numeric_limits<int>::quiet_NaN());
75      if (!nof_columns)
76        nof_columns=v.size();
77      else if (nof_rows && (nof_columns>1)) {
78        std::ostringstream s;
79        s << "Target::Target(std::istream&) data file error:\n"
80          << "    File has inconsistent number of rows (" << nof_rows
81          << ") and columns (" << nof_columns
82          << ").\n    Expected a row or a column vector.";
83        throw utility::IO_error(s.str());
84      }
85      else if (v.size()!=nof_columns) {
86        std::ostringstream s;
87        s << "Target::Target(std::istream&) data file error:\n"
88          << "    Line " << nof_rows << " has " << v.size()
89          << " columns; expected " << nof_columns << " column.";
90        throw utility::IO_error(s.str());
91      }
92      data_matrix.push_back(v);
93    }
94
95    // manipulate the state of the stream to be good
96    is.clear(std::ios::goodbit);
97    // copy data into vector
98    if (nof_rows==1)
99      vector_=data_matrix[0];
100    else{
101      vector_.resize(nof_rows);
102      for (size_t i=0; i<nof_rows; i++)
103        vector_[i]=data_matrix[i][0];
104    }
105
106    init_classes();
107  }
108 
109  Target::~Target(void)
110  {
111  }
112
113  u_int Target::classes(int target) const 
114  {
115    std::map<int,u_int>::const_iterator i = classes_.find(target);
116    if(i==classes_.end()) {
117      // Jari change to exception at some point
118      std::cerr << "Looking for the class of a non-existant target value!";
119      return 0;
120    }     
121    else
122      return i->second; 
123  }
124
125  const Target& Target::operator*=(const int d)
126  {
127    for (size_t i=0; i<size(); i++) 
128      vector_[i]*=d;
129    init_classes();
130    return *this;
131  }
132
133  const Target& Target::operator=(const Target& other)
134  {
135    vector_=other.vector_;
136    classes_=other.classes_;   
137    return *this;
138  }
139
140  void Target::init_classes(void) 
141  {
142    classes_.clear();
143
144    std::vector<int> sorted_target=vector_;
145    std::sort(sorted_target.begin(),sorted_target.end());
146    std::vector<int>::iterator i = std::unique(sorted_target.begin(), 
147                                     sorted_target.end());
148    sorted_target.erase(i, sorted_target.end());
149
150    u_int nof_classes=0;
151    for (size_t i=0; i<sorted_target.size(); i++) {
152      std::pair<const int, u_int> p(sorted_target[i],nof_classes);
153      std::pair<std::map<int,u_int>::iterator,bool> 
154        status=classes_.insert(p);
155      if(status.second==true) {
156        nof_classes++;
157      }
158    } 
159  }
160
161  std::ostream& operator<<(std::ostream& s, const Target& a)
162  {
163    for (size_t j = 0; j < a.size(); ++j) {
164      s << a(j);
165      if ( (j+1)<a.size() )
166        s << " ";
167    }
168
169    return s;
170  }
171
172
173}} // of namespace classifier and namespace theplu
Note: See TracBrowser for help on using the repository browser.