MUQ  0.4.3
EigenMatrixAlgebra.cpp
Go to the documentation of this file.
2 
3 using namespace muq::Modeling;
4 
5 EigenMatrixAlgebra::EigenMatrixAlgebra() {}
6 
7 EigenMatrixAlgebra::~EigenMatrixAlgebra() {}
8 
9 bool EigenMatrixAlgebra::IsEigenMatrix(std::type_info const& obj_type) {
10  // is this an Eigen::Matrix type?
11  return typeid(Eigen::Matrix2d)==obj_type
12  || typeid(Eigen::Matrix2f)==obj_type
13  || typeid(Eigen::Matrix2i)==obj_type
14  || typeid(Eigen::Matrix3d)==obj_type
15  || typeid(Eigen::Matrix3f)==obj_type
16  || typeid(Eigen::Matrix3i)==obj_type
17  || typeid(Eigen::Matrix4d)==obj_type
18  || typeid(Eigen::Matrix4f)==obj_type
19  || typeid(Eigen::Matrix4i)==obj_type
20  || typeid(Eigen::MatrixXd)==obj_type
21  || typeid(Eigen::MatrixXf)==obj_type
22  || typeid(Eigen::MatrixXi)==obj_type
23  || typeid(Eigen::LLT<Eigen::Matrix2d>)==obj_type
24  || typeid(Eigen::LLT<Eigen::Matrix3d>)==obj_type
25  || typeid(Eigen::LLT<Eigen::Matrix4d>)==obj_type
26  || typeid(Eigen::LLT<Eigen::MatrixXd>)==obj_type
27  || typeid(Eigen::LLT<Eigen::Matrix2f>)==obj_type
28  || typeid(Eigen::LLT<Eigen::Matrix3f>)==obj_type
29  || typeid(Eigen::LLT<Eigen::Matrix4f>)==obj_type
30  || typeid(Eigen::LLT<Eigen::MatrixXf>)==obj_type;
31 }
32 
33 bool EigenMatrixAlgebra::IsZero(boost::any const& obj) {
34  if( typeid(Eigen::Matrix2d)==obj.type() ) { return IsZero<Eigen::Matrix2d>(obj); }
35  if( typeid(Eigen::Matrix2f)==obj.type() ) { return IsZero<Eigen::Matrix2f>(obj); }
36  if( typeid(Eigen::Matrix2i)==obj.type() ) { return IsZero<Eigen::Matrix2i>(obj); }
37 
38  if( typeid(Eigen::Matrix3d)==obj.type() ) { return IsZero<Eigen::Matrix3d>(obj); }
39  if( typeid(Eigen::Matrix3f)==obj.type() ) { return IsZero<Eigen::Matrix3f>(obj); }
40  if( typeid(Eigen::Matrix3i)==obj.type() ) { return IsZero<Eigen::Matrix3i>(obj); }
41 
42  if( typeid(Eigen::Matrix4d)==obj.type() ) { return IsZero<Eigen::Matrix4d>(obj); }
43  if( typeid(Eigen::Matrix4f)==obj.type() ) { return IsZero<Eigen::Matrix4f>(obj); }
44  if( typeid(Eigen::Matrix4i)==obj.type() ) { return IsZero<Eigen::Matrix4i>(obj); }
45 
46  if( typeid(Eigen::MatrixXd)==obj.type() ) { return IsZero<Eigen::MatrixXd>(obj); }
47  if( typeid(Eigen::MatrixXf)==obj.type() ) { return IsZero<Eigen::MatrixXf>(obj); }
48  if( typeid(Eigen::MatrixXi)==obj.type() ) { return IsZero<Eigen::MatrixXi>(obj); }
49 
50  // something went wrong
51  assert(false);
52  return false;
53 }
54 
55 double EigenMatrixAlgebra::Norm(boost::any const& mat) {
56  if( typeid(Eigen::Matrix2d)==mat.type() ) { return boost::any_cast<Eigen::Matrix2d const&>(mat).norm(); }
57  if( typeid(Eigen::Matrix3d)==mat.type() ) { return boost::any_cast<Eigen::Matrix3d const&>(mat).norm(); }
58  if( typeid(Eigen::Matrix4d)==mat.type() ) { return boost::any_cast<Eigen::Matrix4d const&>(mat).norm(); }
59  if( typeid(Eigen::MatrixXd)==mat.type() ) { return boost::any_cast<Eigen::MatrixXd const&>(mat).norm(); }
60 
61  if( typeid(Eigen::Matrix2f)==mat.type() ) { return boost::any_cast<Eigen::Matrix2f const&>(mat).norm(); }
62  if( typeid(Eigen::Matrix3f)==mat.type() ) { return boost::any_cast<Eigen::Matrix3f const&>(mat).norm(); }
63  if( typeid(Eigen::Matrix4f)==mat.type() ) { return boost::any_cast<Eigen::Matrix4f const&>(mat).norm(); }
64  if( typeid(Eigen::MatrixXf)==mat.type() ) { return boost::any_cast<Eigen::MatrixXf const&>(mat).norm(); }
65 
66  if( typeid(Eigen::Matrix2i)==mat.type() ) { return boost::any_cast<Eigen::Matrix2i const&>(mat).norm(); }
67  if( typeid(Eigen::Matrix3i)==mat.type() ) { return boost::any_cast<Eigen::Matrix3i const&>(mat).norm(); }
68  if( typeid(Eigen::Matrix4i)==mat.type() ) { return boost::any_cast<Eigen::Matrix4i const&>(mat).norm(); }
69  if( typeid(Eigen::MatrixXi)==mat.type() ) { return boost::any_cast<Eigen::MatrixXi const&>(mat).norm(); }
70 
71  // something went wrong
72  assert(false);
73  return -1.0;
74 }
75 
76 unsigned int EigenMatrixAlgebra::Size(boost::any const& mat, int const dim) {
77  // fixed size vectors
78  if( typeid(Eigen::Matrix2d)==mat.type() ) { return dim==-1? 4 : 2;}
79  if( typeid(Eigen::Matrix3d)==mat.type() ) { return dim==-1? 9 : 3; }
80  if( typeid(Eigen::Matrix4d)==mat.type() ) { return dim==-1? 16 : 4; }
81 
82  if( typeid(Eigen::Matrix2f)==mat.type() ) { return dim==-1? 4 : 2;}
83  if( typeid(Eigen::Matrix3f)==mat.type() ) { return dim==-1? 9 : 3; }
84  if( typeid(Eigen::Matrix4f)==mat.type() ) { return dim==-1? 16 : 4; }
85 
86  if( typeid(Eigen::Matrix2i)==mat.type() ) { return dim==-1? 4 : 2;}
87  if( typeid(Eigen::Matrix3i)==mat.type() ) { return dim==-1? 9 : 3; }
88  if( typeid(Eigen::Matrix4i)==mat.type() ) { return dim==-1? 16 : 4; }
89 
90  // generic Eigen::MatrixXd,f,i
91  if( typeid(Eigen::MatrixXd)==mat.type() ) { return Size<Eigen::MatrixXd>(mat, dim); }
92  if( typeid(Eigen::MatrixXf)==mat.type() ) { return Size<Eigen::MatrixXf>(mat, dim); }
93  if( typeid(Eigen::MatrixXi)==mat.type() ) { return Size<Eigen::MatrixXi>(mat, dim); }
94 
95  // something went wrong
96  assert(false);
97  return 0;
98 }
99 
100 boost::any EigenMatrixAlgebra::AccessElement(boost::any const& mat, unsigned int const i, unsigned int const j) {
101  if( typeid(Eigen::Matrix2d)==mat.type() ) { return AccessElement<Eigen::Matrix2d>(mat, i, j); }
102  if( typeid(Eigen::Matrix2f)==mat.type() ) { return AccessElement<Eigen::Matrix2f>(mat, i, j); }
103  if( typeid(Eigen::Matrix2i)==mat.type() ) { return AccessElement<Eigen::Matrix2i>(mat, i, j); }
104 
105  if( typeid(Eigen::Matrix3d)==mat.type() ) { return AccessElement<Eigen::Matrix3d>(mat, i, j); }
106  if( typeid(Eigen::Matrix3f)==mat.type() ) { return AccessElement<Eigen::Matrix3f>(mat, i, j); }
107  if( typeid(Eigen::Matrix3i)==mat.type() ) { return AccessElement<Eigen::Matrix3i>(mat, i, j); }
108 
109  if( typeid(Eigen::Matrix4d)==mat.type() ) { return AccessElement<Eigen::Matrix4d>(mat, i, j); }
110  if( typeid(Eigen::Matrix4f)==mat.type() ) { return AccessElement<Eigen::Matrix4f>(mat, i, j); }
111  if( typeid(Eigen::Matrix4i)==mat.type() ) { return AccessElement<Eigen::Matrix4i>(mat, i, j); }
112 
113  if( typeid(Eigen::MatrixXd)==mat.type() ) { return AccessElement<Eigen::MatrixXd>(mat, i, j); }
114  if( typeid(Eigen::MatrixXf)==mat.type() ) { return AccessElement<Eigen::MatrixXf>(mat, i, j); }
115  if( typeid(Eigen::MatrixXi)==mat.type() ) { return AccessElement<Eigen::MatrixXi>(mat, i, j); }
116 
117  // something went wront
118  assert(false);
119  return boost::none;
120 }
121 
122 boost::any EigenMatrixAlgebra::Identity(std::type_info const& type, unsigned int const rows, unsigned int const cols) {
123  if( type==typeid(Eigen::Matrix2d) ) { return (Eigen::Matrix2d)Eigen::Matrix2d::Identity(); }
124  if( type==typeid(Eigen::Matrix2f) ) { return (Eigen::Matrix2f)Eigen::Matrix2f::Identity(); }
125  if( type==typeid(Eigen::Matrix2i) ) { return (Eigen::Matrix2i)Eigen::Matrix2i::Identity(); }
126 
127  if( type==typeid(Eigen::Matrix3d) ) { return (Eigen::Matrix3d)Eigen::Matrix3d::Identity(); }
128  if( type==typeid(Eigen::Matrix3f) ) { return (Eigen::Matrix3f)Eigen::Matrix3f::Identity(); }
129  if( type==typeid(Eigen::Matrix3i) ) { return (Eigen::Matrix3i)Eigen::Matrix3i::Identity(); }
130 
131  if( type==typeid(Eigen::Matrix4d) ) { return (Eigen::Matrix4d)Eigen::Matrix4d::Identity(); }
132  if( type==typeid(Eigen::Matrix4f) ) { return (Eigen::Matrix4f)Eigen::Matrix4f::Identity(); }
133  if( type==typeid(Eigen::Matrix4i) ) { return (Eigen::Matrix4i)Eigen::Matrix4i::Identity(); }
134 
135  if( type==typeid(Eigen::MatrixXd) ) { return (Eigen::MatrixXd)Eigen::MatrixXd::Identity(rows, cols); }
136  if( type==typeid(Eigen::MatrixXf) ) { return (Eigen::MatrixXf)Eigen::MatrixXf::Identity(rows, cols); }
137  if( type==typeid(Eigen::MatrixXi) ) { return (Eigen::MatrixXi)Eigen::MatrixXi::Identity(rows, cols); }
138 
139  // something went wrong
140  assert(false);
141  return boost::none;
142 }
143 
144 boost::any EigenMatrixAlgebra::Add(boost::any const& in0, boost::any const& in1) {
145  // 2D matrices
146  if( in0.type()==typeid(Eigen::Matrix2d) ) {
147  if( in1.type()==typeid(Eigen::Matrix2d) ) { return Add<Eigen::Matrix2d, Eigen::Matrix2d>(in0, in1); }
148  if( in1.type()==typeid(Eigen::Vector2d) ) { return AddVector<Eigen::Matrix2d, Eigen::Vector2d>(in0, in1); }
149  if( in1.type()==typeid(Eigen::VectorXd) ) { return AddVector<Eigen::Matrix2d, Eigen::VectorXd>(in0, in1); }
150  return Add<Eigen::Matrix2d, Eigen::MatrixXd>(in0, in1);
151  }
152  if( in0.type()==typeid(Eigen::Matrix2f) ) {
153  if( in1.type()==typeid(Eigen::Matrix2f) ) { return Add<Eigen::Matrix2f, Eigen::Matrix2f>(in0, in1); }
154  if( in1.type()==typeid(Eigen::Vector2f) ) { return AddVector<Eigen::Matrix2f, Eigen::Vector2f>(in0, in1); }
155  if( in1.type()==typeid(Eigen::VectorXf) ) { return AddVector<Eigen::Matrix2f, Eigen::VectorXf>(in0, in1); }
156  return Add<Eigen::Matrix2f, Eigen::MatrixXf>(in0, in1);
157  }
158  if( in0.type()==typeid(Eigen::Matrix2i) ) {
159  if( in1.type()==typeid(Eigen::Matrix2i) ) { return Add<Eigen::Matrix2i, Eigen::Matrix2i>(in0, in1); }
160  if( in1.type()==typeid(Eigen::Vector2i) ) { return AddVector<Eigen::Matrix2i, Eigen::Vector2i>(in0, in1); }
161  if( in1.type()==typeid(Eigen::VectorXi) ) { return AddVector<Eigen::Matrix2i, Eigen::VectorXi>(in0, in1); }
162  return Add<Eigen::Matrix2i, Eigen::MatrixXi>(in0, in1);
163  }
164  if( in0.type()==typeid(Eigen::Vector2d) ) {
165  if( in1.type()==typeid(Eigen::Matrix2d) ) { return AddVector<Eigen::Matrix2d, Eigen::Vector2d>(in1, in0); }
166  return AddVector<Eigen::MatrixXd, Eigen::Vector2d>(in1, in0);
167  }
168  if( in0.type()==typeid(Eigen::Vector2f) ) {
169  if( in1.type()==typeid(Eigen::Matrix2f) ) { return AddVector<Eigen::Matrix2f, Eigen::Vector2f>(in1, in0); }
170  return AddVector<Eigen::MatrixXf, Eigen::Vector2f>(in1, in0);
171  }
172  if( in0.type()==typeid(Eigen::Vector2i) ) {
173  if( in1.type()==typeid(Eigen::Matrix2i) ) { return AddVector<Eigen::Matrix2i, Eigen::Vector2i>(in1, in0); }
174  return AddVector<Eigen::MatrixXi, Eigen::Vector2i>(in1, in0);
175  }
176 
177  // 3D matrices
178  if( in0.type()==typeid(Eigen::Matrix3d) ) {
179  if( in1.type()==typeid(Eigen::Matrix3d) ) { return Add<Eigen::Matrix3d, Eigen::Matrix3d>(in0, in1); }
180  if( in1.type()==typeid(Eigen::Vector3d) ) { return AddVector<Eigen::Matrix3d, Eigen::Vector3d>(in0, in1); }
181  if( in1.type()==typeid(Eigen::VectorXd) ) { return AddVector<Eigen::Matrix3d, Eigen::VectorXd>(in0, in1); }
182  return Add<Eigen::Matrix3d, Eigen::MatrixXd>(in0, in1);
183  }
184  if( in0.type()==typeid(Eigen::Matrix3f) ) {
185  if( in1.type()==typeid(Eigen::Matrix3f) ) { return Add<Eigen::Matrix3f, Eigen::Matrix3f>(in0, in1); }
186  if( in1.type()==typeid(Eigen::Vector3f) ) { return AddVector<Eigen::Matrix3f, Eigen::Vector3f>(in0, in1); }
187  if( in1.type()==typeid(Eigen::VectorXf) ) { return AddVector<Eigen::Matrix3f, Eigen::VectorXf>(in0, in1); }
188  return Add<Eigen::Matrix3f, Eigen::MatrixXf>(in0, in1);
189  }
190  if( in0.type()==typeid(Eigen::Matrix3i) ) {
191  if( in1.type()==typeid(Eigen::Matrix3i) ) { return Add<Eigen::Matrix3i, Eigen::Matrix3i>(in0, in1); }
192  if( in1.type()==typeid(Eigen::Vector3i) ) { return AddVector<Eigen::Matrix3i, Eigen::Vector3i>(in0, in1); }
193  if( in1.type()==typeid(Eigen::VectorXi) ) { return AddVector<Eigen::Matrix3i, Eigen::VectorXi>(in0, in1); }
194  return Add<Eigen::Matrix3i, Eigen::MatrixXi>(in0, in1);
195  }
196  if( in0.type()==typeid(Eigen::Vector3d) ) {
197  if( in1.type()==typeid(Eigen::Matrix3d) ) { return AddVector<Eigen::Matrix3d, Eigen::Vector3d>(in1, in0); }
198  return AddVector<Eigen::MatrixXd, Eigen::Vector3d>(in1, in0);
199  }
200  if( in0.type()==typeid(Eigen::Vector3f) ) {
201  if( in1.type()==typeid(Eigen::Matrix3f) ) { return AddVector<Eigen::Matrix3f, Eigen::Vector3f>(in1, in0); }
202  return AddVector<Eigen::MatrixXf, Eigen::Vector3f>(in1, in0);
203  }
204  if( in0.type()==typeid(Eigen::Vector3i) ) {
205  if( in1.type()==typeid(Eigen::Matrix3i) ) { return AddVector<Eigen::Matrix3i, Eigen::Vector3i>(in1, in0); }
206  return AddVector<Eigen::MatrixXi, Eigen::Vector3i>(in1, in0);
207  }
208 
209  // 4D matrices
210  if( in0.type()==typeid(Eigen::Matrix4d) ) {
211  if( in1.type()==typeid(Eigen::Matrix4d) ) { return Add<Eigen::Matrix4d, Eigen::Matrix4d>(in0, in1); }
212  if( in1.type()==typeid(Eigen::Vector4d) ) { return AddVector<Eigen::Matrix4d, Eigen::Vector4d>(in0, in1); }
213  if( in1.type()==typeid(Eigen::VectorXd) ) { return AddVector<Eigen::Matrix4d, Eigen::VectorXd>(in0, in1); }
214  return Add<Eigen::Matrix4d, Eigen::MatrixXd>(in0, in1);
215  }
216  if( in0.type()==typeid(Eigen::Matrix4f) ) {
217  if( in1.type()==typeid(Eigen::Matrix4f) ) { return Add<Eigen::Matrix4f, Eigen::Matrix4f>(in0, in1); }
218  if( in1.type()==typeid(Eigen::Vector4f) ) { return AddVector<Eigen::Matrix4f, Eigen::Vector4f>(in0, in1); }
219  if( in1.type()==typeid(Eigen::VectorXf) ) { return AddVector<Eigen::Matrix4f, Eigen::VectorXf>(in0, in1); }
220  return Add<Eigen::Matrix4f, Eigen::MatrixXf>(in0, in1);
221  }
222  if( in0.type()==typeid(Eigen::Matrix4i) ) {
223  if( in1.type()==typeid(Eigen::Matrix4i) ) { return Add<Eigen::Matrix4i, Eigen::Matrix4i>(in0, in1); }
224  if( in1.type()==typeid(Eigen::Vector4i) ) { return AddVector<Eigen::Matrix4i, Eigen::Vector4i>(in0, in1); }
225  if( in1.type()==typeid(Eigen::VectorXi) ) { return AddVector<Eigen::Matrix4i, Eigen::VectorXi>(in0, in1); }
226  return Add<Eigen::Matrix4i, Eigen::MatrixXi>(in0, in1);
227  }
228  if( in0.type()==typeid(Eigen::Vector4d) ) {
229  if( in1.type()==typeid(Eigen::Matrix4d) ) { return AddVector<Eigen::Matrix4d, Eigen::Vector4d>(in1, in0); }
230  return AddVector<Eigen::MatrixXd, Eigen::Vector4d>(in1, in0);
231  }
232  if( in0.type()==typeid(Eigen::Vector4f) ) {
233  if( in1.type()==typeid(Eigen::Matrix4f) ) { return AddVector<Eigen::Matrix4f, Eigen::Vector4f>(in1, in0); }
234  return AddVector<Eigen::MatrixXf, Eigen::Vector4f>(in1, in0);
235  }
236  if( in0.type()==typeid(Eigen::Vector4i) ) {
237  if( in1.type()==typeid(Eigen::Matrix4i) ) { return AddVector<Eigen::Matrix4i, Eigen::Vector4i>(in1, in0); }
238  return AddVector<Eigen::MatrixXi, Eigen::Vector4i>(in1, in0);
239  }
240 
241  // XD matrices
242  if( in0.type()==typeid(Eigen::MatrixXd) ) {
243  if( in1.type()==typeid(Eigen::Matrix2d) ) { return Add<Eigen::MatrixXd, Eigen::Matrix2d>(in0, in1); }
244  if( in1.type()==typeid(Eigen::Matrix3d) ) { return Add<Eigen::MatrixXd, Eigen::Matrix3d>(in0, in1); }
245  if( in1.type()==typeid(Eigen::Matrix4d) ) { return Add<Eigen::MatrixXd, Eigen::Matrix4d>(in0, in1); }
246  if( in1.type()==typeid(Eigen::VectorXd) ) { return AddVector<Eigen::MatrixXd, Eigen::VectorXd>(in0, in1); }
247  return Add<Eigen::MatrixXd, Eigen::MatrixXd>(in0, in1);
248  }
249  if( in0.type()==typeid(Eigen::VectorXd) ) {
250  if( in1.type()==typeid(Eigen::Matrix2d) ) { return AddVector<Eigen::Matrix2d, Eigen::VectorXd>(in1, in0); }
251  if( in1.type()==typeid(Eigen::Matrix3d) ) { return AddVector<Eigen::Matrix3d, Eigen::VectorXd>(in1, in0); }
252  if( in1.type()==typeid(Eigen::Matrix4d) ) { return AddVector<Eigen::Matrix4d, Eigen::VectorXd>(in1, in0); }
253  return AddVector<Eigen::MatrixXd, Eigen::VectorXd>(in1, in0);
254  }
255  if( in0.type()==typeid(Eigen::MatrixXf) ) {
256  if( in1.type()==typeid(Eigen::Matrix2f) ) { return Add<Eigen::MatrixXf, Eigen::Matrix2f>(in0, in1); }
257  if( in1.type()==typeid(Eigen::Matrix3f) ) { return Add<Eigen::MatrixXf, Eigen::Matrix3f>(in0, in1); }
258  if( in1.type()==typeid(Eigen::Matrix4f) ) { return Add<Eigen::MatrixXf, Eigen::Matrix4f>(in0, in1); }
259  if( in1.type()==typeid(Eigen::VectorXf) ) { return AddVector<Eigen::MatrixXf, Eigen::VectorXf>(in0, in1); }
260  return Add<Eigen::MatrixXf, Eigen::MatrixXf>(in0, in1);
261  }
262  if( in0.type()==typeid(Eigen::VectorXf) ) {
263  if( in1.type()==typeid(Eigen::Matrix2f) ) { return AddVector<Eigen::Matrix2f, Eigen::VectorXf>(in1, in0); }
264  if( in1.type()==typeid(Eigen::Matrix3f) ) { return AddVector<Eigen::Matrix3f, Eigen::VectorXf>(in1, in0); }
265  if( in1.type()==typeid(Eigen::Matrix4f) ) { return AddVector<Eigen::Matrix4f, Eigen::VectorXf>(in1, in0); }
266  return AddVector<Eigen::MatrixXf, Eigen::VectorXf>(in1, in0);
267  }
268  if( in0.type()==typeid(Eigen::MatrixXi) ) {
269  if( in1.type()==typeid(Eigen::Matrix2i) ) { return Add<Eigen::MatrixXi, Eigen::Matrix2i>(in0, in1); }
270  if( in1.type()==typeid(Eigen::Matrix3i) ) { return Add<Eigen::MatrixXi, Eigen::Matrix3i>(in0, in1); }
271  if( in1.type()==typeid(Eigen::Matrix4i) ) { return Add<Eigen::MatrixXi, Eigen::Matrix4i>(in0, in1); }
272  if( in1.type()==typeid(Eigen::VectorXi) ) { return AddVector<Eigen::MatrixXi, Eigen::VectorXi>(in0, in1); }
273  return Add<Eigen::MatrixXi, Eigen::MatrixXi>(in0, in1);
274  }
275  if( in0.type()==typeid(Eigen::VectorXi) ) {
276  if( in1.type()==typeid(Eigen::Matrix2i) ) { return AddVector<Eigen::Matrix2i, Eigen::VectorXi>(in1, in0); }
277  if( in1.type()==typeid(Eigen::Matrix3i) ) { return AddVector<Eigen::Matrix3i, Eigen::VectorXi>(in1, in0); }
278  if( in1.type()==typeid(Eigen::Matrix4i) ) { return AddVector<Eigen::Matrix4i, Eigen::VectorXi>(in1, in0); }
279  return AddVector<Eigen::MatrixXi, Eigen::VectorXi>(in1, in0);
280  }
281 
282  // something went wrong
283  assert(false);
284  return boost::none;
285 }
286 
287 boost::any EigenMatrixAlgebra::Subtract(boost::any const& in0, boost::any const& in1) {
288  // 2D matrices
289  if( in0.type()==typeid(Eigen::Matrix2d) ) {
290  if( in1.type()==typeid(Eigen::Matrix2d) ) { return Subtract<Eigen::Matrix2d, Eigen::Matrix2d>(in0, in1); }
291  return Subtract<Eigen::Matrix2d, Eigen::MatrixXd>(in0, in1);
292  }
293  if( in0.type()==typeid(Eigen::Matrix2f) ) {
294  if( in1.type()==typeid(Eigen::Matrix2f) ) { return Subtract<Eigen::Matrix2f, Eigen::Matrix2f>(in0, in1); }
295  return Subtract<Eigen::Matrix2f, Eigen::MatrixXf>(in0, in1);
296  }
297  if( in0.type()==typeid(Eigen::Matrix2i) ) {
298  if( in1.type()==typeid(Eigen::Matrix2i) ) { return Subtract<Eigen::Matrix2i, Eigen::Matrix2i>(in0, in1); }
299  return Subtract<Eigen::Matrix2i, Eigen::MatrixXi>(in0, in1);
300  }
301 
302  // 3D matrices
303  if( in0.type()==typeid(Eigen::Matrix3d) ) {
304  if( in1.type()==typeid(Eigen::Matrix3d) ) { return Subtract<Eigen::Matrix3d, Eigen::Matrix3d>(in0, in1); }
305  return Subtract<Eigen::Matrix3d, Eigen::MatrixXd>(in0, in1);
306  }
307  if( in0.type()==typeid(Eigen::Matrix3f) ) {
308  if( in1.type()==typeid(Eigen::Matrix3f) ) { return Subtract<Eigen::Matrix3f, Eigen::Matrix3f>(in0, in1); }
309  return Subtract<Eigen::Matrix3f, Eigen::MatrixXf>(in0, in1);
310  }
311  if( in0.type()==typeid(Eigen::Matrix3i) ) {
312  if( in1.type()==typeid(Eigen::Matrix3i) ) { return Subtract<Eigen::Matrix3i, Eigen::Matrix3i>(in0, in1); }
313  return Subtract<Eigen::Matrix3i, Eigen::MatrixXi>(in0, in1);
314  }
315 
316  // 4D matrices
317  if( in0.type()==typeid(Eigen::Matrix4d) ) {
318  if( in1.type()==typeid(Eigen::Matrix4d) ) { return Subtract<Eigen::Matrix4d, Eigen::Matrix4d>(in0, in1); }
319  return Subtract<Eigen::Matrix4d, Eigen::MatrixXd>(in0, in1);
320  }
321  if( in0.type()==typeid(Eigen::Matrix4f) ) {
322  if( in1.type()==typeid(Eigen::Matrix4f) ) { return Subtract<Eigen::Matrix4f, Eigen::Matrix4f>(in0, in1); }
323  return Subtract<Eigen::Matrix4f, Eigen::MatrixXf>(in0, in1);
324  }
325  if( in0.type()==typeid(Eigen::Matrix4i) ) {
326  if( in1.type()==typeid(Eigen::Matrix4i) ) { return Subtract<Eigen::Matrix4i, Eigen::Matrix4i>(in0, in1); }
327  return Subtract<Eigen::Matrix4i, Eigen::MatrixXi>(in0, in1);
328  }
329 
330  // XD matrices
331  if( in0.type()==typeid(Eigen::MatrixXd) ) {
332  if( in1.type()==typeid(Eigen::Matrix2d) ) { return Subtract<Eigen::MatrixXd, Eigen::Matrix2d>(in0, in1); }
333  if( in1.type()==typeid(Eigen::Matrix3d) ) { return Subtract<Eigen::MatrixXd, Eigen::Matrix3d>(in0, in1); }
334  if( in1.type()==typeid(Eigen::Matrix4d) ) { return Subtract<Eigen::MatrixXd, Eigen::Matrix4d>(in0, in1); }
335  return Subtract<Eigen::MatrixXd, Eigen::MatrixXd>(in0, in1);
336  }
337  if( in0.type()==typeid(Eigen::MatrixXf) ) {
338  if( in1.type()==typeid(Eigen::Matrix2f) ) { return Subtract<Eigen::MatrixXf, Eigen::Matrix2f>(in0, in1); }
339  if( in1.type()==typeid(Eigen::Matrix3f) ) { return Subtract<Eigen::MatrixXf, Eigen::Matrix3f>(in0, in1); }
340  if( in1.type()==typeid(Eigen::Matrix4f) ) { return Subtract<Eigen::MatrixXf, Eigen::Matrix4f>(in0, in1); }
341  return Subtract<Eigen::MatrixXf, Eigen::MatrixXf>(in0, in1);
342  }
343  if( in0.type()==typeid(Eigen::MatrixXi) ) {
344  if( in1.type()==typeid(Eigen::Matrix2i) ) { return Subtract<Eigen::MatrixXi, Eigen::Matrix2i>(in0, in1); }
345  if( in1.type()==typeid(Eigen::Matrix3i) ) { return Subtract<Eigen::MatrixXi, Eigen::Matrix3i>(in0, in1); }
346  if( in1.type()==typeid(Eigen::Matrix4i) ) { return Subtract<Eigen::MatrixXi, Eigen::Matrix4i>(in0, in1); }
347  return Subtract<Eigen::MatrixXi, Eigen::MatrixXi>(in0, in1);
348  }
349 
350  // something went wrong
351  assert(false);
352  return boost::none;
353 }
354 
355 boost::any EigenMatrixAlgebra::Multiply(boost::any const& in0, boost::any const& in1) {
356  // 2D matrices
357  if( in0.type()==typeid(Eigen::Matrix2d) ) {
358  if( in1.type()==typeid(Eigen::Matrix2d) ) { return Multiply<Eigen::Matrix2d, Eigen::Matrix2d>(in0, in1); }
359  return Multiply<Eigen::Matrix2d, Eigen::MatrixXd>(in0, in1);
360  }
361  if( in0.type()==typeid(Eigen::Matrix2f) ) {
362  if( in1.type()==typeid(Eigen::Matrix2f) ) { return Multiply<Eigen::Matrix2f, Eigen::Matrix2f>(in0, in1); }
363  return Multiply<Eigen::Matrix2f, Eigen::MatrixXf>(in0, in1);
364  }
365  if( in0.type()==typeid(Eigen::Matrix2i) ) {
366  if( in1.type()==typeid(Eigen::Matrix2i) ) { return Multiply<Eigen::Matrix2i, Eigen::Matrix2i>(in0, in1); }
367  return Multiply<Eigen::Matrix2i, Eigen::MatrixXi>(in0, in1);
368  }
369 
370  // 3D matrices
371  if( in0.type()==typeid(Eigen::Matrix3d) ) {
372  if( in1.type()==typeid(Eigen::Matrix3d) ) { return Multiply<Eigen::Matrix3d, Eigen::Matrix3d>(in0, in1); }
373  return Multiply<Eigen::Matrix3d, Eigen::MatrixXd>(in0, in1);
374  }
375  if( in0.type()==typeid(Eigen::Matrix3f) ) {
376  if( in1.type()==typeid(Eigen::Matrix3f) ) { return Multiply<Eigen::Matrix3f, Eigen::Matrix3f>(in0, in1); }
377  return Multiply<Eigen::Matrix3f, Eigen::MatrixXf>(in0, in1);
378  }
379  if( in0.type()==typeid(Eigen::Matrix3i) ) {
380  if( in1.type()==typeid(Eigen::Matrix3i) ) { return Multiply<Eigen::Matrix3i, Eigen::Matrix3i>(in0, in1); }
381  return Multiply<Eigen::Matrix3i, Eigen::MatrixXi>(in0, in1);
382  }
383 
384  // 4D matrices
385  if( in0.type()==typeid(Eigen::Matrix4d) ) {
386  if( in1.type()==typeid(Eigen::Matrix4d) ) { return Multiply<Eigen::Matrix4d, Eigen::Matrix4d>(in0, in1); }
387  return Multiply<Eigen::Matrix4d, Eigen::MatrixXd>(in0, in1);
388  }
389  if( in0.type()==typeid(Eigen::Matrix4f) ) {
390  if( in1.type()==typeid(Eigen::Matrix4f) ) { return Multiply<Eigen::Matrix4f, Eigen::Matrix4f>(in0, in1); }
391  return Multiply<Eigen::Matrix4f, Eigen::MatrixXf>(in0, in1);
392  }
393  if( in0.type()==typeid(Eigen::Matrix4i) ) {
394  if( in1.type()==typeid(Eigen::Matrix4i) ) { return Multiply<Eigen::Matrix4i, Eigen::Matrix4i>(in0, in1); }
395  return Multiply<Eigen::Matrix4i, Eigen::MatrixXi>(in0, in1);
396  }
397 
398  // XD matrices
399  if( in0.type()==typeid(Eigen::MatrixXd) ) {
400  if( in1.type()==typeid(Eigen::Matrix2d) ) { return Multiply<Eigen::MatrixXd, Eigen::Matrix2d>(in0, in1); }
401  if( in1.type()==typeid(Eigen::Matrix3d) ) { return Multiply<Eigen::MatrixXd, Eigen::Matrix3d>(in0, in1); }
402  if( in1.type()==typeid(Eigen::Matrix4d) ) { return Multiply<Eigen::MatrixXd, Eigen::Matrix4d>(in0, in1); }
403  return Multiply<Eigen::MatrixXd, Eigen::MatrixXd>(in0, in1);
404  }
405  if( in0.type()==typeid(Eigen::MatrixXf) ) {
406  if( in1.type()==typeid(Eigen::Matrix2f) ) { return Multiply<Eigen::MatrixXf, Eigen::Matrix2f>(in0, in1); }
407  if( in1.type()==typeid(Eigen::Matrix3f) ) { return Multiply<Eigen::MatrixXf, Eigen::Matrix3f>(in0, in1); }
408  if( in1.type()==typeid(Eigen::Matrix4f) ) { return Multiply<Eigen::MatrixXf, Eigen::Matrix4f>(in0, in1); }
409  return Multiply<Eigen::MatrixXf, Eigen::MatrixXf>(in0, in1);
410  }
411  if( in0.type()==typeid(Eigen::MatrixXi) ) {
412  if( in1.type()==typeid(Eigen::Matrix2i) ) { return Multiply<Eigen::MatrixXi, Eigen::Matrix2i>(in0, in1); }
413  if( in1.type()==typeid(Eigen::Matrix3i) ) { return Multiply<Eigen::MatrixXi, Eigen::Matrix3i>(in0, in1); }
414  if( in1.type()==typeid(Eigen::Matrix4i) ) { return Multiply<Eigen::MatrixXi, Eigen::Matrix4i>(in0, in1); }
415  return Multiply<Eigen::MatrixXi, Eigen::MatrixXi>(in0, in1);
416  }
417 
418  // something went wrong
419  assert(false);
420  return boost::none;
421 }
422 
423 boost::any EigenMatrixAlgebra::ScalarMultiply(boost::any const& in0, boost::any const& in1) {
424  if( in0.type()==typeid(double) ) {
425  if( in1.type()==typeid(Eigen::Matrix2d) ) { return ScalarMultiply<double, Eigen::Matrix2d>(in0, in1); }
426  if( in1.type()==typeid(Eigen::Matrix3d) ) { return ScalarMultiply<double, Eigen::Matrix3d>(in0, in1); }
427  if( in1.type()==typeid(Eigen::Matrix4d) ) { return ScalarMultiply<double, Eigen::Matrix4d>(in0, in1); }
428 
429  return ScalarMultiply<double, Eigen::MatrixXd>(in0, in1);
430  }
431 
432  if( in0.type()==typeid(float) ) {
433  if( in1.type()==typeid(Eigen::Matrix2f) ) { return ScalarMultiply<float, Eigen::Matrix2f>(in0, in1); }
434  if( in1.type()==typeid(Eigen::Matrix3f) ) { return ScalarMultiply<float, Eigen::Matrix3f>(in0, in1); }
435  if( in1.type()==typeid(Eigen::Matrix4f) ) { return ScalarMultiply<float, Eigen::Matrix4f>(in0, in1); }
436 
437  return ScalarMultiply<float, Eigen::MatrixXf>(in0, in1);
438  }
439 
440  if( in0.type()==typeid(int) ) {
441  if( in1.type()==typeid(Eigen::Matrix2i) ) { return ScalarMultiply<int, Eigen::Matrix2i>(in0, in1); }
442  if( in1.type()==typeid(Eigen::Matrix3i) ) { return ScalarMultiply<int, Eigen::Matrix3i>(in0, in1); }
443  if( in1.type()==typeid(Eigen::Matrix4i) ) { return ScalarMultiply<int, Eigen::Matrix4i>(in0, in1); }
444 
445  return ScalarMultiply<int, Eigen::MatrixXi>(in0, in1);
446  }
447 
448  if( in0.type()==typeid(unsigned int) ) {
449  if( in1.type()==typeid(Eigen::Matrix2i) ) { return ScalarMultiply<unsigned int, Eigen::Matrix2i>(in0, in1); }
450  if( in1.type()==typeid(Eigen::Matrix3i) ) { return ScalarMultiply<unsigned int, Eigen::Matrix3i>(in0, in1); }
451  if( in1.type()==typeid(Eigen::Matrix4i) ) { return ScalarMultiply<unsigned int, Eigen::Matrix4i>(in0, in1); }
452 
453  return ScalarMultiply<unsigned int, Eigen::MatrixXi>(in0, in1);
454  }
455 
456  // something went wrong
457  assert(false);
458  return boost::none;
459 }
460 
461 boost::any EigenMatrixAlgebra::Zero(std::type_info const& type, unsigned int const rows, unsigned int const cols) {
462  if( typeid(Eigen::Matrix2d)==type ) { return (Eigen::Matrix2d)Eigen::Matrix2d::Zero(); }
463  if( typeid(Eigen::Matrix2f)==type ) { return (Eigen::Matrix2f)Eigen::Matrix2f::Zero(); }
464  if( typeid(Eigen::Matrix2i)==type ) { return (Eigen::Matrix2i)Eigen::Matrix2i::Zero(); }
465 
466  if( typeid(Eigen::Matrix3d)==type ) { return (Eigen::Matrix3d)Eigen::Matrix3d::Zero(); }
467  if( typeid(Eigen::Matrix3f)==type ) { return (Eigen::Matrix3f)Eigen::Matrix3f::Zero(); }
468  if( typeid(Eigen::Matrix3i)==type ) { return (Eigen::Matrix3i)Eigen::Matrix3i::Zero(); }
469 
470  if( typeid(Eigen::Matrix4d)==type ) { return (Eigen::Matrix4d)Eigen::Matrix4d::Zero(); }
471  if( typeid(Eigen::Matrix4f)==type ) { return (Eigen::Matrix4f)Eigen::Matrix4f::Zero(); }
472  if( typeid(Eigen::Matrix4i)==type ) { return (Eigen::Matrix4i)Eigen::Matrix4i::Zero(); }
473 
474  if( typeid(Eigen::MatrixXd)==type ) { return (Eigen::MatrixXd)Eigen::MatrixXd::Zero(rows, cols); }
475  if( typeid(Eigen::MatrixXf)==type ) { return (Eigen::MatrixXf)Eigen::MatrixXf::Zero(rows, cols); }
476  if( typeid(Eigen::MatrixXi)==type ) { return (Eigen::MatrixXi)Eigen::MatrixXi::Zero(rows, cols); }
477 
478  // something went wrong
479  assert(false);
480  return boost::none;
481 }
482 
483 boost::any EigenMatrixAlgebra::ApplyInverse(boost::any const& A, boost::any const& x) {
484  if( typeid(Eigen::Matrix2d)==A.type() ) {
485  if( typeid(Eigen::Vector2d)==x.type() ) { return ApplyInverse<Eigen::Matrix2d, Eigen::Vector2d>(A, x); }
486  return ApplyInverse<Eigen::Matrix2d, Eigen::VectorXd>(A, x);
487  }
488  if( typeid(Eigen::LLT<Eigen::Matrix2d>)==A.type() ) {
489  // the cholesky
490  const Eigen::LLT<Eigen::Matrix2d>& chol = boost::any_cast<Eigen::LLT<Eigen::Matrix2d> const&>(A);
491 
492  if( typeid(Eigen::Vector2d)==x.type() ) { return ApplyCholeskyInverse<Eigen::Matrix2d, Eigen::Vector2d>(chol, x); }
493 
494  return ApplyCholeskyInverse<Eigen::Matrix2d, Eigen::VectorXd>(chol, x);
495  }
496 
497  if( typeid(Eigen::Matrix2f)==A.type() ) {
498  if( typeid(Eigen::Vector2f)==x.type() ) { return ApplyInverse<Eigen::Matrix2f, Eigen::Vector2f>(A, x); }
499  return ApplyInverse<Eigen::Matrix2f, Eigen::VectorXf>(A, x);
500  }
501  if( typeid(Eigen::LLT<Eigen::Matrix2f>)==A.type() ) {
502  // the cholesky
503  const Eigen::LLT<Eigen::Matrix2f>& chol = boost::any_cast<Eigen::LLT<Eigen::Matrix2f> const&>(A);
504 
505  if( typeid(Eigen::Vector2f)==x.type() ) { return ApplyCholeskyInverse<Eigen::Matrix2f, Eigen::Vector2f>(chol, x); }
506 
507  return ApplyCholeskyInverse<Eigen::Matrix2f, Eigen::VectorXf>(chol, x);
508  }
509 
510  if( typeid(Eigen::Matrix3d)==A.type() ) {
511  if( typeid(Eigen::Vector3d)==x.type() ) { return ApplyInverse<Eigen::Matrix3d, Eigen::Vector3d>(A, x); }
512  return ApplyInverse<Eigen::Matrix3d, Eigen::VectorXd>(A, x);
513  }
514  if( typeid(Eigen::LLT<Eigen::Matrix3d>)==A.type() ) {
515  // the cholesky
516  const Eigen::LLT<Eigen::Matrix3d>& chol = boost::any_cast<Eigen::LLT<Eigen::Matrix3d> const&>(A);
517 
518  if( typeid(Eigen::Vector3d)==x.type() ) { return ApplyCholeskyInverse<Eigen::Matrix3d, Eigen::Vector3d>(chol, x); }
519 
520  return ApplyCholeskyInverse<Eigen::Matrix3d, Eigen::VectorXd>(chol, x);
521  }
522 
523  if( typeid(Eigen::Matrix3f)==A.type() ) {
524  if( typeid(Eigen::Vector3f)==x.type() ) { return ApplyInverse<Eigen::Matrix3f, Eigen::Vector3f>(A, x); }
525  return ApplyInverse<Eigen::Matrix3f, Eigen::VectorXf>(A, x);
526  }
527  if( typeid(Eigen::LLT<Eigen::Matrix3f>)==A.type() ) {
528  // the cholesky
529  const Eigen::LLT<Eigen::Matrix3f>& chol = boost::any_cast<Eigen::LLT<Eigen::Matrix3f> const&>(A);
530 
531  if( typeid(Eigen::Vector3f)==x.type() ) { return ApplyCholeskyInverse<Eigen::Matrix3f, Eigen::Vector3f>(chol, x); }
532 
533  return ApplyCholeskyInverse<Eigen::Matrix3f, Eigen::VectorXf>(chol, x);
534  }
535 
536  if( typeid(Eigen::Matrix4d)==A.type() ) {
537  if( typeid(Eigen::Vector4d)==x.type() ) { return ApplyInverse<Eigen::Matrix4d, Eigen::Vector4d>(A, x); }
538  return ApplyInverse<Eigen::Matrix4d, Eigen::VectorXd>(A, x);
539  }
540  if( typeid(Eigen::LLT<Eigen::Matrix4d>)==A.type() ) {
541  // the cholesky
542  const Eigen::LLT<Eigen::Matrix4d>& chol = boost::any_cast<Eigen::LLT<Eigen::Matrix4d> const&>(A);
543 
544  if( typeid(Eigen::Vector4d)==x.type() ) { return ApplyCholeskyInverse<Eigen::Matrix4d, Eigen::Vector4d>(chol, x); }
545 
546  return ApplyCholeskyInverse<Eigen::Matrix4d, Eigen::VectorXd>(chol, x);
547  }
548 
549  if( typeid(Eigen::Matrix4f)==A.type() ) {
550  if( typeid(Eigen::Vector4f)==x.type() ) { return ApplyInverse<Eigen::Matrix4f, Eigen::Vector4f>(A, x); }
551  return ApplyInverse<Eigen::Matrix4f, Eigen::VectorXf>(A, x);
552  }
553  if( typeid(Eigen::LLT<Eigen::Matrix4f>)==A.type() ) {
554  // the cholesky
555  const Eigen::LLT<Eigen::Matrix4f>& chol = boost::any_cast<Eigen::LLT<Eigen::Matrix4f> const&>(A);
556 
557  if( typeid(Eigen::Vector4f)==x.type() ) { return ApplyCholeskyInverse<Eigen::Matrix4f, Eigen::Vector4f>(chol, x); }
558 
559  return ApplyCholeskyInverse<Eigen::Matrix4f, Eigen::VectorXf>(chol, x);
560  }
561 
562  if( typeid(Eigen::MatrixXd)==A.type() ) {
563  if( typeid(Eigen::Vector2d)==x.type() ) { return ApplyInverse<Eigen::MatrixXd, Eigen::Vector2d>(A, x); }
564  if( typeid(Eigen::Vector3d)==x.type() ) { return ApplyInverse<Eigen::MatrixXd, Eigen::Vector3d>(A, x); }
565  if( typeid(Eigen::Vector4d)==x.type() ) { return ApplyInverse<Eigen::MatrixXd, Eigen::Vector4d>(A, x); }
566 
567  return ApplyInverse<Eigen::MatrixXd, Eigen::VectorXd>(A, x);
568  }
569  if( typeid(Eigen::LLT<Eigen::MatrixXd>)==A.type() ) { return ApplyCholeskyInverse<Eigen::MatrixXd, Eigen::VectorXd>(A, x); }
570 
571  if( typeid(Eigen::MatrixXf)==A.type() ) {
572  if( typeid(Eigen::Vector2f)==x.type() ) { return ApplyInverse<Eigen::MatrixXf, Eigen::Vector2f>(A, x); }
573  if( typeid(Eigen::Vector3f)==x.type() ) { return ApplyInverse<Eigen::MatrixXf, Eigen::Vector3f>(A, x); }
574  if( typeid(Eigen::Vector4f)==x.type() ) { return ApplyInverse<Eigen::MatrixXf, Eigen::Vector4f>(A, x); }
575 
576  return ApplyInverse<Eigen::MatrixXf, Eigen::VectorXf>(A, x);
577  }
578  if( typeid(Eigen::LLT<Eigen::MatrixXf>)==A.type() ) { return ApplyCholeskyInverse<Eigen::MatrixXf, Eigen::VectorXf>(A, x); }
579 
580  // something went wrong
581  assert(false);
582  return boost::none;
583 }
584 
585 boost::any EigenMatrixAlgebra::Apply(boost::any const& A, boost::any const& x) {
586  if( typeid(Eigen::Matrix2d)==A.type() ) {
587  if( typeid(Eigen::Vector2d)==x.type() ) { return Apply<Eigen::Matrix2d, Eigen::Vector2d>(A, x); }
588 
589  return Apply<Eigen::Matrix2d, Eigen::VectorXd>(A, x);
590  }
591  if( typeid(Eigen::LLT<Eigen::Matrix2d>)==A.type() ) {
592  if( typeid(Eigen::Vector2d)==x.type() ) { return ApplyCholesky<Eigen::Matrix2d, Eigen::Vector2d>(A, x); }
593  return ApplyCholesky<Eigen::Matrix2d, Eigen::VectorXd>(A, x);
594  }
595  if( typeid(Eigen::Matrix2f)==A.type() ) {
596  if( typeid(Eigen::Vector2f)==x.type() ) { return Apply<Eigen::Matrix2f, Eigen::Vector2f>(A, x); }
597 
598  return Apply<Eigen::Matrix2f, Eigen::VectorXf>(A, x);
599  }
600  if( typeid(Eigen::LLT<Eigen::Matrix2f>)==A.type() ) {
601  if( typeid(Eigen::Vector2f)==x.type() ) { return ApplyCholesky<Eigen::Matrix2f, Eigen::Vector2f>(A, x); }
602  return ApplyCholesky<Eigen::Matrix2f, Eigen::VectorXf>(A, x);
603  }
604  if( typeid(Eigen::Matrix2i)==A.type() ) {
605  if( typeid(Eigen::Vector2i)==x.type() ) { return Apply<Eigen::Matrix2i, Eigen::Vector2i>(A, x); }
606 
607  return Apply<Eigen::Matrix2i, Eigen::VectorXi>(A, x);
608  }
609 
610  if( typeid(Eigen::Matrix3d)==A.type() ) {
611  if( typeid(Eigen::Vector3d)==x.type() ) { return Apply<Eigen::Matrix3d, Eigen::Vector3d>(A, x); }
612 
613  return Apply<Eigen::Matrix3d, Eigen::VectorXd>(A, x);
614  }
615  if( typeid(Eigen::LLT<Eigen::Matrix3d>)==A.type() ) {
616  if( typeid(Eigen::Vector3d)==x.type() ) { return ApplyCholesky<Eigen::Matrix3d, Eigen::Vector3d>(A, x); }
617  return ApplyCholesky<Eigen::Matrix3d, Eigen::VectorXd>(A, x);
618  }
619  if( typeid(Eigen::Matrix3f)==A.type() ) {
620  if( typeid(Eigen::Vector3f)==x.type() ) { return Apply<Eigen::Matrix3f, Eigen::Vector3f>(A, x); }
621 
622  return Apply<Eigen::Matrix3f, Eigen::VectorXf>(A, x);
623  }
624  if( typeid(Eigen::LLT<Eigen::Matrix3f>)==A.type() ) {
625  if( typeid(Eigen::Vector3f)==x.type() ) { return ApplyCholesky<Eigen::Matrix3f, Eigen::Vector3f>(A, x); }
626  return ApplyCholesky<Eigen::Matrix3f, Eigen::VectorXf>(A, x);
627  }
628  if( typeid(Eigen::Matrix3i)==A.type() ) {
629  if( typeid(Eigen::Vector3i)==x.type() ) { return Apply<Eigen::Matrix3i, Eigen::Vector3i>(A, x); }
630 
631  return Apply<Eigen::Matrix3i, Eigen::VectorXi>(A, x);
632  }
633 
634  if( typeid(Eigen::Matrix4d)==A.type() ) {
635  if( typeid(Eigen::Vector4d)==x.type() ) { return Apply<Eigen::Matrix4d, Eigen::Vector4d>(A, x); }
636 
637  return Apply<Eigen::Matrix4d, Eigen::VectorXd>(A, x);
638  }
639  if( typeid(Eigen::LLT<Eigen::Matrix4d>)==A.type() ) {
640  if( typeid(Eigen::Vector4d)==x.type() ) { return ApplyCholesky<Eigen::Matrix4d, Eigen::Vector4d>(A, x); }
641  return ApplyCholesky<Eigen::Matrix4d, Eigen::VectorXd>(A, x);
642  }
643  if( typeid(Eigen::Matrix4f)==A.type() ) {
644  if( typeid(Eigen::Vector4f)==x.type() ) { return Apply<Eigen::Matrix4f, Eigen::Vector4f>(A, x); }
645 
646  return Apply<Eigen::Matrix4f, Eigen::VectorXf>(A, x);
647  }
648  if( typeid(Eigen::LLT<Eigen::Matrix4f>)==A.type() ) {
649  if( typeid(Eigen::Vector4f)==x.type() ) { return ApplyCholesky<Eigen::Matrix4f, Eigen::Vector4f>(A, x); }
650  return ApplyCholesky<Eigen::Matrix4f, Eigen::VectorXf>(A, x);
651  }
652  if( typeid(Eigen::Matrix4i)==A.type() ) {
653  if( typeid(Eigen::Vector4i)==x.type() ) { return Apply<Eigen::Matrix4i, Eigen::Vector4i>(A, x); }
654 
655  return Apply<Eigen::Matrix4i, Eigen::VectorXi>(A, x);
656  }
657 
658  if( typeid(Eigen::MatrixXd)==A.type() ) {
659  if( typeid(Eigen::Vector2d)==x.type() ) { return Apply<Eigen::MatrixXd, Eigen::Vector2d>(A, x); }
660  if( typeid(Eigen::Vector3d)==x.type() ) { return Apply<Eigen::MatrixXd, Eigen::Vector3d>(A, x); }
661  if( typeid(Eigen::Vector4d)==x.type() ) { return Apply<Eigen::MatrixXd, Eigen::Vector4d>(A, x); }
662 
663  return Apply<Eigen::MatrixXd, Eigen::VectorXd>(A, x);
664  }
665  if( typeid(Eigen::LLT<Eigen::MatrixXd>)==A.type() ) {
666  if( typeid(Eigen::Vector2d)==x.type() ) { return ApplyCholesky<Eigen::MatrixXd, Eigen::Vector2d>(A, x); }
667  if( typeid(Eigen::Vector3d)==x.type() ) { return ApplyCholesky<Eigen::MatrixXd, Eigen::Vector3d>(A, x); }
668  if( typeid(Eigen::Vector4d)==x.type() ) { return ApplyCholesky<Eigen::MatrixXd, Eigen::Vector4d>(A, x); }
669 
670  return ApplyCholesky<Eigen::MatrixXd, Eigen::VectorXd>(A, x);
671  }
672 
673  if( typeid(Eigen::MatrixXf)==A.type() ) {
674  if( typeid(Eigen::Vector2f)==x.type() ) { return Apply<Eigen::MatrixXf, Eigen::Vector2f>(A, x); }
675  if( typeid(Eigen::Vector3f)==x.type() ) { return Apply<Eigen::MatrixXf, Eigen::Vector3f>(A, x); }
676  if( typeid(Eigen::Vector4f)==x.type() ) { return Apply<Eigen::MatrixXf, Eigen::Vector4f>(A, x); }
677 
678  return Apply<Eigen::MatrixXf, Eigen::VectorXf>(A, x);
679  }
680  if( typeid(Eigen::LLT<Eigen::MatrixXf>)==A.type() ) {
681  if( typeid(Eigen::Vector2f)==x.type() ) { return ApplyCholesky<Eigen::MatrixXf, Eigen::Vector2f>(A, x); }
682  if( typeid(Eigen::Vector3f)==x.type() ) { return ApplyCholesky<Eigen::MatrixXf, Eigen::Vector3f>(A, x); }
683  if( typeid(Eigen::Vector4f)==x.type() ) { return ApplyCholesky<Eigen::MatrixXf, Eigen::Vector4f>(A, x); }
684 
685  return ApplyCholesky<Eigen::MatrixXf, Eigen::VectorXf>(A, x);
686  }
687 
688 
689  if( typeid(Eigen::MatrixXi)==A.type() ) {
690  if( typeid(Eigen::Vector2i)==x.type() ) { return Apply<Eigen::MatrixXi, Eigen::Vector2i>(A, x); }
691  if( typeid(Eigen::Vector3i)==x.type() ) { return Apply<Eigen::MatrixXi, Eigen::Vector3i>(A, x); }
692  if( typeid(Eigen::Vector4i)==x.type() ) { return Apply<Eigen::MatrixXi, Eigen::Vector4i>(A, x); }
693 
694  return Apply<Eigen::MatrixXi, Eigen::VectorXi>(A, x);
695  }
696 
697  // something went wrong
698  assert(false);
699  return boost::none;
700 }
701 
702 boost::any EigenMatrixAlgebra::SquareRoot(boost::any const& obj) {
703  if( typeid(Eigen::LLT<Eigen::Matrix2d>)==obj.type() ) { return SquareRoot<Eigen::Matrix2d>(obj); }
704  if( typeid(Eigen::LLT<Eigen::Matrix2f>)==obj.type() ) { return SquareRoot<Eigen::Matrix2f>(obj); }
705  if( typeid(Eigen::LLT<Eigen::Matrix3d>)==obj.type() ) { return SquareRoot<Eigen::Matrix3d>(obj); }
706  if( typeid(Eigen::LLT<Eigen::Matrix3f>)==obj.type() ) { return SquareRoot<Eigen::Matrix3f>(obj); }
707  if( typeid(Eigen::LLT<Eigen::Matrix4d>)==obj.type() ) { return SquareRoot<Eigen::Matrix4d>(obj); }
708  if( typeid(Eigen::LLT<Eigen::Matrix4f>)==obj.type() ) { return SquareRoot<Eigen::Matrix4f>(obj); }
709  if( typeid(Eigen::LLT<Eigen::MatrixXd>)==obj.type() ) { return SquareRoot<Eigen::MatrixXd>(obj); }
710  if( typeid(Eigen::LLT<Eigen::MatrixXf>)==obj.type() ) { return SquareRoot<Eigen::MatrixXf>(obj); }
711 
712  // something went wrong
713  assert(false);
714  return boost::none;
715 }
716 
717 double EigenMatrixAlgebra::LogDeterminate(boost::any const& obj) {
718  if( typeid(Eigen::LLT<Eigen::Matrix2d>)==obj.type() ) { return LogDeterminate<Eigen::Matrix2d>(obj); }
719  if( typeid(Eigen::LLT<Eigen::Matrix2f>)==obj.type() ) { return LogDeterminate<Eigen::Matrix2f>(obj); }
720 
721  if( typeid(Eigen::LLT<Eigen::Matrix3d>)==obj.type() ) { return LogDeterminate<Eigen::Matrix3d>(obj); }
722  if( typeid(Eigen::LLT<Eigen::Matrix3f>)==obj.type() ) { return LogDeterminate<Eigen::Matrix3f>(obj); }
723 
724  if( typeid(Eigen::LLT<Eigen::Matrix4d>)==obj.type() ) { return LogDeterminate<Eigen::Matrix4d>(obj); }
725  if( typeid(Eigen::LLT<Eigen::Matrix4f>)==obj.type() ) { return LogDeterminate<Eigen::Matrix4f>(obj); }
726 
727  if( typeid(Eigen::LLT<Eigen::MatrixXd>)==obj.type() ) { return LogDeterminate<Eigen::MatrixXd>(obj); }
728  if( typeid(Eigen::LLT<Eigen::MatrixXf>)==obj.type() ) { return LogDeterminate<Eigen::MatrixXf>(obj); }
729 
730  // something went wrong
731  assert(false);
732  return -1.0;
733 }