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

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

Added class for in-group-proportions score. Removed gslapi::vector dependence on DataLookup1D by adding classifier::utility functions. Added operator[] to Target and DataLookup1D

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