Source code for rexfw.statistics.averages
'''
Classes representing runtime-averages of quantities such as acceptance rates
'''
from abc import abstractmethod
from rexfw.statistics.logged_quantities import LoggedQuantity
[docs]class AbstractAverage(LoggedQuantity):
def __init__(self, origins, stats_fields, name, variable_name=None):
super(AbstractAverage, self).__init__(origins, stats_fields, name, variable_name)
self._n_contributions = 0
self._untouched = True
[docs] @abstractmethod
def _calculate_new_value(self, info):
'''
Calculates a new average value from the information given in info
'''
pass
[docs] def update(self, step, stats):
new_value = self._calculate_new_value(stats)
if self._untouched:
self._values.update(**{str(step): new_value})
self._n_contributions += 1
self._untouched = False
else:
## calculates average from previous average and new information
new = self.current_value * self._n_contributions / float(self._n_contributions + 1)
self._n_contributions += 1
new += new_value / float(self._n_contributions)
self._values.update(**{str(step): new})
[docs]class MCMCAcceptanceRateAverage(AbstractAverage):
def __init__(self, replica, variable_name):
super(MCMCAcceptanceRateAverage, self).__init__([replica],
['accepted'],
'acceptance rate',
variable_name)
self._default_value = 0.0
[docs] def _calculate_new_value(self, stats):
return float(stats[self.variable_name].accepted)
def __repr__(self):
return 'p_acc {} {}: {:.2f}'.format(self.variable_name, self.origins[0],
self.current_value)
[docs]class REAcceptanceRateAverage(AbstractAverage):
def __init__(self, replica1, replica2):
super(REAcceptanceRateAverage, self).__init__([replica1, replica2],
['accepted'],
'acceptance rate')
self._default_value = 0.0
[docs] def _calculate_new_value(self, stats):
return float(stats.accepted)
def __repr__(self):
return 'p_acc {} <> {}: {:.2f}'.format(self.origins[0], self.origins[1], self.current_value)