bpp-phyl3 3.0.0
DataFlowNumeric.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: The Bio++ Development Group
2//
3// SPDX-License-Identifier: CECILL-2.1
4
5#include <Bpp/Exceptions.h>
6
7#include "DataFlowNumeric.h"
8
9using namespace Eigen;
10
11namespace bpp
12{
13/*****************************************/
14/* copyBppToEigen */
15
16
17template void copyBppToEigen (const std::vector<ExtendedFloat>& bppVector, Eigen::RowVectorXd& eigenVector);
18template void copyBppToEigen (const std::vector<ExtendedFloat>& bppVector, Eigen::VectorXd& eigenVector);
19template void copyBppToEigen (const std::vector<ExtendedFloat>& bppVector, ExtendedFloatRowVectorXd& eigenVector);
20template void copyBppToEigen (const std::vector<ExtendedFloat>& bppVector, ExtendedFloatVectorXd& eigenVector);
21
22template void copyBppToEigen (const bpp::Vdouble& bppVector, Eigen::RowVectorXd& eigenVector);
23template void copyBppToEigen (const bpp::Vdouble& bppVector, Eigen::VectorXd& eigenVector);
24template void copyBppToEigen (const bpp::Vdouble& bppVector, ExtendedFloatRowVectorXd& eigenVector);
25template void copyBppToEigen (const bpp::Vdouble& bppVector, ExtendedFloatVectorXd& eigenVector);
26
27
28// template void copyBppToEigen(bpp::Matrix<double> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&);
29
30
31void copyBppToEigen (const std::vector<ExtendedFloatVectorXd>& bppVector, ExtendedFloatMatrixXd& eigenVector)
32{
33 // Look for largest extendedfloat
34 ExtendedFloat::ExtType maxE = std::max_element(bppVector.begin(), bppVector.end(), [](const ExtendedFloatVectorXd& lhs, const ExtendedFloatVectorXd& rhs){
35 return lhs.exponent_part() < rhs.exponent_part();
36 })->exponent_part();
37
38 eigenVector.exponent_part() = maxE;
39 eigenVector.float_part() = Eigen::MatrixXd::NullaryExpr(static_cast<Eigen::Index>(bppVector[0].rows()),
40 static_cast<Eigen::Index>(bppVector.size()),
41 [&maxE, &bppVector](int i, int j){
42 return bppVector[(size_t)j].float_part()(i) * bpp::constexpr_power<double> (bpp::ExtendedFloat::radix, bppVector[(size_t)j].exponent_part () - maxE);
43 });
44}
45
46
47void copyBppToEigen (const std::vector<Eigen::VectorXd>& bppVector, Eigen::MatrixXd& eigenMatrix)
48{
49 // Look for largest extendedfloat
50 const auto eigenRows = static_cast<Eigen::Index>(bppVector[0].rows());
51 const auto eigenCols = static_cast<Eigen::Index>(bppVector.size());
52
53 eigenMatrix.resize (eigenRows, eigenCols);
54 eigenMatrix.fill(0);
55 for (Eigen::Index j = 0; j < eigenCols; ++j)
56 {
57 for (Eigen::Index i = 0; i < eigenRows; ++i)
58 {
59 eigenMatrix (i, j) = bppVector[(std::size_t)j](i);
60 }
61 }
62}
63
64
65void copyBppToEigen (const bpp::Matrix<double>& bppMatrix, ExtendedFloatMatrixXd& eigenMatrix)
66{
67 const auto eigenRows = static_cast<Eigen::Index>(bppMatrix.getNumberOfRows ());
68 const auto eigenCols = static_cast<Eigen::Index>(bppMatrix.getNumberOfColumns ());
69 eigenMatrix.resize (eigenRows, eigenCols);
70 eigenMatrix.fill(0);
71 for (Eigen::Index i = 0; i < eigenRows; ++i)
72 {
73 for (Eigen::Index j = 0; j < eigenCols; ++j)
74 {
75 eigenMatrix.float_part() (i, j) = bppMatrix (static_cast<std::size_t>(i), static_cast<std::size_t>(j));
76 }
77 }
78#ifdef DEBUG
79 std::cerr << "=== copyBppToEigen(" << typeid(bppMatrix).name() << ", " << typeid(eigenMatrix).name() << ") ===" << std::endl;
80 std::cerr << &bppMatrix << std::endl;
81 std::cerr << eigenRows << "," << eigenCols << std::endl;
82 std::cerr << eigenMatrix << std::endl;
83 std::cerr << "=== end copyBppToEigen === " << std::endl;
84#endif
85}
86
87void copyBppToEigen (const bpp::Matrix<double>& bppMatrix, Eigen::MatrixXd& eigenMatrix)
88{
89 const auto eigenRows = static_cast<Eigen::Index>(bppMatrix.getNumberOfRows ());
90 const auto eigenCols = static_cast<Eigen::Index>(bppMatrix.getNumberOfColumns ());
91 eigenMatrix.resize (eigenRows, eigenCols);
92 eigenMatrix.fill(0);
93 for (Eigen::Index i = 0; i < eigenRows; ++i)
94 {
95 for (Eigen::Index j = 0; j < eigenCols; ++j)
96 {
97 eigenMatrix (i, j) = bppMatrix (static_cast<std::size_t>(i), static_cast<std::size_t>(j));
98 }
99 }
100#ifdef DEBUG
101 std::cerr << "copyBppToEigen(" << typeid(bppMatrix).name() << ", " << typeid(eigenMatrix).name() << ")" << std::endl;
102 std::cerr << &bppMatrix << std::endl;
103 std::cerr << eigenRows << "," << eigenCols << std::endl;
104 std::cerr << eigenMatrix << std::endl;
105#endif
106}
107
108
109/*****************************************/
110/* copyEigenToBpp */
111
112template void copyEigenToBpp(const ExtendedFloatMatrixXd& eigenMatrix, std::vector<std::vector<double>>& bppMatrix);
113template void copyEigenToBpp(const ExtendedFloatMatrixXd& eigenMatrix, std::vector<std::vector<bpp::ExtendedFloat>>& bppMatrix);
114
115template void copyEigenToBpp(const Eigen::MatrixXd& eigenMatrix, std::vector<std::vector<double>>& bppMatrix);
116template void copyEigenToBpp(const Eigen::MatrixXd& eigenMatrix, std::vector<std::vector<bpp::ExtendedFloat>>& bppMatrix);
117
118void copyEigenToBpp (const MatrixLik& eigenMatrix, bpp::Matrix<double>& bppMatrix)
119{
120 const auto eigenRows = static_cast<std::size_t>(eigenMatrix.rows());
121 const auto eigenCols = static_cast<std::size_t>(eigenMatrix.cols());
122
123 bppMatrix.resize (eigenRows, eigenCols);
124 for (size_t i = 0; i < eigenRows; ++i)
125 {
126 for (size_t j = 0; j < eigenCols; ++j)
127 {
128 bppMatrix(i, j) = convert (eigenMatrix (static_cast<Eigen::Index>(i), static_cast<Eigen::Index>(j)));
129 }
130 }
131}
132
133template void copyEigenToBpp (const RowLik& eigenVector, Vdouble& bppVector);
134template void copyEigenToBpp (const VectorLik& eigenVector, Vdouble& bppVector);
135template void copyEigenToBpp (const RowLik& eigenVector, std::vector<ExtendedFloat>& bppVector);
136template void copyEigenToBpp (const VectorLik& eigenVector, std::vector<ExtendedFloat>& bppVector);
137
138
139/***************************************************/
140/* to string */
141
142
143std::string to_string (const NoDimension&)
144{
145 return "()";
146}
147
148std::string to_string (const MatrixDimension& dim)
149{
150 return "(" + std::to_string (dim.rows) + "," + std::to_string (dim.cols) + ")";
151}
152
153std::size_t hash (const MatrixDimension& dim)
154{
155 std::size_t seed = 0;
156 combineHash (seed, dim.rows);
157 combineHash (seed, dim.cols);
158 return seed;
159}
160
161namespace numeric
162{
164{
165 if (dim.rows != dim.cols)
166 {
167 throw Exception ("MatrixDimension is not square: " + std::to_string (dim.rows) + "x" +
168 std::to_string (dim.cols));
169 }
170}
171} // namespace numeric
172
173void checkRecreateWithoutDependencies (const std::type_info& contextNodeType, const NodeRefVec& deps)
174{
175 if (!deps.empty ())
176 {
177 throw Exception (prettyTypeName (contextNodeType) +
178 "recreate called with dependencies, but node does not have dependencies");
179 }
180}
181
182// Precompiled instantiations of numeric nodes
183template class ConstantZero<uint>;
184template class ConstantZero<double>;
185template class ConstantZero<char>;
186template class ConstantZero<std::string>;
187
188template class ConstantZero<Parameter>;
189template class ConstantZero<TransitionFunction>;
190
191template class ConstantZero<Eigen::VectorXd>;
192template class ConstantZero<Eigen::RowVectorXd>;
193template class ConstantZero<Eigen::MatrixXd>;
194
195template class ConstantZero<ExtendedFloatVectorXd>;
196template class ConstantZero<ExtendedFloatRowVectorXd>;
197template class ConstantZero<ExtendedFloatMatrixXd>;
198
199
200template class ConstantOne<uint>;
201template class ConstantOne<double>;
202template class ConstantOne<char>;
203template class ConstantOne<std::string>;
204
205template class ConstantOne<Parameter>;
206template class ConstantOne<TransitionFunction>;
207
208template class ConstantOne<Eigen::VectorXd>;
209template class ConstantOne<Eigen::RowVectorXd>;
210template class ConstantOne<Eigen::MatrixXd>;
211
212template class ConstantOne<ExtendedFloatVectorXd>;
213template class ConstantOne<ExtendedFloatRowVectorXd>;
214template class ConstantOne<ExtendedFloatMatrixXd>;
215
216
217template class Identity<double>;
218template class Identity<ExtendedFloatMatrixXd>;
219template class Identity<Eigen::MatrixXd>;
220
221
222template class NumericConstant<uint>;
223template class NumericConstant<double>;
224template class NumericConstant<size_t>;
225template class NumericConstant<std::string>;
226
227template class NumericConstant<ExtendedFloatVectorXd>;
228template class NumericConstant<ExtendedFloatRowVectorXd>;
229template class NumericConstant<ExtendedFloatMatrixXd>;
230
231NumericConstant<char> NodeX('X');
232
233template class NumericConstant<Eigen::VectorXd>;
234template class NumericConstant<Eigen::RowVectorXd>;
235template class NumericConstant<Eigen::MatrixXd>;
236
237template class NumericMutable<uint>;
238template class NumericMutable<double>;
239
240template class NumericMutable<ExtendedFloatVectorXd>;
241template class NumericMutable<ExtendedFloatRowVectorXd>;
242template class NumericMutable<ExtendedFloatMatrixXd>;
243
244template class NumericMutable<Eigen::VectorXd>;
245template class NumericMutable<Eigen::RowVectorXd>;
246template class NumericMutable<Eigen::MatrixXd>;
247
248template class Convert<double, double>;
249
250template class Convert<ExtendedFloatVectorXd, double>;
251template class Convert<ExtendedFloatVectorXd, ExtendedFloatVectorXd>;
252template class Convert<ExtendedFloatVectorXd, Eigen::VectorXd>;
253template class Convert<ExtendedFloatVectorXd, Eigen::VectorXi>;
254template class Convert<ExtendedFloatVectorXd, Transposed<ExtendedFloatRowVectorXd>>;
255template class Convert<ExtendedFloatVectorXd, Transposed<Eigen::RowVectorXd>>;
256
257template class Convert<Eigen::VectorXd, ExtendedFloatVectorXd>;
258
259template class Convert<ExtendedFloatRowVectorXd, double>;
260template class Convert<ExtendedFloatRowVectorXd, ExtendedFloatRowVectorXd>;
261template class Convert<ExtendedFloatRowVectorXd, Eigen::RowVectorXd>;
262template class Convert<ExtendedFloatRowVectorXd, Eigen::RowVectorXi>;
263template class Convert<ExtendedFloatRowVectorXd, Transposed<ExtendedFloatVectorXd>>;
264template class Convert<ExtendedFloatRowVectorXd, Transposed<Eigen::VectorXd>>;
265
266template class Convert<ExtendedFloatMatrixXd, double>;
267template class Convert<ExtendedFloatMatrixXd, ExtendedFloatMatrixXd>;
268template class Convert<ExtendedFloatMatrixXd, Eigen::MatrixXd>;
269template class Convert<ExtendedFloatMatrixXd, Transposed<ExtendedFloatMatrixXd>>;
270template class Convert<ExtendedFloatMatrixXd, Transposed<Eigen::MatrixXd>>;
271
272template class Convert<Eigen::VectorXd, double>;
273template class Convert<Eigen::VectorXd, Eigen::VectorXd>;
274template class Convert<Eigen::VectorXd, Eigen::VectorXi>;
275template class Convert<Eigen::VectorXd, Transposed<Eigen::RowVectorXd>>;
276
277template class Convert<Eigen::RowVectorXd, double>;
278template class Convert<Eigen::RowVectorXd, Eigen::RowVectorXd>;
279template class Convert<Eigen::RowVectorXd, Eigen::RowVectorXi>;
280template class Convert<Eigen::RowVectorXd, Transposed<Eigen::VectorXd>>;
281
282template class Convert<Eigen::MatrixXd, double>;
283template class Convert<Eigen::MatrixXd, Eigen::MatrixXd>;
284template class Convert<Eigen::MatrixXd, Transposed<Eigen::MatrixXd>>;
285} // namespace bpp
virtual const MatType & float_part() const
Eigen::Index cols() const
Eigen::Index rows() const
virtual const ExtType & exponent_part() const
void resize(Eigen::Index rows, Eigen::Index cols)
virtual size_t getNumberOfColumns() const=0
virtual void resize(size_t nRows, size_t nCols)=0
virtual size_t getNumberOfRows() const=0
void checkDimensionIsSquare(const MatrixDimension &dim)
Defines the basic types of data flow nodes.
std::size_t hash(const MatrixDimension &dim)
std::vector< double > Vdouble
NumericConstant< char > NodeX('X')
std::string to_string(const NoDimension &)
template void copyEigenToBpp(const ExtendedFloatMatrixXd &eigenMatrix, std::vector< std::vector< double > > &bppMatrix)
void checkRecreateWithoutDependencies(const std::type_info &contextNodeType, const NodeRefVec &deps)
std::vector< NodeRef > NodeRefVec
Alias for a dependency vector (of NodeRef).
Definition: DataFlow.h:81
std::string prettyTypeName(const std::type_info &ti)
Debug: return a readable name for a C++ type descriptor (from typeid operator).
Definition: DataFlow.cpp:43
template void copyBppToEigen(const std::vector< ExtendedFloat > &bppVector, Eigen::RowVectorXd &eigenVector)
double convert(const bpp::ExtendedFloat &ef)
std::string to_string(const MatrixDimension &dim)
void combineHash(std::size_t &seed, const T &t)
Combine hashable value to a hash, from Boost library.
Definition: DataFlow.h:33
Basic matrix dimension type.
Empty type representing no dimensions.