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

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

Fixes #100

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date ID
File size: 6.6 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    gslapi::matrix weights;
151    data_->nan(weights);   
152    weights_= new gslapi::matrix(weights);
153  }
154 
155
156  MatrixLookupWeighted::~MatrixLookupWeighted(void)
157  {
158    if (owner_){
159      delete data_;
160      delete weights_;
161    }
162  }
163
164
165  const MatrixLookupWeighted* 
166  MatrixLookupWeighted::selected(const std::vector<size_t>& i) const
167  { 
168    return new MatrixLookupWeighted(*this,i, true); 
169  }
170
171
172
173  const MatrixLookupWeighted* 
174  MatrixLookupWeighted::training_data(const std::vector<size_t>& i) const
175  { 
176    return new MatrixLookupWeighted(*this,i, false); 
177  }
178
179
180
181  const MatrixLookupWeighted* 
182  MatrixLookupWeighted::training_data(const std::vector<size_t>& features,
183                                      const std::vector<size_t>& samples) const
184  { 
185    return new MatrixLookupWeighted(*this,features, samples); 
186  }
187
188
189
190  const MatrixLookupWeighted* 
191  MatrixLookupWeighted::validation_data(const std::vector<size_t>& train,
192                                        const std::vector<size_t>& val) const
193  { 
194    return new MatrixLookupWeighted(*this,val, false); 
195  }
196
197
198
199  const MatrixLookupWeighted* 
200  MatrixLookupWeighted::validation_data(const std::vector<size_t>& features,
201                                        const std::vector<size_t>& training,
202                                        const std::vector<size_t>& val) const
203  { 
204    return new MatrixLookupWeighted(*this,features, val); 
205  }
206
207
208
209  const MatrixLookupWeighted& MatrixLookupWeighted::operator=
210  (const MatrixLookupWeighted& other)
211  {
212    if (this!=&other){
213      if (owner_){
214        delete data_;
215        delete weights_;
216        owner_=false;
217      }
218      DataLookup2D::operator=(other);
219      data_ = other.data_;
220      weights_ = other.weights_;
221    }
222    return *this;
223  }
224
225
226  std::ostream& operator<<(std::ostream& s, const MatrixLookupWeighted& m)
227  {
228    s.setf(std::ios::dec);
229    s.precision(12);
230    for(size_t i=0, j=0; i<m.rows(); i++)
231      for (j=0; j<m.columns(); j++) {
232        s << m(i,j);
233        if (j<m.columns()-1)
234          s << s.fill();
235        else if (i<m.rows()-1)
236          s << "\n";
237      }
238    return s;
239  }
240
241
242
243}} // of namespace classifier and namespace theplu
Note: See TracBrowser for help on using the repository browser.