Source code for calculus.scoring.ubpa
# -*- coding: UTF-8 -*-
"""
:filename: sppas.src.calculus.scoring.ubpa.py
:author: Brigitte Bigi
:contact: develop@sppas.org
:summary: Estimates the Unit Boundary Positioning Accuracy.
.. _This file is part of SPPAS: http://www.sppas.org/
..
-------------------------------------------------------------------------
___ __ __ __ ___
/ | \ | \ | \ / the automatic
\__ |__/ |__/ |___| \__ annotation and
\ | | | | \ analysis
___/ | | | | ___/ of speech
Copyright (C) 2011-2021 Brigitte Bigi
Laboratoire Parole et Langage, Aix-en-Provence, France
Use of this software is governed by the GNU Public License, version 3.
SPPAS is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
SPPAS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SPPAS. If not, see <http://www.gnu.org/licenses/>.
This banner notice must not be removed.
-------------------------------------------------------------------------
"""
import sys
def _eval_index(step, value):
m = (value % step) # Estimate the rest
d = (value-m) # Make "d" an entire value
index = d/step # evaluate the index depending on step
return int(index)
def _inc(vector, idx):
if idx >= len(vector):
toadd = idx - len(vector) + 1
vector.extend([0]*toadd)
vector[idx] += 1
[docs]def ubpa(vector, text, fp=sys.stdout, delta_max=0.04, step=0.01):
"""Estimate the Unit Boundary Positioning Accuracy.
:param vector: contains the list of the delta values.
:param text: one of "Duration", "Position Start", ...
:param fp: a file pointer
:param delta_max: Maximum delta duration to print result (default: 40ms)
:param step: Delta time (default: 10ms)
:returns: (tab_neg, tab_pos) with number of occurrences of each position
"""
# Estimates the UBPA
tab_neg = []
tab_pos = []
for delta in vector:
if delta > 0.:
idx = _eval_index(step, delta)
_inc(tab_pos, idx)
else:
idx = _eval_index(step, delta*-1.)
_inc(tab_neg, idx)
# Print the result
nb_values = len(vector)
verif_values = 0
fp.write("|--------------------------------------------| \n")
fp.write("| Unit Boundary Positioning Accuracy | \n")
fp.write("| Delta=T(hyp)-T(ref) | \n")
fp.write("|--------------------------------------------| \n")
i = len(tab_neg)-1
percentsum = 0
for value in reversed(tab_neg):
verif_values += value
if (i+1)*step <= delta_max:
percent = (value*100.) / nb_values
fp.write("| Delta-%s < -%.3f: %d (%.2f%%) \n" % (text, (i+1)*step, value, percent))
percentsum += percent
i -= 1
fp.write("|--------------------------------------------| \n")
for i, value in enumerate(tab_pos):
verif_values += value
if (i+1)*step <= delta_max:
percent = round(((value*100.)/nb_values), 3)
fp.write("| Delta-%s < +%.3f: " % (text, ((i+1)*step)))
fp.write("%d (%.2f%%)\n" % (value, percent))
percentsum += percent
fp.write("|--------------------------------------------| \n")
fp.write("| Total: {0:.2f} % | \n"
"".format(round(percentsum, 3)))
fp.write("|--------------------------------------------| \n")