Skip to content
Snippets Groups Projects
Commit 7b7c469a authored by Jan Trávníček's avatar Jan Trávníček
Browse files

algo: test and fix knuth morris pratt on nonlinear tree patterns

parent 26898dda
No related branches found
No related tags found
1 merge request!205Merge jt
......@@ -27,6 +27,26 @@ bool symbolCompare ( const tree::PrefixRankedExtendedPattern < SymbolType > & pa
const auto& symbol2 = pattern.getContent ( )[ j ];
return symbol1 == symbol2 || ( symbol1.getRank ( ) == symbol2.getRank ( ) && ( pattern.getNodeWildcards ( ).contains ( symbol1 ) || pattern.getNodeWildcards ( ).contains ( symbol2 ) ) );
}
template < class PrefixRankedPatternType >
bool variableCompare ( const PrefixRankedPatternType & pattern, size_t i, size_t j ) {
return pattern.getContent ( )[ i ] == pattern.getSubtreeWildcard ( ) || pattern.getContent ( )[ j ] == pattern.getSubtreeWildcard ( );
}
template < class SymbolType >
bool variableCompare ( const tree::PrefixRankedNonlinearPattern < SymbolType > & pattern, size_t i, size_t j ) {
const auto& symbol1 = pattern.getContent ( )[ i ];
const auto& symbol2 = pattern.getContent ( )[ j ];
return symbol1 == pattern.getSubtreeWildcard ( ) || symbol2 == pattern.getSubtreeWildcard ( ) || pattern.getNonlinearVariables ( ).contains ( symbol1 ) || pattern.getNonlinearVariables ( ).contains ( symbol2 );
}
template < class SymbolType >
bool variableCompare ( const tree::PrefixRankedBarNonlinearPattern < SymbolType > & pattern, size_t i, size_t j ) {
const auto& symbol1 = pattern.getContent ( )[ i ];
const auto& symbol2 = pattern.getContent ( )[ j ];
return symbol1 == pattern.getSubtreeWildcard ( ) || symbol2 == pattern.getSubtreeWildcard ( ) || pattern.getNonlinearVariables ( ).contains ( symbol1 ) || pattern.getNonlinearVariables ( ).contains ( symbol2 );
}
}
 
namespace tree::properties {
......@@ -65,7 +85,7 @@ ext::vector < size_t > BorderArray::construct ( const PrefixRankedPatternType &
maxs [ j ] = std::max ( maxs [ j ], j + 1 - ofs );
i++;
j++;
} else if ( pattern.getContent ( )[ i ] == pattern.getSubtreeWildcard ( ) || pattern.getContent ( )[ j ] == pattern.getSubtreeWildcard ( ) ) {
} else if ( variableCompare ( pattern, i, j ) ) {
for ( int k = static_cast < int > ( j ); k < subtreeJumpTable [ j ] ; k++ )
maxs [ k ] = std::max ( maxs [ k ], k + 1 - ofs );
 
......
......@@ -156,6 +156,10 @@ TEST_CASE ( "Arbology tests | nonlinear pattern", "[integration]" ) {
"arbology::indexing::NonlinearFullAndLinearIndexConstruction (PrefixRankedBarTree)$subject | arbology::query::NonlinearFullAndLinearIndexPatterns - (PrefixRankedBarNonlinearPattern) $pattern", 1000 ),
std::make_tuple ( "Exact Pattern Match (NonlinearPattern PrefixRankedBar)",
"arbology::exact::ExactPatternMatch (PrefixRankedBarTree)$subject (PrefixRankedBarNonlinearPattern) <(tree::GeneralAlphabet::add $pattern <(tree::GeneralAlphabet::get $subject))", 1000 ),
std::make_tuple ( "Exact Knuth Morris Pratt (NonlinearPattern PrefixRankedBar)",
"arbology::exact::KnuthMorrisPratt (PrefixRankedBarTree)$subject (PrefixRankedBarNonlinearPattern)$pattern", 1000 ),
std::make_tuple ( "Exact Knuth Morris Pratt (NonlinearPattern PrefixRanked)",
"arbology::exact::KnuthMorrisPratt (PrefixRankedTree)$subject (PrefixRankedNonlinearPattern)$pattern", 1000 ),
std::make_tuple ( "Exact Boyer Moore Horspool (NonlinearPattern PrefixRankedBar)",
"arbology::exact::BoyerMooreHorspool (PrefixRankedBarTree)$subject (PrefixRankedBarNonlinearPattern) <(tree::GeneralAlphabet::add $pattern <(tree::GeneralAlphabet::get $subject))", 1000 ),
std::make_tuple ( "Exact Reversed Boyer Moore Horspool (NonlinearPattern PrefixRankedBar)",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment