24 template <
class SymbolType >
27 template <
class SymbolType >
28 static void constructTail (
automaton::InputDrivenNPDA <
common::ranked_symbol < SymbolType >,
char,
ext::pair < unsigned, unsigned > > &
res,
const tree::PrefixRankedTree < SymbolType > &
tree,
const common::ranked_symbol < SymbolType > & subtreeWildcard,
const common::ranked_symbol < SymbolType > & currentNonlinearVariable,
const ext::set <
common::ranked_symbol < SymbolType > > & nonlinearVariables,
unsigned subtreeId,
bool nonlinearJumps,
typename ext::vector <
common::ranked_symbol < SymbolType > >::const_iterator rankedSymbolsIter,
unsigned i,
typename ext::vector <
common::ranked_symbol < unsigned > >::const_iterator subtreeRepeatsIter );
30 template <
class SymbolType >
33 template <
class SymbolType >
34 static void constructTail (
automaton::InputDrivenNPDA <
common::ranked_symbol < SymbolType >,
char,
ext::pair < unsigned, unsigned > > &
res,
const tree::PrefixRankedBarTree < SymbolType > &
tree,
const common::ranked_symbol < SymbolType > & subtreeWildcard,
const common::ranked_symbol < SymbolType > & currentNonlinearVariable,
const ext::set <
common::ranked_symbol < SymbolType > > & nonlinearVariables,
const common::ranked_symbol < SymbolType > & variablesBar,
unsigned subtreeId,
bool nonlinearJumps,
typename ext::vector <
common::ranked_symbol < SymbolType > >::const_iterator rankedSymbolsIter,
unsigned i,
typename ext::vector <
common::ranked_symbol < unsigned > >::const_iterator subtreeRepeatsIter );
41 template <
class SymbolType >
48 template <
class SymbolType >
52template <
class SymbolType >
53void ExactNonlinearTreePatternAutomaton::constructTail (
automaton::InputDrivenNPDA <
common::ranked_symbol < SymbolType >,
char,
ext::pair < unsigned, unsigned > > &
res,
const tree::PrefixRankedTree < SymbolType > &
tree,
const common::ranked_symbol < SymbolType > & subtreeWildcard,
const common::ranked_symbol < SymbolType > & currentNonlinearVariable,
const ext::set <
common::ranked_symbol < SymbolType > > & nonlinearVariables,
unsigned subtreeId,
bool nonlinearJumps,
typename ext::vector <
common::ranked_symbol < SymbolType > >::const_iterator rankedSymbolsIter,
unsigned i,
typename ext::vector <
common::ranked_symbol < unsigned > >::const_iterator subtreeRepeatsIter ) {
57 for (++ rankedSymbolsIter, ++ subtreeRepeatsIter, ++
i; rankedSymbolsIter !=
tree.getContent ( ).
end ( ); ++ rankedSymbolsIter, ++ subtreeRepeatsIter, ++
i ) {
60 subtreeRepeatsStack.push_back ( subtreeRepeatsIter->getSymbol ( ) );
65 res.addState ( currentState );
67 res.addTransition ( previousState, std::move ( symbol ), currentState );
69 while ( !subtreeJumps.empty ( ) && subtreeJumps.back ( ).first == 0 ) {
71 res.addTransition ( source, subtreeWildcard, currentState );
74 if ( nonlinearVariable != currentNonlinearVariable || ( subtreeId == subtreeRepeatsStack.back ( ) && nonlinearJumps ) )
75 res.addTransition ( source, nonlinearVariable, currentState );
77 if ( !subtreeJumps.empty ( ) ) {
78 subtreeJumps.pop_back ( );
79 subtreeRepeatsStack.pop_back ( );
83 if ( !subtreeJumps.empty ( ) ) subtreeJumps.back ( ).first--;
87template <
class SymbolType >
89 char S = alphabet::WildcardSymbol::instance < char > ( );
94 std::vector < unsigned > repeatsFrequency ( repeats.
getContent ( ).size ( ), 0 );
96 ++ repeatsFrequency [ repeat.getSymbol ( ) ];
99 res.addInputSymbol ( symbol );
103 res.addInputSymbol ( subtreeWildcard );
107 res.addInputSymbol ( nonlinearVariable );
117 for ( rankedSymbolsIter =
tree.getContent ( ).begin(), subtreeRepeatsIter = repeats.
getContent ( ).begin ( ); rankedSymbolsIter !=
tree.getContent ( ).end ( ); ++ rankedSymbolsIter, ++ subtreeRepeatsIter, ++
i ) {
120 subtreeRepeatsStack.push_back ( subtreeRepeatsIter->getSymbol ( ) );
125 res.addState ( currentState );
127 res.addTransition ( previousState, symbol, currentState );
128 res.addTransition (
res.getInitialState ( ), std::move ( symbol ), currentState );
130 while ( !subtreeJumps.empty ( ) && subtreeJumps.back ( ).first == 0 ) {
132 res.addTransition ( source, subtreeWildcard, currentState );
135 if ( nonlinearVariable != currentNonlinearVariable )
136 res.addTransition ( source, nonlinearVariable, currentState );
138 unsigned subtreeId = subtreeRepeatsStack.back ( );
139 bool multiRepeat = repeatsFrequency [ subtreeId ] > 1;
141 subtreeId = repeats.
getContent ( ) [ 0 ].getSymbol ( );
145 res.addState ( targetState );
146 res.addTransition ( source, nonlinearVariable, targetState );
148 constructTail (
res,
tree, subtreeWildcard, currentNonlinearVariable, nonlinearVariables, subtreeId, multiRepeat, rankedSymbolsIter,
i, subtreeRepeatsIter );
151 subtreeJumps.pop_back ( );
152 subtreeRepeatsStack.pop_back ( );
155 if ( !subtreeJumps.empty ( ) ) subtreeJumps.back ( ).first--;
161template <
class SymbolType >
163 return constructInternal (
tree, subtreeWildcard, * nonlinearVariables.begin ( ), nonlinearVariables );
166template <
class SymbolType >
167void ExactNonlinearTreePatternAutomaton::constructTail (
automaton::InputDrivenNPDA <
common::ranked_symbol < SymbolType >,
char,
ext::pair < unsigned, unsigned > > &
res,
const tree::PrefixRankedBarTree < SymbolType > &
tree,
const common::ranked_symbol < SymbolType > & subtreeWildcard,
const common::ranked_symbol < SymbolType > & currentNonlinearVariable,
const ext::set <
common::ranked_symbol < SymbolType > > & nonlinearVariables,
const common::ranked_symbol < SymbolType > & variablesBar,
unsigned subtreeId,
bool nonlinearJumps,
typename ext::vector <
common::ranked_symbol < SymbolType > >::const_iterator rankedSymbolsIter,
unsigned i,
typename ext::vector <
common::ranked_symbol < unsigned > >::const_iterator subtreeRepeatsIter ) {
171 for (++ rankedSymbolsIter, ++ subtreeRepeatsIter, ++
i; rankedSymbolsIter !=
tree.getContent ( ).
end ( ); ++ rankedSymbolsIter, ++ subtreeRepeatsIter, ++
i ) {
177 res.addState ( currentState );
179 res.addTransition ( previousState, symbol, currentState );
181 if (
tree.getBars ( ).count ( symbol ) ) {
182 if ( !subtreeJumps.empty ( ) ) {
185 res.addState ( middle );
187 res.addTransition ( source, subtreeWildcard, middle );
188 res.addTransition ( middle, variablesBar, currentState );
191 if ( nonlinearVariable != currentNonlinearVariable || ( subtreeId == subtreeRepeatsStack.back ( ) && nonlinearJumps ) )
192 res.addTransition ( source, nonlinearVariable, middle );
194 subtreeJumps.pop_back ( );
195 subtreeRepeatsStack.pop_back ( );
198 subtreeJumps.push_back (
i - 1 );
199 subtreeRepeatsStack.push_back ( subtreeRepeatsIter->getSymbol ( ) );
204template <
class SymbolType >
206 char S = alphabet::WildcardSymbol::instance < char > ( );
211 std::vector < unsigned > repeatsFrequency ( repeats.
getContent ( ).size ( ), 0 );
213 if ( ! repeats.
getBars ( ).count ( repeat ) )
214 ++ repeatsFrequency [ repeat.getSymbol ( ) ];
217 res.addInputSymbol ( symbol );
218 if (
tree.getBars ( ).count ( symbol ) )
224 res.addInputSymbol ( subtreeWildcard );
227 res.addInputSymbol ( variablesBar );
231 res.addInputSymbol ( nonlinearVariable );
241 for ( rankedSymbolsIter =
tree.getContent ( ).begin(), subtreeRepeatsIter = repeats.
getContent ( ).begin ( ); rankedSymbolsIter !=
tree.getContent ( ).end ( ); ++ rankedSymbolsIter, ++ subtreeRepeatsIter, ++
i ) {
247 res.addState ( currentState );
249 res.addTransition ( previousState, symbol, currentState );
251 if (
tree.getBars ( ).count ( symbol ) ) {
254 res.addState ( middle );
256 res.addTransition ( source, subtreeWildcard, middle );
257 res.addTransition ( middle, variablesBar, currentState );
260 if ( nonlinearVariable != currentNonlinearVariable )
261 res.addTransition ( source, nonlinearVariable, middle );
263 unsigned subtreeId = subtreeRepeatsStack.back ( );
264 bool multiRepeat = repeatsFrequency [ subtreeId ] > 1;
266 subtreeId = repeats.
getContent ( ) [ 0 ].getSymbol ( );
271 res.addState ( targetState );
272 res.addState ( middleState );
274 res.addTransition ( source, nonlinearVariable, middleState );
275 res.addTransition ( middleState, variablesBar, targetState );
277 constructTail (
res,
tree, subtreeWildcard, currentNonlinearVariable, nonlinearVariables, variablesBar, subtreeId, multiRepeat, rankedSymbolsIter,
i, subtreeRepeatsIter );
280 subtreeJumps.pop_back ( );
281 subtreeRepeatsStack.pop_back ( );
283 subtreeJumps.push_back (
i - 1 );
284 subtreeRepeatsStack.push_back ( subtreeRepeatsIter->getSymbol ( ) );
286 res.addTransition (
res.getInitialState ( ), symbol, currentState );
293template <
class SymbolType >
295 return constructInternal (
tree, subtreeWildcard, * nonlinearVariables.begin ( ), nonlinearVariables, variablesBar );
Definition: ExactNonlinearTreePatternAutomaton.h:23
static automaton::InputDrivenNPDA< common::ranked_symbol< SymbolType >, char, ext::pair< unsigned, unsigned > > construct(const tree::PrefixRankedTree< SymbolType > &tree, const common::ranked_symbol< SymbolType > &subtreeWildcard, const ext::set< common::ranked_symbol< SymbolType > > &nonlinearVariables)
Definition: ExactNonlinearTreePatternAutomaton.h:162
Definition: ranked_symbol.hpp:20
const size_t & getRank() const &
Definition: ranked_symbol.hpp:83
Class extending the deque class from the standard library. Original reason is to allow printing of th...
Definition: deque.hpp:44
Class extending the pair class from the standard library. Original reason is to allow printing of the...
Definition: pair.hpp:43
Class extending the vector class from the standard library. Original reason is to allow printing of t...
Definition: vector.hpp:45
Tree structure represented as linear sequece as result of preorder traversal with additional bar symb...
Definition: PrefixRankedBarTree.h:78
const ext::vector< common::ranked_symbol< SymbolType > > & getContent() const &
Definition: PrefixRankedBarTree.h:273
const ext::set< common::ranked_symbol< SymbolType > > & getBars() const &
Definition: PrefixRankedBarTree.h:156
Tree structure represented as linear sequece as result of preorder traversal. The representation is s...
Definition: PrefixRankedTree.h:71
const ext::vector< common::ranked_symbol< SymbolType > > & getContent() const &
Definition: PrefixRankedTree.h:235
Definition: BoyerMooreHorspool.h:22
int i
Definition: AllEpsilonClosure.h:118
return res
Definition: MinimizeByPartitioning.h:145
constexpr auto make_pair(T1 &&x, T2 &&y)
Definition: pair.hpp:79
void end()
Definition: measurements.cpp:19
Definition: BackwardOccurrenceTest.h:17