Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
PrefixRankedExtendedPattern.h
Go to the documentation of this file.
1
6/*
7 * This file is part of Algorithms library toolkit.
8 * Copyright (C) 2017 Jan Travnicek (jan.travnicek@fit.cvut.cz)
9
10 * Algorithms library toolkit is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
14
15 * Algorithms library toolkit is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19
20 * You should have received a copy of the GNU General Public License
21 * along with Algorithms library toolkit. If not, see <http://www.gnu.org/licenses/>.
22 */
23
24#pragma once
25
27
28namespace tree {
29
30template < class SymbolType = DefaultSymbolType >
31class PrefixRankedExtendedPattern;
32
33} /* namespace tree */
34
35
36#include <ext/algorithm>
37
38#include <alib/set>
39#include <alib/vector>
40#include <alib/tree>
41#include <alib/deque>
42
43#include <core/components.hpp>
45
46#include <tree/TreeException.h>
48
51
52#include <core/normalize.hpp>
54
55#include <string/LinearString.h>
56
58#include "PrefixRankedPattern.h"
59
60namespace tree {
61
62class GeneralAlphabet;
63class SubtreeWildcard;
64class NodeWildcard;
65
79template < class SymbolType >
80class PrefixRankedExtendedPattern final : public core::Components < PrefixRankedExtendedPattern < SymbolType >, ext::set < common::ranked_symbol < SymbolType > >, component::Set, std::tuple < GeneralAlphabet, NodeWildcards >, common::ranked_symbol < SymbolType >, component::Value, SubtreeWildcard > {
85
91 void arityChecksum ( const ext::vector < common::ranked_symbol < SymbolType > > & data );
92
93public:
102
110
117
124
131 return this->template accessComponent < GeneralAlphabet > ( ).get ( );
132 }
133
140 return std::move ( this->template accessComponent < GeneralAlphabet > ( ).get ( ) );
141 }
142
149 this->template accessComponent < GeneralAlphabet > ( ).add ( symbols );
150 }
151
158 return this->template accessComponent < NodeWildcards > ( ).get ( );
159 }
160
167 return std::move ( this->template accessComponent < NodeWildcards > ( ).get ( ) );
168 }
169
176 this->template accessComponent < NodeWildcards > ( ).add ( symbols );
177 }
178
185 return this->template accessComponent < SubtreeWildcard > ( ).get ( );
186 }
187
194 return std::move ( this->template accessComponent < SubtreeWildcard > ( ).get ( ) );
195 }
196
203
209 ext::vector < common::ranked_symbol < SymbolType > > && getContent ( ) &&;
210
218 void setContent ( ext::vector < common::ranked_symbol < SymbolType > > data );
219
223 bool isEmpty ( ) const;
224
232 auto operator <=> ( const PrefixRankedExtendedPattern & other ) const {
233 return std::tie ( m_Data, getAlphabet ( ), getSubtreeWildcard ( ), getNodeWildcards ( ) ) <=> std::tie ( other.m_Data, other.getAlphabet ( ), other.getSubtreeWildcard ( ), other.getNodeWildcards ( ) );
234 }
235
243 bool operator == ( const PrefixRankedExtendedPattern & other ) const {
244 return std::tie ( m_Data, getAlphabet ( ), getSubtreeWildcard ( ), getNodeWildcards ( ) ) == std::tie ( other.m_Data, other.getAlphabet ( ), other.getSubtreeWildcard ( ), other.getNodeWildcards ( ) );
245 }
246
256 out << "(PrefixRankedExtendedPattern ";
257 out << "alphabet = " << instance.getAlphabet ( );
258 out << "content = " << instance.getContent ( );
259 out << "subtreeWildcard = " << instance.getSubtreeWildcard ( );
260 out << "nodeWildcards = " << instance.getNodeWildcards ( );
261 out << ")";
262 return out;
263 }
264
272 }
273};
274
275template < class SymbolType >
277 setContent ( std::move ( data ) );
278}
279
280template < class SymbolType >
282}
283
284template < class SymbolType >
285PrefixRankedExtendedPattern < SymbolType >::PrefixRankedExtendedPattern ( const PrefixRankedPattern < SymbolType > & pattern ) : PrefixRankedExtendedPattern ( pattern.getSubtreeWildcard ( ), { }, pattern.getAlphabet ( ) + ext::set < common::ranked_symbol < SymbolType > > { pattern.getSubtreeWildcard ( ) }, pattern.getContent ( ) ) {
286}
287
288template < class SymbolType >
289PrefixRankedExtendedPattern < SymbolType >::PrefixRankedExtendedPattern ( const RankedExtendedPattern < SymbolType > & pattern ) : PrefixRankedExtendedPattern ( pattern.getSubtreeWildcard ( ), pattern.getNodeWildcards ( ), pattern.getAlphabet ( ), TreeAuxiliary::treeToPrefix ( pattern.getContent ( ) ) ) {
290}
291
292template < class SymbolType >
294 return this->m_Data;
295}
296
297template < class SymbolType >
299 return std::move ( this->m_Data );
300}
301
302template < class SymbolType >
304 arityChecksum ( data );
305
306 ext::set < common::ranked_symbol < SymbolType > > minimalAlphabet ( data.begin ( ), data.end ( ) );
307 std::set_difference ( minimalAlphabet.begin ( ), minimalAlphabet.end ( ), getAlphabet ( ).begin ( ), getAlphabet ( ).end ( ), ext::callback_iterator ( [ ] ( const common::ranked_symbol < SymbolType > & ) {
308 throw TreeException ( "Input symbols not in the alphabet." );
309 } ) );
310
311 this->m_Data = std::move ( data );
312}
313
314template < class SymbolType >
316 if ( std::accumulate ( data.begin ( ), data.end ( ), 1, [ ] ( int current, const common::ranked_symbol < SymbolType > & symbol ) {
317 return current + symbol.getRank ( ) - 1;
318 } ) != 0 )
319 throw TreeException ( "The string does not form a tree" );
320}
321
322template < class SymbolType >
324 return this->m_Data.empty ( );
325}
326
327} /* namespace tree */
328
329namespace core {
330
336template < class SymbolType >
337class SetConstraint< tree::PrefixRankedExtendedPattern < SymbolType >, common::ranked_symbol < SymbolType >, tree::GeneralAlphabet > {
338public:
349
350 return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern.template accessComponent < tree::SubtreeWildcard > ( ).get ( ) == symbol || pattern.template accessComponent < tree::NodeWildcards > ( ).get ( ).contains ( symbol );
351 }
352
362 return true;
363 }
364
372 }
373};
374
380template < class SymbolType >
381class SetConstraint< tree::PrefixRankedExtendedPattern < SymbolType >, common::ranked_symbol < SymbolType >, tree::NodeWildcards > {
382public:
392 return false;
393 }
394
404 return pattern.template accessComponent < tree::GeneralAlphabet > ( ).get ( ).contains ( symbol );
405 }
406
416 if ( pattern.template accessComponent < tree::SubtreeWildcard > ( ).get ( ) == symbol )
417 throw tree::TreeException ( "NodeWildcard is already a SubtreeWildcard" );
418 }
419};
420
426template < class SymbolType >
427class ElementConstraint< tree::PrefixRankedExtendedPattern < SymbolType >, common::ranked_symbol < SymbolType >, tree::SubtreeWildcard > {
428public:
438 return pattern.template accessComponent < tree::GeneralAlphabet > ( ).get ( ).contains ( symbol );
439 }
440
450 if( symbol.getRank() != 0 )
451 throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
452 if ( pattern.template accessComponent < tree::NodeWildcards > ( ).get ( ).contains ( symbol ) )
453 throw tree::TreeException ( "SubtreeWildcard is already a NodeWildcard" );
454 }
455};
456
462template < class SymbolType >
463struct normalize < tree::PrefixRankedExtendedPattern < SymbolType > > {
465 common::ranked_symbol < DefaultSymbolType > wildcard = alphabet::SymbolNormalize::normalizeRankedSymbol ( std::move ( value ).getSubtreeWildcard ( ) );
466 ext::set < common::ranked_symbol < DefaultSymbolType > > nodeWildcards = alphabet::SymbolNormalize::normalizeRankedAlphabet ( std::move ( value ).getNodeWildcards ( ) );
469
470 return tree::PrefixRankedExtendedPattern < > ( std::move ( wildcard ), std::move ( nodeWildcards ), std::move ( alphabet ), std::move ( content ) );
471 }
472};
473
474} /* namespace core */
475
476extern template class tree::PrefixRankedExtendedPattern < >;
477
static ext::vector< common::ranked_symbol< DefaultSymbolType > > normalizeRankedSymbols(ext::vector< common::ranked_symbol< SymbolType > > &&symbols)
Definition: SymbolNormalize.h:113
static common::ranked_symbol< DefaultSymbolType > normalizeRankedSymbol(common::ranked_symbol< SymbolType > &&symbol)
Definition: SymbolNormalize.h:81
static ext::set< common::ranked_symbol< DefaultSymbolType > > normalizeRankedAlphabet(ext::set< common::ranked_symbol< SymbolType > > &&symbols)
Definition: SymbolNormalize.h:59
Definition: ranked_symbol.hpp:20
const size_t & getRank() const &
Definition: ranked_symbol.hpp:83
Definition: components.hpp:181
static void valid(const tree::PrefixRankedExtendedPattern< SymbolType > &pattern, const common::ranked_symbol< SymbolType > &symbol)
Definition: PrefixRankedExtendedPattern.h:449
static bool available(const tree::PrefixRankedExtendedPattern< SymbolType > &pattern, const common::ranked_symbol< SymbolType > &symbol)
Definition: PrefixRankedExtendedPattern.h:437
Definition: components.hpp:25
static void valid(const tree::PrefixRankedExtendedPattern< SymbolType > &pattern, const common::ranked_symbol< SymbolType > &symbol)
Definition: PrefixRankedExtendedPattern.h:415
static bool available(const tree::PrefixRankedExtendedPattern< SymbolType > &pattern, const common::ranked_symbol< SymbolType > &symbol)
Definition: PrefixRankedExtendedPattern.h:403
static bool used(const tree::PrefixRankedExtendedPattern< SymbolType > &, const common::ranked_symbol< SymbolType > &)
Definition: PrefixRankedExtendedPattern.h:391
static void valid(const tree::PrefixRankedExtendedPattern< SymbolType > &, const common::ranked_symbol< SymbolType > &)
Definition: PrefixRankedExtendedPattern.h:371
static bool available(const tree::PrefixRankedExtendedPattern< SymbolType > &, const common::ranked_symbol< SymbolType > &)
Definition: PrefixRankedExtendedPattern.h:361
static bool used(const tree::PrefixRankedExtendedPattern< SymbolType > &pattern, const common::ranked_symbol< SymbolType > &symbol)
Definition: PrefixRankedExtendedPattern.h:347
Definition: setComponents.hpp:26
Output iterator calling a callback function on assignment.
Definition: iterator.hpp:923
Definition: ostream.h:14
Definition: set.hpp:44
auto begin() &
Inherited behavior of begin for non-const instance.
Definition: set.hpp:99
auto end() &
Inherited behavior of end for non-const instance.
Definition: set.hpp:129
Class extending the vector class from the standard library. Original reason is to allow printing of t...
Definition: vector.hpp:45
auto begin() &
Inherited behavior of begin for non-const instance.
Definition: vector.hpp:125
auto end() &
Inherited behavior of end for non-const instance.
Definition: vector.hpp:155
Linear string.
Definition: LinearString.h:57
Tree pattern represented as linear sequece as result of preorder traversal. The representation is so ...
Definition: PrefixRankedExtendedPattern.h:80
const ext::vector< common::ranked_symbol< SymbolType > > & getContent() const &
Definition: PrefixRankedExtendedPattern.h:293
void setContent(ext::vector< common::ranked_symbol< SymbolType > > data)
Definition: PrefixRankedExtendedPattern.h:303
common::ranked_symbol< SymbolType > && getSubtreeWildcard() &&
Definition: PrefixRankedExtendedPattern.h:193
const ext::set< common::ranked_symbol< SymbolType > > & getNodeWildcards() const &
Definition: PrefixRankedExtendedPattern.h:157
bool operator==(const PrefixRankedExtendedPattern &other) const
Definition: PrefixRankedExtendedPattern.h:243
ext::set< common::ranked_symbol< SymbolType > > && getNodeWildcards() &&
Definition: PrefixRankedExtendedPattern.h:166
ext::set< common::ranked_symbol< SymbolType > > && getAlphabet() &&
Definition: PrefixRankedExtendedPattern.h:139
void extendAlphabet(const ext::set< common::ranked_symbol< SymbolType > > &symbols)
Definition: PrefixRankedExtendedPattern.h:148
void extendNodeWildcards(const ext::set< common::ranked_symbol< SymbolType > > &symbols)
Definition: PrefixRankedExtendedPattern.h:175
const common::ranked_symbol< SymbolType > & getSubtreeWildcard() const &
Definition: PrefixRankedExtendedPattern.h:184
const ext::set< common::ranked_symbol< SymbolType > > & getAlphabet() const &
Definition: PrefixRankedExtendedPattern.h:130
PrefixRankedExtendedPattern(common::ranked_symbol< SymbolType > subtreeWildcard, ext::set< common::ranked_symbol< SymbolType > > nodeWildcards, ext::set< common::ranked_symbol< SymbolType > > alphabet, ext::vector< common::ranked_symbol< SymbolType > > data)
Creates a new instance of the pattern with concrete alphabet, content, and wildcard.
Definition: PrefixRankedExtendedPattern.h:276
friend ext::ostream & operator<<(ext::ostream &out, const PrefixRankedExtendedPattern &instance)
Definition: PrefixRankedExtendedPattern.h:255
bool isEmpty() const
Definition: PrefixRankedExtendedPattern.h:323
Tree pattern represented as linear sequece as result of preorder traversal. The representation is so ...
Definition: PrefixRankedPattern.h:77
Extended tree pattern represented in its natural representation. The representation is so called rank...
Definition: RankedExtendedPattern.h:74
static ext::vector< common::ranked_symbol< SymbolType > > treeToPrefix(const ext::tree< common::ranked_symbol< SymbolType > > &tree)
Definition: TreeAuxiliary.h:185
Definition: TreeException.h:15
Definition: BarSymbol.cpp:12
typename T::SymbolType SymbolType
Definition: ReachableStates.h:176
Definition: Permutation.hpp:18
Definition: normalize.hpp:10
Definition: sigHandler.cpp:20
constexpr tuple< Elements &... > tie(Elements &... args) noexcept
Helper of extended tuple of references construction. The tuple is constructed to reffer to values in ...
Definition: tuple.hpp:218
auto begin(Container &&cont) -> decltype(std::forward(cont).begin())
Definition: iterator.hpp:900
void end()
Definition: measurements.cpp:19
auto & get(ext::ptr_array< Type, N > &tpl)
Specialisation of get function for pointer arrays.
Definition: ptr_array.hpp:693
Definition: BackwardOccurrenceTest.h:17
static tree::PrefixRankedExtendedPattern< > eval(tree::PrefixRankedExtendedPattern< SymbolType > &&value)
Definition: PrefixRankedExtendedPattern.h:464
Definition: normalize.hpp:13