pyseqalignment 0.1.0__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.
Files changed (41) hide show
  1. pyseqalign/__init__.py +14 -0
  2. pyseqalign/core/__init__.py +12 -0
  3. pyseqalign/core/alignment.py +67 -0
  4. pyseqalign/core/needleman_wunsch.py +122 -0
  5. pyseqalign/core/smith_waterman.py +173 -0
  6. pyseqalign/learning/__init__.py +20 -0
  7. pyseqalign/learning/aleph.py +212 -0
  8. pyseqalign/learning/aleph_files/__init__.py +0 -0
  9. pyseqalign/learning/aleph_files/aleph_swi_ak.pl +10420 -0
  10. pyseqalign/learning/base.py +68 -0
  11. pyseqalign/learning/popper.py +215 -0
  12. pyseqalign/learning/task_builder.py +213 -0
  13. pyseqalign/prolog/__init__.py +5 -0
  14. pyseqalign/prolog/engine.py +102 -0
  15. pyseqalign/prolog/knowledge/__init__.py +0 -0
  16. pyseqalign/prolog/knowledge/amino_acids.pl +53 -0
  17. pyseqalign/prolog/knowledge/blosum50.pl +800 -0
  18. pyseqalign/prolog/knowledge/defaults.pl +15 -0
  19. pyseqalign/prolog/knowledge/distances.pl +119 -0
  20. pyseqalign/scoring/__init__.py +11 -0
  21. pyseqalign/scoring/distance.py +100 -0
  22. pyseqalign/scoring/matrices.py +362 -0
  23. pyseqalign/scoring/matrix_data/BLOSUM100 +31 -0
  24. pyseqalign/scoring/matrix_data/BLOSUM50 +31 -0
  25. pyseqalign/scoring/matrix_data/BLOSUM60 +31 -0
  26. pyseqalign/scoring/matrix_data/BLOSUM62 +31 -0
  27. pyseqalign/scoring/matrix_data/BLOSUM70 +31 -0
  28. pyseqalign/scoring/matrix_data/BLOSUM80 +31 -0
  29. pyseqalign/scoring/matrix_data/BLOSUM90 +31 -0
  30. pyseqalign/scoring/matrix_data/PAM150 +34 -0
  31. pyseqalign/scoring/matrix_data/PAM200 +34 -0
  32. pyseqalign/scoring/matrix_data/PAM250 +34 -0
  33. pyseqalign/scoring/matrix_data/PAM50 +34 -0
  34. pyseqalign/scoring/matrix_data/__init__.py +0 -0
  35. pyseqalign/utils/__init__.py +9 -0
  36. pyseqalign/utils/helpers.py +47 -0
  37. pyseqalignment-0.1.0.dist-info/METADATA +317 -0
  38. pyseqalignment-0.1.0.dist-info/RECORD +41 -0
  39. pyseqalignment-0.1.0.dist-info/WHEEL +5 -0
  40. pyseqalignment-0.1.0.dist-info/licenses/LICENSE +21 -0
  41. pyseqalignment-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,317 @@
1
+ Metadata-Version: 2.4
2
+ Name: pyseqalignment
3
+ Version: 0.1.0
4
+ Summary: pySeqAlign -- sequence alignment with Prolog-style distance functions and ILP learning
5
+ Author-email: Andreas Karwath <a.karwath@bham.ac.uk>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/athro/pySeqAlign
8
+ Project-URL: Repository, https://github.com/athro/pySeqAlign
9
+ Project-URL: Issues, https://github.com/athro/pySeqAlign/issues
10
+ Keywords: sequence-alignment,prolog,smith-waterman,needleman-wunsch,bioinformatics,ilp,inductive-logic-programming
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Science/Research
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
19
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
20
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
+ Requires-Python: >=3.10
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: numpy>=1.24
25
+ Provides-Extra: prolog
26
+ Requires-Dist: janus_swi>=1.5; extra == "prolog"
27
+ Provides-Extra: popper
28
+ Requires-Dist: clingo>=5.6; extra == "popper"
29
+ Provides-Extra: learning
30
+ Requires-Dist: janus_swi>=1.5; extra == "learning"
31
+ Requires-Dist: clingo>=5.6; extra == "learning"
32
+ Provides-Extra: dev
33
+ Requires-Dist: pytest>=7.0; extra == "dev"
34
+ Requires-Dist: pytest-cov>=4.0; extra == "dev"
35
+ Requires-Dist: ruff>=0.4; extra == "dev"
36
+ Requires-Dist: mypy>=1.0; extra == "dev"
37
+ Dynamic: license-file
38
+
39
+ # pySeqAlign
40
+
41
+ Sequence alignment library with Prolog-style distance functions and ILP-based rule learning.
42
+
43
+ pySeqAlign provides Smith-Waterman (local) and Needleman-Wunsch (global) sequence alignment algorithms with pluggable distance/scoring functions. Distance functions can be defined natively in Python, via Prolog predicates, or *learned from data* using Inductive Logic Programming (ILP). This enables alignment of structured logical atoms beyond simple character or amino acid sequences.
44
+
45
+ > **Install:** the package is published on PyPI as **`pyseqalignment`**
46
+ > (the name `pyseqalign` was blocked by PyPI's name-similarity guard). The
47
+ > import package is `pyseqalign`:
48
+ >
49
+ > ```bash
50
+ > pip install pyseqalignment
51
+ > ```
52
+ > ```python
53
+ > import pyseqalign
54
+ > ```
55
+
56
+ ## Features
57
+
58
+ - **Smith-Waterman** local alignment with k-best non-overlapping results
59
+ - **Needleman-Wunsch** global alignment
60
+ - **Prolog-based distance functions** via SWI-Prolog integration (optional)
61
+ - **Substitution matrices** -- BLOSUM (50, 60, 62, 70, 80, 90, 100) and PAM (50, 150, 200, 250) bundled; any NCBI-format matrix loadable from file or downloaded at runtime
62
+ - **Nienhuys-Cheng distance** for recursive structural comparison of logical atoms
63
+ - **ILP learning** of alignment rules and distance predicates:
64
+ - **Aleph** backend -- classic ILP system (Srinivasan, 2001)
65
+ - **Popper** backend -- modern ILP via learning from failures (Cropper & Morel, 2021)
66
+ - **Pure Python** core -- no C extension required (unlike the legacy version)
67
+
68
+ ## Installation
69
+
70
+ ### Prerequisites
71
+
72
+ - **Python >= 3.10** (tested on 3.10 -- 3.14)
73
+ - **SWI-Prolog** (optional, for Prolog-based scoring and ILP learning)
74
+ - **Clingo** (optional, for the Popper ILP backend)
75
+
76
+ ```bash
77
+ # macOS (Homebrew)
78
+ brew install swi-prolog clingo
79
+
80
+ # Ubuntu / Debian
81
+ sudo apt install swi-prolog gringo
82
+ ```
83
+
84
+ ### Setting up with pyenv (recommended)
85
+
86
+ ```bash
87
+ # Install a Python version
88
+ pyenv install 3.13.9
89
+
90
+ # Create a pyenv virtualenv
91
+ pyenv virtualenv 3.13.9 pyseqalign-env
92
+
93
+ # Activate it for this project directory
94
+ cd pySeqAlign
95
+ pyenv local pyseqalign-env
96
+
97
+ # Install all dependencies
98
+ pip install -r requirements.txt
99
+ pip install -e ".[learning,dev]"
100
+
101
+ # Register the Jupyter kernel so notebooks can use this environment
102
+ pip install ipykernel
103
+ python -m ipykernel install --user --name pyseqalign-env --display-name "Python (pySeqAlign)"
104
+ ```
105
+
106
+ ### Setting up with venv (system Python)
107
+
108
+ ```bash
109
+ cd pySeqAlign
110
+ python3 -m venv .venv
111
+ source .venv/bin/activate # Linux / macOS
112
+ # .venv\Scripts\activate # Windows
113
+
114
+ # Install all dependencies
115
+ pip install -r requirements.txt
116
+ pip install -e ".[learning,dev]"
117
+
118
+ # Register the Jupyter kernel
119
+ pip install ipykernel
120
+ python -m ipykernel install --user --name pyseqalign-env --display-name "Python (pySeqAlign)"
121
+ ```
122
+
123
+ ### Optional dependencies
124
+
125
+ Install selectively if you don't need everything:
126
+
127
+ ```bash
128
+ # Core only (no Prolog, no ILP)
129
+ pip install -e .
130
+
131
+ # Prolog-based distance functions (requires SWI-Prolog)
132
+ pip install -e ".[prolog]"
133
+
134
+ # Popper ILP backend's solver (Clingo). The Popper system itself is not on
135
+ # PyPI -- install it separately (see the note below).
136
+ pip install -e ".[popper]"
137
+
138
+ # Prolog + Clingo for the ILP backends (Popper installed separately)
139
+ pip install -e ".[learning]"
140
+
141
+ # Development tools (pytest, ruff, mypy)
142
+ pip install -e ".[dev]"
143
+ ```
144
+
145
+ ### Using requirements.txt
146
+
147
+ A `requirements.txt` is provided listing all Python dependencies (core,
148
+ Prolog, Popper, Jupyter, and development tools):
149
+
150
+ ```bash
151
+ pip install -r requirements.txt
152
+ ```
153
+
154
+ > **Note (Python 3.14):** Popper currently uses `pkg_resources`, which was
155
+ > removed from `setuptools>=81`. If you are on Python 3.14, install
156
+ > `setuptools<81` before Popper: `pip install 'setuptools<81'`.
157
+ >
158
+ > **Note:** Popper is **not available on PyPI**, so it cannot be a declared
159
+ > dependency (PyPI forbids direct-URL deps). The `popper`/`learning` extras
160
+ > install its solver (Clingo); install the Popper system itself from the
161
+ > actively maintained [GitHub repository](https://github.com/logic-and-learning-lab/Popper)
162
+ > (v4.2.0+):
163
+ >
164
+ > ```bash
165
+ > pip install git+https://github.com/logic-and-learning-lab/Popper@main
166
+ > ```
167
+
168
+ ## Quick Start
169
+
170
+ ```python
171
+ from pyseqalign import SmithWaterman, NeedlemanWunsch
172
+ from pyseqalign.scoring import Blosum50
173
+
174
+ # Local alignment with BLOSUM50 scoring
175
+ sw = SmithWaterman(scoring=Blosum50(), gap_penalty=-8.0)
176
+ results = sw.align(seq1, seq2, k=4, min_score=2.0)
177
+
178
+ for alignment in results:
179
+ print(f"Score: {alignment.score}")
180
+ print(f" Query: {alignment.query}")
181
+ print(f" Target: {alignment.target}")
182
+
183
+ # Global alignment
184
+ nw = NeedlemanWunsch(scoring=Blosum50(), gap_penalty=-8.0)
185
+ result = nw.align(seq1, seq2)
186
+ print(f"Score: {result.score}")
187
+ ```
188
+
189
+ ### Substitution Matrices
190
+
191
+ ```python
192
+ from pyseqalign.scoring import SubstitutionMatrix
193
+
194
+ # Load a bundled matrix by name
195
+ blosum62 = SubstitutionMatrix.from_bundled("BLOSUM62")
196
+ pam250 = SubstitutionMatrix.from_bundled("PAM250")
197
+
198
+ # Use with any aligner
199
+ sw = SmithWaterman(scoring=blosum62, gap_penalty=-8.0)
200
+
201
+ # Load from any NCBI-format file on disk
202
+ custom = SubstitutionMatrix.from_file("/path/to/my/MATRIX")
203
+
204
+ # Download directly from the NCBI FTP server at runtime
205
+ pam120 = SubstitutionMatrix.from_ncbi("PAM120")
206
+
207
+ # List all bundled matrices
208
+ print(SubstitutionMatrix.list_bundled())
209
+ # ['BLOSUM100', 'BLOSUM50', 'BLOSUM60', 'BLOSUM62', 'BLOSUM70',
210
+ # 'BLOSUM80', 'BLOSUM90', 'PAM150', 'PAM200', 'PAM250', 'PAM50']
211
+ ```
212
+
213
+ ### Using Prolog Distance Functions
214
+
215
+ ```python
216
+ from pyseqalign.prolog import PrologEngine
217
+
218
+ engine = PrologEngine()
219
+ engine.consult("my_distances.pl")
220
+
221
+ sw = SmithWaterman(scoring=engine, gap_penalty=-8.0)
222
+ results = sw.align(seq1, seq2)
223
+ ```
224
+
225
+ ### Learning Alignment Rules with ILP
226
+
227
+ ```python
228
+ from pyseqalign.learning import AlignmentTaskBuilder
229
+ from pyseqalign.learning.popper import PopperLearner
230
+
231
+ # Build an ILP task from labelled sequence pairs.
232
+ builder = AlignmentTaskBuilder()
233
+ builder.add_positive_pair([1, 2, 3], [1, 2, 4], label="similar")
234
+ builder.add_positive_pair([5, 6, 7], [5, 6, 8], label="similar")
235
+ builder.add_negative_pair([1, 2, 3], [10, 11, 12], label="similar")
236
+ builder.use_default_alignment_bias_popper()
237
+
238
+ task = builder.build()
239
+
240
+ # Learn rules with Popper (modern, recommended).
241
+ learner = PopperLearner(timeout=60)
242
+ result = learner.learn(task)
243
+ print(result.program_text)
244
+ ```
245
+
246
+ Or using the classic Aleph backend:
247
+
248
+ ```python
249
+ from pyseqalign.learning.aleph import AlephLearner
250
+
251
+ builder = AlignmentTaskBuilder()
252
+ # ... add examples ...
253
+ builder.use_default_alignment_bias_aleph()
254
+ task = builder.build()
255
+
256
+ learner = AlephLearner(induce_mode="induce")
257
+ result = learner.learn(task)
258
+ print(result.program_text)
259
+ ```
260
+
261
+ ## Project Structure
262
+
263
+ ```
264
+ pySeqAlign/
265
+ ├── src/
266
+ │ └── pyseqalign/
267
+ │ ├── core/ # Alignment algorithms (SW, NW)
268
+ │ ├── prolog/ # Prolog engine integration
269
+ │ │ └── knowledge/ # Prolog knowledge bases (.pl files)
270
+ │ ├── scoring/ # Scoring/distance functions
271
+ │ │ └── matrix_data/ # Bundled NCBI substitution matrices
272
+ │ ├── learning/ # ILP learning backends
273
+ │ │ ├── base.py # Common types & protocol
274
+ │ │ ├── task_builder.py # Convert alignment data -> ILP format
275
+ │ │ ├── aleph.py # Aleph backend (classic ILP)
276
+ │ │ ├── popper.py # Popper backend (modern ILP)
277
+ │ │ └── aleph_files/ # Bundled Aleph Prolog source
278
+ │ └── utils/ # Helpers and data structures
279
+ ├── tests/
280
+ ├── examples/
281
+ └── docs/
282
+ ```
283
+
284
+ ## ILP Backends
285
+
286
+ ### Popper (recommended)
287
+
288
+ [Popper](https://github.com/logic-and-learning-lab/Popper) is a modern ILP system that learns from failures by combining ASP and Prolog. Advantages over Aleph:
289
+
290
+ - Learns optimal and recursive programs
291
+ - No metarules required
292
+ - Handles noise (MDL-based)
293
+ - Scales well (no grounding required)
294
+ - Native Python API
295
+
296
+ ### Aleph (classic)
297
+
298
+ [Aleph](https://en.wikipedia.org/wiki/Aleph_(ILP)) is the classic ILP system by Ashwin Srinivasan, implementing Mode-Directed Inverse Entailment. The bundled `aleph_swi_ak.pl` is a SWI-Prolog compatible version ported from the legacy pySeqAlign codebase.
299
+
300
+ Supports multiple induction modes: `induce`, `induce_max`, `induce_cover`, `induce_tree`, `induce_features`, `induce_constraints`, `induce_incremental`, `induce_theory`.
301
+
302
+ ### Other Modern ILP Systems
303
+
304
+ For reference, other notable systems in the field include:
305
+
306
+ - [PyILP](https://github.com/danyvarghese/PyILP) -- Python interface wrapping Aleph and Metagol for teaching
307
+ - [ILASP](https://github.com/ilaspltd/ILASP-releases) -- Answer Set Programming-based ILP
308
+ - [Metagol](https://github.com/metagol/metagol) -- Meta-Interpretive Learning
309
+ - [DeepStochLog](https://github.com/ML-KULeuven/deepstochlog) -- Neural-symbolic ILP combining logic and neural networks
310
+
311
+ ## Background
312
+
313
+ **pySeqAlign** is a modern, pure-Python reimplementation that revives the name of one of its own ancestors. It succeeds two legacy libraries behind the ILP 2006 / ICDM 2008 work: the original **pyAlign** (SWIG-wrapped C with YAP Prolog bindings for alignment) and the original **pySeqAlign** (which held the Aleph ILP framework for learning rules from alignment examples). This version is pure Python, with optional SWI-Prolog integration via [Janus](https://www.swi-prolog.org/packs/list?p=janus) (the modern Python-Prolog bridge, replacing the older pyswip).
314
+
315
+ ## License
316
+
317
+ MIT License. See [LICENSE](LICENSE) for details.
@@ -0,0 +1,41 @@
1
+ pyseqalign/__init__.py,sha256=m2gmsHPys1-GEXiBoL9AVRjQJXBlVvHC8iKEH2DKfb8,422
2
+ pyseqalign/core/__init__.py,sha256=o8fBDbufZ2NlPJjdT6oSqyH1QYLmyqxGcEs5vOl_USo,338
3
+ pyseqalign/core/alignment.py,sha256=CZ7U-9Yzim0WOLbR-i9N9DTwczHRG7zlxM-6cYD1Kn4,1752
4
+ pyseqalign/core/needleman_wunsch.py,sha256=6Yf8PfnryfHkEgoacXWmWKDSpUu--V_tz0X2a2wWquM,3665
5
+ pyseqalign/core/smith_waterman.py,sha256=PIUd8lXt0QlvMwGnXDt907lYm7R0fbum_0KaNfkNQzs,5862
6
+ pyseqalign/learning/__init__.py,sha256=-hFPztdoMTSWOhQeDA1uEKfEbeFAqTBIeucRmlgjGlM,726
7
+ pyseqalign/learning/aleph.py,sha256=ptYWWcow3CQr0t8ENkJFtOa1QSYcGTbGXj__ZlulOis,7329
8
+ pyseqalign/learning/base.py,sha256=inPz60usHjzovGKpz1fTFVUBNMPKddBdSepCKqtllcM,2352
9
+ pyseqalign/learning/popper.py,sha256=2xKCpI9AnJ2yfksjRq2Y9L94b3txDUf_lpYwczaSyx8,7191
10
+ pyseqalign/learning/task_builder.py,sha256=x3zhR-l92GqxY12_kgi9RNfBfazEnUG02KrhmRThvTQ,7794
11
+ pyseqalign/learning/aleph_files/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ pyseqalign/learning/aleph_files/aleph_swi_ak.pl,sha256=0scBik8tfI7VW0vvcWLkV0OIV1rV6v_PoNcNwajh4g0,333241
13
+ pyseqalign/prolog/__init__.py,sha256=VzEEn5zhHkSM9uaGOHjkBU5iwsLmoH18mBeiorbTg14,142
14
+ pyseqalign/prolog/engine.py,sha256=IHu8IcBK3VyOXBcmgsXy4odV8EhJ3ItfPw_oVvCoPrY,3647
15
+ pyseqalign/prolog/knowledge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ pyseqalign/prolog/knowledge/amino_acids.pl,sha256=AU3XNYInKmTYvpGTyQ7mXBPArb5rFjF71qh770KdrIM,1188
17
+ pyseqalign/prolog/knowledge/blosum50.pl,sha256=0SlxvsQ2QfB8xXZdoaNnqZMmryzcQ18HoqtDGC0f9d4,27963
18
+ pyseqalign/prolog/knowledge/defaults.pl,sha256=O1Q9m2ytU85HYbctZ3nCHF6grBYcAn5lo3PG3tYIrw4,366
19
+ pyseqalign/prolog/knowledge/distances.pl,sha256=V5nW25rNyuMsIk-NoH6Ocw-qJGseWoRU3g2b8Pqrpmo,3406
20
+ pyseqalign/scoring/__init__.py,sha256=MltG1wbmLWUZu6Q3QpvcrSsxpUiq_HRbo2ga04caFh8,293
21
+ pyseqalign/scoring/distance.py,sha256=54_kSS0sCwO05Apraj7EX68s3vmB9w6eMQBO8UD1DoA,3245
22
+ pyseqalign/scoring/matrices.py,sha256=LbM46IxUSG0A1P5EnhvbDLdNKBij8R3_Ojjn1tEP12o,12384
23
+ pyseqalign/scoring/matrix_data/BLOSUM100,sha256=Lj6_ayLvWa6148OKEtyHuOsd6hszb0suzDIpuY4XPJI,2174
24
+ pyseqalign/scoring/matrix_data/BLOSUM50,sha256=oVLjC4r8q0IoH_hgS8UTWL6YJTFV_eYq4gcHgFoNPWc,2122
25
+ pyseqalign/scoring/matrix_data/BLOSUM60,sha256=iHPf06rge36Xi7k1uwFKwvTb_hHrGNL44TApk3C5Ss8,2122
26
+ pyseqalign/scoring/matrix_data/BLOSUM62,sha256=hVENOEbubV9HeOQlz42vbg27iJswby0TQ04SVHgO-0A,2122
27
+ pyseqalign/scoring/matrix_data/BLOSUM70,sha256=kl3LsfT3r8zCWRHW3sJjiBUP6S6xCSySRmHPOIhu9Hc,2122
28
+ pyseqalign/scoring/matrix_data/BLOSUM80,sha256=LllxdrgJKAi6GZz8nYDcjWV7Wj5QFd-4HVVyhYGc4Yc,2124
29
+ pyseqalign/scoring/matrix_data/BLOSUM90,sha256=TebOIl7Y7oTgQcT2PC2vL0Oqhs3RsSCGgHTchJXHIU8,2122
30
+ pyseqalign/scoring/matrix_data/PAM150,sha256=1Jbj7ITgahFFbjGbD3dS0WXrYL2HmSYj9_6ITsgNSWQ,2067
31
+ pyseqalign/scoring/matrix_data/PAM200,sha256=BUDVdPGRgVgxH552pwFA2WkO5QpM1gLLu6cgMiNhprs,2067
32
+ pyseqalign/scoring/matrix_data/PAM250,sha256=k2zF7yPgJixf2vdNXYH1iEjrdMyg1b7w85bSexaJcE4,2068
33
+ pyseqalign/scoring/matrix_data/PAM50,sha256=L3wZ938pS5_dWww1UAITFNql0NaDyIDk4NrCK9Yz9Ww,2666
34
+ pyseqalign/scoring/matrix_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ pyseqalign/utils/__init__.py,sha256=87vEw3kyRctvVHNuxTlUJcSrq3Uv3imd5k6fOzdivas,213
36
+ pyseqalign/utils/helpers.py,sha256=5SEMmrpyG9KWsIWAHWUxWJB1SzZr12WmnrIsDHTS4_k,1340
37
+ pyseqalignment-0.1.0.dist-info/licenses/LICENSE,sha256=dqESE79IRNKt4uCzLTn_h6x5Vn598nh0gwU1u_V8xYM,1077
38
+ pyseqalignment-0.1.0.dist-info/METADATA,sha256=_Qyf1u2qMlQq9fDt2Bv2_wKkPkNcJ7x3qQnE4hELn34,11234
39
+ pyseqalignment-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
40
+ pyseqalignment-0.1.0.dist-info/top_level.txt,sha256=iMtL6E0yvAf74Rgpe5DcYvYkV5pfky7d2w5LD8500Z0,11
41
+ pyseqalignment-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-2026 Andreas Karwath
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ pyseqalign