1 //uchime by Robert C. Edgar http://drive5.com/uchime This code is donated to the public domain.
\r
10 #include "myutils.h"
\r
12 const int OPT_LOG = 0x01;
\r
13 const int OPT_EXP = 0x02;
\r
14 const int OPT_ZERO_BASED = 0x04;
\r
15 const float MINUS_INFINITY = -9e9f;
\r
16 const float UNINIT = -8e8f;
\r
20 template<class T> const char *TypeToStr(T t)
\r
22 Die("Unspecialised TypeToStr() called");
\r
26 template<> inline const char *TypeToStr<unsigned short>(unsigned short f)
\r
30 sprintf(s, "%12u", f);
\r
34 template<> inline const char *TypeToStr<short>(short f)
\r
38 sprintf(s, "%12d", f);
\r
42 template<> inline const char *TypeToStr<int>(int f)
\r
46 sprintf(s, "%5d", f);
\r
50 template<> inline const char *TypeToStr<float>(float f)
\r
55 sprintf(s, "%12.12s", "?");
\r
56 else if (f < MINUS_INFINITY/2)
\r
57 sprintf(s, "%12.12s", "*");
\r
59 sprintf(s, "%12.12s", ".");
\r
60 else if (f >= -1e5 && f <= 1e5)
\r
61 sprintf(s, "%12.5f", f);
\r
63 sprintf(s, "%12.4g", f);
\r
67 template<> inline const char *TypeToStr<double>(double f)
\r
72 sprintf(s, "%12.12s", "*");
\r
74 sprintf(s, "%12.12s", ".");
\r
75 else if (f >= -1e-5 && f <= 1e5)
\r
76 sprintf(s, "%12.5f", f);
\r
78 sprintf(s, "%12.4g", f);
\r
82 static inline const char *FloatToStr(float f, string &s)
\r
84 s = TypeToStr<float>(f);
\r
88 template<> inline const char *TypeToStr<char>(char c)
\r
95 template<> inline const char *TypeToStr<byte>(byte c)
\r
102 template<> inline const char *TypeToStr<bool>(bool tof)
\r
105 s[0] = tof ? 'T' : 'F';
\r
114 MxBase(const MxBase &rhs);
\r
115 MxBase &operator=(const MxBase &rhs);
\r
121 unsigned m_RowCount;
\r
122 unsigned m_ColCount;
\r
123 unsigned m_AllocatedRowCount;
\r
124 unsigned m_AllocatedColCount;
\r
125 const SeqDB *m_SeqDB;
\r
128 const SeqData *m_SA;
\r
129 const SeqData *m_SB;
\r
131 static list<MxBase *> *m_Matrices;
\r
132 //static MxBase *Get(const string &Name);
\r
133 //static float **Getf(const string &Name);
\r
134 //static double **Getd(const string &Name);
\r
135 //static char **Getc(const string &Name);
\r
137 static unsigned m_AllocCount;
\r
138 static unsigned m_ZeroAllocCount;
\r
139 static unsigned m_GrowAllocCount;
\r
140 static double m_TotalBytes;
\r
141 static double m_MaxBytes;
\r
143 static void OnCtor(MxBase *Mx);
\r
144 static void OnDtor(MxBase *Mx);
\r
148 m_AllocatedRowCount = 0;
\r
149 m_AllocatedColCount = 0;
\r
162 virtual unsigned GetTypeSize() const = 0;
\r
163 virtual unsigned GetBytes() const = 0;
\r
168 m_AllocatedRowCount = 0;
\r
169 m_AllocatedColCount = 0;
\r
180 return m_RowCount == 0;
\r
183 virtual void AllocData(unsigned RowCount, unsigned ColCount) = 0;
\r
184 virtual void FreeData() = 0;
\r
185 virtual const char *GetAsStr(unsigned i, unsigned j) const = 0;
\r
187 void SetAlpha(const char *Alpha)
\r
189 unsigned n = sizeof(m_Alpha);
\r
190 strncpy(m_Alpha, Alpha, n);
\r
194 void Alloc(const char *Name, unsigned RowCount, unsigned ColCount,
\r
195 const SeqDB *DB, unsigned IdA, unsigned IdB,
\r
196 const SeqData *SA, const SeqData *SB);
\r
198 void Alloc(const char *Name, unsigned RowCount, unsigned ColCount,
\r
199 const SeqDB *DB = 0, unsigned IdA = UINT_MAX, unsigned IdB = UINT_MAX);
\r
201 void Alloc(const char *Name, unsigned RowCount, unsigned ColCount,
\r
202 const SeqData *SA, const SeqData *SB);
\r
204 static void LogAll()
\r
207 if (m_Matrices == 0)
\r
209 Log("MxBase::m_Matrices=0\n");
\r
213 Log("AllRows AllCols Sz MB Name\n");
\r
214 Log("------- ------- ---- -------- ----\n");
\r
215 double TotalMB = 0;
\r
216 for (list<MxBase *>::const_iterator p = m_Matrices->begin();
\r
217 p != m_Matrices->end(); ++p)
\r
219 const MxBase *Mx = *p;
\r
222 //if (Mx->m_RowCount != 0 || ShowEmpty)
\r
223 // Mx->LogMe(WithData);
\r
224 unsigned ar = Mx->m_AllocatedRowCount;
\r
227 unsigned ac = Mx->m_AllocatedColCount;
\r
228 unsigned sz = Mx->GetTypeSize();
\r
229 double MB = (double) ar*(double) ac*(double) sz/1e6;
\r
231 Log("%7u %7u %4u %8.2f %s\n", ar, ac, sz, MB, Mx->m_Name);
\r
233 Log(" --------\n");
\r
234 Log("%7.7s %7.7s %4.4s %8.2f\n", "", "", "", TotalMB);
\r
237 void LogMe(bool WithData = true, int Opts = 0) const;
\r
238 static void LogCounts();
\r
241 template<class T> struct Mx : public MxBase
\r
243 // Disable unimplemented stuff
\r
246 Mx &operator=(Mx &rhs);
\r
247 // const Mx &operator=(const Mx &rhs) const;
\r
262 virtual void AllocData(unsigned RowCount, unsigned ColCount)
\r
264 if (opt_logmemgrows)
\r
265 Log("MxBase::AllocData(%u,%u) %s bytes, Name=%s\n",
\r
266 RowCount, ColCount, IntToStr(GetBytes()), m_Name);
\r
267 // m_Data = myalloc<T *>(RowCount);
\r
268 m_Data = MYALLOC(T *, RowCount, Mx);
\r
269 for (unsigned i = 0; i < RowCount; ++i)
\r
270 // m_Data[i] = myalloc<T>(ColCount);
\r
271 m_Data[i] = MYALLOC(T, ColCount, Mx);
\r
272 AddBytes("Mx_AllocData", RowCount*sizeof(T *) + RowCount*ColCount*sizeof(T));
\r
274 m_AllocatedRowCount = RowCount;
\r
275 m_AllocatedColCount = ColCount;
\r
278 virtual void FreeData()
\r
280 for (unsigned i = 0; i < m_AllocatedRowCount; ++i)
\r
281 MYFREE(m_Data[i], m_AllocatedColCount, Mx);
\r
282 MYFREE(m_Data, m_AllocatedRowCount, Mx);
\r
283 SubBytes("Mx_AllocData",
\r
284 m_AllocatedRowCount*sizeof(T *) + m_AllocatedRowCount*m_AllocatedColCount*sizeof(T));
\r
289 m_AllocatedRowCount = 0;
\r
290 m_AllocatedColCount = 0;
\r
295 return (T **) m_Data;
\r
298 T Get(unsigned i, unsigned j) const
\r
300 assert(i < m_RowCount);
\r
301 assert(j < m_ColCount);
\r
302 return m_Data[i][j];
\r
305 void Put(unsigned i, unsigned j, T x) const
\r
307 assert(i < m_RowCount);
\r
308 assert(j < m_ColCount);
\r
312 T GetOffDiagAvgs(vector<T> &Avgs) const
\r
314 if (m_RowCount != m_ColCount)
\r
315 Die("GetOffDiagAvgs, not symmetrical");
\r
318 for (unsigned i = 0; i < m_RowCount; ++i)
\r
321 for (unsigned j = 0; j < m_ColCount; ++j)
\r
325 Sum += m_Data[i][j];
\r
327 T Avg = Sum/(m_RowCount-1);
\r
329 Avgs.push_back(Avg);
\r
331 return m_RowCount == 0 ? T(0) : Total/m_RowCount;
\r
334 unsigned GetTypeSize() const
\r
339 virtual unsigned GetBytes() const
\r
341 return m_AllocatedRowCount*m_AllocatedColCount*GetTypeSize() +
\r
342 m_AllocatedRowCount*sizeof(T *);
\r
345 const char *GetAsStr(unsigned i, unsigned j) const
\r
347 return TypeToStr<T>(Get(i, j));
\r
350 const T *const *const GetData() const
\r
352 return (const T *const *) m_Data;
\r
355 void Copy(const Mx<T> &rhs)
\r
357 Alloc("Copy", rhs.m_RowCount, rhs.m_ColCount, rhs.m_SeqDB, rhs.m_IdA, rhs.m_IdB);
\r
358 const T * const *Data = rhs.GetData();
\r
359 for (unsigned i = 0; i < m_RowCount; ++i)
\r
360 for (unsigned j = 0; j < m_ColCount; ++j)
\r
361 m_Data[i][j] = Data[i][j];
\r
366 for (unsigned i = 0; i < m_RowCount; ++i)
\r
367 for (unsigned j = 0; j < m_ColCount; ++j)
\r
371 bool Eq(const Mx &rhs, bool Bwd = false) const
\r
373 if (rhs.m_ColCount != m_ColCount)
\r
375 if (rhs.m_RowCount != m_RowCount)
\r
377 const T * const*d = rhs.GetData();
\r
378 int i1 = Bwd ? m_RowCount : 0;
\r
379 int j1 = Bwd ? m_ColCount : 0;
\r
380 int i2 = Bwd ? -1 : m_RowCount;
\r
381 int j2 = Bwd ? -1 : m_ColCount;
\r
382 for (int i = i1; i != i2; Bwd ? --i : ++i)
\r
383 for (int j = j1; j != j2; Bwd ? --j : ++j)
\r
385 float x = m_Data[i][j];
\r
387 if (x < -1e10 && y < -1e10)
\r
391 Warning("%s[%d][%d] = %g, %s = %g",
\r
392 m_Name, i, j, x, rhs.m_Name, y);
\r
399 bool EqMask(const Mx &rhs, const Mx<bool> &Mask) const
\r
401 if (rhs.m_ColCount != m_ColCount)
\r
403 if (rhs.m_RowCount != m_RowCount)
\r
406 if (Mask.m_ColCount != m_ColCount)
\r
408 if (Mask.m_RowCount != m_RowCount)
\r
411 const T * const*d = rhs.GetData();
\r
413 int i1 = Bwd ? m_RowCount : 0;
\r
414 int j1 = Bwd ? m_ColCount : 0;
\r
415 int i2 = Bwd ? -1 : m_RowCount;
\r
416 int j2 = Bwd ? -1 : m_ColCount;
\r
417 for (int i = i1; i != i2; Bwd ? --i : ++i)
\r
418 for (int j = j1; j != j2; Bwd ? --j : ++j)
\r
420 if (!Mask.m_Data[i][j])
\r
422 float x = m_Data[i][j];
\r
424 if (x < -1e10 && y < -1e10)
\r
428 Warning("%s[%d][%d] = %g, %s = %g",
\r
429 m_Name, i, j, x, rhs.m_Name, y);
\r
438 for (unsigned i = 0; i < m_RowCount; ++i)
\r
439 for (unsigned j = 0; j < m_ColCount; ++j)
\r
444 void WriteMx(const string &Name, Mx<float> &Mxf);
\r
446 template<class T> void ReserveMx(Mx<T> &Mxf, unsigned N = UINT_MAX)
\r
448 if (Mxf.m_AllocatedRowCount > 0)
\r
450 extern unsigned g_MaxInputSeqLength;
\r
452 N = g_MaxInputSeqLength+1;
\r
453 Mxf.Alloc("(Reserved)", N, N);
\r