source: trunk/c++_tools/classifier/Target.cc @ 591

Last change on this file since 591 was 591, checked in by Peter, 15 years ago

added random_shuffle function in Target class

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 2.6 KB
Line 
1// $Id: Target.cc 591 2006-08-24 11:17:36Z peter $
2
3#include <c++_tools/classifier/Target.h>
4#include <c++_tools/random/random.h>
5#include <c++_tools/utility/stl_utility.h>
6#include <c++_tools/utility/utility.h>
7
8#include <algorithm>
9#include <cassert>
10#include <iostream>
11#include <map>
12#include <string>
13#include <sstream>
14#include <utility>
15#include <vector>
16
17namespace theplu {
18namespace classifier {
19
20  Target::Target(const std::vector<std::string>& label)
21  {
22    init(label);
23  }
24 
25  Target::Target(const Target& t, 
26                 const std::vector<size_t>& index)
27    : class_map_(t.class_map_)
28  {
29    binary_=t.binary_;
30    classes_.resize(index.size());
31    for (size_t i=0; i<index.size(); i++) {
32      assert(index[i]<t.size());
33      classes_[i]=t.classes_[index[i]];
34    }
35    labels_ = t.labels_;
36  }
37
38
39  Target::Target(std::istream& is, char sep) 
40    throw (utility::IO_error,std::exception)
41  {
42    std::vector<std::string> vec;
43    std::string word;
44    bool ok=true;
45    while(ok) {
46      if(sep=='\0')
47        ok=(is>>word);
48      else 
49        ok=getline(is, word, sep);
50
51      // ignore empty words
52      if (!word.size() || !ok )
53        continue;
54     
55      vec.push_back(word);
56    }
57
58    // manipulate the state of the stream to be good
59    is.clear(std::ios::goodbit);
60
61    init(vec);
62  }
63 
64  Target::~Target(void)
65  {
66  }
67
68  void Target::init(const std::vector<std::string>& label) 
69  {
70    classes_.clear();
71    classes_.reserve(label.size());
72    class_map_.clear();
73    labels_.clear();
74   
75    for (size_t i=0; i<label.size(); i++) {
76      std::map<std::string,size_t>::iterator iter = 
77        class_map_.lower_bound(label[i]);
78
79      // label in map
80      if (iter != class_map_.end() && 
81          !(class_map_.key_comp()(label[i],iter->first)) ){
82
83        classes_.push_back(iter->second);
84      }
85      // label not found in map
86      else{
87        classes_.push_back(class_map_.size());
88        class_map_.insert(iter, std::make_pair(label[i],classes_[i])); 
89        labels_.push_back(label[i]);
90      }
91    }
92    // setting binary to false for every class
93    binary_=std::vector<char>(nof_classes(),false);
94   
95    set_binary(0,true);
96
97  }
98
99  void Target::random_shuffle(void)
100  {
101    random::DiscreteUniform d;
102    std::random_shuffle(classes_.begin(), classes_.end(),d);
103  }
104
105  const size_t Target::size(const std::string& label) const 
106  {
107    std::map<std::string,size_t>::const_iterator i=class_map_.find(label);   
108    if(i==class_map_.end())
109      return 0;
110    assert(i->first==label);
111    return size(i->second);
112  }
113 
114  const size_t Target::size(size_t cl) const
115  {
116    return std::count(classes_.begin(),classes_.end(),cl);
117  }
118
119
120  std::ostream& operator<<(std::ostream& s, const Target& a)
121  {
122    for (size_t j = 0; j < a.size(); ++j) {
123      s << a(j);
124      if ( (j+1)<a.size() )
125        s << " ";
126    }
127
128    return s;
129  }
130
131
132}} // of namespace classifier and namespace theplu
Note: See TracBrowser for help on using the repository browser.