From 3cb2723e1f6ed71c0bdb644674aabefc9eb12169 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Tue, 11 Oct 2016 11:17:27 +0200 Subject: [PATCH] template PrefixRankedBarNonlinearPattern tree --- .../arbology/exact/BadCharacterShiftTable.cpp | 6 +- .../arbology/exact/BadCharacterShiftTable.h | 2 +- .../src/arbology/exact/BoyerMooreHorspool.cpp | 4 +- .../src/arbology/exact/BoyerMooreHorspool.h | 2 +- .../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 + .../PrefixRankedBarNonlinearPattern.cpp | 194 +---------- .../ranked/PrefixRankedBarNonlinearPattern.h | 314 ++++++++++++++---- 15 files changed, 286 insertions(+), 263 deletions(-) diff --git a/alib2algo/src/arbology/exact/BadCharacterShiftTable.cpp b/alib2algo/src/arbology/exact/BadCharacterShiftTable.cpp index 2020a16611..855ac5eab1 100644 --- a/alib2algo/src/arbology/exact/BadCharacterShiftTable.cpp +++ b/alib2algo/src/arbology/exact/BadCharacterShiftTable.cpp @@ -19,12 +19,12 @@ std::map < std::ranked_symbol < >, size_t > BadCharacterShiftTable::bcs ( const } std::map < std::ranked_symbol < >, size_t > BadCharacterShiftTable::bcs ( const tree::PrefixRankedBarPattern < > & pattern ) { - return bcs ( tree::PrefixRankedBarNonlinearPattern ( pattern ) ); + return bcs ( tree::PrefixRankedBarNonlinearPattern < > ( pattern ) ); } auto BadCharacterShiftTablePrefixRankedBarPattern = BadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarPattern < > > ( BadCharacterShiftTable::bcs ); -std::map < std::ranked_symbol < >, size_t > BadCharacterShiftTable::bcs ( const tree::PrefixRankedBarNonlinearPattern & pattern ) { +std::map < std::ranked_symbol < >, size_t > BadCharacterShiftTable::bcs ( const tree::PrefixRankedBarNonlinearPattern < > & pattern ) { const std::set < std::ranked_symbol < > > & alphabet = pattern.getAlphabet ( ); std::map < std::ranked_symbol < >, size_t > bcs; @@ -78,7 +78,7 @@ std::map < std::ranked_symbol < >, size_t > BadCharacterShiftTable::bcs ( const return bcs; } -auto BadCharacterShiftTablePrefixRankedBarNonlinearPattern = BadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarNonlinearPattern > ( BadCharacterShiftTable::bcs ); +auto BadCharacterShiftTablePrefixRankedBarNonlinearPattern = BadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarNonlinearPattern < > > ( BadCharacterShiftTable::bcs ); } /* namespace exact */ diff --git a/alib2algo/src/arbology/exact/BadCharacterShiftTable.h b/alib2algo/src/arbology/exact/BadCharacterShiftTable.h index f33aa278d1..d9fc81adb9 100644 --- a/alib2algo/src/arbology/exact/BadCharacterShiftTable.h +++ b/alib2algo/src/arbology/exact/BadCharacterShiftTable.h @@ -33,7 +33,7 @@ public: static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::RankedTreeWrapper & pattern ); 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::PrefixRankedBarNonlinearPattern < > & pattern ); }; diff --git a/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp b/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp index 4e65daebb1..90d4d1f7ea 100644 --- a/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp +++ b/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp @@ -75,7 +75,7 @@ std::set < unsigned > BoyerMooreHorspool::match ( const tree::PrefixRankedBarTre auto BoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarPattern = BoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( BoyerMooreHorspool::match ); -std::set < unsigned > BoyerMooreHorspool::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern & pattern ) { +std::set < unsigned > BoyerMooreHorspool::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern < > & pattern ) { std::set < unsigned > occ; std::map < std::ranked_symbol < >, size_t > bcs = BadCharacterShiftTable::bcs ( pattern ); //NOTE: the subjects alphabet must be a subset or equal to the pattern std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject ); @@ -131,7 +131,7 @@ std::set < unsigned > BoyerMooreHorspool::match ( const tree::PrefixRankedBarTre return occ; } -auto BoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarNonlinearPattern = BoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern > ( BoyerMooreHorspool::match ); +auto BoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarNonlinearPattern = BoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern < > > ( BoyerMooreHorspool::match ); } /* namespace exact */ diff --git a/alib2algo/src/arbology/exact/BoyerMooreHorspool.h b/alib2algo/src/arbology/exact/BoyerMooreHorspool.h index 72d16c5ad6..be6136aead 100644 --- a/alib2algo/src/arbology/exact/BoyerMooreHorspool.h +++ b/alib2algo/src/arbology/exact/BoyerMooreHorspool.h @@ -30,7 +30,7 @@ public: static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarTree < > & 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 ); + static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern < > & pattern ); }; diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp index f2ad448336..1d7b5f91a2 100644 --- a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp +++ b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp @@ -234,7 +234,7 @@ std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedBarTree auto ExactPatternMatchPrefixRankedBarPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( ExactPatternMatch::match ); -std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern & pattern ) { +std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern < > & pattern ) { std::vector < int > subjectSubtreeJumpTable = SubtreeJumpTable::compute ( subject ); std::map < std::ranked_symbol < >, alphabet::Symbol > variablesSetting; @@ -275,7 +275,7 @@ std::set < unsigned > ExactPatternMatch::match ( const tree::PrefixRankedBarTree return occ; } -auto ExactPatternMatchPrefixRankedBarNonlinearPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern > ( ExactPatternMatch::match ); +auto ExactPatternMatchPrefixRankedBarNonlinearPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern < > > ( ExactPatternMatch::match ); } /* namespace exact */ diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.h b/alib2algo/src/arbology/exact/ExactPatternMatch.h index 09a9ea162a..41c5ac054f 100644 --- a/alib2algo/src/arbology/exact/ExactPatternMatch.h +++ b/alib2algo/src/arbology/exact/ExactPatternMatch.h @@ -37,7 +37,7 @@ public: 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 ); + static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern < > & pattern ); private: static bool matchHelper ( const std::tree < alphabet::Symbol > & subject, const std::tree < alphabet::Symbol > & pattern, const alphabet::Symbol & subtreeVariable ); diff --git a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp index 4fb5eebb81..056b9fa245 100644 --- a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp +++ b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp @@ -21,12 +21,12 @@ std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs } std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs ( const tree::PrefixRankedBarPattern < > & pattern ) { - return bcs ( tree::PrefixRankedBarNonlinearPattern ( pattern ) ); + return bcs ( tree::PrefixRankedBarNonlinearPattern < > ( pattern ) ); } auto ReversedBadCharacterShiftTablePrefixRankedBarPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarPattern < > > ( ReversedBadCharacterShiftTable::bcs ); -std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs ( const tree::PrefixRankedBarNonlinearPattern & pattern ) { +std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs ( const tree::PrefixRankedBarNonlinearPattern < > & pattern ) { const std::set < std::ranked_symbol < > > & alphabet = pattern.getAlphabet ( ); std::map < std::ranked_symbol < >, size_t > bcs; @@ -80,7 +80,7 @@ std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs return bcs; } -auto ReversedBadCharacterShiftTablePrefixRankedBarNonlinearPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarNonlinearPattern > ( 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 ) ); diff --git a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h index df1e9df914..4bd37d117b 100644 --- a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h +++ b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.h @@ -33,7 +33,7 @@ public: static std::map < std::ranked_symbol < >, size_t > bcs ( const tree::RankedTreeWrapper & pattern ); 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::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 ); diff --git a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp index 9feef4ebe9..7d7574f9c4 100644 --- a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp +++ b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp @@ -78,7 +78,7 @@ std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRank auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( ReversedBoyerMooreHorspool::match ); -std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern & pattern ) { +std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarNonlinearPattern < > & 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 ); @@ -134,7 +134,7 @@ std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRank return occ; } -auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarNonlinearPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern > ( ReversedBoyerMooreHorspool::match ); +auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarNonlinearPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern < > > ( ReversedBoyerMooreHorspool::match ); std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedTree < > & pattern ) { return match ( subject, tree::PrefixRankedPattern < > ( pattern ) ); diff --git a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h index 51028ea72f..2d2f0d3c6e 100644 --- a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h +++ b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.h @@ -30,7 +30,7 @@ public: static std::set < unsigned > match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarTree < > & 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 ); + 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 ); diff --git a/alib2data/src/string/LinearString.cpp b/alib2data/src/string/LinearString.cpp index 4ce1aa42fd..86e5bf6112 100644 --- a/alib2data/src/string/LinearString.cpp +++ b/alib2data/src/string/LinearString.cpp @@ -23,7 +23,7 @@ auto LinearStringFromPrefixRankedPattern = castApi::CastRegister < string::Linea 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 > ( ); +auto LinearStringFromPrefixRankedBarNonlinearPattern = castApi::CastRegister < string::LinearString < >, tree::PrefixRankedBarNonlinearPattern < > > ( ); auto LinearStringFromPrefixBarTree = castApi::CastRegister < string::LinearString < >, tree::PrefixBarTree < > > ( ); auto LinearStringCastBinder = castApi::CastPoolStringBinder < string::LinearString < > > ( string::LinearString < >::getXmlTagName() ); diff --git a/alib2data/src/string/LinearString.h b/alib2data/src/string/LinearString.h index 1d1523d297..c24ec7dec1 100644 --- a/alib2data/src/string/LinearString.h +++ b/alib2data/src/string/LinearString.h @@ -44,7 +44,7 @@ public: explicit LinearString ( const tree::PrefixRankedNonlinearPattern < > & tree ); explicit LinearString ( const tree::PrefixRankedBarTree < > & tree ); explicit LinearString ( const tree::PrefixRankedBarPattern < > & tree ); - explicit LinearString ( const tree::PrefixRankedBarNonlinearPattern & tree ); + explicit LinearString ( const tree::PrefixRankedBarNonlinearPattern < > & tree ); explicit LinearString ( const tree::PrefixBarTree < SymbolType > & tree ); explicit LinearString ( std::set < SymbolType > alphabet, std::vector < SymbolType > data ); explicit LinearString ( std::vector < SymbolType > data ); @@ -163,7 +163,7 @@ LinearString < SymbolType >::LinearString ( const tree::PrefixRankedBarPattern < } template < class SymbolType > -LinearString < SymbolType >::LinearString ( const tree::PrefixRankedBarNonlinearPattern & tree ) : LinearString ( StringAuxiliary::wrapSymbols ( tree.getAlphabet ( ) ), StringAuxiliary::wrapSymbols ( tree.getContent ( ) ) ) { +LinearString < SymbolType >::LinearString ( const tree::PrefixRankedBarNonlinearPattern < > & 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 838b1e8f14..5d36e7e644 100644 --- a/alib2data/src/tree/TreeFeatures.h +++ b/alib2data/src/tree/TreeFeatures.h @@ -47,6 +47,7 @@ template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsi class PrefixRankedNonlinearPattern; template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsigned > class PrefixRankedBarPattern; +template < class SymbolType = alphabet::Symbol, class RankType = primitive::Unsigned > class PrefixRankedBarNonlinearPattern; template < class SymbolType = alphabet::Symbol > class UnrankedTree; diff --git a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp index b93b0e4913..eb0ff1e9d4 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.cpp @@ -6,199 +6,23 @@ */ #include "PrefixRankedBarNonlinearPattern.h" - -#include <sstream> -#include <algorithm> -#include <deque> - -#include "PrefixRankedBarTree.h" -#include "PrefixRankedBarPattern.h" -#include "RankedTree.h" -#include "RankedPattern.h" -#include "RankedNonlinearPattern.h" - -#include <sax/FromXMLParserHelper.h> -#include "../common/TreeFromXMLParser.h" -#include "../common/TreeToXMLComposer.h" -#include "../common/TreeAuxiliary.h" #include "../Tree.h" #include "../RankedTreeWrapper.h" #include <object/Object.h> #include <core/xmlApi.hpp> #include <core/castApi.hpp> -#include "../../alphabet/BarSymbol.h" -#include "../../alphabet/VariablesBarSymbol.h" -#include "../../alphabet/SubtreeWildcardSymbol.h" - -namespace tree { - -PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < > > bars, std::ranked_symbol < > variablesBar, std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::set < std::ranked_symbol < > > alphabet, std::vector < std::ranked_symbol < > > data ) : std::Components < PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, std::tuple < GeneralAlphabet, NonlinearAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ), std::move ( bars ) ), std::make_tuple ( std::move ( subtreeWildcard ), std::move ( variablesBar ) ) ) { - setContent ( std::move ( data ) ); -} - -PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < > > bars, std::ranked_symbol < > variablesBar, std::ranked_symbol < > subtreeWildcard, std::vector < std::ranked_symbol < > > data ) : PrefixRankedBarNonlinearPattern ( bars, variablesBar, subtreeWildcard, { }, std::set < std::ranked_symbol < > > ( data.begin ( ), data.end ( ) ) + bars + std::set < std::ranked_symbol < > > { variablesBar, subtreeWildcard }, data ) { -} - -PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < > variablesBar, const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < > > { variablesBar }, variablesBar, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < > > { variablesBar, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, toPrefixRankedBar ( tree.getContent ( ), alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, barBase, variablesBar ) ) { -} - -PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < > variablesBar, const RankedPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < > > { variablesBar }, variablesBar, tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < > > { variablesBar, tree.getSubtreeWildcard ( ) }, toPrefixRankedBar ( tree.getContent ( ), tree.getSubtreeWildcard ( ), { }, barBase, variablesBar ) ) { -} - -PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < > variablesBar, const RankedNonlinearPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < > > { variablesBar }, variablesBar, tree.getSubtreeWildcard ( ), tree.getNonlinearVariables ( ), tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < > > { variablesBar, tree.getSubtreeWildcard ( ) } + tree.getNonlinearVariables ( ), toPrefixRankedBar ( tree.getContent ( ), tree.getSubtreeWildcard ( ), tree.getNonlinearVariables ( ), barBase, variablesBar ) ) { -} - -PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( const PrefixRankedBarTree < > & tree ) : PrefixRankedBarNonlinearPattern ( tree.getBars ( ) + std::set < std::ranked_symbol < > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL }, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ) + std::set < std::ranked_symbol < > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, tree.getContent ( ) ) { -} - -PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( const PrefixRankedBarPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( tree.getBars ( ), tree.getVariablesBar ( ), tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ), tree.getContent ( ) ) { -} - -PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) { -} - -PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( const RankedPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) { -} - -PrefixRankedBarNonlinearPattern::PrefixRankedBarNonlinearPattern ( const RankedNonlinearPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) { -} - -std::vector < std::ranked_symbol < > > PrefixRankedBarNonlinearPattern::toPrefixRankedBar ( const std::tree < std::ranked_symbol < > > & tree, const std::ranked_symbol < > & subtreeWildcard, const std::set < std::ranked_symbol < > > & nonlinearVariables, const alphabet::Symbol & barBase, const std::ranked_symbol < > & variablesBar ) { - std::vector < std::ranked_symbol < > > res; - - for ( std::tree < std::ranked_symbol < > >::const_structure_iterator iter = tree.structure_begin ( ); iter != tree.structure_end ( ); ++iter ) - if ( iter.getVirtual ( ) ) - if ( ( * iter == subtreeWildcard ) || nonlinearVariables.count ( * iter ) ) - res.push_back ( variablesBar ); - else - res.push_back ( std::ranked_symbol < > ( barBase, iter->getRank ( ) ) ); - else - res.push_back ( * iter ); - - return res; -} - -RankedTreeBase * PrefixRankedBarNonlinearPattern::clone ( ) const { - return new PrefixRankedBarNonlinearPattern ( * this ); -} - -RankedTreeBase * PrefixRankedBarNonlinearPattern::plunder ( ) && { - return new PrefixRankedBarNonlinearPattern ( std::move ( * this ) ); -} - -const std::vector < std::ranked_symbol < > > & PrefixRankedBarNonlinearPattern::getContent ( ) const { - return this->m_Data; -} - -void PrefixRankedBarNonlinearPattern::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 PrefixRankedBarNonlinearPattern::arityChecksum ( const std::vector < std::ranked_symbol < > > & data ) { - int arityChecksumTerminals = 1; - int arityChecksumBars = 1; - int arityChecksumTypes = 0; - - for ( const std::ranked_symbol < > & symbol : data ) { - if ( getBars ( ).count ( symbol ) || ( symbol == getVariablesBar ( ) ) ) { - arityChecksumBars += symbol.getRank ( ).getData ( ); - arityChecksumBars -= 1; - arityChecksumTypes -= 1; - } else { - arityChecksumTerminals += symbol.getRank ( ).getData ( ); - arityChecksumTerminals -= 1; - arityChecksumTypes += 1; - } - } - - if ( ( arityChecksumTerminals != 0 ) || ( arityChecksumBars != 0 ) || ( arityChecksumTypes != 0 ) ) throw TreeException ( "The string does not form a tree" ); - - for ( unsigned i = 1; i < data.size ( ); ++i ) - if ( ( data[i - 1] == getSubtreeWildcard ( ) ) && ( data[i] != getVariablesBar ( ) ) ) - throw TreeException ( "Inconsystency of SubtreeWildcard and variablesBar" ); - -} - -bool PrefixRankedBarNonlinearPattern::isEmpty ( ) const { - return this->m_Data.size ( ) == 0; -} - -int PrefixRankedBarNonlinearPattern::compare ( const PrefixRankedBarNonlinearPattern & other ) const { - auto first = std::tie ( m_Data, getAlphabet ( ), getSubtreeWildcard ( ), getNonlinearVariables ( ), getBars ( ), getVariablesBar ( ) ); - auto second = std::tie ( other.m_Data, other.getAlphabet ( ), other.getSubtreeWildcard ( ), other.getNonlinearVariables ( ), other.getBars ( ), other.getVariablesBar ( ) ); - - std::compare < decltype ( first ) > comp; - - return comp ( first, second ); -} - -void PrefixRankedBarNonlinearPattern::operator >>( std::ostream & out ) const { - out << "(PrefixRankedBarNonlinearPattern "; - - for ( const std::ranked_symbol < > & symbol : this->m_Data ) - out << symbol; - - out << ")"; -} - -PrefixRankedBarNonlinearPattern::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 ( ); -} - -PrefixRankedBarNonlinearPattern PrefixRankedBarNonlinearPattern::parse ( std::deque < sax::Token >::iterator & input ) { - sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, PrefixRankedBarNonlinearPattern::getXmlTagName ( ) ); - std::set < std::ranked_symbol < > > bars = TreeFromXMLParser::parseBars ( input ); - std::ranked_symbol < > variablesBarSymbol = TreeFromXMLParser::parseRankedVariablesBar ( input ); - 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, PrefixRankedBarNonlinearPattern::getXmlTagName ( ) ); - - return PrefixRankedBarNonlinearPattern ( std::move ( bars ), std::move ( variablesBarSymbol ), std::move ( subtreeWildcardSymbol ), std::move ( nonlinearVariables ), std::move ( rankedAlphabet ), std::move ( data ) ); -} - -void PrefixRankedBarNonlinearPattern::compose ( std::deque < sax::Token > & out ) const { - out.emplace_back ( PrefixRankedBarNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); - TreeToXMLComposer::composeBars ( out, getBars ( ) ); - TreeToXMLComposer::composeVariablesBar ( out, getVariablesBar ( ) ); - TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard ( ) ); - TreeToXMLComposer::composeNonlinearVariables ( out, getNonlinearVariables ( ) ); - TreeToXMLComposer::composeAlphabet ( out, getAlphabet ( ) ); - TreeToXMLComposer::composeContent ( out, m_Data ); - out.emplace_back ( PrefixRankedBarNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); -} - -} /* namespace tree */ - namespace alib { -auto prefixRankedBarNonlinearPatternParserRegister = xmlApi < ::tree::Tree >::ParserRegister < ::tree::PrefixRankedBarNonlinearPattern > ( ); -auto prefixRankedBarNonlinearPatternParserRegister2 = xmlApi < ::tree::RankedTreeWrapper >::ParserRegister < ::tree::PrefixRankedBarNonlinearPattern > ( ); -auto prefixRankedBarNonlinearPatternParserRegister3 = xmlApi < alib::Object >::ParserRegister < ::tree::PrefixRankedBarNonlinearPattern > ( ); +auto prefixRankedBarNonlinearPatternParserRegister = xmlApi < ::tree::Tree >::ParserRegister < ::tree::PrefixRankedBarNonlinearPattern < > > ( ); +auto prefixRankedBarNonlinearPatternParserRegister2 = xmlApi < ::tree::RankedTreeWrapper >::ParserRegister < ::tree::PrefixRankedBarNonlinearPattern < > > ( ); +auto prefixRankedBarNonlinearPatternParserRegister3 = xmlApi < alib::Object >::ParserRegister < ::tree::PrefixRankedBarNonlinearPattern < > > ( ); -auto PrefixRankedBarNonlinearPatternFromRankedTree = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern, ::tree::RankedTree < > > ( ); -auto PrefixRankedBarNonlinearPatternFromRankedPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern, ::tree::RankedPattern < > > ( ); -auto PrefixRankedBarNonlinearPatternFromRankedNonlinearPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern, ::tree::RankedNonlinearPattern < > > ( ); -auto PrefixRankedBarNonlinearPatternFromPrefixRankedBarTree = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern, ::tree::PrefixRankedBarTree < > > ( ); -auto PrefixRankedBarNonlinearPatternFromPrefixRankedBarPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern, ::tree::PrefixRankedBarPattern < > > ( ); -auto PrefixRankedBarNonlinearPatternCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedBarNonlinearPattern > ( ::tree::PrefixRankedBarNonlinearPattern::getXmlTagName ( ) ); +auto PrefixRankedBarNonlinearPatternFromRankedTree = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::RankedTree < > > ( ); +auto PrefixRankedBarNonlinearPatternFromRankedPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::RankedPattern < > > ( ); +auto PrefixRankedBarNonlinearPatternFromRankedNonlinearPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::RankedNonlinearPattern < > > ( ); +auto PrefixRankedBarNonlinearPatternFromPrefixRankedBarTree = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::PrefixRankedBarTree < > > ( ); +auto PrefixRankedBarNonlinearPatternFromPrefixRankedBarPattern = castApi::CastRegister < ::tree::PrefixRankedBarNonlinearPattern < >, ::tree::PrefixRankedBarPattern < > > ( ); +auto PrefixRankedBarNonlinearPatternCastBinder = castApi::CastPoolStringBinder < ::tree::PrefixRankedBarNonlinearPattern < > > ( ::tree::PrefixRankedBarNonlinearPattern < >::getXmlTagName ( ) ); } /* namespace alib */ diff --git a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h index 7df108a32c..855b370849 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h +++ b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h @@ -11,12 +11,24 @@ #include <set> #include <vector> #include <tree> +#include <sstream> +#include <algorithm> +#include <deque> + +#include <sax/FromXMLParserHelper.h> #include <core/components.hpp> +#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 "../common/TreeAuxiliary.h" + +#include "../../alphabet/BarSymbol.h" +#include "../../alphabet/VariablesBarSymbol.h" +#include "../../alphabet/SubtreeWildcardSymbol.h" namespace tree { @@ -30,18 +42,19 @@ class NonlinearAlphabet; * Represents regular expression parsed from the XML. Regular expression is stored * as a tree of LinearStringElement. */ -class PrefixRankedBarNonlinearPattern : public RankedTreeBase, public std::Components < PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, std::tuple < GeneralAlphabet, NonlinearAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > { - std::vector < std::ranked_symbol < > > m_Data; +template < class SymbolType, class RankType > +class PrefixRankedBarNonlinearPattern : public RankedTreeBase, public std::Components < PrefixRankedBarNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, std::tuple < GeneralAlphabet, NonlinearAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > { + std::vector < std::ranked_symbol < SymbolType, RankType > > m_Data; - static std::vector < std::ranked_symbol < > > toPrefixRankedBar ( const std::tree < std::ranked_symbol < > > & node, const std::ranked_symbol < > & subtreeWildcard, const std::set < std::ranked_symbol < > > & nonlinearVariables, const alphabet::Symbol & barBase, const std::ranked_symbol < > & variablesBar ); + static std::vector < std::ranked_symbol < SymbolType, RankType > > toPrefixRankedBar ( const std::tree < std::ranked_symbol < SymbolType, RankType > > & node, const std::ranked_symbol < SymbolType, RankType > & subtreeWildcard, const std::set < std::ranked_symbol < SymbolType, RankType > > & nonlinearVariables, const alphabet::Symbol & barBase, const std::ranked_symbol < SymbolType, RankType > & variablesBar ); public: - explicit PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < > > bar, std::ranked_symbol < > variablesBar, std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::set < std::ranked_symbol < > > alphabet, std::vector < std::ranked_symbol < > > data ); - explicit PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < > > bar, std::ranked_symbol < > variablesBar, std::ranked_symbol < > subtreeWildcard, std::set < std::ranked_symbol < > > nonlinearVariables, std::vector < std::ranked_symbol < > > data ); - explicit PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < > > bar, std::ranked_symbol < > variablesBar, std::ranked_symbol < > subtreeWildcard, std::vector < std::ranked_symbol < > > data ); - explicit PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < > variablesBar, const RankedTree < > & tree ); - explicit PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < > variablesBar, const RankedPattern < > & tree ); - explicit PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < > variablesBar, const RankedNonlinearPattern < > & tree ); + explicit PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < SymbolType, RankType > > bar, std::ranked_symbol < SymbolType, RankType > variablesBar, 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 PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < SymbolType, RankType > > bar, std::ranked_symbol < SymbolType, RankType > variablesBar, std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::set < std::ranked_symbol < SymbolType, RankType > > nonlinearVariables, std::vector < std::ranked_symbol < SymbolType, RankType > > data ); + explicit PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < SymbolType, RankType > > bar, std::ranked_symbol < SymbolType, RankType > variablesBar, std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::vector < std::ranked_symbol < SymbolType, RankType > > data ); + explicit PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedTree < > & tree ); + explicit PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedPattern < > & tree ); + explicit PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedNonlinearPattern < > & tree ); explicit PrefixRankedBarNonlinearPattern ( const PrefixRankedBarTree < > & tree ); explicit PrefixRankedBarNonlinearPattern ( const PrefixRankedBarPattern < > & tree ); explicit PrefixRankedBarNonlinearPattern ( const RankedTree < > & tree ); @@ -54,35 +67,35 @@ 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::set < std::ranked_symbol < > > & getBars ( ) const { - return accessComponent < BarSymbols > ( ).get ( ); + const std::set < std::ranked_symbol < SymbolType, RankType > > & getBars ( ) const { + return this->template accessComponent < BarSymbols > ( ).get ( ); } - 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 ( ); } - const std::ranked_symbol < > & getVariablesBar ( ) const { - return accessElement < VariablesBarSymbol > ( ).get ( ); + const std::ranked_symbol < SymbolType, RankType > & getVariablesBar ( ) const { + return this->template accessElement < VariablesBarSymbol > ( ).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) @@ -114,86 +127,271 @@ public: } /* namespace tree */ +#include "PrefixRankedBarTree.h" +#include "PrefixRankedBarPattern.h" +#include "RankedTree.h" +#include "RankedPattern.h" +#include "RankedNonlinearPattern.h" + +namespace tree { + +template < class SymbolType, class RankType > +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < SymbolType, RankType > > bars, std::ranked_symbol < SymbolType, RankType > variablesBar, 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 < PrefixRankedBarNonlinearPattern, std::ranked_symbol < SymbolType, RankType >, std::tuple < GeneralAlphabet, NonlinearAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > ( std::make_tuple ( std::move ( alphabet ), std::move ( nonlinearVariables ), std::move ( bars ) ), std::make_tuple ( std::move ( subtreeWildcard ), std::move ( variablesBar ) ) ) { + setContent ( std::move ( data ) ); +} + +template < class SymbolType, class RankType > +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( std::set < std::ranked_symbol < SymbolType, RankType > > bars, std::ranked_symbol < SymbolType, RankType > variablesBar, std::ranked_symbol < SymbolType, RankType > subtreeWildcard, std::vector < std::ranked_symbol < SymbolType, RankType > > data ) : PrefixRankedBarNonlinearPattern ( bars, variablesBar, subtreeWildcard, { }, std::set < std::ranked_symbol < SymbolType, RankType > > ( data.begin ( ), data.end ( ) ) + bars + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar, subtreeWildcard }, data ) { +} + +template < class SymbolType, class RankType > +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar }, variablesBar, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, toPrefixRankedBar ( tree.getContent ( ), alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, barBase, variablesBar ) ) { +} + +template < class SymbolType, class RankType > +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar }, variablesBar, tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar, tree.getSubtreeWildcard ( ) }, toPrefixRankedBar ( tree.getContent ( ), tree.getSubtreeWildcard ( ), { }, barBase, variablesBar ) ) { +} + +template < class SymbolType, class RankType > +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedNonlinearPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar }, variablesBar, tree.getSubtreeWildcard ( ), tree.getNonlinearVariables ( ), tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar, tree.getSubtreeWildcard ( ) } + tree.getNonlinearVariables ( ), toPrefixRankedBar ( tree.getContent ( ), tree.getSubtreeWildcard ( ), tree.getNonlinearVariables ( ), barBase, variablesBar ) ) { +} + +template < class SymbolType, class RankType > +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const PrefixRankedBarTree < > & tree ) : PrefixRankedBarNonlinearPattern ( tree.getBars ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL }, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, tree.getContent ( ) ) { +} + +template < class SymbolType, class RankType > +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const PrefixRankedBarPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( tree.getBars ( ), tree.getVariablesBar ( ), tree.getSubtreeWildcard ( ), { }, tree.getAlphabet ( ), tree.getContent ( ) ) { +} + +template < class SymbolType, class RankType > +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) { +} + +template < class SymbolType, class RankType > +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) { +} + +template < class SymbolType, class RankType > +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedNonlinearPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) { +} + +template < class SymbolType, class RankType > +std::vector < std::ranked_symbol < SymbolType, RankType > > PrefixRankedBarNonlinearPattern < SymbolType, RankType >::toPrefixRankedBar ( const std::tree < std::ranked_symbol < SymbolType, RankType > > & tree, const std::ranked_symbol < SymbolType, RankType > & subtreeWildcard, const std::set < std::ranked_symbol < SymbolType, RankType > > & nonlinearVariables, const alphabet::Symbol & barBase, const std::ranked_symbol < SymbolType, RankType > & variablesBar ) { + std::vector < std::ranked_symbol < SymbolType, RankType > > res; + + for ( typename std::tree < std::ranked_symbol < SymbolType, RankType > >::const_structure_iterator iter = tree.structure_begin ( ); iter != tree.structure_end ( ); ++iter ) + if ( iter.getVirtual ( ) ) + if ( ( * iter == subtreeWildcard ) || nonlinearVariables.count ( * iter ) ) + res.push_back ( variablesBar ); + else + res.push_back ( std::ranked_symbol < SymbolType, RankType > ( barBase, iter->getRank ( ) ) ); + else + res.push_back ( * iter ); + + return res; +} + +template < class SymbolType, class RankType > +RankedTreeBase * PrefixRankedBarNonlinearPattern < SymbolType, RankType >::clone ( ) const { + return new PrefixRankedBarNonlinearPattern ( * this ); +} + +template < class SymbolType, class RankType > +RankedTreeBase * PrefixRankedBarNonlinearPattern < SymbolType, RankType >::plunder ( ) && { + return new PrefixRankedBarNonlinearPattern ( std::move ( * this ) ); +} + +template < class SymbolType, class RankType > +const std::vector < std::ranked_symbol < SymbolType, RankType > > & PrefixRankedBarNonlinearPattern < SymbolType, RankType >::getContent ( ) const { + return this->m_Data; +} + +template < class SymbolType, class RankType > +void PrefixRankedBarNonlinearPattern < 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 PrefixRankedBarNonlinearPattern < SymbolType, RankType >::arityChecksum ( const std::vector < std::ranked_symbol < SymbolType, RankType > > & data ) { + int arityChecksumTerminals = 1; + int arityChecksumBars = 1; + int arityChecksumTypes = 0; + + for ( const std::ranked_symbol < SymbolType, RankType > & symbol : data ) { + if ( getBars ( ).count ( symbol ) || ( symbol == getVariablesBar ( ) ) ) { + arityChecksumBars += symbol.getRank ( ).getData ( ); + arityChecksumBars -= 1; + arityChecksumTypes -= 1; + } else { + arityChecksumTerminals += symbol.getRank ( ).getData ( ); + arityChecksumTerminals -= 1; + arityChecksumTypes += 1; + } + } + + if ( ( arityChecksumTerminals != 0 ) || ( arityChecksumBars != 0 ) || ( arityChecksumTypes != 0 ) ) throw TreeException ( "The string does not form a tree" ); + + for ( unsigned i = 1; i < data.size ( ); ++i ) + if ( ( data[i - 1] == getSubtreeWildcard ( ) ) && ( data[i] != getVariablesBar ( ) ) ) + throw TreeException ( "Inconsystency of SubtreeWildcard and variablesBar" ); + +} + +template < class SymbolType, class RankType > +bool PrefixRankedBarNonlinearPattern < SymbolType, RankType >::isEmpty ( ) const { + return this->m_Data.size ( ) == 0; +} + +template < class SymbolType, class RankType > +int PrefixRankedBarNonlinearPattern < SymbolType, RankType >::compare ( const PrefixRankedBarNonlinearPattern & other ) const { + auto first = std::tie ( m_Data, getAlphabet ( ), getSubtreeWildcard ( ), getNonlinearVariables ( ), getBars ( ), getVariablesBar ( ) ); + auto second = std::tie ( other.m_Data, other.getAlphabet ( ), other.getSubtreeWildcard ( ), other.getNonlinearVariables ( ), other.getBars ( ), other.getVariablesBar ( ) ); + + std::compare < decltype ( first ) > comp; + + return comp ( first, second ); +} + +template < class SymbolType, class RankType > +void PrefixRankedBarNonlinearPattern < SymbolType, RankType >::operator >>( std::ostream & out ) const { + out << "(PrefixRankedBarNonlinearPattern "; + + for ( const std::ranked_symbol < SymbolType, RankType > & symbol : this->m_Data ) + out << symbol; + + out << ")"; +} + +template < class SymbolType, class RankType > +PrefixRankedBarNonlinearPattern < 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 > +PrefixRankedBarNonlinearPattern < SymbolType, RankType > PrefixRankedBarNonlinearPattern < SymbolType, RankType >::parse ( std::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, PrefixRankedBarNonlinearPattern::getXmlTagName ( ) ); + std::set < std::ranked_symbol < SymbolType, RankType > > bars = TreeFromXMLParser::parseBars ( input ); + std::ranked_symbol < SymbolType, RankType > variablesBarSymbol = TreeFromXMLParser::parseRankedVariablesBar ( input ); + 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, PrefixRankedBarNonlinearPattern::getXmlTagName ( ) ); + + return PrefixRankedBarNonlinearPattern < SymbolType, RankType > ( std::move ( bars ), std::move ( variablesBarSymbol ), std::move ( subtreeWildcardSymbol ), std::move ( nonlinearVariables ), std::move ( rankedAlphabet ), std::move ( data ) ); +} + +template < class SymbolType, class RankType > +void PrefixRankedBarNonlinearPattern < SymbolType, RankType >::compose ( std::deque < sax::Token > & out ) const { + out.emplace_back ( PrefixRankedBarNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::START_ELEMENT ); + TreeToXMLComposer::composeBars ( out, getBars ( ) ); + TreeToXMLComposer::composeVariablesBar ( out, getVariablesBar ( ) ); + TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard ( ) ); + TreeToXMLComposer::composeNonlinearVariables ( out, getNonlinearVariables ( ) ); + TreeToXMLComposer::composeAlphabet ( out, getAlphabet ( ) ); + TreeToXMLComposer::composeContent ( out, m_Data ); + out.emplace_back ( PrefixRankedBarNonlinearPattern::getXmlTagName ( ), sax::Token::TokenType::END_ELEMENT ); +} + +} /* namespace tree */ + namespace std { -template < > -class ComponentConstraint< ::tree::PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, ::tree::GeneralAlphabet > { +template < class SymbolType, class RankType > +class ComponentConstraint< ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::GeneralAlphabet > { public: - static bool used ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) { - const std::vector < std::ranked_symbol < > > & content = pattern.getContent ( ); + static bool used ( const ::tree::PrefixRankedBarNonlinearPattern < 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::VariablesBarSymbol > ( ).get ( ) == symbol || pattern.accessComponent < ::tree::BarSymbols > ( ).get ( ).count ( symbol ) || pattern.accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol; + return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.template accessElement < ::tree::VariablesBarSymbol > ( ).get ( ) == symbol || pattern.template accessComponent < ::tree::BarSymbols > ( ).get ( ).count ( symbol ) || pattern.template accessElement < ::tree::SubtreeWildcard > ( ).get ( ) == symbol; } - static bool available ( const ::tree::PrefixRankedBarNonlinearPattern &, const std::ranked_symbol < > & ) { + static bool available ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) { return true; } - static void valid ( const ::tree::PrefixRankedBarNonlinearPattern &, const std::ranked_symbol < > & ) { + static void valid ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) { } }; -template < > -class ComponentConstraint< ::tree::PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, ::tree::BarSymbols > { +template < class SymbolType, class RankType > +class ComponentConstraint< ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::BarSymbols > { public: - static bool used ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) { - const std::vector < std::ranked_symbol < > > & content = pattern.getContent ( ); + static bool used ( const ::tree::PrefixRankedBarNonlinearPattern < 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::VariablesBarSymbol > ( ).get ( ) == symbol; + return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.template accessElement < ::tree::VariablesBarSymbol > ( ).get ( ) == symbol; } - static bool available ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) { - return pattern.accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); + static bool available ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) { + return pattern.template accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); } - static void valid ( const ::tree::PrefixRankedBarNonlinearPattern &, const std::ranked_symbol < > & ) { + static void valid ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) { } }; -template < > -class ComponentConstraint< ::tree::PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, ::tree::NonlinearAlphabet > { +template < class SymbolType, class RankType > +class ComponentConstraint< ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::NonlinearAlphabet > { public: - static bool used ( const ::tree::PrefixRankedBarNonlinearPattern &, const std::ranked_symbol < > & ) { + static bool used ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & ) { return false; } - static bool available ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) { - return pattern.accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); + static bool available ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) { + return pattern.template accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); } - static void valid ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol) { + static void valid ( const ::tree::PrefixRankedBarNonlinearPattern < 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::PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, ::tree::SubtreeWildcard > { +template < class SymbolType, class RankType > +class ElementConstraint< ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::SubtreeWildcard > { public: - static bool available ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) { - return pattern.accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); + static bool available ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) { + return pattern.template accessComponent < ::tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); } - static void valid ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol) { + static void valid ( const ::tree::PrefixRankedBarNonlinearPattern < 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" ); } }; -template < > -class ElementConstraint< ::tree::PrefixRankedBarNonlinearPattern, std::ranked_symbol < >, ::tree::VariablesBarSymbol > { +template < class SymbolType, class RankType > +class ElementConstraint< ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType >, std::ranked_symbol < SymbolType, RankType >, ::tree::VariablesBarSymbol > { public: - static bool available ( const ::tree::PrefixRankedBarNonlinearPattern & pattern, const std::ranked_symbol < > & symbol ) { - return pattern.accessComponent < ::tree::BarSymbols > ( ).get ( ).count ( symbol ); + static bool available ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > & pattern, const std::ranked_symbol < SymbolType, RankType > & symbol ) { + return pattern.template accessComponent < ::tree::BarSymbols > ( ).get ( ).count ( symbol ); } - static void valid ( const ::tree::PrefixRankedBarNonlinearPattern &, const std::ranked_symbol < > & symbol) { + static void valid ( const ::tree::PrefixRankedBarNonlinearPattern < SymbolType, RankType > &, const std::ranked_symbol < SymbolType, RankType > & symbol) { if ( symbol.getRank ( ).getData ( ) != 0 ) throw ::tree::TreeException ( "VariablesBarSymbol has nonzero arity" ); } -- GitLab