6 char ProbToChar(float p);
\r
8 list<MxBase *> *MxBase::m_Matrices = 0;
\r
9 unsigned MxBase::m_AllocCount;
\r
10 unsigned MxBase::m_ZeroAllocCount;
\r
11 unsigned MxBase::m_GrowAllocCount;
\r
12 double MxBase::m_TotalBytes;
\r
13 double MxBase::m_MaxBytes;
\r
15 static const char *LogizeStr(const char *s)
\r
19 return TypeToStr<float>(float(d));
\r
22 static const char *ExpizeStr(const char *s)
\r
26 return TypeToStr<float>(float(d));
\r
29 void MxBase::OnCtor(MxBase *Mx)
\r
31 if (m_Matrices == 0)
\r
32 m_Matrices = new list<MxBase *>;
\r
33 asserta(m_Matrices != 0);
\r
34 m_Matrices->push_front(Mx);
\r
37 void MxBase::OnDtor(MxBase *Mx)
\r
39 if (m_Matrices == 0)
\r
41 Warning("MxBase::OnDtor, m_Matrices = 0");
\r
44 for (list<MxBase*>::iterator p = m_Matrices->begin();
\r
45 p != m_Matrices->end(); ++p)
\r
49 m_Matrices->erase(p);
\r
50 if (m_Matrices->empty())
\r
55 Warning("MxBase::OnDtor, not found");
\r
58 //float **MxBase::Getf(const string &Name)
\r
60 // Mx<float> *m = (Mx<float> *) Get(Name);
\r
61 // asserta(m->GetTypeSize() == sizeof(float));
\r
62 // return m->GetData();
\r
65 //double **MxBase::Getd(const string &Name)
\r
67 // Mx<double> *m = (Mx<double> *) Get(Name);
\r
68 // asserta(m->GetTypeSize() == sizeof(double));
\r
69 // return m->GetData();
\r
72 //char **MxBase::Getc(const string &Name)
\r
74 // Mx<char> *m = (Mx<char> *) Get(Name);
\r
75 // asserta(m->GetTypeSize() == sizeof(char));
\r
76 // return m->GetData();
\r
79 void MxBase::Alloc(const char *Name, unsigned RowCount, unsigned ColCount,
\r
80 const SeqDB *DB, unsigned IdA, unsigned IdB)
\r
82 Alloc(Name, RowCount, ColCount, DB, IdA, IdB, 0, 0);
\r
85 void MxBase::Alloc(const char *Name, unsigned RowCount, unsigned ColCount,
\r
86 const SeqData *SA, const SeqData *SB)
\r
88 Alloc(Name, RowCount, ColCount, 0, UINT_MAX, UINT_MAX, SA, SB);
\r
91 void MxBase::Alloc(const char *Name, unsigned RowCount, unsigned ColCount,
\r
92 const SeqDB *DB, unsigned IdA, unsigned IdB, const SeqData *SA, const SeqData *SB)
\r
94 StartTimer(MxBase_Alloc);
\r
97 if (m_AllocatedRowCount == 0)
\r
102 asserta(IdA != UINT_MAX);
\r
103 asserta(IdB != UINT_MAX);
\r
104 asserta(RowCount >= DB->GetSeqLength(IdA) + 1);
\r
105 asserta(ColCount >= DB->GetSeqLength(IdB) + 1);
\r
107 if (RowCount > m_AllocatedRowCount || ColCount > m_AllocatedColCount)
\r
109 if (m_AllocatedRowCount > 0)
\r
111 if (opt_logmemgrows)
\r
112 Log("MxBase::Alloc grow %s %u x %u -> %u x %u, %s bytes\n",
\r
113 Name, m_AllocatedRowCount, m_AllocatedColCount,
\r
114 RowCount, ColCount,
\r
115 IntToStr(GetBytes()));
\r
116 ++m_GrowAllocCount;
\r
119 m_TotalBytes -= GetBytes();
\r
121 PauseTimer(MxBase_Alloc);
\r
122 StartTimer(MxBase_FreeData);
\r
124 EndTimer(MxBase_FreeData);
\r
125 StartTimer(MxBase_Alloc);
\r
127 unsigned N = max(RowCount + 16, m_AllocatedRowCount);
\r
128 unsigned M = max(ColCount + 16, m_AllocatedColCount);
\r
131 PauseTimer(MxBase_Alloc);
\r
132 StartTimer(MxBase_AllocData);
\r
134 EndTimer(MxBase_AllocData);
\r
135 StartTimer(MxBase_Alloc);
\r
137 m_TotalBytes += GetBytes();
\r
138 if (m_TotalBytes > m_MaxBytes)
\r
139 m_MaxBytes = m_TotalBytes;
\r
142 unsigned n = sizeof(m_Name)-1;
\r
143 strncpy(m_Name, Name, n);
\r
145 m_RowCount = RowCount;
\r
146 m_ColCount = ColCount;
\r
153 EndTimer(MxBase_Alloc);
\r
156 void MxBase::LogMe(bool WithData, int Opts) const
\r
159 if (Opts & OPT_EXP)
\r
161 else if (Opts & OPT_LOG)
\r
163 bool ZeroBased = ((Opts & OPT_ZERO_BASED) != 0);
\r
164 Log("%s(%p) Rows %u/%u, Cols %u/%u",
\r
166 m_RowCount, m_AllocatedRowCount,
\r
167 m_ColCount, m_AllocatedColCount);
\r
168 if (m_SeqDB != 0 && m_IdA != UINT_MAX)
\r
169 Log(", A=%s", m_SeqDB->GetLabel(m_IdA));
\r
170 else if (m_SA != 0)
\r
171 Log(", A=%s", m_SA->Label);
\r
172 if (m_SeqDB != 0 && m_IdB != UINT_MAX)
\r
173 Log(", B=%s", m_SeqDB->GetLabel(m_IdB));
\r
174 else if (m_SB != 0)
\r
175 Log(", B=%s", m_SB->Label);
\r
177 if (!WithData || m_RowCount == 0 || m_ColCount == 0)
\r
180 const char *z = GetAsStr(0, 0);
\r
181 unsigned Width = strlen(z);
\r
183 for (unsigned i = 0; i < Width; ++i)
\r
186 if (m_Alpha[0] != 0)
\r
188 Log("// Alphabet=%s\n", m_Alpha);
\r
190 unsigned n = strlen(m_Alpha);
\r
191 for (unsigned j = 0; j < n; ++j)
\r
192 Log(" %*c", Width, m_Alpha[j]);
\r
194 for (unsigned i = 0; i < n; ++i)
\r
196 Log("/* %c */ {", m_Alpha[i]);
\r
197 unsigned ci = m_Alpha[i];
\r
198 for (unsigned j = 0; j < n; ++j)
\r
200 unsigned cj = m_Alpha[j];
\r
201 Log("%s,", GetAsStr(ci, cj));
\r
203 Log("}, // %c\n", m_Alpha[i]);
\r
207 else if (m_Alpha2[0] != 0)
\r
209 unsigned n = strlen(m_Alpha2);
\r
210 Log("// Alphabet=%s\n", m_Alpha2);
\r
212 for (unsigned j = 0; j < n; ++j)
\r
213 Log(" %*c", Width, m_Alpha2[j]);
\r
215 for (unsigned i = 0; i < n; ++i)
\r
217 Log("/* %c */ {", m_Alpha2[i]);
\r
218 unsigned ci = m_Alpha2[i];
\r
219 for (unsigned j = 0; j < n; ++j)
\r
220 Log("%s,", GetAsStr(i, j));
\r
221 Log("}, // %c\n", m_Alpha2[i]);
\r
228 if (m_SeqDB != 0 && m_IdA != UINT_MAX)
\r
229 A = m_SeqDB->GetSeq(m_IdA);
\r
230 else if (m_SA != 0)
\r
232 if (m_SeqDB != 0 && m_IdB != UINT_MAX)
\r
233 B = m_SeqDB->GetSeq(m_IdB);
\r
234 else if (m_SB != 0)
\r
243 for (unsigned j = 0; j < m_ColCount; ++j)
\r
244 Log("%*c", Width, B[j]);
\r
246 for (unsigned j = 0; j < m_ColCount; ++j)
\r
247 Log("%*c", Width, j == 0 ? ' ' : B[j-1]);
\r
254 for (unsigned j = 0; j < m_ColCount; ++j)
\r
255 Log("%*u", Width, j%Mod);
\r
258 for (unsigned i = 0; i < m_RowCount; ++i)
\r
265 Log("%c ", i == 0 ? ' ' : A[i-1]);
\r
269 for (unsigned j = 0; j < m_ColCount; ++j)
\r
271 const char *s = GetAsStr(i, j);
\r
272 if (Opts & OPT_LOG)
\r
274 else if (Opts & OPT_EXP)
\r
281 static unsigned g_MatrixFileCount;
\r
283 void MxBase::LogCounts()
\r
286 Log("MxBase::LogCounts()\n");
\r
288 Log("---------- ----------\n");
\r
289 Log(" Allocs %10u\n", m_AllocCount);
\r
290 Log("ZeroAllocs %10u\n", m_ZeroAllocCount);
\r
291 Log(" Grows %10u\n", m_GrowAllocCount);
\r
292 Log(" Bytes %10.10s\n", MemBytesToStr(m_TotalBytes));
\r
293 Log(" Max bytes %10.10s\n", MemBytesToStr(m_MaxBytes));
\r