source: trunk/c++_tools/classifier/SVindex.cc @ 660

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

closes #140 moved Index class to its own file and changed name to SVindex

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 2.5 KB
Line 
1// $Id: SVindex.cc 660 2006-09-27 08:53:56Z peter $
2
3#include <c++_tools/classifier/SVindex.h>
4
5#include <c++_tools/classifier/DataLookup2D.h>
6#include <c++_tools/random/random.h>
7#include <c++_tools/statistics/Averager.h>
8#include <c++_tools/utility/matrix.h>
9#include <c++_tools/utility/vector.h>
10
11#include <algorithm>
12#include <cassert>
13#include <cctype>
14#include <cmath>
15#include <limits>
16#include <utility>
17#include <vector>
18
19
20namespace theplu {
21namespace classifier { 
22
23  SVindex::SVindex(void)
24    : nof_sv_(0), vec_(std::vector<size_t>(0))
25  {
26  }
27
28  SVindex::SVindex(const size_t n)
29    : nof_sv_(0), vec_(std::vector<size_t>(n))
30  {
31    for (size_t i=0; i<vec_.size(); i++)
32      vec_[i]=i;
33  }
34
35  void SVindex::init(const utility::vector& alpha, const double tol)
36  {
37    nof_sv_=0;
38    size_t nof_nsv=0;
39    for (size_t i=0; i<alpha.size(); i++) 
40      if (alpha(i)<tol){
41        nof_nsv++;
42        vec_[vec_.size()-nof_nsv]=i;
43      }
44      else{
45        vec_[nof_sv_]=i;
46        nof_sv_++;
47      }
48    assert(nof_sv_+nof_nsv==vec_.size());
49
50  }
51
52  void SVindex::sv_first(void)
53  {
54    // if already sv, do nothing
55    if (index_first_<nof_sv())
56      return;
57
58    // swap elements
59    if(index_second_==nof_sv_){
60      index_second_=index_first_;
61    }
62    vec_[index_first_]=vec_[nof_sv_];
63    vec_[nof_sv_]=value_first_;
64    index_first_ = nof_sv_;
65
66    nof_sv_++;
67
68  }
69
70  void SVindex::sv_second(void)
71  {
72    // if already sv, do nothing
73    if (index_second_<nof_sv())
74      return;
75
76    // swap elements
77    if(index_first_==nof_sv_){
78      index_first_=index_second_;
79    }
80
81    vec_[index_second_]=vec_[nof_sv_];
82    vec_[nof_sv_]=value_second_;
83    index_second_=nof_sv_;
84
85    nof_sv_++;
86  }
87
88  void SVindex::nsv_first(void)
89  {
90    // if already nsv, do nothing
91    if ( !(index_first_<nof_sv()) )
92      return;
93   
94    if(index_second_==nof_sv_-1)
95      index_second_=index_first_;
96    vec_[index_first_]=vec_[nof_sv_-1];
97    vec_[nof_sv_-1]=value_first_;
98    index_first_=nof_sv_-1;
99   
100    nof_sv_--;
101  }
102
103  void SVindex::nsv_second(void)
104  {
105    // if already nsv, do nothing
106    if ( !(index_second_<nof_sv()) )
107      return;
108
109    if(index_first_==nof_sv_-1)
110      index_first_=index_second_;
111    vec_[index_second_]=vec_[nof_sv_-1];
112    vec_[nof_sv_-1]=value_second_;
113    index_second_ = nof_sv_-1;
114   
115    nof_sv_--;
116  }
117
118
119  void SVindex::shuffle(void)
120  {
121    random::DiscreteUniform a;
122    random_shuffle(vec_.begin()+nof_sv_, vec_.end(), a); 
123  }
124
125  void SVindex::update_first(const size_t i)
126  {
127    assert(i<size());
128    index_first_=i;
129    value_first_=vec_[i];
130  }
131
132  void SVindex::update_second(const size_t i)
133  {
134    assert(i<size());
135    index_second_=i;
136    value_second_=vec_[i];
137  }
138
139}} // of namespace classifier and namespace theplu
Note: See TracBrowser for help on using the repository browser.