import numpy as np
from typing import Dict
from .estimator import Estimator
[docs]def aggregate(posterior_mode, ue_name, token_level_data) -> np.ndarray:
key = posterior_mode + "_token_level_scores"
ue = token_level_data[key][ue_name]
weights = token_level_data["weights"]
return (weights * ue).sum(-1)
[docs]def all_token_estimators():
return [
PETtu(),
PETdu(),
PETmi(),
PETrmi(),
PETepkl(),
PETent5(),
PETent10(),
PETent15(),
EPTtu(),
EPTdu(),
EPTmi(),
EPTrmi(),
EPTepkl(),
EPTent5(),
EPTent10(),
EPTent15(),
]
[docs]class EnsembleEstimator(Estimator):
def __init__(self):
super().__init__(["ensemble_token_scores"], "sequence")
def __str__(self):
raise NotImplementedError
def __call__(self, stats: Dict[str, np.ndarray]) -> np.ndarray:
stats["ensemble_token_scores"]
ue = aggregate(
self.posterior_mode, self.ue_name, stats["ensemble_token_scores"]
)
return np.array(ue)
[docs]class EPEnsembleEstimator(EnsembleEstimator):
def __init__(self):
self.posterior_mode = "ep"
super().__init__()
[docs]class EPTtu(EPEnsembleEstimator):
def __init__(self):
self.ue_name = "total_uncertainty"
super().__init__()
def __str__(self):
return "EPTtu"
[docs]class EPTdu(EPEnsembleEstimator):
def __init__(self):
self.ue_name = "data_uncertainty"
super().__init__()
def __str__(self):
return "EPTdu"
[docs]class EPTmi(EPEnsembleEstimator):
def __init__(self):
self.ue_name = "mutual_information"
super().__init__()
def __str__(self):
return "EPTmi"
[docs]class EPTrmi(EPEnsembleEstimator):
def __init__(self):
self.ue_name = "rmi"
super().__init__()
def __str__(self):
return "EPTrmi"
[docs]class EPTepkl(EPEnsembleEstimator):
def __init__(self):
self.ue_name = "epkl"
super().__init__()
def __str__(self):
return "EPTepkl"
[docs]class EPTent5(EPEnsembleEstimator):
def __init__(self):
self.ue_name = "entropy_top5"
super().__init__()
def __str__(self):
return "EPTent5"
[docs]class EPTent10(EPEnsembleEstimator):
def __init__(self):
self.ue_name = "entropy_top10"
super().__init__()
def __str__(self):
return "EPTent10"
[docs]class EPTent15(EPEnsembleEstimator):
def __init__(self):
self.ue_name = "entropy_top15"
super().__init__()
def __str__(self):
return "EPTent15"
[docs]class PEEnsembleEstimator(EnsembleEstimator):
def __init__(self):
self.posterior_mode = "pe"
super().__init__()
[docs]class PETtu(PEEnsembleEstimator):
def __init__(self):
self.ue_name = "total_uncertainty"
super().__init__()
def __str__(self):
return "PETtu"
[docs]class PETdu(PEEnsembleEstimator):
def __init__(self):
self.ue_name = "data_uncertainty"
super().__init__()
def __str__(self):
return "PETdu"
[docs]class PETmi(PEEnsembleEstimator):
def __init__(self):
self.ue_name = "mutual_information"
super().__init__()
def __str__(self):
return "PETmi"
[docs]class PETrmi(PEEnsembleEstimator):
def __init__(self):
self.ue_name = "rmi"
super().__init__()
def __str__(self):
return "PETrmi"
[docs]class PETepkl(PEEnsembleEstimator):
def __init__(self):
self.ue_name = "epkl"
super().__init__()
def __str__(self):
return "PETepkl"
[docs]class PETent5(PEEnsembleEstimator):
def __init__(self):
self.ue_name = "entropy_top5"
super().__init__()
def __str__(self):
return "PETent5"
[docs]class PETent10(PEEnsembleEstimator):
def __init__(self):
self.ue_name = "entropy_top10"
super().__init__()
def __str__(self):
return "PETent10"
[docs]class PETent15(PEEnsembleEstimator):
def __init__(self):
self.ue_name = "entropy_top15"
super().__init__()
def __str__(self):
return "PETent15"