phylogenie 1.0.1__py3-none-any.whl → 1.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.
@@ -1,5 +1,5 @@
1
1
  from collections.abc import Callable, Iterator
2
- from typing import TypeGuard, Union, overload
2
+ from typing import TypeGuard, Union
3
3
 
4
4
  import phylogenie.typeguards as tg
5
5
  import phylogenie.typings as pgt
@@ -11,38 +11,51 @@ from phylogenie.skyline.parameter import (
11
11
  skyline_parameter,
12
12
  )
13
13
 
14
- SkylineVectorParams = pgt.OneOrMany[SkylineParameterLike]
15
14
  SkylineVectorOperand = Union[SkylineParameterLike, "SkylineVector"]
16
- SkylineVectorLike = Union[SkylineVectorParams, "SkylineVector"]
15
+ SkylineVectorLike = Union[pgt.Many[SkylineParameterLike], "SkylineVector"]
16
+ SkylineVectorCoercible = Union[pgt.OneOrMany[SkylineParameterLike], "SkylineVector"]
17
+
18
+
19
+ def is_skyline_vector_operand(x: object) -> TypeGuard[SkylineVectorOperand]:
20
+ return isinstance(x, SkylineVector) or is_skyline_parameter_like(x)
21
+
22
+
23
+ def is_skyline_vector_like(x: object) -> TypeGuard[SkylineVectorLike]:
24
+ return isinstance(x, SkylineVector) or is_many_skyline_parameters_like(x)
25
+
26
+
27
+ def is_many_skyline_vectors_like(x: object) -> TypeGuard[pgt.Many[SkylineVectorLike]]:
28
+ return tg.is_many(x) and all(is_skyline_vector_like(v) for v in x)
17
29
 
18
30
 
19
31
  class SkylineVector:
20
32
  def __init__(
21
33
  self,
22
- params: SkylineVectorParams | None = None,
23
- value: pgt.Many[pgt.OneOrManyScalars] | None = None,
24
- change_times: pgt.OneOrManyScalars | None = None,
34
+ params: pgt.Many[SkylineParameterLike] | None = None,
35
+ value: pgt.Many2DScalars | None = None,
36
+ change_times: pgt.ManyScalars | None = None,
25
37
  ) -> None:
26
38
  if params is not None and value is None and change_times is None:
27
- if is_skyline_parameter_like(params):
28
- self.params = [skyline_parameter(params)]
29
- elif is_many_skyline_parameters_like(params):
39
+ if is_many_skyline_parameters_like(params):
30
40
  self.params = [skyline_parameter(param) for param in params]
31
41
  else:
32
42
  raise TypeError(
33
- f"It is impossible to create a SkylineVector from `params` {params} of type {type(params)}. Please provide a SkylineParameterLike object (i.e., a SkylineParameter or a scalar) or a sequence of them."
43
+ f"It is impossible to create a SkylineVector from `params` {params} of type {type(params)}. Please provide a sequence of SkylineParameterLike objects (a SkylineParameterLike object can either be a SkylineParameter or a scalar)."
34
44
  )
35
45
  elif value is not None and change_times is not None:
36
- Ns = {len(row) for row in value if tg.is_many(row)}
37
- if len(Ns) > 1:
38
- raise ValueError(
39
- f"All rows in the `value` must be scalars or have the same length to create a SkylineVector (got value={value} with row lengths={Ns})."
46
+ if tg.is_many_2D_scalars(value):
47
+ vector_lengths = {len(vector) for vector in value}
48
+ if any(vl != len(value[0]) for vl in vector_lengths):
49
+ raise ValueError(
50
+ f"All rows in the `value` of a SkylineVector must have the same length (got value={value} with vector lengths={vector_lengths})."
51
+ )
52
+ else:
53
+ raise TypeError(
54
+ f"It is impossible to create a SkylineVector from `value` {value} of type {type(value)}. Please provide a nested (2D) sequence of scalar values."
40
55
  )
41
- N = Ns.pop() if Ns else 1
42
- value = [[x] * N if isinstance(x, pgt.Scalar) else x for x in value]
43
56
  self.params = [
44
- SkylineParameter([row[i] for row in value], change_times)
45
- for i in range(N)
57
+ SkylineParameter([vector[i] for vector in value], change_times)
58
+ for i in range(len(value[0]))
46
59
  ]
47
60
  else:
48
61
  raise ValueError(
@@ -51,20 +64,18 @@ class SkylineVector:
51
64
 
52
65
  @property
53
66
  def change_times(self) -> pgt.Vector1D:
54
- return tuple(
55
- sorted(set(t for param in self.params for t in param.change_times))
56
- )
67
+ return sorted(set(t for param in self.params for t in param.change_times))
57
68
 
58
69
  @property
59
70
  def value(self) -> pgt.Vector2D:
60
- return tuple(self.get_value_at_time(t) for t in (0, *self.change_times))
71
+ return [self.get_value_at_time(t) for t in (0, *self.change_times)]
61
72
 
62
73
  @property
63
74
  def N(self) -> int:
64
75
  return len(self.params)
65
76
 
66
77
  def get_value_at_time(self, t: pgt.Scalar) -> pgt.Vector1D:
67
- return tuple(param.get_value_at_time(t) for param in self.params)
78
+ return [param.get_value_at_time(t) for param in self.params]
68
79
 
69
80
  def operate(
70
81
  self,
@@ -117,48 +128,28 @@ class SkylineVector:
117
128
  def __iter__(self) -> Iterator[SkylineParameter]:
118
129
  return iter(self.params)
119
130
 
120
- @overload
121
- def __getitem__(self, item: int) -> SkylineParameter: ...
122
- @overload
123
- def __getitem__(self, item: slice) -> "SkylineVector": ...
124
- def __getitem__(self, item: int | slice) -> "SkylineParameter | SkylineVector":
125
- if isinstance(item, slice):
126
- return SkylineVector(self.params[item])
131
+ def __getitem__(self, item: int) -> "SkylineParameter":
127
132
  return self.params[item]
128
133
 
129
134
  def __setitem__(self, item: int, value: SkylineParameterLike) -> None:
130
135
  if not is_skyline_parameter_like(value):
131
136
  raise TypeError(
132
- f"`value` must be a SkylineParameterLike (got {type(value)})."
137
+ f"It is impossible to set item {item} of SkylineVector with value {value} of type {type(value)}. Please provide a SkylineParameterLike object (i.e., a scalar or a SkylineParameter)."
133
138
  )
134
139
  self.params[item] = skyline_parameter(value)
135
140
 
136
141
 
137
- def skyline_vector(x: SkylineVectorLike, N: int) -> SkylineVector:
142
+ def skyline_vector(x: SkylineVectorCoercible, N: int) -> SkylineVector:
138
143
  if is_skyline_parameter_like(x):
139
144
  return SkylineVector([skyline_parameter(x)] * N)
140
- if not isinstance(x, SkylineVector):
145
+ elif is_many_skyline_parameters_like(x):
141
146
  x = SkylineVector(x)
147
+ elif not isinstance(x, SkylineVector):
148
+ raise TypeError(
149
+ f"It is impossible to coerce {x} of type {type(x)} into a SkylineVector. Please provide a SkylineParameterLike object (i.e., a scalar or a SkylineParameter), or a sequence of them."
150
+ )
142
151
  if x.N != N:
143
152
  raise ValueError(
144
153
  f"Expected a SkylineVector of size {N}, got {x} of size {x.N}."
145
154
  )
146
155
  return x
147
-
148
-
149
- def is_skyline_vector_operand(value: object) -> TypeGuard[SkylineVectorOperand]:
150
- return isinstance(value, SkylineVector) or is_skyline_parameter_like(value)
151
-
152
-
153
- def is_skyline_vector_like(value: object) -> TypeGuard[SkylineVectorLike]:
154
- return (
155
- isinstance(value, SkylineVector)
156
- or is_skyline_parameter_like(value)
157
- or is_many_skyline_parameters_like(value)
158
- )
159
-
160
-
161
- def is_many_skyline_vectors_like(
162
- value: object,
163
- ) -> TypeGuard[pgt.Many[SkylineVectorLike]]:
164
- return tg.is_many(value) and all(is_skyline_vector_like(v) for v in value)
phylogenie/typeguards.py CHANGED
@@ -24,17 +24,19 @@ def is_many_one_or_many_scalars(x: object) -> TypeGuard[pgt.Many[pgt.OneOrManySc
24
24
  return is_many(x) and all(is_one_or_many_scalars(i) for i in x)
25
25
 
26
26
 
27
- def is_one_or_many_ints(x: object) -> TypeGuard[pgt.OneOrMany[int]]:
28
- return isinstance(x, int) or is_many_ints(x)
29
-
30
-
31
27
  def is_many_2D_scalars(x: object) -> TypeGuard[pgt.Many2DScalars]:
32
28
  return is_many(x) and all(is_many_scalars(i) for i in x)
33
29
 
34
30
 
35
- def is_many_one_or_many_2d_scalars(
31
+ def is_one_or_many_2D_scalars(x: object) -> TypeGuard[pgt.OneOrMany2DScalars]:
32
+ return isinstance(x, pgt.Scalar) or is_many_2D_scalars(x)
33
+
34
+
35
+ def is_many_one_or_many_2D_scalars(
36
36
  x: object,
37
37
  ) -> TypeGuard[pgt.Many[pgt.OneOrMany2DScalars]]:
38
- return is_many(x) and all(
39
- isinstance(i, pgt.Scalar) or is_many_2D_scalars(i) for i in x
40
- )
38
+ return is_many(x) and all(is_one_or_many_2D_scalars(i) for i in x)
39
+
40
+
41
+ def is_many_3D_scalars(x: object) -> TypeGuard[pgt.Many3DScalars]:
42
+ return is_many(x) and all(is_many_2D_scalars(i) for i in x)
phylogenie/typings.py CHANGED
@@ -11,12 +11,13 @@ OneOrMany2D = _T | Many2D[_T]
11
11
  Scalar = int | float
12
12
  OneOrManyScalars = OneOrMany[Scalar]
13
13
  ManyScalars = Many[Scalar]
14
- Many2DScalars = Many2D[Scalar]
15
14
  OneOrMany2DScalars = OneOrMany2D[Scalar]
15
+ Many2DScalars = Many2D[Scalar]
16
+ Many3DScalars = Many3D[Scalar]
17
+
18
+ Vector1D = list[Scalar]
19
+ IntVector1D = list[int]
20
+ Vector2D = list[Vector1D]
21
+ Vector3D = list[Vector2D]
16
22
 
17
- Vector1D = tuple[Scalar, ...]
18
- IntVector1D = tuple[int, ...]
19
- Vector1DLike = Scalar | Vector1D
20
- IntVector1DLike = int | IntVector1D
21
- Vector2D = tuple[Vector1D, ...]
22
- Vector3D = tuple[Vector2D, ...]
23
+ Data = dict[str, str | Scalar | Vector1D | Vector2D | Vector3D]
@@ -1,8 +1,8 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: phylogenie
3
- Version: 1.0.1
3
+ Version: 1.0.3
4
4
  Summary: Generate phylogenetic datasets with minimal setup effort
5
- Author: gabriele-marino
5
+ Author: Gabriele Marino
6
6
  Author-email: gabmarino.8601@gmail.com
7
7
  Requires-Python: >=3.10,<4.0
8
8
  Classifier: Programming Language :: Python :: 3
@@ -0,0 +1,39 @@
1
+ phylogenie/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ phylogenie/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ phylogenie/backend/remaster/__init__.py,sha256=g1oMKi6SX60Geq_e2AjBlf7-pDvLfrsT3gW6AORdbMo,509
4
+ phylogenie/backend/remaster/generate.py,sha256=Sb5izUQO0GmUcIEMoXtHWLsh9c4vIeyNIUm7u4RVLdw,6100
5
+ phylogenie/backend/remaster/reactions.py,sha256=oc2ZY9WtTajbOWjARDmA0JnS255tbVeMt1DmyCUp95M,5904
6
+ phylogenie/backend/treesimulator.py,sha256=wvN7WZwUKGPWt7AetumQz1ZrUc4k_D6lftSaYG1hNBg,4587
7
+ phylogenie/configs.py,sha256=HtRUWZ-zNq1--zTBWL3QFXX27Ybw5x1qSWcmx7Sz8YA,125
8
+ phylogenie/core/__init__.py,sha256=pvQMohKFAPaSvujw7H5sQJn7SOSqENQUHECuVfUBVNg,402
9
+ phylogenie/core/configs.py,sha256=QwY4Pxw7Cwx80ySxJMCBFDlJdmactKF_R-lhs8QcsbE,1136
10
+ phylogenie/core/context/__init__.py,sha256=ZiCweJgf1REKbhZTfHuzz1lIgVmio9bTYW3-srOUqUo,168
11
+ phylogenie/core/context/configs.py,sha256=zd-ADFzJbb6KPkol-tXxSdS8LUBeQYQq8fDzXot8WM0,730
12
+ phylogenie/core/context/distributions.py,sha256=QF14tM2ibjE7f6WK3s4hTaz_sLQBTNVr2ZBNe2refeE,3059
13
+ phylogenie/core/context/factories.py,sha256=QO96wZwrQbgX2Rkd0wY3qQDahiZ8fDg8Mg8KKY0lr2c,1390
14
+ phylogenie/core/dataset.py,sha256=mgPAexXTat6x7YB9-BI6d5HWwrAvt8xydmiWVzwVD3M,2431
15
+ phylogenie/core/factories.py,sha256=Ph9qlQ6AthVKbzQZvvzj6EQye5LS2nl6d_r2dFuBfEo,8881
16
+ phylogenie/core/msas/__init__.py,sha256=-2XjTmiTA6zAwiLs2ksKecCrSbNLheo7KKjDyvuLipg,207
17
+ phylogenie/core/msas/alisim.py,sha256=TG4LAHJaH3rGWa3cwXzX6MgaXuh2tLzhdoALyOkoiXY,1047
18
+ phylogenie/core/msas/base.py,sha256=cKH0FGALmObmOLZ2dJ3vrpb3jTLg2oeWJsIE6HznJ0Q,1803
19
+ phylogenie/core/trees/__init__.py,sha256=epKgJ-EI04kBEuS4kfBcnsAj7dMObT1T742peBAnB78,335
20
+ phylogenie/core/trees/base.py,sha256=sNBCJRtWGYaMog4WoyAkrK4F2SXrgjXrxjuVQ6Ae5Js,305
21
+ phylogenie/core/trees/remaster/__init__.py,sha256=FfgXYjkeosb22Anbp78re2NssWtNcNNaj7hFQZx8JLE,116
22
+ phylogenie/core/trees/remaster/configs.py,sha256=d4EqowYMb5I2TfBTgNf9H_X1t8aNCYJbh1RQmFoDxs4,362
23
+ phylogenie/core/trees/remaster/factories.py,sha256=qla4pg4OgfE5lwQZuP3bEaMt7xIF4P6fQ1Z0IPpFxUs,812
24
+ phylogenie/core/trees/remaster/generator.py,sha256=og6GfsLyVR88A5Yd1PetiPpy7ZcYiyeGSNyWzqe-vsY,7428
25
+ phylogenie/core/trees/treesimulator.py,sha256=rgYuL-A40vPR9uWp-t0Rg2d5TNrwodELYqsb4AKVwAA,5951
26
+ phylogenie/core/typeguards.py,sha256=yxTdE4G_1gjBFqplyei-GKz4KZo2KFh8qsEsPQ2Z5OQ,794
27
+ phylogenie/main.py,sha256=n_joau3dWJIq0ZMHe4a_1_2GigTFagkfzUFuQEMlyRI,1158
28
+ phylogenie/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
+ phylogenie/skyline/__init__.py,sha256=7pF4CUb4ZCLzNYJNhOjpuTOLTRhlK7L6ugfccNqjIGo,620
30
+ phylogenie/skyline/matrix.py,sha256=WH1aT23hv4QYuH4GDwcJgahrqcgB4mulfzKLGUx3R6M,7091
31
+ phylogenie/skyline/parameter.py,sha256=wrtvQDho3OC5tzrMnnFTy95GXaYN20KN8P5Gwyf-rHI,4023
32
+ phylogenie/skyline/vector.py,sha256=NgmVbWjWG_itZ9a57q9QqSybvG9-Cr9X264RGPVyp_Q,6399
33
+ phylogenie/typeguards.py,sha256=WBOSJSaOC8VDtrYoA2w_AYEXTpyKdCfmsM29KaKXl3A,1350
34
+ phylogenie/typings.py,sha256=93VRedBxrpzXkT4uaNu_1JiMzsOjp7fUy4kLv_eYxUE,565
35
+ phylogenie-1.0.3.dist-info/LICENSE.txt,sha256=NUrDqElK-eD3I0WqC004CJsy6cs0JgsAoebDv_42-pw,1071
36
+ phylogenie-1.0.3.dist-info/METADATA,sha256=JVGcZNn6O2Wuuek_ZTQp5CBdw5_xoSHzvSyTmENmxNw,6251
37
+ phylogenie-1.0.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
38
+ phylogenie-1.0.3.dist-info/entry_points.txt,sha256=Rt6_usN0FkBX1ZfiqCirjMN9FKOgFLG8rydcQ8kugeE,51
39
+ phylogenie-1.0.3.dist-info/RECORD,,
@@ -1,10 +0,0 @@
1
- import phylogenie.typings as pgt
2
-
3
- Data = dict[
4
- str,
5
- str
6
- | pgt.Scalar
7
- | list[pgt.Scalar]
8
- | list[list[pgt.Scalar]]
9
- | list[list[list[pgt.Scalar]]],
10
- ]
phylogenie/utils.py DELETED
@@ -1,20 +0,0 @@
1
- from typing import overload
2
-
3
- import phylogenie.typeguards as tg
4
- import phylogenie.typings as pgt
5
-
6
-
7
- @overload
8
- def vectorify1D(x: pgt.OneOrMany[int]) -> pgt.IntVector1D: ...
9
- @overload
10
- def vectorify1D(x: pgt.OneOrManyScalars | None) -> pgt.Vector1D: ...
11
- def vectorify1D(x: pgt.OneOrManyScalars | None) -> pgt.Vector1D:
12
- if x is None:
13
- return ()
14
- if isinstance(x, pgt.Scalar):
15
- return (x,)
16
- if tg.is_many_scalars(x):
17
- return tuple(x)
18
- raise TypeError(
19
- f"It is impossible to coerce {x} of type {type(x)} into a 1D vector. Please provide a scalar or a sequence of scalars."
20
- )
@@ -1,41 +0,0 @@
1
- phylogenie/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- phylogenie/backend/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- phylogenie/backend/remaster/__init__.py,sha256=g1oMKi6SX60Geq_e2AjBlf7-pDvLfrsT3gW6AORdbMo,509
4
- phylogenie/backend/remaster/generate.py,sha256=S4eRtdFdnIwUqWTy6lcZTnMcy6SDXJwGPr7oCKczgjc,6180
5
- phylogenie/backend/remaster/reactions.py,sha256=UMXW-cEeWGOqTbf9CtHf9GMgfofT5apxZUiBpr8YVBU,5819
6
- phylogenie/backend/treesimulator.py,sha256=ReJ1KTSKVSmAS4vGn1-XKYKqXluYX6uFSNjCs3kGISg,4557
7
- phylogenie/configs.py,sha256=HtRUWZ-zNq1--zTBWL3QFXX27Ybw5x1qSWcmx7Sz8YA,125
8
- phylogenie/core/__init__.py,sha256=pvQMohKFAPaSvujw7H5sQJn7SOSqENQUHECuVfUBVNg,402
9
- phylogenie/core/configs.py,sha256=8E2uknl3SGFt1XhwIM_rJYMkC_PsHJFlcuC25YLj2c4,989
10
- phylogenie/core/context/__init__.py,sha256=ZiCweJgf1REKbhZTfHuzz1lIgVmio9bTYW3-srOUqUo,168
11
- phylogenie/core/context/configs.py,sha256=zd-ADFzJbb6KPkol-tXxSdS8LUBeQYQq8fDzXot8WM0,730
12
- phylogenie/core/context/distributions.py,sha256=QF14tM2ibjE7f6WK3s4hTaz_sLQBTNVr2ZBNe2refeE,3059
13
- phylogenie/core/context/factories.py,sha256=2gmvG5abZmmVcCfWie0L3jnwZxgZ0TtV1XElSnZgDzo,1459
14
- phylogenie/core/dataset.py,sha256=vk9TfjVmT_eSXzu8dHSsiz6G3kBsVk8nOCPg8CCmBQA,2431
15
- phylogenie/core/factories.py,sha256=XEijHIGCxikUhq_IGTq79MppvGXJVX6nIkf3a36ifa4,5972
16
- phylogenie/core/msas/__init__.py,sha256=-2XjTmiTA6zAwiLs2ksKecCrSbNLheo7KKjDyvuLipg,207
17
- phylogenie/core/msas/alisim.py,sha256=iF0Urq1wc83oEscZ35drAlBquinWi13MXXfFg2OqUZc,1051
18
- phylogenie/core/msas/base.py,sha256=oQpEcxguLd79sxY1cNlL_cqhuq5Ef6Lny6FJvQ2CCdU,1803
19
- phylogenie/core/trees/__init__.py,sha256=epKgJ-EI04kBEuS4kfBcnsAj7dMObT1T742peBAnB78,335
20
- phylogenie/core/trees/base.py,sha256=sNBCJRtWGYaMog4WoyAkrK4F2SXrgjXrxjuVQ6Ae5Js,305
21
- phylogenie/core/trees/remaster/__init__.py,sha256=FfgXYjkeosb22Anbp78re2NssWtNcNNaj7hFQZx8JLE,116
22
- phylogenie/core/trees/remaster/configs.py,sha256=Bp1-Oj3Vac1_S6VdofGxHjp_0FAACrIBDo8w0NbTS2Q,377
23
- phylogenie/core/trees/remaster/factories.py,sha256=F7BAWj2Y-2bmQfPGW73lyvQxUgHjRpx1eEzKZLIZ4hk,863
24
- phylogenie/core/trees/remaster/generator.py,sha256=y6DaUmotAjUi08uuBVEIUkKXgxVEBPrTx7gnjpPHT4s,7106
25
- phylogenie/core/trees/treesimulator.py,sha256=8L2KxwZEw_vO6mcZaUM2DoY4IavkmFoYwcjcDo8f0m0,5855
26
- phylogenie/core/typeguards.py,sha256=nxgN8NjiasKR2AJ3USELp4uUHEyNjJmOstYqqLpRtDg,1133
27
- phylogenie/core/typings.py,sha256=4b50GphFOT8fEZ9qsnDYhx7uqDUxA5yly83BiSlpCgI,171
28
- phylogenie/main.py,sha256=n_joau3dWJIq0ZMHe4a_1_2GigTFagkfzUFuQEMlyRI,1158
29
- phylogenie/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- phylogenie/skyline/__init__.py,sha256=a7VRGPtZvyfkonlYhjn6pJ5aw1_iyGxYFby3Lf8wheo,518
31
- phylogenie/skyline/matrix.py,sha256=RgTzSnZ8vml6OBkS4h5MDonkb3PkYwu_U7Vo0-mpVOk,7395
32
- phylogenie/skyline/parameter.py,sha256=4bFX3RZLnKr2NrrgJVSf-7V2a6aa8ihR6205sp6PX_M,3585
33
- phylogenie/skyline/vector.py,sha256=U66oRwx3FN5HSiIAy-9pAKz-ft62JqTKUtp6Sb5zyEg,6243
34
- phylogenie/typeguards.py,sha256=3EwPVxQfJ8IOp33-tkbCwLFCmLh7OyKcyLyhUkJuwoU,1230
35
- phylogenie/typings.py,sha256=aYAbZlvtbijxz9nYwRmhE8kbuYGgZAa95pvrUGEWz2Q,562
36
- phylogenie/utils.py,sha256=Omj4NOlnA0iZiyAzeWtsUq7G5sv-0cqxPJTiH2phcmk,615
37
- phylogenie-1.0.1.dist-info/LICENSE.txt,sha256=NUrDqElK-eD3I0WqC004CJsy6cs0JgsAoebDv_42-pw,1071
38
- phylogenie-1.0.1.dist-info/METADATA,sha256=0eg-dGzGxfdWTXdhbLrytoGnX5FExhq-ah60FO59EeQ,6251
39
- phylogenie-1.0.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
40
- phylogenie-1.0.1.dist-info/entry_points.txt,sha256=Rt6_usN0FkBX1ZfiqCirjMN9FKOgFLG8rydcQ8kugeE,51
41
- phylogenie-1.0.1.dist-info/RECORD,,