cuSBF
Loading...
Searching...
No Matches
Alphabet.cuh
Go to the documentation of this file.
1#pragma once
2
3#include <cuda/std/__bit/integral.h>
4#include <cuda_runtime.h>
5
6#include <concepts>
7#include <cstdint>
8
9namespace cusbf {
10
11namespace detail {
12
13template <typename T>
14consteval uint64_t validByteCount() {
15 uint64_t count = 0;
16 while (T::validBytes[count] != '\0') {
17 ++count;
18 }
19 return count;
20}
21
35template <typename T>
36consteval bool
37separatorPositionAlwaysEncodesInvalid(char* input, uint64_t separatorPosition, uint64_t index) {
38 if (index == T::symbolWidth) {
39 return T::encode(input) == static_cast<uint8_t>(T::invalidSymbol);
40 }
41
42 if (index == separatorPosition) {
43 input[index] = static_cast<char>(T::separator);
45 }
46
48 input[index] = T::validBytes[byteIndex];
50 return false;
51 }
52 }
53 return true;
54}
55
66template <typename T>
68 for (uint64_t separatorPosition = 0; separatorPosition < T::symbolWidth; ++separatorPosition) {
69 char input[T::symbolWidth]{};
71 return false;
72 }
73 }
74 return true;
75}
76
77} // namespace detail
78
94template <typename T>
95concept Alphabet = requires(const char* input) {
96 { T::symbolCount } -> std::convertible_to<uint64_t>;
97 { T::symbolWidth } -> std::convertible_to<uint64_t>;
98 { T::invalidSymbol } -> std::convertible_to<uint8_t>;
99 { T::separator } -> std::convertible_to<uint8_t>;
100 { T::validBytes } -> std::convertible_to<const char*>;
101 { T::encode(input) } -> std::same_as<uint8_t>;
102} && requires {
103 requires T::symbolCount > 0 && T::symbolCount <= 255;
104 requires T::symbolWidth > 0;
105 requires detail::validByteCount<T>() > 0;
107};
108
115 static constexpr uint64_t symbolWidth = 1;
117 static constexpr uint64_t symbolCount = 4;
119 static constexpr uint8_t invalidSymbol = 0xFFu;
121 static constexpr uint8_t separator = 'N';
123 static constexpr char validBytes[] = "ACGT";
124
132 [[nodiscard]] constexpr __host__ __device__ __forceinline__ static uint8_t encode(
133 const char* input
134 ) {
135 const auto byte = static_cast<uint8_t>(input[0]);
136 const uint8_t upper = byte & 0xDFu; // force upper for validation only
137 const uint8_t x = (byte >> 1u) & 3u; // A=0, C=1, T=2, G=3
138 const uint8_t valid = (upper == 'A') | (upper == 'C') | (upper == 'G') | (upper == 'T');
139 const uint8_t mask = -valid;
140 return (x & mask) | (invalidSymbol & ~mask);
141 }
142};
143
152 static constexpr uint64_t symbolWidth = 3;
154 static constexpr uint64_t symbolCount = 64;
156 static constexpr uint8_t invalidSymbol = 0xFFu;
158 static constexpr uint8_t separator = 'N';
160 static constexpr char validBytes[] = "ACGT";
161
167 [[nodiscard]] constexpr __host__ __device__ __forceinline__ static uint8_t encode(
168 const char* input
169 ) {
170 const uint8_t a = DnaAlphabet::encode(input + 0);
171 const uint8_t b = DnaAlphabet::encode(input + 1);
172 const uint8_t c = DnaAlphabet::encode(input + 2);
173 const uint8_t valid = (a != invalidSymbol) & (b != invalidSymbol) & (c != invalidSymbol);
174 const uint8_t packed = (a << 4u) | (b << 2u) | c;
175 const uint8_t mask = -valid;
176 return (packed & mask) | (invalidSymbol & ~mask);
177 }
178};
179
191 static constexpr uint64_t symbolWidth = 1;
193 static constexpr uint64_t symbolCount = 26;
195 static constexpr uint8_t invalidSymbol = 0xFFu;
197 static constexpr uint8_t separator = '*';
199 static constexpr char validBytes[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
200
208 [[nodiscard]] constexpr __host__ __device__ __forceinline__ static uint8_t encode(
209 const char* input
210 ) {
211 const auto byte = static_cast<uint8_t>(input[0]);
212 const uint8_t upper = byte & 0xDFu;
213 const uint8_t letterIndex = upper - 'A';
214 const uint8_t valid = letterIndex < 26;
215 const uint8_t mask = -valid;
216 return (letterIndex & mask) | (invalidSymbol & ~mask);
217 }
218};
219
220} // namespace cusbf
Concept for alphabet-like types used to encode bytes as symbol indices.
Definition Alphabet.cuh:95
consteval uint64_t validByteCount()
Definition Alphabet.cuh:14
consteval bool separatorByteAlwaysEncodesInvalid()
Tests that for every position in the input, placing the separator byte at that position always result...
Definition Alphabet.cuh:67
consteval bool separatorPositionAlwaysEncodesInvalid(char *input, uint64_t separatorPosition, uint64_t index)
Recursively tests whether placing the separator byte at any position in an input of valid bytes alway...
Definition Alphabet.cuh:37
An alphabet for encoding DNA sequences, consisting of the symbols A, C, G, and T.
Definition Alphabet.cuh:113
static constexpr uint8_t separator
Byte value used between concatenated records (must not encode as a valid symbol).
Definition Alphabet.cuh:121
constexpr __host__ __device__ static __forceinline__ uint8_t encode(const char *input)
Maps one byte to a 2-bit symbol index, or invalidSymbol.
Definition Alphabet.cuh:132
static constexpr uint64_t symbolWidth
Input bytes per encoded symbol.
Definition Alphabet.cuh:115
static constexpr uint8_t invalidSymbol
Sentinel returned by encode for invalid input bytes.
Definition Alphabet.cuh:119
static constexpr uint64_t symbolCount
Number of valid symbols (A, C, G, T).
Definition Alphabet.cuh:117
static constexpr char validBytes[]
Representative valid bytes for compile-time separator checks.
Definition Alphabet.cuh:123
An alphabet that encodes non-overlapping DNA triplets as single symbols.
Definition Alphabet.cuh:150
static constexpr uint8_t separator
Separator byte between concatenated records.
Definition Alphabet.cuh:158
static constexpr uint64_t symbolCount
Number of packed triplet symbols.
Definition Alphabet.cuh:154
static constexpr uint8_t invalidSymbol
Sentinel returned by encode for invalid triplets.
Definition Alphabet.cuh:156
static constexpr char validBytes[]
Representative valid bytes for compile-time separator checks.
Definition Alphabet.cuh:160
static constexpr uint64_t symbolWidth
Input bytes per encoded symbol (one DNA triplet).
Definition Alphabet.cuh:152
constexpr __host__ __device__ static __forceinline__ uint8_t encode(const char *input)
Maps three DNA bytes to a 6-bit triplet index, or invalidSymbol.
Definition Alphabet.cuh:167
An alphabet for encoding protein sequences, consisting of the 20 standard amino acids plus common amb...
Definition Alphabet.cuh:189
static constexpr uint64_t symbolWidth
Input bytes per encoded symbol.
Definition Alphabet.cuh:191
constexpr __host__ __device__ static __forceinline__ uint8_t encode(const char *input)
Maps one amino-acid letter to a 5-bit index, or invalidSymbol.
Definition Alphabet.cuh:208
static constexpr uint8_t separator
Separator byte between concatenated records.
Definition Alphabet.cuh:197
static constexpr uint8_t invalidSymbol
Sentinel returned by encode for invalid input bytes.
Definition Alphabet.cuh:195
static constexpr char validBytes[]
Representative valid bytes for compile-time separator checks.
Definition Alphabet.cuh:199
static constexpr uint64_t symbolCount
Number of letter symbols (A–Z).
Definition Alphabet.cuh:193