/*
Copyright 2009-2012 Andreas Biegert, Christof Angermueller
This file is part of the CS-BLAST package.
The CS-BLAST package is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
The CS-BLAST package is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#ifndef CS_CONTEXT_LIB_PSEUDOCOUNTS_INL_H_
#define CS_CONTEXT_LIB_PSEUDOCOUNTS_INL_H_
#include "library_pseudocounts.h"
namespace cs {
template
LibraryPseudocounts::LibraryPseudocounts(const ContextLibrary& lib,
double weight_center,
double weight_decay)
: lib_(lib), emission_(lib.wlen(), weight_center, weight_decay) {}
template
void LibraryPseudocounts::AddToSequence(const Sequence& seq, Profile& p) const {
assert_eq(seq.length(), p.length());
LOG(INFO) << "Adding library pseudocounts to sequence ...";
Matrix pp(seq.length(), lib_.size(), 0.0); // posterior probabilities
int len = static_cast(seq.length());
// Calculate and add pseudocounts for each sequence window X_i separately
#pragma omp parallel for schedule(static)
for (int i = 0; i < len; ++i) {
double* ppi = &pp[i][0];
// Calculate posterior probability of state k given sequence window around 'i'
CalculatePosteriorProbs(lib_, emission_, seq, i, ppi);
// Calculate pseudocount vector P(a|X_i)
double* pc = p[i];
for (size_t a = 0; a < Abc::kSize; ++a) pc[a] = 0.0;
for (size_t k = 0; k < lib_.size(); ++k) {
for(size_t a = 0; a < Abc::kSize; ++a)
pc[a] += ppi[k] * lib_[k].pc[a];
}
Normalize(&pc[0], Abc::kSize);
}
}
template
void LibraryPseudocounts::AddToProfile(const CountProfile& cp, Profile& p) const {
assert_eq(cp.counts.length(), p.length());
LOG(INFO) << "Adding library pseudocounts to profile ...";
Matrix pp(cp.counts.length(), lib_.size(), 0.0); // posterior probs
int len = static_cast(cp.length());
// Calculate and add pseudocounts for each sequence window X_i separately
#pragma omp parallel for schedule(static)
for (int i = 0; i < len; ++i) {
double* ppi = &pp[i][0];
// Calculate posterior probability of state k given sequence window around 'i'
CalculatePosteriorProbs(lib_, emission_, cp, i, ppi);
// Calculate pseudocount vector P(a|X_i)
double* pc = p[i];
for (size_t a = 0; a < Abc::kSize; ++a) pc[a] = 0.0;
for (size_t k = 0; k < lib_.size(); ++k) {
for(size_t a = 0; a < Abc::kSize; ++a)
pc[a] += ppi[k] * lib_[k].pc[a];
}
Normalize(&pc[0], Abc::kSize);
}
}
} // namespace cs
#endif // CS_CONTEXT_LIB_PSEUDOCOUNTS_INL_H_