agglovar 0.0.1.dev15__tar.gz → 0.0.1.dev17__tar.gz

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.
Files changed (59) hide show
  1. {agglovar-0.0.1.dev15/src/agglovar.egg-info → agglovar-0.0.1.dev17}/PKG-INFO +1 -1
  2. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/__init__.py +7 -1
  3. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/align/op.py +5 -1
  4. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/align/score.py +14 -3
  5. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/bed/col.py +12 -2
  6. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/bed/intersect.py +15 -3
  7. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/bed/join.py +13 -2
  8. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/bed/merge.py +12 -2
  9. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/dev/imports.py +12 -2
  10. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/expr/variant.py +3 -0
  11. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/fa.py +7 -1
  12. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/io.py +11 -2
  13. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/kmer/plot.py +5 -1
  14. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/kmer/util.py +9 -1
  15. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/merge/base.py +26 -17
  16. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/merge/config/parser.py +4 -1
  17. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/merge/config/stage.py +10 -1
  18. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/merge/config/strategy.py +10 -1
  19. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/merge/cumulative.py +177 -35
  20. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/meta/decorators.py +3 -0
  21. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/meta/descriptors.py +13 -4
  22. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/pairwise/base.py +11 -2
  23. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/pairwise/overlap/_overlap.py +125 -55
  24. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/pairwise/overlap/_stage.py +16 -1
  25. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/pairwise/weights.py +14 -2
  26. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/seqmatch.py +5 -3
  27. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/util/lazy.py +3 -0
  28. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/util/str.py +8 -1
  29. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/util/var.py +4 -0
  30. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/vcf/_vcf_const.py +3 -0
  31. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/vcf/_vcf_header.py +21 -4
  32. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/vcf/_vcf_read.py +18 -5
  33. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/vcf/_vcf_write.py +3 -0
  34. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17/src/agglovar.egg-info}/PKG-INFO +1 -1
  35. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/LICENSE +0 -0
  36. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/README.md +0 -0
  37. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/pyproject.toml +0 -0
  38. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/setup.cfg +0 -0
  39. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/align/__init__.py +0 -0
  40. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/bed/__init__.py +0 -0
  41. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/dev/__init__.py +0 -0
  42. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/expr/__init__.py +0 -0
  43. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/kmer/__init__.py +0 -0
  44. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/merge/__init__.py +0 -0
  45. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/merge/config/__init__.py +0 -0
  46. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/merge/om/__init__.py +0 -0
  47. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/merge/om/_executor_base.py +0 -0
  48. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/merge/om/_executor_nr.py +0 -0
  49. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/meta/__init__.py +0 -0
  50. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/pairwise/__init__.py +0 -0
  51. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/pairwise/overlap/__init__.py +0 -0
  52. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/pairwise/overlap/_const.py +0 -0
  53. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/schema.py +0 -0
  54. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/util/__init__.py +0 -0
  55. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar/vcf/__init__.py +0 -0
  56. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar.egg-info/SOURCES.txt +0 -0
  57. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar.egg-info/dependency_links.txt +0 -0
  58. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar.egg-info/requires.txt +0 -0
  59. {agglovar-0.0.1.dev15 → agglovar-0.0.1.dev17}/src/agglovar.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agglovar
3
- Version: 0.0.1.dev15
3
+ Version: 0.0.1.dev17
4
4
  Summary: Toolkit for fast genomic variant transformations and intersects
5
5
  License-Expression: MIT
6
6
  Requires-Python: >=3.12
@@ -1,6 +1,6 @@
1
1
  """Agglovar: A toolkit for fast genomic variant transformations and intersects."""
2
2
 
3
- __version__ = '0.0.1.dev15'
3
+ __version__ = '0.0.1.dev17'
4
4
 
5
5
  __all__ = [
6
6
  'align',
@@ -29,3 +29,9 @@ from . import schema
29
29
  from . import seqmatch
30
30
  from . import vcf
31
31
  from . import util
32
+
33
+
34
+ # Configure logging
35
+
36
+ import logging
37
+ logging.getLogger(__name__).addHandler(logging.NullHandler())
@@ -42,10 +42,14 @@ __all__ = [
42
42
  ]
43
43
 
44
44
 
45
- import numpy as np
45
+ import logging
46
46
  from types import MappingProxyType
47
47
  from typing import Mapping
48
48
 
49
+ import numpy as np
50
+
51
+ logger = logging.getLogger(__name__)
52
+
49
53
  INT_STR_SET: frozenset[str] = frozenset({'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', })
50
54
  """Set of valid integer character strings representing operation codes."""
51
55
 
@@ -12,13 +12,24 @@ __all__ = [
12
12
  'get_affine_by_params',
13
13
  ]
14
14
 
15
- from abc import ABC, abstractmethod
16
- import numpy as np
15
+ from abc import (
16
+ ABC,
17
+ abstractmethod,
18
+ )
19
+ import logging
17
20
  import re
18
- from typing import Any, Iterable, Self
21
+ from typing import (
22
+ Any,
23
+ Iterable,
24
+ Self,
25
+ )
26
+
27
+ import numpy as np
19
28
 
20
29
  from . import op
21
30
 
31
+ logger = logging.getLogger(__name__)
32
+
22
33
  AFFINE_SCORE_MATCH = 2.0
23
34
  """Default match score."""
24
35
 
@@ -7,13 +7,23 @@ __all__ = [
7
7
  'standardize',
8
8
  ]
9
9
 
10
- from collections.abc import Iterable, Container
10
+ from collections.abc import (
11
+ Iterable,
12
+ Container,
13
+ )
11
14
  from dataclasses import dataclass
15
+ import logging
12
16
  import re
13
- from typing import Optional, Self, Any
17
+ from typing import (
18
+ Optional,
19
+ Self,
20
+ Any,
21
+ )
14
22
 
15
23
  import polars as pl
16
24
 
25
+ logger = logging.getLogger(__name__)
26
+
17
27
 
18
28
  @dataclass(frozen=True)
19
29
  class CoordColExpr(Iterable[pl.Expr]):
@@ -1,19 +1,31 @@
1
1
  """Table intersects."""
2
2
 
3
+ import logging
3
4
  from pathlib import Path
4
- from typing import Iterable, Optional
5
+ from typing import (
6
+ Iterable,
7
+ Optional,
8
+ )
5
9
 
6
10
  import polars as pl
7
11
 
8
- from .join import pairwise_join, pairwise_join_iter
12
+ from .col import (
13
+ CoordCol,
14
+ get_coord_cols,
15
+ )
16
+ from .join import (
17
+ pairwise_join,
18
+ pairwise_join_iter,
19
+ )
9
20
  from .merge import merge_depth
10
- from .col import CoordCol, get_coord_cols
11
21
 
12
22
  __all__ = [
13
23
  'as_bool',
14
24
  'as_proportion',
15
25
  ]
16
26
 
27
+ logger = logging.getLogger(__name__)
28
+
17
29
 
18
30
  def as_bool(
19
31
  df_a: pl.LazyFrame | pl.DataFrame,
@@ -5,14 +5,25 @@ __all__ = [
5
5
  'pairwise_join_iter',
6
6
  ]
7
7
 
8
+ import logging
8
9
  from pathlib import Path
9
- from typing import Iterable, Iterator, Optional
10
+ from typing import (
11
+ Iterable,
12
+ Iterator,
13
+ Optional,
14
+ )
10
15
 
11
16
  import polars as pl
12
17
 
13
- from .col import CoordCol, get_coord_cols
14
18
  from ..util.lazy import materialize_pair
15
19
 
20
+ from .col import (
21
+ CoordCol,
22
+ get_coord_cols,
23
+ )
24
+
25
+ logger = logging.getLogger(__name__)
26
+
16
27
  CHUNK_SIZE: int = 2_500
17
28
  """Default size of join chunks. Breaks up tables into batches of this size or less."""
18
29
 
@@ -4,11 +4,21 @@ __all__ = [
4
4
  'merge_depth',
5
5
  ]
6
6
 
7
- from typing import Optional, Iterable
7
+ import logging
8
+ from typing import (
9
+ Optional,
10
+ Iterable,
11
+ )
8
12
 
9
13
  import polars as pl
10
14
 
11
- from .col import CoordCol, get_coord_cols, make_unique_col
15
+ from .col import (
16
+ CoordCol,
17
+ get_coord_cols,
18
+ make_unique_col,
19
+ )
20
+
21
+ logger = logging.getLogger(__name__)
12
22
 
13
23
 
14
24
  def merge_depth(
@@ -11,14 +11,24 @@ __all__ = [
11
11
 
12
12
  import ast
13
13
  from collections.abc import Iterable
14
- from dataclasses import dataclass, field
14
+ from dataclasses import (
15
+ dataclass,
16
+ field,
17
+ )
15
18
  from graphlib import TopologicalSorter
16
19
  import importlib
17
20
  import inspect
21
+ import logging
18
22
  import re
19
23
  import sys
20
24
  from types import ModuleType
21
- from typing import Any, Generator, Optional
25
+ from typing import (
26
+ Any,
27
+ Generator,
28
+ Optional,
29
+ )
30
+
31
+ logger = logging.getLogger(__name__)
22
32
 
23
33
 
24
34
  @dataclass(frozen=True)
@@ -9,10 +9,13 @@ __all__ = [
9
9
  'lead_src_expr',
10
10
  ]
11
11
 
12
+ import logging
12
13
  from typing import Optional
13
14
 
14
15
  import polars as pl
15
16
 
17
+ logger = logging.getLogger(__name__)
18
+
16
19
  id_snv_expr = (
17
20
  pl.concat_str(
18
21
  pl.col('chrom'),
@@ -6,14 +6,20 @@ __all__ = [
6
6
  ]
7
7
 
8
8
  import hashlib
9
+ import logging
9
10
  from pathlib import Path
10
- from typing import Iterable, Optional
11
+ from typing import (
12
+ Iterable,
13
+ Optional,
14
+ )
11
15
 
12
16
  import Bio.SeqIO
13
17
  import polars as pl
14
18
 
15
19
  from . import io
16
20
 
21
+ logger = logging.getLogger(__name__)
22
+
17
23
 
18
24
  def read_fai(
19
25
  fai_file_name: str | Path,
@@ -4,10 +4,19 @@ __all__ = [
4
4
  'PlainOrGzReader',
5
5
  ]
6
6
 
7
- from dataclasses import dataclass, field
7
+ from dataclasses import (
8
+ dataclass,
9
+ field,
10
+ )
8
11
  import gzip
12
+ import logging
9
13
  from pathlib import Path
10
- from typing import Any, Optional
14
+ from typing import (
15
+ Any,
16
+ Optional,
17
+ )
18
+
19
+ logger = logging.getLogger(__name__)
11
20
 
12
21
 
13
22
  @dataclass
@@ -5,9 +5,11 @@ __all__ = [
5
5
  ]
6
6
 
7
7
  import collections
8
- import numpy as np
8
+ import logging
9
9
  from typing import Any
10
10
 
11
+ import numpy as np
12
+
11
13
  from . import util as kmer_util
12
14
 
13
15
  # Get type hints for optional matplotlib objects
@@ -22,6 +24,8 @@ try:
22
24
  except ImportError:
23
25
  pass
24
26
 
27
+ logger = logging.getLogger(__name__)
28
+
25
29
 
26
30
  def dotplot(
27
31
  seq_x: str,
@@ -12,12 +12,20 @@ __all__ = [
12
12
  'stream_index',
13
13
  ]
14
14
 
15
+ import logging
15
16
  import math
16
17
  from types import MappingProxyType
17
- from typing import Self, Optional, Iterator, Mapping
18
+ from typing import (
19
+ Self,
20
+ Optional,
21
+ Iterator,
22
+ Mapping,
23
+ )
18
24
 
19
25
  import numpy as np
20
26
 
27
+ logger = logging.getLogger(__name__)
28
+
21
29
  # Integer to base
22
30
  INT_TO_BASE: list[str] = ['A', 'C', 'G', 'T']
23
31
  """Maps 2-bit integer to base string."""
@@ -1,7 +1,4 @@
1
- """Base class for callset intersects.
2
-
3
-
4
- """
1
+ """Base class for callset intersects."""
5
2
 
6
3
  __all__ = [
7
4
  'CallsetDef',
@@ -9,9 +6,16 @@ __all__ = [
9
6
  'CallsetDefInputType',
10
7
  ]
11
8
 
12
- from abc import ABC, abstractmethod
13
- from collections.abc import Container, Iterable
9
+ from abc import (
10
+ ABC,
11
+ abstractmethod,
12
+ )
13
+ from collections.abc import (
14
+ Container,
15
+ Iterable,
16
+ )
14
17
  import json
18
+ import logging
15
19
  from pathlib import Path
16
20
  from typing import (
17
21
  Any,
@@ -25,6 +29,8 @@ import polars as pl
25
29
  from ..meta.decorators import lockable
26
30
  from ..util.str import collision_rename
27
31
 
32
+ logger = logging.getLogger(__name__)
33
+
28
34
 
29
35
  class CallsetDef(NamedTuple):
30
36
  """Callset definition.
@@ -33,27 +39,31 @@ class CallsetDef(NamedTuple):
33
39
  :ivar name: The name of the callset within a collection of callsets.
34
40
  :ivar metadata: The metadata of the callset or None if no metadata is provided.
35
41
  """
42
+
36
43
  table: pl.LazyFrame
37
44
  name: str
38
45
  metadata: Optional[str]
39
46
 
40
47
  def __str__(self) -> str:
48
+ """Return a string representation of the callset definition."""
41
49
  return self.name
42
50
 
43
51
  def __repr__(self) -> str:
52
+ """Return a string representation of the callset definition."""
44
53
  return f'CallsetDef(table={self.table!r}, name={self.name}, metadata={self.metadata})'
45
54
 
55
+
46
56
  CallsetDefInputType: TypeAlias = (
47
57
  pl.DataFrame
48
58
  | pl.LazyFrame
49
59
  | tuple[
50
60
  pl.DataFrame | pl.LazyFrame,
51
61
  ]
52
- | tuple [
62
+ | tuple[
53
63
  pl.DataFrame | pl.LazyFrame,
54
64
  Optional[str],
55
65
  ]
56
- | tuple [
66
+ | tuple[
57
67
  pl.DataFrame | pl.LazyFrame,
58
68
  Optional[str],
59
69
  Optional[str | dict],
@@ -81,7 +91,6 @@ def _get_definition(
81
91
 
82
92
  :return: A callset definition.
83
93
  """
84
-
85
94
  # Get callset table and name
86
95
  callset_name = None
87
96
  callset_meta = None
@@ -100,8 +109,8 @@ def _get_definition(
100
109
  elif isinstance(callset_def, tuple):
101
110
  if len(callset_def) < 1:
102
111
  raise ValueError(
103
- f'Callset must be a Polars table or an iterable '
104
- f'of callset definition elements (table, name, metadata): Received an empty iterable'
112
+ 'Callset must be a Polars table or an iterable '
113
+ 'of callset definition elements (table, name, metadata): Received an empty iterable'
105
114
  )
106
115
 
107
116
  if isinstance(callset_def[0], pl.LazyFrame):
@@ -161,8 +170,10 @@ def _get_definition(
161
170
  )
162
171
  .cast(pl.String)
163
172
  .fill_null(
164
- pl.concat_str(pl.lit('var'),
165
- pl.col('_mg_src_index')),
173
+ pl.concat_str(
174
+ pl.lit('var'),
175
+ pl.col('_mg_src_index')
176
+ ),
166
177
  )
167
178
  .alias('id')
168
179
  )
@@ -177,8 +188,7 @@ def _get_definition(
177
188
  table=callset_table,
178
189
  name=callset_name,
179
190
  metadata=callset_meta,
180
- )
181
-
191
+ )
182
192
 
183
193
 
184
194
  @lockable
@@ -244,7 +254,6 @@ class MergeBase(ABC):
244
254
  :return: A list of :class:`CallsetDef`, one per input source, in input order.
245
255
  """
246
256
  name_set = set()
247
- callset_table: pl.LazyFrame
248
257
 
249
258
  callset_tuple_list: list[CallsetDef] = []
250
259
 
@@ -290,7 +299,7 @@ def _get_name(
290
299
  :returns: A name for this input source.
291
300
  """
292
301
  if name is None:
293
- name = f'source.1'
302
+ name = 'source.1'
294
303
 
295
304
  name = collision_rename(str(name), '.', *args)
296
305
 
@@ -9,10 +9,13 @@ __all__ = [
9
9
  'IntersectConfigParser',
10
10
  ]
11
11
 
12
+ import logging
13
+ from typing import Any
14
+
12
15
  import ply.lex
13
16
  import ply.yacc
14
17
 
15
- from typing import Any
18
+ logger = logging.getLogger(__name__)
16
19
 
17
20
 
18
21
  class IntersectConfigLexer(object):
@@ -19,8 +19,14 @@ __all__ = [
19
19
 
20
20
  from abc import ABCMeta
21
21
  from dataclasses import dataclass
22
+ import logging
22
23
  from types import MappingProxyType
23
- from typing import TYPE_CHECKING, Any, Optional, Mapping
24
+ from typing import (
25
+ TYPE_CHECKING,
26
+ Any,
27
+ Optional,
28
+ Mapping,
29
+ )
24
30
 
25
31
  from ...align import score
26
32
  from ...seqmatch import MatchScoreModel
@@ -29,6 +35,9 @@ if TYPE_CHECKING:
29
35
  from .strategy import IntersectStrategy
30
36
 
31
37
 
38
+ logger = logging.getLogger(__name__)
39
+
40
+
32
41
  RESERVED_PARAM_NAMES: frozenset[str] = frozenset({
33
42
  'spec_type',
34
43
  'arg_list',
@@ -11,11 +11,20 @@ __all__ = [
11
11
  # IntersectConfig (full configuration specification)
12
12
  #
13
13
 
14
+ import logging
14
15
  import re
15
16
  from typing import Optional
16
17
 
17
18
  from .parser import IntersectConfigParser
18
- from .stage import IntersectStage, IntersectStageMatch, IntersectStageRo, IntersectStageDistance, IntersectStageExact
19
+ from .stage import (
20
+ IntersectStage,
21
+ IntersectStageMatch,
22
+ IntersectStageRo,
23
+ IntersectStageDistance,
24
+ IntersectStageExact,
25
+ )
26
+
27
+ logger = logging.getLogger(__name__)
19
28
 
20
29
 
21
30
  class IntersectStrategy(object):