SHOGUN  6.0.0
RationalApproximationCGMJob.cpp
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or modify
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/config.h>
11
12 #include <shogun/lib/SGVector.h>
13
15
18 #include <shogun/base/Parameter.h>
19
20 using namespace Eigen;
21
22 namespace shogun
23 {
24
25 CRationalApproximationCGMJob::CRationalApproximationCGMJob()
26  : CIndependentJob()
27 {
28  init();
29 }
30
33  CCGMShiftedFamilySolver* linear_solver,
34  CLinearOperator<float64_t>* linear_operator,
35  SGVector<float64_t> vector,
37  SGVector<complex128_t> weights,
38  float64_t const_multiplier)
40 {
41  init();
42
43  m_linear_solver=linear_solver;
44  SG_REF(m_linear_solver);
45
46  m_operator=linear_operator;
47  SG_REF(m_operator);
48
49  m_vector=vector;
50
51  m_shifts=shifts;
52  m_weights=weights;
53  m_const_multiplier=const_multiplier;
54 }
55
56 void CRationalApproximationCGMJob::init()
57 {
58  m_linear_solver=NULL;
59  m_operator=NULL;
60  m_const_multiplier=0.0;
61
63  "Linear solver for complex-shifted system", MS_NOT_AVAILABLE);
64
66  "Linear operator", MS_NOT_AVAILABLE);
67
69  "Sample vector to apply linear operator on", MS_NOT_AVAILABLE);
70
72  "Shifts in the linear systems to be solved", MS_NOT_AVAILABLE);
73
75  "Weights to be multiplied to the solution vector", MS_NOT_AVAILABLE);
76
78  "Constant multiplier to be multiplied with the final solution", MS_NOT_AVAILABLE);
79 }
80
82 {
83  SG_UNREF(m_linear_solver);
84  SG_UNREF(m_operator);
85 }
86
88 {
89  SG_DEBUG("Entering\n");
90
91  REQUIRE(m_aggregator, "Job result aggregator is not set!\n");
92  REQUIRE(m_operator, "Operator is not set!\n");
93  REQUIRE(m_vector.vector, "Vector is not set!\n");
94  REQUIRE(m_shifts.vector, "Shifts are not set!\n");
95  REQUIRE(m_weights.vector, "Weights are not set!\n");
96  REQUIRE(m_operator->get_dimension()==m_vector.vlen,
97  "Dimension mismatch! %d vs %d\n", m_operator->get_dimension(), m_vector.vlen);
98  REQUIRE(m_shifts.vlen==m_weights.vlen,
99  "Number of shifts and weights are not equal!\n");
100
101  // solve the linear system with the sample vector
102  SGVector<complex128_t> vec=m_linear_solver->solve_shifted_weighted(
103  m_operator, m_vector, m_shifts, m_weights);
104
105  // Take negative (see CRationalApproximation for the formula)
106  Map<VectorXcd> v(vec.vector, vec.vlen);
107  v=-v;
108
109  // take out the imaginary part of the result before
110  // applying linear operator
111  SGVector<float64_t> agg=m_operator->apply(vec.get_imag());
112
113  // perform dot product
114  Map<VectorXd> map_agg(agg.vector, agg.vlen);
115  Map<VectorXd> map_vector(m_vector.vector, m_vector.vlen);
116  float64_t result=map_vector.dot(map_agg);
117
118  result*=m_const_multiplier;
119
120  // form the final result into a scalar result and submit to the aggregator
121  CScalarResult<float64_t>* final_result=new CScalarResult<float64_t>(result);
122  SG_REF(final_result);
123
124  m_aggregator->submit_result(final_result);
125
126  SG_UNREF(final_result);
127
128  SG_DEBUG("Leaving\n");
129 }
130
131 }
Base class that stores the result of an independent job when the result is a scalar.
Definition: ScalarResult.h:24
const index_t get_dimension() const
SGVector< float64_t > get_imag()
Definition: SGVector.cpp:935
class that uses conjugate gradient method for solving a shifted linear system family where the linear...
Definition: SGMatrix.h:24
#define REQUIRE(x,...)
Definition: SGIO.h:205
virtual void submit_result(CJobResult *result)=0
#define SG_REF(x)
Definition: SGObject.h:52
index_t vlen
Definition: SGVector.h:545
Class SGObject is the base class of all shogun objects.
Definition: SGObject.h:125
Template class that aggregates scalar job results in each submit_result call, finalize then transform...
double float64_t
Definition: common.h:60
Abstract base class that provides an interface for computing an aggeregation of the job results of in...
virtual SGVector< T > apply(SGVector< T > b) const =0
#define SG_UNREF(x)
Definition: SGObject.h:53
#define SG_DEBUG(...)
Definition: SGIO.h:106
all of classes and functions are contained in the shogun namespace
Definition: class_list.h:18
Abstract base for general computation jobs to be registered in CIndependentComputationEngine. compute method produces a job result and submits it to the internal JobResultAggregator. Each set of jobs that form a result will share the same job result aggregator.