12using namespace numeric;
18void ForwardHmmLikelihood_DF::compute()
20 const auto& hmmEq = accessValueConstCast<Eigen::VectorXd>(*this->
dependency(0));
22 const auto& hmmTrans = accessValueConstCast<Eigen::MatrixXd>(*this->
dependency(1));
23 const auto& hmmEmis = accessValueConstCast<MatrixLik>(*this->
dependency(2));
25 auto& condLik = dynamic_pointer_cast<CondLikelihood>(
condLik_)->accessValueMutable();
27 auto nbSites = hmmEmis.cols();
28 auto nbStates = hmmEmis.rows();
38 tscales[0] = tmp.
sum();
40 for (
auto s = 0; s < nbStates; s++)
42 condLik(s, 0) =
convert(tmp(s) / tscales[0]);
46 for (
auto i = 1; i < nbSites; i++)
48 parCondLik_[(size_t)i] = hmmTrans.transpose() * condLik.col(i - 1);
51 tscales[(size_t)i] = tmp.
sum();
54 for (
auto s = 0; s < nbStates; s++)
56 condLik(s, i) =
convert(tmp(s) / tscales[(
size_t)i]);
88 this->shared_from_this(),
101 const auto& hmmEq = accessValueConstCast<Eigen::VectorXd>(*this->
dependency(0));
103 const auto& hmmTrans = accessValueConstCast<Eigen::MatrixXd>(*this->
dependency(1));
104 const auto& hmmEmis = accessValueConstCast<MatrixLik>(*this->
dependency(2));
107 auto forwardNode = dynamic_pointer_cast<ForwardHmmLikelihood_DF>(this->
dependency(3));
109 const auto& condLik = forwardNode->getForwardCondLikelihood()->targetValue();
111 const auto& parCondLik = forwardNode->getParCondLik();
113 const auto& scales = forwardNode->targetValue();
115 const auto& dHmmEq = accessValueConstCast<Eigen::VectorXd>(*this->
dependency(4));
117 const auto& dHmmTrans = accessValueConstCast<Eigen::MatrixXd>(*this->
dependency(5));
119 const auto& dHmmEmis = accessValueConstCast<MatrixLik>(*this->
dependency(6));
121 auto nbSites = hmmEmis.cols();
122 const int nbStates = (int)hmmEmis.rows();
126 auto& dCondLik = dynamic_pointer_cast<CondLikelihood>(
dCondLik_)->accessValueMutable();
131 dParCondLik_[0] = dHmmTrans.transpose() * hmmEq + hmmTrans.transpose() * dHmmEq;
134 +
cwise(dHmmEmis.col(0)) *
cwise(parCondLik[0]));
135 tdScales[0] = dtmp.
sum();
139 for (
auto s = 0; s < nbStates; s++)
141 dCondLik(s, 0) =
convert((dtmp(s) - condLik(s, 0) * tdScales[0]) / scales(0));
145 for (
auto i = 1; i < nbSites; i++)
147 dParCondLik_[(size_t)i] = dHmmTrans.transpose() * condLik.col(i - 1) + hmmTrans.transpose() * dCondLik.col(i - 1);
150 tdScales[(size_t)i] = dtmp.
sum();
152 for (
auto s = 0; s < nbStates; s++)
154 dCondLik(s, i) =
convert((dtmp(s) - condLik(s, i) * tdScales[(
size_t)i]) / scales(i));
201 this->shared_from_this(),
218 const auto& hmmEq = accessValueConstCast<Eigen::VectorXd>(*this->
dependency(0));
220 const auto& hmmTrans = accessValueConstCast<Eigen::MatrixXd>(*this->
dependency(1));
221 const auto& hmmEmis = accessValueConstCast<MatrixLik>(*this->
dependency(2));
224 auto forwardNode = dynamic_pointer_cast<ForwardHmmLikelihood_DF>(this->
dependency(3));
226 const auto& condLik = forwardNode->getForwardCondLikelihood()->targetValue();
228 const auto& parCondLik = forwardNode->getParCondLik();
230 const auto& scales = forwardNode->targetValue();
233 const auto& dHmmEq = accessValueConstCast<Eigen::VectorXd>(*this->
dependency(4));
235 const auto& dHmmTrans = accessValueConstCast<Eigen::MatrixXd>(*this->
dependency(5));
237 const auto& dHmmEmis = accessValueConstCast<MatrixLik>(*this->
dependency(6));
240 auto forwardDNode = dynamic_pointer_cast<ForwardHmmDLikelihood_DF>(this->
dependency(7));
242 const auto& dCondLik = forwardDNode->getForwardDCondLikelihood()->targetValue();
244 const auto& parDCondLik = forwardDNode->getParDCondLik();
246 const auto& dScales = forwardDNode->targetValue();
249 const auto& d2HmmEq = accessValueConstCast<Eigen::VectorXd>(*this->
dependency(8));
251 const auto& d2HmmTrans = accessValueConstCast<Eigen::MatrixXd>(*this->
dependency(9));
253 const auto& d2HmmEmis = accessValueConstCast<MatrixLik>(*this->
dependency(10));
258 auto nbSites = hmmEmis.cols();
259 const int nbStates =
static_cast<int>(hmmEmis.rows());
261 VDataLik td2Scales(
static_cast<size_t>(nbSites));
263 Eigen::VectorXd d2CondLik(
static_cast<int>(hmmEmis.rows()));
265 Eigen::VectorXd d2ParCondLik;
269 d2ParCondLik = d2HmmTrans.transpose() * hmmEq + 2 * dHmmTrans.transpose() * dHmmEq + hmmTrans.transpose() * d2HmmEq;
272 + 2 *
cwise(parDCondLik[0]) *
cwise(dHmmEmis.col(0))
273 +
cwise(parCondLik[0]) *
cwise(d2HmmEmis.col(0));
275 td2Scales[0] = d2tmp.
sum();
279 for (
auto s = 0; s < nbStates; s++)
281 d2CondLik(s, 0) =
convert((d2tmp(s) - 2 * dCondLik(s, 0) * dScales(0) - condLik(s, 0) * td2Scales[0]) / scales(0));
285 for (
auto i = 1; i < nbSites; i++)
287 d2ParCondLik = d2HmmTrans.transpose() * condLik.col(i)
288 + 2 * dHmmTrans.transpose() * dCondLik.col(i) + hmmTrans.transpose() * d2CondLik;
291 + 2 *
cwise(parDCondLik[(
size_t)i]) *
cwise(dHmmEmis.col(i))
292 +
cwise(parCondLik[(
size_t)i]) *
cwise(d2HmmEmis.col(i));
294 td2Scales[(size_t)i] = d2tmp.
sum();
296 for (
auto s = 0; s < nbStates; s++)
298 d2CondLik(s, i) =
convert((d2tmp(s) - 2 * dCondLik(s, i) * dScales(i) - condLik(s, i) * td2Scales[(
size_t)i]) / scales(i));
310 const auto& scales = accessValueConstCast<RowLik>(*this->
dependency(0));
312 const auto& hmmTrans = accessValueConstCast<Eigen::MatrixXd>(*this->
dependency(1));
314 const auto& hmmEmis = accessValueConstCast<MatrixLik>(*this->
dependency(2));
316 auto nbSites = hmmEmis.cols();
317 auto nbStates = hmmEmis.rows();
319 std::vector<Eigen::VectorXd> tScales((
size_t)nbSites);
324 tScales[(size_t)(nbSites - 1)] = Eigen::VectorXd::Constant(nbStates, 1);
327 for (
auto i = nbSites - 1; i > 0; i--)
329 tScales[(size_t)(i - 1)].resize(nbStates);
333 auto tmp2 = hmmTrans * tmp;
335 for (
auto s = 0; s < nbStates; s++)
337 tScales[(size_t)(i - 1)](s) =
convert(tmp2(s) / scales(i));
void compute() override
Computation implementation.
static std::shared_ptr< Self > create(Context &c, const Dimension< T > &dim)
Build a new ConstantOne node of the given dimension.
Context for dataflow node construction.
const ExtendedFloat & sum() const
static ValueRef< RowLik > create(Context &c, NodeRefVec &&deps, const Dimension< Eigen::MatrixXd > &dim)
void compute() override
Computation implementation.
Dimension< Eigen::MatrixXd > targetDimension_
Dimension of the data : states X sites.
std::vector< Eigen::VectorXd > dParCondLik_
static ValueRef< RowLik > create(Context &c, NodeRefVec &&deps, const Dimension< Eigen::MatrixXd > &dim)
void compute() override
Computation implementation.
NodeRef derive(Context &c, const Node_DF &node) final
Returns a node computing d(this_node_expression)/d(node_expression).
ValueRef< Eigen::MatrixXd > dCondLik_
derivatives of the conditional forward likelihoods : Will be used by likelihoods computation of 2nd o...
Dimension< Eigen::MatrixXd > targetDimension_
std::vector< Eigen::VectorXd > parCondLik_
ValueRef< Eigen::MatrixXd > condLik_
NodeRef derive(Context &c, const Node_DF &node) final
Returns a node computing d(this_node_expression)/d(node_expression).
Base dataflow Node class.
const NodeRef & dependency(std::size_t i) const noexcept
RowLik & accessValueMutable() noexcept
Defines the basic types of data flow nodes.
std::vector< DataLik > VDataLik
template void copyBppToEigen(const std::vector< ExtendedFloat > &bppVector, Eigen::RowVectorXd &eigenVector)
double convert(const bpp::ExtendedFloat &ef)
std::shared_ptr< Node_DF > NodeRef