Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
UnrankedPattern.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 UnrankedPattern;
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 "../ranked/RankedPattern.h"
52#include <alphabet/GapSymbol.h>
53
54namespace tree {
55
56class GeneralAlphabet;
57class SubtreeWildcard;
58class SubtreeGap;
59
72template < class SymbolType >
73class UnrankedPattern final : public core::Components < UnrankedPattern < SymbolType >, ext::set < SymbolType >, component::Set, GeneralAlphabet, SymbolType, component::Value, std::tuple < SubtreeWildcard, SubtreeGap > > {
78
86 void checkAlphabet ( const ext::tree < SymbolType > & data ) const;
87
88public:
97 explicit UnrankedPattern ( SymbolType subtreeWildcard, SymbolType subtreeGap, ext::set < SymbolType > alphabet, ext::tree < SymbolType > pattern );
98
106 explicit UnrankedPattern ( SymbolType subtreeWildcard, SymbolType subtreeGap, ext::tree < SymbolType > pattern );
107
113 explicit UnrankedPattern ( const RankedPattern < SymbolType > & other );
114
121 return this->template accessComponent < GeneralAlphabet > ( ).get ( );
122 }
123
130 return std::move ( this->template accessComponent < GeneralAlphabet > ( ).get ( ) );
131 }
132
138 void extendAlphabet ( const ext::set < SymbolType > & symbols ) {
139 this->template accessComponent < GeneralAlphabet > ( ).add ( symbols );
140 }
141
147 const SymbolType & getSubtreeWildcard ( ) const & {
148 return this->template accessComponent < SubtreeWildcard > ( ).get ( );
149 }
150
157 return std::move ( this->template accessComponent < SubtreeWildcard > ( ).get ( ) );
158 }
159
165 const SymbolType & getSubtreeGap ( ) const & {
166 return this->template accessComponent < SubtreeGap > ( ).get ( );
167 }
168
175 return std::move ( this->template accessComponent < SubtreeGap > ( ).get ( ) );
176 }
177
183 const ext::tree < SymbolType > & getContent ( ) const &;
184
190 ext::tree < SymbolType > && getContent ( ) &&;
191
199 void setTree ( ext::tree < SymbolType > pattern );
200
208 auto operator <=> ( const UnrankedPattern & other ) const {
209 return std::tie ( m_content, getAlphabet(), getSubtreeWildcard() ) <=> std::tie ( other.m_content, other.getAlphabet(), other.getSubtreeWildcard() );
210 }
211
219 bool operator == ( const UnrankedPattern & other ) const {
220 return std::tie ( m_content, getAlphabet(), getSubtreeWildcard() ) == std::tie ( other.m_content, other.getAlphabet(), other.getSubtreeWildcard() );
221 }
222
231 friend ext::ostream & operator << ( ext::ostream & out, const UnrankedPattern & instance ) {
232 out << "(UnrankedPattern ";
233 out << " alphabet = " << instance.getAlphabet ( );
234 out << " content = " << instance.getContent ( );
235 out << " subtreeWildcard = " << instance.getSubtreeWildcard ( );
236 out << " subtreeGap = " << instance.getSubtreeGap ( );
237 out << ")";
238 return out;
239 }
240
246 void nicePrint ( ext::ostream & os ) const;
247};
248
249template < class SymbolType >
250UnrankedPattern < SymbolType >::UnrankedPattern ( SymbolType subtreeWildcard, SymbolType subtreeGap, ext::set < SymbolType > alphabet, ext::tree < SymbolType > pattern ) : core::Components < UnrankedPattern, ext::set < SymbolType >, component::Set, GeneralAlphabet, SymbolType, component::Value, std::tuple < SubtreeWildcard, SubtreeGap > > ( std::move ( alphabet ), std::move ( subtreeWildcard ), std::move ( subtreeGap ) ), m_content ( std::move ( pattern ) ) {
251 checkAlphabet ( m_content );
252}
253
254template < class SymbolType >
255UnrankedPattern < SymbolType >::UnrankedPattern ( SymbolType subtreeWildcard, SymbolType subtreeGap, ext::tree < SymbolType > pattern ) : UnrankedPattern ( subtreeWildcard, subtreeGap, ext::set < SymbolType > ( pattern.prefix_begin ( ), pattern.prefix_end ( ) ) + ext::set < SymbolType > { subtreeWildcard, subtreeGap }, pattern ) {
256}
257
258template < class SymbolType >
259UnrankedPattern < SymbolType >::UnrankedPattern ( const RankedPattern < SymbolType > & other ) : UnrankedPattern ( other.getSubtreeWildcard ( ).getSymbol ( ), alphabet::GapSymbol::template instance < SymbolType > ( ), TreeAuxiliary::unrankSymbols ( other.getAlphabet ( ) ) + ext::set < SymbolType > { alphabet::GapSymbol::template instance < SymbolType > ( ) }, TreeAuxiliary::rankedToUnranked ( other.getContent ( ) ) ) {
260}
261
262template < class SymbolType >
264 return m_content;
265}
266
267template < class SymbolType >
269 return std::move ( m_content );
270}
271
272template < class SymbolType >
274 ext::set < SymbolType > minimalAlphabet ( data.prefix_begin ( ), data.prefix_end ( ) );
275 std::set_difference ( minimalAlphabet.begin ( ), minimalAlphabet.end ( ), getAlphabet ( ).begin ( ), getAlphabet ( ).end ( ), ext::callback_iterator ( [ ] ( const SymbolType & ) {
276 throw TreeException ( "Input symbols not in the alphabet." );
277 } ) );
278}
279
280template < class SymbolType >
282 checkAlphabet ( pattern );
283
284 this->m_content = std::move ( pattern );
285}
286
287template < class SymbolType >
289 m_content.nicePrint ( os );
290}
291
292} /* namespace tree */
293
294namespace core {
295
301template < class SymbolType >
302class SetConstraint< tree::UnrankedPattern < SymbolType >, SymbolType, tree::GeneralAlphabet > {
303public:
312 static bool used ( const tree::UnrankedPattern < SymbolType > & pattern, const SymbolType & symbol ) {
313 const ext::tree<SymbolType>& m_content = pattern.getContent ( );
314 return std::find(m_content.prefix_begin(), m_content.prefix_end(), symbol) != m_content.prefix_end() || pattern.template accessComponent < tree::SubtreeWildcard > ( ).get ( ) == symbol;
315 }
316
326 return true;
327 }
328
335 static void valid ( const tree::UnrankedPattern < SymbolType > &, const SymbolType & ) {
336 }
337};
338
344template < class SymbolType >
345class ElementConstraint< tree::UnrankedPattern < SymbolType >, SymbolType, tree::SubtreeWildcard > {
346public:
355 static bool available ( const tree::UnrankedPattern < SymbolType > & pattern, const SymbolType & symbol ) {
356 return pattern.template accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
357 }
358
367 static void valid ( const tree::UnrankedPattern < SymbolType > &, const SymbolType & ) {
368 }
369};
370
376template < class SymbolType >
377class ElementConstraint< tree::UnrankedPattern < SymbolType >, SymbolType, tree::SubtreeGap > {
378public:
387 static bool available ( const tree::UnrankedPattern < SymbolType > & pattern, const SymbolType & symbol ) {
388 return pattern.template accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
389 }
390
399 static void valid ( const tree::UnrankedPattern < SymbolType > &, const SymbolType & ) {
400 }
401};
402
408template < class SymbolType >
409struct normalize < tree::UnrankedPattern < SymbolType > > {
411 DefaultSymbolType wildcard = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( value ).getSubtreeWildcard ( ) );
412 DefaultSymbolType gap = alphabet::SymbolNormalize::normalizeSymbol ( std::move ( value ).getSubtreeGap ( ) );
414 ext::tree < DefaultSymbolType > content = tree::TreeNormalize::normalizeTree ( std::move ( value ).getContent ( ) );
415
416 return tree::UnrankedPattern < > ( std::move ( wildcard ), std::move ( gap ), std::move ( alphabet ), std::move ( content ) );
417 }
418};
419
420} /* namespace core */
421
422extern template class tree::UnrankedPattern < >;
423
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::UnrankedPattern< SymbolType > &pattern, const SymbolType &symbol)
Definition: UnrankedPattern.h:387
static void valid(const tree::UnrankedPattern< SymbolType > &, const SymbolType &)
Definition: UnrankedPattern.h:399
static void valid(const tree::UnrankedPattern< SymbolType > &, const SymbolType &)
Definition: UnrankedPattern.h:367
static bool available(const tree::UnrankedPattern< SymbolType > &pattern, const SymbolType &symbol)
Definition: UnrankedPattern.h:355
Definition: components.hpp:25
static void valid(const tree::UnrankedPattern< SymbolType > &, const SymbolType &)
Definition: UnrankedPattern.h:335
static bool available(const tree::UnrankedPattern< SymbolType > &, const SymbolType &)
Definition: UnrankedPattern.h:325
static bool used(const tree::UnrankedPattern< SymbolType > &pattern, const SymbolType &symbol)
Definition: UnrankedPattern.h:312
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
Tree pattern represented in its natural representation. The representation is so called ranked,...
Definition: RankedPattern.h:72
static ext::set< SymbolType > unrankSymbols(const ext::set< common::ranked_symbol< SymbolType > > &alphabet)
Definition: TreeAuxiliary.h:82
static ext::tree< SymbolType > rankedToUnranked(const ext::tree< common::ranked_symbol< SymbolType > > &tree)
Definition: TreeAuxiliary.h:151
Definition: TreeException.h:15
static ext::tree< DefaultSymbolType > normalizeTree(ext::tree< SymbolType > &&tree)
Definition: TreeNormalize.h:29
Tree pattern represented in its natural representation. The representation is so called unranked,...
Definition: UnrankedPattern.h:73
const ext::set< SymbolType > & getAlphabet() const &
Definition: UnrankedPattern.h:120
ext::set< SymbolType > && getAlphabet() &&
Definition: UnrankedPattern.h:129
const ext::tree< SymbolType > & getContent() const &
Definition: UnrankedPattern.h:263
friend ext::ostream & operator<<(ext::ostream &out, const UnrankedPattern &instance)
Definition: UnrankedPattern.h:231
const SymbolType & getSubtreeGap() const &
Definition: UnrankedPattern.h:165
SymbolType && getSubtreeGap() &&
Definition: UnrankedPattern.h:174
const SymbolType & getSubtreeWildcard() const &
Definition: UnrankedPattern.h:147
void nicePrint(ext::ostream &os) const
Definition: UnrankedPattern.h:288
SymbolType && getSubtreeWildcard() &&
Definition: UnrankedPattern.h:156
UnrankedPattern(SymbolType subtreeWildcard, SymbolType subtreeGap, ext::set< SymbolType > alphabet, ext::tree< SymbolType > pattern)
Creates a new instance of the pattern with concrete alphabet, content, and wildcard.
Definition: UnrankedPattern.h:250
void setTree(ext::tree< SymbolType > pattern)
Definition: UnrankedPattern.h:281
bool operator==(const UnrankedPattern &other) const
Definition: UnrankedPattern.h:219
void extendAlphabet(const ext::set< SymbolType > &symbols)
Definition: UnrankedPattern.h:138
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::UnrankedPattern< > eval(tree::UnrankedPattern< SymbolType > &&value)
Definition: UnrankedPattern.h:410
Definition: normalize.hpp:13