logo资料库

DNA无损压缩算法研究代码文档(含代码).docx

第1页 / 共52页
第2页 / 共52页
第3页 / 共52页
第4页 / 共52页
第5页 / 共52页
第6页 / 共52页
第7页 / 共52页
第8页 / 共52页
资料共52页,剩余部分请下载后查看
说明文档:readme
Makefile
主函数:main.cpp
区间编码1:clr.cdr
区间编码2:clr256.cdr
行长度模型:simple model.h
序列模型1:base model.h
检验模型:sfh.h
基于 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
分享到:
收藏