123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421 |
- /*
- * nvbio
- * Copyright (c) 2011-2014, NVIDIA CORPORATION. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the NVIDIA CORPORATION nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- // packedstream_test.cpp
- //
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <algorithm>
- #include <nvbio/basic/types.h>
- #include <nvbio/basic/cached_iterator.h>
- #include <nvbio/basic/packedstream.h>
- #include <sais.h>
- using namespace nvbio;
- static const uint32 LEN = 100;
- template <typename CompStream>
- bool check_stream(const uint8* uncomp_stream, const CompStream& comp_stream)
- {
- for (uint32 i = 0; i < LEN; ++i)
- {
- if (uncomp_stream[i] != comp_stream[i])
- {
- fprintf(stderr, " error at %u : found %u, expected %u\n", i, uint32( comp_stream[i] ), uint32( uncomp_stream[i] ));
- return false;
- }
- }
- return true;
- }
- template <typename CompStream>
- bool check_forward_stream(const uint8* uncomp_stream, CompStream comp_stream)
- {
- for (uint32 i = 0; i < LEN; ++i)
- {
- if (uncomp_stream[i] != *comp_stream)
- {
- fprintf(stderr, " forward iterator error at %u : found %u, expected %u\n", i, uint32( *comp_stream ), uint32( uncomp_stream[i] ));
- return false;
- }
- ++comp_stream;
- }
- return true;
- }
- int packedstream_test()
- {
- {
- uint32 base_stream[LEN] = { 0u };
- uint8 uncomp_stream[2*LEN] = { 0u };
- typedef PackedStream<uint32*,uint8,2,true> Stream;
- Stream stream( base_stream );
- fprintf(stderr, "2-bit stream test... started\n");
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 0, uint8(3) );
- uncomp_stream[0] = uint8(3);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 2, uint8(2) );
- uncomp_stream[2] = uint8(2);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 16, uint8(3) );
- uncomp_stream[16] = uint8(3);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 17, uint8(1) );
- uncomp_stream[17] = uint8(1);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- // randomized test
- for (uint32 i = 0; i < 1000; ++i)
- {
- const uint32 j = rand() % LEN;
- const uint32 s = rand() % 4;
- stream[j] = s;
- uncomp_stream[j] = s;
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- }
- // randomized test
- Stream::iterator it = stream.begin();
- for (uint32 i = 0; i < 1000; ++i)
- {
- const uint32 j = rand() % LEN;
- const uint32 s = rand() % 4;
- it[j] = s;
- uncomp_stream[j] = s;
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- }
- std::swap( *uncomp_stream, *(uncomp_stream+1) );
- std::swap( *stream.begin(), *(stream.begin()+1) );
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- std::sort( uncomp_stream, uncomp_stream + LEN );
- std::sort( stream.begin(), stream.begin() + LEN );
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- typedef PackedStream<const_cached_iterator<uint32*>,uint8,2,true> CachedPackedStream;
- const_cached_iterator<uint32*> cached_base_stream( base_stream );
- CachedPackedStream cached_stream( cached_base_stream );
- for (uint32 i = 0; i < LEN; ++i)
- {
- if (uncomp_stream[i] != cached_stream[i])
- {
- fprintf(stderr, " error at %u : found %u, expected %u\n", i, uint32( cached_stream[i] ), uint32( uncomp_stream[i] ));
- return false;
- }
- }
- // test the SAIS module
- stream[0] = 1; // B
- stream[1] = 0; // A
- stream[2] = 2; // N
- stream[3] = 0; // A
- stream[4] = 2; // N
- stream[5] = 0; // A
- int32 SA[6];
- saisxx( stream.begin(), SA, 6, 4 );
- if (SA[0] != 5 ||
- SA[1] != 3 ||
- SA[2] != 1 ||
- SA[3] != 0 ||
- SA[4] != 4 ||
- SA[5] != 2)
- {
- fprintf(stderr, " wrong suffix tree for \"BANANA\"\n");
- for (uint32 i = 0; i < 6; ++i)
- fprintf(stderr, "%u : %u\n", i, SA[i]);
- exit(1);
- }
- uint32 base_bwt_stream[LEN] = { 0u };
- Stream bwt_stream( base_bwt_stream );
- saisxx_bwt( stream.begin(), bwt_stream.begin(), SA, 6, 4 );
- char bwt[7];
- for (uint32 i = 0; i < 6; ++i)
- {
- const uint8 c = bwt_stream[i];
- bwt[i] =
- c == 0 ? 'A' :
- c == 1 ? 'B' :
- c == 2 ? 'N' :
- 'T';
- }
- bwt[6] = '\0';
- if (strcmp( bwt, "ANNBAA" ) != 0)
- {
- fprintf(stderr, " wrong bwt: expected \"ANNBAA\", got \"%s\"\n", bwt);
- exit(1);
- }
- fprintf(stderr, "2-bit stream test... done\n");
- }
- {
- uint32 base_stream[LEN] = { 0u };
- uint8 uncomp_stream[4*LEN] = { 0u };
- fprintf(stderr, "4-bit uint32-stream test... started\n");
- PackedStream<uint32*,uint8,4,true> stream( base_stream );
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 9, uint8(5) );
- uncomp_stream[9] = uint8(5);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 10, uint8(15) );
- uncomp_stream[10] = uint8(15);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- // randomized test
- for (uint32 i = 0; i < 1000; ++i)
- {
- const uint32 j = rand() % LEN;
- const uint32 s = rand() % 16;
- stream[j] = s;
- uncomp_stream[j] = s;
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- }
- std::sort( uncomp_stream, uncomp_stream + LEN );
- std::sort( stream.begin(), stream.begin() + LEN );
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- ForwardPackedStream<const uint32*,uint8,4,true> forward_stream( stream );
- if (check_forward_stream( uncomp_stream, forward_stream ) == false)
- exit(1);
- const_cached_iterator<const uint32*> cached_base_stream( base_stream );
- PackedStream<const_cached_iterator<const uint32*>,uint8,4,true> cached_stream( cached_base_stream );
- if (check_stream( uncomp_stream, cached_stream ) == false)
- exit(1);
- fprintf(stderr, "4-bit uint32-stream test... done\n");
- }
- {
- uint4 base_stream[LEN] = { { 0u } };
- uint8 uncomp_stream[4*LEN] = { 0u };
- fprintf(stderr, "4-bit uint4-stream test... started\n");
- PackedStream<uint4*,uint8,4,true> stream( base_stream );
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 9, uint8(5) );
- uncomp_stream[9] = uint8(5);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 10, uint8(15) );
- uncomp_stream[10] = uint8(15);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- // randomized test
- for (uint32 i = 0; i < 1000; ++i)
- {
- const uint32 j = rand() % LEN;
- const uint32 s = rand() % 16;
- stream[j] = s;
- uncomp_stream[j] = s;
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- }
- std::sort( uncomp_stream, uncomp_stream + LEN );
- std::sort( stream.begin(), stream.begin() + LEN );
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- ForwardPackedStream<const uint4*,uint8,4,true> forward_stream( stream );
- if (check_forward_stream( uncomp_stream, forward_stream ) == false)
- exit(1);
- const_cached_iterator<const uint4*> cached_base_stream( base_stream );
- PackedStream<const_cached_iterator<const uint4*>,uint8,4,true> cached_stream( cached_base_stream );
- if (check_stream( uncomp_stream, cached_stream ) == false)
- exit(1);
- fprintf(stderr, "4-bit uint4-stream test... done\n");
- }
- {
- uint32 base_stream[LEN] = { 0u };
- uint8 uncomp_stream[3*LEN] = { 0u };
- fprintf(stderr, "3-bit uint32-stream test... started\n");
- PackedStream<uint32*,uint8,3,true> stream( base_stream );
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 9, uint8(5) );
- uncomp_stream[9] = uint8(5);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 10, uint8(7) );
- uncomp_stream[10] = uint8(7);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- // randomized test
- for (uint32 i = 0; i < 1000; ++i)
- {
- const uint32 j = rand() % LEN;
- const uint32 s = rand() % 8;
- stream[j] = s;
- uncomp_stream[j] = s;
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- }
- std::sort( uncomp_stream, uncomp_stream + LEN );
- std::sort( stream.begin(), stream.begin() + LEN );
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- fprintf(stderr, "3-bit uint32-stream test... done\n");
- }
- {
- uint8 base_stream[LEN] = { 0u };
- uint8 uncomp_stream[2*LEN] = { 0u };
- fprintf(stderr, "2-bit byte-stream test... started\n");
- PackedStream<uint8*,uint8,2,true> stream( base_stream );
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 9, uint8(3) );
- uncomp_stream[9] = uint8(3);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 10, uint8(2) );
- uncomp_stream[10] = uint8(2);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- // randomized test
- for (uint32 i = 0; i < 1000; ++i)
- {
- const uint32 j = rand() % LEN;
- const uint32 s = rand() % 4;
- stream[j] = s;
- uncomp_stream[j] = s;
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- }
- std::sort( uncomp_stream, uncomp_stream + LEN );
- std::sort( stream.begin(), stream.begin() + LEN );
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- ForwardPackedStream<const uint8*,uint8,2,true> forward_stream( stream );
- if (check_forward_stream( uncomp_stream, forward_stream ) == false)
- exit(1);
- fprintf(stderr, "2-bit byte-stream test... done\n");
- }
- {
- uint4 base_stream[LEN] = { { 0u } };
- uint8 uncomp_stream[4*LEN] = { 0u };
- fprintf(stderr, "2-bit uint4-stream test... started\n");
- PackedStream<uint4*,uint8,2,true> stream( base_stream );
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 9, uint8(3) );
- uncomp_stream[9] = uint8(3);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- stream.set( 10, uint8(2) );
- uncomp_stream[10] = uint8(2);
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- // randomized test
- for (uint32 i = 0; i < 1000; ++i)
- {
- const uint32 j = rand() % LEN;
- const uint32 s = rand() % 4;
- stream[j] = s;
- uncomp_stream[j] = s;
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- }
- std::sort( uncomp_stream, uncomp_stream + LEN );
- std::sort( stream.begin(), stream.begin() + LEN );
- if (check_stream( uncomp_stream, stream ) == false)
- exit(1);
- fprintf(stderr, "2-bit uint4-stream test... done\n");
- }
- return 0;
- }
|