1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
#ifndef chainer_h
#define chainer_h
#include "hsp.h"
#include "seq.h"
#include <list>
const float BAD_SCORE = -9e9f;
struct TargetHit
{
unsigned TargetIndex;
unsigned TargetLo;
unsigned TargetHi;
int QueryFrame;
float RawScore; // SOMETIMES USED FOR BIT SCORE!!!
// unsigned TargetLength;
void LogMe() const
{
Log("lo %u, hi %u, frame %d, score %.1f\n",
TargetLo, TargetHi, QueryFrame, RawScore);
}
};
struct ChainData
{
unsigned LastHSPIndex;
unsigned Ahi;
unsigned Bhi;
float Score;
};
class Chainer
{
public:
HSPData **m_HSPs; // memory owned elsewhere
unsigned m_HSPCount;
unsigned m_MaxHSPCount;
BPData *m_BPs;
unsigned *m_PrevHSPIndexes; // Predecessor in chain
float *m_HSPIndexToChainScore;
list<unsigned> m_Chains; // Live HSP indexes
public:
Chainer();
~Chainer();
void Reset();
void Clear(bool ctor = false);
float Chain(HSPData **HSPs, unsigned HSPCount, HSPData **OptChain,
unsigned &OptChainLength);
bool ResolveOverlaps(const SeqData &SA, const SeqData &SB, double MinScore,
const float * const *SubstMx, HSPData **InHSPs, unsigned InHSPCount,
HSPData **OutHSPs, unsigned &OutHSPCount);
void ResolveOverlap(HSPData &HSP1, HSPData &HSP2);
float ChainBrute(HSPData **HSPs, unsigned HSPCount, HSPData **OptChain,
unsigned &OptChainLength);
void LogMe() const;
void LogHSPs(HSPData **HSPs, unsigned HSPCount) const;
void LogBPs() const;
static bool IsValidChain(HSPData **HSPs, unsigned HSPCount);
static void AssertValidChain(HSPData **HSPs, unsigned HSPCount);
static void LogChain(HSPData **HSPs, unsigned HSPCount);
static void LogChain2(HSPData **HSPs, unsigned HSPCount);
static float GetChainScore(HSPData **HSPs, unsigned HSPCount);
private:
void AllocHSPCount(unsigned MaxHSPCount);
void SetBPs();
void SortBPs();
unsigned FindBestChainLT(unsigned Ahi, unsigned Bhi);
};
#endif // chainer_h
|