source: trunk/c++_tools/classifier/Kernel.cc @ 659

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

fixes #147 and #136

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date ID
File size: 1.8 KB
Line 
1// $Id$
2
3#include <c++_tools/classifier/Kernel.h>
4
5#include <c++_tools/classifier/DataLookup1D.h>
6#include <c++_tools/classifier/DataLookupWeighted1D.h>
7#include <c++_tools/classifier/KernelFunction.h>
8#include <c++_tools/classifier/MatrixLookup.h>
9
10#include <vector>
11
12namespace theplu {
13namespace classifier {
14
15  Kernel::Kernel(const MatrixLookup& data, const KernelFunction& kf, 
16                 const bool own) 
17    : data_(&data), data_w_(0), kf_(&kf), ref_count_w_(NULL)
18  {
19    if (own)
20      ref_count_ = new u_int(1);
21    else
22      ref_count_ = NULL;
23  }
24
25
26  Kernel::Kernel(const MatrixLookupWeighted& data, const KernelFunction& kf,
27                 const bool own) 
28    : data_(&data), data_w_(&data), kf_(&kf)
29  {
30    if (own){
31      ref_count_ = new u_int(1);
32      ref_count_w_ = new u_int(1);
33    }
34    else {
35      ref_count_ = NULL;
36      ref_count_w_ = NULL;
37    }
38  }
39
40
41  Kernel::Kernel(const Kernel& other, const std::vector<size_t>& index)
42    : kf_(other.kf_)
43  {
44    data_ = other.data_->selected(index);
45    ref_count_ = new u_int(1);
46   
47    if (other.data_w_){
48      data_w_ = other.data_w_->selected(index);
49      ref_count_w_ = new u_int(1);
50    }
51    else{
52      data_w_=NULL;
53      ref_count_w_ = NULL;
54    }
55
56  }
57
58  Kernel::~Kernel()
59  {
60    if (ref_count_)
61      if (!--(*ref_count_))
62        delete data_;
63
64    if (ref_count_w_)
65      if (!--(*ref_count_w_))
66        delete data_w_;
67
68  }
69
70 
71  double Kernel::element(const DataLookup1D& vec, const size_t i) const
72  {
73    if (data_w_)
74      return kf_->operator()(vec, DataLookupWeighted1D(*data_w_,i, false)); 
75    else
76      return kf_->operator()(vec, DataLookup1D(*data_,i, false)); 
77  }
78
79
80  double Kernel::element(const DataLookupWeighted1D& vec, const size_t i) const
81  {
82    if (data_w_)
83      return kf_->operator()(vec, DataLookupWeighted1D(*data_w_,i, false)); 
84    else
85      return kf_->operator()(vec, DataLookup1D(*data_,i, false)); 
86  }
87
88}} // of namespace classifier and namespace theplu
Note: See TracBrowser for help on using the repository browser.