comparison planemo/lib/python3.7/site-packages/networkx/utils/random_sequence.py @ 1:56ad4e20f292 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:32:28 -0400
parents
children
comparison
equal deleted inserted replaced
0:d30785e31577 1:56ad4e20f292
1 # Copyright (C) 2004-2019 by
2 # Aric Hagberg <hagberg@lanl.gov>
3 # Dan Schult <dschult@colgate.edu>
4 # Pieter Swart <swart@lanl.gov>
5 # All rights reserved.
6 # BSD license.
7 #
8 # Authors: Aric Hagberg (hagberg@lanl.gov)
9 # Dan Schult (dschult@colgate.edu)
10 # Ben Edwards (bedwards@cs.unm.edu)
11 """
12 Utilities for generating random numbers, random sequences, and
13 random selections.
14 """
15
16 import random
17 import sys
18 import networkx as nx
19 from networkx.utils import py_random_state
20
21
22 # The same helpers for choosing random sequences from distributions
23 # uses Python's random module
24 # https://docs.python.org/2/library/random.html
25
26 @py_random_state(2)
27 def powerlaw_sequence(n, exponent=2.0, seed=None):
28 """
29 Return sample sequence of length n from a power law distribution.
30 """
31 return [seed.paretovariate(exponent - 1) for i in range(n)]
32
33
34 @py_random_state(2)
35 def zipf_rv(alpha, xmin=1, seed=None):
36 r"""Returns a random value chosen from the Zipf distribution.
37
38 The return value is an integer drawn from the probability distribution
39
40 .. math::
41
42 p(x)=\frac{x^{-\alpha}}{\zeta(\alpha, x_{\min})},
43
44 where $\zeta(\alpha, x_{\min})$ is the Hurwitz zeta function.
45
46 Parameters
47 ----------
48 alpha : float
49 Exponent value of the distribution
50 xmin : int
51 Minimum value
52 seed : integer, random_state, or None (default)
53 Indicator of random number generation state.
54 See :ref:`Randomness<randomness>`.
55
56 Returns
57 -------
58 x : int
59 Random value from Zipf distribution
60
61 Raises
62 ------
63 ValueError:
64 If xmin < 1 or
65 If alpha <= 1
66
67 Notes
68 -----
69 The rejection algorithm generates random values for a the power-law
70 distribution in uniformly bounded expected time dependent on
71 parameters. See [1]_ for details on its operation.
72
73 Examples
74 --------
75 >>> nx.zipf_rv(alpha=2, xmin=3, seed=42) # doctest: +SKIP
76
77 References
78 ----------
79 .. [1] Luc Devroye, Non-Uniform Random Variate Generation,
80 Springer-Verlag, New York, 1986.
81 """
82 if xmin < 1:
83 raise ValueError("xmin < 1")
84 if alpha <= 1:
85 raise ValueError("a <= 1.0")
86 a1 = alpha - 1.0
87 b = 2**a1
88 while True:
89 u = 1.0 - seed.random() # u in (0,1]
90 v = seed.random() # v in [0,1)
91 x = int(xmin * u**-(1.0 / a1))
92 t = (1.0 + (1.0 / x))**a1
93 if v * x * (t - 1.0) / (b - 1.0) <= t / b:
94 break
95 return x
96
97
98 def cumulative_distribution(distribution):
99 """Returns normalized cumulative distribution from discrete distribution."""
100
101 cdf = [0.0]
102 psum = float(sum(distribution))
103 for i in range(0, len(distribution)):
104 cdf.append(cdf[i] + distribution[i] / psum)
105 return cdf
106
107
108 @py_random_state(3)
109 def discrete_sequence(n, distribution=None, cdistribution=None, seed=None):
110 """
111 Return sample sequence of length n from a given discrete distribution
112 or discrete cumulative distribution.
113
114 One of the following must be specified.
115
116 distribution = histogram of values, will be normalized
117
118 cdistribution = normalized discrete cumulative distribution
119
120 """
121 import bisect
122
123 if cdistribution is not None:
124 cdf = cdistribution
125 elif distribution is not None:
126 cdf = cumulative_distribution(distribution)
127 else:
128 raise nx.NetworkXError(
129 "discrete_sequence: distribution or cdistribution missing")
130
131 # get a uniform random number
132 inputseq = [seed.random() for i in range(n)]
133
134 # choose from CDF
135 seq = [bisect.bisect_left(cdf, s) - 1 for s in inputseq]
136 return seq
137
138
139 @py_random_state(2)
140 def random_weighted_sample(mapping, k, seed=None):
141 """Returns k items without replacement from a weighted sample.
142
143 The input is a dictionary of items with weights as values.
144 """
145 if k > len(mapping):
146 raise ValueError("sample larger than population")
147 sample = set()
148 while len(sample) < k:
149 sample.add(weighted_choice(mapping, seed))
150 return list(sample)
151
152
153 @py_random_state(1)
154 def weighted_choice(mapping, seed=None):
155 """Returns a single element from a weighted sample.
156
157 The input is a dictionary of items with weights as values.
158 """
159 # use roulette method
160 rnd = seed.random() * sum(mapping.values())
161 for k, w in mapping.items():
162 rnd -= w
163 if rnd < 0:
164 return k