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

Last change on this file since 506 was 506, checked in by Jari Häkkinen, 16 years ago

Fixed spelling error.

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