Skip to content

Commit f3007ba

Browse files
committed
Add Kmer Color Gamut serialization
1 parent 3b3bfb0 commit f3007ba

4 files changed

Lines changed: 101 additions & 8 deletions

File tree

lib/genesis/sequence/kmer/color_gamut.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ class KmerColorGamut
213213
return lookup_;
214214
}
215215

216-
utils::Matrix<size_t> const& get_gamut() const
216+
utils::Matrix<size_t> const& get_gamut_matrix() const
217217
{
218218
return gamut_;
219219
}

lib/genesis/sequence/kmer/color_gamut_functions.cpp

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "genesis/taxonomy/functions/taxonomy.hpp"
3434
#include "genesis/taxonomy/taxon.hpp"
3535
#include "genesis/taxonomy/taxonomy.hpp"
36+
#include "genesis/utils/containers/matrix/operators.hpp"
3637
#include "genesis/utils/core/algorithm.hpp"
3738
#include "genesis/utils/io/deserializer.hpp"
3839
#include "genesis/utils/io/serializer.hpp"
@@ -482,7 +483,7 @@ std::string print_kmer_color_lookup( KmerColorGamut const& gamut )
482483

483484
std::string print_kmer_color_gamut( KmerColorGamut const& gamut )
484485
{
485-
auto const gamut_matrix = gamut.get_gamut();
486+
auto const gamut_matrix = gamut.get_gamut_matrix();
486487
if( gamut_matrix.empty() ) {
487488
return "";
488489
}
@@ -517,7 +518,7 @@ std::string print_kmer_color_gamut_summary( KmerColorGamut const& gamut )
517518
assert( gamut.get_color_list().size() == gamut.get_color_lookup().size() );
518519

519520
// Report how many of the gamut are real and how many are imaginar numbers
520-
auto const& gamut_matrix = gamut.get_gamut();
521+
auto const& gamut_matrix = gamut.get_gamut_matrix();
521522
auto const& stats = gamut.get_gamut_statistics();
522523
auto const gamut_size = gamut_matrix.rows() * gamut_matrix.cols();
523524
auto const gamut_empty = gamut_size - ( stats.real_color_count + stats.imag_color_count);
@@ -558,6 +559,56 @@ std::string print_kmer_color_gamut_summary( KmerColorGamut const& gamut )
558559
return ss.str();
559560
}
560561

562+
// =================================================================================================
563+
// Serialization
564+
// =================================================================================================
565+
566+
void serialize_kmer_color_gamut_colors(
567+
KmerColorGamut const& gamut,
568+
std::shared_ptr<utils::BaseOutputTarget> output_target
569+
) {
570+
// We need to iterate through the color vector manually here,
571+
// as the Bitvectors are wrapped in a struct for future compatibility.
572+
auto ser = utils::Serializer( output_target );
573+
auto const& color_list = gamut.get_color_list();
574+
ser << color_list.size();
575+
for( auto const& color : color_list ) {
576+
ser << color.elements;
577+
}
578+
}
579+
580+
void serialize_kmer_color_gamut_matrix(
581+
KmerColorGamut const& gamut,
582+
std::shared_ptr<utils::BaseOutputTarget> output_target
583+
) {
584+
// Functionality for std::vector and Matrix is already
585+
// implemented in the respective classes and functions.
586+
auto ser = utils::Serializer( output_target );
587+
ser << gamut.get_gamut_matrix();
588+
}
589+
590+
std::vector<utils::Bitvector> deserialize_kmer_color_gamut_colors(
591+
std::shared_ptr<utils::BaseInputSource> input_source
592+
) {
593+
// Functionality for std::vector and Bitvector is already
594+
// implemented in the respective classes and functions.
595+
std::vector<utils::Bitvector> result;
596+
auto deser = utils::Deserializer( input_source );
597+
deser >> result;
598+
return result;
599+
}
600+
601+
utils::Matrix<size_t> deserialize_kmer_color_gamut_matrix(
602+
std::shared_ptr<utils::BaseInputSource> input_source
603+
) {
604+
// Functionality for std::vector and Matrix is already
605+
// implemented in the respective classes and functions.
606+
utils::Matrix<size_t> result;
607+
auto deser = utils::Deserializer( input_source );
608+
deser >> result;
609+
return result;
610+
}
611+
561612
} // namespace sequence
562613
} // namespace genesis
563614

lib/genesis/sequence/kmer/color_gamut_functions.hpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@
3333

3434
#include "genesis/sequence/kmer/color_gamut.hpp"
3535
#include "genesis/taxonomy/taxonomy.hpp"
36+
#include "genesis/utils/containers/matrix.hpp"
3637
#include "genesis/utils/io/input_source.hpp"
38+
#include "genesis/utils/io/input_source.hpp"
39+
#include "genesis/utils/io/output_target.hpp"
3740
#include "genesis/utils/io/output_target.hpp"
3841
#include "genesis/utils/math/bitvector.hpp"
3942
#include "genesis/utils/math/bitvector/functions.hpp"
@@ -138,6 +141,24 @@ std::string print_kmer_color_lookup( KmerColorGamut const& gamut );
138141
std::string print_kmer_color_gamut( KmerColorGamut const& gamut );
139142
std::string print_kmer_color_gamut_summary( KmerColorGamut const& gamut );
140143

144+
void serialize_kmer_color_gamut_colors(
145+
KmerColorGamut const& gamut,
146+
std::shared_ptr<utils::BaseOutputTarget> output_target
147+
);
148+
149+
void serialize_kmer_color_gamut_matrix(
150+
KmerColorGamut const& gamut,
151+
std::shared_ptr<utils::BaseOutputTarget> output_target
152+
);
153+
154+
std::vector<utils::Bitvector> deserialize_kmer_color_gamut_colors(
155+
std::shared_ptr<utils::BaseInputSource> input_source
156+
);
157+
158+
utils::Matrix<size_t> deserialize_kmer_color_gamut_matrix(
159+
std::shared_ptr<utils::BaseInputSource> input_source
160+
);
161+
141162
} // namespace sequence
142163
} // namespace genesis
143164

test/src/sequence/kmer_color_gamut.cpp

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151

5252
#include <algorithm>
5353
#include <atomic>
54+
#include <cstdio>
5455
#include <future>
5556
#include <iomanip>
5657
#include <ios>
@@ -127,6 +128,7 @@ TEST( KmerColorGamut, Basics )
127128

128129
TEST( KmerColorGamut, Example )
129130
{
131+
NEEDS_TEST_DATA;
130132
auto const p = 10;
131133
auto const r = 60;
132134

@@ -252,8 +254,8 @@ TEST( KmerColorGamut, Example )
252254

253255
// We added 12 imaginary colors now, and have switched to gamut now.
254256
EXPECT_EQ( initial_gamut_size + 5 * 8, gamut.get_color_list().size() );
255-
EXPECT_EQ( r, gamut.get_gamut().rows() );
256-
EXPECT_EQ( p, gamut.get_gamut().cols() );
257+
EXPECT_EQ( r, gamut.get_gamut_matrix().rows() );
258+
EXPECT_EQ( p, gamut.get_gamut_matrix().cols() );
257259
EXPECT_EQ( 0, gamut.get_gamut_statistics().real_color_count );
258260
EXPECT_EQ( 12, gamut.get_gamut_statistics().imag_color_count );
259261

@@ -263,6 +265,25 @@ TEST( KmerColorGamut, Example )
263265
// LOG_DBG << print_kmer_color_lookup( gamut );
264266
// LOG_DBG << print_kmer_color_gamut( gamut );
265267
// LOG_DBG << print_kmer_color_gamut_summary( gamut );
268+
269+
// Test the serialization
270+
auto const colors_file = environment->data_dir + "sequence/gamut_example_colors.bin";
271+
auto const matrix_file = environment->data_dir + "sequence/gamut_example_matrix.bin";
272+
serialize_kmer_color_gamut_colors( gamut, to_file( colors_file ));
273+
serialize_kmer_color_gamut_matrix( gamut, to_file( matrix_file ));
274+
auto const deser_colors = deserialize_kmer_color_gamut_colors( from_file( colors_file ));
275+
auto const deser_matrix = deserialize_kmer_color_gamut_matrix( from_file( matrix_file ));
276+
EXPECT_EQ( 0, std::remove( colors_file.c_str() ));
277+
EXPECT_EQ( 0, std::remove( matrix_file.c_str() ));
278+
EXPECT_EQ( initial_gamut_size + 5 * 8, deser_colors.size() );
279+
EXPECT_EQ( gamut.get_color_list().size(), deser_colors.size() );
280+
for( size_t i = 0; i < deser_colors.size(); ++i ) {
281+
EXPECT_EQ( p, deser_colors[i].size() );
282+
EXPECT_EQ( gamut.get_color_at(i).elements, deser_colors[i] );
283+
}
284+
EXPECT_EQ( r, deser_matrix.rows() );
285+
EXPECT_EQ( p, deser_matrix.cols() );
286+
EXPECT_EQ( gamut.get_gamut_matrix(), deser_matrix );
266287
}
267288

268289
// -------------------------------------------------------------------------
@@ -319,10 +340,10 @@ TEST( KmerColorGamut, Random )
319340
// We have run the loop enough that we can be virtually sure to have requested
320341
// every color in the 8 bit range that we are using here, so the gamut should be full.
321342
EXPECT_EQ( 16, gamut.get_color_list().size() );
322-
EXPECT_EQ( 16, gamut.get_gamut().rows() );
323-
EXPECT_EQ( 8, gamut.get_gamut().cols() );
343+
EXPECT_EQ( 16, gamut.get_gamut_matrix().rows() );
344+
EXPECT_EQ( 8, gamut.get_gamut_matrix().cols() );
324345
auto img_idx_counts = std::vector<size_t>( 16, 0 );
325-
for( auto c : gamut.get_gamut() ) {
346+
for( auto c : gamut.get_gamut_matrix() ) {
326347
++img_idx_counts[c];
327348
}
328349

0 commit comments

Comments
 (0)