Next version of JABA
[jabaws.git] / binaries / src / muscle / distfunc.cpp
1 #include "muscle.h"\r
2 #include "distfunc.h"\r
3 #include <assert.h>\r
4 \r
5 DistFunc::DistFunc()\r
6         {\r
7         m_Dists = 0;\r
8         m_uCount = 0;\r
9         m_uCacheCount = 0;\r
10         m_Names = 0;\r
11         m_Ids = 0;\r
12         }\r
13 \r
14 DistFunc::~DistFunc()\r
15         {\r
16         if (0 != m_Names)\r
17                 {\r
18                 for (unsigned i = 0; i < m_uCount; ++i)\r
19                         free(m_Names[i]);\r
20                 }\r
21         delete[] m_Dists;\r
22         delete[] m_Names;\r
23         delete[] m_Ids;\r
24         }\r
25 \r
26 float DistFunc::GetDist(unsigned uIndex1, unsigned uIndex2) const\r
27         {\r
28         return m_Dists[VectorIndex(uIndex1, uIndex2)];\r
29         }\r
30 \r
31 unsigned DistFunc::GetCount() const\r
32         {\r
33         return m_uCount;\r
34         }\r
35 \r
36 void DistFunc::SetCount(unsigned uCount)\r
37         {\r
38         m_uCount = uCount;\r
39         if (uCount <= m_uCacheCount)\r
40                 return;\r
41         delete[] m_Dists;\r
42         m_Dists = new float[VectorLength()];\r
43         m_Names = new char *[m_uCount];\r
44         m_Ids = new unsigned[m_uCount];\r
45         m_uCacheCount = uCount;\r
46 \r
47         memset(m_Names, 0, m_uCount*sizeof(char *));\r
48         memset(m_Ids, 0xff, m_uCount*sizeof(unsigned));\r
49         memset(m_Dists, 0, VectorLength()*sizeof(float));\r
50         }\r
51 \r
52 void DistFunc::SetDist(unsigned uIndex1, unsigned uIndex2, float dDist)\r
53         {\r
54         m_Dists[VectorIndex(uIndex1, uIndex2)] = dDist;\r
55         m_Dists[VectorIndex(uIndex2, uIndex1)] = dDist;\r
56         }\r
57 \r
58 unsigned DistFunc::VectorIndex(unsigned uIndex1, unsigned uIndex2) const\r
59         {\r
60         assert(uIndex1 < m_uCount && uIndex2 < m_uCount);\r
61         return uIndex1*m_uCount + uIndex2;\r
62         }\r
63 \r
64 unsigned DistFunc::VectorLength() const\r
65         {\r
66         return m_uCount*m_uCount;\r
67         }\r
68 \r
69 void DistFunc::SetName(unsigned uIndex, const char szName[])\r
70         {\r
71         assert(uIndex < m_uCount);\r
72         m_Names[uIndex] = strsave(szName);\r
73         }\r
74 \r
75 void DistFunc::SetId(unsigned uIndex, unsigned uId)\r
76         {\r
77         assert(uIndex < m_uCount);\r
78         m_Ids[uIndex] = uId;\r
79         }\r
80 \r
81 const char *DistFunc::GetName(unsigned uIndex) const\r
82         {\r
83         assert(uIndex < m_uCount);\r
84         return m_Names[uIndex];\r
85         }\r
86 \r
87 unsigned DistFunc::GetId(unsigned uIndex) const\r
88         {\r
89         assert(uIndex < m_uCount);\r
90         return m_Ids[uIndex];\r
91         }\r
92 \r
93 void DistFunc::LogMe() const\r
94         {\r
95         Log("DistFunc::LogMe count=%u\n", m_uCount);\r
96         Log("                     ");\r
97         for (unsigned i = 0; i < m_uCount; ++i)\r
98                 Log(" %7u", i);\r
99         Log("\n");\r
100 \r
101         Log("                     ");\r
102         for (unsigned i = 0; i < m_uCount; ++i)\r
103                 Log(" %7.7s", m_Names[i] ? m_Names[i] : "");\r
104         Log("\n");\r
105 \r
106         for (unsigned i = 0; i < m_uCount; ++i)\r
107                 {\r
108                 Log("%4u  %10.10s  :  ", i, m_Names[i] ? m_Names[i] : "");\r
109                 for (unsigned j = 0; j <= i; ++j)\r
110                         Log(" %7.4g", GetDist(i, j));\r
111                 Log("\n");\r
112                 }\r
113         }\r