Katzlab dd76ab1d12 Added PTL2 Scripts
These are PTL2 files from Auden 2/9
2023-02-14 11:20:52 -05:00

135 lines
3.3 KiB
C++

// cProbModel.cpp: implementation of the cProbModel class.
//
//////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "cProbModelOptimizer.h"
#include <cmath>
using namespace std;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
cProbModelOptimizer::cProbModelOptimizer(const cOccuranceData& OccuranceData,
const cProbs& BackgroundProbs) :
_d(BackgroundProbs.size()), _U(BackgroundProbs), _S(OccuranceData)
{
if ( BackgroundProbs.size() != OccuranceData.alphabetSize() ) {
throw("cProbModelOptimizer::cProbModelOptimizer : size mismatch");
}
}
cProbModelOptimizer::~cProbModelOptimizer()
{
}
double cProbModelOptimizer::Nabt(size_t i, size_t j, size_t Which_t) const
{
cRow Expt = _d.Exp(_S.Time(Which_t));
double sum = 0.;
for ( size_t k = 0 ; k < _U.size() ; ++k ) {
sum += Expt[k]*_U[k][i]*_U[k][j];
}
return sum;
}
double cProbModelOptimizer::NonConstLL(void) const
{
double sum = 0.;
for ( size_t Which_t = 0 ; Which_t < _S.size() ; ++Which_t ) {
const cSquareMatrix CurrentMat(_S.Matrix(Which_t));
for ( size_t i = 0 ; i < _U.size() ; ++i ) {
for ( size_t j = 0 ; j < _U.size() ; ++j ) {
sum += CurrentMat[i][j]*log(Nabt(i,j,Which_t));
}
}
}
return sum;
}
double cProbModelOptimizer::DerivUxy(size_t i, size_t j) const
{
double sum = 0.;
// double dx = _d.Get(i);
for ( size_t Which_t = 0 ; Which_t < _S.size() ; ++Which_t ) {
// double ExpVal = _S[Which_t].Time()*dx;
//MN double etdx = exp(ExpVal);
const cSquareMatrix CurrentMat(_S.Matrix(Which_t));
for ( size_t k = 0 ; k < _U.size() ; ++k ) {
sum += _U[i][k]*(CurrentMat[k][j]+CurrentMat[j][k])
/Nabt(i,j,Which_t);
}
}
return sum;
}
double cProbModelOptimizer::DerivRotxy(size_t i, size_t j) const
{
double sum = 0.;
for ( size_t k = 0 ; k < _U.size() ; ++k ) {
sum += DerivUxy(i,k);
sum -= DerivUxy(j,k);
}
return sum;
}
double cProbModelOptimizer::DerivEigen(size_t i) const
{
double sum = 0.;
for ( size_t Which_t = 0 ; Which_t < _S.size() ; ++Which_t ) {
const cSquareMatrix CurrentMat(_S.Matrix(Which_t));
double t = _S.Time(Which_t);
double etdx = exp(t*_d.Get(i));
for ( size_t j = 0 ; j < _U.size() ; ++j ) {
for ( size_t k = 0 ; k < _U.size() ; ++k ) {
sum += CurrentMat[j][k]*t*etdx*_U[i][j]*_U[i][k]
/Nabt(j,k,Which_t);
}
}
}
return sum;
}
double cProbModelOptimizer::AvgDerivAllEigen(void) const
{
double sum = 0.;
for ( size_t i = 1 /* first eigenvalue is constant */ ; i < _d.size() ; ++i ) {
sum += DerivEigen(i);
}
return sum/(_d.size()-1);
}
void cProbModelOptimizer::RotateAll(double Delta)
{
for ( size_t i = 1 ; i < _U.size()-1 ; ++i ) {
for ( size_t j = i+1 ; j < _U.size() ; ++j ) {
_U.Rotate(i,j,Delta*DerivRotxy(i,j));
}
}
}
void cProbModelOptimizer::AdjustAllEigen(double Delta)
{
double AvgGrad = AvgDerivAllEigen();
double NeedToAdd = 0;
for ( size_t i = 1 ; i < _d.size()-1 ; ++i ) {
double NewAdd = DerivEigen(i)-AvgGrad+NeedToAdd;
_d.IncreaseDecrease(i,i+1, NewAdd);
NeedToAdd = NewAdd;
}
}
const cOrthonormalMatrix& cProbModelOptimizer::GetU(void) const
{
return _U;
}
const cEigenVals& cProbModelOptimizer::Getd(void) const
{
return _d;
}