@@ -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+
437444def 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
449470def 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+
473500def 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
489535def 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+
498555def 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+
515573def 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
563634def 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
582667def 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
594682def 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
602694def 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
614735def 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+
625761def 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
709861def 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+
781955def 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+
9091092def 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
9321130def 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
9581164def test_pred_in_ref ():
9591165 pred = np .zeros ([14 , 14 ])
0 commit comments