From b01c739f51d9eb7c5ea60b893537d273fc7c4910 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Wed, 4 Apr 2018 12:59:38 +0200 Subject: [PATCH] fix S |S related issues in use of compressed bit parallel index --- .../query/CompressedBitParallelismPatterns.h | 19 +++++++++++++++++++ ...onlinearCompressedBitParallelismPatterns.h | 10 ++++++++++ 2 files changed, 29 insertions(+) diff --git a/alib2algo/src/arbology/query/CompressedBitParallelismPatterns.h b/alib2algo/src/arbology/query/CompressedBitParallelismPatterns.h index 66a9f6b935..fe8d6b5e5e 100644 --- a/alib2algo/src/arbology/query/CompressedBitParallelismPatterns.h +++ b/alib2algo/src/arbology/query/CompressedBitParallelismPatterns.h @@ -42,6 +42,15 @@ template < class SymbolType, class RankType > ext::set < unsigned > CompressedBitParallelismPatterns::query ( const indexes::arbology::CompressedBitParallelTreeIndex < SymbolType, RankType > & compressedBitParallelIndex, const tree::PrefixRankedPattern < SymbolType, RankType > & pattern ) { auto symbolIter = pattern.getContent ( ).begin ( ); + if ( pattern.getSubtreeWildcard ( ) == * symbolIter ) { + ext::set < unsigned > res; + + for ( size_t i = 0; i < compressedBitParallelIndex.getJumps ( ).size ( ); ++ i ) + res.insert ( i ); + + return res; + } + typename ext::map < common::ranked_symbol < SymbolType, RankType >, common::SparseBoolVector >::const_iterator symbolVectorIter = compressedBitParallelIndex.getData ( ).find ( * symbolIter ); if ( symbolVectorIter == compressedBitParallelIndex.getData ( ).end ( ) ) @@ -80,6 +89,16 @@ template < class SymbolType, class RankType > ext::set < unsigned > CompressedBitParallelismPatterns::query ( const indexes::arbology::CompressedBitParallelTreeIndex < SymbolType, RankType > & compressedBitParallelIndex, const tree::PrefixRankedBarPattern < SymbolType, RankType > & pattern ) { auto symbolIter = pattern.getContent ( ).begin ( ); + if ( pattern.getSubtreeWildcard ( ) == * symbolIter ) { + ext::set < unsigned > res; + + for ( size_t i = 0; i < compressedBitParallelIndex.getJumps ( ).size ( ) - 1; ++ i ) //last index maps to -1 + if ( ( size_t ) compressedBitParallelIndex.getJumps ( ) [ i ] > i ) + res.insert ( i ); + + return res; + } + typename ext::map < common::ranked_symbol < SymbolType, RankType >, common::SparseBoolVector >::const_iterator symbolVectorIter = compressedBitParallelIndex.getData ( ).find ( * symbolIter ); if ( symbolVectorIter == compressedBitParallelIndex.getData ( ).end ( ) ) diff --git a/alib2algo/src/arbology/query/NonlinearCompressedBitParallelismPatterns.h b/alib2algo/src/arbology/query/NonlinearCompressedBitParallelismPatterns.h index 4993f30b89..b6d10446bf 100644 --- a/alib2algo/src/arbology/query/NonlinearCompressedBitParallelismPatterns.h +++ b/alib2algo/src/arbology/query/NonlinearCompressedBitParallelismPatterns.h @@ -70,6 +70,16 @@ template < class SymbolType, class RankType > ext::set < unsigned > NonlinearCompressedBitParallelismPatterns::query ( const indexes::arbology::NonlinearCompressedBitParallelTreeIndex < SymbolType, RankType > & nonlinearCompressedBitParallelIndex, const tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern ) { auto symbolIter = pattern.getContent ( ).begin ( ); + if ( pattern.getSubtreeWildcard ( ) == * symbolIter || pattern.getNonlinearVariables ( ).count ( * symbolIter ) ) { + ext::set < unsigned > res; + + for ( size_t i = 0; i < nonlinearCompressedBitParallelIndex.getJumps ( ).size ( ) - 1; ++ i ) //last index maps to -1 + if ( ( size_t ) nonlinearCompressedBitParallelIndex.getJumps ( ) [ i ] > i ) + res.insert ( i ); + + return res; + } + typename ext::map < common::ranked_symbol < SymbolType, RankType >, common::SparseBoolVector >::const_iterator symbolVectorIter = nonlinearCompressedBitParallelIndex.getData ( ).find ( * symbolIter ); if ( symbolVectorIter == nonlinearCompressedBitParallelIndex.getData ( ).end ( ) ) -- GitLab