yat/utility/KernelMatrix.h

Code
Comments
Other
Rev Date Author Line
3190 30 Mar 14 peter 1 #ifndef _theplu_yat_utility_kernel_matrix_
3190 30 Mar 14 peter 2 #define _theplu_yat_utility_kernel_matrix_
3190 30 Mar 14 peter 3
3190 30 Mar 14 peter 4 // $Id$
3190 30 Mar 14 peter 5
3190 30 Mar 14 peter 6 /*
3190 30 Mar 14 peter 7   Copyright (C) 2014 Peter Johansson
3190 30 Mar 14 peter 8
3190 30 Mar 14 peter 9   This file is part of the yat library, http://dev.thep.lu.se/yat
3190 30 Mar 14 peter 10
3190 30 Mar 14 peter 11   The yat library is free software; you can redistribute it and/or
3190 30 Mar 14 peter 12   modify it under the terms of the GNU General Public License as
3190 30 Mar 14 peter 13   published by the Free Software Foundation; either version 3 of the
3190 30 Mar 14 peter 14   License, or (at your option) any later version.
3190 30 Mar 14 peter 15
3190 30 Mar 14 peter 16   The yat library is distributed in the hope that it will be useful,
3190 30 Mar 14 peter 17   but WITHOUT ANY WARRANTY; without even the implied warranty of
3190 30 Mar 14 peter 18   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3190 30 Mar 14 peter 19   General Public License for more details.
3190 30 Mar 14 peter 20
3190 30 Mar 14 peter 21   You should have received a copy of the GNU General Public License
3190 30 Mar 14 peter 22   along with yat. If not, see <http://www.gnu.org/licenses/>.
3190 30 Mar 14 peter 23 */
3190 30 Mar 14 peter 24
3190 30 Mar 14 peter 25 #include "Container2DIterator.h"
3190 30 Mar 14 peter 26 #include "StrideIterator.h"
3190 30 Mar 14 peter 27
3190 30 Mar 14 peter 28 namespace theplu {
3190 30 Mar 14 peter 29 namespace yat {
3190 30 Mar 14 peter 30 namespace utility {
3190 30 Mar 14 peter 31
3190 30 Mar 14 peter 32   /**
3190 30 Mar 14 peter 33      \brief A KernelMatrix is a \ref concept_container_2d
3190 30 Mar 14 peter 34
3190 30 Mar 14 peter 35      A matrix-like object constructed from two
3190 30 Mar 14 peter 36      <a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html">
3190 30 Mar 14 peter 37
3190 30 Mar 14 peter 38      RandomAccessContainer</a>s and Functor. Each row in the matrix
3190 30 Mar 14 peter 39      correspond to an element in the RandomAccessRange1 and each
3190 30 Mar 14 peter 40      column correspond to an element in RandomAccessRange2. Number of
3190 30 Mar 14 peter 41      rows in the matrix equals number of element in RandomAccessRange1
3190 30 Mar 14 peter 42      and number of columns equals number of elements in
3190 30 Mar 14 peter 43      RandomAccessRange2. An element in row \a row and column \a column
3190 30 Mar 14 peter 44      is calculated by taking the element \a row in RandomAccessRange1
3190 30 Mar 14 peter 45      and element \a column in RandomAccessRange2, and passing these
3190 30 Mar 14 peter 46      elements to BinaryFunctor.
3190 30 Mar 14 peter 47
3190 30 Mar 14 peter 48      Type Requirements:
3190 30 Mar 14 peter 49      - \c RandomAccessContainer1 must be a
3190 30 Mar 14 peter 50      <a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html">
3190 30 Mar 14 peter 51      RandomAccessContainer</a>
3190 30 Mar 14 peter 52      - \c RandomAccessContainer2 must be a
3190 30 Mar 14 peter 53      <a href="http://www.sgi.com/tech/stl/RandomAccessContainer.html">
3190 30 Mar 14 peter 54      RandomAccessContainer</a>
3190 30 Mar 14 peter 55      - \c BinaryFunctor must be a
3190 30 Mar 14 peter 56      <a href="http://www.sgi.com/tech/stl/AdaptableBinaryFunction.html">
3190 30 Mar 14 peter 57      AdaptableBinaryFunctor</a>
3190 30 Mar 14 peter 58      - \c RandomAccessContainer1::reference must be convertible to
3190 30 Mar 14 peter 59      \c BinaryFunctor::first_argument_type
3190 30 Mar 14 peter 60      - \c RandomAccessContainer2::reference must be convertible to
3190 30 Mar 14 peter 61      \c BinaryFunctor::second_argument_type
3190 30 Mar 14 peter 62    */
3190 30 Mar 14 peter 63   template <class RandomAccessRange1, class RandomAccessRange2,
3190 30 Mar 14 peter 64             class BinaryFunctor>
3190 30 Mar 14 peter 65   class KernelMatrix
3190 30 Mar 14 peter 66   {
3190 30 Mar 14 peter 67   public:
3190 30 Mar 14 peter 68     /// \c value_type is same as BinaryFunctor's result_type
3190 30 Mar 14 peter 69     typedef typename BinaryFunctor::result_type value_type;
3190 30 Mar 14 peter 70
3190 30 Mar 14 peter 71     /// \c const_reference is same as \c value_type
3190 30 Mar 14 peter 72     typedef value_type const_reference;
3190 30 Mar 14 peter 73
3190 30 Mar 14 peter 74     /// \brief \c const_iterator
3190 30 Mar 14 peter 75     typedef Container2DIterator<const KernelMatrix, value_type, const_reference>
3190 30 Mar 14 peter 76     const_iterator;
3190 30 Mar 14 peter 77
3190 30 Mar 14 peter 78     /// \brief \c const_column_iterator
3190 30 Mar 14 peter 79     typedef StrideIterator<const_iterator> const_column_iterator;
3190 30 Mar 14 peter 80
3190 30 Mar 14 peter 81     /// \brief \c const_row_iterator_iterator
3190 30 Mar 14 peter 82     typedef const_iterator const_row_iterator;
3190 30 Mar 14 peter 83
3190 30 Mar 14 peter 84     /**
3190 30 Mar 14 peter 85        \brief constructor
3190 30 Mar 14 peter 86
3190 30 Mar 14 peter 87        Same as three-argument constructor, but using default
3190 30 Mar 14 peter 88        constructor of class BinaryFunctor.
3190 30 Mar 14 peter 89      */
3190 30 Mar 14 peter 90     KernelMatrix(const RandomAccessRange1& r1, const RandomAccessRange2& r2)
3190 30 Mar 14 peter 91       : range1_(r1), range2_(r2) {}
3190 30 Mar 14 peter 92
3190 30 Mar 14 peter 93     /**
3190 30 Mar 14 peter 94        \brief constructor
3190 30 Mar 14 peter 95      */
3190 30 Mar 14 peter 96     KernelMatrix(const RandomAccessRange1& r1, const RandomAccessRange2& r2,
3190 30 Mar 14 peter 97                  const BinaryFunctor& bf)
3190 30 Mar 14 peter 98       : range1_(r1), range2_(r2), func_(bf) {}
3190 30 Mar 14 peter 99
3190 30 Mar 14 peter 100     /**
3190 30 Mar 14 peter 101        Iterator iterates along a row. When end of row is reached it
3190 30 Mar 14 peter 102        jumps to beginning of next row.
3190 30 Mar 14 peter 103
3190 30 Mar 14 peter 104        \return const_iterator pointing to upper-left element.
3190 30 Mar 14 peter 105      */
3190 30 Mar 14 peter 106     const_iterator begin(void) const { return const_iterator(*this, 0, 0); }
3190 30 Mar 14 peter 107
3190 30 Mar 14 peter 108
3190 30 Mar 14 peter 109     /**
3190 30 Mar 14 peter 110        Iterator iterates along a column.
3190 30 Mar 14 peter 111
3190 30 Mar 14 peter 112        \return const_iterator pointing to first element of column \a column.
3190 30 Mar 14 peter 113      */
3190 30 Mar 14 peter 114     const_column_iterator begin_column(size_t column) const
3190 30 Mar 14 peter 115     {
3190 30 Mar 14 peter 116       return const_column_iterator(const_iterator(*this, 0, column),
3190 30 Mar 14 peter 117                                    this->columns());
3190 30 Mar 14 peter 118     }
3190 30 Mar 14 peter 119
3190 30 Mar 14 peter 120
3190 30 Mar 14 peter 121     /**
3190 30 Mar 14 peter 122        Iterator iterates along a row.
3190 30 Mar 14 peter 123
3190 30 Mar 14 peter 124        \return const_iterator pointing to first element of row \a row.
3190 30 Mar 14 peter 125      */
3190 30 Mar 14 peter 126     const_row_iterator begin_row(size_t row) const
3190 30 Mar 14 peter 127     { return const_row_iterator(*this, row, 0); }
3190 30 Mar 14 peter 128
3190 30 Mar 14 peter 129
3190 30 Mar 14 peter 130     /**
3190 30 Mar 14 peter 131        \return const_iterator pointing to end of matrix
3190 30 Mar 14 peter 132      */
3190 30 Mar 14 peter 133     const_iterator end(void) const
3190 30 Mar 14 peter 134     { return const_iterator(*this, rows(), 0); }
3190 30 Mar 14 peter 135
3190 30 Mar 14 peter 136
3190 30 Mar 14 peter 137     /**
3190 30 Mar 14 peter 138        \return const_iterator pointing to end of column \a i
3190 30 Mar 14 peter 139      */
3190 30 Mar 14 peter 140     const_column_iterator end_column(size_t column) const
3190 30 Mar 14 peter 141     {
3190 30 Mar 14 peter 142       return const_column_iterator(const_iterator(*this, this->rows(), column),
3190 30 Mar 14 peter 143                                    this->columns());
3190 30 Mar 14 peter 144     }
3190 30 Mar 14 peter 145
3190 30 Mar 14 peter 146
3190 30 Mar 14 peter 147     /**
3190 30 Mar 14 peter 148        \return const_iterator pointing to end of row \a i
3190 30 Mar 14 peter 149      */
3190 30 Mar 14 peter 150     const_row_iterator end_row(size_t row) const
3190 30 Mar 14 peter 151     { return const_row_iterator(*this, row, this->columns()); }
3190 30 Mar 14 peter 152
3190 30 Mar 14 peter 153
3190 30 Mar 14 peter 154     /**
3190 30 Mar 14 peter 155        Number of rows is defined by RandomAccessRange2::size(void)
3190 30 Mar 14 peter 156
3190 30 Mar 14 peter 157        \return The number of columns in the matrix.
3190 30 Mar 14 peter 158     */
3190 30 Mar 14 peter 159     typename RandomAccessRange2::size_type columns(void) const
3190 30 Mar 14 peter 160     { return range2_.size(); }
3190 30 Mar 14 peter 161
3190 30 Mar 14 peter 162
3190 30 Mar 14 peter 163     /**
3190 30 Mar 14 peter 164        Number of rows is defined by RandomAccessRange1::size(void)
3190 30 Mar 14 peter 165
3190 30 Mar 14 peter 166        \return The number of rows in the matrix.
3190 30 Mar 14 peter 167     */
3190 30 Mar 14 peter 168     typename RandomAccessRange1::size_type rows(void) const
3190 30 Mar 14 peter 169     { return range1_.size(); }
3190 30 Mar 14 peter 170
3190 30 Mar 14 peter 171
3190 30 Mar 14 peter 172     /**
3190 30 Mar 14 peter 173        \brief Element access operator.
3190 30 Mar 14 peter 174
3190 30 Mar 14 peter 175        Element is calculated using BinaryFunctor passing
3190 30 Mar 14 peter 176        \c row th element of RandomAccessRange1 and \c column th element in
3190 30 Mar 14 peter 177        RandomAccessRange2.
3190 30 Mar 14 peter 178
3190 30 Mar 14 peter 179        \return Reference to the element position (\a row, \a column).
3190 30 Mar 14 peter 180     */
3190 30 Mar 14 peter 181     const_reference operator()(size_t row, size_t column) const
3190 30 Mar 14 peter 182     { return func_(range1_[row], range2_[column]); }
3190 30 Mar 14 peter 183
3190 30 Mar 14 peter 184   private:
3190 30 Mar 14 peter 185     RandomAccessRange1 range1_;
3190 30 Mar 14 peter 186     RandomAccessRange2 range2_;
3190 30 Mar 14 peter 187     BinaryFunctor func_;
3190 30 Mar 14 peter 188   };
3190 30 Mar 14 peter 189
3190 30 Mar 14 peter 190 }}} // of namespace utility, yat, and theplu
3190 30 Mar 14 peter 191
3190 30 Mar 14 peter 192 #endif