From a93954e1193286b2095e5e955798ca54aa6de534 Mon Sep 17 00:00:00 2001
From: Manuel Gunther <siebenkopf@googlemail.com>
Date: Mon, 28 Aug 2017 17:06:44 -0600
Subject: [PATCH] Implemented DIR plot

---
 bob/bio/base/script/evaluate.py               |   80 +-
 .../base/test/data/scores-nonorm-dev-openset  | 1000 +++++++++++++++++
 bob/bio/base/test/test_scripts.py             |   30 +-
 doc/experiments.rst                           |    2 +-
 4 files changed, 1097 insertions(+), 15 deletions(-)
 create mode 100644 bob/bio/base/test/data/scores-nonorm-dev-openset

diff --git a/bob/bio/base/script/evaluate.py b/bob/bio/base/script/evaluate.py
index fe5ac8c2..b239e235 100644
--- a/bob/bio/base/script/evaluate.py
+++ b/bob/bio/base/script/evaluate.py
@@ -47,6 +47,7 @@ def command_line_arguments(command_line_parameters):
   parser.add_argument('-m', '--mindcf', action = 'store_true', help = "If given, minDCF will be computed.")
   parser.add_argument('--cost', default=0.99,  help='Cost for FAR in minDCF')
   parser.add_argument('-r', '--rr', action = 'store_true', help = "If given, the Recognition Rate will be computed.")
+  parser.add_argument('-o', '--rank', type=int, default=1, help = "The rank for which to plot the DIR curve")
   parser.add_argument('-t', '--thresholds', type=float, nargs='+', help = "If given, the Recognition Rate will incorporate an Open Set handling, rejecting all scores that are below the given threshold; when multiple thresholds are given, they are applied in the same order as the --dev-files.")
   parser.add_argument('-l', '--legends', nargs='+', help = "A list of legend strings used for ROC, CMC and DET plots; if given, must be the same number than --dev-files.")
   parser.add_argument('-F', '--legend-font-size', type=int, default=10, help = "Set the font size of the legends.")
@@ -55,6 +56,7 @@ def command_line_arguments(command_line_parameters):
   parser.add_argument('-R', '--roc', help = "If given, ROC curves will be plotted into the given pdf file.")
   parser.add_argument('-D', '--det', help = "If given, DET curves will be plotted into the given pdf file.")
   parser.add_argument('-C', '--cmc', help = "If given, CMC curves will be plotted into the given pdf file.")
+  parser.add_argument('-O', '--dir', help = "If given, DIR curves will be plotted into the given pdf file; This is an open-set measure, which cannot be applied to closed set score files.")
   parser.add_argument('-E', '--epc', help = "If given, EPC curves will be plotted into the given pdf file. For this plot --eval-files is mandatory.")
   parser.add_argument('-M', '--min-far-value', type=float, default=1e-4, help = "Select the minimum FAR value used in ROC plots; should be a power of 10.")
   parser.add_argument('-L', '--far-line-at', type=float, help = "If given, draw a veritcal line at this FAR value in the ROC plots.")
@@ -68,8 +70,11 @@ def command_line_arguments(command_line_parameters):
   # set verbosity level
   bob.core.log.set_verbosity_level(logger, args.verbose)
 
-
   # some sanity checks:
+  for f in args.dev_files + (args.eval_files or []):
+    if not os.path.exists(f):
+      raise ValueError("The provided score file '%s' does not exist", f)
+
   if args.eval_files is not None and len(args.dev_files) != len(args.eval_files):
     logger.error("The number of --dev-files (%d) and --eval-files (%d) are not identical", len(args.dev_files), len(args.eval_files))
 
@@ -98,6 +103,14 @@ def command_line_arguments(command_line_parameters):
 
   return args
 
+def _add_far_labels(min_far):
+  # compute and apply tick marks
+  ticks = [min_far]
+  while ticks[-1] < 1.: ticks.append(ticks[-1] * 10.)
+  pyplot.xticks(ticks)
+  pyplot.axis([min_far, 1., -0.01, 1.01])
+
+
 
 def _plot_roc(frrs, colors, labels, title, fontsize=10, position=None, farfrrs=None):
   if position is None: position = 'lower right'
@@ -116,12 +129,7 @@ def _plot_roc(frrs, colors, labels, title, fontsize=10, position=None, farfrrs=N
     else:
       pyplot.plot([x[0] for x in farfrrs], [(1.-x[1]) for x in farfrrs], '--', color='black')
 
-  # compute and apply tick marks
-  min_far = frrs[0][0][0]
-  ticks = [min_far]
-  while ticks[-1] < 1.: ticks.append(ticks[-1] * 10.)
-  pyplot.axis([min_far, 1., -0.01, 1.01])
-  pyplot.xticks(ticks)
+  _add_far_labels(frrs[0][0][0])
 
   # set label, legend and title
   pyplot.xlabel('FMR')
@@ -185,6 +193,39 @@ def _plot_cmc(cmcs, colors, labels, title, fontsize=10, position=None):
   return figure
 
 
+def _plot_dir(cmc_scores, far_values, rank, colors, labels, title, fontsize=10, position=None):
+  if position is None: position = 'lower right'
+  # open new page for current plot
+  figure = pyplot.figure()
+
+  # for each probe, for which no positives exists, get the highest negative
+  # score; and sort them to compute the FAR thresholds
+  for i, cmcs in enumerate(cmc_scores):
+    negatives = sorted(max(neg) for neg, pos in cmcs if (pos is None or not numpy.array(pos).size) and neg is not None)
+    if not negatives:
+      raise ValueError("There need to be at least one pair with only negative scores")
+
+    # compute thresholds based on FAR values
+    thresholds = [bob.measure.far_threshold(negatives, [], v, True) for v in far_values]
+
+    # compute detection and identification rate based on the thresholds for
+    # the given rank
+    rates = [bob.measure.detection_identification_rate(cmcs, t, rank) for t in thresholds]
+
+    # plot DIR curve
+    pyplot.semilogx(far_values, rates, figure=figure, color=colors[i], label=labels[i])
+
+  # finalize plot
+  _add_far_labels(far_values[0])
+
+  pyplot.xlabel('FAR')
+  pyplot.ylabel('DIR')
+  pyplot.legend(loc=position, prop = {'size':fontsize})
+  pyplot.title(title)
+
+  return figure
+
+
 def _plot_epc(scores_dev, scores_eval, colors, labels, title, fontsize=10, position=None):
   if position is None: position = 'upper center'
   # open new page for current plot
@@ -367,15 +408,14 @@ def main(command_line_parameters=None):
       try:
         # create a multi-page PDF for the EPC curve
         pdf = PdfPages(args.epc)
-        pdf.savefig(_plot_epc(scores_dev, scores_eval, colors, args.legends, args.title if args.title is not None else "" , args.legend_font_size, args.legend_position), bbox_inches='tight')
+        pdf.savefig(_plot_epc(scores_dev, scores_eval, colors, args.legends, args.title[0] if args.title is not None else "" , args.legend_font_size, args.legend_position), bbox_inches='tight')
         pdf.close()
       except RuntimeError as e:
         raise RuntimeError("During plotting of EPC curves, the following exception occured:\n%s" % e)
 
 
 
-
-  if args.cmc or args.rr:
+  if args.cmc or args.rr or args.dir:
     logger.info("Loading CMC data on the development " + ("and on the evaluation set" if args.eval_files else "set"))
     cmcs_dev = [bob.measure.load.cmc(os.path.join(args.directory, f)) for f in args.dev_files]
     if args.eval_files:
@@ -384,7 +424,7 @@ def main(command_line_parameters=None):
     if args.cmc:
       logger.info("Plotting CMC curves to file '%s'", args.cmc)
       try:
-        # create a multi-page PDF for the ROC curve
+        # create a multi-page PDF for the CMC curve
         pdf = PdfPages(args.cmc)
         # create a separate figure for dev and eval
         pdf.savefig(_plot_cmc(cmcs_dev, colors, args.legends, args.title[0] if args.title is not None else "CMC curve for development set", args.legend_font_size, args.legend_position), bbox_inches='tight')
@@ -392,7 +432,7 @@ def main(command_line_parameters=None):
           pdf.savefig(_plot_cmc(cmcs_eval, colors, args.legends, args.title[1] if args.title is not None else "CMC curve for evaluation set", args.legend_font_size, args.legend_position), bbox_inches='tight')
         pdf.close()
       except RuntimeError as e:
-        raise RuntimeError("During plotting of ROC curves, the following exception occured:\n%s\nUsually this happens when the label contains characters that LaTeX cannot parse." % e)
+        raise RuntimeError("During plotting of CMC curves, the following exception occured:\n%s\nUsually this happens when the label contains characters that LaTeX cannot parse." % e)
 
     if args.rr:
       logger.info("Computing recognition rate on the development " + ("and on the evaluation set" if args.eval_files else "set"))
@@ -402,3 +442,19 @@ def main(command_line_parameters=None):
         if args.eval_files:
           rr = bob.measure.recognition_rate(cmcs_eval[i], args.thresholds[i])
           print("The Recognition Rate of the development set of '%s' is %2.3f%%" % (args.legends[i], rr * 100.))
+
+    if args.dir:
+      # compute false alarm values to evaluate
+      min_far = int(math.floor(math.log(args.min_far_value, 10)))
+      fars = [math.pow(10., i * 0.25) for i in range(min_far * 4, 0)] + [1.]
+      logger.info("Plotting DIR curves to file '%s'", args.dir)
+      try:
+        # create a multi-page PDF for the DIR curve
+        pdf = PdfPages(args.dir)
+        # create a separate figure for dev and eval
+        pdf.savefig(_plot_dir(cmcs_dev, fars, args.rank, colors, args.legends, args.title[0] if args.title is not None else "DIR curve for development set", args.legend_font_size, args.legend_position), bbox_inches='tight')
+        if args.eval_files:
+          pdf.savefig(_plot_dir(cmcs_eval, fars, args.rank, colors, args.legends, args.title[1] if args.title is not None else "DIR curve for evaluation set", args.legend_font_size, args.legend_position), bbox_inches='tight')
+        pdf.close()
+      except RuntimeError as e:
+        raise RuntimeError("During plotting of DIR curves, the following exception occured:\n%s")
diff --git a/bob/bio/base/test/data/scores-nonorm-dev-openset b/bob/bio/base/test/data/scores-nonorm-dev-openset
new file mode 100644
index 00000000..04769131
--- /dev/null
+++ b/bob/bio/base/test/data/scores-nonorm-dev-openset
@@ -0,0 +1,1000 @@
+3 3 s3/1 2915.37699106
+3 3 s3/3 2198.08257352
+3 3 s3/6 3725.56009212
+3 3 s3/8 3923.53259194
+3 3 s3/10 3281.35520784
+3 4 s4/1 4593.48734623
+3 4 s4/3 4763.32520410
+3 4 s4/6 4935.13393942
+3 4 s4/8 4721.70964800
+3 4 s4/10 3801.80614971
+3 7 s7/1 4735.99915541
+3 7 s7/3 4893.73282883
+3 7 s7/6 4726.88893460
+3 7 s7/8 5008.08047060
+3 7 s7/10 4650.56770728
+3 8 s8/1 5843.10148808
+3 8 s8/3 5674.83982153
+3 8 s8/6 5739.77804449
+3 8 s8/8 5858.49067593
+3 8 s8/10 5410.76565746
+3 9 s9/1 4368.39776119
+3 9 s9/3 4214.54766256
+3 9 s9/6 4734.12357253
+3 9 s9/8 4432.64830547
+3 9 s9/10 3922.38932285
+3 13 s13/1 5116.34410492
+3 13 s13/3 5538.12513401
+3 13 s13/6 4537.41842902
+3 13 s13/8 4981.18831204
+3 13 s13/10 4745.49965757
+3 15 s15/1 4795.29936500
+3 15 s15/3 4823.72698232
+3 15 s15/6 4826.18420701
+3 15 s15/8 5030.10317986
+3 15 s15/10 4379.85502043
+3 18 s18/1 4394.62489867
+3 18 s18/3 4969.12597949
+3 18 s18/6 4945.15581150
+3 18 s18/8 5010.17993689
+3 18 s18/10 4955.47333763
+3 19 s19/1 5574.85524476
+3 19 s19/3 5953.73504617
+3 19 s19/6 5793.52699139
+3 19 s19/8 5821.70645086
+3 19 s19/10 5525.87468189
+3 22 s22/1 5320.28608253
+3 22 s22/3 5112.94553071
+3 22 s22/6 5759.13005583
+3 22 s22/8 5413.43596988
+3 22 s22/10 5729.36584623
+3 23 s23/1 4558.52190957
+3 23 s23/3 4897.26913698
+3 23 s23/6 4778.95856856
+3 23 s23/8 4109.44266294
+3 23 s23/10 4439.30118375
+3 25 s25/1 4085.08188412
+3 25 s25/3 4031.13371150
+3 25 s25/6 4255.67197984
+3 25 s25/8 4992.09154563
+3 25 s25/10 4041.30733798
+3 28 s28/1 5189.92697444
+3 28 s28/3 5179.55413139
+3 28 s28/6 5033.20921481
+3 28 s28/8 4864.09045969
+3 28 s28/10 5663.88788731
+3 30 s30/1 4407.45425387
+3 30 s30/3 4819.81576411
+3 30 s30/6 4456.45172755
+3 30 s30/8 5087.76247480
+3 30 s30/10 4706.95899706
+3 31 s31/1 4605.94626543
+3 31 s31/3 6012.36085078
+3 31 s31/6 4740.99715250
+3 31 s31/8 4587.20285141
+3 31 s31/10 5987.25563176
+3 32 s32/1 5714.79597186
+3 32 s32/3 5864.20830121
+3 32 s32/6 5359.54540983
+3 32 s32/8 5635.99831441
+3 32 s32/10 5212.69776603
+3 35 s35/1 5195.81485428
+3 35 s35/3 5011.40539170
+3 35 s35/6 4653.00397593
+3 35 s35/8 4710.81075825
+3 35 s35/10 4852.58271439
+3 37 s37/1 4903.12604366
+3 37 s37/3 5129.18619276
+3 37 s37/6 5481.63652571
+3 37 s37/8 5138.48537995
+3 37 s37/10 4825.35967571
+3 38 s38/1 4761.21560108
+3 38 s38/3 4717.32074381
+3 38 s38/6 5068.80518466
+3 38 s38/8 4452.82314942
+3 38 s38/10 4629.55645824
+3 40 s40/1 4335.91339858
+3 40 s40/3 4126.24441835
+3 40 s40/6 4808.05802794
+3 40 s40/8 4465.80082404
+3 40 s40/10 4990.20680934
+4 3 s3/1 4048.09646624
+4 3 s3/3 4013.26064441
+4 3 s3/6 4343.19720943
+4 3 s3/8 4416.68880498
+4 3 s3/10 3859.08771603
+4 4 s4/1 3663.81795399
+4 4 s4/3 3939.19852254
+4 4 s4/6 4509.90698352
+4 4 s4/8 3718.33591812
+4 4 s4/10 3739.79063585
+4 7 s7/1 5419.34424077
+4 7 s7/3 5390.47038764
+4 7 s7/6 5253.95251216
+4 7 s7/8 5610.14099645
+4 7 s7/10 5107.09839341
+4 8 s8/1 5748.42613243
+4 8 s8/3 5124.25457994
+4 8 s8/6 5257.00694312
+4 8 s8/8 5125.55977431
+4 8 s8/10 4738.50155640
+4 9 s9/1 4320.94422551
+4 9 s9/3 4211.65098269
+4 9 s9/6 4782.23316036
+4 9 s9/8 4403.20190316
+4 9 s9/10 4257.52604220
+4 13 s13/1 5403.17230893
+4 13 s13/3 5922.15467545
+4 13 s13/6 4995.89291318
+4 13 s13/8 5472.91065156
+4 13 s13/10 5106.55686348
+4 15 s15/1 4807.36123045
+4 15 s15/3 4714.66075132
+4 15 s15/6 4930.23386869
+4 15 s15/8 4708.58683683
+4 15 s15/10 4569.94945267
+4 18 s18/1 4815.76743625
+4 18 s18/3 5143.28912273
+4 18 s18/6 4965.95569855
+4 18 s18/8 5101.29150314
+4 18 s18/10 5146.67873487
+4 19 s19/1 5491.25459253
+4 19 s19/3 6007.58362405
+4 19 s19/6 5856.52653029
+4 19 s19/8 6048.22916233
+4 19 s19/10 5396.44503354
+4 22 s22/1 5245.79889054
+4 22 s22/3 4933.86298959
+4 22 s22/6 5691.65274766
+4 22 s22/8 5327.80151657
+4 22 s22/10 5727.51316018
+4 23 s23/1 4874.57300694
+4 23 s23/3 5294.26397151
+4 23 s23/6 5224.94813371
+4 23 s23/8 4971.11707768
+4 23 s23/10 4852.05657428
+4 25 s25/1 3762.09542675
+4 25 s25/3 3719.78319261
+4 25 s25/6 3781.26486774
+4 25 s25/8 4939.84453197
+4 25 s25/10 3605.58469600
+4 28 s28/1 5844.08281940
+4 28 s28/3 5627.97148180
+4 28 s28/6 5601.64627587
+4 28 s28/8 5522.59359359
+4 28 s28/10 5857.10098940
+4 30 s30/1 4225.57132232
+4 30 s30/3 4680.01730766
+4 30 s30/6 4409.06928954
+4 30 s30/8 4895.47188737
+4 30 s30/10 4535.89340704
+4 31 s31/1 4748.92840544
+4 31 s31/3 5789.32837210
+4 31 s31/6 4513.52567291
+4 31 s31/8 4474.08918105
+4 31 s31/10 5778.18622061
+4 32 s32/1 5594.66540554
+4 32 s32/3 5710.45173344
+4 32 s32/6 5333.17250799
+4 32 s32/8 5545.33849282
+4 32 s32/10 5254.69066644
+4 35 s35/1 5660.85417583
+4 35 s35/3 5234.81269961
+4 35 s35/6 4290.81484103
+4 35 s35/8 4427.54559547
+4 35 s35/10 5426.33439810
+4 37 s37/1 5528.29928640
+4 37 s37/3 5818.64855443
+4 37 s37/6 5866.06674016
+4 37 s37/8 5512.79021912
+4 37 s37/10 5400.01351850
+4 38 s38/1 5091.32909956
+4 38 s38/3 4797.06295560
+4 38 s38/6 5422.96302772
+4 38 s38/8 4731.86876403
+4 38 s38/10 4986.97413268
+4 40 s40/1 4799.25900530
+4 40 s40/3 4619.81828647
+4 40 s40/6 5061.94112965
+4 40 s40/8 4778.30963836
+4 40 s40/10 5421.03790800
+7 3 s3/1 4547.50711929
+7 3 s3/3 4660.79574751
+7 3 s3/6 4755.76912812
+7 3 s3/8 4948.60748090
+7 3 s3/10 4638.28502790
+7 4 s4/1 5136.11662640
+7 4 s4/3 5368.81541869
+7 4 s4/6 5500.63350897
+7 4 s4/8 5367.84016155
+7 4 s4/10 5075.31141902
+7 7 s7/1 3316.07539118
+7 7 s7/3 3414.17940360
+7 7 s7/6 3157.47478216
+7 7 s7/8 4291.28768553
+7 7 s7/10 3342.47902013
+7 8 s8/1 5727.08852734
+7 8 s8/3 5479.08103609
+7 8 s8/6 5569.16259414
+7 8 s8/8 5821.02542513
+7 8 s8/10 5475.16383317
+7 9 s9/1 5111.03971810
+7 9 s9/3 5141.62250656
+7 9 s9/6 5383.78119912
+7 9 s9/8 4989.69167384
+7 9 s9/10 5194.18251508
+7 13 s13/1 6316.17534589
+7 13 s13/3 6391.66112994
+7 13 s13/6 6038.34679362
+7 13 s13/8 6115.59522859
+7 13 s13/10 5880.47557601
+7 15 s15/1 4604.60790948
+7 15 s15/3 4527.70272876
+7 15 s15/6 4738.72366782
+7 15 s15/8 4585.57215623
+7 15 s15/10 4804.06182308
+7 18 s18/1 5853.43745162
+7 18 s18/3 6074.09260713
+7 18 s18/6 5692.91190868
+7 18 s18/8 5984.31758850
+7 18 s18/10 5876.17715866
+7 19 s19/1 5835.07746307
+7 19 s19/3 6287.45393621
+7 19 s19/6 6265.14445165
+7 19 s19/8 5662.23860324
+7 19 s19/10 5866.40733328
+7 22 s22/1 5296.87341740
+7 22 s22/3 5201.58398952
+7 22 s22/6 5329.34996036
+7 22 s22/8 5314.47560913
+7 22 s22/10 5495.95387535
+7 23 s23/1 4595.53914138
+7 23 s23/3 5005.64051846
+7 23 s23/6 5085.30028612
+7 23 s23/8 4573.53637790
+7 23 s23/10 4564.13989707
+7 25 s25/1 5115.93666888
+7 25 s25/3 5193.18813447
+7 25 s25/6 5357.14625524
+7 25 s25/8 5795.12829884
+7 25 s25/10 5287.69259697
+7 28 s28/1 6043.13478254
+7 28 s28/3 6044.56921542
+7 28 s28/6 5902.28709908
+7 28 s28/8 5906.41329404
+7 28 s28/10 6408.48125534
+7 30 s30/1 4732.13049271
+7 30 s30/3 4924.21465820
+7 30 s30/6 4645.33357252
+7 30 s30/8 5226.90376801
+7 30 s30/10 4882.50335381
+7 31 s31/1 5003.19308042
+7 31 s31/3 6028.70442135
+7 31 s31/6 5252.74594855
+7 31 s31/8 5145.27880683
+7 31 s31/10 6122.78596719
+7 32 s32/1 5824.69887634
+7 32 s32/3 6193.41319468
+7 32 s32/6 5234.42652064
+7 32 s32/8 5742.66654090
+7 32 s32/10 5022.67637819
+7 35 s35/1 5575.19093843
+7 35 s35/3 5502.22991159
+7 35 s35/6 5506.26025538
+7 35 s35/8 5257.81684732
+7 35 s35/10 5293.56751161
+7 37 s37/1 5802.33340993
+7 37 s37/3 5975.79526088
+7 37 s37/6 5675.25937733
+7 37 s37/8 5383.19756279
+7 37 s37/10 5736.34517790
+7 38 s38/1 4969.65451515
+7 38 s38/3 4973.19967425
+7 38 s38/6 5186.53583811
+7 38 s38/8 4689.37735739
+7 38 s38/10 4661.73776611
+7 40 s40/1 5457.86286013
+7 40 s40/3 5212.55705005
+7 40 s40/6 5449.14488704
+7 40 s40/8 5415.74436250
+7 40 s40/10 5810.16798380
+8 3 s3/1 5463.49613343
+8 3 s3/3 5881.26534004
+8 3 s3/6 5068.93312246
+8 3 s3/8 5019.59171646
+8 3 s3/10 5918.82800899
+8 4 s4/1 5071.55962205
+8 4 s4/3 5153.68373108
+8 4 s4/6 5405.66240159
+8 4 s4/8 5277.98001133
+8 4 s4/10 6346.43151700
+8 7 s7/1 5859.09813879
+8 7 s7/3 5646.09103717
+8 7 s7/6 5264.26462101
+8 7 s7/8 5381.47962925
+8 7 s7/10 6258.01637901
+8 8 s8/1 1852.38764841
+8 8 s8/3 3994.23409429
+8 8 s8/6 3822.74103230
+8 8 s8/8 4274.80198372
+8 8 s8/10 4440.59005088
+8 9 s9/1 6007.37396872
+8 9 s9/3 6057.28709902
+8 9 s9/6 5248.83768086
+8 9 s9/8 5166.13627385
+8 9 s9/10 6396.69844529
+8 13 s13/1 6159.57644648
+8 13 s13/3 6074.79110752
+8 13 s13/6 6276.45831660
+8 13 s13/8 6090.79223090
+8 13 s13/10 5875.34271341
+8 15 s15/1 5400.88353883
+8 15 s15/3 5170.35153544
+8 15 s15/6 5323.37872032
+8 15 s15/8 5245.38301747
+8 15 s15/10 4583.99552792
+8 18 s18/1 6689.77480936
+8 18 s18/3 5701.92932261
+8 18 s18/6 5613.40725407
+8 18 s18/8 5776.63517976
+8 18 s18/10 5715.05686761
+8 19 s19/1 5826.78487676
+8 19 s19/3 6374.41918923
+8 19 s19/6 6007.45370353
+8 19 s19/8 5348.66067348
+8 19 s19/10 5454.01338466
+8 22 s22/1 5757.47974378
+8 22 s22/3 5770.25987283
+8 22 s22/6 5842.24580106
+8 22 s22/8 5792.68953078
+8 22 s22/10 5981.31707904
+8 23 s23/1 4825.51603458
+8 23 s23/3 5841.88462741
+8 23 s23/6 5424.27506677
+8 23 s23/8 6128.56084248
+8 23 s23/10 4807.79034485
+8 25 s25/1 5491.90231159
+8 25 s25/3 5627.62383249
+8 25 s25/6 5394.70749902
+8 25 s25/8 5459.25406993
+8 25 s25/10 5709.54464034
+8 28 s28/1 5870.09889184
+8 28 s28/3 5860.05238884
+8 28 s28/6 5850.76165982
+8 28 s28/8 6876.91929573
+8 28 s28/10 6164.75263088
+8 30 s30/1 5418.36377516
+8 30 s30/3 5544.38734217
+8 30 s30/6 5324.33047434
+8 30 s30/8 5818.69023063
+8 30 s30/10 5235.46062921
+8 31 s31/1 6190.44667209
+8 31 s31/3 6542.20467427
+8 31 s31/6 6131.17729315
+8 31 s31/8 6198.49731790
+8 31 s31/10 6500.07269190
+8 32 s32/1 5899.56083111
+8 32 s32/3 5802.84016668
+8 32 s32/6 5224.61405273
+8 32 s32/8 5153.73806086
+8 32 s32/10 5097.85651034
+8 35 s35/1 6150.31096775
+8 35 s35/3 5552.10887862
+8 35 s35/6 5540.33979102
+8 35 s35/8 5469.50482219
+8 35 s35/10 5978.10588732
+8 37 s37/1 6404.46063303
+8 37 s37/3 6460.87331558
+8 37 s37/6 6298.55348473
+8 37 s37/8 5952.06325571
+8 37 s37/10 6151.83509207
+8 38 s38/1 4914.14051488
+8 38 s38/3 4956.73138268
+8 38 s38/6 5137.97148688
+8 38 s38/8 5488.61612795
+8 38 s38/10 5227.97723790
+8 40 s40/1 6227.74951327
+8 40 s40/3 6257.40553265
+8 40 s40/6 5641.62928594
+8 40 s40/8 5820.00085911
+8 40 s40/10 5409.03605091
+9 3 s3/1 4006.14490502
+9 3 s3/3 4387.83944556
+9 3 s3/6 4301.73034952
+9 3 s3/8 4493.85246754
+9 3 s3/10 4583.63065702
+9 4 s4/1 4054.62156064
+9 4 s4/3 4377.70727665
+9 4 s4/6 4959.40813001
+9 4 s4/8 4393.64677688
+9 4 s4/10 4487.09393706
+9 7 s7/1 5112.41352005
+9 7 s7/3 5196.95516625
+9 7 s7/6 5077.56802022
+9 7 s7/8 5157.37278079
+9 7 s7/10 5130.30583884
+9 8 s8/1 5640.50113022
+9 8 s8/3 5288.17463781
+9 8 s8/6 5635.84226181
+9 8 s8/8 5445.72061347
+9 8 s8/10 5134.69853059
+9 9 s9/1 2838.15485835
+9 9 s9/3 2413.77049448
+9 9 s9/6 3753.16666297
+9 9 s9/8 3283.64660096
+9 9 s9/10 3463.86229518
+9 13 s13/1 5674.80228730
+9 13 s13/3 6270.98748205
+9 13 s13/6 5550.79111479
+9 13 s13/8 5821.60484746
+9 13 s13/10 5526.70453344
+9 15 s15/1 5036.25773765
+9 15 s15/3 4968.56599030
+9 15 s15/6 5149.03136522
+9 15 s15/8 5130.54597485
+9 15 s15/10 4310.29581351
+9 18 s18/1 5724.79397009
+9 18 s18/3 5489.02459459
+9 18 s18/6 5572.64174337
+9 18 s18/8 5479.59241185
+9 18 s18/10 5290.66819976
+9 19 s19/1 5967.41007473
+9 19 s19/3 6530.60188650
+9 19 s19/6 6248.94671125
+9 19 s19/8 6398.89381065
+9 19 s19/10 5795.00327869
+9 22 s22/1 5271.74752810
+9 22 s22/3 4991.07182878
+9 22 s22/6 5471.72815480
+9 22 s22/8 5284.24952098
+9 22 s22/10 5667.61687131
+9 23 s23/1 4252.15004439
+9 23 s23/3 4053.49466510
+9 23 s23/6 4630.02343407
+9 23 s23/8 4296.81800871
+9 23 s23/10 4367.78055767
+9 25 s25/1 3636.89537930
+9 25 s25/3 3674.33408933
+9 25 s25/6 3974.29364793
+9 25 s25/8 4996.09307359
+9 25 s25/10 3657.56763437
+9 28 s28/1 6113.99787373
+9 28 s28/3 5873.92654023
+9 28 s28/6 5861.30659495
+9 28 s28/8 6017.28526829
+9 28 s28/10 6323.63170971
+9 30 s30/1 3759.00957700
+9 30 s30/3 3848.59896586
+9 30 s30/6 3892.35507116
+9 30 s30/8 4410.52049083
+9 30 s30/10 3917.35229460
+9 31 s31/1 3981.03340855
+9 31 s31/3 6088.26798030
+9 31 s31/6 4571.48116041
+9 31 s31/8 4160.56101986
+9 31 s31/10 6126.35242212
+9 32 s32/1 6294.10366931
+9 32 s32/3 6339.36029896
+9 32 s32/6 5783.45787570
+9 32 s32/8 6037.37434652
+9 32 s32/10 5697.96454885
+9 35 s35/1 4651.39419959
+9 35 s35/3 5589.54846119
+9 35 s35/6 4659.66565324
+9 35 s35/8 4223.84564112
+9 35 s35/10 5544.75544997
+9 37 s37/1 5867.44484422
+9 37 s37/3 6082.60380100
+9 37 s37/6 6184.75795808
+9 37 s37/8 5896.29069840
+9 37 s37/10 5932.32719934
+9 38 s38/1 4274.81110694
+9 38 s38/3 4081.14162950
+9 38 s38/6 4447.71087190
+9 38 s38/8 3844.63652378
+9 38 s38/10 3853.71029010
+9 40 s40/1 4460.74309953
+9 40 s40/3 4656.37165613
+9 40 s40/6 3937.79506831
+9 40 s40/8 3995.57317540
+9 40 s40/10 4883.37260508
+13 3 s3/1 4875.47269503
+13 3 s3/3 5175.63348780
+13 3 s3/6 5189.72744949
+13 3 s3/8 5119.46178812
+13 3 s3/10 5470.63917655
+13 4 s4/1 5216.47898491
+13 4 s4/3 5192.14926596
+13 4 s4/6 5333.25435358
+13 4 s4/8 5210.71597768
+13 4 s4/10 6048.25503761
+13 7 s7/1 6587.06770878
+13 7 s7/3 6534.96212690
+13 7 s7/6 6282.49440907
+13 7 s7/8 6506.60026435
+13 7 s7/10 6253.85920852
+13 8 s8/1 6290.95954525
+13 8 s8/3 6490.43203493
+13 8 s8/6 6417.94741331
+13 8 s8/8 6424.16656073
+13 8 s8/10 6541.94420643
+13 9 s9/1 6091.12649680
+13 9 s9/3 5954.22631414
+13 9 s9/6 5906.95632285
+13 9 s9/8 5620.91682913
+13 9 s9/10 6197.66464081
+13 13 s13/1 2386.22924297
+13 13 s13/3 4036.88431838
+13 13 s13/6 3805.73974412
+13 13 s13/8 3726.97169294
+13 13 s13/10 3292.50056948
+13 15 s15/1 5778.09008237
+13 15 s15/3 5818.97061343
+13 15 s15/6 5604.24562274
+13 15 s15/8 6078.41517174
+13 15 s15/10 5094.60744317
+13 18 s18/1 5244.50026218
+13 18 s18/3 4298.43948428
+13 18 s18/6 4616.24598565
+13 18 s18/8 4163.33688284
+13 18 s18/10 4659.76962950
+13 19 s19/1 5379.57637737
+13 19 s19/3 5285.12667776
+13 19 s19/6 5095.12865392
+13 19 s19/8 5321.04604378
+13 19 s19/10 5252.35394847
+13 22 s22/1 6475.90233095
+13 22 s22/3 6438.99611741
+13 22 s22/6 6807.75557728
+13 22 s22/8 6542.09232585
+13 22 s22/10 6245.14419369
+13 23 s23/1 6101.10539165
+13 23 s23/3 6464.78073874
+13 23 s23/6 6006.06976316
+13 23 s23/8 6742.16330268
+13 23 s23/10 6073.20640189
+13 25 s25/1 4925.68360738
+13 25 s25/3 4809.54363739
+13 25 s25/6 4371.80866461
+13 25 s25/8 4588.55805237
+13 25 s25/10 4904.70855403
+13 28 s28/1 4598.39939544
+13 28 s28/3 4816.85270690
+13 28 s28/6 4735.73859076
+13 28 s28/8 5224.31593608
+13 28 s28/10 4514.05128460
+13 30 s30/1 6513.68958425
+13 30 s30/3 6698.41466319
+13 30 s30/6 6459.47157281
+13 30 s30/8 6623.22866886
+13 30 s30/10 6449.31453722
+13 31 s31/1 6602.70156830
+13 31 s31/3 6171.66606355
+13 31 s31/6 6069.84719742
+13 31 s31/8 6336.40221261
+13 31 s31/10 6271.01339498
+13 32 s32/1 5749.68799153
+13 32 s32/3 5380.34422691
+13 32 s32/6 5656.66615596
+13 32 s32/8 5366.91941434
+13 32 s32/10 5555.10710968
+13 35 s35/1 5223.20581635
+13 35 s35/3 5128.17950154
+13 35 s35/6 4914.26525536
+13 35 s35/8 5140.09036886
+13 35 s35/10 5529.25673124
+13 37 s37/1 4678.40507011
+13 37 s37/3 4580.72723484
+13 37 s37/6 5304.15026182
+13 37 s37/8 5209.55190012
+13 37 s37/10 4587.82508385
+13 38 s38/1 6140.76143487
+13 38 s38/3 5685.85209094
+13 38 s38/6 6347.02331806
+13 38 s38/8 6328.72317296
+13 38 s38/10 5928.37549418
+13 40 s40/1 4675.91552533
+13 40 s40/3 5250.29789631
+13 40 s40/6 4512.21331499
+13 40 s40/8 4465.36583048
+13 40 s40/10 4420.14332347
+15 3 s3/1 4228.92066608
+15 3 s3/3 4530.28718736
+15 3 s3/6 4320.43389025
+15 3 s3/8 4405.13711478
+15 3 s3/10 4711.76601711
+15 4 s4/1 4065.27994116
+15 4 s4/3 4260.79476154
+15 4 s4/6 4645.01474702
+15 4 s4/8 4323.28960399
+15 4 s4/10 4883.38827045
+15 7 s7/1 4928.63682979
+15 7 s7/3 4791.71493309
+15 7 s7/6 4558.92070561
+15 7 s7/8 4682.20962794
+15 7 s7/10 4920.22001541
+15 8 s8/1 4603.31576149
+15 8 s8/3 5154.69184336
+15 8 s8/6 5367.86056078
+15 8 s8/8 5180.61367021
+15 8 s8/10 5243.76086411
+15 9 s9/1 4571.56734611
+15 9 s9/3 4563.98389568
+15 9 s9/6 4231.21483737
+15 9 s9/8 3941.90157158
+15 9 s9/10 4696.34719756
+15 13 s13/1 4933.64996732
+15 13 s13/3 4965.15508318
+15 13 s13/6 5004.52924859
+15 13 s13/8 4907.69783096
+15 13 s13/10 4744.68692329
+15 15 s15/1 4504.51007325
+15 15 s15/3 4390.45179907
+15 15 s15/6 4465.37602000
+15 15 s15/8 4124.67295673
+15 15 s15/10 2118.67198971
+15 18 s18/1 5237.39524955
+15 18 s18/3 4283.67482426
+15 18 s18/6 4387.91784335
+15 18 s18/8 4264.28845178
+15 18 s18/10 4465.66736334
+15 19 s19/1 5428.66852921
+15 19 s19/3 5775.01099566
+15 19 s19/6 5652.10898692
+15 19 s19/8 5617.01673489
+15 19 s19/10 5313.35769547
+15 22 s22/1 4867.23648491
+15 22 s22/3 4738.44710849
+15 22 s22/6 4905.17400303
+15 22 s22/8 4904.40577440
+15 22 s22/10 5055.64951317
+15 23 s23/1 4012.45847331
+15 23 s23/3 4484.76286999
+15 23 s23/6 4090.97347828
+15 23 s23/8 4708.44093092
+15 23 s23/10 4117.70761468
+15 25 s25/1 3957.65650354
+15 25 s25/3 4192.03315827
+15 25 s25/6 4149.18534173
+15 25 s25/8 4419.11744583
+15 25 s25/10 4332.19597895
+15 28 s28/1 5295.93079638
+15 28 s28/3 5275.72592161
+15 28 s28/6 5183.53007129
+15 28 s28/8 5774.26488828
+15 28 s28/10 5675.51891901
+15 30 s30/1 3930.40201506
+15 30 s30/3 4158.61166737
+15 30 s30/6 3792.90851458
+15 30 s30/8 4273.64294250
+15 30 s30/10 3879.40227355
+15 31 s31/1 4393.72598144
+15 31 s31/3 5171.52956097
+15 31 s31/6 4469.53834305
+15 31 s31/8 4449.02832088
+15 31 s31/10 5285.37501035
+15 32 s32/1 5394.18316337
+15 32 s32/3 5229.42884071
+15 32 s32/6 5049.35481027
+15 32 s32/8 5054.60502908
+15 32 s32/10 4940.17054361
+15 35 s35/1 4182.12111255
+15 35 s35/3 4030.92408760
+15 35 s35/6 4407.73309083
+15 35 s35/8 4004.81997098
+15 35 s35/10 4287.09108837
+15 37 s37/1 5238.54617237
+15 37 s37/3 5310.70183686
+15 37 s37/6 5557.32525591
+15 37 s37/8 5297.47496455
+15 37 s37/10 5279.50272280
+15 38 s38/1 4314.32323777
+15 38 s38/3 4234.71156043
+15 38 s38/6 4450.34841333
+15 38 s38/8 4454.78832269
+15 38 s38/10 4318.88689363
+15 40 s40/1 4474.80904621
+15 40 s40/3 4447.91299375
+15 40 s40/6 4273.03697620
+15 40 s40/8 4366.64722642
+15 40 s40/10 4031.56706505
+18 3 s3/1 4594.38211297
+18 3 s3/3 4215.23961359
+18 3 s3/6 4930.28579293
+18 3 s3/8 4990.70295650
+18 3 s3/10 4366.12047475
+18 4 s4/1 5143.72063783
+18 4 s4/3 5253.04702054
+18 4 s4/6 4959.44140000
+18 4 s4/8 5090.89579544
+18 4 s4/10 4542.34124654
+18 7 s7/1 5436.85626074
+18 7 s7/3 5439.10792318
+18 7 s7/6 5543.79139218
+18 7 s7/8 5784.41976347
+18 7 s7/10 5017.41586875
+18 8 s8/1 6295.85903591
+18 8 s8/3 5832.93828186
+18 8 s8/6 5843.73185559
+18 8 s8/8 5806.10824908
+18 8 s8/10 5544.32042725
+18 9 s9/1 5620.60646194
+18 9 s9/3 5479.25925651
+18 9 s9/6 5837.53937888
+18 9 s9/8 5328.36888738
+18 9 s9/10 4845.51070580
+18 13 s13/1 4552.54906618
+18 13 s13/3 4647.58517942
+18 13 s13/6 3629.54432402
+18 13 s13/8 4393.25881323
+18 13 s13/10 4165.65637085
+18 15 s15/1 5366.14871207
+18 15 s15/3 5413.41149369
+18 15 s15/6 5348.41471840
+18 15 s15/8 5522.04237579
+18 15 s15/10 4951.93820640
+18 18 s18/1 2543.34110964
+18 18 s18/3 4006.31264382
+18 18 s18/6 3804.21949945
+18 18 s18/8 3875.04361266
+18 18 s18/10 4056.80736540
+18 19 s19/1 5578.93385872
+18 19 s19/3 5566.08111691
+18 19 s19/6 5810.01815832
+18 19 s19/8 5569.47430194
+18 19 s19/10 5722.38822521
+18 22 s22/1 6720.29701725
+18 22 s22/3 6562.26515770
+18 22 s22/6 7174.90522585
+18 22 s22/8 6803.90439380
+18 22 s22/10 6886.72251510
+18 23 s23/1 5680.87352438
+18 23 s23/3 5756.95692185
+18 23 s23/6 5822.56240842
+18 23 s23/8 5274.72075090
+18 23 s23/10 5706.59960046
+18 25 s25/1 4326.58641425
+18 25 s25/3 4177.47304001
+18 25 s25/6 4218.27405463
+18 25 s25/8 4917.27058438
+18 25 s25/10 4173.23891001
+18 28 s28/1 5424.89096665
+18 28 s28/3 5544.76013909
+18 28 s28/6 5405.19537112
+18 28 s28/8 5077.34497548
+18 28 s28/10 5624.08036927
+18 30 s30/1 5815.62490193
+18 30 s30/3 6205.18267257
+18 30 s30/6 5822.27326738
+18 30 s30/8 6451.99449783
+18 30 s30/10 6070.63530448
+18 31 s31/1 6275.69605701
+18 31 s31/3 6042.07257487
+18 31 s31/6 5890.94949902
+18 31 s31/8 6053.47437427
+18 31 s31/10 6009.36053170
+18 32 s32/1 4913.63236313
+18 32 s32/3 5165.70914783
+18 32 s32/6 5352.50586174
+18 32 s32/8 5252.33957394
+18 32 s32/10 5494.55293905
+18 35 s35/1 5627.57709854
+18 35 s35/3 5230.80758583
+18 35 s35/6 4395.33752970
+18 35 s35/8 4606.89439862
+18 35 s35/10 5066.11261225
+18 37 s37/1 5048.76826563
+18 37 s37/3 5223.17709828
+18 37 s37/6 6118.06627947
+18 37 s37/8 5972.22990180
+18 37 s37/10 4925.60777976
+18 38 s38/1 6129.36962501
+18 38 s38/3 6147.37952302
+18 38 s38/6 6356.92677321
+18 38 s38/8 5719.25711959
+18 38 s38/10 5990.98581203
+18 40 s40/1 4017.45528911
+18 40 s40/3 3535.49586338
+18 40 s40/6 4584.68384951
+18 40 s40/8 4237.69406635
+18 40 s40/10 5070.39544809
+19 3 s3/1 5437.44250544
+19 3 s3/3 5637.11247005
+19 3 s3/6 5426.82024762
+19 3 s3/8 5550.44718919
+19 3 s3/10 5592.01287552
+19 4 s4/1 5603.08379377
+19 4 s4/3 5164.17457102
+19 4 s4/6 4877.38833804
+19 4 s4/8 5135.89894760
+19 4 s4/10 5874.75139900
+19 7 s7/1 6400.83525800
+19 7 s7/3 6287.73830562
+19 7 s7/6 6011.11445574
+19 7 s7/8 6502.39755782
+19 7 s7/10 6050.27751430
+19 8 s8/1 6176.81009907
+19 8 s8/3 5889.87122100
+19 8 s8/6 5770.51141581
+19 8 s8/8 5552.83504167
+19 8 s8/10 5941.51925016
+19 9 s9/1 6235.32845967
+19 9 s9/3 6046.01124710
+19 9 s9/6 6116.19865603
+19 9 s9/8 6184.09613444
+19 9 s9/10 6349.76251524
+19 13 s13/1 5030.71992860
+19 13 s13/3 5174.08040139
+19 13 s13/6 5247.83917437
+19 13 s13/8 4917.32478081
+19 13 s13/10 5122.65722062
+19 15 s15/1 4828.64867225
+19 15 s15/3 4710.05753680
+19 15 s15/6 4585.96511108
+19 15 s15/8 5149.14983274
+19 15 s15/10 5472.39856005
+19 18 s18/1 5644.58590155
+19 18 s18/3 5208.63331403
+19 18 s18/6 5172.94268285
+19 18 s18/8 5087.84129076
+19 18 s18/10 5589.33019243
+19 19 s19/1 1862.67146862
+19 19 s19/3 2492.18839577
+19 19 s19/6 3493.54962753
+19 19 s19/8 4407.45119088
+19 19 s19/10 2716.94884015
+19 22 s22/1 5779.88079462
+19 22 s22/3 5901.72178267
+19 22 s22/6 6407.55827129
+19 22 s22/8 6064.95136007
+19 22 s22/10 5762.56114935
+19 23 s23/1 6524.63056425
+19 23 s23/3 6734.59360318
+19 23 s23/6 6394.09235154
+19 23 s23/8 6813.16527027
+19 23 s23/10 6305.76030309
+19 25 s25/1 5532.19558584
+19 25 s25/3 5242.00314765
+19 25 s25/6 5110.60250851
+19 25 s25/8 5054.46634176
+19 25 s25/10 5270.09990418
+19 28 s28/1 5514.16884036
+19 28 s28/3 5503.89053307
+19 28 s28/6 5656.67614417
+19 28 s28/8 5925.65557555
+19 28 s28/10 5199.28187349
+19 30 s30/1 6222.57028888
+19 30 s30/3 6597.99484692
+19 30 s30/6 6233.52147666
+19 30 s30/8 6350.19913074
+19 30 s30/10 6153.12709116
+19 31 s31/1 6605.90364750
+19 31 s31/3 5066.93664851
+19 31 s31/6 5662.34862932
+19 31 s31/8 6199.01476043
+19 31 s31/10 5419.78763422
+19 32 s32/1 5226.51805699
+19 32 s32/3 4426.54278190
+19 32 s32/6 4975.45867232
+19 32 s32/8 4592.05607544
+19 32 s32/10 4851.39031619
+19 35 s35/1 6307.73588540
+19 35 s35/3 5181.67752760
+19 35 s35/6 4945.13316302
+19 35 s35/8 5326.90228932
+19 35 s35/10 5892.27774294
+19 37 s37/1 5902.10106657
+19 37 s37/3 5971.60707013
+19 37 s37/6 5252.80563128
+19 37 s37/8 5191.39961860
+19 37 s37/10 5447.09170108
+19 38 s38/1 6670.34286975
+19 38 s38/3 6382.99514335
+19 38 s38/6 6887.15122529
+19 38 s38/8 6741.52697836
+19 38 s38/10 6577.49412771
+19 40 s40/1 5899.44565192
+19 40 s40/3 6033.55077877
+19 40 s40/6 5899.71100987
+19 40 s40/8 5826.40515241
+19 40 s40/10 5833.24798033
+22 3 s3/1 5190.25847141
+22 3 s3/3 5495.19162541
+22 3 s3/6 5738.48969678
+22 3 s3/8 5687.55923046
+22 3 s3/10 5833.38958068
+22 4 s4/1 5294.55040584
+22 4 s4/3 5084.08762710
+22 4 s4/6 5821.78726853
+22 4 s4/8 5183.04119220
+22 4 s4/10 6128.90740671
+22 7 s7/1 6004.17221605
+22 7 s7/3 6141.33658091
+22 7 s7/6 5805.96029955
+22 7 s7/8 6031.76872899
+22 7 s7/10 6202.76341641
+22 8 s8/1 6013.51818822
+22 8 s8/3 6598.93938448
+22 8 s8/6 6597.09390565
+22 8 s8/8 6599.14456578
+22 8 s8/10 6582.71349825
+22 9 s9/1 5359.37057872
+22 9 s9/3 5345.70107657
+22 9 s9/6 5483.33292806
+22 9 s9/8 5705.84866606
+22 9 s9/10 5937.90771232
+22 13 s13/1 5987.98388441
+22 13 s13/3 6209.33200916
+22 13 s13/6 6389.19948037
+22 13 s13/8 6450.61214149
+22 13 s13/10 6200.28942873
+22 15 s15/1 4921.48900232
+22 15 s15/3 4755.85512816
+22 15 s15/6 4946.88993207
+22 15 s15/8 4666.23167020
+22 15 s15/10 4737.21183820
+22 18 s18/1 7048.69335409
+22 18 s18/3 6430.18187923
+22 18 s18/6 6584.47811144
+22 18 s18/8 6469.92681566
+22 18 s18/10 6792.34363088
+22 19 s19/1 5481.64072154
+22 19 s19/3 5980.19222099
+22 19 s19/6 5561.52488082
+22 19 s19/8 5979.88662100
+22 19 s19/10 5188.72922786
+22 22 s22/1 2617.90183162
+22 22 s22/3 3123.85467012
+22 22 s22/6 2985.79620872
+22 22 s22/8 3121.59975013
+22 22 s22/10 2624.46013496
+22 23 s23/1 5934.79317247
+22 23 s23/3 5606.03826245
+22 23 s23/6 5358.47879533
+22 23 s23/8 6153.82848315
+22 23 s23/10 5766.26161391
+22 25 s25/1 5809.43233027
+22 25 s25/3 5884.17326393
+22 25 s25/6 5573.15673564
+22 25 s25/8 5634.92076253
+22 25 s25/10 5882.77307058
+22 28 s28/1 5634.35994590
+22 28 s28/3 5463.86227865
+22 28 s28/6 5518.26195464
+22 28 s28/8 5917.94153401
+22 28 s28/10 5803.91367958
+22 30 s30/1 4735.89410777
+22 30 s30/3 4964.82789228
+22 30 s30/6 4784.31290783
+22 30 s30/8 4338.30946337
+22 30 s30/10 4636.49512024
+22 31 s31/1 5058.46943255
+22 31 s31/3 4905.78056990
+22 31 s31/6 4704.30249878
+22 31 s31/8 4880.73150255
+22 31 s31/10 5016.54622225
+22 32 s32/1 6676.87254633
+22 32 s32/3 6270.33611539
+22 32 s32/6 5991.93215916
+22 32 s32/8 6046.71456247
+22 32 s32/10 5695.67010983
+22 35 s35/1 5765.74678598
+22 35 s35/3 4913.02350900
+22 35 s35/6 5770.18491905
+22 35 s35/8 5794.17863032
+22 35 s35/10 6165.04914822
+22 37 s37/1 5805.67300147
+22 37 s37/3 5861.86156438
+22 37 s37/6 5003.12192536
+22 37 s37/8 4587.70792444
+22 37 s37/10 5776.03566471
+22 38 s38/1 5643.43565570
+22 38 s38/3 5201.67078928
+22 38 s38/6 5812.37232118
+22 38 s38/8 5819.60084542
+22 38 s38/10 5310.76312784
+22 40 s40/1 5997.00433550
+22 40 s40/3 6416.15079312
+22 40 s40/6 5991.85196746
+22 40 s40/8 6015.42442393
+22 40 s40/10 5754.37868062
diff --git a/bob/bio/base/test/test_scripts.py b/bob/bio/base/test/test_scripts.py
index 214ebc89..d654e306 100644
--- a/bob/bio/base/test/test_scripts.py
+++ b/bob/bio/base/test/test_scripts.py
@@ -462,10 +462,10 @@ def test_fusion():
 
 
 
-def test_evaluate():
+def test_evaluate_closedset():
   # tests our 'evaluate' script using the reference files
   test_dir = tempfile.mkdtemp(prefix='bobtest_')
-  reference_files = ('scores-nonorm-dev', 'scores-ztnorm-dev')
+  reference_files = [os.path.join(data_dir, s) for s in ('scores-nonorm-dev', 'scores-ztnorm-dev')]
   plots = [os.path.join(test_dir, '%s.pdf')%f for f in ['roc', 'cmc', 'det', 'epc']]
   parameters = [
     '--dev-files', reference_files[0], reference_files[1],
@@ -495,6 +495,32 @@ def test_evaluate():
     if os.path.exists(test_dir):
       shutil.rmtree(test_dir)
 
+def test_evaluate_openset():
+  # tests our 'evaluate' script using the reference files
+  test_dir = tempfile.mkdtemp(prefix='bobtest_')
+  reference_file = os.path.join(data_dir, 'scores-nonorm-dev-openset')
+  plot = os.path.join(test_dir, 'dir.pdf')
+  parameters = [
+    '--dev-files', reference_file,
+    '--eval-files', reference_file,
+    '--directory', os.path.join(data_dir),
+    '--legends', 'Test',
+    '--dir', plot,
+    '--min-far-value', '1e-6',
+    '-v',
+  ]
+
+  # execute the script
+  from bob.bio.base.script.evaluate import main
+  try:
+    main(parameters)
+    assert os.path.exists(plot)
+    os.remove(plot)
+  finally:
+    if os.path.exists(test_dir):
+      shutil.rmtree(test_dir)
+
+
 
 
 def test_resources():
diff --git a/doc/experiments.rst b/doc/experiments.rst
index c5366e47..b71725bf 100644
--- a/doc/experiments.rst
+++ b/doc/experiments.rst
@@ -144,7 +144,7 @@ Evaluating Experiments
 ----------------------
 After the experiment has finished successfully, one or more text file containing all the scores are written.
 
-To evaluate the experiment, you can use the generic ``evaluate.py`` script, which has properties for all prevalent evaluation types, such as CMC, ROC and DET plots, as well as computing recognition rates, EER/HTER, Cllr and minDCF.
+To evaluate the experiment, you can use the generic ``evaluate.py`` script, which has properties for all prevalent evaluation types, such as CMC, DIR, ROC and DET plots, as well as computing recognition rates, EER/HTER, Cllr and minDCF.
 Additionally, a combination of different algorithms can be plotted into the same files.
 Just specify all the score files that you want to evaluate using the ``--dev-files`` option, and possible legends for the plots (in the same order) using the ``--legends`` option, and the according plots will be generated.
 For example, to create a ROC curve for the experiment above, use:
-- 
GitLab