piegy 2.0.2__py3-none-any.whl → 2.0.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
piegy/C_core/piegyc.so CHANGED
Binary file
piegy/__init__.py CHANGED
@@ -20,13 +20,13 @@ Last update: May 12, 2025
20
20
 
21
21
  from .__version__ import __version__
22
22
 
23
- from .simulation import model, run, demo_model
23
+ from .simulation import model, run, demo_model, UV_expected_val, check_overflow_func
24
24
  from .videos import make_video, SUPPORTED_FIGURES
25
25
  from .data_tools import save_data, read_data
26
26
 
27
27
  from .analysis import rounds_expected, scale_maxtime, check_convergence, combine_sim
28
28
 
29
- from .figures import (UV_heatmap, UV_bar, UV_dyna, UV_hist, UV_std, UV_expected_val, UV_expected,
29
+ from .figures import (UV_heatmap, UV_bar, UV_dyna, UV_hist, UV_std, UV_expected,
30
30
  pi_heatmap, pi_bar, pi_dyna, pi_hist, pi_std, UV_pi)
31
31
 
32
32
  from .test_var import (test_var1, var_UV1, var_pi1, var_convergence1, get_dirs1,
@@ -54,43 +54,3 @@ __all__ = simulation_memebers + videos_members + data_members + figures_members
54
54
 
55
55
 
56
56
 
57
-
58
-
59
- # Below might be better suited for documents
60
- '''
61
- To run a simulation, start by defining some parameter. Here is a complete set of params::
62
-
63
- >>> N = 5
64
- >>> M = 5
65
- >>> maxtime = 300
66
- >>> sim_time = 3
67
- >>> I = [[[22, 44] for i in range(N)] for j in range(M)]
68
- >>> X = [[[-0.1, 0.4, 0, 0.2] for i in range(N)] for j in range(M)]
69
- >>> X[1][1] = [0.1, 0.6, 0.2, 0.4]
70
- >>> P = [[[0.5, 0.5, 100, 100, 0.001, 0.001] for i in range(N)] for j in range(M)]
71
- >>> boundary = True
72
- >>> print_pct = 5
73
- >>> seed = None
74
-
75
- These parameters essentially define the spatial size, initial population, payoff matrices...
76
- For a detailed explanation, see simulation object.
77
-
78
- Then create a 'simulation' object with those parameters::
79
-
80
- >>> sim = simulation(N, M, maxtime, sim_time, I, X, P, boundary, print_pct, seed)
81
-
82
- This 'sim' object will be the basis of our simulation. It carries all the necessary parameters
83
- and storage bin for the results.
84
-
85
- Now let's run the simulation (assuming you imported)::
86
-
87
- >>> multi_test(sim)
88
-
89
- And that's the simulation! It takes 30s ~ 1min. You can see the progress.
90
-
91
- Now, to see the results, let's use figures::
92
-
93
- >>> fig = UV_heatmap(sim)
94
-
95
-
96
- '''
piegy/__version__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = '2.0.2'
1
+ __version__ = '2.0.3'
2
2
 
3
3
  '''
4
4
  version history:
@@ -24,4 +24,5 @@ version history:
24
24
  2.0.0: update simulation core to C-based.
25
25
  2.0.1: re-upload, the C core is not included in package.
26
26
  2.0.2: update version number in __version__.py and update README.
27
+ 2.0.3: speed boost & debugging in C core. Add check_overflow feature in simulation module, checks whether overflow/too large numbers might be encountered in simulation.
27
28
  '''
piegy/data_tools.py CHANGED
@@ -50,6 +50,7 @@ def save_data(mod, dirs = '', print_msg = True):
50
50
  inputs.append(mod.P.tolist())
51
51
  inputs.append(mod.print_pct)
52
52
  inputs.append(mod.seed)
53
+ inputs.append(mod.check_overflow)
53
54
  data.append(inputs)
54
55
 
55
56
  # skipped rng
@@ -107,7 +108,7 @@ def read_data(dirs):
107
108
  try:
108
109
  mod = simulation.model(N = data[0][0], M = data[0][1], maxtime = data[0][2], record_itv = data[0][3],
109
110
  sim_time = data[0][4], boundary = data[0][5], I = data[0][6], X = data[0][7], P = data[0][8],
110
- print_pct = data[0][9], seed = data[0][10])
111
+ print_pct = data[0][9], seed = data[0][10], check_overflow = data[0][11])
111
112
  except:
112
113
  raise ValueError('Invalid input parameters saved in data')
113
114
 
piegy/figures.py CHANGED
@@ -9,7 +9,6 @@ Plots for population:
9
9
  - UV_dyna: Plot change of total U, V overtime.
10
10
  - UV_hist: Make a histogram of U, V in a specified time interval.
11
11
  - UV_std: Plot change of standard deviation of U, V over time.
12
- - UV_expected_val: Calculate expected U, V distribution based on matrices, assuming no migration return values (np.array)
13
12
  - UV_expected: Calculate expected distribution of U, V based on matrices, assuming no migration.
14
13
 
15
14
 
@@ -253,32 +252,6 @@ def UV_std(mod, ax = None, interval = 20, grid = True):
253
252
 
254
253
 
255
254
 
256
- def UV_expected_val(mod):
257
- '''
258
- Calculate expected U & V distribution based on matrices, assume no migration.
259
- To differentiate from UV_expected in figures.py: this one return arrays (values).
260
- '''
261
-
262
- U_expected = np.zeros((mod.N, mod.M))
263
- V_expected = np.zeros((mod.N, mod.M))
264
-
265
- for i in range(mod.N):
266
- for j in range(mod.M):
267
- # say matrix = [a, b, c, d]
268
- # U_proportion = (d - b) / (a - b - c + d)
269
- U_prop = (mod.X[i][j][3] - mod.X[i][j][1]) / (mod.X[i][j][0] - mod.X[i][j][1] - mod.X[i][j][2] + mod.X[i][j][3])
270
- # equilibrium payoff, U_payoff = V_payoff
271
- eq_payoff = U_prop * mod.X[i][j][0] + (1 - U_prop) * mod.X[i][j][1]
272
-
273
- # payoff / kappa * proportion
274
- U_expected[i][j] = eq_payoff / mod.P[i][j][4] * U_prop
275
- V_expected[i][j] = eq_payoff / mod.P[i][j][5] * (1 - U_prop)
276
-
277
- return U_expected, V_expected
278
-
279
-
280
-
281
-
282
255
  def UV_expected(mod, ax_U = None, ax_V = None, U_color = 'Purples', V_color = 'Greens', annot = False, fmt = '.3g'):
283
256
  '''
284
257
  Calculate expected population distribution based on matrices, assuming no migration.
@@ -292,7 +265,7 @@ def UV_expected(mod, ax_U = None, ax_V = None, U_color = 'Purples', V_color = 'G
292
265
  If 1D (N or M == 1), then ax_U and ax_V are barplots.
293
266
  '''
294
267
 
295
- U_expected, V_expected = UV_expected_val(mod)
268
+ U_expected, V_expected = simulation.UV_expected_val(mod)
296
269
 
297
270
  U_text = figure_t.gen_text(np.mean(U_expected), np.std(U_expected))
298
271
  V_text = figure_t.gen_text(np.mean(V_expected), np.std(V_expected))
piegy/simulation.py CHANGED
@@ -4,26 +4,11 @@ Main Module of Stochastic Simulation
4
4
 
5
5
  Contains all the necessary tools to build a model and run models based on Gillespie Algorithm.
6
6
 
7
- Classes:
8
- - patch: (Private) Simulates a single patch in the N x M space. Assume no spatial structure within a patch.
9
- All spatial movements are based on patches.
10
- - model: Stores input parameters and data generated during simulation.
11
-
12
-
13
- Functions:
14
- - find_nb_zero_flux: (Private) Return pointers to a patch's neighbors under zero-flux (no-boundary) boundary condition.
15
- - find_nb_periodical: (Private) Return pointers to a patch's neighbors under periodical (with-booundary) boundary condition.
16
- - find_event: (Private) Pick a random event to happen.
17
- - make_signal_zero_flux: (Private) Expand event index (return value of find_event) to a detailed signal, under zero-flux boundary condition.
18
- - make_signal_periodical: (Private) Expand event index (return value of find_event) to a detailed signal, under periodical boundary condition.
19
- - single_init: (Private) Initialize a single model. Meaning of 'single': see single_test and run.
20
- - single_test: (Private) Run a single model.
21
- 'single' means a single round of model. You can run many single rounds and then take the average --- that's done by <run> function.
22
- - run: Run multiple models and then take the average. All the model will use the same parameters.
23
- Set a seed for reproducible results.
24
- - demo_model: Returns a demo model (a model object).
25
-
26
- NOTE: Only model class and run function are intended for direct usages.
7
+ Class & Functions:
8
+ - model: creates a stochastic mode. Run the model by ``simulation.run(mod)``
9
+ - run: runs stochastic simulation on a model.
10
+ - demo_model: returns a demo model.
11
+ - UV_expected_val: calculates the expected population of U, V at steady state, assuming no migration and any stochastic process.
27
12
  '''
28
13
 
29
14
 
@@ -35,16 +20,19 @@ import numpy as np
35
20
  from numpy.ctypeslib import ndpointer
36
21
 
37
22
 
23
+ # path to the C shared libary
24
+ C_LIB_PATH = os.path.join(os.path.dirname(__file__), 'C_core', 'piegyc.so')
25
+
26
+ # check whether overflow / too large values might be encountered
27
+ # these values are considered as exponents in exp()
28
+ EXP_OVERFLOW_BOUND = 700 # where exp(x) reaches overflow bound
29
+ EXP_TOO_LARGE_BOUND = 87 # where exp(x) reaches 1e20
38
30
 
39
31
 
40
32
  '''
41
33
  The C core
42
34
  '''
43
35
 
44
- # path to the C shared libary
45
- C_LIB_PATH = os.path.join(os.path.dirname(__file__), 'C_core', 'piegyc.so')
46
-
47
-
48
36
  class model_c(ctypes.Structure):
49
37
  '''
50
38
  The C-cored model
@@ -91,11 +79,15 @@ lib.mod_init.argtypes = [
91
79
  ]
92
80
  lib.mod_init.restype = c_bool
93
81
 
82
+ lib.mod_free_py.argtypes = [ctypes.POINTER(model_c)]
83
+ lib.mod_free_py.restype = None
84
+
94
85
  lib.run.argtypes = [ctypes.POINTER(model_c), ctypes.POINTER(c_char), c_size_t]
95
86
  lib.run.restype = None
96
87
 
97
88
 
98
89
 
90
+
99
91
  '''
100
92
  For access by Python
101
93
  '''
@@ -129,9 +121,9 @@ class model:
129
121
  compress data by only storing average values
130
122
  '''
131
123
 
132
- def __init__(self, N, M, maxtime, record_itv, sim_time, boundary, I, X, P, print_pct = 25, seed = None):
124
+ def __init__(self, N, M, maxtime, record_itv, sim_time, boundary, I, X, P, print_pct = 25, seed = None, check_overflow = True):
133
125
 
134
- self.check_valid_input(N, M, maxtime, record_itv, sim_time, boundary, I, X, P, print_pct)
126
+ self.check_valid_input(N, M, maxtime, record_itv, sim_time, boundary, I, X, P, print_pct, seed, check_overflow)
135
127
 
136
128
  self.N = N # int, N x M is spatial dimension
137
129
  self.M = M # int, can't be 1. If want to make 1D space, use N = 1. And this model doesn't work for 1x1 space (causes NaN)
@@ -143,7 +135,14 @@ class model:
143
135
  self.X = np.array(X) # N x M x 4 np.array, matrices. The '4' comes from 2x2 matrix flattened to 1D
144
136
  self.P = np.array(P) # N x M x 6 np.array, 'patch variables', i.e., mu1&2, w1&2, kappa1&2
145
137
  self.print_pct = print_pct # int, print how much percent is done, need to be non-zero
146
- self.seed = seed # non-negative int, seed for random number generation
138
+ if seed == None:
139
+ self.seed = -1 # non-negative int, seed for random number generation
140
+ else:
141
+ self.seed = seed
142
+ self.check_overflow = check_overflow
143
+
144
+ if check_overflow:
145
+ check_overflow_func(self)
147
146
 
148
147
  self.init_storage() # initialize storage bins. Put in a separate function because might want to change maxtime
149
148
  # and that doesn't need to initialze the whole object again
@@ -163,7 +162,7 @@ class model:
163
162
  self.Vpi = None
164
163
 
165
164
 
166
- def check_valid_input(self, N, M, maxtime, record_itv, sim_time, boundary, I, X, P, print_pct):
165
+ def check_valid_input(self, N, M, maxtime, record_itv, sim_time, boundary, I, X, P, print_pct, seed, check_overflow):
167
166
  # check whether the inputs are valid
168
167
 
169
168
  if (N < 1) or (M < 1):
@@ -199,6 +198,12 @@ class model:
199
198
  if print_pct <= 0:
200
199
  raise ValueError('Please use an int > 0 for print_pct or None for not printing progress.')
201
200
 
201
+ if (not isinstance(seed, int)) or (seed < 0):
202
+ raise ValueError('Please use a non-negative int as seed')
203
+
204
+ if not isinstance(check_overflow, bool):
205
+ raise ValueError('Please use a bool for check_overflow')
206
+
202
207
 
203
208
  def check_valid_data(self, data_empty, max_record, compress_itv):
204
209
  # check whether a set of data is valid, used when reading a saved model
@@ -228,6 +233,7 @@ class model:
228
233
  self_str += 'boundary = ' + str(self.boundary) + '\n'
229
234
  self_str += 'print_pct = ' + str(self.print_pct) + '\n'
230
235
  self_str += 'seed = ' + str(self.seed) + '\n'
236
+ self_str += 'check_overflow = ' + str(self.check_overflow) + '\n'
231
237
  self_str += 'data_empty = ' + str(self.data_empty) + '\n'
232
238
  self_str += 'compress_itv = ' + str(self.compress_itv) + '\n'
233
239
  self_str += '\n'
@@ -288,7 +294,7 @@ class model:
288
294
 
289
295
  sim2 = model(N = self.N, M = self.M, maxtime = self.maxtime, record_itv = self.record_itv, sim_time = self.sim_time, boundary = self.boundary,
290
296
  I = np.copy(self.I), X = np.copy(self.X), P = np.copy(self.P),
291
- print_pct = self.print_pct, seed = self.seed)
297
+ print_pct = self.print_pct, seed = self.seed, check_overflow = self.check_overflow)
292
298
 
293
299
  if copy_data:
294
300
  # copy data as well
@@ -384,6 +390,7 @@ def run(mod, message = ""):
384
390
  '''
385
391
  C-cored simulation
386
392
  '''
393
+
387
394
  msg_len = len(message)
388
395
  msg_bytes = message.encode('utf-8')
389
396
  msg_buffer = ctypes.create_string_buffer(msg_bytes, msg_len)
@@ -407,6 +414,9 @@ def run(mod, message = ""):
407
414
  mod.Upi = mod_c.get_array('Upi_1d').reshape(mod.N, mod.M, mod.max_record)
408
415
  mod.Vpi = mod_c.get_array('Vpi_1d').reshape(mod.N, mod.M, mod.max_record)
409
416
 
417
+ lib.mod_free_py(ctypes.byref(mod_c))
418
+ del mod_c
419
+
410
420
 
411
421
 
412
422
  def demo_model():
@@ -416,7 +426,7 @@ def demo_model():
416
426
 
417
427
  N = 10 # Number of rows
418
428
  M = 10 # Number of cols
419
- maxtime = 300 # how long you want the model to run
429
+ maxtime = 30 # how long you want the model to run
420
430
  record_itv = 0.1 # how often to record data.
421
431
  sim_time = 1 # repeat model to reduce randomness
422
432
  boundary = True # boundary condition.
@@ -425,12 +435,12 @@ def demo_model():
425
435
  I = [[[44, 22] for _ in range(M)] for _ in range(N)]
426
436
 
427
437
  # flattened payoff matrices, total resource is 0.4, cost of fighting is 0.1
428
- X = [[[-0.1, 0.4, 0, 0.2] for _ in range(M)] for _ in range(N)]
438
+ X = [[[-1, 4, 0, 2] for _ in range(M)] for _ in range(N)]
429
439
 
430
440
  # patch variables
431
441
  P = [[[0.5, 0.5, 200, 200, 0.001, 0.001] for _ in range(M)] for _ in range(N)]
432
442
 
433
- print_pct = 5 # print progress
443
+ print_pct = 25 # print progress
434
444
  seed = 36 # seed for random number generation
435
445
 
436
446
  # create a model object
@@ -441,3 +451,51 @@ def demo_model():
441
451
 
442
452
 
443
453
 
454
+ def UV_expected_val(mod):
455
+ '''
456
+ Calculate expected U & V population and payoff based on matrices, assume no migration and any stochastic process.
457
+ To differentiate from UV_expected in figures.py: this one return arrays (values).
458
+ '''
459
+
460
+ U_expected = np.zeros((mod.N, mod.M)) # expected U population
461
+ V_expected = np.zeros((mod.N, mod.M)) # expected V population
462
+ pi_expected = np.zeros((mod.N, mod.M)) # expected payoff, which are equal for U and V
463
+
464
+ for i in range(mod.N):
465
+ for j in range(mod.M):
466
+ # say matrix = [a, b, c, d]
467
+ # U_proportion = (d - b) / (a - b - c + d)
468
+ U_prop = (mod.X[i][j][3] - mod.X[i][j][1]) / (mod.X[i][j][0] - mod.X[i][j][1] - mod.X[i][j][2] + mod.X[i][j][3])
469
+ # equilibrium payoff, U_payoff = V_payoff
470
+ eq_payoff = U_prop * mod.X[i][j][0] + (1 - U_prop) * mod.X[i][j][1]
471
+
472
+ # payoff / kappa * proportion
473
+ U_expected[i][j] = eq_payoff / mod.P[i][j][4] * U_prop
474
+ V_expected[i][j] = eq_payoff / mod.P[i][j][5] * (1 - U_prop)
475
+ pi_expected[i][j] = eq_payoff
476
+
477
+ return U_expected, V_expected, pi_expected
478
+
479
+
480
+
481
+ def check_overflow_func(mod):
482
+ overflow = False # flag for might-overflow
483
+ too_large = False # flag for might-too-large
484
+ _, _, pi_expected = UV_expected_val(mod)
485
+ for i in range(mod.N):
486
+ for j in range(mod.M):
487
+ w1_pi = pi_expected[i][j] * mod.P[i][j][2] # w1 * U_pi
488
+ w2_pi = pi_expected[i][j] * mod.P[i][j][3] # w2 * V_pi
489
+ if ((w1_pi > EXP_OVERFLOW_BOUND) or (w2_pi > EXP_OVERFLOW_BOUND)):
490
+ overflow = True
491
+ too_large = True
492
+ break
493
+ if ((w1_pi > EXP_TOO_LARGE_BOUND) or (w2_pi > EXP_TOO_LARGE_BOUND)):
494
+ too_large = True
495
+ break
496
+ if overflow:
497
+ print("Warning: might cause overflow. \n\t w1, w2, or payoff matrix values too large")
498
+ elif too_large:
499
+ print("Warning: might encounter large values > 1e38 in simulation. \n\t w1, w2, or payoff matrix values too large")
500
+
501
+
piegy/simulation_py.py CHANGED
@@ -6,6 +6,7 @@ But you can still run them by calling:
6
6
  '''
7
7
 
8
8
  from . import simulation
9
+ model = simulation.model
9
10
 
10
11
  import math
11
12
  import numpy as np
@@ -168,6 +169,9 @@ class patch:
168
169
  def find_event(self, expected_sum):
169
170
  # find the event within the 12 events based on expected sum-of-rates within this patch
170
171
 
172
+ if expected_sum > (self.sum_pi_death_rates + self.sum_mig_rates):
173
+ print("patch rate not large enough")
174
+
171
175
  if expected_sum < self.sum_pi_death_rates:
172
176
  # in the first 4 events (payoff and death events)
173
177
  event = 0
@@ -756,6 +760,11 @@ def run_py(mod, predict_runtime = False, message = ''):
756
760
  if not mod.data_empty:
757
761
  raise RuntimeError('mod has non-empty data')
758
762
 
763
+ mod.U = np.zeros((mod.N, mod.M, mod.max_record))
764
+ mod.V = np.zeros((mod.N, mod.M, mod.max_record))
765
+ mod.Vpi = np.zeros((mod.N, mod.M, mod.max_record))
766
+ mod.Upi = np.zeros((mod.N, mod.M, mod.max_record))
767
+
759
768
  start = timer() # runtime
760
769
 
761
770
  mod.data_empty = False
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: piegy
3
- Version: 2.0.2
3
+ Version: 2.0.3
4
4
  Summary: Payoff-Driven Stochastic Spatial Model for Evolutionary Game Theory
5
5
  Author-email: Chenning Xu <cxu7@caltech.edu>
6
6
  License: BSD 3-Clause License
@@ -0,0 +1,18 @@
1
+ piegy/__init__.py,sha256=KlbuIi3_Z9YZ5dWSFTwKxwrX3jdgNO4C8ksDjyDHsbk,2064
2
+ piegy/__version__.py,sha256=7Pl-4GzRC0BYYyqHnr7GEJGnPlMH_a5FmAq5pNsQs7Y,1375
3
+ piegy/analysis.py,sha256=2GBsBbi7LdstSEAM0-F2bfL2kHu3MElcrw8bxZ1x6LI,8719
4
+ piegy/data_tools.py,sha256=auliVb88qKQmCX7LEDgKQvhBcwFTCXBEWKtjJ4_-rTU,3446
5
+ piegy/figures.py,sha256=GwixvD3Flaqg4feSvqr42lDR7CwZK0_2qmZg6N6_1uE,17936
6
+ piegy/simulation.py,sha256=R0f_kzPfuCYiVdxeW07llyCuXOu3Uq6uDqjiq1Uwp3E,19605
7
+ piegy/simulation_py.py,sha256=WtWhpHCosKQ457gZ-iJ-7v0N3NtyPqDfgXv4DL3aBKs,29523
8
+ piegy/test_var.py,sha256=EfItIK-FEApJTAW8rs15kdMs5xlv-8Bx6CtfpSoi8ys,23562
9
+ piegy/videos.py,sha256=QfSpOdwfaDsrQYRoiHmZ6gowzRQHom3m8kx1P65_8sM,10218
10
+ piegy/C_core/piegyc.so,sha256=OrUarFXNC4o9viHWwRO7RfcnVeyGoKad0I0ALrQEL2Y,51304
11
+ piegy/tools/__init__.py,sha256=eYOl_HJHDonYexfrmKh3koOlxvtSo46vH6jHvCEEB4k,300
12
+ piegy/tools/figure_tools.py,sha256=54vJSJMReXidFnSPE_xFvedtgnJU3d55zQDPNBLGs98,6975
13
+ piegy/tools/file_tools.py,sha256=ncxFWeHfIE-GYLQlOrahFlhBgqPyuY3R5_93fpQeCEs,630
14
+ piegy-2.0.3.dist-info/licenses/LICENSE.txt,sha256=wfzEht_CxOcfGGmg3f3at4mWJb9rTBjA51mXLl_3O3g,1498
15
+ piegy-2.0.3.dist-info/METADATA,sha256=stdacrzPZmn1_EVMboRwyZgzQpQnM0VVHBKpzxWEBxc,5453
16
+ piegy-2.0.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
+ piegy-2.0.3.dist-info/top_level.txt,sha256=k4QLYL8PqdqDuy95-4NZD_FVLqJDsmq67tpKkBn4vMw,6
18
+ piegy-2.0.3.dist-info/RECORD,,
@@ -1,18 +0,0 @@
1
- piegy/__init__.py,sha256=plq8y9IE9ilaKtEFIblJ_QexipAvPBXoalXhXLbs71Q,3244
2
- piegy/__version__.py,sha256=5DvxDV6QF68xfqpnLA66LjfnG85J5lGVS2MxLSf8Two,1206
3
- piegy/analysis.py,sha256=2GBsBbi7LdstSEAM0-F2bfL2kHu3MElcrw8bxZ1x6LI,8719
4
- piegy/data_tools.py,sha256=cbWAxGpFPbvne1RzvJaVN6avvmNt1I165xoppOqxQME,3378
5
- piegy/figures.py,sha256=TP9AoNnKwGZxBNmJGbplpb_ewr9US3jziBzOh1arGeY,19014
6
- piegy/simulation.py,sha256=4J4pdDuobV0fVxTF3QMr0SzX49tLBwkh99svnjO3eTU,17698
7
- piegy/simulation_py.py,sha256=BqHzVtFADUkqRRQGvncp3ambv-_wALwOc-ZRF2id8AM,29153
8
- piegy/test_var.py,sha256=EfItIK-FEApJTAW8rs15kdMs5xlv-8Bx6CtfpSoi8ys,23562
9
- piegy/videos.py,sha256=QfSpOdwfaDsrQYRoiHmZ6gowzRQHom3m8kx1P65_8sM,10218
10
- piegy/C_core/piegyc.so,sha256=5tBwQbxyKzTYny0oMhMZGyShuBJNRb2HzRWkeRfxM0s,51768
11
- piegy/tools/__init__.py,sha256=eYOl_HJHDonYexfrmKh3koOlxvtSo46vH6jHvCEEB4k,300
12
- piegy/tools/figure_tools.py,sha256=54vJSJMReXidFnSPE_xFvedtgnJU3d55zQDPNBLGs98,6975
13
- piegy/tools/file_tools.py,sha256=ncxFWeHfIE-GYLQlOrahFlhBgqPyuY3R5_93fpQeCEs,630
14
- piegy-2.0.2.dist-info/licenses/LICENSE.txt,sha256=wfzEht_CxOcfGGmg3f3at4mWJb9rTBjA51mXLl_3O3g,1498
15
- piegy-2.0.2.dist-info/METADATA,sha256=R8FKdQAxTR-iuJxj8UIq7PbkjjgnWvAEq1DjVODM-18,5453
16
- piegy-2.0.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
- piegy-2.0.2.dist-info/top_level.txt,sha256=k4QLYL8PqdqDuy95-4NZD_FVLqJDsmq67tpKkBn4vMw,6
18
- piegy-2.0.2.dist-info/RECORD,,
File without changes