Skip to content

Commit

Permalink
Add tests and data for key detection
Browse files Browse the repository at this point in the history
This data is synthetic; there are relatively few cases to test so I
think this is ok for now. It would be better to get real data though.
  • Loading branch information
craffel committed Feb 27, 2016
1 parent 4b60148 commit 6b80151
Show file tree
Hide file tree
Showing 32 changed files with 98 additions and 0 deletions.
1 change: 1 addition & 0 deletions tests/data/key/est00.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
C major
1 change: 1 addition & 0 deletions tests/data/key/est01.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
G minor
1 change: 1 addition & 0 deletions tests/data/key/est02.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Ab minor
1 change: 1 addition & 0 deletions tests/data/key/est03.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
D major
1 change: 1 addition & 0 deletions tests/data/key/est04.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
F# minor
1 change: 1 addition & 0 deletions tests/data/key/est05.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
A major
1 change: 1 addition & 0 deletions tests/data/key/est06.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Gb minor
1 change: 1 addition & 0 deletions tests/data/key/est07.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
G major
1 change: 1 addition & 0 deletions tests/data/key/est08.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
C major
1 change: 1 addition & 0 deletions tests/data/key/est09.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
C minor
1 change: 1 addition & 0 deletions tests/data/key/output00.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Weighted Score": 1.0}
1 change: 1 addition & 0 deletions tests/data/key/output01.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Weighted Score": 1.0}
1 change: 1 addition & 0 deletions tests/data/key/output02.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Weighted Score": 0.5}
1 change: 1 addition & 0 deletions tests/data/key/output03.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Weighted Score": 0.0}
1 change: 1 addition & 0 deletions tests/data/key/output04.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Weighted Score": 0.3}
1 change: 1 addition & 0 deletions tests/data/key/output05.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Weighted Score": 0.3}
1 change: 1 addition & 0 deletions tests/data/key/output06.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Weighted Score": 0.2}
1 change: 1 addition & 0 deletions tests/data/key/output07.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Weighted Score": 0.2}
1 change: 1 addition & 0 deletions tests/data/key/output08.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Weighted Score": 0.0}
1 change: 1 addition & 0 deletions tests/data/key/output09.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"Weighted Score": 0.0}
1 change: 1 addition & 0 deletions tests/data/key/ref00.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
C major
1 change: 1 addition & 0 deletions tests/data/key/ref01.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
G minor
1 change: 1 addition & 0 deletions tests/data/key/ref02.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Db minor
1 change: 1 addition & 0 deletions tests/data/key/ref03.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
A minor
1 change: 1 addition & 0 deletions tests/data/key/ref04.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
A major
1 change: 1 addition & 0 deletions tests/data/key/ref05.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
F# minor
1 change: 1 addition & 0 deletions tests/data/key/ref06.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Gb major
1 change: 1 addition & 0 deletions tests/data/key/ref07.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
G minor
1 change: 1 addition & 0 deletions tests/data/key/ref08.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
G major
1 change: 1 addition & 0 deletions tests/data/key/ref09.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
A minor
2 changes: 2 additions & 0 deletions tests/generate_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ def load_separation_data(folder):
tasks['transcription'] = (mir_eval.transcription,
mir_eval.io.load_valued_intervals,
'tests/data/transcription/{}*.txt')
tasks['key'] = (mir_eval.key, mir_eval.io.load_key,
'tests/data/key/{}*.txt')
# Get task keys from argv
for task in sys.argv[1:]:
print('Generating data for {}'.format(task))
Expand Down
66 changes: 66 additions & 0 deletions tests/test_key.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
'''
Tests for mir_eval.key
'''

import mir_eval
import nose.tools
import glob
import json
import numpy as np

A_TOL = 1e-12

# Path to the fixture files
REF_GLOB = 'tests/data/key/ref*.txt'
EST_GLOB = 'tests/data/key/est*.txt'
SCORES_GLOB = 'tests/data/key/output*.json'


def __unit_test_key_function(metric):

good_keys = ['C major', 'c major', 'C# major', 'Bb minor', 'db minor']
# All of these are invalid key strings
bad_keys = ['C maj', 'Cb major', 'C', 'K major', 'F## minor']

for good_key in good_keys:
for bad_key in bad_keys:
# Should raise an error whether we pass a bad key as ref or est
nose.tools.assert_raises(ValueError, metric, good_key, bad_key)
nose.tools.assert_raises(ValueError, metric, bad_key, good_key)

for good_key in good_keys:
# When the same key is passed for est and ref, score should be 1
assert mir_eval.key.weighted_score(good_key, good_key) == 1.


def __check_score(sco_f, metric, score, expected_score):
assert np.allclose(score, expected_score, atol=A_TOL)


def test_key_functions():
# Load in all files in the same order
ref_files = sorted(glob.glob(REF_GLOB))
est_files = sorted(glob.glob(EST_GLOB))
sco_files = sorted(glob.glob(SCORES_GLOB))

assert len(ref_files) == len(est_files) == len(sco_files) > 0

# Unit test all metrics (one for now)
for metric in [mir_eval.key.weighted_score]:
yield __unit_test_key_function, metric

# Regression tests
for ref_f, est_f, sco_f in zip(ref_files, est_files, sco_files):
with open(sco_f, 'r') as f:
expected_scores = json.load(f)
# Load in an example key annotation
reference_key = mir_eval.io.load_key(ref_f)
# Load in an example key detector output
estimated_key = mir_eval.io.load_key(est_f)
# Compute scores
scores = mir_eval.key.evaluate(reference_key, estimated_key)
# Compare them
for metric in scores:
# This is a simple hack to make nosetest's messages more useful
yield (__check_score, sco_f, metric, scores[metric],
expected_scores[metric])

0 comments on commit 6b80151

Please sign in to comment.