pyerualjetwork 4.2.0b2__py3-none-any.whl → 4.2.0b4__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.
@@ -48,7 +48,7 @@ for package_name in package_names:
48
48
 
49
49
  print(f"PyerualJetwork is ready to use with {err} errors")
50
50
 
51
- __version__ = "4.2.0b2"
51
+ __version__ = "4.2.0b4"
52
52
  __update__ = "* Changes: https://github.com/HCB06/PyerualJetwork/blob/main/CHANGES\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"
53
53
 
54
54
  def print_version(__version__):
pyerualjetwork/planeat.py CHANGED
@@ -290,7 +290,7 @@ def evolver(weights,
290
290
 
291
291
  good_weights = weights[slice_center:]
292
292
  bad_weights = weights[:slice_center]
293
- best_weights = good_weights[-1]
293
+ best_weight = good_weights[-1]
294
294
 
295
295
  good_activations = list(activation_potentiations[slice_center:])
296
296
  bad_activations = list(activation_potentiations[:slice_center])
@@ -305,46 +305,47 @@ def evolver(weights,
305
305
  normalized_fitness = abs(normalization(fitness, dtype=dtype))
306
306
 
307
307
  best_fitness = normalized_fitness[-1]
308
+ epsilon = np.finfo(float).eps
308
309
 
309
- for i in range(len(bad_weights)):
310
- second_parent_W, second_parent_act, s_i = second_parent_selection(good_weights, bad_weights, good_activations, bad_activations, bad_genomes_selection_prob)
310
+ child_W = np.empty(bad_weights[0].shape, dtype=dtype)
311
+ child_act = bad_activations.copy()
311
312
 
313
+ for i in range(len(bad_weights)):
314
+
312
315
  if policy == 'aggresive':
313
- bad_weights[i], bad_activations[i] = cross_over(best_weights,
314
- second_parent_W,
315
- best_activations,
316
- second_parent_act,
317
- cross_over_mode=cross_over_mode,
318
- activation_selection_add_prob=activation_selection_add_prob,
319
- activation_selection_change_prob=activation_selection_change_prob,
320
- activation_selection_rate=activation_selection_rate,
321
- bad_genomes_selection_prob=bad_genomes_selection_prob,
322
- first_parent_fitness=best_fitness,
323
- fitness_bias=fitness_bias,
324
- second_parent_fitness=normalized_fitness[s_i]
325
- )
316
+ first_parent_W = best_weight
317
+ first_parent_act = best_activations
318
+
326
319
  elif policy == 'explorer':
327
- bad_weights[i], bad_activations[i] = cross_over(good_weights[i],
328
- second_parent_W,
329
- good_activations[i],
330
- second_parent_act,
331
- cross_over_mode=cross_over_mode,
332
- activation_selection_add_prob=activation_selection_add_prob,
333
- activation_selection_change_prob=activation_selection_change_prob,
334
- activation_selection_rate=activation_selection_rate,
335
- bad_genomes_selection_prob=bad_genomes_selection_prob,
336
- first_parent_fitness=normalized_fitness[i],
337
- fitness_bias=fitness_bias,
338
- second_parent_fitness=normalized_fitness[s_i]
339
- )
340
-
320
+ first_parent_W = good_weights[i]
321
+ first_parent_act = good_activations[i]
322
+
341
323
  else: raise ValueError("policy parameter must be: 'aggresive' or 'explorer'")
324
+
325
+ second_parent_W, second_parent_act, s_i = second_parent_selection(good_weights, bad_weights, good_activations, bad_activations, bad_genomes_selection_prob)
326
+
327
+ child_W[i], child_act[i] = cross_over(first_parent_W,
328
+ second_parent_W,
329
+ first_parent_act,
330
+ second_parent_act,
331
+ cross_over_mode=cross_over_mode,
332
+ activation_selection_add_prob=activation_selection_add_prob,
333
+ activation_selection_change_prob=activation_selection_change_prob,
334
+ activation_selection_rate=activation_selection_rate,
335
+ bad_genomes_selection_prob=bad_genomes_selection_prob,
336
+ first_parent_fitness=best_fitness,
337
+ fitness_bias=fitness_bias,
338
+ second_parent_fitness=normalized_fitness[s_i],
339
+ epsilon=epsilon
340
+ )
341
+
342
342
 
343
343
  if mutations is True:
344
344
  mutation_prob = random.uniform(0, 1)
345
345
 
346
346
  if mutation_prob > bad_genomes_mutation_prob:
347
- if (save_best_genom == True and not np.array_equal(good_weights[i], best_weights)) or save_best_genom == False:
347
+ if (save_best_genom == True and not np.array_equal(good_weights[i], best_weight)) or save_best_genom == False:
348
+
348
349
  good_weights[i], good_activations[i] = mutation(good_weights[i],
349
350
  good_activations[i],
350
351
  activation_mutate_prob=activation_mutate_prob,
@@ -353,7 +354,8 @@ def evolver(weights,
353
354
  activation_change_prob=activation_mutate_change_prob,
354
355
  weight_mutate_prob=weight_mutate_prob,
355
356
  threshold=weight_mutate_rate,
356
- genome_fitness=normalized_fitness[i]
357
+ genome_fitness=normalized_fitness[i],
358
+ epsilon=epsilon
357
359
  )
358
360
 
359
361
  elif mutation_prob < bad_genomes_mutation_prob:
@@ -365,13 +367,14 @@ def evolver(weights,
365
367
  activation_change_prob=activation_mutate_change_prob,
366
368
  weight_mutate_prob=weight_mutate_prob,
367
369
  threshold=weight_mutate_rate,
368
- genome_fitness=normalized_fitness[i]
370
+ genome_fitness=normalized_fitness[i],
371
+ epsilon=epsilon
369
372
  )
370
373
 
371
374
  if bar_status: progress.update(1)
372
375
 
373
- weights = np.vstack((bad_weights, good_weights))
374
- activation_potentiations = bad_activations + good_activations
376
+ weights = np.vstack((child_W, good_weights))
377
+ activation_potentiations = child_act + good_activations
375
378
 
376
379
  ### INFO PRINTING CONSOLE
377
380
 
@@ -491,7 +494,8 @@ def cross_over(first_parent_W,
491
494
  bad_genomes_selection_prob,
492
495
  first_parent_fitness,
493
496
  second_parent_fitness,
494
- fitness_bias):
497
+ fitness_bias,
498
+ epsilon):
495
499
  """
496
500
  Performs a crossover operation on two sets of weights and activation functions.
497
501
  This function combines two individuals (represented by their weights and activation functions)
@@ -499,22 +503,35 @@ def cross_over(first_parent_W,
499
503
 
500
504
  Args:
501
505
  first_parent_W (numpy.ndarray): The weight matrix of the first individual (parent).
506
+
502
507
  second_parent_W (numpy.ndarray): The weight matrix of the second individual (parent).
508
+
503
509
  first_parent_act (str or list): The activation function(s) of the first individual.
510
+
504
511
  second_parent_act (str or list): The activation function(s) of the second individual.
512
+
505
513
  cross_over_mode (str): Determines the crossover method to be used. Options:
506
514
  - 'tpm': Two-Point Matrix Crossover, where sub-matrices of weights are swapped between parents.
515
+
507
516
  activation_selection_add_prob (float): Probability of adding new activation functions
508
517
  from the second parent to the child genome.
518
+
509
519
  activation_selection_change_prob (float): Probability of replacing an activation function in the child genome
510
520
  with one from the second parent.
521
+
511
522
  activation_selection_rate (float): Determines how quickly activation functions are added or replaced
512
523
  during the crossover process.
524
+
513
525
  bad_genomes_selection_prob (float): Probability of selecting a "bad" genome for replacement with the offspring.
526
+
514
527
  first_parent_fitness (float): Fitness score of the first parent.
528
+
515
529
  second_parent_fitness (float): Fitness score of the second parent.
530
+
516
531
  fitness_bias (float): A bias factor used to favor fitter parents during crossover operations.
517
532
 
533
+ epsilon (float): Small epsilon constant
534
+
518
535
  Returns:
519
536
  tuple: A tuple containing:
520
537
  - child_W (numpy.ndarray): The weight matrix of the new individual created by crossover.
@@ -539,7 +556,8 @@ def cross_over(first_parent_W,
539
556
  bad_genomes_selection_prob=0.7,
540
557
  first_parent_fitness=0.9,
541
558
  second_parent_fitness=0.85,
542
- fitness_bias=0.6
559
+ fitness_bias=0.6,
560
+ epsilon=np.finfo.eps
543
561
  )
544
562
  ```
545
563
  """
@@ -562,7 +580,7 @@ def cross_over(first_parent_W,
562
580
 
563
581
  undominant_parent_W = np.copy(second_parent_W)
564
582
  undominant_parent_act = second_parent_act
565
- succes = second_parent_fitness
583
+ succes = second_parent_fitness + epsilon
566
584
 
567
585
  elif decision == 'second_parent':
568
586
  dominant_parent_W = np.copy(second_parent_W)
@@ -570,7 +588,7 @@ def cross_over(first_parent_W,
570
588
 
571
589
  undominant_parent_W = np.copy(first_parent_W)
572
590
  undominant_parent_act = first_parent_act
573
- succes = first_parent_fitness
591
+ succes = first_parent_fitness + epsilon
574
592
 
575
593
  while True:
576
594
 
@@ -588,18 +606,17 @@ def cross_over(first_parent_W,
588
606
  selection_bias = random.uniform(0, 1)
589
607
 
590
608
  if fitness_bias > selection_bias:
591
- row_cut_start = math.floor(row_cut_start * succes)
592
- row_cut_end = math.ceil(row_cut_end * succes)
609
+ row_cut_start = math.floor(row_cut_start * (succes + epsilon))
610
+ row_cut_end = math.ceil(row_cut_end * (succes + epsilon))
593
611
 
594
- col_cut_start = math.floor(col_cut_start * succes)
595
- col_cut_end = math.ceil(col_cut_end * succes)
612
+ col_cut_start = math.floor(col_cut_start * (succes + epsilon))
613
+ col_cut_end = math.ceil(col_cut_end * (succes + epsilon))
596
614
 
597
615
  child_W = dominant_parent_W
598
616
 
599
617
  if cross_over_mode == 'tpm':
600
618
  child_W[row_cut_start:row_cut_end, col_cut_start:col_cut_end] = undominant_parent_W[row_cut_start:row_cut_end, col_cut_start:col_cut_end]
601
619
 
602
-
603
620
  if isinstance(dominant_parent_act, str): dominant_parent_act = [dominant_parent_act]
604
621
  if isinstance(undominant_parent_act, str): undominant_parent_act = [undominant_parent_act]
605
622
 
@@ -660,7 +677,8 @@ def mutation(weight,
660
677
  activation_change_prob,
661
678
  weight_mutate_prob,
662
679
  threshold,
663
- genome_fitness):
680
+ genome_fitness,
681
+ epsilon):
664
682
  """
665
683
  Performs mutation on the given weight matrix and activation functions.
666
684
  - The weight matrix is mutated by randomly changing its values based on the mutation probability.
@@ -668,14 +686,25 @@ def mutation(weight,
668
686
 
669
687
  Args:
670
688
  weight (numpy.ndarray): The weight matrix to mutate.
689
+
671
690
  activations (list): The list of activation functions to mutate.
691
+
672
692
  activation_mutate_prob (float): The overall probability of mutating activation functions.
693
+
673
694
  activation_add_prob (float): Probability of adding a new activation function.
695
+
674
696
  activation_delete_prob (float): Probability of removing an existing activation function.
697
+
675
698
  activation_change_prob (float): Probability of replacing an existing activation function with a new one.
699
+
676
700
  weight_mutate_prob (float): The probability of mutating weight matrix.
701
+
677
702
  threshold (float): If the value you enter here is equal to the result of input layer * output layer, only a single weight will be mutated during each mutation process. If the value you enter here is half of the result of input layer * output layer, two weights in the weight matrix will be mutated.
703
+
678
704
  genome_fitness (float): Fitness value of genome
705
+
706
+ epsilon (float): Small epsilon constant
707
+
679
708
  Returns:
680
709
  tuple: A tuple containing:
681
710
  - mutated_weight (numpy.ndarray): The weight matrix after mutation.
@@ -703,8 +732,8 @@ def mutation(weight,
703
732
  start = 0
704
733
  row_end = weight.shape[0]
705
734
  col_end = weight.shape[1]
706
-
707
- threshold = threshold * genome_fitness
735
+
736
+ threshold = threshold * (genome_fitness + epsilon)
708
737
  new_threshold = threshold
709
738
 
710
739
  while True:
@@ -290,7 +290,7 @@ def evolver(weights,
290
290
 
291
291
  good_weights = weights[slice_center:]
292
292
  bad_weights = weights[:slice_center]
293
- best_weights = good_weights[-1]
293
+ best_weight = good_weights[-1]
294
294
 
295
295
  good_activations = list(activation_potentiations[slice_center:])
296
296
  bad_activations = list(activation_potentiations[:slice_center])
@@ -305,46 +305,47 @@ def evolver(weights,
305
305
  normalized_fitness = abs(normalization(fitness, dtype=dtype))
306
306
 
307
307
  best_fitness = normalized_fitness[-1]
308
+ epsilon = cp.finfo(float).eps
309
+
310
+ child_W = cp.empty(bad_weights[0].shape, dtype=dtype)
311
+ child_act = bad_activations.copy()
308
312
 
309
313
  for i in range(len(bad_weights)):
310
- second_parent_W, second_parent_act, s_i = second_parent_selection(good_weights, bad_weights, good_activations, bad_activations, bad_genomes_selection_prob)
311
-
314
+
312
315
  if policy == 'aggresive':
313
- bad_weights[i], bad_activations[i] = cross_over(best_weights,
314
- second_parent_W,
315
- best_activations,
316
- second_parent_act,
317
- cross_over_mode=cross_over_mode,
318
- activation_selection_add_prob=activation_selection_add_prob,
319
- activation_selection_change_prob=activation_selection_change_prob,
320
- activation_selection_rate=activation_selection_rate,
321
- bad_genomes_selection_prob=bad_genomes_selection_prob,
322
- first_parent_fitness=best_fitness,
323
- fitness_bias=fitness_bias,
324
- second_parent_fitness=normalized_fitness[s_i]
325
- )
316
+ first_parent_W = best_weight
317
+ first_parent_act = best_activations
318
+
326
319
  elif policy == 'explorer':
327
- bad_weights[i], bad_activations[i] = cross_over(good_weights[i],
328
- second_parent_W,
329
- good_activations[i],
330
- second_parent_act,
331
- cross_over_mode=cross_over_mode,
332
- activation_selection_add_prob=activation_selection_add_prob,
333
- activation_selection_change_prob=activation_selection_change_prob,
334
- activation_selection_rate=activation_selection_rate,
335
- bad_genomes_selection_prob=bad_genomes_selection_prob,
336
- first_parent_fitness=normalized_fitness[i],
337
- fitness_bias=fitness_bias,
338
- second_parent_fitness=normalized_fitness[s_i]
339
- )
340
-
320
+ first_parent_W = good_weights[i]
321
+ first_parent_act = good_activations[i]
322
+
341
323
  else: raise ValueError("policy parameter must be: 'aggresive' or 'explorer'")
324
+
325
+ second_parent_W, second_parent_act, s_i = second_parent_selection(good_weights, bad_weights, good_activations, bad_activations, bad_genomes_selection_prob)
326
+
327
+ child_W[i], child_act[i] = cross_over(first_parent_W,
328
+ second_parent_W,
329
+ first_parent_act,
330
+ second_parent_act,
331
+ cross_over_mode=cross_over_mode,
332
+ activation_selection_add_prob=activation_selection_add_prob,
333
+ activation_selection_change_prob=activation_selection_change_prob,
334
+ activation_selection_rate=activation_selection_rate,
335
+ bad_genomes_selection_prob=bad_genomes_selection_prob,
336
+ first_parent_fitness=best_fitness,
337
+ fitness_bias=fitness_bias,
338
+ second_parent_fitness=normalized_fitness[s_i],
339
+ epsilon=epsilon
340
+ )
341
+
342
342
 
343
343
  if mutations is True:
344
344
  mutation_prob = random.uniform(0, 1)
345
345
 
346
346
  if mutation_prob > bad_genomes_mutation_prob:
347
- if (save_best_genom == True and not np.array_equal(good_weights[i], best_weights)) or save_best_genom == False:
347
+ if (save_best_genom == True and not np.array_equal(good_weights[i], best_weight)) or save_best_genom == False:
348
+
348
349
  good_weights[i], good_activations[i] = mutation(good_weights[i],
349
350
  good_activations[i],
350
351
  activation_mutate_prob=activation_mutate_prob,
@@ -353,7 +354,8 @@ def evolver(weights,
353
354
  activation_change_prob=activation_mutate_change_prob,
354
355
  weight_mutate_prob=weight_mutate_prob,
355
356
  threshold=weight_mutate_rate,
356
- genome_fitness=normalized_fitness[i]
357
+ genome_fitness=normalized_fitness[i],
358
+ epsilon=epsilon
357
359
  )
358
360
 
359
361
  elif mutation_prob < bad_genomes_mutation_prob:
@@ -365,13 +367,14 @@ def evolver(weights,
365
367
  activation_change_prob=activation_mutate_change_prob,
366
368
  weight_mutate_prob=weight_mutate_prob,
367
369
  threshold=weight_mutate_rate,
368
- genome_fitness=normalized_fitness[i]
370
+ genome_fitness=normalized_fitness[i],
371
+ epsilon=epsilon
369
372
  )
370
373
 
371
374
  if bar_status: progress.update(1)
372
375
 
373
- weights = cp.vstack((bad_weights, good_weights))
374
- activation_potentiations = bad_activations + good_activations
376
+ weights = cp.vstack((child_W, good_weights))
377
+ activation_potentiations = child_act + good_activations
375
378
 
376
379
  ### INFO PRINTING CONSOLE
377
380
 
@@ -494,7 +497,8 @@ def cross_over(first_parent_W,
494
497
  bad_genomes_selection_prob,
495
498
  first_parent_fitness,
496
499
  second_parent_fitness,
497
- fitness_bias):
500
+ fitness_bias,
501
+ epsilon):
498
502
  """
499
503
  Performs a crossover operation on two sets of weights and activation functions.
500
504
  This function combines two individuals (represented by their weights and activation functions)
@@ -529,6 +533,8 @@ def cross_over(first_parent_W,
529
533
 
530
534
  fitness_bias (float): A bias factor used to favor fitter parents during crossover operations.
531
535
 
536
+ epsilon (float): Small epsilon constant
537
+
532
538
  Returns:
533
539
  tuple: A tuple containing:
534
540
  - child_W (numpy.ndarray): The weight matrix of the new individual created by crossover.
@@ -553,7 +559,8 @@ def cross_over(first_parent_W,
553
559
  bad_genomes_selection_prob=0.7,
554
560
  first_parent_fitness=0.9,
555
561
  second_parent_fitness=0.85,
556
- fitness_bias=0.6
562
+ fitness_bias=0.6,
563
+ epsilon=cp.finfo.eps
557
564
  )
558
565
  ```
559
566
  """
@@ -576,7 +583,7 @@ def cross_over(first_parent_W,
576
583
 
577
584
  undominant_parent_W = cp.copy(second_parent_W)
578
585
  undominant_parent_act = second_parent_act
579
- succes = second_parent_fitness
586
+ succes = second_parent_fitness + epsilon
580
587
 
581
588
  elif decision == 'second_parent':
582
589
  dominant_parent_W = cp.copy(second_parent_W)
@@ -584,7 +591,7 @@ def cross_over(first_parent_W,
584
591
 
585
592
  undominant_parent_W = cp.copy(first_parent_W)
586
593
  undominant_parent_act = first_parent_act
587
- succes = first_parent_fitness
594
+ succes = first_parent_fitness + epsilon
588
595
 
589
596
  while True:
590
597
 
@@ -675,7 +682,8 @@ def mutation(weight,
675
682
  activation_change_prob,
676
683
  weight_mutate_prob,
677
684
  threshold,
678
- genome_fitness):
685
+ genome_fitness,
686
+ epsilon):
679
687
  """
680
688
  Performs mutation on the given weight matrix and activation functions.
681
689
  - The weight matrix is mutated by randomly changing its values based on the mutation probability.
@@ -700,6 +708,8 @@ def mutation(weight,
700
708
 
701
709
  genome_fitness (float): Fitness value of genome
702
710
 
711
+ epsilon (float): Small epsilon constant
712
+
703
713
  Returns:
704
714
  tuple: A tuple containing:
705
715
  - mutated_weight (numpy.ndarray): The weight matrix after mutation.
@@ -728,7 +738,7 @@ def mutation(weight,
728
738
  row_end = weight.shape[0]
729
739
  col_end = weight.shape[1]
730
740
 
731
- threshold = threshold * genome_fitness
741
+ threshold = threshold * (genome_fitness + epsilon)
732
742
  new_threshold = threshold
733
743
 
734
744
  while True:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyerualjetwork
3
- Version: 4.2.0b2
3
+ Version: 4.2.0b4
4
4
  Summary: PyerualJetwork is a machine learning library written in Python for professionals, incorporating advanced, unique, new, and modern techniques.
5
5
  Author: Hasan Can Beydili
6
6
  Author-email: tchasancan@gmail.com
@@ -1,4 +1,4 @@
1
- pyerualjetwork/__init__.py,sha256=tVdYMhPnjJvAckaBx6ZO9kvv59yuEQ997QzFlcqcUno,2177
1
+ pyerualjetwork/__init__.py,sha256=VRFLz0qjl7ZNj1nm6TFjuEit1_lEp-qO6GuBhakW_wA,2177
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=HjyW2QE18age6J8iG0jpbwqGOylL_nM-vE2CLbP9Wes,14690
@@ -13,12 +13,12 @@ pyerualjetwork/model_operations.py,sha256=hnhR8dtoICNJWIwGgJ65-LN3GYN_DYH4LMe6Yp
13
13
  pyerualjetwork/model_operations_cuda.py,sha256=XnKKq54ZLaqCm-NaJ6d8IToACKcKg2Ttq6moowVRRWo,13365
14
14
  pyerualjetwork/plan.py,sha256=EobwajGSIgbOujkzDKb-Kea0LGRHqpK3Xy1Le8VBAe8,34422
15
15
  pyerualjetwork/plan_cuda.py,sha256=iCcAHLzVw_VyjhkFHXzBWiedwbnpI1MCXNJgSDgZxWw,36065
16
- pyerualjetwork/planeat.py,sha256=AjgCcemtzpgsuM9hndvRQpaDjRy9wOZpRMgWIFZ1k2o,41456
17
- pyerualjetwork/planeat_cuda.py,sha256=_E2-xMcEqUus9SnefjD43FXutmVXt-HTFkQ3d_8q_wQ,41656
16
+ pyerualjetwork/planeat.py,sha256=Lr79cXaHsTYkLEA9zrrI0mIdLDy5l5Qa0_tlkqugxGE,41071
17
+ pyerualjetwork/planeat_cuda.py,sha256=qHwISR1JOaTYklBKf59BQ-ixPDlludk61dJMrp-wNi0,41038
18
18
  pyerualjetwork/ui.py,sha256=wu2BhU1k-w3Kcho5Jtq4SEKe68ftaUeRGneUOSCVDjU,575
19
19
  pyerualjetwork/visualizations.py,sha256=QaYSIyVkJZ8NqpBKArQKkI1y37nCQo_KIM98IMssnRc,28766
20
20
  pyerualjetwork/visualizations_cuda.py,sha256=F60vQ92AXlMgBka3InXnOtGoM25vQJAlBIU2AlYTwks,29200
21
- pyerualjetwork-4.2.0b2.dist-info/METADATA,sha256=UU939ACHKQTIXCt4YVsvV6iNtk3UPCCQCTk3nHU9WMc,7795
22
- pyerualjetwork-4.2.0b2.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
23
- pyerualjetwork-4.2.0b2.dist-info/top_level.txt,sha256=BRyt62U_r3ZmJpj-wXNOoA345Bzamrj6RbaWsyW4tRg,15
24
- pyerualjetwork-4.2.0b2.dist-info/RECORD,,
21
+ pyerualjetwork-4.2.0b4.dist-info/METADATA,sha256=B8Katp20szrJ7XPZSy4YfVNsdJSLUJsepiZ5dasYDww,7795
22
+ pyerualjetwork-4.2.0b4.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
23
+ pyerualjetwork-4.2.0b4.dist-info/top_level.txt,sha256=BRyt62U_r3ZmJpj-wXNOoA345Bzamrj6RbaWsyW4tRg,15
24
+ pyerualjetwork-4.2.0b4.dist-info/RECORD,,