migrate to ghactions for ci/cd
1 
#!/usr/bin/python


2 
# * coding: utf8 *


3  
4  3 
"""

5 


6 
The persistent entropy has been defined in [1]. A precursor of this definition was given in [2]


7 
to measure how different bars of the barcode are in length.


8 


9 
[1] M. Rucco, F. Castiglione, E. Merelli, M. Pettini, Characterisation of the


10 
idiotypic immune network through persistent entropy, in: Proc. Complex, 2015.


11 
[2] H. Chintakunta, T. Gentimis, R. GonzalezDiaz, M.J. Jimenez,


12 
H. Krim, An entropybased persistence barcode, Pattern Recognition


13 
48 (2) (2015) 391–401.


14 


15 
Implementation of persistent entropy


16  
17 
Author: Eduardo Paluzo Hidalgo (cimagroup, University of Seville)


18 
contact: epaluzo@us.es


19  
20 
"""


21  
22  3 
from __future__ import division 
23  3 
import numpy as np 
24  
25  
26  3 
__all__ = ["persistent_entropy"] 
27  
28  
29  3 
def persistent_entropy( 
30 
dgms, keep_inf=False, val_inf=None, normalize=False 

31 
):


32 
"""


33 
Perform the persistent entropy values of a family of persistence barcodes (or persistence diagrams).


34 
Assumes that the input diagrams are from a determined dimension. If the infinity bars have any meaning


35 
in your experiment and you want to keep them, remember to give the value you desire to val_Inf.


36  
37 
Parameters


38 



39 
dgms: ndarray (n_pairs, 2) or list of diagrams


40 
array or list of arrays of birth/death pairs of a persistence barcode of a determined dimension.


41 
keep_inf: bool, default False


42 
if False, the infinity bars are removed.


43 
if True, the infinity bars remain.


44 
val_inf: float, default None


45 
substitution value to infinity.


46 
normalize: bool, default False


47 
if False, the persistent entropy values are not normalized.


48 
if True, the persistent entropy values are normalized.


49 


50 
Returns


51 



52  
53 
ps: ndarray (n_pairs,)


54 
array of persistent entropy values corresponding to each persistence barcode.


55  
56 
"""


57  
58 
if isinstance(dgms, list) == False: 

59  3 
dgms = [dgms] 
60  
61 
# Step 1: Remove infinity bars if keep_inf = False. If keep_inf = True, infinity value is substituted by val_inf.


62  
63 
if keep_inf == False: 

64 
dgms = [(dgm[dgm[:, 1] != np.inf]) for dgm in dgms] 

65 
if keep_inf == True: 

66 
if val_inf != None: 

67 
dgms = [ 

68 
np.where(dgm == np.inf, val_inf, dgm) 

69 
for dgm in dgms 

70 
]


71 
else: 

72 
raise Exception( 

73 
"Remember: You need to provide a value to infinity bars if you want to keep them."


74 
)


75  
76 
# Step 2: Persistent entropy computation.


77  3 
ps = [] 
78 
for dgm in dgms: 

79  3 
l = dgm[:, 1]  dgm[:, 0] 
80 
if all(l > 0): 

81  3 
L = np.sum(l) 
82  3 
p = l / L 
83  3 
E = np.sum(p * np.log(p)) 
84 
if normalize == True: 

85 
E = E / np.log(len(l)) 

86  3 
ps.append(E) 
87 
else: 

88 
raise Exception("A bar is born after dying") 

89  
90  3 
return np.array(ps) 
Read our documentation on viewing source code .