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