--- /dev/null
+#include "muscle.h"\r
+#include "distfunc.h"\r
+#include <assert.h>\r
+\r
+DistFunc::DistFunc()\r
+ {\r
+ m_Dists = 0;\r
+ m_uCount = 0;\r
+ m_uCacheCount = 0;\r
+ m_Names = 0;\r
+ m_Ids = 0;\r
+ }\r
+\r
+DistFunc::~DistFunc()\r
+ {\r
+ if (0 != m_Names)\r
+ {\r
+ for (unsigned i = 0; i < m_uCount; ++i)\r
+ free(m_Names[i]);\r
+ }\r
+ delete[] m_Dists;\r
+ delete[] m_Names;\r
+ delete[] m_Ids;\r
+ }\r
+\r
+float DistFunc::GetDist(unsigned uIndex1, unsigned uIndex2) const\r
+ {\r
+ return m_Dists[VectorIndex(uIndex1, uIndex2)];\r
+ }\r
+\r
+unsigned DistFunc::GetCount() const\r
+ {\r
+ return m_uCount;\r
+ }\r
+\r
+void DistFunc::SetCount(unsigned uCount)\r
+ {\r
+ m_uCount = uCount;\r
+ if (uCount <= m_uCacheCount)\r
+ return;\r
+ delete[] m_Dists;\r
+ m_Dists = new float[VectorLength()];\r
+ m_Names = new char *[m_uCount];\r
+ m_Ids = new unsigned[m_uCount];\r
+ m_uCacheCount = uCount;\r
+\r
+ memset(m_Names, 0, m_uCount*sizeof(char *));\r
+ memset(m_Ids, 0xff, m_uCount*sizeof(unsigned));\r
+ memset(m_Dists, 0, VectorLength()*sizeof(float));\r
+ }\r
+\r
+void DistFunc::SetDist(unsigned uIndex1, unsigned uIndex2, float dDist)\r
+ {\r
+ m_Dists[VectorIndex(uIndex1, uIndex2)] = dDist;\r
+ m_Dists[VectorIndex(uIndex2, uIndex1)] = dDist;\r
+ }\r
+\r
+unsigned DistFunc::VectorIndex(unsigned uIndex1, unsigned uIndex2) const\r
+ {\r
+ assert(uIndex1 < m_uCount && uIndex2 < m_uCount);\r
+ return uIndex1*m_uCount + uIndex2;\r
+ }\r
+\r
+unsigned DistFunc::VectorLength() const\r
+ {\r
+ return m_uCount*m_uCount;\r
+ }\r
+\r
+void DistFunc::SetName(unsigned uIndex, const char szName[])\r
+ {\r
+ assert(uIndex < m_uCount);\r
+ m_Names[uIndex] = strsave(szName);\r
+ }\r
+\r
+void DistFunc::SetId(unsigned uIndex, unsigned uId)\r
+ {\r
+ assert(uIndex < m_uCount);\r
+ m_Ids[uIndex] = uId;\r
+ }\r
+\r
+const char *DistFunc::GetName(unsigned uIndex) const\r
+ {\r
+ assert(uIndex < m_uCount);\r
+ return m_Names[uIndex];\r
+ }\r
+\r
+unsigned DistFunc::GetId(unsigned uIndex) const\r
+ {\r
+ assert(uIndex < m_uCount);\r
+ return m_Ids[uIndex];\r
+ }\r
+\r
+void DistFunc::LogMe() const\r
+ {\r
+ Log("DistFunc::LogMe count=%u\n", m_uCount);\r
+ Log(" ");\r
+ for (unsigned i = 0; i < m_uCount; ++i)\r
+ Log(" %7u", i);\r
+ Log("\n");\r
+\r
+ Log(" ");\r
+ for (unsigned i = 0; i < m_uCount; ++i)\r
+ Log(" %7.7s", m_Names[i] ? m_Names[i] : "");\r
+ Log("\n");\r
+\r
+ for (unsigned i = 0; i < m_uCount; ++i)\r
+ {\r
+ Log("%4u %10.10s : ", i, m_Names[i] ? m_Names[i] : "");\r
+ for (unsigned j = 0; j <= i; ++j)\r
+ Log(" %7.4g", GetDist(i, j));\r
+ Log("\n");\r
+ }\r
+ }\r