2026-01-11 12:55:11 +08:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include <emmintrin.h>
|
|
|
|
|
|
#include <immintrin.h>
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
|
|
|
|
#include "ksw.h"
|
|
|
|
|
|
|
2026-01-13 23:37:06 +08:00
|
|
|
|
|
2026-01-11 12:55:11 +08:00
|
|
|
|
#define AMBIG_ 4 // ambiguous base
|
|
|
|
|
|
// for 16 bit
|
|
|
|
|
|
#define DUMMY1_ 4
|
|
|
|
|
|
#define DUMMY2_ 5
|
|
|
|
|
|
#define DUMMY3 26
|
|
|
|
|
|
#define AMBR16 15
|
|
|
|
|
|
#define AMBQ16 16
|
|
|
|
|
|
// for 8-bit
|
|
|
|
|
|
#define DUMMY8 8
|
|
|
|
|
|
#define DUMMY5 5
|
|
|
|
|
|
#define AMBRQ 0xFF
|
|
|
|
|
|
#define AMBR 4
|
|
|
|
|
|
#define AMBQ 8
|
|
|
|
|
|
|
|
|
|
|
|
#define min_(x, y) ((x) > (y) ? (y) : (x))
|
|
|
|
|
|
#define max_(x, y) ((x) > (y) ? (x) : (y))
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
|
|
int score; // best score
|
|
|
|
|
|
int te, qe; // target end and query end
|
|
|
|
|
|
int score2, te2; // second best score and ending position on the target
|
|
|
|
|
|
int tb, qb; // target start and query start
|
|
|
|
|
|
} kswr_avx_t;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
|
|
int seq_len;
|
|
|
|
|
|
int ref_len;
|
|
|
|
|
|
uint8_t* H0;
|
|
|
|
|
|
uint8_t* H1;
|
|
|
|
|
|
uint8_t* Hmax;
|
|
|
|
|
|
uint8_t* F;
|
|
|
|
|
|
uint8_t* rowMax;
|
|
|
|
|
|
uint8_t* seqArr;
|
|
|
|
|
|
uint8_t* refArr;
|
2026-01-13 23:37:06 +08:00
|
|
|
|
} msw_buf_t; // inter-query算法的mate sw计算过程需要用到的缓存空间
|
2026-01-11 12:55:11 +08:00
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
|
extern "C" {
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ksw_align_avx2_u8(int qlen, uint8_t* query, int tlen, uint8_t* target, int m, const int8_t* mat, int gapo, int gape, int xtra, kswq_t** qry);
|
|
|
|
|
|
void ksw_align_avx2_i16(int qlen, uint8_t* query, int tlen, uint8_t* target, int m, const int8_t* mat, int gapo, int gape, int xtra, kswq_t** qry);
|
|
|
|
|
|
|
|
|
|
|
|
void ksw_align_avx512_u8(int8_t w_match, // match分数,正数
|
|
|
|
|
|
int8_t w_mismatch, // 错配罚分,负数
|
|
|
|
|
|
int8_t o_ins, // 开始一个insert罚分,正数
|
|
|
|
|
|
int8_t e_ins, // 延续一个insert罚分,正数
|
|
|
|
|
|
int8_t o_del, // 开始一个delete罚分,正数
|
|
|
|
|
|
int8_t e_del, // 延续一个delete罚分,正数
|
2026-01-13 23:37:06 +08:00
|
|
|
|
msw_buf_t* cache, // 计算用到的一些数据
|
2026-01-11 12:55:11 +08:00
|
|
|
|
uint8_t* seq1SoA, // ref序列,已经pack好了
|
|
|
|
|
|
uint8_t* seq2SoA, // seq序列
|
|
|
|
|
|
int16_t nrow, // 最长的行数,对应ref长度
|
|
|
|
|
|
int16_t ncol, // 最长的列数,对应seq长度
|
|
|
|
|
|
int* xtras, // 每个seq对应一个xtra
|
|
|
|
|
|
int* rlenA, // ref真实长度
|
|
|
|
|
|
kswr_avx_t* alns, // 存放结果
|
|
|
|
|
|
int phase); // 正向阶段0,反向阶段1
|
|
|
|
|
|
|
|
|
|
|
|
void ksw_align_avx512_i16(int qlen, uint8_t* query, int tlen, uint8_t* target, int m, const int8_t* mat, int gapo, int gape, int xtra, kswq_t** qry);
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|