From e533c65f2705c900e00c02bd3ddb9726480a2782 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Tue, 11 Oct 2016 11:03:41 +0200 Subject: [PATCH] template PrefixRankedNonlinearPattern tree --- .../src/arbology/exact/ExactPatternMatch.cpp | 4 +- .../src/arbology/exact/ExactPatternMatch.h | 2 +- .../exact/ReversedBadCharacterShiftTable.cpp | 6 +- .../exact/ReversedBadCharacterShiftTable.h | 2 +- .../exact/ReversedBoyerMooreHorspool.cpp | 4 +- .../exact/ReversedBoyerMooreHorspool.h | 2 +- alib2data/src/string/LinearString.cpp | 2 +- alib2data/src/string/LinearString.h | 4 +- alib2data/src/tree/TreeFeatures.h | 1 + .../ranked/PrefixRankedNonlinearPattern.cpp | 161 +----------- .../ranked/PrefixRankedNonlinearPattern.h | 239 +++++++++++++++--- 11 files changed, 224 insertions(+), 203 deletions(-) diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp index 5ef915c2a4..f2ad448336 100644 --- a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp +++ b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp @@ -166,7 +166,7 @@ std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedTree < auto ExactPatternMatchPrefixRankedPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedPattern < > > ( ExactPatternMatch::match ); -std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern & pattern ) { +std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern < > & pattern ) { std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject ); std::map < std::ranked_symbol < >, alphabet::Symbol > variablesSetting; @@ -203,7 +203,7 @@ std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedTree < return occ; } -auto ExactPatternMatchPrefixRankedNonlinearPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedNonlinearPattern > ( ExactPatternMatch::match ); +auto ExactPatternMatchPrefixRankedNonlinearPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedNonlinearPattern < > > ( ExactPatternMatch::match ); std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarPattern < > & pattern ) { std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject ); diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.h b/alib2algo/src/arbology/exact/ExactPatternMatch.h index 2005a1a473..09a9ea162a 100644 --- a/alib2algo/src/arbology/exact/ExactPatternMatch.h +++ b/alib2algo/src/arbology/exact/ExactPatternMatch.h @@ -34,7 +34,7 @@ public: static std::set < unsigned > match ( const tree::RankedTree < > & subject, const tree::RankedNonlinearPattern < > & pattern ); static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedPattern < > & pattern ); - static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern & pattern ); + static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern < > & pattern ); static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarPattern < > & pattern ); static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern & pattern ); diff --git a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp index bf2e886b2c..4fb5eebb81 100644 --- a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp +++ b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp @@ -83,12 +83,12 @@ std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs auto ReversedBadCharacterShiftTablePrefixRankedBarNonlinearPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarNonlinearPattern > ( ReversedBadCharacterShiftTable::bcs ); std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs ( const tree::PrefixRankedPattern < > & pattern ) { - return bcs ( tree::PrefixRankedNonlinearPattern ( pattern ) ); + return bcs ( tree::PrefixRankedNonlinearPattern < > ( pattern ) ); } auto ReversedBadCharacterShiftTablePrefixRankedPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedPattern < > > ( ReversedBadCharacterShiftTable::bcs ); -std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs ( const tree::PrefixRankedNonlinearPattern & pattern ) { +std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs ( const tree::PrefixRankedNonlinearPattern < > & pattern ) { const std::set < std::ranked_symbol < > > & alphabet = pattern.getAlphabet ( ); std::map < std::ranked_symbol < >, size_t > bcs; @@ -130,7 +130,7 @@ std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs return bcs; } -auto ReversedBadCharacterShiftTablePrefixRankedNonlinearPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedNonlinearPattern > ( ReversedBadCharacterShiftTable::bcs ); +auto ReversedBadCharacterShiftTablePrefixRankedNonlinearPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedNonlinearPattern < > > ( ReversedBadCharacterShiftTable::bcs ); } /* namespace exact */ diff --git a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h index c2d414e8e4..df1e9df914 100644 --- a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h +++ b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h @@ -35,7 +35,7 @@ public: static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedBarPattern < > & pattern ); static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedBarNonlinearPattern & pattern ); static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedPattern < > & pattern ); - static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedNonlinearPattern & pattern ); + static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::PrefixRankedNonlinearPattern < > & pattern ); }; diff --git a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp index 77b374b7e7..9feef4ebe9 100644 --- a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp +++ b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp @@ -184,7 +184,7 @@ std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRank auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedPattern < > > ( ReversedBoyerMooreHorspool::match ); -std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern & pattern ) { +std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern < > & pattern ) { std::set < unsigned > occ; std::map < std::ranked_symbol < >, size_t > bcs = ReversedBadCharacterShiftTable::bcs ( pattern ); // NOTE: the subjects alphabet must be a subset or equal to the pattern std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject ); @@ -239,7 +239,7 @@ std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRank return occ; } -auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedNonlinearPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedNonlinearPattern > ( ReversedBoyerMooreHorspool::match ); +auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedNonlinearPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedNonlinearPattern < > > ( ReversedBoyerMooreHorspool::match ); } /* namespace exact */ diff --git a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h index ca6d55881d..51028ea72f 100644 --- a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h +++ b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h @@ -33,7 +33,7 @@ public: static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern & pattern ); static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedTree < > & pattern ); static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedPattern < > & pattern ); - static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern & pattern ); + static std::set < unsigned > match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedNonlinearPattern < > & pattern ); }; diff --git a/alib2data/src/string/LinearString.cpp b/alib2data/src/string/LinearString.cpp index bd5fdf2e36..4ce1aa42fd 100644 --- a/alib2data/src/string/LinearString.cpp +++ b/alib2data/src/string/LinearString.cpp @@ -20,7 +20,7 @@ auto linearStringParserRegister2 = xmlApi < alib::Object >::ParserRegister < str auto LinearStringFromEpsilon = castApi::CastRegister < string::LinearString < >, string::Epsilon < > > ( ); auto LinearStringFromPrefixRankedTree = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedTree < > > ( ); auto LinearStringFromPrefixRankedPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedPattern < > > ( ); -auto LinearStringFromPrefixRankedNonlinearPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedNonlinearPattern > ( ); +auto LinearStringFromPrefixRankedNonlinearPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedNonlinearPattern < > > ( ); auto LinearStringFromPrefixRankedBarTree = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedBarTree < > > ( ); auto LinearStringFromPrefixRankedBarPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedBarPattern < > > ( ); auto LinearStringFromPrefixRankedBarNonlinearPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedBarNonlinearPattern > ( ); diff --git a/alib2data/src/string/LinearString.h b/alib2data/src/string/LinearString.h index b15a6bf404..1d1523d297 100644 --- a/alib2data/src/string/LinearString.h +++ b/alib2data/src/string/LinearString.h @@ -41,7 +41,7 @@ public: explicit LinearString ( ); explicit LinearString ( const tree::PrefixRankedTree < > & tree ); explicit LinearString ( const tree::PrefixRankedPattern < > & tree ); - explicit LinearString ( const tree::PrefixRankedNonlinearPattern & tree ); + explicit LinearString ( const tree::PrefixRankedNonlinearPattern < > & tree ); explicit LinearString ( const tree::PrefixRankedBarTree < > & tree ); explicit LinearString ( const tree::PrefixRankedBarPattern < > & tree ); explicit LinearString ( const tree::PrefixRankedBarNonlinearPattern & tree ); @@ -151,7 +151,7 @@ LinearString < SymbolType >::LinearString ( const tree::PrefixRankedPattern < > } template < class SymbolType > -LinearString < SymbolType >::LinearString ( const tree::PrefixRankedNonlinearPattern & tree ) : LinearString ( StringAuxiliary::wrapSymbols ( tree.getAlphabet ( ) ), StringAuxiliary::wrapSymbols ( tree.getContent ( ) ) ) { +LinearString < SymbolType >::LinearString ( const tree::PrefixRankedNonlinearPattern < > & tree ) : LinearString ( StringAuxiliary::wrapSymbols ( tree.getAlphabet ( ) ), StringAuxiliary::wrapSymbols ( tree.getContent ( ) ) ) { } template < class SymbolType > diff --git a/alib2data/src/tree/TreeFeatures.h b/alib2data/src/tree/TreeFeatures.h index d140a65833..838b1e8f14 100644 --- a/alib2data/src/tree/TreeFeatures.h +++ b/alib2data/src/tree/TreeFeatures.h @@ -43,6 +43,7 @@ template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsi class PrefixRankedBarTree; template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsigned > class PrefixRankedPattern; +template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsigned > class PrefixRankedNonlinearPattern; template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsigned > class PrefixRankedBarPattern; diff --git a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp index f986f74f8a..b5caaf11bb 100644 --- a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.cpp @@ -6,166 +6,23 @@ */ #include "PrefixRankedNonlinearPattern.h" - -#include <sstream> -#include <algorithm> -#include <deque> - -#include "PrefixRankedTree.h" -#include "PrefixRankedPattern.h" -#include "RankedTree.h" -#include "RankedPattern.h" -#include "RankedNonlinearPattern.h" - -#include <sax/FromXMLParserHelper.h> -#include "../common/TreeFromXMLParser.h" -#include "../common/TreeToXMLComposer.h" #include "../Tree.h" #include "../RankedTreeWrapper.h" #include <object/Object.h> #include <core/xmlApi.hpp> #include <core/castApi.hpp> -#include "../../alphabet/SubtreeWildcardSymbol.h" - -namespace tree { - -PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::set < std::ranked_symbol < > > alphabet, std::vector < std::ranked_symbol < > > data ) : std::Components < PrefixRankedNonlinearPattern, std::ranked_symbol < >, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ) ), std::make_tuple ( subtreeWildcard ) ) { - setContent ( std::move ( data ) ); -} - -PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::vector < std::ranked_symbol < > > data ) : PrefixRankedNonlinearPattern ( subtreeWildcard, nonlinearVariables, std::set < std::ranked_symbol < > > ( data.begin ( ), data.end ( ) ) + std::set < std::ranked_symbol < > > { subtreeWildcard } + nonlinearVariables, data ) { -} - -PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( std::ranked_symbol < > subtreeWildcard, std::vector < std::ranked_symbol < > > data ) : PrefixRankedNonlinearPattern ( subtreeWildcard, {}, std::set < std::ranked_symbol < > > ( data.begin ( ), data.end ( ) ) + std::set < std::ranked_symbol < > > { subtreeWildcard }, data ) { -} - -PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( const PrefixRankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ), tree.getContent ( ) ) { -} - -PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( const PrefixRankedPattern < > & tree ) : PrefixRankedNonlinearPattern ( tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ), tree.getContent ( ) ) { -} - -PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) { -} - -PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( const RankedPattern < > & tree ) : PrefixRankedNonlinearPattern ( tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) { -} - -PrefixRankedNonlinearPattern::PrefixRankedNonlinearPattern ( const RankedNonlinearPattern < > & tree ) : PrefixRankedNonlinearPattern ( tree.getSubtreeWildcard ( ), tree.getNonlinearVariables ( ), tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) { -} - -std::vector < std::ranked_symbol < > > PrefixRankedNonlinearPattern::toPrefixRanked ( const std::tree < std::ranked_symbol < > > & tree ) { - std::vector < std::ranked_symbol < > > res; - - for ( std::tree < std::ranked_symbol < > >::const_prefix_iterator iter = tree.prefix_begin ( ); iter != tree.prefix_end ( ); ++iter ) - res.push_back ( * iter ); - - return res; -} - -RankedTreeBase * PrefixRankedNonlinearPattern::clone ( ) const { - return new PrefixRankedNonlinearPattern ( * this ); -} - -RankedTreeBase * PrefixRankedNonlinearPattern::plunder ( ) && { - return new PrefixRankedNonlinearPattern ( std::move ( * this ) ); -} - -const std::vector < std::ranked_symbol < > > & PrefixRankedNonlinearPattern::getContent ( ) const { - return this->m_Data; -} - -void PrefixRankedNonlinearPattern::setContent ( std::vector < std::ranked_symbol < > > data ) { - arityChecksum ( data ); - - std::set < std::ranked_symbol < > > minimalAlphabet ( data.begin ( ), data.end ( ) ); - std::set < std::ranked_symbol < > > unknownSymbols; - std::set_difference ( minimalAlphabet.begin ( ), minimalAlphabet.end ( ), getAlphabet ( ).begin ( ), getAlphabet ( ).end ( ), std::inserter ( unknownSymbols, unknownSymbols.end ( ) ) ); - - if ( unknownSymbols.size ( ) > 0 ) - throw TreeException ( "Input symbols not in the alphabet." ); - - this->m_Data = std::move ( data ); -} - -void PrefixRankedNonlinearPattern::arityChecksum ( const std::vector < std::ranked_symbol < > > & data ) { - int arityChecksum = 1; - - for ( const std::ranked_symbol < > & symbol : data ) { - arityChecksum += symbol.getRank ( ).getData ( ); - arityChecksum -= 1; - } - - if ( arityChecksum != 0 ) throw TreeException ( "The string does not form a tree" ); -} - -bool PrefixRankedNonlinearPattern::isEmpty ( ) const { - return this->m_Data.size ( ) == 0; -} - -int PrefixRankedNonlinearPattern::compare ( const PrefixRankedNonlinearPattern & other ) const { - auto first = std::tie ( m_Data, getAlphabet ( ), getSubtreeWildcard ( ), getNonlinearVariables ( ) ); - auto second = std::tie ( other.m_Data, other.getAlphabet ( ), other.getSubtreeWildcard ( ), other.getNonlinearVariables ( ) ); - - std::compare < decltype ( first ) > comp; - - return comp ( first, second ); -} - -void PrefixRankedNonlinearPattern::operator >>( std::ostream & out ) const { - out << "(PrefixRankedNonlinearPattern "; - - for ( const std::ranked_symbol < > & symbol : this->m_Data ) - out << symbol; - - out << ")"; -} - -PrefixRankedNonlinearPattern::operator std::string ( ) const { - std::stringstream ss; - ss << "\""; - - for ( const std::ranked_symbol < > & symbol : this->m_Data ) - ss << symbol; - - ss << "\""; - return std::move ( ss ).str ( ); -} - -PrefixRankedNonlinearPattern PrefixRankedNonlinearPattern::parse ( std::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, PrefixRankedNonlinearPattern::getXmlTagName ( ) ); - std::ranked_symbol < > subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardRawRankedSymbol ( input ); - std::set < std::ranked_symbol < > > nonlinearVariables = TreeFromXMLParser::parseRankedNonlinearVariables ( input ); - std::set < std::ranked_symbol < > > rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet ( input ); - std::vector < std::ranked_symbol < > > data = TreeFromXMLParser::parseRankedLinearContent ( input ); - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, PrefixRankedNonlinearPattern::getXmlTagName ( ) ); - - return PrefixRankedNonlinearPattern ( std::move ( subtreeWildcardSymbol ), std::move ( nonlinearVariables ), std::move ( rankedAlphabet ), std::move ( data ) ); -} - -void PrefixRankedNonlinearPattern::compose ( std::deque < sax::Token > & out ) const { - out.emplace_back ( PrefixRankedNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); - TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard ( ) ); - TreeToXMLComposer::composeNonlinearVariables ( out, getNonlinearVariables ( ) ); - TreeToXMLComposer::composeAlphabet ( out, getAlphabet ( ) ); - TreeToXMLComposer::composeContent ( out, m_Data ); - out.emplace_back ( PrefixRankedNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); -} - -} /* namespace tree */ - namespace alib { -auto prefixRankedNonlinearPatternParserRegister = xmlApi < ::tree::Tree >::ParserRegister < ::tree::PrefixRankedNonlinearPattern > ( ); -auto prefixRankedNonlinearPatternParserRegister2 = xmlApi < ::tree::RankedTreeWrapper >::ParserRegister < ::tree::PrefixRankedNonlinearPattern > ( ); -auto prefixRankedNonlinearPatternParserRegister3 = xmlApi < alib::Object >::ParserRegister < ::tree::PrefixRankedNonlinearPattern > ( ); +auto prefixRankedNonlinearPatternParserRegister = xmlApi < ::tree::Tree >::ParserRegister < ::tree::PrefixRankedNonlinearPattern < > > ( ); +auto prefixRankedNonlinearPatternParserRegister2 = xmlApi < ::tree::RankedTreeWrapper >::ParserRegister < ::tree::PrefixRankedNonlinearPattern < > > ( ); +auto prefixRankedNonlinearPatternParserRegister3 = xmlApi < alib::Object >::ParserRegister < ::tree::PrefixRankedNonlinearPattern < > > ( ); -auto PrefixRankedNonlinearPatternFromRankedTree = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern, ::tree::RankedTree < > > ( ); -auto PrefixRankedNonlinearPatternFromRankedPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern, ::tree::RankedPattern < > > ( ); -auto PrefixRankedNonlinearPatternFromRankedNonlinearPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern, ::tree::RankedNonlinearPattern < > > ( ); -auto PrefixRankedNonlinearPatternFromPrefixRankedTree = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern, ::tree::PrefixRankedTree < > > ( ); -auto PrefixRankedNonlinearPatternFromPrefixRankedPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern, ::tree::PrefixRankedPattern < > > ( ); -auto PrefixRankedNonlinearPatternCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedNonlinearPattern > ( ::tree::PrefixRankedNonlinearPattern::getXmlTagName ( ) ); +auto PrefixRankedNonlinearPatternFromRankedTree = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::RankedTree < > > ( ); +auto PrefixRankedNonlinearPatternFromRankedPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::RankedPattern < > > ( ); +auto PrefixRankedNonlinearPatternFromRankedNonlinearPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::RankedNonlinearPattern < > > ( ); +auto PrefixRankedNonlinearPatternFromPrefixRankedTree = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::PrefixRankedTree < > > ( ); +auto PrefixRankedNonlinearPatternFromPrefixRankedPattern = castApi::CastRegister < ::tree::PrefixRankedNonlinearPattern < >, ::tree::PrefixRankedPattern < > > ( ); +auto PrefixRankedNonlinearPatternCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedNonlinearPattern < > > ( ::tree::PrefixRankedNonlinearPattern < >::getXmlTagName ( ) ); } /* namespace alib */ diff --git a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h index 307cc11cdb..6e4a8a2ac7 100644 --- a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h +++ b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h @@ -11,12 +11,21 @@ #include <set> #include <vector> #include <tree> +#include <sstream> +#include <algorithm> +#include <deque> + #include <core/components.hpp> +#include <sax/FromXMLParserHelper.h> +#include "alphabet/ranked_symbol.hpp" #include "../TreeFeatures.h" #include "../TreeException.h" -#include "alphabet/ranked_symbol.hpp" #include "../RankedTreeBase.h" +#include "../common/TreeFromXMLParser.h" +#include "../common/TreeToXMLComposer.h" + +#include "../../alphabet/SubtreeWildcardSymbol.h" namespace tree { @@ -28,15 +37,16 @@ class NonlinearAlphabet; * Represents regular expression parsed from the XML. Regular expression is stored * as a tree of LinearStringElement. */ -class PrefixRankedNonlinearPattern : public RankedTreeBase, public std::Components < PrefixRankedNonlinearPattern, std::ranked_symbol < >, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > { - std::vector < std::ranked_symbol < > > m_Data; +template < class SymbolType, class RankType > +class PrefixRankedNonlinearPattern : public RankedTreeBase, public std::Components < PrefixRankedNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > { + std::vector < std::ranked_symbol < SymbolType, RankType > > m_Data; - static std::vector < std::ranked_symbol < > > toPrefixRanked ( const std::tree < std::ranked_symbol < > > & tree ); + static std::vector < std::ranked_symbol < SymbolType, RankType > > toPrefixRanked ( const std::tree < std::ranked_symbol < SymbolType, RankType > > & tree ); public: - explicit PrefixRankedNonlinearPattern ( std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::set < std::ranked_symbol < > > alphabet, std::vector < std::ranked_symbol < > > data ); - explicit PrefixRankedNonlinearPattern ( std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::vector < std::ranked_symbol < > > data ); - explicit PrefixRankedNonlinearPattern ( std::ranked_symbol < > subtreeWildcard, std::vector < std::ranked_symbol < > > data ); + explicit PrefixRankedNonlinearPattern ( std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables, std::set < std::ranked_symbol < SymbolType, RankType > > alphabet, std::vector < std::ranked_symbol < SymbolType, RankType > > data ); + explicit PrefixRankedNonlinearPattern ( std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables, std::vector < std::ranked_symbol < SymbolType, RankType > > data ); + explicit PrefixRankedNonlinearPattern ( std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::vector < std::ranked_symbol < SymbolType, RankType > > data ); explicit PrefixRankedNonlinearPattern ( const PrefixRankedTree < > & tree ); explicit PrefixRankedNonlinearPattern ( const PrefixRankedPattern < > & tree ); explicit PrefixRankedNonlinearPattern ( const RankedTree < > & tree ); @@ -49,27 +59,27 @@ public: /** * @return List of symbols forming tree (const version). */ - const std::vector < std::ranked_symbol < > > & getContent ( ) const; + const std::vector < std::ranked_symbol < SymbolType, RankType > > & getContent ( ) const; - const std::set < std::ranked_symbol < > > & getAlphabet ( ) const { - return accessComponent < GeneralAlphabet > ( ).get ( ); + const std::set < std::ranked_symbol < SymbolType, RankType > > & getAlphabet ( ) const { + return this->template accessComponent < GeneralAlphabet > ( ).get ( ); } - void extendAlphabet ( const std::set < std::ranked_symbol < > > & symbols ) { - accessComponent < GeneralAlphabet > ( ).add ( symbols ); + void extendAlphabet ( const std::set < std::ranked_symbol < SymbolType, RankType > > & symbols ) { + this->template accessComponent < GeneralAlphabet > ( ).add ( symbols ); } - const std::ranked_symbol < > & getSubtreeWildcard ( ) const { - return accessElement < SubtreeWildcard > ( ).get ( ); + const std::ranked_symbol < SymbolType, RankType > & getSubtreeWildcard ( ) const { + return this->template accessElement < SubtreeWildcard > ( ).get ( ); } - const std::set < std::ranked_symbol < > > & getNonlinearVariables ( ) const { - return accessComponent < NonlinearAlphabet > ( ).get ( ); + const std::set < std::ranked_symbol < SymbolType, RankType > > & getNonlinearVariables ( ) const { + return this->template accessComponent < NonlinearAlphabet > ( ).get ( ); } - void setContent ( std::vector < std::ranked_symbol < > > data ); + void setContent ( std::vector < std::ranked_symbol < SymbolType, RankType > > data ); - void arityChecksum ( const std::vector < std::ranked_symbol < > > & data ); + void arityChecksum ( const std::vector < std::ranked_symbol < SymbolType, RankType > > & data ); /** * @return true if tree is an empty word (vector length is 0) @@ -101,57 +111,210 @@ public: } /* namespace tree */ +#include "PrefixRankedTree.h" +#include "PrefixRankedPattern.h" +#include "RankedTree.h" +#include "RankedPattern.h" +#include "RankedNonlinearPattern.h" + +namespace tree { + +template < class SymbolType, class RankType > +PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables, std::set < std::ranked_symbol < SymbolType, RankType > > alphabet, std::vector < std::ranked_symbol < SymbolType, RankType > > data ) : std::Components < PrefixRankedNonlinearPattern, std::ranked_symbol < SymbolType, RankType >, std::tuple < GeneralAlphabet, NonlinearAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ) ), std::make_tuple ( subtreeWildcard ) ) { + setContent ( std::move ( data ) ); +} + +template < class SymbolType, class RankType > +PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables, std::vector < std::ranked_symbol < SymbolType, RankType > > data ) : PrefixRankedNonlinearPattern ( subtreeWildcard, nonlinearVariables, std::set < std::ranked_symbol < SymbolType, RankType > > ( data.begin ( ), data.end ( ) ) + std::set < std::ranked_symbol < SymbolType, RankType > > { subtreeWildcard } + nonlinearVariables, data ) { +} + +template < class SymbolType, class RankType > +PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::vector < std::ranked_symbol < SymbolType, RankType > > data ) : PrefixRankedNonlinearPattern ( subtreeWildcard, {}, std::set < std::ranked_symbol < SymbolType, RankType > > ( data.begin ( ), data.end ( ) ) + std::set < std::ranked_symbol < SymbolType, RankType > > { subtreeWildcard }, data ) { +} + +template < class SymbolType, class RankType > +PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const PrefixRankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ), tree.getContent ( ) ) { +} + +template < class SymbolType, class RankType > +PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const PrefixRankedPattern < > & tree ) : PrefixRankedNonlinearPattern ( tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ), tree.getContent ( ) ) { +} + +template < class SymbolType, class RankType > +PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) { +} + +template < class SymbolType, class RankType > +PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const RankedPattern < > & tree ) : PrefixRankedNonlinearPattern ( tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) { +} + +template < class SymbolType, class RankType > +PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const RankedNonlinearPattern < > & tree ) : PrefixRankedNonlinearPattern ( tree.getSubtreeWildcard ( ), tree.getNonlinearVariables ( ), tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) { +} + +template < class SymbolType, class RankType > +std::vector < std::ranked_symbol < SymbolType, RankType > > PrefixRankedNonlinearPattern < SymbolType, RankType >::toPrefixRanked ( const std::tree < std::ranked_symbol < SymbolType, RankType > > & tree ) { + std::vector < std::ranked_symbol < SymbolType, RankType > > res; + + for ( typename std::tree < std::ranked_symbol < SymbolType, RankType > >::const_prefix_iterator iter = tree.prefix_begin ( ); iter != tree.prefix_end ( ); ++iter ) + res.push_back ( * iter ); + + return res; +} + +template < class SymbolType, class RankType > +RankedTreeBase * PrefixRankedNonlinearPattern < SymbolType, RankType >::clone ( ) const { + return new PrefixRankedNonlinearPattern ( * this ); +} + +template < class SymbolType, class RankType > +RankedTreeBase * PrefixRankedNonlinearPattern < SymbolType, RankType >::plunder ( ) && { + return new PrefixRankedNonlinearPattern ( std::move ( * this ) ); +} + +template < class SymbolType, class RankType > +const std::vector < std::ranked_symbol < SymbolType, RankType > > & PrefixRankedNonlinearPattern < SymbolType, RankType >::getContent ( ) const { + return this->m_Data; +} + +template < class SymbolType, class RankType > +void PrefixRankedNonlinearPattern < SymbolType, RankType >::setContent ( std::vector < std::ranked_symbol < SymbolType, RankType > > data ) { + arityChecksum ( data ); + + std::set < std::ranked_symbol < SymbolType, RankType > > minimalAlphabet ( data.begin ( ), data.end ( ) ); + std::set < std::ranked_symbol < SymbolType, RankType > > unknownSymbols; + std::set_difference ( minimalAlphabet.begin ( ), minimalAlphabet.end ( ), getAlphabet ( ).begin ( ), getAlphabet ( ).end ( ), std::inserter ( unknownSymbols, unknownSymbols.end ( ) ) ); + + if ( unknownSymbols.size ( ) > 0 ) + throw TreeException ( "Input symbols not in the alphabet." ); + + this->m_Data = std::move ( data ); +} + +template < class SymbolType, class RankType > +void PrefixRankedNonlinearPattern < SymbolType, RankType >::arityChecksum ( const std::vector < std::ranked_symbol < SymbolType, RankType > > & data ) { + int arityChecksum = 1; + + for ( const std::ranked_symbol < SymbolType, RankType > & symbol : data ) { + arityChecksum += symbol.getRank ( ).getData ( ); + arityChecksum -= 1; + } + + if ( arityChecksum != 0 ) throw TreeException ( "The string does not form a tree" ); +} + +template < class SymbolType, class RankType > +bool PrefixRankedNonlinearPattern < SymbolType, RankType >::isEmpty ( ) const { + return this->m_Data.size ( ) == 0; +} + +template < class SymbolType, class RankType > +int PrefixRankedNonlinearPattern < SymbolType, RankType >::compare ( const PrefixRankedNonlinearPattern & other ) const { + auto first = std::tie ( m_Data, getAlphabet ( ), getSubtreeWildcard ( ), getNonlinearVariables ( ) ); + auto second = std::tie ( other.m_Data, other.getAlphabet ( ), other.getSubtreeWildcard ( ), other.getNonlinearVariables ( ) ); + + std::compare < decltype ( first ) > comp; + + return comp ( first, second ); +} + +template < class SymbolType, class RankType > +void PrefixRankedNonlinearPattern < SymbolType, RankType >::operator >>( std::ostream & out ) const { + out << "(PrefixRankedNonlinearPattern "; + + for ( const std::ranked_symbol < SymbolType, RankType > & symbol : this->m_Data ) + out << symbol; + + out << ")"; +} + +template < class SymbolType, class RankType > +PrefixRankedNonlinearPattern < SymbolType, RankType >::operator std::string ( ) const { + std::stringstream ss; + ss << "\""; + + for ( const std::ranked_symbol < SymbolType, RankType > & symbol : this->m_Data ) + ss << symbol; + + ss << "\""; + return std::move ( ss ).str ( ); +} + +template < class SymbolType, class RankType > +PrefixRankedNonlinearPattern < SymbolType, RankType > PrefixRankedNonlinearPattern < SymbolType, RankType >::parse ( std::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, PrefixRankedNonlinearPattern::getXmlTagName ( ) ); + std::ranked_symbol < SymbolType, RankType > subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardRawRankedSymbol ( input ); + std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables = TreeFromXMLParser::parseRankedNonlinearVariables ( input ); + std::set < std::ranked_symbol < SymbolType, RankType > > rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet ( input ); + std::vector < std::ranked_symbol < SymbolType, RankType > > data = TreeFromXMLParser::parseRankedLinearContent ( input ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, PrefixRankedNonlinearPattern::getXmlTagName ( ) ); + + return PrefixRankedNonlinearPattern < SymbolType, RankType > ( std::move ( subtreeWildcardSymbol ), std::move ( nonlinearVariables ), std::move ( rankedAlphabet ), std::move ( data ) ); +} + +template < class SymbolType, class RankType > +void PrefixRankedNonlinearPattern < SymbolType, RankType >::compose ( std::deque < sax::Token > & out ) const { + out.emplace_back ( PrefixRankedNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard ( ) ); + TreeToXMLComposer::composeNonlinearVariables ( out, getNonlinearVariables ( ) ); + TreeToXMLComposer::composeAlphabet ( out, getAlphabet ( ) ); + TreeToXMLComposer::composeContent ( out, m_Data ); + out.emplace_back ( PrefixRankedNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace tree */ + namespace std { -template < > -class ComponentConstraint< ::tree::PrefixRankedNonlinearPattern, std::ranked_symbol < >, ::tree::GeneralAlphabet > { +template < class SymbolType, class RankType > +class ComponentConstraint< ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::GeneralAlphabet > { public: - static bool used ( const ::tree::PrefixRankedNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) { - const std::vector < std::ranked_symbol < > > & content = pattern.getContent ( ); + static bool used ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) { + const std::vector < std::ranked_symbol < SymbolType, RankType > > & content = pattern.getContent ( ); - return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol; + return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.template accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol; } - static bool available ( const ::tree::PrefixRankedNonlinearPattern &, const std::ranked_symbol < > & ) { + static bool available ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) { return true; } - static void valid ( const ::tree::PrefixRankedNonlinearPattern &, const std::ranked_symbol < > & ) { + static void valid ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) { } }; -template < > -class ComponentConstraint< ::tree::PrefixRankedNonlinearPattern, std::ranked_symbol < >, ::tree::NonlinearAlphabet > { +template < class SymbolType, class RankType > +class ComponentConstraint< ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::NonlinearAlphabet > { public: - static bool used ( const ::tree::PrefixRankedNonlinearPattern &, const std::ranked_symbol < > & ) { + static bool used ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) { return false; } - static bool available ( const ::tree::PrefixRankedNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) { - return pattern.accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); + static bool available ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) { + return pattern.template accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); } - static void valid ( const ::tree::PrefixRankedNonlinearPattern & pattern, const std::ranked_symbol < > & symbol) { + static void valid ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol) { if ( symbol.getRank ( ).getData ( ) != 0 ) throw ::tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" ); - if ( pattern.accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol ) + if ( pattern.template accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol ) throw ::tree::TreeException ( "Symbol " + std::to_string ( symbol ) + "cannot be set as nonlinear variable since it is already subtree wildcard" ); } }; -template < > -class ElementConstraint< ::tree::PrefixRankedNonlinearPattern, std::ranked_symbol < >, ::tree::SubtreeWildcard > { +template < class SymbolType, class RankType > +class ElementConstraint< ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::SubtreeWildcard > { public: - static bool available ( const ::tree::PrefixRankedNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) { - return pattern.accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); + static bool available ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) { + return pattern.template accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); } - static void valid ( const ::tree::PrefixRankedNonlinearPattern & pattern, const std::ranked_symbol < > & symbol) { + static void valid ( const ::tree::PrefixRankedNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol) { if ( symbol.getRank ( ).getData ( ) != 0 ) throw ::tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" ); - if ( pattern.accessComponent < ::tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) ) + if ( pattern.template accessComponent < ::tree::NonlinearAlphabet > ( ).get ( ).count ( symbol ) ) throw ::tree::TreeException ( "Symbol " + std::to_string ( symbol ) + "cannot be set as subtree wildcard since it is already nonlinear variable" ); } }; -- GitLab