pyerualjetwork 4.2.4b2__py3-none-any.whl → 4.2.6__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.
@@ -1,4 +1,4 @@
1
- __version__ = "4.2.4b2"
1
+ __version__ = "4.2.6"
2
2
  __update__ = "* Changes: https://github.com/HCB06/PyerualJetwork/blob/main/CHANGES\n* PyerualJetwork Homepage: https://github.com/HCB06/PyerualJetwork/tree/main\n* PyerualJetwork document: https://github.com/HCB06/PyerualJetwork/blob/main/Welcome_to_PyerualJetwork/PYERUALJETWORK_USER_MANUEL_AND_LEGAL_INFORMATION(EN).pdf\n* YouTube tutorials: https://www.youtube.com/@HasanCanBeydili"
3
3
 
4
4
  def print_version(__version__):
pyerualjetwork/plan.py CHANGED
@@ -196,7 +196,6 @@ def learner(x_train, y_train, optimizer, fit_start, strategy='accuracy', gen=Non
196
196
  ```python
197
197
  genetic_optimizer = lambda *args, **kwargs: planeat.evolver(*args,
198
198
  activation_add_prob=0.85,
199
- mutations=True,
200
199
  strategy='aggressive',
201
200
  **kwargs)
202
201
 
@@ -211,7 +211,6 @@ def learner(x_train, y_train, optimizer, fit_start, strategy='accuracy', gen=Non
211
211
  ```python
212
212
  genetic_optimizer = lambda *args, **kwargs: planeat_cuda.evolver(*args,
213
213
  activation_add_prob=0.85,
214
- mutations=True,
215
214
  strategy='aggressive',
216
215
  **kwargs)
217
216
 
pyerualjetwork/planeat.py CHANGED
@@ -15,6 +15,7 @@ ANAPLAN document: https://github.com/HCB06/Anaplan/blob/main/Welcome_to_Anaplan/
15
15
  import numpy as np
16
16
  import random
17
17
  import math
18
+ import copy
18
19
 
19
20
  ### LIBRARY IMPORTS ###
20
21
  from .plan import feed_forward
@@ -79,11 +80,9 @@ def evolver(weights,
79
80
  policy='aggressive',
80
81
  bad_genomes_selection_prob=None,
81
82
  bar_status=True,
82
- strategy='normal_selective',
83
- target_fitness='max',
83
+ strategy='normal_selective',
84
84
  bad_genomes_mutation_prob=None,
85
- activation_mutate_prob=0.5,
86
- save_best_genome=True,
85
+ activation_mutate_prob=0.5,
87
86
  fitness_bias=None,
88
87
  cross_over_mode='tpm',
89
88
  activation_mutate_add_prob=0.5,
@@ -139,8 +138,6 @@ def evolver(weights,
139
138
 
140
139
  Default: 'aggressive'.
141
140
 
142
- target_fitness (str, optional): Target fitness strategy for PLANEAT optimization. ('max' maximizes fitness, 'min' minimizes fitness.) Default: 'max'.
143
-
144
141
  fitness_bias (float, optional): Fitness bias must be a probability value between 0 and 1 that determines the effect of fitness on the crossover process. Default: Determined by the `strategy`.
145
142
 
146
143
  bad_genomes_mutation_prob (float, optional): The probability of applying mutation to the bad genomes.
@@ -150,9 +147,6 @@ def evolver(weights,
150
147
  activation_mutate_prob (float, optional): The probability of applying mutation to the activation functions.
151
148
  Must be in the range [0, 1]. Default is 0.5 (50%).
152
149
 
153
- save_best_genom (bool, optional): If True, ensures that the best genomes are saved and not mutated
154
- or altered during reproduction. Default is True.
155
-
156
150
  cross_over_mode (str, optional): Specifies the crossover method to use. Options:
157
151
  - 'tpm': Two-Point Matrix Crossover.
158
152
  Default is 'tpm'.
@@ -270,10 +264,9 @@ def evolver(weights,
270
264
  raise ValueError("genome population size must be even number. for example: not 99, make 100 or 98.")
271
265
 
272
266
 
273
- ### FITNESS IS SORTED IN ASCENDING (OR DESCENDING) ORDER, AND THE WEIGHT AND ACTIVATIONS OF EACH GENOME ARE SORTED ACCORDING TO THIS ORDER:
267
+ ### FITNESS IS SORTED IN ASCENDING ORDER, AND THE WEIGHT AND ACTIVATIONS OF EACH GENOME ARE SORTED ACCORDING TO THIS ORDER:
274
268
 
275
- if target_fitness == 'max': sort_indices = np.argsort(fitness)
276
- elif target_fitness == 'min': sort_indices = np.argsort(-fitness)
269
+ sort_indices = np.argsort(fitness)
277
270
 
278
271
  fitness = fitness[sort_indices]
279
272
  weights = weights[sort_indices]
@@ -284,11 +277,11 @@ def evolver(weights,
284
277
 
285
278
  good_weights = weights[slice_center:]
286
279
  bad_weights = weights[:slice_center]
287
- best_weight = good_weights[-1]
280
+ best_weight = np.copy(good_weights[-1])
288
281
 
289
282
  good_activations = list(activation_potentiations[slice_center:])
290
283
  bad_activations = list(activation_potentiations[:slice_center])
291
- best_activations = good_activations[-1]
284
+ best_activations = copy.deepcopy(good_activations[-1])
292
285
 
293
286
 
294
287
  ### PLANEAT IS APPLIED ACCORDING TO THE SPECIFIED POLICY, STRATEGY, AND PROBABILITY CONFIGURATION:
@@ -296,16 +289,16 @@ def evolver(weights,
296
289
  bar_format = loading_bars()[0]
297
290
 
298
291
  if bar_status: progress = initialize_loading_bar(len(bad_weights), desc="GENERATION: " + str(what_gen), bar_format=bar_format, ncols=50)
299
- normalized_fitness = abs(normalization(fitness, dtype=dtype))
292
+ normalized_fitness = normalization(fitness, dtype=dtype)
300
293
 
301
294
  best_fitness = normalized_fitness[-1]
302
295
  epsilon = np.finfo(float).eps
303
296
 
304
297
  child_W = np.copy(bad_weights)
305
- child_act = bad_activations.copy()
298
+ child_act = copy.deepcopy(bad_activations)
306
299
 
307
300
  mutated_W = np.copy(bad_weights)
308
- mutated_act = bad_activations.copy()
301
+ mutated_act = copy.deepcopy(bad_activations)
309
302
 
310
303
  for i in range(len(bad_weights)):
311
304
 
@@ -363,9 +356,8 @@ def evolver(weights,
363
356
 
364
357
  if bar_status: progress.update(1)
365
358
 
366
- if save_best_genome:
367
- child_W[-1] = best_weight
368
- child_act[-1] = best_activations
359
+ child_W[0] = best_weight
360
+ child_act[0] = best_activations
369
361
 
370
362
  weights = np.vstack((child_W, mutated_W))
371
363
  activation_potentiations = child_act + mutated_act
@@ -399,9 +391,9 @@ def evolver(weights,
399
391
  print(" MEAN FITNESS: ", str(round(np.mean(fitness), 2)))
400
392
  print(" MIN FITNESS: ", str(round(min(fitness), 2)) + '\n')
401
393
 
402
- print(" BEST GENOME ACTIVATION LENGTH: ", str(len(activation_potentiations[-1])))
403
- print(" BEST GENOME INDEX: ", str(len(weights)-1))
404
- print(" NOTE: Genomes are always sorted from the least successful to the most successful according to their performance ranking. Therefore, the genome at the last index is the king of the previous generation. " + '\n')
394
+ print(" BEST GENOME ACTIVATION LENGTH: ", str(len(best_activations)))
395
+ print(" BEST GENOME INDEX: ", str(0))
396
+ print(" NOTE: The returned genome at the first index is the best of the previous generation." + '\n')
405
397
 
406
398
 
407
399
  return weights, activation_potentiations
@@ -622,7 +614,7 @@ def cross_over(first_parent_W,
622
614
 
623
615
  if potential_activation_selection_add > activation_selection_add_prob:
624
616
 
625
- threshold = threshold / succes
617
+ threshold = abs(threshold / succes)
626
618
  new_threshold = threshold
627
619
 
628
620
  while True:
@@ -644,7 +636,7 @@ def cross_over(first_parent_W,
644
636
 
645
637
  if potential_activation_selection_change_prob > activation_selection_change_prob:
646
638
 
647
- threshold = threshold / succes
639
+ threshold = abs(threshold / succes)
648
640
  new_threshold = threshold
649
641
 
650
642
  while True:
@@ -726,27 +718,24 @@ def mutation(weight,
726
718
  row_end = weight.shape[0]
727
719
  col_end = weight.shape[1]
728
720
 
721
+ max_threshold = row_end * col_end
722
+
729
723
  threshold = threshold * genome_fitness
730
- performance_control = 0
731
724
  new_threshold = threshold
732
725
 
733
- while True:
726
+ for _ in range(max_threshold):
734
727
 
735
728
  selected_row = int(random.uniform(start, row_end))
736
729
  selected_col = int(random.uniform(start, col_end))
737
730
 
738
731
  weight[selected_row, selected_col] = random.uniform(-1, 1)
739
732
 
740
- if row_end * col_end > new_threshold:
733
+ if max_threshold > new_threshold:
741
734
  new_threshold += threshold
742
- performance_control += 1
743
- pass
744
735
 
745
736
  else:
746
737
  break
747
738
 
748
- if performance_control == row_end * col_end:
749
- break
750
739
 
751
740
  activation_mutate_prob = 1 - activation_mutate_prob
752
741
  potential_activation_mutation = random.uniform(0, 1)
@@ -16,6 +16,7 @@ import cupy as cp
16
16
  import numpy as np
17
17
  import random
18
18
  import math
19
+ import copy
19
20
 
20
21
 
21
22
  ### LIBRARY IMPORTS ###
@@ -81,11 +82,9 @@ def evolver(weights,
81
82
  policy='aggressive',
82
83
  bad_genomes_selection_prob=None,
83
84
  bar_status=True,
84
- strategy='normal_selective',
85
- target_fitness='max',
85
+ strategy='normal_selective',
86
86
  bad_genomes_mutation_prob=None,
87
87
  activation_mutate_prob=0.5,
88
- save_best_genome=True,
89
88
  fitness_bias=None,
90
89
  cross_over_mode='tpm',
91
90
  activation_mutate_add_prob=0.5,
@@ -141,8 +140,6 @@ def evolver(weights,
141
140
 
142
141
  Default: 'aggressive'.
143
142
 
144
- target_fitness (str, optional): Target fitness strategy for PLANEAT optimization. ('max' maximizes fitness, 'min' minimizes fitness.) Default: 'max'.
145
-
146
143
  fitness_bias (float, optional): Fitness bias must be a probability value between 0 and 1 that determines the effect of fitness on the crossover process. Default: Determined by the `strategy`.
147
144
 
148
145
  bad_genomes_mutation_prob (float, optional): The probability of applying mutation to the bad genomes.
@@ -152,9 +149,6 @@ def evolver(weights,
152
149
  activation_mutate_prob (float, optional): The probability of applying mutation to the activation functions.
153
150
  Must be in the range [0, 1]. Default is 0.5 (50%).
154
151
 
155
- save_best_genome (bool, optional): If True, ensures that the best genomes are saved and not mutated
156
- or altered during reproduction. Default is True.
157
-
158
152
  cross_over_mode (str, optional): Specifies the crossover method to use. Options:
159
153
  - 'tpm': Two-Point Matrix Crossover.
160
154
  Default is 'tpm'.
@@ -270,10 +264,9 @@ def evolver(weights,
270
264
  else:
271
265
  raise ValueError("genome population size must be even number. for example: not 99, make 100 or 98.")
272
266
 
273
- ### FITNESS LIST IS SORTED IN ASCENDING (OR DESCENDING) ORDER, AND THE WEIGHT AND ACTIVATIONS OF EACH GENOME ARE SORTED ACCORDING TO THIS ORDER:
267
+ ### FITNESS LIST IS SORTED IN ASCENDING ORDER, AND THE WEIGHT AND ACTIVATIONS OF EACH GENOME ARE SORTED ACCORDING TO THIS ORDER:
274
268
 
275
- if target_fitness == 'max': sort_indices = cp.argsort(fitness)
276
- elif target_fitness == 'min': sort_indices = cp.argsort(-fitness)
269
+ sort_indices = cp.argsort(fitness)
277
270
 
278
271
  fitness = fitness[sort_indices]
279
272
  weights = weights[sort_indices]
@@ -284,11 +277,11 @@ def evolver(weights,
284
277
 
285
278
  good_weights = weights[slice_center:]
286
279
  bad_weights = weights[:slice_center]
287
- best_weight = good_weights[-1]
280
+ best_weight = cp.copy(good_weights[-1])
288
281
 
289
282
  good_activations = list(activation_potentiations[slice_center:])
290
283
  bad_activations = list(activation_potentiations[:slice_center])
291
- best_activations = good_activations[-1]
284
+ best_activations = copy.deepcopy(good_activations[-1])
292
285
 
293
286
 
294
287
  ### PLANEAT IS APPLIED ACCORDING TO THE SPECIFIED POLICY, STRATEGY, AND PROBABILITY CONFIGURATION:
@@ -296,16 +289,16 @@ def evolver(weights,
296
289
  bar_format = loading_bars()[0]
297
290
 
298
291
  if bar_status: progress = initialize_loading_bar(len(bad_weights), desc="GENERATION: " + str(what_gen), bar_format=bar_format, ncols=50)
299
- normalized_fitness = abs(normalization(fitness, dtype=dtype))
292
+ normalized_fitness = normalization(fitness, dtype=dtype)
300
293
 
301
294
  best_fitness = normalized_fitness[-1]
302
295
  epsilon = cp.finfo(float).eps
303
296
 
304
297
  child_W = cp.copy(bad_weights)
305
- child_act = bad_activations.copy()
298
+ child_act = copy.deepcopy(bad_activations)
306
299
 
307
300
  mutated_W = cp.copy(bad_weights)
308
- mutated_act = bad_activations.copy()
301
+ mutated_act = copy.deepcopy(bad_activations)
309
302
 
310
303
 
311
304
  for i in range(len(bad_weights)):
@@ -364,9 +357,8 @@ def evolver(weights,
364
357
 
365
358
  if bar_status: progress.update(1)
366
359
 
367
- if save_best_genome:
368
- child_W[-1] = best_weight
369
- child_act[-1] = best_activations
360
+ child_W[0] = best_weight
361
+ child_act[0] = best_activations
370
362
 
371
363
  weights = cp.vstack((child_W, mutated_W))
372
364
  activation_potentiations = child_act + mutated_act
@@ -394,13 +386,13 @@ def evolver(weights,
394
386
  print(" ACTIVATION SELECTION RATE (THRESHOLD VALUE FOR SINGLE CROSS OVER):", str(activation_selection_rate) + '\n')
395
387
 
396
388
  print("*** Performance ***")
397
- print(" MAX REWARD: ", str(cp.round(max(fitness), 2)))
398
- print(" MEAN REWARD: ", str(cp.round(cp.mean(fitness), 2)))
399
- print(" MIN REWARD: ", str(cp.round(min(fitness), 2)) + '\n')
389
+ print(" MAX FITNESS: ", str(cp.round(max(fitness), 2)))
390
+ print(" MEAN FITNESS: ", str(cp.round(cp.mean(fitness), 2)))
391
+ print(" MIN FITNESS: ", str(cp.round(min(fitness), 2)) + '\n')
400
392
 
401
- print(" BEST GENOME ACTIVATION LENGTH: ", str(len(activation_potentiations)))
402
- print(" BEST GENOME INDEX: ", str(len(weights)-1))
403
- print(" NOTE: Genomes are always sorted from the least successful to the most successful according to their performance ranking. Therefore, the genome at the last index is the king of the previous generation. " + '\n')
393
+ print(" BEST GENOME ACTIVATION LENGTH: ", str(len(best_activations)))
394
+ print(" BEST GENOME INDEX: ", str(0))
395
+ print(" NOTE: The returned genome at the first index is the best of the previous generation." + '\n')
404
396
 
405
397
 
406
398
  return weights, activation_potentiations
@@ -626,7 +618,7 @@ def cross_over(first_parent_W,
626
618
 
627
619
  if potential_activation_selection_add > activation_selection_add_prob:
628
620
 
629
- threshold = threshold / succes
621
+ threshold = abs(threshold / succes)
630
622
  new_threshold = threshold
631
623
 
632
624
  while True:
@@ -648,7 +640,7 @@ def cross_over(first_parent_W,
648
640
 
649
641
  if potential_activation_selection_change_prob > activation_selection_change_prob:
650
642
 
651
- threshold = threshold / succes
643
+ threshold = abs(threshold / succes)
652
644
  new_threshold = threshold
653
645
 
654
646
  while True:
@@ -731,27 +723,23 @@ def mutation(weight,
731
723
  row_end = weight.shape[0]
732
724
  col_end = weight.shape[1]
733
725
 
726
+ max_threshold = row_end * col_end
727
+
734
728
  threshold = threshold * genome_fitness
735
729
  new_threshold = threshold
736
- performance_control = 0
737
730
 
738
- while True:
731
+ for _ in range(max_threshold):
739
732
 
740
733
  selected_row = int(random.uniform(start, row_end))
741
734
  selected_col = int(random.uniform(start, col_end))
742
735
 
743
736
  weight[selected_row, selected_col] = random.uniform(-1, 1)
744
737
 
745
- if row_end * col_end > new_threshold:
738
+ if max_threshold > new_threshold:
746
739
  new_threshold += threshold
747
- performance_control += 1
748
- pass
749
740
 
750
741
  else:
751
742
  break
752
-
753
- if performance_control >= row_end * col_end:
754
- break
755
743
 
756
744
  activation_mutate_prob = 1 - activation_mutate_prob
757
745
  potential_activation_mutation = random.uniform(0, 1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyerualjetwork
3
- Version: 4.2.4b2
3
+ Version: 4.2.6
4
4
  Summary: PyerualJetwork is a machine learning library supported with GPU(CUDA) acceleration written in Python for professionals and researchers including with PLAN algorithm, PLANEAT algorithm (genetic optimization). Also includes data pre-process and memory manegament
5
5
  Author: Hasan Can Beydili
6
6
  Author-email: tchasancan@gmail.com
@@ -38,7 +38,6 @@ GitHub Page: https://github.com/HCB06/PyerualJetwork
38
38
  Optimized for Visual Studio Code
39
39
 
40
40
  requires=[
41
- 'setuptools==75.6.0',
42
41
  'scipy==1.13.1',
43
42
  'tqdm==4.66.4',
44
43
  'seaborn==0.13.2',
@@ -52,8 +51,6 @@ GitHub Page: https://github.com/HCB06/PyerualJetwork
52
51
  ]
53
52
 
54
53
  matplotlib, seaborn, networkx (optional).
55
- PyerualJetwork checks and install all dependencies with optional ones for every runing.
56
- If your version is higher or lower, PyerualJetwork automaticly delete other versions and installs this versions.
57
54
 
58
55
  ##############################
59
56
 
@@ -61,7 +58,7 @@ ABOUT PYERUALJETWORK:
61
58
 
62
59
  PyerualJetwork is a machine learning library written in Python for professionals, incorporating advanced, unique, new, and modern techniques with optimized GPU acceleration. Its most important component is the PLAN (Potentiation Learning Artificial Neural Network) https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4862342. (THIS ARTICLE IS FIRST VERSION OF PLAN.) MODERN VERSION OF PLAN: https://github.com/HCB06/PyerualJetwork/blob/main/Welcome_to_PLAN/PLAN.pdf
63
60
  Both the PLAN algorithm and the PyerualJetwork library were created by Author, and all rights are reserved by Author.
64
- PyerualJetwork is free to use for commercial business and individual users. PyerualJetwork is written in fully functional programming with non-oop elements. PyerualJetwork consists of many functions that complement each other, which facilitates the learning process and debugging during use.
61
+ PyerualJetwork is free to use for commercial business and individual users.
65
62
  As of 12/21/2024, the library includes PLAN and PLANEAT module, but other machine learning modules are expected to be added in the future.
66
63
 
67
64
  PyerualJetwork ready for both eager execution(like PyTorch) and static graph(like Tensorflow) concepts because PyerualJetwork using only functions.
@@ -1,4 +1,4 @@
1
- pyerualjetwork/__init__.py,sha256=WIsIQyJj1qNVLNGxNoKEKgttR8P1wrkdwmcIBcN5uIQ,641
1
+ pyerualjetwork/__init__.py,sha256=P6B7ccTwijjEmfwBjrO7UilDfgAI_hTL-PjplThSqoE,639
2
2
  pyerualjetwork/activation_functions.py,sha256=WWOdMd5pI6ZKe-ieKCIsKAYPQODHuXYxx7tzhA5xjes,11767
3
3
  pyerualjetwork/activation_functions_cuda.py,sha256=KmXJ5Cdig46XAMYakXFPEOlxSxtFJjD21-i3nGtxPjE,11807
4
4
  pyerualjetwork/data_operations.py,sha256=pb5CqJ0Th6fCjTNMCtqQMiwH3KezTxAijacglsKUxmY,14730
@@ -11,14 +11,14 @@ pyerualjetwork/metrics.py,sha256=q7MkhnZDRbCjFBDDfUgrl8lBYnUT_1ro1LxeBq105pI,607
11
11
  pyerualjetwork/metrics_cuda.py,sha256=73h9GC7XwmnFCVzFEEiPQfF8CwHIz2wsCbxpZrJtYgw,5061
12
12
  pyerualjetwork/model_operations.py,sha256=RKqnh7-MByFosxqme4q4jC1lOndX26O-OVXYV6ZxoEE,12965
13
13
  pyerualjetwork/model_operations_cuda.py,sha256=XnKKq54ZLaqCm-NaJ6d8IToACKcKg2Ttq6moowVRRWo,13365
14
- pyerualjetwork/plan.py,sha256=YOBF2CqGu400Zk6xuraP0X8WzMNyejpZc5tdVV4dEvE,32219
15
- pyerualjetwork/plan_cuda.py,sha256=OKK0pmJYLQd5-dJ1aLiyWiZRBmoUp1zBkFxRcxnWBVI,33610
16
- pyerualjetwork/planeat.py,sha256=4XcmQhMHXA6hUWsDZXC2T3I18BeSP4V-GmPYToGR0kg,39638
17
- pyerualjetwork/planeat_cuda.py,sha256=xaDqH0kWwkmjx-YrBIuLoE1G26qk6rjuOvkH8oRWqyI,39598
14
+ pyerualjetwork/plan.py,sha256=UzCTFCA9cTv9ITCtsqfJ1g02rCMyescoIV6j1amvYGw,32134
15
+ pyerualjetwork/plan_cuda.py,sha256=hpXZl3h7B1qAVYW-gZebwKMZd4-ftAZ-u05teOJjsno,33525
16
+ pyerualjetwork/planeat.py,sha256=cDr0QfOD4FFibcpgsnyQiSpRUwkfYHkBJGqxBnyzx9Q,38893
17
+ pyerualjetwork/planeat_cuda.py,sha256=NiQfIAqlWC4iVmxKYnrQtKPz-7vAY1yoasOM3rRDvi0,38856
18
18
  pyerualjetwork/ui.py,sha256=wu2BhU1k-w3Kcho5Jtq4SEKe68ftaUeRGneUOSCVDjU,575
19
19
  pyerualjetwork/visualizations.py,sha256=1SKMZaJ80OD2qHUyMxW1IOv8zwmxzMPxclfbeq1Xr4g,28772
20
20
  pyerualjetwork/visualizations_cuda.py,sha256=KbMhfsLlxujy_i3QrwCf734Q-k6d7Zn_7CEbm3gzK9w,29186
21
- pyerualjetwork-4.2.4b2.dist-info/METADATA,sha256=cNXb8qCCtyy4izZNQsvfaBUfn1lQNR9SrBiyRjunxYs,7914
22
- pyerualjetwork-4.2.4b2.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
23
- pyerualjetwork-4.2.4b2.dist-info/top_level.txt,sha256=BRyt62U_r3ZmJpj-wXNOoA345Bzamrj6RbaWsyW4tRg,15
24
- pyerualjetwork-4.2.4b2.dist-info/RECORD,,
21
+ pyerualjetwork-4.2.6.dist-info/METADATA,sha256=HISmko-Ho-pe_mZPtA2mBBcXkZYiITyCfPTAp_AT_Ps,7452
22
+ pyerualjetwork-4.2.6.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
23
+ pyerualjetwork-4.2.6.dist-info/top_level.txt,sha256=BRyt62U_r3ZmJpj-wXNOoA345Bzamrj6RbaWsyW4tRg,15
24
+ pyerualjetwork-4.2.6.dist-info/RECORD,,