source: trunk/yat/classifier/MatrixLookup.cc @ 865

Last change on this file since 865 was 865, checked in by Peter, 14 years ago

changing URL to http://trac.thep.lu.se/trac/yat

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date ID
File size: 5.7 KB
Line 
1// $Id$
2
3/*
4  Copyright (C) 2005 Markus Ringnér, Peter Johansson
5  Copyright (C) 2006 Jari Häkkinen, Markus Ringnér, Peter Johansson
6  Copyright (C) 2007 Peter Johansson
7
8  This file is part of the yat library, http://trac.thep.lu.se/trac/yat
9
10  The yat library is free software; you can redistribute it and/or
11  modify it under the terms of the GNU General Public License as
12  published by the Free Software Foundation; either version 2 of the
13  License, or (at your option) any later version.
14
15  The yat library is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18  General Public License for more details.
19
20  You should have received a copy of the GNU General Public License
21  along with this program; if not, write to the Free Software
22  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23  02111-1307, USA.
24*/
25
26#include "MatrixLookup.h"
27#include "yat/utility/matrix.h"
28
29#include <algorithm>
30#include <cassert>
31#include <fstream>
32
33namespace theplu {
34namespace yat {
35namespace classifier {
36
37  MatrixLookup::MatrixLookup(const utility::matrix& data, const bool own)
38    : DataLookup2D(own), data_(&data)
39  {
40    row_index_.reserve(data_->rows());
41    for(size_t i=0;i<(*data_).rows();i++)
42      row_index_.push_back(i);
43    column_index_.reserve(data_->columns());
44    for(size_t i=0;i<(*data_).columns();i++)
45      column_index_.push_back(i);
46  }
47 
48
49
50  MatrixLookup::MatrixLookup(const utility::matrix& data, 
51                             const std::vector<size_t>& row, 
52                             const std::vector<size_t>& col)
53    : DataLookup2D(row,col), data_(&data)
54  {
55    // Checking that each row index is less than data.rows()
56    assert(row.empty() || 
57           *(std::max_element(row.begin(),row.end()))<data.rows());
58    // Checking that each column index is less than data.column()
59    assert(col.empty() || 
60           *(std::max_element(col.begin(),col.end()))<data.columns());
61  }
62 
63
64
65  MatrixLookup::MatrixLookup(const utility::matrix& data, 
66                             const std::vector<size_t>& index, 
67                             const bool row)
68    : DataLookup2D(), data_(&data)
69  {
70    if (row){
71      // Checking that each row index is less than data.rows()
72      assert(index.empty() || 
73             *(std::max_element(index.begin(),index.end()))<data.rows());
74      row_index_=index;
75      assert(column_index_.empty());
76      column_index_.reserve(data.columns());
77      for (size_t i=0; i<data.columns(); i++)
78        column_index_.push_back(i);
79    }
80    else{
81      // Checking that each column index is less than data.column()
82      assert(index.empty() || 
83             *(std::max_element(index.begin(),index.end()))<data.columns());
84      column_index_=index;
85      assert(row_index_.empty());
86      column_index_.reserve(data.rows());
87      for (size_t i=0; i<data.rows(); i++)
88        row_index_.push_back(i);
89    }
90  }
91 
92
93
94  MatrixLookup::MatrixLookup(const MatrixLookup& other)
95    : DataLookup2D(other), data_(other.data_)
96  {
97    ref_count_=other.ref_count_;
98    if (ref_count_)
99      ++(*ref_count_);
100  }
101
102
103
104  MatrixLookup::MatrixLookup(const MatrixLookup& other, 
105                             const std::vector<size_t>& row, 
106                             const std::vector<size_t>& col)
107    : DataLookup2D(other,row,col), data_(other.data_)
108  {
109    ref_count_=other.ref_count_;
110    if (ref_count_)
111      ++(*ref_count_);
112  }
113 
114
115
116  MatrixLookup::MatrixLookup(const MatrixLookup& other, 
117                             const std::vector<size_t>& index, bool row)
118    : DataLookup2D(other,index,row), data_(other.data_)
119  {
120    ref_count_=other.ref_count_;
121    if (ref_count_)
122      ++(*ref_count_);
123
124    // Checking that no index is out of range
125    assert(row_index_.empty() || 
126           *(max_element(row_index_.begin(), row_index_.end()))<data_->rows());
127    assert(column_index_.empty() || 
128           *(max_element(column_index_.begin(), column_index_.end()))<
129           data_->columns());
130  }
131 
132
133
134  MatrixLookup::MatrixLookup(const size_t rows, const size_t columns, 
135                             const double value)
136    : DataLookup2D(rows,columns) 
137  {
138    data_ = new utility::matrix(1,1,value);
139    ref_count_= new u_int(1);
140  }
141
142
143  MatrixLookup::MatrixLookup(std::istream& is, char sep)
144    : DataLookup2D()
145  {
146    data_ = new utility::matrix(is,sep);
147    ref_count_= new u_int(1);
148    for(size_t i=0;i<(*data_).rows();i++)
149      row_index_.push_back(i);
150    for(size_t i=0;i<(*data_).columns();i++)
151      column_index_.push_back(i);
152  }
153
154
155  MatrixLookup::~MatrixLookup(void)
156  {
157    if (ref_count_)
158      if (!--(*ref_count_))
159        delete data_;
160  }
161
162
163  const MatrixLookup* 
164  MatrixLookup::selected(const std::vector<size_t>& i) const
165  { 
166    return new MatrixLookup(*this,i, true); 
167  }
168
169
170
171  const MatrixLookup* 
172  MatrixLookup::training_data(const std::vector<size_t>& i) const
173  { 
174    return new MatrixLookup(*this,i, false); 
175  }
176
177
178
179  const MatrixLookup* 
180  MatrixLookup::validation_data(const std::vector<size_t>& train,
181                                const std::vector<size_t>& val) const
182  { 
183    return new MatrixLookup(*this,val, false); 
184  }
185
186
187
188  bool MatrixLookup::weighted(void) const 
189  {
190    return false;
191  }
192
193
194
195  double MatrixLookup::operator()(const size_t row, const size_t column) const
196  {
197    assert(row<rows());
198    assert(column<columns());
199    return (*data_)(row_index_[row], column_index_[column]);
200  }
201
202
203
204  const MatrixLookup& MatrixLookup::operator=(const MatrixLookup& other)
205  {
206    if (this!=&other){
207      if (ref_count_ && !--(*ref_count_))
208        delete data_;
209      DataLookup2D::operator=(other);
210      data_ = other.data_;
211      ref_count_=other.ref_count_;
212      if (ref_count_)
213        ++(*ref_count_);
214    }
215    return *this;
216  }
217
218
219  std::ostream& operator<<(std::ostream& s, const MatrixLookup& m)
220  {
221    s.setf(std::ios::dec);
222    s.precision(12);
223    for(size_t i=0, j=0; i<m.rows(); i++)
224      for (j=0; j<m.columns(); j++) {
225        s << m(i,j);
226        if (j<m.columns()-1)
227          s << s.fill();
228        else if (i<m.rows()-1)
229          s << "\n";
230      }
231    return s;
232  }
233
234
235
236}}} // of namespace classifier, yat, and theplu
Note: See TracBrowser for help on using the repository browser.