SHOGUN  v3.0.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DenseMatrixExactLog.cpp
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or modify
3  * it under the terms of the GNU General Public License as published by
4  * the Free Software Foundation; either version 3 of the License, or
5  * (at your option) any later version.
6  *
7  * Written (W) 2013 Soumyajit De
8  */
9 
10 #include <shogun/lib/common.h>
11 
12 #ifdef HAVE_EIGEN3
14 
15 #if EIGEN_VERSION_AT_LEAST(3,1,0)
16 #include <unsupported/Eigen/MatrixFunctions>
17 #endif // EIGEN_VERSION_AT_LEAST(3,1,0)
18 
19 #include <shogun/lib/SGVector.h>
20 #include <shogun/lib/SGMatrix.h>
26 
27 using namespace Eigen;
28 
29 namespace shogun
30 {
31 
32 CDenseMatrixExactLog::CDenseMatrixExactLog()
33  : COperatorFunction<float64_t>(NULL, NULL, OF_LOG)
34 {
35  SG_GCDEBUG("%s created (%p)\n", this->get_name(), this)
36 }
37 
42  (CLinearOperator<float64_t>*)op, engine, OF_LOG)
43 {
44  SG_GCDEBUG("%s created (%p)\n", this->get_name(), this)
45 }
46 
48 {
49  SG_GCDEBUG("%s destroyed (%p)\n", this->get_name(), this)
50 }
51 
52 #if EIGEN_VERSION_AT_LEAST(3,1,0)
54 {
55  SG_DEBUG("Entering...\n");
56 
57  // check for proper downcast
60  REQUIRE(op, "Operator not an instance of DenseMatrixOperator!\n");
62 
63  // compute log(C) using Eigen3
64  Map<MatrixXd> mat(m.matrix, m.num_rows, m.num_cols);
66  Map<MatrixXd> log_mat(log_m.matrix, log_m.num_rows, log_m.num_cols);
67  log_mat=mat.log();
68 
69  // the log(C) is also a linear operator here
70  // reset the operator of this function with log(C)
74 
75  SG_DEBUG("Leaving...\n");
76 }
77 #else
79 {
80  SG_WARNING("Eigen3.1.0 or later required!\n")
81 }
82 #endif // EIGEN_VERSION_AT_LEAST(3,1,0)
83 
85  sample)
86 {
87  SG_DEBUG("Entering...\n");
88 
90  // we don't want the aggregator to be destroyed when the job is unref-ed
91  SG_REF(agg);
93  dynamic_cast<CDenseMatrixOperator<float64_t>*>(m_linear_operator), sample);
94  SG_REF(job);
95  // sanity check
96  REQUIRE(m_computation_engine, "Computation engine is NULL\n");
98  // we can safely unref the job here, computation engine takes it from here
99  SG_UNREF(job);
100 
101  SG_DEBUG("Leaving...\n");
102  return agg;
103 }
104 
105 }
106 #endif // HAVE_EIGEN3

SHOGUN Machine Learning Toolbox - Documentation