// 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); }
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; }