diff --git a/aarbology2/src/aarbology.cpp b/aarbology2/src/aarbology.cpp index 26d848d668fffa8fbd73863d85840c0060d7c325..e4eef2b9590f4041baa1ea0eea686f94e27dc908 100644 --- a/aarbology2/src/aarbology.cpp +++ b/aarbology2/src/aarbology.cpp @@ -15,6 +15,7 @@ #include <container/ObjectsSet.h> #include <arbology/exact/ExactSubtreeMatch.h> +#include <arbology/exact/ExactPatternMatch.h> #include <arbology/exact/BoyerMooreHorspool.h> #include <arbology/exact/ExactSubtreeMatchingAutomaton.h> #include <chrono> @@ -25,6 +26,7 @@ int main ( int argc, char * argv[] ) { std::vector < std::string > allowed; allowed.push_back ( "exactSubtreeMatch" ); + allowed.push_back ( "exactPatternMatch" ); allowed.push_back ( "boyerMooreHorspool" ); allowed.push_back ( "exactSubtreeMatchingAutomaton" ); TCLAP::ValuesConstraint < std::string > allowedVals ( allowed ); @@ -109,6 +111,19 @@ int main ( int argc, char * argv[] ) { std::chrono::measurements::end ( ); std::chrono::measurements::start ( "Output write", std::chrono::measurements::Type::AUXILARY ); + alib::XmlDataFactory::toStdout ( res ); + } else if ( algorithm.getValue ( ) == "exactPatternMatch" ) { + tree::Tree subject = alib::XmlDataFactory::fromTokens < tree::Tree > ( subjectTokens.front ( ) ); + tree::Tree pattern = alib::XmlDataFactory::fromTokens < tree::Tree > ( patternTokens.front ( ) ); + + std::chrono::measurements::end ( ); + std::chrono::measurements::start ( "Algorithm", std::chrono::measurements::Type::MAIN ); + + std::set < unsigned > res = arbology::exact::ExactPatternMatch::match ( subject, pattern ); + + std::chrono::measurements::end ( ); + std::chrono::measurements::start ( "Output write", std::chrono::measurements::Type::AUXILARY ); + alib::XmlDataFactory::toStdout ( res ); } else if ( algorithm.getValue ( ) == "boyerMooreHorspool" ) { tree::Tree subject = alib::XmlDataFactory::fromTokens < tree::Tree > ( subjectTokens.front ( ) ); diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp index 6e805a03560734169d32fd1b5295f592698c7993..5026d2f6d2cec241aa4b07efafcf0553702c19a9 100644 --- a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp +++ b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp @@ -24,105 +24,126 @@ namespace arbology { namespace exact { -std::set<unsigned> ExactPatternMatch::match(const tree::Tree& subject, const tree::Tree& pattern) { - return getInstance().dispatch(subject.getData(), pattern.getData()); +std::set < unsigned > ExactPatternMatch::match ( const tree::Tree & subject, const tree::Tree & pattern ) { + return getInstance ( ).dispatch ( subject.getData ( ), pattern.getData ( ) ); } -bool ExactPatternMatch::matchHelper(const tree::UnrankedNode& subject, const tree::UnrankedNode& pattern, const alphabet::Symbol& subtreeVariable) { - if(pattern.getSymbol() == subtreeVariable) return true; - if(subject.getSymbol() != pattern.getSymbol()) return false; - if(subject.getChildren().size() != pattern.getChildren().size()) return false; - for(const std::tuple<const tree::UnrankedNode*, const tree::UnrankedNode*>& childs : std::make_pair_foreach(subject.getChildren(), pattern.getChildren())) { - if(!matchHelper(*std::get<0>(childs), *std::get<1>(childs), subtreeVariable)) return false; - } +bool ExactPatternMatch::matchHelper ( const tree::UnrankedNode & subject, const tree::UnrankedNode & pattern, const alphabet::Symbol & subtreeVariable ) { + if ( pattern.getSymbol ( ) == subtreeVariable ) return true; + + if ( subject.getSymbol ( ) != pattern.getSymbol ( ) ) return false; + + if ( subject.getChildren ( ).size ( ) != pattern.getChildren ( ).size ( ) ) return false; + + for ( const std::tuple < const tree::UnrankedNode *, const tree::UnrankedNode * > & childs : std::make_pair_foreach ( subject.getChildren ( ), pattern.getChildren ( ) ) ) + if ( !matchHelper ( * std::get < 0 > ( childs ), * std::get < 1 > ( childs ), subtreeVariable ) ) return false; + return true; } -bool ExactPatternMatch::matchHelper(const tree::RankedNode& subject, const tree::RankedNode& pattern, const alphabet::RankedSymbol& subtreeVariable) { - if(pattern.getSymbol() == subtreeVariable) return true; - if(subject.getSymbol() != pattern.getSymbol()) return false; - // ranked symbols are the same; test for number of children is not needed - for(const std::tuple<const tree::RankedNode*, const tree::RankedNode*>& childs : std::make_pair_foreach(subject.getChildren(), pattern.getChildren())) { - if(!matchHelper(*std::get<0>(childs), *std::get<1>(childs), subtreeVariable)) return false; - } +bool ExactPatternMatch::matchHelper ( const tree::RankedNode & subject, const tree::RankedNode & pattern, const alphabet::RankedSymbol & subtreeVariable ) { + if ( pattern.getSymbol ( ) == subtreeVariable ) return true; + + if ( subject.getSymbol ( ) != pattern.getSymbol ( ) ) return false; + + // ranked symbols are the same; test for number of children is not needed + for ( const std::tuple < const tree::RankedNode *, const tree::RankedNode * > & childs : std::make_pair_foreach ( subject.getChildren ( ), pattern.getChildren ( ) ) ) + if ( !matchHelper ( * std::get < 0 > ( childs ), * std::get < 1 > ( childs ), subtreeVariable ) ) return false; + return true; } -void ExactPatternMatch::matchInternal(unsigned& index, std::set<unsigned>& occ, const tree::UnrankedNode& subject, const tree::UnrankedNode& pattern, const alphabet::Symbol& subtreeVariable) { - if(matchHelper(subject, pattern, subtreeVariable)) occ.insert(index); +void ExactPatternMatch::matchInternal ( unsigned & index, std::set < unsigned > & occ, const tree::UnrankedNode & subject, const tree::UnrankedNode & pattern, const alphabet::Symbol & subtreeVariable ) { + if ( matchHelper ( subject, pattern, subtreeVariable ) ) occ.insert ( index ); + index++; - for(const tree::UnrankedNode* child : subject.getChildren()) { - matchInternal(index, occ, *child, pattern, subtreeVariable); - } + + for ( const tree::UnrankedNode * child : subject.getChildren ( ) ) + matchInternal ( index, occ, * child, pattern, subtreeVariable ); } -void ExactPatternMatch::matchInternal(unsigned& index, std::set<unsigned>& occ, const tree::RankedNode& subject, const tree::RankedNode& pattern, const alphabet::RankedSymbol& subtreeVariable) { - if(matchHelper(subject, pattern, subtreeVariable)) occ.insert(index); +void ExactPatternMatch::matchInternal ( unsigned & index, std::set < unsigned > & occ, const tree::RankedNode & subject, const tree::RankedNode & pattern, const alphabet::RankedSymbol & subtreeVariable ) { + if ( matchHelper ( subject, pattern, subtreeVariable ) ) occ.insert ( index ); + index++; - for(const tree::RankedNode* child : subject.getChildren()) { - matchInternal(index, occ, *child, pattern, subtreeVariable); - } + + for ( const tree::RankedNode * child : subject.getChildren ( ) ) + matchInternal ( index, occ, * child, pattern, subtreeVariable ); } -std::set<unsigned> ExactPatternMatch::match(const tree::UnrankedTree& subject, const tree::UnrankedPattern& pattern) { +std::set < unsigned > ExactPatternMatch::match ( const tree::UnrankedTree & subject, const tree::UnrankedPattern & pattern ) { unsigned i = 0; - std::set<unsigned> occ; - matchInternal(i, occ, subject.getRoot(), pattern.getRoot(), pattern.getSubtreeWildcard()); + std::set < unsigned > occ; + + matchInternal ( i, occ, subject.getRoot ( ), pattern.getRoot ( ), pattern.getSubtreeWildcard ( ) ); return occ; } -auto ExactPatternMatchUnrankedTree = ExactPatternMatch::RegistratorWrapper<std::set<unsigned>, tree::UnrankedTree, tree::UnrankedPattern>(ExactPatternMatch::getInstance(), ExactPatternMatch::match); +auto ExactPatternMatchUnrankedTree = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::UnrankedTree, tree::UnrankedPattern > ( ExactPatternMatch::getInstance ( ), ExactPatternMatch::match ); -std::set<unsigned> ExactPatternMatch::match(const tree::RankedTree& subject, const tree::RankedPattern& pattern) { +std::set < unsigned > ExactPatternMatch::match ( const tree::RankedTree & subject, const tree::RankedPattern & pattern ) { unsigned i = 0; - std::set<unsigned> occ; - matchInternal(i, occ, subject.getRoot(), pattern.getRoot(), pattern.getSubtreeWildcard()); + std::set < unsigned > occ; + + matchInternal ( i, occ, subject.getRoot ( ), pattern.getRoot ( ), pattern.getSubtreeWildcard ( ) ); return occ; } -auto ExactPatternMatchRankedTree = ExactPatternMatch::RegistratorWrapper<std::set<unsigned>, tree::RankedTree, tree::RankedPattern>(ExactPatternMatch::getInstance(), ExactPatternMatch::match); +auto ExactPatternMatchRankedTree = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::RankedTree, tree::RankedPattern > ( ExactPatternMatch::getInstance ( ), ExactPatternMatch::match ); -std::set<unsigned> ExactPatternMatch::match(const tree::PrefixRankedTree& subject, const tree::PrefixRankedPattern& pattern) { +std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedTree & subject, const tree::PrefixRankedPattern & pattern ) { std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject ); - std::set<unsigned> occ; - for(unsigned i = 0; i + pattern.getContent().size() <= subject.getContent().size(); i++) { + std::set < unsigned > occ; + + for ( unsigned i = 0; i + pattern.getContent ( ).size ( ) <= subject.getContent ( ).size ( ); i++ ) { unsigned j = 0; unsigned offset = i; - for(; j < pattern.getContent().size(); j++) { - if(pattern.getContent()[j] == subject.getContent()[offset+j]) offset++; - else if(pattern.getContent()[j] == pattern.getSubtreeWildcard()) offset = subjectSubtreeJumpTable[offset]; - else break; + + for ( ; j < pattern.getContent ( ).size ( ); j++ ) { + if ( pattern.getContent ( )[j] == subject.getContent ( )[offset + j] ) + offset++; + else if ( pattern.getContent ( )[j] == pattern.getSubtreeWildcard ( ) ) + offset = subjectSubtreeJumpTable[offset]; + else + break; } - if( j == pattern.getContent().size() ) - occ.insert(i); + if ( j == pattern.getContent ( ).size ( ) ) + occ.insert ( i ); } + return occ; } -auto ExactPatternMatchPrefixRankedTree = ExactPatternMatch::RegistratorWrapper<std::set<unsigned>, tree::PrefixRankedTree, tree::PrefixRankedPattern>(ExactPatternMatch::getInstance(), ExactPatternMatch::match); +auto ExactPatternMatchPrefixRankedTree = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree, tree::PrefixRankedPattern > ( ExactPatternMatch::getInstance ( ), ExactPatternMatch::match ); -std::set<unsigned> ExactPatternMatch::match(const tree::PrefixRankedBarTree& subject, const tree::PrefixRankedBarPattern& pattern) { +std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedBarTree & subject, const tree::PrefixRankedBarPattern & pattern ) { std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject ); - std::set<unsigned> occ; - for(unsigned i = 0; i + pattern.getContent().size() <= subject.getContent().size(); i++) { + std::set < unsigned > occ; + + for ( unsigned i = 0; i + pattern.getContent ( ).size ( ) <= subject.getContent ( ).size ( ); i++ ) { unsigned j = 0; unsigned offset = i; - for(; j < pattern.getContent().size(); j++) { - if(pattern.getContent()[j] == subject.getContent()[offset+j]) offset++; - else if(pattern.getContent()[j] == pattern.getSubtreeWildcard()) offset = subjectSubtreeJumpTable[offset]; - else break; + + for ( ; j < pattern.getContent ( ).size ( ); j++ ) { + if ( pattern.getContent ( )[j] == subject.getContent ( )[offset + j] ) + offset++; + else if ( pattern.getContent ( )[j] == pattern.getSubtreeWildcard ( ) ) + offset = subjectSubtreeJumpTable[offset]; + else + break; } - if( j == pattern.getContent().size() ) - occ.insert(i); + if ( j == pattern.getContent ( ).size ( ) ) + occ.insert ( i ); } + return occ; } -auto ExactPatternMatchPrefixRankedBarTree = ExactPatternMatch::RegistratorWrapper<std::set<unsigned>, tree::PrefixRankedBarTree, tree::PrefixRankedBarPattern>(ExactPatternMatch::getInstance(), ExactPatternMatch::match); +auto ExactPatternMatchPrefixRankedBarTree = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree, tree::PrefixRankedBarPattern > ( ExactPatternMatch::getInstance ( ), ExactPatternMatch::match ); } /* namespace exact */ diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.h b/alib2algo/src/arbology/exact/ExactPatternMatch.h index 099055afab1705044e7a07612a166cd641683af5..eb9f945e6f3a1de73fa9b8618d40b183f7f72666 100644 --- a/alib2algo/src/arbology/exact/ExactPatternMatch.h +++ b/alib2algo/src/arbology/exact/ExactPatternMatch.h @@ -19,30 +19,33 @@ namespace arbology { namespace exact { -class ExactPatternMatch : public std::DoubleDispatch<std::set<unsigned>, tree::TreeBase, tree::TreeBase> { +class ExactPatternMatch : public std::DoubleDispatch < std::set < unsigned >, tree::TreeBase, tree::TreeBase > { public: /** * Performs conversion. * @return left regular grammar equivalent to source automaton. */ - static std::set<unsigned> match(const tree::Tree& subject, const tree::Tree& pattern); + static std::set < unsigned > match ( const tree::Tree & subject, const tree::Tree & pattern ); + + static std::set < unsigned > match ( const tree::UnrankedTree & subject, const tree::UnrankedPattern & pattern ); + static std::set < unsigned > match ( const tree::RankedTree & subject, const tree::RankedPattern & pattern ); + static std::set < unsigned > match ( const tree::PrefixRankedTree & subject, const tree::PrefixRankedPattern & pattern ); + static std::set < unsigned > match ( const tree::PrefixRankedBarTree & subject, const tree::PrefixRankedBarPattern & pattern ); - static std::set<unsigned> match(const tree::UnrankedTree& subject, const tree::UnrankedPattern& pattern); - static std::set<unsigned> match(const tree::RankedTree& subject, const tree::RankedPattern& pattern); - static std::set<unsigned> match(const tree::PrefixRankedTree& subject, const tree::PrefixRankedPattern& pattern); - static std::set<unsigned> match(const tree::PrefixRankedBarTree& subject, const tree::PrefixRankedBarPattern& pattern); private: - static bool matchHelper(const tree::UnrankedNode& subject, const tree::UnrankedNode& pattern, const alphabet::Symbol& subtreeVariable); - static bool matchHelper(const tree::RankedNode& subject, const tree::RankedNode& pattern, const alphabet::RankedSymbol& subtreeVariable); + static bool matchHelper ( const tree::UnrankedNode & subject, const tree::UnrankedNode & pattern, const alphabet::Symbol & subtreeVariable ); + static bool matchHelper ( const tree::RankedNode & subject, const tree::RankedNode & pattern, const alphabet::RankedSymbol & subtreeVariable ); - static void matchInternal(unsigned& index, std::set<unsigned>& occ, const tree::UnrankedNode& subject, const tree::UnrankedNode& pattern, const alphabet::Symbol& subtreeVariable); - static void matchInternal(unsigned& index, std::set<unsigned>& occ, const tree::RankedNode& subject, const tree::RankedNode& pattern, const alphabet::RankedSymbol& subtreeVariable); + static void matchInternal ( unsigned & index, std::set < unsigned > & occ, const tree::UnrankedNode & subject, const tree::UnrankedNode & pattern, const alphabet::Symbol & subtreeVariable ); + static void matchInternal ( unsigned & index, std::set < unsigned > & occ, const tree::RankedNode & subject, const tree::RankedNode & pattern, const alphabet::RankedSymbol & subtreeVariable ); public: - static ExactPatternMatch& getInstance() { + static ExactPatternMatch & getInstance ( ) { static ExactPatternMatch res; + return res; } + }; } /* namespace exact */ diff --git a/examples2/tree/aarbology.test1.pattern.xml b/examples2/tree/aarbology.test1.pattern.xml index fab30bef1443f07b26d2147d6e3fa3608346cdd9..25e39bf7b5625f4321a4a9bfedcabaf7c6814c17 100644 --- a/examples2/tree/aarbology.test1.pattern.xml +++ b/examples2/tree/aarbology.test1.pattern.xml @@ -1,5 +1,11 @@ <?xml version="1.0"?> -<RankedTree> +<RankedPattern> + <subtreeWildcard> + <RankedSymbol> + <SubtreeWildcardSymbol /> + <Unsigned>0</Unsigned> + </RankedSymbol> + </subtreeWildcard> <rankedAlphabet> <RankedSymbol> <LabeledSymbol> @@ -18,11 +24,7 @@ <Unsigned>1</Unsigned> </RankedSymbol> <RankedSymbol> -<LabeledSymbol> - <PrimitiveLabel> - <Character>c</Character> - </PrimitiveLabel> -</LabeledSymbol> + <SubtreeWildcardSymbol /> <Unsigned>0</Unsigned> </RankedSymbol> </rankedAlphabet> @@ -46,24 +48,16 @@ </RankedSymbol> <rankedNode> <RankedSymbol> -<LabeledSymbol> - <PrimitiveLabel> - <Character>c</Character> - </PrimitiveLabel> -</LabeledSymbol> + <SubtreeWildcardSymbol /> <Unsigned>0</Unsigned> </RankedSymbol> </rankedNode> <rankedNode> <RankedSymbol> -<LabeledSymbol> - <PrimitiveLabel> - <Character>c</Character> - </PrimitiveLabel> -</LabeledSymbol> + <SubtreeWildcardSymbol /> <Unsigned>0</Unsigned> </RankedSymbol> </rankedNode> </rankedNode> </rankedNode> -</RankedTree> +</RankedPattern> diff --git a/examples2/tree/aarbology.test1.subtree.xml b/examples2/tree/aarbology.test1.subtree.xml new file mode 100644 index 0000000000000000000000000000000000000000..fab30bef1443f07b26d2147d6e3fa3608346cdd9 --- /dev/null +++ b/examples2/tree/aarbology.test1.subtree.xml @@ -0,0 +1,69 @@ +<?xml version="1.0"?> +<RankedTree> + <rankedAlphabet> + <RankedSymbol> +<LabeledSymbol> + <PrimitiveLabel> + <Character>a</Character> + </PrimitiveLabel> +</LabeledSymbol> + <Unsigned>2</Unsigned> + </RankedSymbol> + <RankedSymbol> +<LabeledSymbol> + <PrimitiveLabel> + <Character>b</Character> + </PrimitiveLabel> +</LabeledSymbol> + <Unsigned>1</Unsigned> + </RankedSymbol> + <RankedSymbol> +<LabeledSymbol> + <PrimitiveLabel> + <Character>c</Character> + </PrimitiveLabel> +</LabeledSymbol> + <Unsigned>0</Unsigned> + </RankedSymbol> + </rankedAlphabet> + <rankedNode> + <RankedSymbol> +<LabeledSymbol> + <PrimitiveLabel> + <Character>b</Character> + </PrimitiveLabel> +</LabeledSymbol> + <Unsigned>1</Unsigned> + </RankedSymbol> + <rankedNode> + <RankedSymbol> +<LabeledSymbol> + <PrimitiveLabel> + <Character>a</Character> + </PrimitiveLabel> +</LabeledSymbol> + <Unsigned>2</Unsigned> + </RankedSymbol> + <rankedNode> + <RankedSymbol> +<LabeledSymbol> + <PrimitiveLabel> + <Character>c</Character> + </PrimitiveLabel> +</LabeledSymbol> + <Unsigned>0</Unsigned> + </RankedSymbol> + </rankedNode> + <rankedNode> + <RankedSymbol> +<LabeledSymbol> + <PrimitiveLabel> + <Character>c</Character> + </PrimitiveLabel> +</LabeledSymbol> + <Unsigned>0</Unsigned> + </RankedSymbol> + </rankedNode> + </rankedNode> + </rankedNode> +</RankedTree> diff --git a/tests.aarbology.sh b/tests.aarbology.sh index 557917774c49355261f0e3a248049760887e71e1..46ae1378a311d7c7d59d1120ab079c1b2aaa2c78 100755 --- a/tests.aarbology.sh +++ b/tests.aarbology.sh @@ -54,6 +54,10 @@ function log { } function generatePattern { + ./arand2 -t RP --nodes $RAND_SIZE_PATTERN --terminals $(( $RANDOM % $RAND_ALPHABET + 1 )) --height $RAND_HEIGHT_PATTERN 2>/dev/null +} + +function generateSubtree { ./arand2 -t RT --nodes $RAND_SIZE_PATTERN --terminals $(( $RANDOM % $RAND_ALPHABET + 1 )) --height $RAND_HEIGHT_PATTERN 2>/dev/null } @@ -126,7 +130,7 @@ function outputResults { } # $1 - aconversions2 sequence -function runTest { +function runTestSubtree { echo $1 echo -ne "\t" @@ -134,7 +138,7 @@ function runTest { # predefined tests first for SUBJECT_FILE in `ls $TESTS_DIR/aarbology.test*.subject.xml`; do - PATTERN_FILE=${SUBJECT_FILE%.subject.xml}.pattern.xml + PATTERN_FILE=${SUBJECT_FILE%.subject.xml}.subtree.xml if [ -f ]; then Occs=`./aarbology2 -a exactSubtreeMatch -s "$SUBJECT_FILE" -p "$PATTERN_FILE" | ./astat2 -p quantity -s` @@ -151,7 +155,7 @@ function runTest { for i in $(seq 1 $TESTCASE_ITERATIONS ); do cat <(generateSubject) > $SUBJECT_FILE - cat <(generatePattern) > $PATTERN_FILE + cat <(generateSubtree) > $PATTERN_FILE Occs=`./aarbology2 -a exactSubtreeMatch -s "$SUBJECT_FILE" -p "$PATTERN_FILE" | ./astat2 -p quantity -s` @@ -165,6 +169,47 @@ function runTest { outputResults } -runTest "Exact Boyer Moore Horspool" "./aarbology2 -a boyerMooreHorspool -s <( ./acast2 -t PrefixRankedBarTree -i \"\$SUBJECT_FILE\" ) -p <( ./acast2 -t PrefixRankedBarTree -i \"\$PATTERN_FILE\" ) | ./astat2 -p quantity -s" -runTest "Exact Subtree Automaton" "./arun2 -t occurrences -a <(./aarbology2 -a exactSubtreeMatchingAutomaton -p \"\$PATTERN_FILE\" | ./adeterminize2) -i \"\$SUBJECT_FILE\" | ./astat2 -p quantity -s" +# $1 - aconversions2 sequence +function runTestPattern { + echo $1 + echo -ne "\t" + + clearResults + + # predefined tests first + for SUBJECT_FILE in `ls $TESTS_DIR/aarbology.test*.subject.xml`; do + PATTERN_FILE=${SUBJECT_FILE%.subject.xml}.pattern.xml + if [ -f ]; then + Occs=`./aarbology2 -a exactPatternMatch -s "$SUBJECT_FILE" -p "$PATTERN_FILE" | ./astat2 -p quantity -s` + + runTest2 "$Occs" "$2" "$SUBJECT_FILE" "$PATTERN_FILE" + registerResult $? + fi + done + + echo -n " | " + + # random tests + SUBJECT_FILE=s.xml + PATTERN_FILE=p.xml + for i in $(seq 1 $TESTCASE_ITERATIONS ); + do + cat <(generateSubject) > $SUBJECT_FILE + cat <(generatePattern) > $PATTERN_FILE + + Occs=`./aarbology2 -a exactPatternMatch -s "$SUBJECT_FILE" -p "$PATTERN_FILE" | ./astat2 -p quantity -s` + + runTest2 "$Occs" "$2" "$SUBJECT_FILE" "$PATTERN_FILE" + registerResult $? + done + + rm $SUBJECT_FILE + rm $PATTERN_FILE + + outputResults +} + +runTestSubtree "Exact Boyer Moore Horspool" "./aarbology2 -a boyerMooreHorspool -s <( ./acast2 -t PrefixRankedBarTree -i \"\$SUBJECT_FILE\" ) -p <( ./acast2 -t PrefixRankedBarTree -i \"\$PATTERN_FILE\" ) | ./astat2 -p quantity -s" +runTestSubtree "Exact Subtree Automaton" "./arun2 -t occurrences -a <(./aarbology2 -a exactSubtreeMatchingAutomaton -p \"\$PATTERN_FILE\" | ./adeterminize2) -i \"\$SUBJECT_FILE\" | ./astat2 -p quantity -s" +runTestPattern "Exact Boyer Moore Horspool" "./aarbology2 -a boyerMooreHorspool -s <( ./acast2 -t PrefixRankedBarTree -i \"\$SUBJECT_FILE\" ) -p <( ./acast2 -t PrefixRankedBarPattern -i \"\$PATTERN_FILE\" ) | ./astat2 -p quantity -s"