Source code for pyretis.core.properties
# -*- coding: utf-8 -*-
# Copyright (c) 2023, PyRETIS Development Team.
# Distributed under the LGPLv2.1+ License. See LICENSE for more info.
"""This file contains a class for a generic property."""
import numpy as np
__all__ = ['Property']
[docs]class Property:
"""A generic numerical value with standard deviation and average.
A generic object to store values obtained during a simulation.
It will maintain the mean and variance as values are added using
Property.add(val)
Attributes
----------
desc : string
Description of the property.
nval : integer
Number values stored.
mean : float
The current mean.
delta2 : float
Helper variable used for calculating the variance.
variance : float
The current variance
val : list
Store all values.
Parameters
----------
desc : string, optional
Used to set the attribute desc.
Examples
--------
>>> from pyretis.core.properties import Property
>>> ener = Property(desc='Energy of the particle(s)')
>>> ener.add(42.0)
>>> ener.add(12.220)
>>> ener.add(99.22)
>>> ener.mean
"""
[docs] def __init__(self, desc=''):
"""Initialise the property.
Parameters
----------
desc : string, optional
Description of the object.
"""
self.desc = desc
self.nval = 0
self.mean = 0.0
self.delta2 = 0.0
self.variance = 0.0
self.val = []
[docs] def add(self, val):
"""Add a value to the property & update the mean and variance.
Parameters
----------
val : float or another type (list, numpy.array)
The value to add.
Returns
-------
out : None
Returns `None` but updates the mean and variance.
"""
self.nval += 1
self.val.append(val)
self.update_mean_and_variance()
[docs] def update_mean_and_variance(self):
"""Calculate the mean and variance on the fly.
Source:
http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance
Returns
-------
out : None
Returns `None` but updates the mean and variance.
Note
----
Consider if this should be moved/deleted and just
replaced with a function from the analysis package.
"""
val = self.val[-1] # most recent value
delta = val - self.mean
self.mean += delta/float(self.nval)
self.delta2 += delta * (val - self.mean)
if self.nval < 2:
self.variance = float('inf')
else:
self.variance = self.delta2/float(self.nval - 1)
[docs] def dump_to_file(self, filename):
"""Dump the contents in `self.val` to a file.
Parameters
----------
filename : string
Name/path of file to write.
Note
----
Consider if this should be moved/deleted and just
replaced with a function from a more general input-output
module
"""
np.savetxt(filename, self.val)
[docs] def __str__(self):
"""Return string description of the property."""
return self.desc