1313
1414from MetricsReloaded .metrics .prob_pairwise_measures import ProbabilityPairwiseMeasures
1515
16- #Data for figure SN 2.9 of Pitfalls p
16+ #Data for figure SN 2.9 of Pitfalls p49
1717pred29_1 = np .concatenate ([np .ones ([45 ]),np .zeros ([5 ]),np .ones ([10 ]),np .zeros ([40 ])])
1818ref29_1 = np .concatenate ([np .ones ([50 ]),np .zeros ([50 ])])
1919pred29_2 = np .concatenate ([np .ones ([81 ]),np .zeros ([9 ]),np .ones ([2 ]),np .zeros ([8 ])])
2020ref29_2 = np .concatenate ([np .ones ([90 ]),np .zeros ([10 ])])
2121ppm29_1 = PM (pred29_1 , ref29_1 )
2222ppm29_2 = PM (pred29_2 , ref29_2 )
2323
24+ #Data for figure SN 2.17 of pitfalls p59
25+ pred217_1 = np .concatenate ([np .ones ([6 ]), np .zeros ([94 ])])
26+ pred217_2 = np .zeros ([100 ])
27+ ref217 = np .concatenate ([np .ones ([3 ]),np .zeros ([97 ])])
28+ ppm217_1 = PM (pred217_1 , ref217 )
29+ ppm217_2 = PM (pred217_2 , ref217 )
30+
31+ #Data for figure SN 2.10 of pitfalls p50
32+ ref210 = np .zeros ([14 ,14 ])
33+ ref210 [5 :9 ,5 :9 ] = 1
34+ pred210_1 = np .zeros ([14 ,14 ])
35+ pred210_1 [6 :8 ,6 :8 ] = 1
36+ pred210_2 = np .zeros ([14 ,14 ])
37+ pred210_2 [4 :10 ,4 :10 ]= 1
38+ ppm210_1 = PM (pred210_1 , ref210 )
39+ ppm210_2 = PM (pred210_2 , ref210 )
40+
41+
2442### Small size of structures relative to pixel/voxel size (DSC)
2543## Larger structure
2644p_large_ref = np .zeros ((11 , 11 ))
252270f59_pred2 = np .zeros ([15 , 15 ])
253271f59_pred2 [4 :8 , 5 :9 ] = 1
254272
273+ def test_fn_map ():
274+ """
275+ Using SN2.10 as basis of illustration for FP TP FN TN calculation
276+ """
277+ fn1 = ppm210_1 .fn ()
278+ fn2 = ppm210_2 .fn ()
279+ expected_fn1 = 12
280+ expected_fn2 = 0
281+ # fn_map_1 = ppm210_1.__fn_map()
282+ # expected_fn_map1 = np.zeros([14,14])
283+ # expected_fn_map1[5:6,5:9] = 1
284+ # expected_fn_map1[8:9,5:9] = 1
285+ # expected_fn_map1[5:9,5:6] = 1
286+ # expected_fn_map1[5:9,8:9] = 1
287+ # fn_map_2 = ppm210_2.__fn_map()
288+ # expected_fn_map2 = np.zeros([14,14])
289+ # assert_array_equal(fn_map_1, expected_fn_map1)
290+ # assert_array_equal(fn_map_2, expected_fn_map2)
291+ assert fn1 == 12
292+ assert fn2 == 0
293+
294+ def test_fp ():
295+ """
296+ Using SN2.10 as illustrative example for calculation of TP TN FP FN
297+
298+ """
299+ fp1 = ppm210_1 .fp ()
300+ fp2 = ppm210_2 .fp ()
301+ expected_fp1 = 0
302+ expected_fp2 = 20
303+ assert fp1 == expected_fp1
304+ assert fp2 == expected_fp2
305+
306+ def test_tp ():
307+ """
308+ Using SN2.10 as illustrative example p50 pitfalls
309+ """
310+
311+ tp1 = ppm210_1 .tp ()
312+ tp2 = ppm210_2 .tp ()
313+ expected_tp1 = 4
314+ expected_tp2 = 16
315+ assert tp1 == expected_tp1
316+ assert tp2 == expected_tp2
317+
318+ def test_tn ():
319+ """
320+ Using SN2.10 as illustrative example p50 Pitfalls paper
321+ """
322+
323+ tn1 = ppm210_1 .tn ()
324+ tn2 = ppm210_2 .tn ()
325+ expected_tn1 = 180
326+ expected_tn2 = 160
327+ assert tn1 == expected_tn1
328+ assert tn2 == expected_tn2
329+
330+ def test_n_pos_ref ():
331+ expected_n_pos_ref = 16
332+ n_pos_ref = ppm210_1 .n_pos_ref ()
333+ assert expected_n_pos_ref == n_pos_ref
334+
335+ def test_n_union ():
336+ expected_n_union1 = 16
337+ expected_n_union2 = 36
338+ n_union1 = ppm210_1 .n_union ()
339+ n_union2 = ppm210_2 .n_union ()
340+ assert expected_n_union1 == n_union1
341+ assert expected_n_union2 == n_union2
342+
343+ def test_n_intersection ():
344+ expected_n_intersection1 = 4
345+ expected_n_intersection2 = 16
346+ n_intersection1 = ppm210_1 .n_intersection ()
347+ n_intersection2 = ppm210_2 .n_intersection ()
348+ assert expected_n_intersection1 == n_intersection1
349+ assert expected_n_intersection2 == n_intersection2
350+
351+ def test_n_neg_ref ():
352+ expected_n_neg_ref = 180
353+ n_neg_ref = ppm210_1 .n_neg_ref ()
354+ assert expected_n_neg_ref == n_neg_ref
355+
356+ def test_n_pos_pred ():
357+ expected_n_pos_pred1 = 4
358+ expected_n_pos_pred2 = 36
359+ n_pos_pred1 = ppm210_1 .n_pos_pred ()
360+ n_pos_pred2 = ppm210_2 .n_pos_pred ()
361+ assert expected_n_pos_pred2 == n_pos_pred2
362+ assert expected_n_pos_pred1 == n_pos_pred1
363+
364+ def test_n_neg_pred ():
365+ expected_n_neg_pred1 = 192
366+ expected_n_neg_pred2 = 160
367+ n_neg_pred1 = ppm210_1 .n_neg_pred ()
368+ n_neg_pred2 = ppm210_2 .n_neg_pred ()
255369
256370def test_balanced_accuracy ():
257371 list_values = [0 , 1 , 2 , 3 ]
@@ -276,6 +390,18 @@ def test_voldiff():
276390 expected_vdiff = 0
277391 assert_allclose (value_test , expected_vdiff )
278392
393+ def test_specificity ():
394+ """
395+ Using figure 2.17 p59 as example test
396+ """
397+ value_test1 = ppm217_1 .specificity ()
398+ value_test2 = ppm217_2 .specificity ()
399+ expected_spec1 = 0.97
400+ expected_spec2 = 1.00
401+ assert_allclose (value_test1 , expected_spec1 , atol = 0.01 )
402+ assert_allclose (value_test2 , expected_spec2 , atol = 0.01 )
403+
404+
279405def test_matthews_correlation_coefficient_29 ():
280406 """
281407 Taking SN 3.9 as figure illustration for MCC p49 Pitfalls
@@ -545,6 +671,29 @@ def test_fbeta():
545671 assert_allclose (value_test , expected_fbeta , atol = 0.001 )
546672 assert_allclose (value_test2 , expected_fbeta , atol = 0.001 )
547673
674+ def test_sensitivity ():
675+ """
676+ Using figure 2.17 p59 as example for test
677+ """
678+
679+ value_test1 = ppm217_1 .sensitivity ()
680+ value_test2 = ppm217_2 .sensitivity ()
681+ expected_sens1 = 1.00
682+ expected_sens2 = 0.00
683+ assert_allclose (value_test1 , expected_sens1 , atol = 0.01 )
684+ assert_allclose (value_test2 , expected_sens2 , atol = 0.01 )
685+
686+ def test_recall ():
687+ """
688+ Using figure 2.17 p59 as example for test
689+ """
690+
691+ value_test1 = ppm217_1 .recall ()
692+ value_test2 = ppm217_2 .recall ()
693+ expected_rec1 = 1.00
694+ expected_rec2 = 0.00
695+ assert_allclose (value_test1 , expected_rec1 , atol = 0.01 )
696+ assert_allclose (value_test2 , expected_rec2 , atol = 0.01 )
548697
549698def test_sens ():
550699 pm = PM (f27_pred1 , f27_ref1 )
@@ -580,6 +729,30 @@ def test_positive_likelihood_ratio():
580729 assert_allclose (value_test1 , expected_plr1 , atol = 0.01 )
581730 assert_allclose (value_test2 , expected_plr2 , atol = 0.01 )
582731
732+ def test_hausdorff_distances_s210 ():
733+ """
734+ Using Figure 2.10 as illustrative example
735+ """
736+ hausdorff_1 = ppm210_1 .measured_hausdorff_distance ()
737+ hausdorff_2 = ppm210_2 .measured_hausdorff_distance ()
738+ expected_hd1 = 1.41
739+ expected_hd2 = 1.41
740+ assert_allclose (hausdorff_1 ,expected_hd1 ,atol = 0.01 )
741+ assert_allclose (hausdorff_2 ,expected_hd2 ,atol = 0.01 )
742+
743+ def test_masd_s210 ():
744+ """
745+ Using Figure 2.10 as illustrative example
746+ """
747+ masd_1 = ppm210_1 .measured_masd ()
748+ masd_2 = ppm210_2 .measured_masd ()
749+ expected_masd1 = 1.07
750+ expected_masd2 = 1.04
751+ assert_allclose (masd_1 ,expected_masd1 ,atol = 0.01 )
752+ assert_allclose (masd_2 ,expected_masd2 ,atol = 0.01 )
753+
754+
755+
583756def test_hd ():
584757 f20_ref = np .zeros ([14 , 14 ])
585758 f20_ref [1 , 1 ] = 1
0 commit comments