-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathKeyEvaluationStats.cpp
132 lines (116 loc) · 4.25 KB
/
KeyEvaluationStats.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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
//============================================================================
/**
Implementation file for KeyEvaluationStats.h
@author Johan Pauwels
@date 20101008
*/
//============================================================================
// Includes
#include <stdexcept>
#include "KeyEvaluationStats.h"
KeyEvaluationStats::KeyEvaluationStats(const Eigen::ArrayXXd& inConfusionMatrix,
const Eigen::ArrayXXd::Index inNumOfChromas /*= 12*/)
: m_ConfusionMatrix(inConfusionMatrix), m_NumOfChromas(inNumOfChromas),
m_NumOfModes((inConfusionMatrix.rows()-1)/inNumOfChromas),
m_NumOfKeys(m_NumOfModes * m_NumOfChromas),
m_KeysMatrix(m_ConfusionMatrix.topLeftCorner(m_NumOfKeys, m_NumOfKeys))
{
}
KeyEvaluationStats::~KeyEvaluationStats()
{
// Nothing to do...
}
const double KeyEvaluationStats::getCorrectKeys() const
{
return m_KeysMatrix.matrix().trace();
}
const double KeyEvaluationStats::getCorrectNoKeys() const
{
return m_ConfusionMatrix(m_NumOfKeys, m_NumOfKeys);
}
const double KeyEvaluationStats::getKeyDeletions() const
{
return m_ConfusionMatrix.rightCols<1>().head(m_NumOfKeys).sum();
}
const double KeyEvaluationStats::getKeyInsertions() const
{
return m_ConfusionMatrix.bottomRows<1>().head(m_NumOfKeys).sum();
}
const double KeyEvaluationStats::getAdjacentKeys() const
{
return m_KeysMatrix.matrix().diagonal(m_NumOfModes).sum() +
m_KeysMatrix.matrix().diagonal(-m_NumOfModes).sum() +
m_KeysMatrix.matrix().diagonal(m_NumOfKeys-m_NumOfModes).sum() +
m_KeysMatrix.matrix().diagonal(-m_NumOfKeys+m_NumOfModes).sum();
}
const double KeyEvaluationStats::getRelativeKeys() const
{
if (m_NumOfModes != 2)
{
throw std::invalid_argument("Relative keys are only defined for major-minor mode pairs");
}
double theRelKeyDuration = 0.;
Eigen::ArrayXd theRefMajorSuperDiag = m_KeysMatrix.matrix().diagonal(3*m_NumOfModes+1);
Eigen::ArrayXd theRefMajorSubDiag = m_KeysMatrix.matrix().diagonal(-m_NumOfKeys+3*m_NumOfModes+1);
Eigen::ArrayXd theRefMinorSuperDiag = m_KeysMatrix.matrix().diagonal(m_NumOfKeys-3*m_NumOfModes-1);
Eigen::ArrayXd theRefMinorSubDiag = m_KeysMatrix.matrix().diagonal(-3*m_NumOfModes-1);
for (Eigen::ArrayXXd::Index i = 0; i < theRefMinorSuperDiag.size(); ++i)
{
if (i % 2 == 1) //sum over odd indices
{
theRelKeyDuration += theRefMajorSubDiag[i] + theRefMinorSuperDiag[i];
}
}
for (Eigen::ArrayXXd::Index i = 0; i < theRefMinorSubDiag.size(); ++i)
{
if (i % 2 == 0) //sum over even indices
{
theRelKeyDuration += theRefMajorSuperDiag[i] + theRefMinorSubDiag[i];
}
}
return theRelKeyDuration;
}
const double KeyEvaluationStats::getParallelKeys() const
{
if (m_NumOfModes != 2)
{
throw std::invalid_argument("Parallel keys are only defined for major-minor mode pairs");
}
double theParKeyDuration = 0.;
for (Eigen::ArrayXXd::Index i = 0; i < m_NumOfChromas; ++i)
{
theParKeyDuration += m_KeysMatrix(i*m_NumOfModes,i*m_NumOfModes+1) +
m_KeysMatrix(i*m_NumOfModes+1,i*m_NumOfModes);
}
return theParKeyDuration;
}
const double KeyEvaluationStats::getChromaticKeys() const
{
return m_KeysMatrix.matrix().diagonal(5*m_NumOfModes).sum() +
m_KeysMatrix.matrix().diagonal(-5*m_NumOfModes).sum() +
m_KeysMatrix.matrix().diagonal(m_NumOfKeys-5*m_NumOfModes).sum() +
m_KeysMatrix.matrix().diagonal(-m_NumOfKeys+5*m_NumOfModes).sum();
}
const Eigen::ArrayXXd::Index KeyEvaluationStats::getNumOfUniquesInRef() const
{
return (m_KeysMatrix > 0.).rowwise().any().count();
}
const Eigen::ArrayXXd::Index KeyEvaluationStats::getNumOfUniquesInTest() const
{
return (m_KeysMatrix > 0.).colwise().any().count();
}
const Eigen::ArrayXXd KeyEvaluationStats::getCorrectKeysPerMode() const
{
Eigen::ArrayXXd outCorrectKeysPerMode = Eigen::ArrayXXd::Zero(m_NumOfModes, 2);
for (Eigen::ArrayXXd::Index iMode = 0; iMode < m_NumOfModes; ++iMode)
{
for (Eigen::ArrayXXd::Index iChroma = 0; iChroma < m_NumOfChromas; ++iChroma)
{
// Correct keys per mode
outCorrectKeysPerMode(iMode,0) += m_ConfusionMatrix(iChroma*m_NumOfModes+iMode, iChroma*m_NumOfModes+iMode);
// Total duration per mode
outCorrectKeysPerMode(iMode,1) += m_ConfusionMatrix.row(iChroma*m_NumOfModes+iMode).sum();
}
}
return outCorrectKeysPerMode;
}