Spaces:
Running
Running
File size: 3,555 Bytes
e60e568 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
'''
This file is part of PM4Py (More Info: https://pm4py.fit.fraunhofer.de).
PM4Py 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 3 of the License, or
(at your option) any later version.
PM4Py 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 PM4Py. If not, see <https://www.gnu.org/licenses/>.
'''
import sys
import numpy as np
from pm4py.objects.random_variables.basic_structure import BasicStructureRandomVariable
class Exponential(BasicStructureRandomVariable):
"""
Describes a normal variable
"""
def __init__(self, loc=1, scale=1):
"""
Constructor
Parameters
-----------
loc
Loc of the distribution (see docs.scipy.org/doc/scipy/reference/generated/scipy.stats.expon.html)
scale
Scale of the distribution
"""
self.loc = loc
self.scale = scale
self.priority = 0
BasicStructureRandomVariable.__init__(self)
def read_from_string(self, distribution_parameters):
"""
Initialize distribution parameters from string
Parameters
-----------
distribution_parameters
Current distribution parameters as exported on the Petri net
"""
self.loc = 0
self.scale = 1.0 / float(distribution_parameters)
def get_distribution_type(self):
"""
Get current distribution type
Returns
-----------
distribution_type
String representing the distribution type
"""
return "EXPONENTIAL"
def get_distribution_parameters(self):
"""
Get a string representing distribution parameters
Returns
-----------
distribution_parameters
String representing distribution parameters
"""
if self.scale > 0:
return str(1.0 / float(self.scale))
return "UNDEFINED"
def calculate_loglikelihood(self, values):
"""
Calculate log likelihood
Parameters
------------
values
Empirical values to work on
Returns
------------
likelihood
Log likelihood that the values follows the distribution
"""
from scipy.stats import expon
if len(values) > 1:
somma = 0
for value in values:
somma = somma + np.log(expon.pdf(value, self.loc, self.scale))
return somma
return -sys.float_info.max
def calculate_parameters(self, values):
"""
Calculate parameters of the current distribution
Parameters
-----------
values
Empirical values to work on
"""
from scipy.stats import expon
if len(values) > 1:
self.loc, self.scale = expon.fit(values, floc=0)
def get_value(self):
"""
Get a random value following the distribution
Returns
-----------
value
Value obtained following the distribution
"""
from scipy.stats import expon
return expon.rvs(self.loc, self.scale)
|