Beispiel #1
0
			// encode sequence of run symbols
			void encodeSymSeq(::libmaus2::util::Histogram & symhist)
			{
				// get symbol/freq vectors
				std::vector < std::pair<uint64_t,uint64_t > > const symfreqs = symhist.getFreqSymVector();
				assert ( ! ::libmaus2::huffman::EscapeCanonicalEncoder::needEscape(symfreqs) );

				::libmaus2::huffman::CanonicalEncoder symenc(symhist.getByType<int64_t>());
				// serialise symbol encoder
				symenc.serialise(writer);

				// write symbol values
				for ( SymBitRun * t = ra; t != rc; ++t )
					symenc.encode(writer,t->sym);
			}
Beispiel #2
0
			void implicitFlush()
			{
				if ( pc != pa )
				{
					writer.flushBitStream();
					uint64_t const blockpos = writer.getPos();
					uint64_t numsyms = 0;
				
					::libmaus2::util::Histogram symhist;
					::libmaus2::util::Histogram cnthist;
					for ( rl_pair * pi = pa; pi != pc; ++pi )
					{
						symhist(pi->first);
						cnthist(pi->second);
						globalhist(pi->second);
						numsyms += pi->second;
					}
					
					if ( ! numsyms )
					{
						::libmaus2::exception::LibMausException se;
						se.getStream() << "numsyms=" << numsyms << " for pc-pa=" << pc-pa << " in RLEncoder::implicitFlush()" << std::endl;
						se.finish();
						throw se;
					}
					
					index.push_back(IndexEntry(blockpos,pc-pa,numsyms));
					
					std::vector < std::pair<uint64_t,uint64_t > > const symfreqs = symhist.getFreqSymVector();
					std::vector < std::pair<uint64_t,uint64_t > > const cntfreqs = cnthist.getFreqSymVector();
					
					assert ( ! ::libmaus2::huffman::EscapeCanonicalEncoder::needEscape(symfreqs) );

					::libmaus2::huffman::CanonicalEncoder symenc(symhist.getByType<int64_t>());
					::libmaus2::huffman::EscapeCanonicalEncoder::unique_ptr_type esccntenc;
					::libmaus2::huffman::CanonicalEncoder::unique_ptr_type cntenc;
					
					bool const cntesc = ::libmaus2::huffman::EscapeCanonicalEncoder::needEscape(cntfreqs);
					if ( cntesc )
					{
						::libmaus2::huffman::EscapeCanonicalEncoder::unique_ptr_type tesccntenc(new ::libmaus2::huffman::EscapeCanonicalEncoder(cntfreqs));
						esccntenc = UNIQUE_PTR_MOVE(tesccntenc);
					}
					else
					{
						::libmaus2::huffman::CanonicalEncoder::unique_ptr_type tcntenc(new ::libmaus2::huffman::CanonicalEncoder(cnthist.getByType<int64_t>()));
						cntenc = UNIQUE_PTR_MOVE(tcntenc);
					}

					// std::cerr << "Writing block of size " << (pc-pa) << std::endl;
					
					writer.writeElias2(pc-pa);
					writer.writeBit(cntesc);
					
					symenc.serialise(writer);
					if ( esccntenc )
						esccntenc->serialise(writer);
					else
						cntenc->serialise(writer);
					
					writer.flushBitStream();
					
					for ( rl_pair * pi = pa; pi != pc; ++pi )
						symenc.encode(writer,pi->first);
						
					writer.flushBitStream();	
					
					if ( cntesc )
						for ( rl_pair * pi = pa; pi != pc; ++pi )
							esccntenc->encode(writer,pi->second);
					else
						for ( rl_pair * pi = pa; pi != pc; ++pi )
							cntenc->encode(writer,pi->second);

					writer.flushBitStream();
				}
				
				pc = pa;
			}