1 //uchime by Robert C. Edgar http://drive5.com/uchime This code is donated to the public domain.
\r
8 char ProbToChar(float p);
\r
10 list<MxBase *> *MxBase::m_Matrices = 0;
\r
11 unsigned MxBase::m_AllocCount;
\r
12 unsigned MxBase::m_ZeroAllocCount;
\r
13 unsigned MxBase::m_GrowAllocCount;
\r
14 double MxBase::m_TotalBytes;
\r
15 double MxBase::m_MaxBytes;
\r
17 static const char *LogizeStr(const char *s)
\r
21 return TypeToStr<float>(float(d));
\r
24 static const char *ExpizeStr(const char *s)
\r
28 return TypeToStr<float>(float(d));
\r
31 void MxBase::OnCtor(MxBase *Mx)
\r
33 if (m_Matrices == 0)
\r
34 m_Matrices = new list<MxBase *>;
\r
35 asserta(m_Matrices != 0);
\r
36 m_Matrices->push_front(Mx);
\r
39 void MxBase::OnDtor(MxBase *Mx)
\r
41 if (m_Matrices == 0)
\r
43 Warning("MxBase::OnDtor, m_Matrices = 0");
\r
46 for (list<MxBase*>::iterator p = m_Matrices->begin();
\r
47 p != m_Matrices->end(); ++p)
\r
51 m_Matrices->erase(p);
\r
52 if (m_Matrices->empty())
\r
57 Warning("MxBase::OnDtor, not found");
\r
60 //float **MxBase::Getf(const string &Name)
\r
62 // Mx<float> *m = (Mx<float> *) Get(Name);
\r
63 // asserta(m->GetTypeSize() == sizeof(float));
\r
64 // return m->GetData();
\r
67 //double **MxBase::Getd(const string &Name)
\r
69 // Mx<double> *m = (Mx<double> *) Get(Name);
\r
70 // asserta(m->GetTypeSize() == sizeof(double));
\r
71 // return m->GetData();
\r
74 //char **MxBase::Getc(const string &Name)
\r
76 // Mx<char> *m = (Mx<char> *) Get(Name);
\r
77 // asserta(m->GetTypeSize() == sizeof(char));
\r
78 // return m->GetData();
\r
81 void MxBase::Alloc(const char *Name, unsigned RowCount, unsigned ColCount,
\r
82 const SeqDB *DB, unsigned IdA, unsigned IdB)
\r
84 Alloc(Name, RowCount, ColCount, DB, IdA, IdB, 0, 0);
\r
87 void MxBase::Alloc(const char *Name, unsigned RowCount, unsigned ColCount,
\r
88 const SeqData *SA, const SeqData *SB)
\r
90 Alloc(Name, RowCount, ColCount, 0, UINT_MAX, UINT_MAX, SA, SB);
\r
93 void MxBase::Alloc(const char *Name, unsigned RowCount, unsigned ColCount,
\r
94 const SeqDB *DB, unsigned IdA, unsigned IdB, const SeqData *SA, const SeqData *SB)
\r
96 StartTimer(MxBase_Alloc);
\r
99 if (m_AllocatedRowCount == 0)
\r
100 ++m_ZeroAllocCount;
\r
104 asserta(IdA != UINT_MAX);
\r
105 asserta(IdB != UINT_MAX);
\r
106 asserta(RowCount >= DB->GetSeqLength(IdA) + 1);
\r
107 asserta(ColCount >= DB->GetSeqLength(IdB) + 1);
\r
109 if (RowCount > m_AllocatedRowCount || ColCount > m_AllocatedColCount)
\r
111 if (m_AllocatedRowCount > 0)
\r
113 if (opt_logmemgrows)
\r
114 Log("MxBase::Alloc grow %s %u x %u -> %u x %u, %s bytes\n",
\r
115 Name, m_AllocatedRowCount, m_AllocatedColCount,
\r
116 RowCount, ColCount,
\r
117 IntToStr(GetBytes()));
\r
118 ++m_GrowAllocCount;
\r
121 m_TotalBytes -= GetBytes();
\r
123 PauseTimer(MxBase_Alloc);
\r
124 StartTimer(MxBase_FreeData);
\r
126 EndTimer(MxBase_FreeData);
\r
127 StartTimer(MxBase_Alloc);
\r
129 unsigned N = max(RowCount + 16, m_AllocatedRowCount);
\r
130 unsigned M = max(ColCount + 16, m_AllocatedColCount);
\r
133 PauseTimer(MxBase_Alloc);
\r
134 StartTimer(MxBase_AllocData);
\r
136 EndTimer(MxBase_AllocData);
\r
137 StartTimer(MxBase_Alloc);
\r
139 m_TotalBytes += GetBytes();
\r
140 if (m_TotalBytes > m_MaxBytes)
\r
141 m_MaxBytes = m_TotalBytes;
\r
144 unsigned n = sizeof(m_Name)-1;
\r
145 strncpy(m_Name, Name, n);
\r
147 m_RowCount = RowCount;
\r
148 m_ColCount = ColCount;
\r
155 EndTimer(MxBase_Alloc);
\r
158 void MxBase::LogMe(bool WithData, int Opts) const
\r
161 if (Opts & OPT_EXP)
\r
163 else if (Opts & OPT_LOG)
\r
165 bool ZeroBased = ((Opts & OPT_ZERO_BASED) != 0);
\r
166 Log("%s(%p) Rows %u/%u, Cols %u/%u",
\r
168 m_RowCount, m_AllocatedRowCount,
\r
169 m_ColCount, m_AllocatedColCount);
\r
170 if (m_SeqDB != 0 && m_IdA != UINT_MAX)
\r
171 Log(", A=%s", m_SeqDB->GetLabel(m_IdA));
\r
172 else if (m_SA != 0)
\r
173 Log(", A=%s", m_SA->Label);
\r
174 if (m_SeqDB != 0 && m_IdB != UINT_MAX)
\r
175 Log(", B=%s", m_SeqDB->GetLabel(m_IdB));
\r
176 else if (m_SB != 0)
\r
177 Log(", B=%s", m_SB->Label);
\r
179 if (!WithData || m_RowCount == 0 || m_ColCount == 0)
\r
182 const char *z = GetAsStr(0, 0);
\r
183 unsigned Width = strlen(z);
\r
185 for (unsigned i = 0; i < Width; ++i)
\r
188 if (m_Alpha[0] != 0)
\r
190 Log("// Alphabet=%s\n", m_Alpha);
\r
192 unsigned n = strlen(m_Alpha);
\r
193 for (unsigned j = 0; j < n; ++j)
\r
194 Log(" %*c", Width, m_Alpha[j]);
\r
196 for (unsigned i = 0; i < n; ++i)
\r
198 Log("/* %c */ {", m_Alpha[i]);
\r
199 unsigned ci = m_Alpha[i];
\r
200 for (unsigned j = 0; j < n; ++j)
\r
202 unsigned cj = m_Alpha[j];
\r
203 Log("%s,", GetAsStr(ci, cj));
\r
205 Log("}, // %c\n", m_Alpha[i]);
\r
209 else if (m_Alpha2[0] != 0)
\r
211 unsigned n = strlen(m_Alpha2);
\r
212 Log("// Alphabet=%s\n", m_Alpha2);
\r
214 for (unsigned j = 0; j < n; ++j)
\r
215 Log(" %*c", Width, m_Alpha2[j]);
\r
217 for (unsigned i = 0; i < n; ++i)
\r
219 Log("/* %c */ {", m_Alpha2[i]);
\r
220 unsigned ci = m_Alpha2[i];
\r
221 for (unsigned j = 0; j < n; ++j)
\r
222 Log("%s,", GetAsStr(i, j));
\r
223 Log("}, // %c\n", m_Alpha2[i]);
\r
230 if (m_SeqDB != 0 && m_IdA != UINT_MAX)
\r
231 A = m_SeqDB->GetSeq(m_IdA);
\r
232 else if (m_SA != 0)
\r
234 if (m_SeqDB != 0 && m_IdB != UINT_MAX)
\r
235 B = m_SeqDB->GetSeq(m_IdB);
\r
236 else if (m_SB != 0)
\r
245 for (unsigned j = 0; j < m_ColCount; ++j)
\r
246 Log("%*c", Width, B[j]);
\r
248 for (unsigned j = 0; j < m_ColCount; ++j)
\r
249 Log("%*c", Width, j == 0 ? ' ' : B[j-1]);
\r
256 for (unsigned j = 0; j < m_ColCount; ++j)
\r
257 Log("%*u", Width, j%Mod);
\r
260 for (unsigned i = 0; i < m_RowCount; ++i)
\r
267 Log("%c ", i == 0 ? ' ' : A[i-1]);
\r
271 for (unsigned j = 0; j < m_ColCount; ++j)
\r
273 const char *s = GetAsStr(i, j);
\r
274 if (Opts & OPT_LOG)
\r
276 else if (Opts & OPT_EXP)
\r
283 static unsigned g_MatrixFileCount;
\r
285 void MxBase::LogCounts()
\r
288 Log("MxBase::LogCounts()\n");
\r
290 Log("---------- ----------\n");
\r
291 Log(" Allocs %10u\n", m_AllocCount);
\r
292 Log("ZeroAllocs %10u\n", m_ZeroAllocCount);
\r
293 Log(" Grows %10u\n", m_GrowAllocCount);
\r
294 Log(" Bytes %10.10s\n", MemBytesToStr(m_TotalBytes));
\r
295 Log(" Max bytes %10.10s\n", MemBytesToStr(m_MaxBytes));
\r