Awali
Another Weighted Automata library
letterize_tape.hh
Go to the documentation of this file.
1 // This file is part of Awali.
2 // Copyright 2016-2021 Sylvain Lombardy, Victor Marsault, Jacques Sakarovitch
3 //
4 // Awali is a free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
16 
17 #ifndef AWALI_ALGOS_TDC_LAW_TO_LAN_HH
18 #define AWALI_ALGOS_TDC_LAW_TO_LAN_HH
19 
21 #include <awali/sttc/algos/projection.hh> // tuple_to_tupleset
23 #include <awali/sttc/misc/add_epsilon_trans.hh> // is_epsilon
25 #include<unordered_map>
26 
27 /*
28  Convert a transducer with words on tape I
29  into a transducer with epsilon or letters on this tape.
30 */
31 
32 namespace awali {
33  namespace sttc {
34 
35  namespace internal {
36  template<typename T> struct map_nullable;
37  template<typename Letterset, typename... T>
38  struct map_nullable<tupleset<Letterset, T...>> {
41 
42  static tupleT gettuple(const std::tuple<Letterset, T...>& t) { return std::tuple_cat(std::make_tuple(get_nullableset(std::get<0>(t))), map_nullable<tupleset<T...>>::gettuple (tuple_tail(t))); }
43 
44  static type get(const tupleset<Letterset, T...>& ts) { return {gettuple(ts.sets())}; }
45 
46  };
47 
48  template<>
49  struct map_nullable<tupleset<>> {
50  using tupleT = std::tuple<>;
51  using type = tupleset<>;
52 
53  static tupleT gettuple(const std::tuple<>& t) { return t; }
54  static type get(const tupleset<>& ts) { return ts; }
55  };
56 
57  template <typename T, size_t I, typename U> struct replace_in_tupleset;
58 
59  template <typename... T, size_t I, typename U>
60  struct replace_in_tupleset<tupleset<T...>, I, U>{
61  using tp_t = tupleset<T...>;
63 
64  static
65  type get(const tp_t& t, const U& v) {
66  return {replace_in_tuple<I,U>::get(t.sets(), v)};
67  }
68  };
69 
70  template <typename Tdc, unsigned I, typename Labelset>
71  struct tdc_letterizer {
72  using ret_transducer_t = Tdc;
73  static ret_transducer_t tdc_letterize(const Tdc& tdc, bool keep_history) {
74  return copy(tdc, keep_history);
75  }
76  };
77 
78  template <typename Tdc, unsigned I, typename L>
79  struct tdc_letterizer<Tdc, I, wordset<L>> {
80  using transducer_t = Tdc;
83  using Ilabelset_t = typename labelset_t::template valueset_t<I>;
86 
88  using nullable_label_t = typename nullable_labelset_t::value_t;
89 
93  using ret_label_t = typename ret_labelset_t::value_t;
94 
95  static ret_transducer_t tdc_letterize(const transducer_t& tdc, bool keep_history) {
96  const labelset_t& in_labelset=*tdc->context().labelset();
97  nletterset_t nletset = get_nullableset(get_letterset(in_labelset.template set<I>()));
98  nullable_labelset_t null_labelset=map_nullable<labelset_t>::get(in_labelset);
100  auto ret= make_mutable_automaton(ret_context_t{ret_labelset,*tdc->context().weightset()});
101  std::unordered_map<state_t,state_t> state_map;
102  auto epsilon = ret_labelset.one();
103  for(auto s : tdc->states()) {
104  state_map[s]=ret->add_state();
105  }
106  state_map[ret->pre()]=tdc->pre();
107  state_map[ret->post()]=tdc->post();
108  for(auto tr: tdc->all_transitions()) {
109  nullable_label_t l=tdc->label_of(tr);
110  const auto& w=std::get<I>(l);
111  if(w.length()==0)
112  ret->new_transition(state_map[tdc->src_of(tr)], state_map[tdc->dst_of(tr)], replace_in_tuple<I,typename nletterset_t::value_t>::get(l,nletset.one()),tdc->weight_of(tr));
113  else if (w.length()==1)
114  ret->new_transition(state_map[tdc->src_of(tr)], state_map[tdc->dst_of(tr)], replace_in_tuple<I,typename nletterset_t::value_t>::get(l,w[0]), tdc->weight_of(tr));
115  else {
116  state_t dst=state_map[tdc->dst_of(tr)];
117  for(unsigned i=w.length()-1; i>0;i--) {
118  state_t src=ret->add_state();
119  std::get<I>(epsilon)=w[i];
120  ret->new_transition(src, dst, epsilon);
121  dst=src;
122  }
123  ret->new_transition(state_map[tdc->src_of(tr)], dst, replace_in_tuple<I,typename nletterset_t::value_t>::get(l,w[0]), tdc->weight_of(tr));
124  }
125  }
126  if(keep_history) {
127  auto sg_history = std::make_shared<single_history<transducer_t>>(tdc);
128  for(auto p : state_map)
129  sg_history->add_state(p.second,p.first);
130  ret->set_history(sg_history);
131  }
132  return ret;
133  }
134  };
135  }
136 
137  template<unsigned I, typename Tdc>
138  auto letterize_tape(const Tdc& tdc, bool keep_history=true) -> typename internal::tdc_letterizer<Tdc,I,typename labelset_t_of<Tdc>::template valueset_t<I>>::ret_transducer_t {
139  return internal::tdc_letterizer<Tdc,I,typename labelset_t_of<Tdc>::template valueset_t<I>>::tdc_letterize(tdc, keep_history);
140  }
141  }
142 }//end of ns awali::stc
143 
144 #endif
carries the algebraic settings of automata
Definition: context.hh:40
context(const context &that)
Definition: context.hh:67
A ValueSet which is a Cartesian product of ValueSets.
Definition: tupleset.hh:80
const valuesets_t & sets() const
The componants valuesets, as a tuple.
Definition: tupleset.hh:152
Implementation of labels are words.
Definition: wordset.hh:35
weightset_description weightset(const std::string &k)
auto tuple_tail(const Tuple &t) -> typename tail_tuple< Tuple >::type
Definition: sub_tuple.hh:96
Definition: letterize_tape.hh:36
Definition: letterize_tape.hh:57
Definition: projection.hh:52
auto letterize_tape(const Tdc &tdc, bool keep_history=true) -> typename internal::tdc_letterizer< Tdc, I, typename labelset_t_of< Tdc >::template valueset_t< I >>::ret_transducer_t
Definition: letterize_tape.hh:138
auto get_nullableset(const L &labelset) -> typename labelset_trait< L >::nullable_t
Definition: traits.hh:195
auto get_letterset(const L &labelset) -> typename labelset_trait< L >::letterset_t
Definition: traits.hh:174
typename internal::labelset_t_of_impl< internal::base_t< ValueSet > >::type labelset_t_of
Helper to retrieve the type of the labelset of a value set.
Definition: traits.hh:76
AutOut copy(const AutIn &input, Pred keep_state, bool keep_history=true, bool transpose=false)
A copy of input keeping only its states that are accepted by keep_state.
Definition: copy.hh:185
mutable_automaton< Context > make_mutable_automaton(const Context &ctx)
Definition: mutable_automaton.hh:911
std::shared_ptr< internal::mutable_automaton_impl< Context > > mutable_automaton
Definition: mutable_automaton.hh:45
typename internal::weightset_t_of_impl< internal::base_t< ValueSet > >::type weightset_t_of
Helper to retrieve the type of the weightset of a value set.
Definition: traits.hh:86
Main namespace of Awali.
Definition: ato.hh:22
unsigned state_t
Definition: types.hh:21
static tupleT gettuple(const std::tuple< Letterset, T... > &t)
Definition: letterize_tape.hh:42
typename tuple_to_tupleset< tupleT >::type type
Definition: letterize_tape.hh:40
static type get(const tupleset< Letterset, T... > &ts)
Definition: letterize_tape.hh:44
typename std::cons_tuple< typename labelset_trait< Letterset >::nullable_t, typename map_nullable< tupleset< T... > >::tupleT >::type tupleT
Definition: letterize_tape.hh:39
static type get(const tupleset<> &ts)
Definition: letterize_tape.hh:54
std::tuple<> tupleT
Definition: letterize_tape.hh:50
static tupleT gettuple(const std::tuple<> &t)
Definition: letterize_tape.hh:53
Definition: sub_tuple.hh:144
static auto get(const Tuple &t, const T &x) -> type< Tuple >
Definition: sub_tuple.hh:152
static type get(const tp_t &t, const U &v)
Definition: letterize_tape.hh:65
typename tuple_to_tupleset< typename replace_in_tuple< I, U >::template type< std::tuple< T... > >>::type type
Definition: letterize_tape.hh:62
labelset_t_of< Tdc > labelset_t
Definition: letterize_tape.hh:81
typename labelset_trait< letterset_t >::nullable_t nletterset_t
Definition: letterize_tape.hh:85
static ret_transducer_t tdc_letterize(const transducer_t &tdc, bool keep_history)
Definition: letterize_tape.hh:95
typename replace_in_tupleset< nullable_labelset_t, I, nletterset_t >::type ret_labelset_t
Definition: letterize_tape.hh:90
typename map_nullable< labelset_t >::type nullable_labelset_t
Definition: letterize_tape.hh:87
typename labelset_trait< Ilabelset_t >::letterset_t letterset_t
Definition: letterize_tape.hh:84
mutable_automaton< ret_context_t > ret_transducer_t
Definition: letterize_tape.hh:92
weightset_t_of< Tdc > weightset_t
Definition: letterize_tape.hh:82
typename nullable_labelset_t::value_t nullable_label_t
Definition: letterize_tape.hh:88
typename labelset_t::template valueset_t< I > Ilabelset_t
Definition: letterize_tape.hh:83
typename ret_labelset_t::value_t ret_label_t
Definition: letterize_tape.hh:93
Definition: letterize_tape.hh:71
static ret_transducer_t tdc_letterize(const Tdc &tdc, bool keep_history)
Definition: letterize_tape.hh:73
Tdc ret_transducer_t
Definition: letterize_tape.hh:72
L nullable_t
Definition: traits.hh:34
L letterset_t
Definition: traits.hh:36
Definition: tuple.hh:359