csa_wt<t_wt, t_dens, t_inv_dens, t_sa_sample_strat, t_isa, t_alphabet_strat>::csa_wt(cache_config& config) { if (!cache_file_exists(key_trait<alphabet_type::int_width>::KEY_BWT, config)) { return; } { auto event = memory_monitor::event("construct csa-alpbabet"); int_vector_buffer<alphabet_type::int_width> bwt_buf(cache_file_name(key_trait<alphabet_type::int_width>::KEY_BWT,config)); size_type n = bwt_buf.size(); alphabet_type tmp_alphabet(bwt_buf, n); m_alphabet.swap(tmp_alphabet); } { auto event = memory_monitor::event("construct wavelet tree"); int_vector_buffer<alphabet_type::int_width> bwt_buf(cache_file_name(key_trait<alphabet_type::int_width>::KEY_BWT,config)); size_type n = bwt_buf.size(); wavelet_tree_type tmp_wt(bwt_buf, n); m_wavelet_tree.swap(tmp_wt); } { auto event = memory_monitor::event("sample SA"); sa_sample_type tmp_sa_sample(config); m_sa_sample.swap(tmp_sa_sample); } { auto event = memory_monitor::event("sample ISA"); isa_sample_type isa_s(config, &m_sa_sample); util::swap_support(m_isa_sample, isa_s, &m_sa_sample, &m_sa_sample); } }
csa_sada<t_enc_vec, t_dens, t_inv_dens, t_sa_sample_strat, t_isa, t_alphabet_strat>::csa_sada(cache_config& config) { create_buffer(); if (!cache_file_exists(key_trait<alphabet_type::int_width>::KEY_BWT, config)) { return; } int_vector_buffer<alphabet_type::int_width> bwt_buf(cache_file_name(key_trait<alphabet_type::int_width>::KEY_BWT,config)); size_type n = bwt_buf.size(); { auto event = memory_monitor::event("construct csa-alpbabet"); alphabet_type tmp_alphabet(bwt_buf, n); m_alphabet.swap(tmp_alphabet); } int_vector<> cnt_chr(sigma, 0, bits::hi(n)+1); for (typename alphabet_type::sigma_type i=0; i < sigma; ++i) { cnt_chr[i] = C[i]; } // calculate psi { auto event = memory_monitor::event("construct PSI"); // TODO: move PSI construct into construct_PSI.hpp int_vector<> psi(n, 0, bits::hi(n)+1); for (size_type i=0; i < n; ++i) { psi[ cnt_chr[ char2comp[bwt_buf[i]] ]++ ] = i; } std::string psi_file = cache_file_name(conf::KEY_PSI, config); if (!store_to_cache(psi, conf::KEY_PSI, config)) { return; } } { auto event = memory_monitor::event("encode PSI"); int_vector_buffer<> psi_buf(cache_file_name(conf::KEY_PSI, config)); t_enc_vec tmp_psi(psi_buf); m_psi.swap(tmp_psi); } { auto event = memory_monitor::event("sample SA"); sa_sample_type tmp_sa_sample(config); m_sa_sample.swap(tmp_sa_sample); } { auto event = memory_monitor::event("sample ISA"); isa_sample_type isa_s(config, &m_sa_sample); util::swap_support(m_isa_sample, isa_s, &m_sa_sample, (const sa_sample_type*)nullptr); } }
//bool construct_bwt(tMSS& file_map, const std::string& dir, const std::string& id) { void construct_bwt(int_vector<8>& bwt, const cache_config& config){ typedef int_vector<>::size_type size_type; tMSS::const_iterator key; key = config.file_map.find(constants::KEY_BWT); if ( config.file_map.end() == key) { // if bwt is not already registered in file_map std::string bwt_tmp_file_name = config.dir+"/tmp_bwt_"+util::to_string(util::get_pid())+"_"+util::to_string(util::get_id()); write_R_output("csa", "construct BWT", "begin", 1, 0); const size_type buffer_size = 1000000; int_vector<8> text; util::load_from_file(text, config.file_map.find(constants::KEY_TEXT)->second.c_str() ); size_type n = text.size(); int_vector_file_buffer<> sa_buf(config.file_map.find(constants::KEY_SA)->second.c_str(), buffer_size); std::ofstream bwt_out_buf(bwt_tmp_file_name.c_str(), std::ios::binary | std::ios::trunc | std::ios::out); // open out file stream int_vector<8> bwt_buf(buffer_size); size_type bit_size = n*8; bwt_out_buf.write((char*) &(bit_size), sizeof(int_vector_size_type)); // write size size_type wb = 0; // written bytes size_type to_add[2] = {-1,n-1}; for (size_type i=0, r_sum=0, r = 0; r_sum < n;) { for (; i<r_sum+r; ++i) { bwt_buf[i-r_sum] = text[ sa_buf[i-r_sum]+to_add[sa_buf[i-r_sum]==0] ]; } if (r > 0) { bwt_out_buf.write((const char*)bwt_buf.data(), r); wb += r; } r_sum += r; r = sa_buf.load_next_block(); } if (wb%8) { bwt_out_buf.write("\0\0\0\0\0\0\0\0", 8-wb%8); } bwt_out_buf.close(); util::clear(text); util::load_from_file(bwt, bwt_tmp_file_name.c_str()); // load bwt in memory std::remove(bwt_tmp_file_name.c_str()); // remove temporary file write_R_output("csa", "construct BWT", "end", 1, 0); }else{ util::load_from_file(bwt, key->second.c_str()); // load bwt in memory } }