Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
ApproximateEnhancedCoversCommon.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <alib/pair>
9#include <alib/set>
10#include <alib/vector>
11#include <string/LinearString.h>
12
13namespace stringology::cover {
14
21public:
26
27protected:
32 struct Element {
33 unsigned depth, level;
34 Element ( ) = default;
35 Element ( unsigned d, unsigned l ) : depth ( d ), level ( l ) { }
36 };
37
41 struct State {
42 // depth is equal to the number of transitions from the starting state to
43 // this state
44 unsigned depth = 0;
45
46 // Pair of two integers - depth of the element with level 0 and length of
47 // corresponding factor
49
50 // d-subset of this state
52
53 State ( ) = default;
54 ~State ( ) = default;
55
56 // default move constructor
57 State ( State && other ) = default;
58
59 // default move assignment operator
60 State & operator =( State && other ) = default;
61 };
62
69 static unsigned distEnhCov ( const State & q ) {
70 unsigned r = 0;
71 unsigned m = q.elements[0].depth;
72
73 for ( size_t i = 1; i < q.elements.size ( ); ++i ) {
74 if ( q.elements[i].depth - q.elements[i - 1].depth < m )
75 r += q.elements[i].depth - q.elements[i - 1].depth;
76 else
77 r += m;
78 }
79
80 return r + m;
81 }
82
92 static void updateEnhCov ( const State & state, ext::set < ext::pair < unsigned, unsigned > > & enhCovers, unsigned & h ) {
93 unsigned hNext = distEnhCov ( state );
94
95 // update the current set if this state covers more positions
96 if ( hNext > h ) {
97 h = hNext;
98 enhCovers.clear ( );
99 }
100
101 if ( hNext == h )
102 enhCovers.insert ( state.lfactor );
103 }
104
114 template < class SymbolType >
115 static State constrFirstState ( const string::LinearString < SymbolType > & x, unsigned k, const SymbolType & symbol ) {
116 State firstState;
117
118 firstState.depth = 1;
119 firstState.lfactor = ext::pair < unsigned, unsigned > ( 1, 1 );
120
121 for ( size_t i = 0; i < x.getContent ( ).size ( ); ++i ) {
122 if ( symbol == x.getContent ( )[i] )
123 firstState.elements.emplace_back ( i + 1, 0 );
124 else if ( k > 0 )
125 firstState.elements.emplace_back ( i + 1, 1 );
126 }
127
128 return firstState;
129 }
130
141 template < class SymbolType >
142 static State constrNextState ( const string::LinearString < SymbolType > & x, const State & previousState, unsigned k, const SymbolType & symbol ) {
143 State nextState;
144
145 nextState.depth = previousState.depth + 1;
146 nextState.lfactor = previousState.lfactor;
147
148 for ( const auto & element : previousState.elements )
149 if ( element.depth < x.getContent ( ).size ( ) ) {
150 if ( symbol == x.getContent ( )[element.depth] ) {
151 nextState.elements.emplace_back ( element.depth + 1, element.level );
152 nextState.lfactor = ext::pair < unsigned, unsigned > ( element.depth + 1, nextState.depth );
153 } else if ( element.level < k ) {
154 nextState.elements.emplace_back ( element.depth + 1, element.level + 1 );
155 }
156 }
157
158 return nextState;
159 }
160
170 template < class SymbolType >
171 static bool isBorder ( const State & state, const string::LinearString < SymbolType > & x, unsigned k ) {
172 Element lastElement = state.elements[state.elements.size ( ) - 1];
173 Element firstElement = state.elements[0];
174
175 return firstElement.depth == state.depth && firstElement.level == 0 && lastElement.depth == x.getContent ( ).size ( ) && lastElement.level == 0 && state.depth > k;
176 }
177
188 template < class SymbolType >
191
192 for ( const auto & p : enhCovers )
193 result.insert ( string::LinearString ( ext::vector < SymbolType > ( x.getContent ( ).cbegin ( ) + p.first - p.second, x.getContent ( ).cbegin ( ) + p.first ) ) );
194
195 return result;
196 }
197
198};
199
200} // namespace stringology::cover
201
Class extending the pair class from the standard library. Original reason is to allow printing of the...
Definition: pair.hpp:43
Definition: set.hpp:44
Class extending the vector class from the standard library. Original reason is to allow printing of t...
Definition: vector.hpp:45
Linear string.
Definition: LinearString.h:57
const ext::vector< SymbolType > & getContent() const &
Definition: LinearString.h:238
Definition: ApproximateEnhancedCoversCommon.h:20
static bool isBorder(const State &state, const string::LinearString< SymbolType > &x, unsigned k)
Definition: ApproximateEnhancedCoversCommon.h:171
static State constrNextState(const string::LinearString< SymbolType > &x, const State &previousState, unsigned k, const SymbolType &symbol)
Definition: ApproximateEnhancedCoversCommon.h:142
static unsigned distEnhCov(const State &q)
Definition: ApproximateEnhancedCoversCommon.h:69
static ext::set< string::LinearString< SymbolType > > getFactors(const string::LinearString< SymbolType > &x, ext::set< ext::pair< unsigned int, unsigned int > > &enhCovers)
Definition: ApproximateEnhancedCoversCommon.h:189
static State constrFirstState(const string::LinearString< SymbolType > &x, unsigned k, const SymbolType &symbol)
Definition: ApproximateEnhancedCoversCommon.h:115
static void updateEnhCov(const State &state, ext::set< ext::pair< unsigned, unsigned > > &enhCovers, unsigned &h)
Definition: ApproximateEnhancedCoversCommon.h:92
int i
Definition: AllEpsilonClosure.h:118
typename T::SymbolType SymbolType
Definition: ReachableStates.h:176
q
Definition: SingleInitialStateEpsilonTransition.h:85
for(const StateType &state :fsm.getStates()) renamingData.insert(std Rename::RenamedAutomaton< T > result(renamingData.at(fsm.getInitialState()))
Definition: Rename.h:253
Definition: ApproximateCoversComputation.cpp:9
Definition: ApproximateEnhancedCoversCommon.h:32
Element(unsigned d, unsigned l)
Definition: ApproximateEnhancedCoversCommon.h:35
unsigned level
Definition: ApproximateEnhancedCoversCommon.h:33
unsigned depth
Definition: ApproximateEnhancedCoversCommon.h:33
Definition: ApproximateEnhancedCoversCommon.h:41
unsigned depth
Definition: ApproximateEnhancedCoversCommon.h:44
ext::vector< Element > elements
Definition: ApproximateEnhancedCoversCommon.h:51
ext::pair< unsigned, unsigned > lfactor
Definition: ApproximateEnhancedCoversCommon.h:48