Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
UnrankedExtendedPattern.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 UnrankedExtendedPattern;
32
33} /* namespace tree */
34
35
36#include <ext/iostream>
37#include <ext/algorithm>
38
39#include <alib/string>
40#include <alib/set>
41#include <alib/tree>
42
43#include <core/components.hpp>
44
45#include <tree/TreeException.h>
47
48#include <core/normalize.hpp>
50
51#include "UnrankedPattern.h"
52#include <alphabet/GapSymbol.h>
54
55namespace tree {
56
57class GeneralAlphabet;
58class SubtreeWildcard;
59class NodeWildcard;
60class SubtreeGap;
61
75template < class SymbolType >
76class UnrankedExtendedPattern final : public core::Components < UnrankedExtendedPattern < SymbolType >, ext::set < SymbolType >, component::Set, GeneralAlphabet, SymbolType, component::Value, std::tuple < NodeWildcard, SubtreeWildcard, SubtreeGap > > {
81
89 void checkAlphabet ( const ext::tree < SymbolType > & data ) const;
90
91public:
100 explicit UnrankedExtendedPattern ( SymbolType subtreeWildcard, SymbolType subtreeGap, SymbolType nodeWildcard, ext::set < SymbolType > alphabet, ext::tree < SymbolType > pattern );
101
109 explicit UnrankedExtendedPattern ( SymbolType subtreeWildcard, SymbolType subtreeGap, SymbolType nodeWildcard, ext::tree < SymbolType > pattern );
110
117
124 return this->template accessComponent < GeneralAlphabet > ( ).get ( );
125 }
126
133 return std::move ( this->template accessComponent < GeneralAlphabet > ( ).get ( ) );
134 }
135
141 void extendAlphabet ( const ext::set < SymbolType > & symbols ) {
142 this->template accessComponent < GeneralAlphabet > ( ).add ( symbols );
143 }
144
150 const SymbolType & getNodeWildcard ( ) const & {
151 return this->template accessComponent < NodeWildcard > ( ).get ( );
152 }
153
160 return std::move ( this->template accessComponent < NodeWildcard > ( ).get ( ) );
161 }
162
168 const SymbolType & getSubtreeWildcard ( ) const & {
169 return this->template accessComponent < SubtreeWildcard > ( ).get ( );
170 }
171
178 return std::move ( this->template accessComponent < SubtreeWildcard > ( ).get ( ) );
179 }
180
186 const SymbolType & getSubtreeGap ( ) const & {
187 return this->template accessComponent < SubtreeGap > ( ).get ( );
188 }
189
196 return std::move ( this->template accessComponent < SubtreeGap > ( ).get ( ) );
197 }
198
204 const ext::tree < SymbolType > & getContent ( ) const &;
205
211 ext::tree < SymbolType > && getContent ( ) &&;
212
220 void setTree ( ext::tree < SymbolType > pattern );
221
229 auto operator <=> ( const UnrankedExtendedPattern & other ) const {
230 return std::tie ( m_content, getAlphabet ( ), getSubtreeWildcard ( ), getNodeWildcard ( ) ) <=> std::tie ( other.m_content, other.getAlphabet ( ), other.getSubtreeWildcard ( ), other.getNodeWildcard ( ) );
231 }
232
240 bool operator == ( const UnrankedExtendedPattern & other ) const {
241 return std::tie ( m_content, getAlphabet ( ), getSubtreeWildcard ( ), getNodeWildcard ( ) ) == std::tie ( other.m_content, other.getAlphabet ( ), other.getSubtreeWildcard ( ), other.getNodeWildcard ( ) );
242 }
243
252 friend ext::ostream & operator << ( ext::ostream & out, const UnrankedExtendedPattern & instance ) {
253 out << "(UnrankedExtendedPattern ";
254 out << "alphabet = " << instance.getAlphabet ( );
255 out << "content = " << instance.getContent ( );
256 out << "subtreeWildcard = " << instance.getSubtreeWildcard ( );
257 out << "nodeWildcard = " << instance.getNodeWildcard ( );
258 out << "subtreeGap = " << instance.getSubtreeGap ( );
259 out << ")";
260 return out;
261 }
262
268 void nicePrint ( ext::ostream & os ) const;
269};
270
271template < class SymbolType >
272UnrankedExtendedPattern < SymbolType >::UnrankedExtendedPattern ( SymbolType subtreeWildcard, SymbolType subtreeGap, SymbolType nodeWildcard, ext::set < SymbolType > alphabet, ext::tree < SymbolType > pattern ) : core::Components < UnrankedExtendedPattern, ext::set < SymbolType >, component::Set, GeneralAlphabet, SymbolType, component::Value, std::tuple < NodeWildcard, SubtreeWildcard, SubtreeGap > > ( std::move ( alphabet ), std::move ( nodeWildcard ), std::move ( subtreeWildcard ), std::move ( subtreeGap ) ), m_content ( std::move ( pattern ) ) {
273 checkAlphabet ( m_content );
274}
275
276template < class SymbolType >
277UnrankedExtendedPattern < SymbolType >::UnrankedExtendedPattern ( SymbolType subtreeWildcard, SymbolType subtreeGap, SymbolType nodeWildcard, ext::tree < SymbolType > pattern ) : UnrankedExtendedPattern ( subtreeWildcard, subtreeGap, nodeWildcard, ext::set < SymbolType > ( pattern.prefix_begin ( ), pattern.prefix_end ( ) ) + ext::set < SymbolType > { subtreeWildcard, subtreeGap, nodeWildcard }, pattern ) {
278}
279
280template < class SymbolType >
281UnrankedExtendedPattern < SymbolType >::UnrankedExtendedPattern ( const UnrankedPattern < SymbolType > & other ) : UnrankedExtendedPattern ( other.getSubtreeWildcard ( ), alphabet::GapSymbol::template instance < SymbolType > ( ), alphabet::NodeWildcardSymbol::template instance < SymbolType > ( ), other.getAlphabet ( ) + ext::set < SymbolType > { alphabet::GapSymbol::template instance < SymbolType > ( ), alphabet::NodeWildcardSymbol::template instance < SymbolType > ( ) }, other.getContent ( ) ) {
282}
283
284template < class SymbolType >
286 return m_content;
287}
288
289template < class SymbolType >
291 return std::move ( m_content );
292}
293
294template < class SymbolType >
296 ext::set < SymbolType > minimalAlphabet ( data.prefix_begin ( ), data.prefix_end ( ) );
297 std::set_difference ( minimalAlphabet.begin ( ), minimalAlphabet.end ( ), getAlphabet ( ).begin ( ), getAlphabet ( ).end ( ), ext::callback_iterator ( [ ] ( const SymbolType & ) {
298 throw TreeException ( "Input symbols not in the alphabet." );
299 } ) );
300}
301
302template < class SymbolType >
304 checkAlphabet ( pattern );
305
306 this->m_content = std::move ( pattern );
307}
308
309template < class SymbolType >
311 m_content.nicePrint ( os );
312}
313
314} /* namespace tree */
315
316namespace core {
317
323template < class SymbolType >
324class SetConstraint< tree::UnrankedExtendedPattern < SymbolType >, SymbolType, tree::GeneralAlphabet > {
325public:
334 static bool used ( const tree::UnrankedExtendedPattern < SymbolType > & pattern, const SymbolType & symbol ) {
335 const ext::tree<SymbolType>& m_content = pattern.getContent ( );
336 return std::find(m_content.prefix_begin(), m_content.prefix_end(), symbol) != m_content.prefix_end() || pattern.template accessComponent < tree::SubtreeWildcard > ( ).get ( ) == symbol || pattern.template accessComponent < tree::NodeWildcard > ( ).get ( ) == symbol;
337 }
338
348 return true;
349 }
350
358 }
359};
360
366template < class SymbolType >
367class ElementConstraint< tree::UnrankedExtendedPattern < SymbolType >, SymbolType, tree::NodeWildcard > {
368public:
377 static bool available ( const tree::UnrankedExtendedPattern < SymbolType > & pattern, const SymbolType & symbol ) {
378 return pattern.template accessComponent < tree::GeneralAlphabet > ( ).get ( ).contains ( symbol );
379 }
380
389 static void valid ( const tree::UnrankedExtendedPattern < SymbolType > & pattern, const SymbolType & symbol ) {
390 if ( pattern.template accessComponent < tree::SubtreeWildcard > ( ).get ( ) == symbol )
391 throw tree::TreeException ( "NodeWildcard is already a SubtreeWildcard" );
392 }
393};
394
400template < class SymbolType >
401class ElementConstraint< tree::UnrankedExtendedPattern < SymbolType >, SymbolType, tree::SubtreeWildcard > {
402public:
411 static bool available ( const tree::UnrankedExtendedPattern < SymbolType > & pattern, const SymbolType & symbol ) {
412 return pattern.template accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
413 }
414
423 static void valid ( const tree::UnrankedExtendedPattern < SymbolType > & pattern, const SymbolType & symbol ) {
424 if ( pattern.template accessComponent < tree::NodeWildcard > ( ).get ( ) == symbol )
425 throw tree::TreeException ( "SubtreeWildcard is already a NodeWildcard" );
426 }
427};
428
434template < class SymbolType >
435class ElementConstraint< tree::UnrankedExtendedPattern < SymbolType >, SymbolType, tree::SubtreeGap > {
436public:
445 static bool available ( const tree::UnrankedExtendedPattern < SymbolType > & pattern, const SymbolType & symbol ) {
446 return pattern.template accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
447 }
448
458 }
459};
460
466template < class SymbolType >
467struct normalize < tree::UnrankedExtendedPattern < SymbolType > > {
469 DefaultSymbolType wildcard = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( value ).getSubtreeWildcard ( ) );
470 DefaultSymbolType gap = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( value ).getSubtreeGap ( ) );
471 DefaultSymbolType nodeWildcard = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( value ).getNodeWildcard ( ) );
473 ext::tree < DefaultSymbolType > content = tree::TreeNormalize::normalizeTree ( std::move ( value ).getContent ( ) );
474
475 return tree::UnrankedExtendedPattern < > ( std::move ( wildcard ), std::move ( gap ), std::move ( nodeWildcard ), std::move ( alphabet ), std::move ( content ) );
476 }
477};
478
479} /* namespace core */
480
481extern template class tree::UnrankedExtendedPattern < >;
482
static ext::set< DefaultSymbolType > normalizeAlphabet(ext::set< SymbolType > &&symbols)
Definition: SymbolNormalize.h:50
static DefaultSymbolType normalizeSymbol(SymbolType &&symbol)
Definition: SymbolNormalize.h:68
Definition: components.hpp:181
static bool available(const tree::UnrankedExtendedPattern< SymbolType > &pattern, const SymbolType &symbol)
Definition: UnrankedExtendedPattern.h:377
static void valid(const tree::UnrankedExtendedPattern< SymbolType > &pattern, const SymbolType &symbol)
Definition: UnrankedExtendedPattern.h:389
static bool available(const tree::UnrankedExtendedPattern< SymbolType > &pattern, const SymbolType &symbol)
Definition: UnrankedExtendedPattern.h:445
static void valid(const tree::UnrankedExtendedPattern< SymbolType > &, const SymbolType &)
Definition: UnrankedExtendedPattern.h:457
static void valid(const tree::UnrankedExtendedPattern< SymbolType > &pattern, const SymbolType &symbol)
Definition: UnrankedExtendedPattern.h:423
static bool available(const tree::UnrankedExtendedPattern< SymbolType > &pattern, const SymbolType &symbol)
Definition: UnrankedExtendedPattern.h:411
Definition: components.hpp:25
static void valid(const tree::UnrankedExtendedPattern< SymbolType > &, const SymbolType &)
Definition: UnrankedExtendedPattern.h:357
static bool available(const tree::UnrankedExtendedPattern< SymbolType > &, const SymbolType &)
Definition: UnrankedExtendedPattern.h:347
static bool used(const tree::UnrankedExtendedPattern< SymbolType > &pattern, const SymbolType &symbol)
Definition: UnrankedExtendedPattern.h:334
Definition: setComponents.hpp:26
Output iterator calling a callback function on assignment.
Definition: iterator.hpp:923
Definition: ostream.h:14
Definition: set.hpp:44
Class introducing a tree with interface trying to be close to the interface of standard library conta...
Definition: tree.hpp:52
const_prefix_iterator prefix_begin() const
Getter of the prefix iterator to the root node.
Definition: tree.hpp:904
const_prefix_iterator prefix_end() const
Getter of the prefix iterator one after the last node in the prefix traversal.
Definition: tree.hpp:914
Definition: Object.h:16
Definition: TreeException.h:15
static ext::tree< DefaultSymbolType > normalizeTree(ext::tree< SymbolType > &&tree)
Definition: TreeNormalize.h:29
Extended tree pattern represented in its natural representation. The representation is so called unra...
Definition: UnrankedExtendedPattern.h:76
void setTree(ext::tree< SymbolType > pattern)
Definition: UnrankedExtendedPattern.h:303
const SymbolType & getNodeWildcard() const &
Definition: UnrankedExtendedPattern.h:150
const ext::set< SymbolType > & getAlphabet() const &
Definition: UnrankedExtendedPattern.h:123
SymbolType && getNodeWildcard() &&
Definition: UnrankedExtendedPattern.h:159
const SymbolType & getSubtreeGap() const &
Definition: UnrankedExtendedPattern.h:186
const SymbolType & getSubtreeWildcard() const &
Definition: UnrankedExtendedPattern.h:168
SymbolType && getSubtreeGap() &&
Definition: UnrankedExtendedPattern.h:195
SymbolType && getSubtreeWildcard() &&
Definition: UnrankedExtendedPattern.h:177
ext::set< SymbolType > && getAlphabet() &&
Definition: UnrankedExtendedPattern.h:132
bool operator==(const UnrankedExtendedPattern &other) const
Definition: UnrankedExtendedPattern.h:240
void extendAlphabet(const ext::set< SymbolType > &symbols)
Definition: UnrankedExtendedPattern.h:141
friend ext::ostream & operator<<(ext::ostream &out, const UnrankedExtendedPattern &instance)
Definition: UnrankedExtendedPattern.h:252
const ext::tree< SymbolType > & getContent() const &
Definition: UnrankedExtendedPattern.h:285
UnrankedExtendedPattern(SymbolType subtreeWildcard, SymbolType subtreeGap, SymbolType nodeWildcard, ext::set< SymbolType > alphabet, ext::tree< SymbolType > pattern)
Creates a new instance of the pattern with concrete alphabet, content, and wildcard.
Definition: UnrankedExtendedPattern.h:272
void nicePrint(ext::ostream &os) const
Definition: UnrankedExtendedPattern.h:310
Tree pattern represented in its natural representation. The representation is so called unranked,...
Definition: UnrankedPattern.h:73
Definition: BarSymbol.cpp:12
typename T::SymbolType SymbolType
Definition: ReachableStates.h:176
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::UnrankedExtendedPattern< > eval(tree::UnrankedExtendedPattern< SymbolType > &&value)
Definition: UnrankedExtendedPattern.h:468
Definition: normalize.hpp:13