diff --git a/hands_on/numerical_fuzzing/test_var.py b/hands_on/numerical_fuzzing/test_var.py new file mode 100644 index 0000000..b153ff2 --- /dev/null +++ b/hands_on/numerical_fuzzing/test_var.py @@ -0,0 +1,27 @@ +import numpy as np +import random +from math import isclose + + +def test_var_deterministic(): + # Given + input = [0, 1, 2, 3] + expected = 1.25 + + # When + result = np.var(input) + + # Then + assert isclose(result, expected, abs_tol=0.01) + + +def test_var_fuzzy(): + # Given + expected = 5 + input = [random.gauss(0, np.sqrt(expected)) for i in range(100000)] + + # When + result = np.var(input) + + # Then + assert isclose(result, expected, abs_tol=0.05) diff --git a/hands_on/pyanno_voting/pyanno/tests/test_voting.py b/hands_on/pyanno_voting/pyanno/tests/test_voting.py index f21a10c..a9fde4d 100644 --- a/hands_on/pyanno_voting/pyanno/tests/test_voting.py +++ b/hands_on/pyanno_voting/pyanno/tests/test_voting.py @@ -3,6 +3,8 @@ from pyanno import voting from pyanno.voting import MISSING_VALUE as MV +from math import isclose + def test_labels_count(): annotations = [ @@ -41,3 +43,20 @@ def test_majority_vote_empty_item(): expected = [1, MV, 2] result = voting.majority_vote(annotations) assert result == expected + +def test_labels_frequency(): + matrix = [ + [1, 2, 2, -1], + [2, 2, 2, 2], + [1, 1, 3, 3], + [1, 3, 3, 2], + [-1, 2, 3, 1], + [-1, -1, -1, 3], + ] + result = voting.labels_frequency(matrix, 4) + + assert np.all([res != None for res in result]) + assert len(result) == 4 + assert np.all(voting.labels_frequency([[-1, -1, -1, -1],[-1, -1, -1, -1]], 4) == np.zeros(4)) + assert np.all([i >= 0 and i <= 1 for i in result]) + assert isclose(np.sum(result),1) or isclose(np.sum(result), 0,abs_tol=1e-12) diff --git a/hands_on/pyanno_voting/pyanno/voting.py b/hands_on/pyanno_voting/pyanno/voting.py index d5b5747..3694cc7 100644 --- a/hands_on/pyanno_voting/pyanno/voting.py +++ b/hands_on/pyanno_voting/pyanno/voting.py @@ -100,3 +100,20 @@ def labels_frequency(annotations, nclasses): freq[k] is the frequency of elements of class k in `annotations`, i.e. their count over the number of total of observed (non-missing) elements """ + annotations_array = np.ravel(annotations) + result = np.zeros(nclasses) + + dim = 0 + for number in annotations_array: + if number != -1: + dim = dim + 1 + if dim !=0: + for cl in np.arange(nclasses): + aux = 0 + for anot in annotations_array: + if cl == anot: + aux = aux + 1 + result[cl] = aux / dim + return(result) + else: + return(0)