Source code for gcmpy.distributions

# distribution functions for gcmpy
#
# Copyright (C) 2021 Peter Mann
#
# This file is part of gcmpy, generalised configuration model networks in Python.
#
# gcmpy 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 2 of the License, or
# (at your option) any later version.
#
# gcmpy 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 gcmpy. If not, see <http://www.gnu.org/licenses/gpl.html>.

from typing import Callable
import numpy as np

[docs]def poisson(kmean : float)->Callable: '''Implements a poisson distribution. :param kmean: mean of poisson distribution :returns p: Callable''' def p(k : int)->float: return np.exp(-kmean) * pow(kmean,k) / np.math.factorial(k) return p
[docs]def exponential(a : float)->Callable: '''Implemnts an exponential distribution. :param a: distribution parameter :returns p: callable''' def p(k : int)->float: return (1-a)*pow(a,k) return p
[docs]def power_law(alpha : float)->Callable: '''Implements a power law distribution with exponent alpha. Undefined for k = 0. :param alpha: power law exponent :returns p: callable''' def zeta(s : float)->float: tol = +1e-06 l = 0.0 k = 1 while 1: term = 1.0/ k**s l += term if abs(term) < tol: break k += 1 return l C = zeta(alpha) def p(k:int)->float: return pow(k,-alpha) / C return p
[docs]def scale_free_cut_off(alpha : float, kappa :float) -> Callable: '''Implements a scale free with exponential degree cutoff function. Limits to scale free for large degree cutoff. Undefined for k = 0. :param k: int degree :param alpha: float power law exponent :param kappa: float degree cutoff''' def polylog(s : float, z : float) -> float: '''Implements a polylogarithm function for real arguments, taking two floats :param s: base :param z: arg :returns polylogarithm float:''' tol = +1e-06 l = 0.0 k = 1 zk = z while 1: term = zk / k**s l += term if abs(term) < tol: break zk *= z k += 1 return l C = polylog(alpha, np.exp(-1.0 / kappa)) # normalisation constant def p(k : int) -> float: return (pow((k + 0.0), -alpha) * np.exp(-(k + 0.0) / kappa)) / C return p
[docs]def log_normal(): pass
[docs]def weibull(): pass