Source code for scorers.positive_scorer
import torch
import numpy as np
from functools import reduce
from .scorer import Scorer
[docs]class PositiveScorer(Scorer):
"""
Scorer, but limited to positive values
"""
def __mul__(self, ot):
"""enables the use of the multiplication sign (*)
to compose positive scorers"""
return Product(self, ot)
[docs] def log_score(self, samples, context):
"""relies on the instance's scoring function
to compute the log-scores of the samples given the context
Parameters
----------
samples : list(Sample)
list of samples to log-score
context: text
context that the samples relate to
Returns
-------
tensor of log-scores for the samples"""
return torch.log(self.scoring_function(samples, context))
[docs] def score(self, samples, context):
"""returns the scores for the samples
given the context by exponentiating their log-scores
Parameters
----------
samples : list(Sample)
list of samples to score
context: text
context that the samples relate to
Returns
-------
tensor of scores for the samples"""
return torch.exp(self.log_score(samples, context))
[docs]class Product(PositiveScorer):
"""
Utility class to compose scorers on the product of their scores
"""
def __init__(self, *scorers):
self.scorers = scorers
[docs] def log_score(self, samples, context):
"""computes the product of the log-scores,
hence adds the log-scores from the individual scorers
Parameters
----------
samples : list(Sample)
list of samples to log-score
context: text
context used for the samples
Returns:
--------
list of log-scores for the samples
"""
try:
device = self.scorers[0].device
except AttributeError:
device = "cpu"
log_scores = [s.log_score(samples, context).to(device) for s in self.scorers]
return torch.tensor(reduce(lambda x,y: x+y, log_scores))
def __str__(self):
scorers_str = ", ".join((str(scorer) for scorer in self.scorers))
return f"Product({scorers_str})"