Skip to content

Commit 2456e34

Browse files
Carole SudreCarole Sudre
authored andcommitted
Adding tests for edge cases pairwise measures
1 parent 7bef02a commit 2456e34

1 file changed

Lines changed: 207 additions & 1 deletion

File tree

test/test_metrics/test_pairwise_measures.py

Lines changed: 207 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,13 @@ def test_voldiff():
434434
expected_vdiff = 0
435435
assert_allclose(value_test, expected_vdiff)
436436

437+
def test_absolute_volume_difference_ratio_emptyref():
438+
ref = np.zeros([10, 10])
439+
pred = np.eye(10)
440+
ppm = PM(pred, ref)
441+
value_test = ppm.absolute_volume_difference_ratio()
442+
assert value_test != value_test
443+
437444
def test_specificity():
438445
"""
439446
Using figure 2.17 p59 as example test
@@ -445,6 +452,20 @@ def test_specificity():
445452
assert_allclose(value_test1, expected_spec1, atol=0.01)
446453
assert_allclose(value_test2, expected_spec2, atol=0.01)
447454

455+
def test_topology_precision_emptypred():
456+
pred = np.zeros([10, 10])
457+
ref = np.eye(10)
458+
ppm = PM(pred, ref)
459+
value_test = ppm.topology_precision()
460+
assert value_test != value_test
461+
462+
def test_topology_sensitivity_emptyref():
463+
ref = np.zeros([10, 10])
464+
pred = np.eye(10)
465+
ppm = PM(pred, ref)
466+
value_test = ppm.topology_sensitivity()
467+
assert value_test != value_test
468+
448469

449470
def test_matthews_correlation_coefficient_29():
450471
"""
@@ -470,6 +491,12 @@ def test_matthews_correlation_coefficient():
470491
assert_allclose(value_test, expected_mcc, atol=0.001)
471492
assert_allclose(value_test2, expected_mcc, atol=0.001)
472493

494+
def test_to_dict_meas_mpm():
495+
mpm = MPM(f38_pred, f38_ref, [0,1],measures=['mcc'])
496+
dict_meas = mpm.to_dict_meas()
497+
print(dict_meas.keys,dict_meas.values)
498+
assert_allclose(dict_meas['mcc'],0.0386,atol=0.01)
499+
473500
def test_confusion_matrix():
474501
"""
475502
Taking Figure SN3.39 as inspiration
@@ -485,6 +512,25 @@ def test_confusion_matrix():
485512
print(cm_test)
486513
assert_array_equal(cm_test,cm)
487514

515+
def test_best_naive_ec():
516+
test_true = np.asarray([0, 1, 2, 3, 4])
517+
test_pred = np.asarray([0, 1, 2, 3, 0])
518+
weights_ec = np.ones([5,5]) - np.eye(5)
519+
mpm = MPM(test_pred, test_true, [0, 1, 2, 3, 4],dict_args={'ec_costs':weights_ec})
520+
expected_value = 0.8
521+
value_test = mpm.best_naive_ec()
522+
assert_allclose(value_test, expected_value, atol=0.01)
523+
524+
def test_ec_weight_matrix_argument():
525+
test_true = np.asarray([0, 1, 2, 3, 4])
526+
test_pred = np.asarray([0, 1, 2, 3, 0])
527+
weights_ec = np.ones([5,5]) - np.eye(5)
528+
mpm = MPM(test_pred, test_true, [0, 1, 2, 3, 4],dict_args={'ec_costs':weights_ec})
529+
value_test = mpm.expected_cost()
530+
print(value_test)
531+
expected_ec = 0.2
532+
assert_allclose(value_test, expected_ec, atol=0.01)
533+
488534

489535
def test_ec3():
490536
test_true = np.asarray([0, 1, 2, 3, 4])
@@ -495,6 +541,17 @@ def test_ec3():
495541
expected_ec = 0.25
496542
assert_allclose(value_test, expected_ec, atol=0.01)
497543

544+
def test_chance_agreement_probability():
545+
test_true = np.asarray([0, 1, 2, 3, 4])
546+
test_pred = np.asarray([0, 1, 2, 3, 0])
547+
#0.2*0.4+0.2*0.2+0.2*0.2+0.2*0.2+0.2*0
548+
mpm = MPM(test_pred, test_true, [0, 1, 2, 3, 4])
549+
value_test = mpm.chance_agreement_probability()
550+
expected_value = 0.2
551+
assert_allclose(value_test, expected_value, atol=0.01)
552+
553+
554+
498555
def test_accuracy():
499556
"""
500557
Taking as reference figure SN 2.11 p51 of Pitfalls paper
@@ -512,6 +569,7 @@ def test_accuracy():
512569
assert_allclose(value_test1, expected_accuracy1,atol=0.001)
513570
assert_allclose(value_test2, expected_accuracy2,atol=0.001)
514571

572+
515573
def test_netbenefit():
516574
"""
517575
Taking as reference figure SN 2.11 p 51 of Pitfalls paper
@@ -557,7 +615,20 @@ def test_negative_predictive_value():
557615
expected_npv2 = 0.47
558616
assert_allclose(value_test1, expected_npv1, atol=0.001)
559617
assert_allclose(value_test2, expected_npv2, atol=0.01)
560-
618+
619+
def test_negative_predictive_value_predfull_reffull():
620+
ref = np.ones([10, 10])
621+
pred = np.ones([10, 10])
622+
ppm = PM(pred, ref)
623+
value_test = ppm.negative_predictive_value()
624+
assert value_test != value_test
625+
626+
def test_negative_predictive_value_predfull():
627+
ref = np.eye(10)
628+
pred = np.ones([10, 10])
629+
ppm = PM(pred, ref)
630+
value_test = ppm.negative_predictive_value()
631+
assert value_test != value_test
561632

562633

563634
def test_expectedcost():
@@ -578,25 +649,46 @@ def test_normalised_expectedcost2():
578649

579650
assert_allclose(value_test2, expected_ec, atol=0.01)
580651
assert_allclose(value_test1, expected_ec, atol=0.01)
652+
653+
def test_normalised_expectedcost_allpos():
654+
ref = np.asarray([1, 1, 1, 1])
655+
pred = np.asarray([0, 1, 1, 1])
656+
ppm = PM(pred,ref)
657+
value_test = ppm.normalised_expected_cost()
658+
assert(value_test!=value_test)
659+
660+
def test_normalised_expectedcost_allneg():
661+
ref = np.asarray([0, 0, 0, 0])
662+
pred = np.asarray([0, 1, 1, 1])
663+
ppm = PM(pred,ref)
664+
value_test = ppm.normalised_expected_cost()
665+
assert(value_test!=value_test)
581666

582667
def test_cohenskappa():
583668
"""
584669
Taking SN 2.9 p49 Pitfalls as reference
585670
"""
586671
value_test1 = ppm29_1.cohens_kappa()
587672
value_test2 = ppm29_2.cohens_kappa()
673+
ppm_dict = PM(pred29_1,ref29_1,dict_args={'cost_fn':1,'cost_fp':1})
674+
value_test3 = ppm_dict.cohens_kappa()
588675
expected_ck1 = 0.70
589676
expected_ck2 = 0.53
590677
assert_allclose(value_test1, expected_ck1, atol=0.01)
678+
assert_allclose(value_test3, expected_ck1,atol=0.01)
591679
assert_allclose(value_test2, expected_ck2, atol=0.01)
592680

593681

594682
def test_cohenskappa3():
595683
mpm = MPM(f38_pred, f38_ref, [0, 1])
684+
weights_matrix = np.ones([2,2])-np.eye(2)
685+
mpm2 = MPM(f38_pred, f38_ref, [0,1],dict_args={'weights':weights_matrix})
596686
value_test = mpm.weighted_cohens_kappa()
687+
value_test2 = mpm2.weighted_cohens_kappa()
597688
print("CK f38 ", value_test, cks(f38_pred, f38_ref))
598689
expected_ck3 = 0.003
599690
assert_allclose(value_test, expected_ck3, atol=0.001)
691+
assert_allclose(value_test2, expected_ck3, atol=0.001)
600692

601693

602694
def test_balanced_accuracy2():
@@ -610,6 +702,35 @@ def test_balanced_accuracy2():
610702
assert_allclose(value_test1, expected_ba1, atol=0.01)
611703
assert_allclose(value_test2, expected_ba2, atol=0.01)
612704

705+
def test_balanced_accuracy_all_pos():
706+
ref = np.asarray([1, 1, 1, 1])
707+
pred = np.asarray([0, 1, 1, 1])
708+
ppm = PM(pred,ref)
709+
value_test = ppm.balanced_accuracy()
710+
assert(value_test!=value_test)
711+
712+
def test_balanced_accuracy_all_neg():
713+
ref = np.asarray([0, 0, 0, 0])
714+
pred = np.asarray([0, 1, 0, 0])
715+
ppm = PM(pred,ref)
716+
value_test = ppm.balanced_accuracy()
717+
assert(value_test!=value_test)
718+
719+
def test_false_positive_rate():
720+
ref = np.asarray([0, 0, 1, 1])
721+
pred = np.asarray([0, 1, 1, 1])
722+
ppm = PM(pred,ref)
723+
value_test = ppm.false_positive_rate()
724+
expected_value = 0.5
725+
assert_allclose(value_test, expected_value, atol=0.01)
726+
727+
def test_false_positive_rate_all_pos():
728+
ref = np.asarray([1, 1, 1, 1])
729+
pred = np.asarray([0, 1, 1, 1])
730+
ppm = PM(pred,ref)
731+
value_test = ppm.false_positive_rate()
732+
assert(value_test!=value_test)
733+
613734

614735
def test_youden_index2():
615736
"""
@@ -622,6 +743,21 @@ def test_youden_index2():
622743
assert_allclose(value_test1, expected_yi1, atol=0.01)
623744
assert_allclose(value_test2, expected_yi2, atol=0.01)
624745

746+
def test_youden_index_fully_neg():
747+
ref = np.asarray([0, 0, 0, 0])
748+
pred = np.asarray([0, 1, 0, 0])
749+
ppm = PM(pred,ref)
750+
value_test = ppm.youden_index()
751+
assert(value_test!=value_test)
752+
753+
def test_youden_index_fully_pos():
754+
ref = np.asarray([1, 1, 1, 1])
755+
pred = np.asarray([0, 1, 1, 1])
756+
ppm = PM(pred,ref)
757+
value_test = ppm.youden_index()
758+
assert(value_test!=value_test)
759+
760+
625761
def test_mcc():
626762
list_values = [0, 1, 2, 3]
627763
mpm = MPM(pred, ref, list_values)
@@ -705,6 +841,22 @@ def test_intersection_over_union():
705841
expected_iou = 0.76
706842
assert_allclose(value_test, expected_iou, atol=0.01)
707843

844+
def test_intersection_over_reference0():
845+
ref = np.zeros([10, 10])
846+
pred = np.eye(10)
847+
ppm = PM(pred, ref)
848+
value_test = ppm.intersection_over_reference()
849+
assert value_test != value_test
850+
851+
def test_intersection_over_union_allempty():
852+
ref = np.zeros([10, 10])
853+
pred = np.zeros([10, 10])
854+
ppm = PM(pred, ref)
855+
value_test = ppm.intersection_over_union()
856+
assert value_test != value_test
857+
858+
859+
708860

709861
def test_fbeta_beta_value():
710862
"""
@@ -778,6 +930,28 @@ def test_positive_likelihood_ratio():
778930
assert_allclose(value_test1, expected_plr1, atol=0.01)
779931
assert_allclose(value_test2, expected_plr2, atol=0.01)
780932

933+
def test_positive_likelihood_ratio_allpos():
934+
pred = np.asarray([0, 1, 1, 1])
935+
ref = np.asarray([1, 1, 1, 1])
936+
ppm = PM(pred, ref)
937+
value_test = ppm.positive_likelihood_ratio()
938+
assert(value_test!=value_test)
939+
940+
def test_positive_likelihood_ratio_allneg():
941+
pred = np.asarray([0, 0, 1, 1])
942+
ref = np.asarray([0, 0, 0, 0])
943+
ppm = PM(pred, ref)
944+
value_test = ppm.positive_likelihood_ratio()
945+
assert(value_test!=value_test)
946+
947+
def test_positive_likelihood_ratio_spec1():
948+
pred = np.asarray([0, 0, 0, 1])
949+
ref = np.asarray([0, 0, 1, 1])
950+
ppm = PM(pred, ref)
951+
value_test = ppm.positive_likelihood_ratio()
952+
assert(value_test!=value_test)
953+
954+
781955
def test_hausdorff_distances_s210():
782956
"""
783957
Using Figure 2.10 as illustrative example
@@ -906,6 +1080,15 @@ def test_dsc_s214():
9061080
assert_allclose(value_test1, expected_dsc1, atol=0.01)
9071081
assert_allclose(value_test2, expected_dsc2, atol=0.01)
9081082

1083+
def test_dsc_allempty():
1084+
ref = np.zeros([10, 10])
1085+
pred = np.zeros([10, 10])
1086+
ppm = PM(pred,ref)
1087+
value_test = ppm.dsc()
1088+
assert(value_test!=value_test)
1089+
1090+
1091+
9091092
def test_cldsc():
9101093
pm1 = PM(pred_clDice_small1, ref_clDice_small)
9111094
value_test1 = pm1.centreline_dsc()
@@ -928,6 +1111,21 @@ def test_cldsc():
9281111
assert_allclose(value_test1, expected_cldsc1, atol=0.01)
9291112
assert_allclose(value_test2, expected_cldsc2, atol=0.01)
9301113

1114+
def test_cldsc_empty_ref_or_pred():
1115+
ref1 = np.zeros([10, 10])
1116+
pred1 = np.eye(10)
1117+
1118+
pred2 = np.zeros([10, 10])
1119+
ref2 = np.eye(10)
1120+
1121+
ppm1 = PM(pred1, ref1)
1122+
ppm2 = PM(pred2, ref2)
1123+
value_test1 = ppm1.centreline_dsc()
1124+
value_test2 = ppm2.centreline_dsc()
1125+
assert value_test1 != value_test1
1126+
assert value_test2 != value_test2
1127+
1128+
9311129

9321130
def test_empty_reference():
9331131
ref = [0]
@@ -954,6 +1152,14 @@ def test_empty_reference():
9541152
assert sens != sens # True if nan
9551153
assert spec != spec # True if nan
9561154

1155+
def test_fbeta_denominator0():
1156+
ref = np.asarray([0, 0, 0, 1])
1157+
pred = np.asarray([0, 1, 0, 0])
1158+
ppm = PM(pred, ref)
1159+
value_test = ppm.fbeta()
1160+
assert value_test == 0
1161+
1162+
9571163

9581164
def test_pred_in_ref():
9591165
pred = np.zeros([14, 14])

0 commit comments

Comments
 (0)