dnakit 0.1.0.dev0__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.
- dnakit/__init__.py +108 -0
- dnakit/_version.py +5 -0
- dnakit/alignment/__init__.py +6 -0
- dnakit/alignment/pairwise.py +512 -0
- dnakit/alignment/results.py +188 -0
- dnakit/backends/__init__.py +80 -0
- dnakit/backends/external.py +517 -0
- dnakit/backends/registry.py +207 -0
- dnakit/batch.py +452 -0
- dnakit/cache/__init__.py +5 -0
- dnakit/cache/store.py +424 -0
- dnakit/chunking.py +920 -0
- dnakit/cli/__init__.py +5 -0
- dnakit/cli/__main__.py +6 -0
- dnakit/cli/app.py +814 -0
- dnakit/cli/workflow.py +94 -0
- dnakit/config/__init__.py +5 -0
- dnakit/config/loader.py +381 -0
- dnakit/core/__init__.py +80 -0
- dnakit/core/_json.py +206 -0
- dnakit/core/backend_info.py +70 -0
- dnakit/core/collection.py +163 -0
- dnakit/core/coordinates.py +295 -0
- dnakit/core/enums.py +95 -0
- dnakit/core/facade.py +719 -0
- dnakit/core/feature.py +90 -0
- dnakit/core/gap.py +82 -0
- dnakit/core/issues.py +62 -0
- dnakit/core/provenance.py +305 -0
- dnakit/core/record.py +161 -0
- dnakit/core/results.py +134 -0
- dnakit/core/sequence.py +327 -0
- dnakit/datasets/__init__.py +100 -0
- dnakit/datasets/_advanced_shared.py +198 -0
- dnakit/datasets/_metadata.py +33 -0
- dnakit/datasets/advanced_deduplicate.py +183 -0
- dnakit/datasets/advanced_split.py +302 -0
- dnakit/datasets/clustering.py +286 -0
- dnakit/datasets/config.py +531 -0
- dnakit/datasets/deduplicate.py +303 -0
- dnakit/datasets/evaluation.py +244 -0
- dnakit/datasets/filter.py +135 -0
- dnakit/datasets/neural_clustering.py +221 -0
- dnakit/datasets/results.py +520 -0
- dnakit/datasets/split.py +450 -0
- dnakit/descriptors/__init__.py +102 -0
- dnakit/descriptors/_dinucleotide.py +345 -0
- dnakit/descriptors/_shared.py +180 -0
- dnakit/descriptors/all.py +917 -0
- dnakit/descriptors/basic.py +193 -0
- dnakit/descriptors/codon.py +195 -0
- dnakit/descriptors/complexity.py +201 -0
- dnakit/descriptors/entropy.py +101 -0
- dnakit/descriptors/homopolymer.py +105 -0
- dnakit/descriptors/kmer.py +88 -0
- dnakit/descriptors/results.py +286 -0
- dnakit/descriptors/schema.py +414 -0
- dnakit/descriptors/window.py +203 -0
- dnakit/download/__init__.py +54 -0
- dnakit/download/catalogs.py +166 -0
- dnakit/download/ena.py +131 -0
- dnakit/download/encode.py +103 -0
- dnakit/download/files.py +469 -0
- dnakit/download/indexes.py +233 -0
- dnakit/download/metadata.py +164 -0
- dnakit/download/models.py +227 -0
- dnakit/download/ncbi.py +333 -0
- dnakit/download/sequence.py +133 -0
- dnakit/download/ucsc.py +99 -0
- dnakit/evaluation/__init__.py +81 -0
- dnakit/evaluation/_shared.py +288 -0
- dnakit/evaluation/collection.py +270 -0
- dnakit/evaluation/config.py +591 -0
- dnakit/evaluation/distribution.py +287 -0
- dnakit/evaluation/frechet.py +223 -0
- dnakit/evaluation/generative.py +381 -0
- dnakit/evaluation/reference.py +409 -0
- dnakit/evaluation/results.py +137 -0
- dnakit/evaluation/scorecard.py +211 -0
- dnakit/evaluation/sequence.py +403 -0
- dnakit/evaluation/synthesis.py +249 -0
- dnakit/exceptions.py +189 -0
- dnakit/fingerprints/__init__.py +109 -0
- dnakit/fingerprints/_shared.py +116 -0
- dnakit/fingerprints/advanced.py +829 -0
- dnakit/fingerprints/bit.py +229 -0
- dnakit/fingerprints/encoding.py +351 -0
- dnakit/fingerprints/kmer.py +170 -0
- dnakit/fingerprints/results.py +531 -0
- dnakit/fingerprints/sketch.py +246 -0
- dnakit/io/__init__.py +112 -0
- dnakit/io/_advanced_common.py +105 -0
- dnakit/io/_formats.py +994 -0
- dnakit/io/annotations.py +1179 -0
- dnakit/io/api.py +759 -0
- dnakit/io/config.py +315 -0
- dnakit/io/genbank.py +523 -0
- dnakit/io/indexed.py +1146 -0
- dnakit/io/metadata.py +452 -0
- dnakit/io/parquet.py +56 -0
- dnakit/io/results.py +131 -0
- dnakit/io/source.py +138 -0
- dnakit/io/tables.py +1237 -0
- dnakit/molbio/__init__.py +101 -0
- dnakit/molbio/_shared.py +266 -0
- dnakit/molbio/assembly.py +279 -0
- dnakit/molbio/crispr.py +181 -0
- dnakit/molbio/optimization.py +897 -0
- dnakit/molbio/primer3_design.py +667 -0
- dnakit/molbio/primers.py +899 -0
- dnakit/molbio/restriction.py +573 -0
- dnakit/molbio/results.py +583 -0
- dnakit/ops/__init__.py +588 -0
- dnakit/ops/_common.py +201 -0
- dnakit/ops/circular.py +193 -0
- dnakit/ops/concat.py +204 -0
- dnakit/ops/direction.py +27 -0
- dnakit/ops/edit.py +443 -0
- dnakit/ops/evolution.py +991 -0
- dnakit/ops/mutation.py +151 -0
- dnakit/ops/records.py +1012 -0
- dnakit/ops/translation.py +257 -0
- dnakit/patterns/__init__.py +81 -0
- dnakit/patterns/_shared.py +282 -0
- dnakit/patterns/coding.py +360 -0
- dnakit/patterns/crispr.py +337 -0
- dnakit/patterns/motif.py +721 -0
- dnakit/patterns/regions.py +341 -0
- dnakit/patterns/repeats.py +480 -0
- dnakit/patterns/restriction.py +281 -0
- dnakit/patterns/results.py +411 -0
- dnakit/py.typed +1 -0
- dnakit/references/__init__.py +27 -0
- dnakit/references/models.py +155 -0
- dnakit/references/ncbi.py +785 -0
- dnakit/representations/__init__.py +29 -0
- dnakit/representations/backends.py +928 -0
- dnakit/representations/checkpoints.py +356 -0
- dnakit/representations/extraction.py +220 -0
- dnakit/representations/models.py +395 -0
- dnakit/representations/results.py +79 -0
- dnakit/search/__init__.py +132 -0
- dnakit/search/_http.py +271 -0
- dnakit/search/_shared.py +108 -0
- dnakit/search/blast.py +516 -0
- dnakit/search/ena.py +245 -0
- dnakit/search/encode.py +102 -0
- dnakit/search/ensembl.py +874 -0
- dnakit/search/models.py +159 -0
- dnakit/search/ncbi.py +756 -0
- dnakit/search/ucsc.py +388 -0
- dnakit/secondary_structure/__init__.py +38 -0
- dnakit/secondary_structure/dotbracket.py +410 -0
- dnakit/secondary_structure/nupack.py +589 -0
- dnakit/secondary_structure/results.py +142 -0
- dnakit/similarity/__init__.py +125 -0
- dnakit/similarity/_shared.py +152 -0
- dnakit/similarity/approximate.py +258 -0
- dnakit/similarity/compare.py +162 -0
- dnakit/similarity/dashing.py +936 -0
- dnakit/similarity/distance.py +279 -0
- dnakit/similarity/index.py +365 -0
- dnakit/similarity/matrix.py +254 -0
- dnakit/similarity/results.py +676 -0
- dnakit/similarity/search.py +286 -0
- dnakit/similarity/sketch.py +96 -0
- dnakit/similarity/vector.py +662 -0
- dnakit/standardize/__init__.py +77 -0
- dnakit/standardize/_shared.py +100 -0
- dnakit/standardize/config.py +411 -0
- dnakit/standardize/gaps.py +1060 -0
- dnakit/standardize/normalize.py +565 -0
- dnakit/standardize/results.py +247 -0
- dnakit/standardize/validate.py +487 -0
- dnakit/structure3d/__init__.py +47 -0
- dnakit/structure3d/_shared.py +47 -0
- dnakit/structure3d/geometry.py +773 -0
- dnakit/structure3d/pdb.py +253 -0
- dnakit/structure3d/results.py +233 -0
- dnakit/structure3d/threedna.py +174 -0
- dnakit/thermodynamics/__init__.py +112 -0
- dnakit/thermodynamics/_shared.py +92 -0
- dnakit/thermodynamics/backends.py +653 -0
- dnakit/thermodynamics/calculations.py +837 -0
- dnakit/thermodynamics/config.py +175 -0
- dnakit/thermodynamics/equilibrium.py +340 -0
- dnakit/thermodynamics/optics.py +385 -0
- dnakit/thermodynamics/parameters.py +79 -0
- dnakit/thermodynamics/results.py +445 -0
- dnakit/visualization/__init__.py +43 -0
- dnakit/visualization/_svg.py +185 -0
- dnakit/visualization/advanced.py +314 -0
- dnakit/visualization/config.py +255 -0
- dnakit/visualization/export.py +349 -0
- dnakit/visualization/matrix.py +279 -0
- dnakit/visualization/report.py +431 -0
- dnakit/visualization/results.py +236 -0
- dnakit/visualization/sequence.py +459 -0
- dnakit/workflows/__init__.py +45 -0
- dnakit/workflows/manifest.py +365 -0
- dnakit/workflows/runner.py +1548 -0
- dnakit/workflows/schema.py +898 -0
- dnakit-0.1.0.dev0.dist-info/METADATA +126 -0
- dnakit-0.1.0.dev0.dist-info/RECORD +210 -0
- dnakit-0.1.0.dev0.dist-info/WHEEL +5 -0
- dnakit-0.1.0.dev0.dist-info/entry_points.txt +2 -0
- dnakit-0.1.0.dev0.dist-info/licenses/DISCLAIMER.md +26 -0
- dnakit-0.1.0.dev0.dist-info/licenses/LICENSE +21 -0
- dnakit-0.1.0.dev0.dist-info/licenses/THIRD_PARTY_NOTICES.md +73 -0
- dnakit-0.1.0.dev0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"""Unified scalar comparison dispatch for sequence and fingerprint inputs."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import TypeAlias, cast
|
|
6
|
+
|
|
7
|
+
from dnakit.core import DNA, DNARecord, DNASequence
|
|
8
|
+
from dnakit.core._json import FrozenDict
|
|
9
|
+
from dnakit.exceptions import ConfigurationError
|
|
10
|
+
from dnakit.similarity._shared import SequenceInput, sequence_and_id, validate_bool
|
|
11
|
+
from dnakit.similarity.distance import edit_distance, hamming_distance
|
|
12
|
+
from dnakit.similarity.results import DistanceResult, SimilarityResult
|
|
13
|
+
from dnakit.similarity.vector import (
|
|
14
|
+
KmerMetric,
|
|
15
|
+
KmerMode,
|
|
16
|
+
KmerVectorInput,
|
|
17
|
+
VectorInput,
|
|
18
|
+
VectorMetric,
|
|
19
|
+
WeightInput,
|
|
20
|
+
ZeroVectorPolicy,
|
|
21
|
+
fingerprint_similarity,
|
|
22
|
+
kmer_similarity,
|
|
23
|
+
kmer_vector_similarity,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
ComparisonInput: TypeAlias = SequenceInput | VectorInput
|
|
27
|
+
ComparisonResult: TypeAlias = SimilarityResult | DistanceResult
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _as_sequence(value: ComparisonInput, *, role: str) -> SequenceInput:
|
|
31
|
+
if not isinstance(value, (DNA, DNASequence, DNARecord)):
|
|
32
|
+
raise ConfigurationError(
|
|
33
|
+
f"{role} must be DNASequence or DNARecord for this method.",
|
|
34
|
+
code="INVALID_COMPARISON_INPUT",
|
|
35
|
+
context={"role": role, "input_type": type(value).__name__},
|
|
36
|
+
)
|
|
37
|
+
return value
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def exact_similarity(
|
|
41
|
+
left: SequenceInput,
|
|
42
|
+
right: SequenceInput,
|
|
43
|
+
*,
|
|
44
|
+
reverse_complement: bool = False,
|
|
45
|
+
) -> SimilarityResult:
|
|
46
|
+
"""Return 1 for literal full-sequence equality, otherwise 0."""
|
|
47
|
+
|
|
48
|
+
validate_bool(reverse_complement, "reverse_complement")
|
|
49
|
+
left_sequence, left_id = sequence_and_id(left, role="left")
|
|
50
|
+
right_sequence, right_id = sequence_and_id(right, role="right")
|
|
51
|
+
forward_equal = left_sequence.symbols == right_sequence.symbols
|
|
52
|
+
reverse_equal = (
|
|
53
|
+
reverse_complement and left_sequence.reverse_complement().symbols == right_sequence.symbols
|
|
54
|
+
)
|
|
55
|
+
return SimilarityResult(
|
|
56
|
+
name="exact_similarity",
|
|
57
|
+
method="literal_full_sequence_equality",
|
|
58
|
+
value=float(forward_equal or reverse_equal),
|
|
59
|
+
value_kind="similarity",
|
|
60
|
+
left_id=left_id,
|
|
61
|
+
right_id=right_id,
|
|
62
|
+
left_dimension=left_sequence.symbol_length,
|
|
63
|
+
right_dimension=right_sequence.symbol_length,
|
|
64
|
+
parameters=FrozenDict({"reverse_complement": reverse_complement}),
|
|
65
|
+
components=FrozenDict(
|
|
66
|
+
{"forward_equal": forward_equal, "reverse_complement_equal": reverse_equal}
|
|
67
|
+
),
|
|
68
|
+
zero_vector_policy=None,
|
|
69
|
+
iupac_matching="literal",
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def compare(
|
|
74
|
+
left: ComparisonInput,
|
|
75
|
+
right: ComparisonInput,
|
|
76
|
+
*,
|
|
77
|
+
method: str,
|
|
78
|
+
k: int | None = None,
|
|
79
|
+
mode: KmerMode = "set",
|
|
80
|
+
canonical: bool = False,
|
|
81
|
+
overlapping: bool = True,
|
|
82
|
+
reverse_complement: bool = False,
|
|
83
|
+
weights: WeightInput | None = None,
|
|
84
|
+
zero_vector_policy: ZeroVectorPolicy = "identity",
|
|
85
|
+
return_path: bool = False,
|
|
86
|
+
) -> ComparisonResult:
|
|
87
|
+
"""Dispatch one explicit native comparison method.
|
|
88
|
+
|
|
89
|
+
Supported names are ``exact``, ``hamming``, ``edit``,
|
|
90
|
+
``kmer_jaccard``, ``kmer_containment``, ``kmer_cosine``, and the
|
|
91
|
+
fingerprint/vector methods ``tanimoto``, ``jaccard``, ``cosine``,
|
|
92
|
+
``euclidean``, and ``manhattan``.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
if not isinstance(method, str) or not method:
|
|
96
|
+
raise ConfigurationError("Comparison method must be a non-empty string.")
|
|
97
|
+
if method == "exact":
|
|
98
|
+
return exact_similarity(
|
|
99
|
+
_as_sequence(left, role="left"),
|
|
100
|
+
_as_sequence(right, role="right"),
|
|
101
|
+
reverse_complement=reverse_complement,
|
|
102
|
+
)
|
|
103
|
+
if method == "hamming":
|
|
104
|
+
return hamming_distance(
|
|
105
|
+
_as_sequence(left, role="left"),
|
|
106
|
+
_as_sequence(right, role="right"),
|
|
107
|
+
)
|
|
108
|
+
if method == "edit":
|
|
109
|
+
return edit_distance(
|
|
110
|
+
_as_sequence(left, role="left"),
|
|
111
|
+
_as_sequence(right, role="right"),
|
|
112
|
+
return_path=return_path,
|
|
113
|
+
)
|
|
114
|
+
if method in ("kmer_jaccard", "kmer_containment", "kmer_cosine"):
|
|
115
|
+
metric = cast(KmerMetric, method.removeprefix("kmer_"))
|
|
116
|
+
left_is_sequence = isinstance(left, (DNA, DNASequence, DNARecord))
|
|
117
|
+
right_is_sequence = isinstance(right, (DNA, DNASequence, DNARecord))
|
|
118
|
+
if left_is_sequence != right_is_sequence:
|
|
119
|
+
raise ConfigurationError(
|
|
120
|
+
"k-mer comparison cannot mix a DNA sequence with a k-mer vector.",
|
|
121
|
+
code="MIXED_COMPARISON_INPUTS",
|
|
122
|
+
)
|
|
123
|
+
if left_is_sequence and k is None:
|
|
124
|
+
raise ConfigurationError(
|
|
125
|
+
"A positive k is required for k-mer comparison.",
|
|
126
|
+
code="MISSING_KMER_SIZE",
|
|
127
|
+
)
|
|
128
|
+
if left_is_sequence:
|
|
129
|
+
assert k is not None
|
|
130
|
+
return kmer_similarity(
|
|
131
|
+
_as_sequence(left, role="left"),
|
|
132
|
+
_as_sequence(right, role="right"),
|
|
133
|
+
k=k,
|
|
134
|
+
metric=metric,
|
|
135
|
+
mode=mode,
|
|
136
|
+
canonical=canonical,
|
|
137
|
+
overlapping=overlapping,
|
|
138
|
+
zero_vector_policy=zero_vector_policy,
|
|
139
|
+
)
|
|
140
|
+
return kmer_vector_similarity(
|
|
141
|
+
cast(KmerVectorInput, left),
|
|
142
|
+
cast(KmerVectorInput, right),
|
|
143
|
+
metric=metric,
|
|
144
|
+
mode=mode,
|
|
145
|
+
zero_vector_policy=zero_vector_policy,
|
|
146
|
+
)
|
|
147
|
+
if method in ("tanimoto", "jaccard", "cosine", "euclidean", "manhattan"):
|
|
148
|
+
return fingerprint_similarity(
|
|
149
|
+
cast(VectorInput, left),
|
|
150
|
+
cast(VectorInput, right),
|
|
151
|
+
metric=cast(VectorMetric, method),
|
|
152
|
+
weights=weights,
|
|
153
|
+
zero_vector_policy=zero_vector_policy,
|
|
154
|
+
)
|
|
155
|
+
raise ConfigurationError(
|
|
156
|
+
"Unknown comparison method.",
|
|
157
|
+
code="INVALID_COMPARISON_METHOD",
|
|
158
|
+
context={"method": method},
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
__all__ = ["compare", "exact_similarity"]
|