Vcsn  2.5.dev
Be Rational
tupleset.hh
Go to the documentation of this file.
1 #pragma once
2 
3 #include <iosfwd>
4 #include <istream>
5 #include <set>
6 #include <tuple>
7 
8 #include <boost/optional.hpp>
9 #include <boost/range/join.hpp>
10 
11 #include <vcsn/config.hh> // VCSN_HAVE_CORRECT_LIST_INITIALIZER_ORDER
12 #include <vcsn/ctx/traits.hh>
13 //#include <vcsn/core/rat/expressionset.hh> needed, but breaks everythying...
14 #include <vcsn/labelset/fwd.hh>
16 #include <vcsn/misc/cross.hh>
17 #include <vcsn/misc/escape.hh>
18 #include <vcsn/misc/filter.hh>
19 #include <vcsn/misc/raise.hh>
20 #include <vcsn/misc/static-if.hh>
21 #include <vcsn/misc/stream.hh>
22 #include <vcsn/misc/tuple.hh> // tuple_element_t
23 #include <vcsn/misc/zip.hh>
24 #include <vcsn/weightset/b.hh>
25 
26 namespace vcsn
27 {
28  namespace detail
29  {
30 
35  template <typename Enable = void, typename... ValueSets>
37  {
38  using genset_t = void;
39  using genset_ptr = void;
40  using letter_t = void;
41  using letters_t = void;
43  using word_t = std::tuple<typename ValueSets::value_t...>;
44  constexpr static bool is_labelset = false;
45  };
46 
48  template <typename... ValueSets>
49  struct labelset_types_impl<decltype(pass{std::declval<ValueSets>().genset()...},
50  void()),
51  ValueSets...>
52  {
53  using genset_t
54  = cross_sequences<decltype(std::declval<ValueSets>().generators())...>;
55  using genset_ptr = std::tuple<typename ValueSets::genset_ptr...>;
56  using letter_t = std::tuple<typename ValueSets::letter_t...>;
57  using letters_t = std::set<letter_t,
58  vcsn::less<tupleset<ValueSets...>, letter_t>>;
59  using word_t = std::tuple<typename ValueSets::word_t...>;
60  constexpr static bool is_labelset = true;
61  };
62 
63  template <typename... ValueSets>
64  using labelset_types = labelset_types_impl<void, ValueSets...>;
65 
70  template <typename... ValueSets>
71  class tupleset_impl
72  {
73  public:
74  using valuesets_t = std::tuple<ValueSets...>;
75  using indices_t = make_index_sequence<sizeof...(ValueSets)>;
76  static constexpr indices_t indices{};
77  template <std::size_t... I>
78  using seq = index_sequence<I...>;
79 
81  template <std::size_t I>
83 
84  public:
85  using self_t = tupleset<ValueSets...>;
86 
88  using value_t = std::tuple<typename ValueSets::value_t...>;
89 
91  using letter_t = typename labelset_types<ValueSets...>::letter_t;
93  using letters_t = typename labelset_types<ValueSets...>::letters_t;
95  // using genset_t = typename labelset_types<ValueSets...>::genset_t;
96  using genset_ptr = typename labelset_types<ValueSets...>::genset_ptr;
98  using word_t = typename labelset_types<ValueSets...>::word_t;
99 
101  constexpr static bool is_labelset
103 
106 
108 
110  : sets_(std::move(vs))
111  {}
112 
113  tupleset_impl(ValueSets... ls)
114  : sets_(std::move(ls)...)
115  {}
116 
118  {}
119 
120  static symbol sname()
121  {
122  static auto res = symbol{sname_(indices)};
123  return res;
124  }
125 
127  static constexpr std::size_t size()
128  {
129  return sizeof...(ValueSets);
130  }
131 
133  template <typename Value>
134  static size_t size(const Value& v)
135  {
136  return size_(v, indices);
137  }
138 
139  static constexpr bool
141  {
142  return is_commutative_(indices);
143  }
144 
145  static constexpr bool
147  {
148  return is_idempotent_(indices);
149  }
150 
152  static self_t make(std::istream& is)
153  {
154  // name: lat<law_char(abc), law_char(xyz)>
155  kind_t::make(is);
156  eat(is, '<');
157  auto res = make_(is, indices);
158  eat(is, '>');
159  return res;
160  }
161 
163  const valuesets_t& sets() const
164  {
165  return sets_;
166  }
167 
169  template <size_t I>
170  const valueset_t<I>& set() const
171  {
172  return std::get<I>(sets());
173  }
174 
176  template <size_t I>
178 
182  template <size_t I>
183  const valueset_t<I>& project() const
184  {
185  return set<I>();
186  }
187 
189  template <size_t I>
190  auto project(const value_t& v) const
191  {
192  return std::get<I>(v);
193  }
194 
198  bool open(bool o) const
199  {
200  return this->open_(o, indices);
201  }
202 
204  template <typename... Args>
205  value_t value(const std::tuple<Args...>& args) const
206  {
207  return this->value_(args, indices);
208  }
209 
211  template <typename... Args>
212  value_t tuple(Args&&... args) const
213  {
214  return value_t{args...};
215  }
216 
219  template <typename... LS1, typename... LS2>
220  auto compose(const tupleset<LS1...>& ls1,
221  const typename tupleset<LS1...>::value_t& l1,
222  const tupleset<LS2...>& ls2,
223  const typename tupleset<LS2...>::value_t& l2) const
224  -> std::enable_if_t<are_labelsets_composable<tupleset<LS1...>,
225  tupleset<LS2...>>{},
226  value_t>
227  {
228  // Tape of the lhs on which we compose.
229  constexpr auto out = tupleset<LS1...>::size() - 1;
230  // Tape of the rhs on which we compose.
231  constexpr auto in = 0;
234  return compose_(ls1, l1, ls2, l2,
235  indices1_t{}, indices2_t{});
236  }
237 
238  genset_ptr
239  genset() const
240  {
241  return this->genset_(indices);
242  }
243 
245  auto
247  {
248  return this->pregenerators_(indices);
249  }
250 
252  auto
253  generators() const
254  {
255  if (has_one())
256  return pregenerators().skip_first();
257  else
258  return pregenerators();
259  }
260 
261  static constexpr bool is_free()
262  {
263  return is_free_(indices);
264  }
265 
267  template <typename... Args>
268  auto
269  word(const std::tuple<Args...>& v) const
270  -> word_t
271  {
272  return this->word_(v, indices);
273  }
274 
276  template <typename Fun>
277  auto
278  map(Fun&& fun) const
279  {
280  return map_impl_(std::forward<Fun>(fun), indices);
281  }
282 
284  static bool
285  equal(const value_t& l, const value_t& r)
286  {
287  return equal_(l, r, indices);
288  }
289 
291  template <typename LhsValue, typename RhsValue>
292  static auto
293  compare(const LhsValue& l, const RhsValue& r)
294  -> int
295  {
296  return less(r, l) - less(l, r);
297  }
298 
300  template <typename LhsValue, typename RhsValue>
301  static auto
302  less(const LhsValue& l, const RhsValue& r)
303  -> bool
304  {
305  auto sl = size(l);
306  auto sr = size(r);
307  if (sl < sr)
308  return true;
309  else if (sr < sl)
310  return false;
311  else
312  return less_(l, r, indices);
313  }
314 
315  static value_t
317  {
318  return special_(indices);
319  }
320 
321  static bool
322  is_special(const value_t& l)
323  {
324  return is_special_(l, indices);
325  }
326 
327  bool
328  is_zero(const value_t& l) const
329  {
330  return is_zero_(l, indices);
331  }
332 
333  static constexpr bool
335  {
336  return has_lightening_weights_(indices);
337  }
338 
339  static constexpr bool
341  {
342  return has_one_(indices);
343  }
344 
345  static constexpr bool
347  {
348  return is_expressionset_(indices);
349  }
350 
351  static constexpr bool
353  {
354  return is_letterized_(indices);
355  }
356 
357  private:
358  template <std::size_t... I>
359  static auto one_(seq<I...>)
360  -> decltype(value_t{valueset_t<I>::one()...})
361  {
362  return value_t{valueset_t<I>::one()...};
363  }
364 
365  public:
370  template <typename Indices = indices_t>
371  static auto one() -> decltype(one_(Indices{}))
372  {
373  return one_(Indices{});
374  }
375 
376  static bool
377  is_one(const value_t& l)
378  {
379  return is_one_(l, indices);
380  }
381 
382  static bool
384  {
385  return show_one_(indices);
386  }
387 
388  bool
389  is_letter(const value_t&) const
390  {
391  // FIXME: why??? Is this for the printer of expressions?
392  return false;
393  }
394 
396  value_t
397  add(const value_t& l, const value_t& r) const
398  {
399  return map_(l, r,
400  [](const auto& vs, const auto& l, const auto& r)
401  {
402  return vs.add(l, r);
403  });
404  }
405 
410  template <typename LhsValue, typename RhsValue>
411  auto
412  mul(const LhsValue& l, const RhsValue& r) const
413  -> word_t
414  {
415  return this->mul_(l, r, indices);
416  }
417 
419  value_t
420  lgcd(const value_t& l, const value_t& r) const
421  {
422  return map_(l, r,
423  [](const auto& vs, const auto& l, const auto& r)
424  {
425  return vs.lgcd(l, r);
426  });
427  }
428 
430  value_t
431  rdivide(const value_t& l, const value_t& r) const
432  {
433  return map_(l, r,
434  [](const auto& vs, const auto& l, const auto& r)
435  {
436  return vs.rdivide(l, r);
437  });
438  }
439 
440  boost::optional<value_t>
441  maybe_rdivide(const value_t& l, const value_t& r) const
442  {
443  bool valid = true;
444  auto res = map_(l, r,
445  [&valid](const auto& vs, const auto& l, const auto& r)
446  {
447  if (auto res = vs.maybe_rdivide(l, r))
448  return *res;
449  else
450  {
451  valid = false;
452  return l;
453  }
454  });
455 
456  if (valid)
457  return res;
458  else
459  return boost::none;
460  }
461 
463  value_t
464  ldivide(const value_t& l, const value_t& r) const
465  {
466  return map_(l, r,
467  [](const auto& vs, const auto& l, const auto& r)
468  {
469  return vs.ldivide(l, r);
470  });
471  }
472 
473  boost::optional<value_t>
474  maybe_ldivide(const value_t& l, const value_t& r) const
475  {
476  bool valid = true;
477  auto res = map_(l, r,
478  [&valid](const auto& vs, const auto& l, const auto& r)
479  {
480  if (auto res = vs.maybe_ldivide(l, r))
481  return *res;
482  else
483  {
484  valid = false;
485  return l;
486  }
487  });
488 
489  if (valid)
490  return res;
491  else
492  return boost::none;
493  }
494 
499  typename valueset_t<0>::value_t
501  {
502  return this->lnormalize_here_(v, indices);
503  }
504 
506  value_t
507  star(const value_t& v) const
508  {
509  return map_(v,
510  [](const auto& vs, const auto& v)
511  {
512  return vs.star(v);
513  });
514  }
515 
521  template <typename Value>
522  Value
523  delimit(const Value& l) const
524  {
525  return this->delimit_(l, indices);
526  }
527 
529  template <typename Value>
530  Value
531  undelimit(const Value& l) const
532  {
533  return this->undelimit_(l, indices);
534  }
535 
536  // FIXME: this needs to be computed.
537  static constexpr star_status_t star_status()
538  {
540  }
541 
543  template <typename Value>
544  Value
545  transpose(const Value& l) const
546  {
547  return this->transpose_(l, indices);
548  }
549 
550  static size_t
551  hash(const value_t& v)
552  {
553  return hash_(v, indices);
554  }
555 
556  static value_t
558  {
559  return v;
560  }
561 
562  value_t
563  conv(b, b::value_t v) const
564  {
565  return v ? one() : zero();
566  }
567 
569  template <typename... VS>
570  value_t
572  const typename tupleset<VS...>::value_t& v) const
573  {
574  return this->conv_(vs, v, indices);
575  }
576 
578  template <typename... VS>
579  value_t
581  const typename nullableset<tupleset<VS...>>::value_t& v) const
582  {
583  return conv(*vs.labelset(), vs.get_value(v));
584  }
585 
587  template <typename VS>
588  value_t
589  conv(const VS& vs, const typename VS::value_t& v) const
590  {
591  return tuple(set<0>().conv(vs, v), set<1>().conv(vs, v));
592  }
593 
595  value_t
596  conv(std::istream& i, bool quoted = true) const
597  {
598  constexpr auto has_label_one
600  return conv_(i, quoted, bool_constant<has_label_one>{});
601  }
602 
604  template <typename Fun>
605  void convs(std::istream& i, Fun&& fun) const
606  {
607  eat(i, '[');
608  conv_label_class_(*this, i,
609  [this,fun](const letter_t& l)
610  {
611  fun(this->value(l));
612  });
613  eat(i, ']');
614  }
615 
616  std::ostream&
617  print_set(std::ostream& o, format fmt = {}) const
618  {
619  return this->print_set_(o, fmt, indices);
620  }
621 
622  std::ostream&
623  print(const value_t& l, std::ostream& o = std::cout,
624  format fmt = {}) const
625  {
626  return this->print_(l, o,
627  // 1, (2, 3) is different from 1, 2, 3:
628  // delimit components.
629  fmt.delimit(true),
630  fmt.delimit() ? "(" : "",
631  fmt.is_for_labels() ? "|" : ",",
632  fmt.delimit() ? ")" : "",
633  indices);
634  }
635 
636  private:
637  template <std::size_t... I>
638  static std::string sname_(seq<I...>)
639  {
640  std::string res = "lat<";
641  const char *sep = "";
642  for (auto n: {valueset_t<I>::sname()...})
643  {
644  res += sep;
645  res += n;
646  sep = ", ";
647  }
648  res.push_back('>');
649  return res;
650  }
651 
652  template <std::size_t... I>
653  static constexpr bool
655  {
656  return all_<valueset_t<I>::is_commutative()...>();
657  }
658 
659  template <std::size_t... I>
660  static constexpr bool
662  {
663  return all_<valueset_t<I>::is_idempotent()...>();
664  }
665 
666  template <std::size_t... I>
667  static self_t make_(std::istream& i, seq<I...>)
668  {
669 #if VCSN_HAVE_CORRECT_LIST_INITIALIZER_ORDER
670  return self_t{(eat_separator_<I>(i),
671  valueset_t<I>::make(i))...};
672 #else
673  return make_gcc_tuple
674  ((eat_separator_<sizeof...(ValueSets)-1 -I>(i),
675  valueset_t<sizeof...(ValueSets)-1 -I>::make(i))...);
676 #endif
677  }
678 
679  template <std::size_t... I>
680  bool open_(bool o, seq<I...>) const
681  {
682  using swallow = int[];
683  (void) swallow { set<I>().open(o)... };
684  std::swap(o, open__);
685  return o;
686  }
687 
690  template <typename Value, std::size_t I>
691  static auto size_(const Value& v, int)
692  -> decltype(valueset_t<I>::size(std::get<I>(v)))
693  {
694  return valueset_t<I>::size(std::get<I>(v));
695  }
696 
699  template <typename Value, std::size_t I>
700  static constexpr auto size_(const Value&, ...)
701  -> size_t
702  {
703  return 0;
704  }
705 
706  template <typename Value, std::size_t... I>
707  static size_t size_(const Value& v, seq<I...>)
708  {
709  return std::max({size_<Value, I>(v, 0)...});
710  }
711 
712  template <typename... Args, std::size_t... I>
713  value_t value_(const std::tuple<Args...>& args, seq<I...>) const
714  {
715  return value_t{set<I>().value(std::get<I>(args))...};
716  }
717 
718  template <typename... LS1, typename... LS2,
719  std::size_t... I1, std::size_t... I2>
721  const typename tupleset<LS1...>::value_t& l1,
722  const tupleset<LS2...>&,
723  const typename tupleset<LS2...>::value_t& l2,
724  seq<I1...>, seq<I2...>) const
725  {
726  return tuple(std::get<I1>(l1)..., std::get<I2>(l2)...);
727  }
728 
729  template <std::size_t... I>
730  genset_ptr
732  {
733  return genset_ptr{set<I>().genset()...};
734  }
735 
736  template <std::size_t... I>
737  auto
739  {
740  return vcsn::cross(set<I>().pregenerators()...);
741  }
742 
743  template <std::size_t... I>
744  static constexpr bool
746  {
747  return all_<valueset_t<I>::is_free()...>();
748  }
749 
750  template <typename... Args, std::size_t... I>
751  word_t
752  word_(const std::tuple<Args...>& l, seq<I...>) const
753  {
754  return word_t{set<I>().word(std::get<I>(l))...};
755  }
756 
757  template <std::size_t... I>
758  static bool
759  equal_(const value_t& l, const value_t& r, seq<I...>)
760  {
761  for (auto n: {valueset_t<I>::equal(std::get<I>(l),
762  std::get<I>(r))...})
763  if (!n)
764  return false;
765  return true;
766  }
767 
768  template <typename LhsValue, typename RhsValue, std::size_t... I>
769  static auto
770  less_(const LhsValue& l, const RhsValue& r, seq<I...>)
771  -> bool
772  {
773  for (auto n: {std::make_pair(valueset_t<I>::less(std::get<I>(l),
774  std::get<I>(r)),
775  valueset_t<I>::less(std::get<I>(r),
776  std::get<I>(l)))...})
777  if (n.first)
778  return true;
779  else if (n.second)
780  return false;
781  return false;
782  }
783 
784  template <std::size_t... I>
785  static std::size_t
787  {
788  std::size_t res = 0;
789  for (auto h: {valueset_t<I>::hash(std::get<I>(v))...})
790  hash_combine(res, h);
791  return res;
792  }
793 
794  template <std::size_t... I>
795  static value_t
797  {
798  return std::make_tuple(valueset_t<I>::special()...);
799  }
800 
801  template <std::size_t... I>
802  static bool
804  {
805  for (auto n: {valueset_t<I>::is_special(std::get<I>(l))...})
806  if (!n)
807  return false;
808  return true;
809  }
810 
811  template <std::size_t... I>
812  static auto zero_(seq<I...>)
813  -> decltype(value_t{valueset_t<I>::zero()...})
814  {
815  return value_t{valueset_t<I>::zero()...};
816  }
817 
818  public:
823  template <typename Indices = indices_t>
824  static auto zero() -> decltype(zero_(Indices{}))
825  {
826  return zero_(Indices{});
827  }
828 
829  private:
830  template <std::size_t... I>
831  bool
832  is_zero_(const value_t& l, seq<I...>) const
833  {
834  for (auto n: {set<I>().is_zero(std::get<I>(l))...})
835  if (!n)
836  return false;
837  return true;
838  }
839 
840  template <std::size_t... I>
841  static constexpr bool
843  {
844  return all_<valueset_t<I>::has_lightening_weights()...>();
845  }
846 
847  template <std::size_t... I>
848  static constexpr bool
850  {
851  return all_<valueset_t<I>::has_one()...>();
852  }
853 
854  template <std::size_t... I>
855  static constexpr bool
857  {
858  return all_<valueset_t<I>::is_expressionset()...>();
859  }
860 
861  template <std::size_t... I>
862  static constexpr bool
864  {
865  return all_<valueset_t<I>::is_letterized()...>();
866  }
867 
868  template <std::size_t... I>
869  static bool
871  {
872  for (auto n: {valueset_t<I>::is_one(std::get<I>(l))...})
873  if (!n)
874  return false;
875  return true;
876  }
877 
878  template <std::size_t... I>
879  static bool
881  {
882  for (auto n: {valueset_t<I>::show_one()...})
883  if (n)
884  return true;
885  return false;
886  }
887 
889  template <typename Fun, std::size_t... I>
890  auto
891  map_impl_(Fun&& fun, seq<I...>) const
892  {
893  return std::make_tuple(fun(set<I>())...);
894  }
895 
897  template <typename Fun>
898  value_t
899  map_(const value_t& v, Fun&& fun) const
900  {
901  return map_impl_(v, std::forward<Fun>(fun), indices);
902  }
903 
904  template <typename Fun, std::size_t... I>
905  value_t
906  map_impl_(const value_t& v, Fun&& fun, seq<I...>) const
907  {
908  return value_t{fun(set<I>(), std::get<I>(v))...};
909  }
910 
912  template <typename Fun>
913  value_t
914  map_(const value_t& l, const value_t& r, Fun&& fun) const
915  {
916  return map_impl_(l, r, std::forward<Fun>(fun), indices);
917  }
918 
919  template <typename Fun, std::size_t... I>
920  value_t
921  map_impl_(const value_t& l, const value_t& r, Fun&& fun, seq<I...>) const
922  {
923  return value_t{fun(set<I>(), std::get<I>(l), std::get<I>(r))...};
924  }
925 
926  template <typename LhsValue, typename RhsValue, std::size_t... I>
927  auto
928  mul_(const LhsValue& l, const RhsValue& r, seq<I...>) const
929  -> word_t
930  {
931  return word_t{set<I>().mul(std::get<I>(l), std::get<I>(r))...};
932  }
933 
934  template <std::size_t... I>
935  typename valueset_t<0>::value_t
937  {
938  typename valueset_t<0>::value_t res = std::get<0>(vs);
939  for (auto v: {std::get<I>(vs)...})
940  res = set<0>().lgcd(res, v);
941  using swallow = int[];
942  (void) swallow { (set<0>().ldivide_here(res, std::get<I>(vs)), 0)... };
943  return res;
944  }
945 
946  template <typename Value, std::size_t... I>
947  Value
948  delimit_(const Value& l, seq<I...>) const
949  {
950  return Value{set<I>().delimit(std::get<I>(l))...};
951  }
952 
953  template <typename Value, std::size_t... I>
954  Value
955  undelimit_(const Value& l, seq<I...>) const
956  {
957  return Value{set<I>().undelimit(std::get<I>(l))...};
958  }
959 
960  template <typename... VS, std::size_t... I>
961  value_t
963  const typename tupleset<VS...>::value_t& v,
964  seq<I...>) const
965  {
966  return value_t{set<I>().conv(vs.template set<I>(), std::get<I>(v))...};
967  }
968 
971  value_t
972  conv_(std::istream& i, bool quoted, std::true_type) const
973  {
974  if (i.peek() == EOF)
975  return one();
976  else
977  // This is not the empty string, bounce to the regular case.
978  return conv_(i, quoted, std::false_type{});
979  }
980 
982  value_t
983  conv_(std::istream& i, bool quoted, std::false_type) const
984  {
985  bool par = i.peek() == '(';
986  if (par)
987  eat(i, '(');
988  value_t res = conv_(i, quoted, indices);
989  if (par)
990  eat(i, ')');
991  return res;
992  }
993 
994  template <std::size_t... I>
995  value_t
996  conv_(std::istream& i, bool quoted, seq<I...>) const
997  {
998 #if VCSN_HAVE_CORRECT_LIST_INITIALIZER_ORDER
999  return value_t{(eat_separator_<I>(i),
1000  set<I>().conv(i, quoted))...};
1001 #else
1002  constexpr auto S = sizeof...(ValueSets)-1;
1003  return
1004  detail::make_gcc_tuple((eat_separator_<S - I>(i),
1005  set<S - I>().conv(i, quoted))...);
1006 #endif
1007  }
1008 
1013  template <std::size_t I>
1014  static void
1015  eat_separator_(std::istream& i)
1016  {
1017  if (I)
1018  eat(i, i.peek() == ',' ? ',' : '|');
1019  while (isspace(i.peek()))
1020  i.ignore();
1021  }
1022 
1023 
1024  template <std::size_t... I>
1025  std::ostream&
1026  print_(const value_t& l, std::ostream& o,
1027  format fmt,
1028  const char* pre,
1029  const char* sep,
1030  const char* post,
1031  seq<I...>) const
1032  {
1033  if (!is_special(l))
1034  {
1035  using swallow = int[];
1036  (void) swallow
1037  {
1038  (o << (I == 0 ? pre : sep),
1039  set<I>().print(std::get<I>(l), o, fmt),
1040  0)...
1041  };
1042  o << post;
1043  }
1044  return o;
1045  }
1046 
1047  template <std::size_t... I>
1048  std::ostream&
1049  print_set_(std::ostream& o, format fmt,
1050  seq<I...>) const
1051  {
1052  const char *sep = "";
1053  const char *close = "";
1054  switch (fmt.kind())
1055  {
1056  case format::latex:
1057  sep = " \\times ";
1058  break;
1059  case format::sname:
1060  o << "lat<";
1061  sep = ", ";
1062  close = ">";
1063  break;
1064  case format::text:
1065  sep = " x ";
1066  break;
1067  case format::utf8:
1068  sep = " × ";
1069  break;
1070  case format::raw:
1071  assert(0);
1072  break;
1073  }
1074  using swallow = int[];
1075  (void) swallow
1076  {
1077  (o << (I == 0 ? "" : sep),
1078  set<I>().print_set(o, fmt),
1079  0)...
1080  };
1081  o << close;
1082  return o;
1083  }
1084 
1085  template <typename Value, std::size_t... I>
1086  Value
1087  transpose_(const Value& l, seq<I...>) const
1088  {
1089  return Value{set<I>().transpose(std::get<I>(l))...};
1090  }
1091 
1093  template <std::size_t... I>
1094  self_t
1095  meet_(const self_t& rhs, seq<I...>) const
1096  {
1097  return self_t{meet(set<I>(), rhs.template set<I>())...};
1098  }
1099 
1101  friend
1102  self_t
1103  meet(const self_t& lhs, const self_t& rhs)
1104  {
1105  return lhs.meet_(rhs, indices);
1106  }
1107 
1109  friend
1110  self_t
1111  meet(const self_t& lhs, const b&)
1112  {
1113  return lhs;
1114  }
1115 
1117  friend
1118  self_t
1119  meet(const b&, const self_t& rhs)
1120  {
1121  return rhs;
1122  }
1123 
1127  mutable bool open__ = false;
1128 
1129  private:
1131  template <std::size_t... I>
1132  auto
1133  get_letter_(std::istream& i, bool quoted, seq<I...>) const
1134  -> letter_t
1135  {
1136 #if VCSN_HAVE_CORRECT_LIST_INITIALIZER_ORDER
1137  return letter_t{(eat_separator_<I>(i),
1138  set<I>().get_letter(i, quoted))...};
1139 #else
1140  constexpr auto S = sizeof...(ValueSets)-1;
1141  return
1142  detail::make_gcc_tuple((eat_separator_<S - I>(i),
1143  set<S - I>().get_letter(i, quoted))...);
1144 #endif
1145  }
1146 
1148  template <typename Value, std::size_t... I>
1149  static auto
1150  letters_of_(const Value& v, seq<I...>)
1151  -> decltype(zip(valueset_t<I>::letters_of(std::get<I>(v))...))
1152  {
1153  return zip(valueset_t<I>::letters_of(std::get<I>(v))...);
1154  }
1155 
1157  template <typename Value, typename... Defaults, std::size_t... I>
1158  auto
1159  letters_of_padded_(const Value& v,
1160  const std::tuple<Defaults...>& def, seq<I...>) const
1161  -> decltype(zip_with_padding(def,
1162  this->set<I>().letters_of_padded(std::get<I>(v),
1163  std::get<I>(def))...))
1164  {
1165  return zip_with_padding(def,
1166  set<I>().letters_of_padded(std::get<I>(v),
1167  std::get<I>(def))...);
1168  }
1169 
1170  public:
1171  template <std::size_t... I>
1172  auto
1173  get_letter(std::istream& i, bool quoted = true) const
1174  -> decltype(this->get_letter_(i, quoted, indices))
1175  {
1176  bool par = i.peek() == '(';
1177  if (par)
1178  eat(i, '(');
1179  auto res = get_letter_(i, quoted, indices);
1180  if (par)
1181  eat(i, ')');
1182  return res;
1183  }
1184 
1190  template <typename Value>
1191  static auto
1192  letters_of(const Value& v)
1193  -> decltype(letters_of_(v, indices))
1194  {
1195  return letters_of_(v, indices);
1196  }
1197 
1203  template <typename Value, typename... Defaults>
1204  auto
1205  letters_of_padded(const Value& v, const std::tuple<Defaults...>& def) const
1206  -> decltype(this->letters_of_padded_(v, def, indices))
1207  {
1208  return letters_of_padded_(v, def, indices);
1209  }
1210  };
1211 
1212  template <typename... ValueSets>
1213  tupleset<ValueSets...>
1214  make_tupleset(const ValueSets&... vss)
1215  {
1216  return {vss...};
1217  }
1218 
1219 
1220  /*----------------.
1221  | is_multitape. |
1222  `----------------*/
1223 
1224  template <typename T1, typename T2>
1226 
1227  // Sure, we'd like to use tuple<> instead of
1228  // weightset_mixin<tupleset_impl<>>, however then we hit a Clang
1229  // 3.5.0 bug.
1230  //
1231  // https://llvm.org/bugs/show_bug.cgi?id=19372
1232  template <typename... T1, typename... T2>
1235  {
1236  using type = weightset_mixin<tupleset_impl<T1..., T2...>>;
1237  };
1238 
1240  template <typename... LabelSets>
1241  struct letterized_traits<tupleset<LabelSets...>>
1242  {
1243  using indices_t = make_index_sequence<sizeof...(LabelSets)>;
1244 
1245  template <std::size_t... I>
1246  using seq = index_sequence<I...>;
1247 
1248  template <size_t I>
1249  using letterized_traits_t =
1251  template <std::size_t... I>
1252  static constexpr bool is_letterized_(seq<I...>)
1253  {
1255  }
1256  static constexpr bool is_letterized = is_letterized_(indices_t{});
1257 
1258  using labelset_t =
1260 
1261  static labelset_t labelset(const tupleset<LabelSets...>& ls)
1262  {
1263  return labelset_(ls, indices_t{});
1264  }
1265 
1266  template <std::size_t... I>
1267  static labelset_t labelset_(const tupleset<LabelSets...>& ls,
1268  seq<I...>)
1269  {
1270  return {make_letterized(std::get<I>(ls.sets()))...};
1271  }
1272  };
1273 
1275  template <typename... LabelSets>
1276  struct nullableset_traits<tupleset<LabelSets...>,
1277  std::enable_if_t<tupleset<LabelSets...>::has_one()>>
1278  {
1279  using labelset_t = tupleset<LabelSets...>;
1280  using type = labelset_t;
1281  static type value(const labelset_t& ls)
1282  {
1283  return ls;
1284  }
1285  };
1286 
1288  template <typename... LabelSets>
1289  struct nullableset_traits<tupleset<LabelSets...>,
1290  std::enable_if_t<!tupleset<LabelSets...>::has_one()>>
1291  {
1292  using labelset_t = tupleset<LabelSets...>;
1294 
1295  static type value(const labelset_t& ls)
1296  {
1297  return ls;
1298  }
1299  };
1300 
1302  template <typename LabelSet>
1303  struct proper_traits<tupleset<LabelSet>>
1304  {
1306  static type value(const tupleset<LabelSet>& ls)
1307  {
1308  return {proper_traits<LabelSet>::value(ls.template set<0>())};
1309  }
1310  };
1311 
1313  template <typename... LabelSets>
1314  struct law_traits<tupleset<LabelSets...>>
1315  {
1316  using labelset_t = tupleset<LabelSets...>;
1318 
1319  template <std::size_t... I>
1321  {
1322  return {make_wordset(ls.template set<I>())...};
1323  }
1324 
1325  static type value(const labelset_t& ls)
1326  {
1327  return value(ls, make_index_sequence<sizeof...(LabelSets)>{});
1328  }
1329  };
1330 
1332  template <typename... VS1, typename... VS2>
1333  struct join_impl<tupleset<VS1...>, tupleset<VS2...>>
1334  {
1335  static_assert(sizeof...(VS1) == sizeof...(VS2),
1336  "join: tuplesets must have the same sizes");
1337  using vs1_t = tupleset<VS1...>;
1338  using vs2_t = tupleset<VS2...>;
1341 
1342  template <std::size_t... I>
1343  static type join(const vs1_t& lhs, const vs2_t& rhs,
1345  {
1346  return {::vcsn::join(lhs.template set<I>(), rhs.template set<I>())...};
1347  }
1348 
1350  static type join(const vs1_t& lhs, const vs2_t& rhs)
1351  {
1352  return join(lhs, rhs,
1353  make_index_sequence<sizeof...(VS1)>{});
1354  }
1355  };
1356 
1358  template <typename... VS1, typename VS2>
1359  struct join_impl<tupleset<VS1...>, VS2>
1360  {
1361  using vs1_t = tupleset<VS1...>;
1362  using vs2_t = VS2;
1365 
1366  template <std::size_t... I>
1367  static type join(const vs1_t& lhs, const vs2_t& rhs,
1369  {
1370  return {::vcsn::join(lhs.template set<I>(), rhs)...};
1371  }
1372 
1374  static type join(const vs1_t& lhs, const vs2_t& rhs)
1375  {
1376  return join(lhs, rhs,
1377  make_index_sequence<sizeof...(VS1)>{});
1378  }
1379  };
1380 
1381 
1382  /*------------------.
1383  | project_labelset. |
1384  `------------------*/
1385 
1388  template <size_t Tape, typename LabelSet>
1390 
1393  template <size_t Tape, typename LabelSet>
1395 
1397  template <size_t Tape, typename... LabelSets>
1398  struct project_labelset_impl<Tape, tupleset<LabelSets...>>
1399  {
1400  using valueset_t = tupleset<LabelSets...>;
1401  using type = typename valueset_t::template project_t<Tape>;
1402  };
1403 
1405  template <size_t Tape, typename Context>
1406  struct project_labelset_impl<Tape, expressionset<Context>>
1407  {
1409  using type = typename valueset_t::template project_t<Tape>;
1410  };
1411 
1412 
1413  /*------------------.
1414  | project_context. |
1415  `------------------*/
1416 
1418  template <size_t Tape, typename Context>
1419  using project_context
1422 
1423  }// detail::
1424 
1425  template <typename... ValueSet>
1426  struct is_multitape<tupleset<ValueSet...>>
1427  : std::true_type
1428  {};
1429 
1430  template <typename... ValueSets>
1431  struct number_of_tapes<tupleset<ValueSets...>>
1432  {
1433  constexpr static auto value = sizeof...(ValueSets);
1434  };
1435 
1436 
1437  /*----------------.
1438  | random_label. |
1439  `----------------*/
1440 
1442  template <typename... LabelSet,
1443  typename RandomGenerator = std::default_random_engine>
1444  typename tupleset<LabelSet...>::value_t
1446  RandomGenerator& gen = RandomGenerator())
1447  {
1448  return random_label_(ls, gen, ls.indices);
1449  }
1450 
1451 
1453  template <typename... LabelSet,
1454  size_t... I,
1455  typename RandomGenerator = std::default_random_engine>
1456  typename tupleset<LabelSet...>::value_t
1458  RandomGenerator& gen,
1460  {
1461  // No need to check for the emptiness here: it will be checked in
1462  // each sub-labelset.
1463  return ls.tuple(random_label(ls.template set<I>(), gen)...);
1464  }
1465 }// vcsn::
typename labelset_types< ValueSets... >::word_t word_t
A tuple of words if meaningful, void otherwise.
Definition: tupleset.hh:98
letterized_t< LabelSet > make_letterized(const LabelSet &ls)
Definition: labelset.hh:100
static type value(const tupleset< LabelSet > &ls)
Definition: tupleset.hh:1306
A ValueSet which is a Cartesian product of ValueSets.
Definition: fwd.hh:23
weightset_mixin< detail::r_impl > r
Definition: fwd.hh:54
static constexpr bool has_one_(seq< I... >)
Definition: tupleset.hh:849
static self_t make(std::istream &is)
Build from the description in is.
Definition: tupleset.hh:152
std::tuple< typename ValueSets::value_t... > value_t
A tuple of values.
Definition: tupleset.hh:88
static bool equal(const value_t &l, const value_t &r)
Whether l equals r.
Definition: tupleset.hh:285
typename labelset_types< ValueSets... >::letter_t letter_t
A tuple of base letters if meaningful, void otherwise.
Definition: tupleset.hh:91
static constexpr bool is_letterized_(seq< I... >)
Definition: tupleset.hh:1252
auto letters_of_padded_(const Value &v, const std::tuple< Defaults... > &def, seq< I... >) const -> decltype(zip_with_padding(def, this->set< I >().letters_of_padded(std::get< I >(v), std::get< I >(def))...))
Must be declared before, as we use its result in decltype.
Definition: tupleset.hh:1159
auto get_letter(std::istream &i, bool quoted=true) const -> decltype(this->get_letter_(i, quoted, indices))
Definition: tupleset.hh:1173
zip_sequences< Sequences... > zip(Sequences &&... seqs)
Definition: zip.hh:439
Request the set implementation (bool weights).
static size_t hash(const value_t &v)
Definition: tupleset.hh:551
value_t value_(const std::tuple< Args... > &args, seq< I... >) const
Definition: tupleset.hh:713
static bool equal_(const value_t &l, const value_t &r, seq< I... >)
Definition: tupleset.hh:759
star_status_t
Definition: star-status.hh:5
void convs(std::istream &i, Fun &&fun) const
Fun: (label_t) -> void.
Definition: tupleset.hh:605
From a labelset, its non-nullable labelset.
Definition: labelset.hh:182
Ignore its arguments.
Definition: raise.hh:18
value_t lgcd(const value_t &l, const value_t &r) const
Pointwise left GCD.
Definition: tupleset.hh:420
static constexpr bool is_commutative_(seq< I... >)
Definition: tupleset.hh:654
Provide a range that allows to iterate over the cross product of the provided ranges.
Definition: cross.hh:16
static auto compare(const LhsValue &l, const RhsValue &r) -> int
Three-way comparison between l and r.
Definition: tupleset.hh:293
letter_t value_type
To be iterable.
Definition: tupleset.hh:105
cross_sequences< Sequences... > cross(Sequences &&... seqs)
Definition: cross.hh:303
static constexpr bool has_one()
Definition: tupleset.hh:340
typename labelset_types< ValueSets... >::letters_t letters_t
A set of letters if meaningful, void otherwise.
Definition: tupleset.hh:93
void swap(config::config_value &first, config::config_value &second)
auto join(const ValueSet &vs) -> ValueSet
The join of a single valueset.
Definition: join.hh:44
static symbol sname()
Definition: tupleset.hh:120
format_t kind() const
Definition: format.hh:98
word_t word_(const std::tuple< Args... > &l, seq< I... >) const
Definition: tupleset.hh:752
static constexpr bool has_lightening_weights()
Definition: tupleset.hh:334
value_t value(const std::tuple< Args... > &args) const
Construct a value.
Definition: tupleset.hh:205
static bool is_special_(const value_t &l, seq< I... >)
Definition: tupleset.hh:803
auto project(const value_t &v) const
The I-th component of the value.
Definition: tupleset.hh:190
bool is_zero_(const value_t &l, seq< I... >) const
Definition: tupleset.hh:832
const valueset_t< I > & project() const
The Ith component valueset.
Definition: tupleset.hh:183
const valuesets_t & sets() const
The componants valuesets, as a tuple.
Definition: tupleset.hh:163
std::tuple< typename ValueSets::value_t... > word_t
Same as value_t.
Definition: tupleset.hh:43
valueset_t< 0 >::value_t lnormalize_here_(value_t &vs, seq< I... >) const
Definition: tupleset.hh:936
Print as a parsable type string.
Definition: format.hh:26
static auto letters_of_(const Value &v, seq< I... >) -> decltype(zip(valueset_t< I >::letters_of(std::get< I >(v))...))
Must be declared before, as we use its result in decltype.
Definition: tupleset.hh:1150
value_t add(const value_t &l, const value_t &r) const
Pointwise addition.
Definition: tupleset.hh:397
context join(const context &c1, const context &c2)
Bridge.
value_t conv(std::istream &i, bool quoted=true) const
Read one label from i, return the corresponding value.
Definition: tupleset.hh:596
law_t< LabelSet > make_wordset(const LabelSet &ls)
The wordset of a labelset.
Definition: labelset.hh:259
friend self_t meet(const self_t &lhs, const b &)
The meet with the B weightset.
Definition: tupleset.hh:1111
Aut transpose(const transpose_automaton< Aut > &aut)
The transpose of a transpose automaton is the original automaton.
Definition: transpose.hh:253
static constexpr star_status_t star_status()
Definition: tupleset.hh:537
std::integral_constant< bool, B > bool_constant
Definition: type_traits.hh:12
auto letters_of_padded(const Value &v, const std::tuple< Defaults... > &def) const -> decltype(this->letters_of_padded_(v, def, indices))
Iterate over the letters of v.
Definition: tupleset.hh:1205
static type join(const vs1_t &lhs, const vs2_t &rhs, index_sequence< I... >)
Definition: tupleset.hh:1367
zip_sequences_padded< zip_sequences< Sequences... > > zip_with_padding(const std::tuple< typename Sequences::value_type... > &pad, const Sequences &... seq)
Definition: zip.hh:453
auto map_impl_(Fun f, const std::tuple< Ts... > &ts, index_sequence< I... >)
Definition: tuple.hh:231
static constexpr bool is_letterized()
Definition: tupleset.hh:352
value_t conv_(const tupleset< VS... > &vs, const typename tupleset< VS... >::value_t &v, seq< I... >) const
Definition: tupleset.hh:962
static constexpr bool is_expressionset()
Definition: tupleset.hh:346
bool is_special(const Aut &aut, transition_t_of< Aut > t)
Whether this transition is from pre or to post.
Definition: automaton.hh:229
auto generators() const
The generators. Meaningful for labelsets only.
Definition: tupleset.hh:253
valueset_t< I > project_t
The type of the I-th tape valueset.
Definition: tupleset.hh:177
A static list of size_t.
Definition: tuple.hh:32
auto conv(const ValueSet &vs, const std::string &str, Args &&... args) -> decltype(vs.conv(std::declval< std::istream &>(), std::forward< Args >(args)...))
Parse str via vs.conv.
Definition: stream.hh:29
static constexpr bool has_lightening_weights_(seq< I... >)
Definition: tupleset.hh:842
static type join(const vs1_t &lhs, const vs2_t &rhs, index_sequence< I... >)
Definition: tupleset.hh:1343
typename project_labelset_impl< Tape, LabelSet >::type project_labelset
The type of the resulting apparent LabelSet when keeping only tape Tape.
Definition: tupleset.hh:1394
The type of the resulting apparent LabelSet when keeping only tape Tape.
Definition: tupleset.hh:1389
auto in(const Aut &aut, state_t_of< Aut > s)
Indexes of visible transitions arriving to state s.
Definition: automaton.hh:135
std::ostream & print_(const value_t &l, std::ostream &o, format fmt, const char *pre, const char *sep, const char *post, seq< I... >) const
Definition: tupleset.hh:1026
always valid.
Definition: star-status.hh:17
static auto one() -> decltype(one_(Indices
A tuple of ones.
Definition: tupleset.hh:371
tupleset_impl(valuesets_t vs)
Definition: tupleset.hh:109
symbol sname()
Definition: name.hh:65
return res
Definition: multiply.hh:399
Value undelimit(const Value &l) const
Remove first and last characters, that must be "special".
Definition: tupleset.hh:531
typename std::tuple_element< I, T >::type tuple_element_t
C++14.
Definition: tuple.hh:14
value_t conv_(std::istream &i, bool quoted, std::false_type) const
Read a tuple in the stream, possibly parenthesized.
Definition: tupleset.hh:983
tupleset< LabelSet... >::value_t random_label_(const tupleset< LabelSet... > &ls, RandomGenerator &gen, detail::index_sequence< I... >)
Implementation detail for random label from tupleset.
Definition: tupleset.hh:1457
The smallest nullableset which includes LabelSet.
Definition: labelset.hh:138
char eat(std::istream &is, char c)
Check lookahead character and advance.
Definition: stream.cc:130
tuple_element_t< I, valuesets_t > valueset_t
The Ith valueset type.
Definition: tupleset.hh:82
Functor to compare Values of ValueSets.
Definition: functional.hh:91
Value undelimit_(const Value &l, seq< I... >) const
Definition: tupleset.hh:955
static bool is_one(const value_t &l)
Definition: tupleset.hh:377
genset_ptr genset() const
Definition: tupleset.hh:239
A traits so that tupleset may define types that may exist.
Definition: tupleset.hh:36
static auto size_(const Value &v, int) -> decltype(valueset_t< I >::size(std::get< I >(v)))
The size of the Ith element, if its valueset features a size() function.
Definition: tupleset.hh:691
Value transpose(const Value &l) const
Transpose a word_t or a value_t.
Definition: tupleset.hh:545
value_t ldivide(const value_t &l, const value_t &r) const
Pointwise left division (l \ r).
Definition: tupleset.hh:464
size_t size(const ExpSet &rs, const typename ExpSet::value_t &r)
Value delimit(const Value &l) const
Add the special character first and last.
Definition: tupleset.hh:523
tupleset< ValueSets... > make_tupleset(const ValueSets &... vss)
Definition: tupleset.hh:1214
value_t conv_(std::istream &i, bool quoted, std::true_type) const
When the valuesets are labelsets and support one, accept the empty string to denote one...
Definition: tupleset.hh:972
value_t compose_(const tupleset< LS1... > &, const typename tupleset< LS1... >::value_t &l1, const tupleset< LS2... > &, const typename tupleset< LS2... >::value_t &l2, seq< I1... >, seq< I2... >) const
Definition: tupleset.hh:720
value_t conv(const nullableset< tupleset< VS... >> &vs, const typename nullableset< tupleset< VS... >>::value_t &v) const
Convert a value from nullableset<tupleset<...>> to value_t.
Definition: tupleset.hh:580
auto mul_(const LhsValue &l, const RhsValue &r, seq< I... >) const -> word_t
Definition: tupleset.hh:928
static void eat_separator_(std::istream &i)
Read the separator from the input stream i if I is not 0.
Definition: tupleset.hh:1015
static auto less(const LhsValue &l, const RhsValue &r) -> bool
Whether l < r.
Definition: tupleset.hh:302
static type value(const labelset_t &ls, index_sequence< I... >)
Definition: tupleset.hh:1320
bool is_letter(const value_t &) const
Definition: tupleset.hh:389
static auto zero_(seq< I... >) -> decltype(value_t
Definition: tupleset.hh:812
auto get_letter_(std::istream &i, bool quoted, seq< I... >) const -> letter_t
Must be declared before, as we use its result in decltype.
Definition: tupleset.hh:1133
ValueSet::value_t lgcd(const ValueSet &vs, const typename ValueSet::value_t &lhs, const typename ValueSet::value_t &rhs)
Left-division of values.
Definition: divide.hh:91
auto map_impl_(Fun &&fun, seq< I... >) const
Run a nullary function pointwise, and return the tuple of results.
Definition: tupleset.hh:891
static std::string sname_(seq< I... >)
Definition: tupleset.hh:638
static constexpr bool is_expressionset_(seq< I... >)
Definition: tupleset.hh:856
static constexpr bool is_idempotent()
Definition: tupleset.hh:146
Whether a ValueSet, or a context, is multitape.
Definition: traits.hh:117
static type join(const vs1_t &lhs, const vs2_t &rhs)
The resulting valueset.
Definition: tupleset.hh:1374
The LAW from a LAL.
Definition: labelset.hh:249
static labelset_t labelset_(const tupleset< LabelSets... > &ls, seq< I... >)
Definition: tupleset.hh:1267
value_t map_(const value_t &l, const value_t &r, Fun &&fun) const
Apply a binary function pointwise, and return the tuple of results.
Definition: tupleset.hh:914
static auto less_(const LhsValue &l, const RhsValue &r, seq< I... >) -> bool
Definition: tupleset.hh:770
static constexpr bool is_free_(seq< I... >)
Definition: tupleset.hh:745
bool is_zero(const value_t &l) const
Definition: tupleset.hh:328
boost::optional< value_t > maybe_rdivide(const value_t &l, const value_t &r) const
Definition: tupleset.hh:441
value_t conv(const tupleset< VS... > &vs, const typename tupleset< VS... >::value_t &v) const
Convert a value from tupleset<...> to value_t.
Definition: tupleset.hh:571
A traits to compute the letterized context.
Definition: labelset.hh:79
typename detail::weightset_t_of_impl< base_t< ValueSet > >::type weightset_t_of
Definition: traits.hh:67
static constexpr bool is_labelset
Definition: tupleset.hh:44
static constexpr bool is_free()
Definition: tupleset.hh:261
expressionset< Context >::value_t random_label(const expressionset< Context > &rs, RandomGenerator &gen=RandomGenerator())
Random label from expressionset: limited to a single label.
auto meet(const expressionset< Ctx1 > &a, const expressionset< Ctx2 > &b) -> expressionset< meet_t< Ctx1, Ctx2 >>
The meet of two expressionsets.
static std::size_t hash_(const value_t &v, seq< I... >)
Definition: tupleset.hh:786
valuesets_t sets_
The tupled valuesets.
Definition: tupleset.hh:1125
static bool is_one_(const value_t &l, seq< I... >)
Definition: tupleset.hh:870
typename labelset_types< ValueSets... >::genset_ptr genset_ptr
A tuple of generators if meaningful, void otherwise.
Definition: tupleset.hh:96
value_t map_(const value_t &v, Fun &&fun) const
Apply a unary function pointwise, and return the tuple of results.
Definition: tupleset.hh:899
void hash_combine(std::size_t &seed, const T &v)
Definition: functional.hh:63
static auto one_(seq< I... >) -> decltype(value_t
Definition: tupleset.hh:359
auto out(const Aut &aut, state_t_of< Aut > s)
Indexes of visible transitions leaving state s.
Definition: automaton.hh:86
bool open_(bool o, seq< I... >) const
Definition: tupleset.hh:680
static value_t conv(self_t, value_t v)
Definition: tupleset.hh:557
Print as is. For instance, don&#39;t try to escape labels.
Definition: format.hh:24
value_t star(const value_t &v) const
Pointwise star.
Definition: tupleset.hh:507
Print for LaTeX.
Definition: format.hh:22
Print as rich UTF-8 text, escaped.
Definition: format.hh:30
constant< type_t::one, Context > one
Definition: fwd.hh:121
auto compose(const tupleset< LS1... > &ls1, const typename tupleset< LS1... >::value_t &l1, const tupleset< LS2... > &ls2, const typename tupleset< LS2... >::value_t &l2) const -> std::enable_if_t< are_labelsets_composable< tupleset< LS1... >, tupleset< LS2... >>
Compose, aka join in the world of databases.
Definition: tupleset.hh:220
static constexpr bool is_idempotent_(seq< I... >)
Definition: tupleset.hh:661
value_t conv_(std::istream &i, bool quoted, seq< I... >) const
Definition: tupleset.hh:996
auto pregenerators() const
The pregenerators. Meaningful for labelsets only.
Definition: tupleset.hh:246
auto pregenerators_(seq< I... >) const
Definition: tupleset.hh:738
static constexpr bool is_commutative()
Definition: tupleset.hh:140
valueset_t< 0 >::value_t lnormalize_here(value_t &v) const
Eliminate the LGCD between all the tapes.
Definition: tupleset.hh:500
static type value(const LabelSet &ls)
Definition: labelset.hh:185
std::ostream & print(const value_t &l, std::ostream &o=std::cout, format fmt={}) const
Definition: tupleset.hh:623
Definition: a-star.hh:8
value_t rdivide(const value_t &l, const value_t &r) const
Pointwise right division (l / r).
Definition: tupleset.hh:431
static type join(const vs1_t &lhs, const vs2_t &rhs)
The resulting valueset.
Definition: tupleset.hh:1350
std::enable_if_t<!is_letterized_t< labelset_t_of< Aut > >{}, bool > is_letterized(const Aut &aut)
Definition: letterize.hh:161
static bool is_special(const value_t &l)
Definition: tupleset.hh:322
static value_t special()
Definition: tupleset.hh:316
Whether two labelsets are composable.
Definition: traits.hh:94
static constexpr bool is_letterized_(seq< I... >)
Definition: tupleset.hh:863
genset_ptr genset_(seq< I... >) const
Definition: tupleset.hh:731
typename valueset_t::template project_t< Tape > type
Definition: tupleset.hh:1409
static constexpr std::size_t size()
Number of tapes.
Definition: tupleset.hh:127
punched_sequence< tupleset< LS2... >::size(), in > indices2_t
Definition: tupleset.hh:233
auto map(Fun &&fun) const
Run a function per set, and return the tuple of results.
Definition: tupleset.hh:278
boost::flyweight< std::string, boost::flyweights::no_tracking, boost::flyweights::intermodule_holder > symbol
An internalized string.
Definition: symbol.hh:21
bool open(bool o) const
Whether unknown letters should be added, or rejected.
Definition: tupleset.hh:198
std::tuple< ValueSets... > valuesets_t
Definition: tupleset.hh:74
An input/output format for valuesets.
Definition: format.hh:13
Value transpose_(const Value &l, seq< I... >) const
Definition: tupleset.hh:1087
Provide a variadic mul on top of a binary mul(), and one().
Definition: fwd.hh:46
static auto letters_of(const Value &v) -> decltype(letters_of_(v, indices))
Iterate over the letters of v.
Definition: tupleset.hh:1192
static auto zero() -> decltype(zero_(Indices
A tuple of zeros.
Definition: tupleset.hh:824
boost::optional< value_t > maybe_ldivide(const value_t &l, const value_t &r) const
Definition: tupleset.hh:474
auto mul(const LhsValue &l, const RhsValue &r) const -> word_t
The product (possibly concatenation) of l and r.
Definition: tupleset.hh:412
value_t map_impl_(const value_t &v, Fun &&fun, seq< I... >) const
Definition: tupleset.hh:906
value_t conv(b, b::value_t v) const
Definition: tupleset.hh:563
auto tuple(const Auts &... as)
Build the (accessible part of the) tuple.
A structure that implements the computation of join(V1, V2).
Definition: join.hh:18
Build the static sequence of size_t [0, N[.
Definition: tuple.hh:56
static constexpr auto size_(const Value &,...) -> size_t
The size of the Ith element, if its valueset does not feature a size() function.
Definition: tupleset.hh:700
static type value(const labelset_t &ls)
Definition: tupleset.hh:1325
constant< type_t::zero, Context > zero
Definition: fwd.hh:118
self_t meet_(const self_t &rhs, seq< I... >) const
The intersection with another tupleset.
Definition: tupleset.hh:1095
std::ostream & print_set(std::ostream &o, format fmt={}) const
Definition: tupleset.hh:617
Value delimit_(const Value &l, seq< I... >) const
Definition: tupleset.hh:948
LabelSet::letters_t conv_label_class_(const LabelSet &ls, std::istream &i)
Read a set of letters (hence, guaranteed in order, and unique).
Definition: labelset.hh:444
Print as plain (ASCII) text, escaped.
Definition: format.hh:28
STL namespace.
value_t map_impl_(const value_t &l, const value_t &r, Fun &&fun, seq< I... >) const
Definition: tupleset.hh:921
auto make_gcc_tuple(Ts &&... ts) -> decltype(reverse_tuple(std::make_tuple(std::forward< Ts >(ts)...)))
Same as make_tuple, unless the evaluation of arguments if right-to-left, in which case reverse the re...
Definition: tuple.hh:388
Implementation of labels are nullables (letter or empty).
Definition: fwd.hh:14
value_t conv(const VS &vs, const typename VS::value_t &v) const
Convert a single tape expression to multitape.
Definition: tupleset.hh:589
friend self_t meet(const self_t &lhs, const self_t &rhs)
The meet with another tupleset.
Definition: tupleset.hh:1103
std::ostream & print_set_(std::ostream &o, format fmt, seq< I... >) const
Definition: tupleset.hh:1049
auto word(const std::tuple< Args... > &v) const -> word_t
Convert to a word.
Definition: tupleset.hh:269
punched_sequence< tupleset< LS1... >::size(), out > indices1_t
Definition: tupleset.hh:232
void print_(std::ostream &o, const T &arg, long)
Serialize arg into o.
Definition: raise.hh:26
static self_t make_(std::istream &i, seq< I... >)
Definition: tupleset.hh:667
value_t tuple(Args &&... args) const
Construct a value.
Definition: tupleset.hh:212
static value_t special_(seq< I... >)
Definition: tupleset.hh:796
tupleset_impl(ValueSets... ls)
Definition: tupleset.hh:113
friend self_t meet(const b &, const self_t &rhs)
The meet with the B weightset.
Definition: tupleset.hh:1119
static bool show_one_(seq< I... >)
Definition: tupleset.hh:880
static size_t size_(const Value &v, seq< I... >)
Definition: tupleset.hh:707
static size_t size(const Value &v)
Get the max of the sizes of the tapes.
Definition: tupleset.hh:134
typename valueset_t::template project_t< Tape > type
Definition: tupleset.hh:1401
static labelset_t labelset(const tupleset< LabelSets... > &ls)
Definition: tupleset.hh:1261