基于 DNA 序列无损压缩算法的分析
目录
说明文档:readme ............................................................ 1
Makefile .................................................................... 3
主函数:main.cpp ............................................................ 5
区间编码 1:clr.cdr ........................................................ 36
区间编码 2:clr256.cdr ..................................................... 38
行长度模型:simple model.h ................................................. 42
序列模型 1:base model.h ................................................... 46
检验模型:sfh.h ............................................................ 50
基于 DNA 序列无损压缩算法的分析
说明文档:readme
介绍
=============
程序使用于 DNA 序列无损压缩和解压缩,只能针对含有"ATCG"(或者"0123")四种符号的
DNA 序列。通过人类基因组序列测序无误,
能够正常使用。针对基因组中出现的其他情况符号暂不考虑。
使用
=====
首先选择直接在编译器里打开程序,注意保留 makefile,因为 makefile 里面提供了程序
执行的环境和相关编译链接的命令,关系着整个工程的编译规则。在运行程序前要先
“make”,使得生成对应的中间目标文件。
程序只能对特定的文件进行压缩,仅支持当前程序压缩后的文件解压。通过命令行执行以
下的命令:
make
压缩:
./main [选项] [输入文件路径] [输出文件路径]
解压缩:
./main [选项] [输入文件路径] [输出文件路径]
选项
=======
压缩选项说明:
-s<数字>
默认的 s 是 3,可以选择的 s 的范围在 0~9,一般不超过 6。s 通过影响上下文滑动窗
口的阶数影响上下文结构中的阶数。 N=7+s;
1
基于 DNA 序列无损压缩算法的分析
-b
对应的 s 默认是 3,不一样的是在压缩过程中,在字典的生成时会通过生成对应的饿
反向互补链字典,从而增大该字典的频率,提高预测精度。但是也耗费内存。
-e
对应的 s 默认是 3,不一样的是在压缩的过程中,-e 选项用于选择使用 8 位计数器或
16 位计数器模式。
解压选项说明:
对于解压,常用的是-d。压缩参数存储在输出的文件中,所以解压缩程序知道什么选项以
便在解压缩的过程中重读压缩的过程。(顺着压缩和解压,原理一样)
注意事项
=======
压缩文件格式:由"ATCG"四种字符组成的文件内容。
算法
==========
算术编码:
算术编码是一种熵编码方法。熵编码方法是基于一系列的编码器 coders6c2。该系列
的编码器是 Eugene Shelwien 写的,但是看起来是源于 Dmitry Subbotin 的编码器 PPMd、
这个模型的代码的 API 是复制 Eugene Shelwien 的 coders6c2,但是他们的功能已经完全
重写,以更好地适应这个数据中的平稳概率模型。
本算法实在 fqzComp 4.0 的基础上发展而来的,虽然主要的解析代码从版本 2 开始就
已经完全重写。每种类型的数据都使用自己的模型进行编码。通过概率模型来记录文本内
容,然后对编码区间进行压缩。
上下文结构:
这意味着编码名称的上下文是与前面名称中相同位置的字符,还有专门的前缀和后缀
匹配,加快编码和空间减少。这个上下文结构不是简单的上下文树,而是可以形成回路的
2
基于 DNA 序列无损压缩算法的分析
网络结构。上下文结构的作用是通过概率对字符的出现进行预测。不同阶的上下文在预测
中的精度也不同,阶数越高预测的精度越高,但是所耗费的时间和内存越大。
本程序是有以上两个大的算法思想要指导的,内部会根据数据类型进行模型的细分。
使用 simple model 来对换行符进行处理,而 base model 则只需要对序列的字符进行处理。
因为只针对"ATCG"四种字符,所以只用两位的编码就可以对四个字符进行编码,大大减
少了编码内存的耗用。但是注意选择-s 选项时候不要超过-s9,没有足够的内存来应付,实
际上超过-s6 就有可能出现问题。
文件格式
===========
针对特定的文件格式进行压缩和解压缩
压缩输入文件:(.*)
ACTCGATCGTAGTCGATAGGGTCGAGTAG
ACTTTGATAGTCAAAGTCGTAGTCGAAGT
压缩输出文件/解压缩输出文件:(.*)
Makefile
VERS=4.6
all: main
CC = g++
#CFLAGS = -g -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
CFLAGS = -O2 -g -fomit-frame-pointer -fstrict-aliasing -ffast-math -DNDEBUG
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wall -msse2
#CC=icpc
#CFLAGS = -O3 -g -fomit-frame-pointer -fstrict-aliasing -fast -DNDEBUG
-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wall -m64 -msse2
3
基于 DNA 序列无损压缩算法的分析
CFLAGS += -DPTHREADS
LIBS += -lpthread
#CFLAGS += -DORIG_MODEL
.c.o:
$(CC) $(CFLAGS) -c $<
main: main.o sfh.o
$(CC) $(CFLAGS) -o $@ main.o sfh.o $(LIBS)
clean:
-rm *.o main
dist:
-rm -rf fqzCCC-$(VERS)
mkdir fqzCCC-$(VERS)
cp *.[ch] *.cdr fqzCCC-$(VERS)
cp README Makefile fqzCCC-$(VERS)
tar cvfz fqzCCC-$(VERS).tar.gz fqzCCC-$(VERS)
4
基于 DNA 序列无损压缩算法的分析
主函数:main.cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define __STDC_FORMAT_MACROS
#include
#include
#include
#include
#include
#include
#include "sfh.h"
#define MAJOR_VERS 4
#define FORMAT_VERS 4
#define MINOR_VERS 6
#define MAX_SOLID 1024
#ifdef PTHREADS
#
#
#else
#
#endif
#define TIMING
include
include
define sched_getcpu() -1
5
基于 DNA 序列无损压缩算法的分析
#ifdef __SSE__
//SSE提供预取等操作指令,加快速度
include
define _mm_prefetch(a, b)
#
#else
#
#endif
#define ABS(a)
((a)>0?(a):-(a))
//求绝对值
#define MIN(a, b) ((a)<(b)?(a):(b))
//求最小值
#define MAX(a, b) ((a)>(b)?(a):(b))
//求最大值
// Range Coder: 从coders6c2.zip 使用Eugene Shelwien的代码。
#include "clr.cdr"
//存储Rangcoder 的位置。
/*
*0 阶模型,优化各种大小的字符。
*0 阶模型的代码是来源于Dmitry Shkarin的代码,调整了一下使得RangeCoder的参数
* 作为调整字母大小的模板。
*Simple模型是在Dmitry Shkarin's original ORDER_0_CODER 模型的基础上改进的,相
*同的API 实现的模型。这是坚持sequencesqueeze准入规则的目的,但是这个模型实现
*起来慢5%左右。这不同于没有逃逸码(转义符号),而是使用不同的频率更新方法。
*Base coder模型专门处理符号0,1,2,3(对应是ATCG)。
* 所有的模型都用于实现一个大的上下文,并且实现一个高阶模型。
*/
#ifdef ORIG_MODEL
#
#
#else
#
#endif
define ORDER_0_CODER SIMPLE_MODEL
include "order0_coder.h"
include "simple_model.h" // SIMPLE_MODEL
6
基于 DNA 序列无损压缩算法的分析
#include "base_model.h"
//#include "base_model2.h"
#define PREHASHED
// BASE_MODEL
// BASE_MODEL
/*
*这部分会使用两个序列模型,一个是基于7-mer 的,一个是根据-s参数确定的。根据参
数确定
* 的模型的编码使用比7-mer 更小,并且更新全部的kmer的版本。
*当大型模型学习时会改善流中的早期模型,但是随着大模型的填满,一段时间后不会
产生影响。
*速度上慢了大概15%,但是内存上节省了1%,这取决于输入文件的大小,只适合做大
规模的压缩。
*/
#define BLK_SIZE 10000000
/*
* 配置参数
*/
typedef struct {
int slevel;
int both_strands;
int extreme_seq;
int multi_seq_model;
int do_threads;
int SOLiD;
} fqz_params;
struct fqz {
public:
fqz();
//s参数
//-e 时候使用16 为的序列计数器
7