52 const std::string& prefix,
56 hiddenAlphabet_(hiddenAlphabet),
57 transitionMatrix_(transitionMatrix),
58 emissionProbabilities_(emissionProbabilities),
67 if (!hiddenAlphabet)
throw Exception(
"LowMemoryRescaledHmmLikelihood: null pointer passed for HmmStateAlphabet.");
68 if (!transitionMatrix)
throw Exception(
"LowMemoryRescaledHmmLikelihood: null pointer passed for HmmTransitionMatrix.");
69 if (!emissionProbabilities)
throw Exception(
"LowMemoryRescaledHmmLikelihood: null pointer passed for HmmEmissionProbabilities.");
70 if (!hiddenAlphabet_->worksWith(transitionMatrix->getHmmStateAlphabet()))
71 throw Exception(
"LowMemoryRescaledHmmLikelihood: HmmTransitionMatrix and HmmEmissionProbabilities should point toward the same HmmStateAlphabet object.");
72 if (!hiddenAlphabet_->worksWith(emissionProbabilities->getHmmStateAlphabet()))
73 throw Exception(
"LowMemoryRescaledHmmLikelihood: HmmTransitionMatrix and HmmEmissionProbabilities should point toward the same HmmStateAlphabet object.");
74 nbStates_ = hiddenAlphabet_->getNumberOfStates();
75 nbSites_ = emissionProbabilities_->getNumberOfPositions();
78 addParameters_(hiddenAlphabet_->getParameters());
79 addParameters_(transitionMatrix_->getParameters());
80 addParameters_(emissionProbabilities_->getParameters());
83 likelihood1_.resize(nbStates_);
84 likelihood2_.resize(nbStates_);
92 bool alphabetChanged = hiddenAlphabet_->matchParametersValues(pl);
93 bool transitionsChanged = transitionMatrix_->matchParametersValues(pl);
94 bool emissionChanged = emissionProbabilities_->matchParametersValues(pl);
98 if (alphabetChanged && !transitionsChanged) transitionMatrix_->setParametersValues(transitionMatrix_->getParameters());
99 if (alphabetChanged && !emissionChanged) emissionProbabilities_->setParametersValues(emissionProbabilities_->getParameters());
109 vector<double> tmp(nbStates_);
110 vector<double> lScales(min(maxSize_, nbSites_));
111 vector<double> trans(nbStates_ * nbStates_);
114 for (
size_t i = 0; i < nbStates_; i++)
116 size_t ii = i * nbStates_;
117 for (
size_t j = 0; j < nbStates_; j++)
119 trans[ii + j] = transitionMatrix_->Pij(j, i);
125 const vector<double>* emissions = &(*emissionProbabilities_)(0);
126 for (
size_t j = 0; j < nbStates_; j++)
128 size_t jj = j * nbStates_;
130 for (
size_t k = 0; k < nbStates_; k++)
132 x += trans[k + jj] * transitionMatrix_->getEquilibriumFrequencies()[k];
134 tmp[j] = (*emissions)[j] * x;
137 for (
size_t j = 0; j < nbStates_; j++)
139 likelihood1_[j] = tmp[j] / scale;
141 lScales[0] = log(scale);
143 vector<double>* previousLikelihood = &likelihood2_, * currentLikelihood = &likelihood1_, * tmpLikelihood;
146 size_t nextBrkPt = nbSites_;
147 vector<size_t>::const_iterator bpIt = breakPoints_.begin();
148 if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
154 for (
size_t i = 1; i < nbSites_; i++)
157 tmpLikelihood = previousLikelihood;
158 previousLikelihood = currentLikelihood;
159 currentLikelihood = tmpLikelihood;
162 emissions = &(*emissionProbabilities_)(i);
165 for (
size_t j = 0; j < nbStates_; j++)
167 size_t jj = j * nbStates_;
169 for (
size_t k = 0; k < nbStates_; k++)
171 a = trans[jj + k] * (*previousLikelihood)[k];
179 tmp[j] = (*emissions)[j] * x;
190 for (
size_t j = 0; j < nbStates_; j++)
192 size_t jj = j * nbStates_;
194 for (
size_t k = 0; k < nbStates_; k++)
196 a = trans[jj + k] * transitionMatrix_->getEquilibriumFrequencies()[k];
204 tmp[j] = (*emissions)[j] * x;
213 if (bpIt != breakPoints_.end()) nextBrkPt = *bpIt;
214 else nextBrkPt = nbSites_;
217 for (
size_t j = 0; j < nbStates_; j++)
219 if (scale > 0) (*currentLikelihood)[j] = tmp[j] / scale;
220 else (*currentLikelihood)[j] = 0;
222 lScales[i - offset] = log(scale);
224 if (i - offset == maxSize_ - 1)
227 double partialLogLik = 0;
228 sort(lScales.begin(), lScales.end(), cmp);
229 for (
size_t j = 0; j < maxSize_; ++j)
231 partialLogLik += lScales[j];
233 logLik_ += partialLogLik;
237 sort(lScales.begin(), lScales.begin() +
static_cast<ptrdiff_t
>(nbSites_ - offset), cmp);
238 double partialLogLik = 0;
239 for (
size_t i = 0; i < nbSites_ - offset; ++i)
241 partialLogLik += lScales[i];
243 logLik_ += partialLogLik;
This class allows to perform a correspondence analysis.
A partial implementation of the Parametrizable interface.
Interface for computing emission probabilities in a Hidden Markov Model.
The parameter list object.
LowMemoryRescaledHmmLikelihood(HmmStateAlphabet *hiddenAlphabet, HmmTransitionMatrix *transitionMatrix, HmmEmissionProbabilities *emissionProbabilities, const std::string &prefix, size_t maxSize=1000000)
Build a new LowMemoryRescaledHmmLikelihood object.
void fireParameterChanged(const ParameterList &pl)
Notify the class when one or several parameters have changed.
Describe the transition probabilities between hidden states of a Hidden Markov Model.