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

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

Reverting these files to revision 505; these were changed by mistake.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 4.1 KB
Line 
1// $Id: Target.cc 507 2006-02-17 00:02:57Z 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(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.