SHOGUN  6.1.3
LinalgSpecialPurposes.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016, Shogun-Toolbox e.V. <shogun-team@shogun-toolbox.org>
3  * All rights reserved.
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
7  * 1. Redistributions of source code must retain the above copyright notice,
8  * this list of conditions and the following disclaimer.
9  *
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  *
14  * 3. Neither the name of the copyright holder nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *
30  * Authors: 2017 Pan Deng, 2014 Khaled Nasr
31  */
32 
33 #ifndef LINALG_SPECIAL_PURPOSE_H_
34 #define LINALG_SPECIAL_PURPOSE_H_
35 
37 
38 namespace shogun
39 {
40 
41  namespace linalg
42  {
43 
51  template <typename T>
52  void logistic(SGMatrix<T>& a, SGMatrix<T>& result)
53  {
54  REQUIRE(
55  (a.num_rows == result.num_rows), "Number of rows of matrix a "
56  "(%d) must match matrix "
57  "result (%d).\n",
58  a.num_rows, result.num_rows);
59  REQUIRE(
60  (a.num_cols == result.num_cols), "Number of columns of matrix "
61  "a (%d) must match matrix "
62  "result (%d).\n",
63  a.num_cols, result.num_cols);
64 
65  infer_backend(a, result)->logistic(a, result);
66  }
67 
76  template <typename T>
77  void
79  {
80  REQUIRE(
81  (a.num_rows == result.num_rows), "Number of rows of matrix a "
82  "(%d) must match matrix "
83  "result (%d).\n",
84  a.num_rows, result.num_rows);
85  REQUIRE(
86  (a.num_cols == result.num_cols), "Number of columns of matrix "
87  "a (%d) must match matrix "
88  "result (%d).\n",
89  a.num_cols, result.num_cols);
90 
91  infer_backend(a, result)->multiply_by_logistic_derivative(
92  a, result);
93  }
94 
101  template <typename T>
103  SGMatrix<T>& a, SGMatrix<T>& result)
104  {
105  REQUIRE(
106  (a.num_rows == result.num_rows), "Number of rows of matrix a "
107  "(%d) must match matrix "
108  "result (%d).\n",
109  a.num_rows, result.num_rows);
110  REQUIRE(
111  (a.num_cols == result.num_cols), "Number of columns of matrix "
112  "a (%d) must match matrix "
113  "result (%d).\n",
114  a.num_cols, result.num_cols);
115 
116  infer_backend(a, result)->multiply_by_rectified_linear_derivative(
117  a, result);
118  }
119 
127  template <typename T>
129  {
130  REQUIRE(
131  (a.num_rows == result.num_rows), "Number of rows of matrix a "
132  "(%d) must match matrix "
133  "result (%d).\n",
134  a.num_rows, result.num_rows);
135  REQUIRE(
136  (a.num_cols == result.num_cols), "Number of columns of matrix "
137  "a (%d) must match matrix "
138  "result (%d).\n",
139  a.num_cols, result.num_cols);
140 
141  infer_backend(a, result)->rectified_linear(a, result);
142  }
143 
151  template <typename T>
153  {
154  infer_backend(a)->softmax(a);
155  }
156 
164  template <typename T>
166  {
167  REQUIRE(
168  (p.num_rows == q.num_rows),
169  "Number of rows of matrix p (%d) must match matrix q (%d).\n",
170  p.num_rows, q.num_rows);
171  REQUIRE(
172  (p.num_cols == q.num_cols), "Number of columns of matrix p "
173  "(%d) must match matrix q (%d).\n",
174  p.num_cols, q.num_cols);
175 
176  return infer_backend(p, q)->cross_entropy(p, q);
177  }
178 
186  template <typename T>
188  {
189  REQUIRE(
190  (p.num_rows == q.num_rows),
191  "Number of rows of matrix p (%d) must match matrix q (%d).\n",
192  p.num_rows, q.num_rows);
193  REQUIRE(
194  (p.num_cols == q.num_cols), "Number of columns of matrix p "
195  "(%d) must match matrix q (%d).\n",
196  p.num_cols, q.num_cols);
197 
198  return infer_backend(p, q)->squared_error(p, q);
199  }
200  }
201 }
202 
203 #endif // LINALG_SPECIAL_PURPOSE_H_
void logistic(SGMatrix< T > &a, SGMatrix< T > &result)
void rectified_linear(SGMatrix< T > &a, SGMatrix< T > &result)
#define REQUIRE(x,...)
Definition: SGIO.h:181
LinalgBackendBase * infer_backend(const Container< T > &a)
index_t num_rows
Definition: SGMatrix.h:495
index_t num_cols
Definition: SGMatrix.h:497
T cross_entropy(const SGMatrix< T > p, const SGMatrix< T > q)
shogun matrix
void multiply_by_logistic_derivative(SGMatrix< T > &a, SGMatrix< T > &result)
T squared_error(const SGMatrix< T > p, const SGMatrix< T > q)
all of classes and functions are contained in the shogun namespace
Definition: class_list.h:18
void softmax(SGMatrix< T > &a)
void multiply_by_rectified_linear_derivative(SGMatrix< T > &a, SGMatrix< T > &result)

SHOGUN Machine Learning Toolbox - Documentation