source: trunk/c++_tools/classifier/MatrixLookupWeighted.cc @ 604

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

ref #96 Changed InputRanker? to return vector of index rather than element. Also added draft to FeatureSelection? class.

File size: 6.0 KB
Line 
1// $Id$
2
3#include <c++_tools/classifier/MatrixLookupWeighted.h>
4
5#ifndef NDEBUG
6#include <algorithm>
7#endif
8
9#include <fstream>
10
11namespace theplu {
12namespace classifier {
13
14  MatrixLookupWeighted::MatrixLookupWeighted(const gslapi::matrix& data, 
15                             const gslapi::matrix& weights)
16    : DataLookup2D(), data_(&data), weights_(&weights)
17  {
18    assert(data.rows()==weights.rows());
19    assert(data.columns()==weights.columns());
20    for(size_t i=0;i<(*data_).rows();i++)
21      row_index_.push_back(i);
22    for(size_t i=0;i<(*data_).columns();i++)
23      column_index_.push_back(i);
24  }
25 
26
27
28  MatrixLookupWeighted::MatrixLookupWeighted(const gslapi::matrix& data, 
29                             const gslapi::matrix& weights, 
30                             const std::vector<size_t>& row, 
31                             const std::vector<size_t>& col)
32    : DataLookup2D(row,col), data_(&data), weights_(&weights)
33  {
34    // Checking that each row index is less than data.rows()
35    assert(row.empty() || 
36           *(std::max_element(row.begin(),row.end()))<data.rows());
37    // Checking that each column index is less than data.column()
38    assert(col.empty() || 
39           *(std::max_element(col.begin(),col.end()))<data.columns());
40    // Checking that each row index is less than weights.rows()
41    assert(row.empty() || 
42           *(std::max_element(row.begin(),row.end()))<weights.rows());
43    // Checking that each column index is less than weights.column()
44    assert(col.empty() || 
45           *(std::max_element(col.begin(),col.end()))<weights.columns());
46  }
47 
48
49
50  MatrixLookupWeighted::MatrixLookupWeighted(const gslapi::matrix& data, 
51                             const gslapi::matrix& weights, 
52                             const std::vector<size_t>& index, 
53                             const bool row)
54    : DataLookup2D(), data_(&data), weights_(&weights)
55  {
56    if (row){
57      // Checking that each row index is less than data.rows()
58      assert(index.empty() || 
59             *(std::max_element(index.begin(),index.end()))<data.rows());
60      // Checking that each row index is less than weights.rows()
61      assert(index.empty() || 
62             *(std::max_element(index.begin(),index.end()))<weights.rows());
63      row_index_=index;
64      assert(column_index_.empty());
65      column_index_.reserve(data.columns());
66      for (size_t i=0; i<data.columns(); i++)
67        column_index_.push_back(i);
68    }
69    else{
70      // Checking that each column index is less than data.column()
71      assert(index.empty() || 
72             *(std::max_element(index.begin(),index.end()))<data.columns());
73      // Checking that each column index is less than weights.column()
74      assert(index.empty() || 
75             *(std::max_element(index.begin(),index.end()))<weights.columns());
76      column_index_=index;
77      assert(row_index_.empty());
78      column_index_.reserve(data.rows());
79      for (size_t i=0; i<data.rows(); i++)
80        row_index_.push_back(i);
81    }
82  }
83 
84
85  /*
86  MatrixLookupWeighted::MatrixLookupWeighted(const MatrixLookup& dv,
87                                             const MatrixLookup& wv)
88    : DataLookup2D(dv), data_(dv.data_), weights_(dv.data_)
89  {
90  }
91  */
92
93
94  MatrixLookupWeighted::MatrixLookupWeighted(const MatrixLookupWeighted& dv)
95    : DataLookup2D(dv), data_(dv.data_), weights_(dv.weights_)
96  {
97  }
98
99
100
101  MatrixLookupWeighted::MatrixLookupWeighted(const MatrixLookupWeighted& ml, 
102                                             const std::vector<size_t>& row, 
103                                             const std::vector<size_t>& col)
104    : DataLookup2D(ml,row,col), data_(ml.data_), weights_(ml.weights_)
105  {
106  }
107 
108
109
110  MatrixLookupWeighted::MatrixLookupWeighted(const MatrixLookupWeighted& ml, 
111                                             const std::vector<size_t>& index, 
112                                             bool row)
113    : DataLookup2D(ml,index,row), data_(ml.data_), weights_(ml.weights_)
114  {
115    // Checking that no index is out of range
116    assert(row_index_.empty() || 
117           *(max_element(row_index_.begin(), row_index_.end()))<data_->rows());
118    assert(column_index_.empty() || 
119           *(max_element(column_index_.begin(), column_index_.end()))<
120           data_->columns());
121    // Checking that no index is out of range
122    assert(row_index_.empty() || 
123           *(max_element(row_index_.begin(), row_index_.end()))<
124           weights_->rows());
125    assert(column_index_.empty() || 
126           *(max_element(column_index_.begin(), column_index_.end()))<
127           weights_->columns());
128  }
129 
130
131
132  MatrixLookupWeighted::MatrixLookupWeighted(const size_t rows, 
133                                             const size_t columns, 
134                                             const double value)
135    : DataLookup2D(rows,columns, true) 
136  {
137    data_ = new gslapi::matrix(1,1,value);
138    weights_ = new gslapi::matrix(1,1,1.0);
139  }
140
141 
142    MatrixLookupWeighted::MatrixLookupWeighted(std::istream& is, char sep)
143    : DataLookup2D(true)
144  {
145    data_ = new gslapi::matrix(is,sep);
146    for(size_t i=0;i<(*data_).rows();i++)
147      row_index_.push_back(i);
148    for(size_t i=0;i<(*data_).columns();i++)
149      column_index_.push_back(i);
150    // Peter, a lot of copying in this line
151    weights_ = new gslapi::matrix(data_->nan());
152  }
153 
154
155  MatrixLookupWeighted::~MatrixLookupWeighted(void)
156  {
157    if (owner_){
158      delete data_;
159      delete weights_;
160    }
161  }
162
163
164  const MatrixLookupWeighted* 
165  MatrixLookupWeighted::selected(const std::vector<size_t>& i) const
166  { 
167    return new MatrixLookupWeighted(*this,i, true); 
168  }
169
170
171
172  const MatrixLookupWeighted* 
173  MatrixLookupWeighted::training_data(const std::vector<size_t>& i) const
174  { 
175    return new MatrixLookupWeighted(*this,i, false); 
176  }
177
178
179
180  const MatrixLookupWeighted* 
181  MatrixLookupWeighted::validation_data(const std::vector<size_t>& train,
182                                const std::vector<size_t>& val) const
183  { 
184    return new MatrixLookupWeighted(*this,val, false); 
185  }
186
187
188
189  const MatrixLookupWeighted& MatrixLookupWeighted::operator=
190  (const MatrixLookupWeighted& other)
191  {
192    if (this!=&other){
193      if (owner_){
194        delete data_;
195        delete weights_;
196        owner_=false;
197      }
198      DataLookup2D::operator=(other);
199      data_ = other.data_;
200      weights_ = other.weights_;
201    }
202    return *this;
203  }
204
205
206  std::ostream& operator<<(std::ostream& s, const MatrixLookupWeighted& m)
207  {
208    s.setf(std::ios::dec);
209    s.precision(12);
210    for(size_t i=0, j=0; i<m.rows(); i++)
211      for (j=0; j<m.columns(); j++) {
212        s << m(i,j);
213        if (j<m.columns()-1)
214          s << s.fill();
215        else if (i<m.rows()-1)
216          s << "\n";
217      }
218    return s;
219  }
220
221
222
223}} // of namespace classifier and namespace theplu
Note: See TracBrowser for help on using the repository browser.