Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Concepts
UnorderedRankedPattern.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 UnorderedRankedPattern;
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>
45
46#include <tree/TreeException.h>
48
49#include <core/normalize.hpp>
51
53
54namespace tree {
55
56class GeneralAlphabet;
57class SubtreeWildcard;
58
71template < class SymbolType >
72class UnorderedRankedPattern final : public core::Components < UnorderedRankedPattern < SymbolType >, ext::set < common::ranked_symbol < SymbolType > >, component::Set, GeneralAlphabet, common::ranked_symbol < SymbolType >, component::Value, SubtreeWildcard > {
77
85 void checkAlphabet ( const ext::tree < common::ranked_symbol < SymbolType > > & data ) const;
86
94 void checkArities ( const ext::tree < common::ranked_symbol < SymbolType > > & data ) const;
95
96public:
105
113
120
127 return this->template accessComponent < GeneralAlphabet > ( ).get ( );
128 }
129
136 return std::move ( this->template accessComponent < GeneralAlphabet > ( ).get ( ) );
137 }
138
145 this->template accessComponent < GeneralAlphabet > ( ).add ( symbols );
146 }
147
154 return this->template accessComponent < SubtreeWildcard > ( ).get ( );
155 }
156
163 return std::move ( this->template accessComponent < SubtreeWildcard > ( ).get ( ) );
164 }
165
172
178 ext::tree < common::ranked_symbol < SymbolType > > && getContent ( ) &&;
179
187 void setTree ( ext::tree < common::ranked_symbol < SymbolType > > pattern );
188
196 auto operator <=> ( const UnorderedRankedPattern & other ) const {
197 return std::tie ( m_content, getAlphabet(), getSubtreeWildcard() ) <=> std::tie ( other.m_content, other.getAlphabet(), other.getSubtreeWildcard() );
198 }
199
207 bool operator == ( const UnorderedRankedPattern & other ) const {
208 return std::tie ( m_content, getAlphabet(), getSubtreeWildcard() ) == std::tie ( other.m_content, other.getAlphabet(), other.getSubtreeWildcard() );
209 }
210
219 friend ext::ostream & operator << ( ext::ostream & out, const UnorderedRankedPattern & instance ) {
220 out << "(UnorderedRankedPattern";
221 out << " alphabet = " << instance.getAlphabet ( );
222 out << " content = " << instance.getContent ( );
223 out << " subtreeWildcard = " << instance.getSubtreeWildcard ( );
224 out << ")";
225 return out;
226 }
227
233 void nicePrint ( ext::ostream & os ) const;
234};
235
236template < class SymbolType >
238 checkAlphabet ( m_content );
239 checkArities ( m_content );
240}
241
242template < class SymbolType >
244}
245
246template < class SymbolType >
248}
249
250template < class SymbolType >
252 return m_content;
253}
254
255template < class SymbolType >
257 return std::move ( m_content );
258}
259
260template < class SymbolType >
262 ext::set < common::ranked_symbol < SymbolType > > minimalAlphabet ( data.prefix_begin ( ), data.prefix_end ( ) );
263 std::set_difference ( minimalAlphabet.begin ( ), minimalAlphabet.end ( ), getAlphabet ( ).begin ( ), getAlphabet ( ).end ( ), ext::callback_iterator ( [ ] ( const common::ranked_symbol < SymbolType > & ) {
264 throw TreeException ( "Input symbols not in the alphabet." );
265 } ) );
266}
267
268template < class SymbolType >
269void UnorderedRankedPattern < SymbolType >::checkArities ( const ext::tree < common::ranked_symbol < SymbolType > > & data ) const {
270 if ( data.getData ( ).getRank ( ) != data.getChildren ( ).size ( ) )
271 throw exception::CommonException ( "Invalid rank." );
272
273 for ( const ext::tree < common::ranked_symbol < SymbolType > > & child : data )
274 checkArities ( child );
275}
276
277template < class SymbolType >
279 checkAlphabet ( pattern );
280 checkArities ( pattern );
281
282 this->m_content = TreeAuxiliary::sort ( std::move ( pattern ) );
283}
284
285template < class SymbolType >
287 m_content.nicePrint ( os );
288}
289
290} /* namespace tree */
291
292namespace core {
293
299template < class SymbolType >
300class SetConstraint< tree::UnorderedRankedPattern < SymbolType >, common::ranked_symbol < SymbolType >, tree::GeneralAlphabet > {
301public:
311 const ext::tree < common::ranked_symbol < SymbolType > > & m_content = pattern.getContent ( );
312 return std::find(m_content.prefix_begin(), m_content.prefix_end(), symbol) != m_content.prefix_end() || pattern.template accessComponent < tree::SubtreeWildcard > ( ).get ( ) == symbol;
313 }
314
324 return true;
325 }
326
334 }
335};
336
342template < class SymbolType >
343class ElementConstraint< tree::UnorderedRankedPattern < SymbolType >, common::ranked_symbol < SymbolType >, tree::SubtreeWildcard > {
344public:
354 return pattern.template accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol );
355 }
356
366 if( symbol.getRank() != 0 )
367 throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" );
368 }
369};
370
376template < class SymbolType >
377struct normalize < tree::UnorderedRankedPattern < SymbolType > > {
379 common::ranked_symbol < DefaultSymbolType > wildcard = alphabet::SymbolNormalize::normalizeRankedSymbol ( std::move ( value ).getSubtreeWildcard ( ) );
382
383 return tree::UnorderedRankedPattern < > ( std::move ( wildcard ), std::move ( alphabet ), std::move ( content ) );
384 }
385};
386
387} /* namespace core */
388
389extern template class tree::UnorderedRankedPattern < >;
390
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::UnorderedRankedPattern< SymbolType > &, const common::ranked_symbol< SymbolType > &symbol)
Definition: UnorderedRankedPattern.h:365
static bool available(const tree::UnorderedRankedPattern< SymbolType > &pattern, const common::ranked_symbol< SymbolType > &symbol)
Definition: UnorderedRankedPattern.h:353
Definition: components.hpp:25
static bool available(const tree::UnorderedRankedPattern< SymbolType > &, const common::ranked_symbol< SymbolType > &)
Definition: UnorderedRankedPattern.h:323
static bool used(const tree::UnorderedRankedPattern< SymbolType > &pattern, const common::ranked_symbol< SymbolType > &symbol)
Definition: UnorderedRankedPattern.h:310
static void valid(const tree::UnorderedRankedPattern< SymbolType > &, const common::ranked_symbol< SymbolType > &)
Definition: UnorderedRankedPattern.h:333
Definition: setComponents.hpp:26
Basic exception from which all other exceptions are derived.
Definition: CommonException.h:21
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
Tree pattern represented in its natural representation. The representation is so called ranked,...
Definition: RankedPattern.h:72
static ext::tree< SymbolType > sort(ext::tree< SymbolType > tree)
Definition: TreeAuxiliary.h:76
Definition: TreeException.h:15
static ext::tree< common::ranked_symbol< DefaultSymbolType > > normalizeRankedTree(ext::tree< common::ranked_symbol< SymbolType > > &&tree)
Definition: TreeNormalize.h:40
Tree pattern represented in its natural representation. The representation is so called ranked,...
Definition: UnorderedRankedPattern.h:72
void extendAlphabet(const ext::set< common::ranked_symbol< SymbolType > > &symbols)
Definition: UnorderedRankedPattern.h:144
void setTree(ext::tree< common::ranked_symbol< SymbolType > > pattern)
Definition: UnorderedRankedPattern.h:278
const ext::tree< common::ranked_symbol< SymbolType > > & getContent() const &
Definition: UnorderedRankedPattern.h:251
const ext::set< common::ranked_symbol< SymbolType > > & getAlphabet() const &
Definition: UnorderedRankedPattern.h:126
const common::ranked_symbol< SymbolType > & getSubtreeWildcard() const &
Definition: UnorderedRankedPattern.h:153
common::ranked_symbol< SymbolType > && getSubtreeWildcard() &&
Definition: UnorderedRankedPattern.h:162
void nicePrint(ext::ostream &os) const
Definition: UnorderedRankedPattern.h:286
ext::set< common::ranked_symbol< SymbolType > > && getAlphabet() &&
Definition: UnorderedRankedPattern.h:135
UnorderedRankedPattern(common::ranked_symbol< SymbolType > subtreeWildcard, ext::set< common::ranked_symbol< SymbolType > > alphabet, ext::tree< common::ranked_symbol< SymbolType > > pattern)
Creates a new instance of the pattern with concrete alphabet, content, and wildcard.
Definition: UnorderedRankedPattern.h:237
friend ext::ostream & operator<<(ext::ostream &out, const UnorderedRankedPattern &instance)
Definition: UnorderedRankedPattern.h:219
bool operator==(const UnorderedRankedPattern &other) const
Definition: UnorderedRankedPattern.h:207
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::UnorderedRankedPattern< > eval(tree::UnorderedRankedPattern< SymbolType > &&value)
Definition: UnorderedRankedPattern.h:378
Definition: normalize.hpp:13