From 7b7c469a938c3be885b9fadb6a9fffbaf934d1c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Tr=C3=A1vn=C3=AD=C4=8Dek?= <jan.travnicek@fit.cvut.cz> Date: Thu, 30 Dec 2021 15:15:14 +0100 Subject: [PATCH] algo: test and fix knuth morris pratt on nonlinear tree patterns --- alib2algo/src/tree/properties/BorderArray.h | 22 ++++++++++++++++++++- tests/cppaql/arbologyTest.cpp | 4 ++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/alib2algo/src/tree/properties/BorderArray.h b/alib2algo/src/tree/properties/BorderArray.h index 47b385ece8..4b2f58d511 100644 --- a/alib2algo/src/tree/properties/BorderArray.h +++ b/alib2algo/src/tree/properties/BorderArray.h @@ -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 ); diff --git a/tests/cppaql/arbologyTest.cpp b/tests/cppaql/arbologyTest.cpp index 9482a0ff1e..653a36d5eb 100644 --- a/tests/cppaql/arbologyTest.cpp +++ b/tests/cppaql/arbologyTest.cpp @@ -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)", -- GitLab