Awali
Another Weighted Automata library
tupleset.hh
Go to the documentation of this file.
1 // This file is part of Awali.
2 // Copyright 2016-2023 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_LABELSET_TUPLESET_HH
18 # define AWALI_LABELSET_TUPLESET_HH
19 
20 # include <iosfwd>
21 # include <istream>
22 # include <set>
23 # include <tuple>
24 
25 #include <awali/common/version.hh>
26 
27 #include <awali/sttc/config.hh> // AWALI_HAVE_CORRECT_LIST_INITIALIZER_ORDER
29 //#include <awali/sttc/labelset/labelset.hh>
31 #include <awali/sttc/misc/raise.hh>
33 #include <awali/sttc/core/kind.hh>
34 
35 #include <awali/common/tuple.hh>
36 #include <awali/sttc/misc/cross.hh>
37 #include <awali/sttc/misc/raise.hh>
38 #include <awali/sttc/misc/zip.hh>
42 
43 namespace awali {
44  namespace sttc {
45 
46  namespace internal
47  {
52  template <typename Enable = void, typename... ValueSets>
54  {
55  using genset_t = void;
56  using letter_t = void;
57  using word_t = void;
58  };
59 
61  template <typename... ValueSets>
62  struct labelset_types<decltype(pass{typename ValueSets::word_t()...}, void()),
63  ValueSets...>
64  {
65  using genset_t = internal::cross_sequences<decltype(std::declval<ValueSets>().genset())...>;
66  using letter_t = std::tuple<typename ValueSets::letter_t...>;
67  using word_t = std::tuple<typename ValueSets::word_t...>;
68  };
69  }
70 
71  template <typename... ValueSets>
72  using labelset_types = internal::labelset_types<void, ValueSets...>;
73 
78  template <typename... ValueSets>
79  class tupleset
80  {
81  public:
82  using valuesets_t = std::tuple<ValueSets...>;
83  using indices_t = awali::internal::make_index_sequence<sizeof...(ValueSets)>;
84  static constexpr indices_t indices{};
85  template <std::size_t... I>
87 
89  template <std::size_t I>
90  using valueset_t = typename std::tuple_element<I, valuesets_t>::type;
91 
92  public:
94  using is_tupleset_t = bool;
95 
97  using value_t = std::tuple<typename ValueSets::value_t...>;
98 
100  using letter_t = typename labelset_types<ValueSets...>::letter_t;
102  using genset_t = typename labelset_types<ValueSets...>::genset_t;
104  using word_t = typename labelset_types<ValueSets...>::word_t;
105 
108 
110 
112  : sets_(vs)
113  {}
114 
115  tupleset(ValueSets... ls)
116  : sets_(ls...)
117  {}
118 
119  static std::string sname()
120  {
121  return sname_(indices);
122  }
123 
124  std::string vname(bool full = true) const
125  {
126  return vname_(full, indices);
127  }
128 
129  static constexpr std::size_t size()
130  {
131  return sizeof...(ValueSets);
132  }
133 
134  template <std::size_t... I>
135  static constexpr bool
137  {
138  return all_<valueset_t<I>::is_commutative_semiring()...>();
139  }
140 
142  static tupleset make(std::istream& is)
143  {
144  // name: lat<law_char(abc), law_char(xyz)>
145  kind_t::make(is);
146  auto res = make_(is, indices);
147  eat(is, '>');
148  return res;
149  }
150 
152  const valuesets_t& sets() const
153  {
154  return sets_;
155  }
156 
158  template <size_t I>
159  const valueset_t<I>& set() const
160  {
161  return std::get<I>(sets());
162  }
163 
167  bool open(bool o) const
168  {
169  return open_(o, indices);
170  }
171 
173  template <typename... Args>
174  value_t value(const std::tuple<Args...>& args) const
175  {
176  return value_(args, indices);
177  }
178 
180  genset_t
181  genset() const
182  {
183  return genset_(indices);
184  }
185 
186  static constexpr bool is_free()
187  {
188  return is_free_(indices);
189  }
190 
191  private:
193  template <typename Value, std::size_t... I>
194  static auto
195  letters_of_(const Value& v, seq<I...>)
196  -> decltype(internal::zip(valueset_t<I>::letters_of(std::get<I>(v))...))
197  {
198  return internal::zip(valueset_t<I>::letters_of(std::get<I>(v))...);
199  }
200 
201  public:
207  template <typename Value>
208  static auto
209  letters_of(const Value& v)
210  -> decltype(letters_of_(v, indices))
211  {
212  return letters_of_(v, indices);
213  }
214 
216  template <typename... Args>
217  auto
218  word(const std::tuple<Args...>& v) const
219  -> word_t
220  {
221  return word_(v, indices);
222  }
223 
224  static bool
225  equals(const value_t& l, const value_t& r)
226  {
227  return equals_(l, r, indices);
228  }
229 
231  static bool
232  less_than(const value_t& l, const value_t& r)
233  {
234  return less_than_(l, r, indices);
235  }
236 
237  static value_t
239  {
240  return special_(indices);
241  }
242 
243  static bool
244  is_special(const value_t& l)
245  {
246  return is_special_(l, indices);
247  }
248 
249  value_t
250  zero() const
251  {
252  return zero_(indices);
253  }
254 
255  bool
256  is_zero(const value_t& l) const
257  {
258  return is_zero_(l, indices);
259  }
260 
261  static constexpr bool
263  {
264  return has_one_(indices);
265  }
266 
267  static constexpr bool
269  {
270  return is_ratexpset_(indices);
271  }
272 
273  static constexpr bool
275  {
276  return is_letterized_(indices);
277  }
278 
279  static value_t
280  one()
281  {
282  return one_(indices);
283  }
284 
285  static bool
286  is_one(const value_t& l)
287  {
288  return is_one_(l, indices);
289  }
290 
291  static bool
293  {
294  return show_one_(indices);
295  }
296 
297  bool
298  is_letter(const value_t&) const
299  {
300  return false;
301  }
302 
303  value_t
304  add(const value_t& l, const value_t& r) const
305  {
306  return add_(l, r, indices);
307  }
308 
309  value_t
310  mul(const value_t& l, const value_t& r) const
311  {
312  return mul_(l, r, indices);
313  }
314 
315  value_t
316  rdiv(const value_t& l, const value_t& r) const
317  {
318  return rdiv_(l, r, indices);
319  }
320 
321  value_t
322  ldiv(const value_t& l, const value_t& r) const
323  {
324  return ldiv_(l, r, indices);
325  }
326 
327  value_t
328  star(const value_t& l) const
329  {
330  return star_(l, indices);
331  }
332 
333  value_t
334  plus(const value_t& l) const
335  {
336  return plus_(l, indices);
337  }
338 
344  template <typename Value>
345  Value
346  delimit(const Value& l) const
347  {
348  return delimit_(l, indices);
349  }
350 
352  template <typename Value>
353  Value
354  undelimit(const Value& l) const
355  {
356  return undelimit_(l, indices);
357  }
358 
359  // FIXME: this needs to be computed.
360  static constexpr star_status_t star_status()
361  {
363  }
364 
365  template <typename LhsValue, typename RhsValue>
366  word_t
367  concat(const LhsValue& l, const RhsValue& r) const
368  {
369  return concat_(l, r, indices);
370  }
371 
372  value_t
373  transpose(const value_t& l) const
374  {
375  return transpose_(l, indices);
376  }
377 
378  static size_t
379  hash(const value_t& v)
380  {
381  return hash_(v, indices);
382  }
383 
384  static value_t
386  {
387  return v;
388  }
389 
390  template<typename T>
391  value_t
392  conv(const T& tset, typename T::value_t v) const
393  {
394  return conv_(tset, v, indices);
395  }
396 
397  value_t
398  conv(b, b::value_t v) const
399  {
400  return v ? one() : zero();
401  }
402 
404  value_t
405  conv(std::istream& i) const
406  {
407  value_t res = conv_(i, indices);
408  eat(i, ']');
409  return res;
410  }
411 
412  std::set<value_t> convs(std::istream&) const
413  {
414  raise("tupleset: ranges not implemented");
415  }
416 
417  std::ostream&
418  print_set(std::ostream& o, const std::string& format = "text") const
419  {
420  return print_set_(o, format, indices);
421  }
422 
423 
424  template<unsigned version = version::fsm_json>
426  const
427  {
428  version::check_fsmjson<version>();
429  switch (version) {
430  case 1:
431  default:
432  return to_json<version>(indices);
433  }
434  }
435 
436 
437  template<unsigned version = version::fsm_json>
439  const
440  {
441  version::check_fsmjson<version>();
442  switch (version) {
443  case 1:
444  default:
445  return value_to_json<version>(v, indices);
446  }
447  }
448 
449 
450 
451  template<unsigned version = version::fsm_json>
452  value_t
454  {
455  version::check_fsmjson<version>();
456  return value_from_json<version>(p->array()->values, indices);
457  }
458 
459  value_t
460  parse(const std::string& s, size_t& p, bool fixed_domain=true) const {
461  if(s[--p]!=']')
462  throw parse_exception("Invalid tuple");
463 # if AWALI_HAVE_CORRECT_LIST_INITIALIZER_ORDER
464  value_t r= parse_(s, p, fixed_domain, typename awali::internal::reverseseq<typename indices_t::type>::type());
465 #else
466  value_t r= parse_(s, p, fixed_domain, indices);
467 #endif
468  if(s[--p]!='[')
469  throw parse_exception("Invalid tuple");
470  return r;
471  }
472 
473  template <std::size_t... I>
474  void comma(const std::string& s, size_t& p, char& c) const {
475  if(c=='x') {
476  c=',';
477  return;
478  }
479  if(s[--p]!=',')
480  throw parse_exception("Invalid letter");
481  }
482 
483  template <std::size_t... I>
484  value_t
485  parse_(const std::string& s, size_t& p, bool fixed_domain, seq<I...>) const {
486  char c = 'x';
487 # if AWALI_HAVE_CORRECT_LIST_INITIALIZER_ORDER
488  value_t r=
489  awali::internal::make_inv_tuple((comma<I>(s, p, c),
490  std::get<I>(sets_).parse(s,p,fixed_domain))...);
491 #else
492  value_t r = std::make_tuple((comma<I>(s, p, c),
493  set<I>().parse(s,p,fixed_domain))...);
494 #endif
495  return r;
496  }
497 
498 
499  std::ostream&
500  print(const value_t& l, std::ostream& o,
501  const std::string& format = "text") const
502  {
503  return print_(l, o, format, indices);
504  }
505 
506  private:
507  template <std::size_t... I>
508  static std::string sname_(seq<I...>)
509  {
510  std::string res = "lat<";
511  const char *sep = "";
512  for (auto n: {valueset_t<I>::sname()...})
513  {
514  res += sep;
515  res += n;
516  sep = ",";
517  }
518  res.push_back('>');
519  return res;
520  }
521 
522  template <typename T, std::size_t... I>
523  value_t
524  conv_(const T& tset, typename T::value_t v, seq<I...>) const
525  {
526  return std::make_tuple(std::get<I>(this->sets()).conv(std::get<I>(tset.sets()),std::get<I>(v))...);
527  }
528 
529 
530  template <std::size_t... I>
531  std::string vname_(bool full, seq<I...>) const
532  {
533  std::string res = "lat<";
534  const char *sep = "";
535  for (auto n: {set<I>().vname(full)...})
536  {
537  res += sep;
538  res += n;
539  sep = ",";
540  }
541  res.push_back('>');
542  return res;
543  }
544 
545  template <std::size_t... I>
546  static tupleset make_(std::istream& i, seq<I...>)
547  {
548 # if AWALI_HAVE_CORRECT_LIST_INITIALIZER_ORDER
549  return tupleset{(eat_separator_<I>(i, '<', ','),
550  valueset_t<I>::make(i))...};
551 # else
552  return make_inv_tuple
553  ((eat_separator_<sizeof...(ValueSets)-1 -I>(i, '<', ','),
554  valueset_t<sizeof...(ValueSets)-1 -I>::make(i))...);
555 # endif
556  }
557 
558  template <std::size_t... I>
559  bool open_(bool o, seq<I...>) const
560  {
561  using swallow = int[];
562  (void) swallow { set<I>().open(o)... };
563  std::swap(o, open__);
564  return o;
565  }
566 
567  template <typename... Args, std::size_t... I>
568  value_t value_(const std::tuple<Args...>& args, seq<I...>) const
569  {
570  return value_t{set<I>().value(std::get<I>(args))...};
571  }
572 
573  template <std::size_t... I>
574  genset_t
575  genset_(seq<I...>) const
576  {
577  return internal::cross(set<I>().genset()...);
578  }
579 
580  template <std::size_t... I>
581  static constexpr bool
582  is_free_(seq<I...>)
583  {
584  return all_<valueset_t<I>::is_free()...>();
585  }
586 
587  template <typename... Args, std::size_t... I>
588  word_t
589  word_(const std::tuple<Args...>& l, seq<I...>) const
590  {
591  return word_t{set<I>().word(std::get<I>(l))...};
592  }
593 
594  template <std::size_t... I>
595  static bool
596  equals_(const value_t& l, const value_t& r, seq<I...>)
597  {
598  for (auto n: {valueset_t<I>::equals(std::get<I>(l),
599  std::get<I>(r))...})
600  if (!n)
601  return false;
602  return true;
603  }
604 
605  template <std::size_t... I>
606  static bool
607  less_than_(const value_t& l, const value_t& r, seq<I...>)
608  {
609  for (auto n: {std::make_pair(valueset_t<I>::less_than(std::get<I>(l),
610  std::get<I>(r)),
611  valueset_t<I>::less_than(std::get<I>(r),
612  std::get<I>(l)))...})
613  if (n.first)
614  return true;
615  else if (n.second)
616  return false;
617  return false;
618  }
619 
620  template <std::size_t... I>
621  static std::size_t
622  hash_(const value_t& v, seq<I...>)
623  {
624  std::size_t res = 0;
625  for (auto h: {valueset_t<I>::hash(std::get<I>(v))...})
626  std::hash_combine(res, h);
627  return res;
628  }
629 
630  template <std::size_t... I>
631  static value_t
632  special_(seq<I...>)
633  {
634  return std::make_tuple(valueset_t<I>::special()...);
635  }
636 
637  template <std::size_t... I>
638  static bool
639  is_special_(const value_t& l, seq<I...>)
640  {
641  for (auto n: {valueset_t<I>::is_special(std::get<I>(l))...})
642  if (!n)
643  return false;
644  return true;
645  }
646 
647  template <std::size_t... I>
648  value_t
649  zero_(seq<I...>) const
650  {
651  return value_t{set<I>().zero()...};
652  }
653 
654  template <std::size_t... I>
655  bool
656  is_zero_(const value_t& l, seq<I...>) const
657  {
658  for (auto n: {set<I>().is_zero(std::get<I>(l))...})
659  if (!n)
660  return false;
661  return true;
662  }
663 
664  template <std::size_t... I>
665  static constexpr bool
666  has_one_(seq<I...>)
667  {
668  return all_<valueset_t<I>::has_one()...>();
669  }
670 
671  template <std::size_t... I>
672  static constexpr bool
673  is_ratexpset_(seq<I...>)
674  {
675  return all_<valueset_t<I>::is_ratexpset()...>();
676  }
677 
678  template <std::size_t... I>
679  static constexpr bool
680  is_letterized_(seq<I...>)
681  {
682  return all_<valueset_t<I>::is_letterized()...>();
683  }
684 
685  template <std::size_t... I>
686  static value_t
687  one_(seq<I...>)
688  {
689  return value_t{valueset_t<I>::one()...};
690  }
691 
692  template <std::size_t... I>
693  static bool
694  is_one_(const value_t& l, seq<I...>)
695  {
696  for (auto n: {valueset_t<I>::is_one(std::get<I>(l))...})
697  if (!n)
698  return false;
699  return true;
700  }
701 
702  template <std::size_t... I>
703  static bool
704  show_one_(seq<I...>)
705  {
706  for (auto n: {valueset_t<I>::show_one()...})
707  if (n)
708  return true;
709  return false;
710  }
711 
712  template <std::size_t... I>
713  value_t
714  add_(const value_t& l, const value_t& r, seq<I...>) const
715  {
716  return value_t{set<I>().add(std::get<I>(l), std::get<I>(r))...};
717  }
718 
719  template <std::size_t... I>
720  value_t
721  mul_(const value_t& l, const value_t& r, seq<I...>) const
722  {
723  return value_t{set<I>().mul(std::get<I>(l), std::get<I>(r))...};
724  }
725 
726  template <std::size_t... I>
727  value_t
728  rdiv_(const value_t& l, const value_t& r, seq<I...>) const
729  {
730  return value_t{set<I>().rdiv(std::get<I>(l), std::get<I>(r))...};
731  }
732 
733  template <std::size_t... I>
734  value_t
735  ldiv_(const value_t& l, const value_t& r, seq<I...>) const
736  {
737  return value_t{set<I>().ldiv(std::get<I>(l), std::get<I>(r))...};
738  }
739 
740  template <std::size_t... I>
741  value_t
742  star_(value_t const& l, seq<I...>) const
743  {
744  return value_t{set<I>().star(std::get<I>(l))...};
745  }
746 
747  template <std::size_t... I>
748  value_t
749  plus_(value_t const& l, seq<I...>) const
750  {
751  return value_t{set<I>().plus(std::get<I>(l))...};
752  }
753 
754  template <typename Value, std::size_t... I>
755  Value
756  delimit_(Value const& l, seq<I...>) const
757  {
758  return Value{set<I>().delimit(std::get<I>(l))...};
759  }
760 
761  template <typename Value, std::size_t... I>
762  Value
763  undelimit_(Value const& l, seq<I...>) const
764  {
765  return Value{set<I>().undelimit(std::get<I>(l))...};
766  }
767 
768  template <typename LhsValue, typename RhsValue, std::size_t... I>
769  word_t
770  concat_(const LhsValue& l, const RhsValue& r, seq<I...>) const
771  {
772  return word_t{set<I>().concat(std::get<I>(l), std::get<I>(r))...};
773  }
774 
775  template <std::size_t... I>
776  value_t
777  conv_(std::istream& i, seq<I...>) const
778  {
779 # if AWALI_HAVE_CORRECT_LIST_INITIALIZER_ORDER
780  return std::make_tuple((eat_separator_<I>(i, '[', ','),
781  set<I>().conv(i))...);
782 # else
783  return
784  awali::internal::make_inv_tuple((eat_separator_<sizeof...(ValueSets)-1 - I>(i, '[', ','),
785  std::get<sizeof...(ValueSets)-1 - I>(sets_).conv(i))...);
786 # endif
787  }
788 
792  template <std::size_t I>
793  static void
794  eat_separator_(std::istream& i, char first, char tail)
795  {
796  eat(i, I == 0 ? first : tail);
797  while (isspace(i.peek()))
798  i.ignore();
799  }
800 
801 
802  template <std::size_t... I>
803  std::ostream&
804  print_(value_t const& l, std::ostream& o,
805  const std::string& format, seq<I...>) const
806  {
807  if (!is_special(l))
808  {
809  using swallow = int[];
810  (void) swallow
811  {
812  (o << (I == 0 ? '[' : ','),
813  set<I>().print(std::get<I>(l), o, format),
814  0)...
815  };
816  o << ']';
817  }
818  return o;
819  }
820 
821  template <std::size_t... I>
822  std::ostream&
823  print_set_(std::ostream& o, const std::string& format,
824  seq<I...>) const
825  {
826  const char *sep = "";
827  if (format == "latex")
828  sep = " \\times ";
829  else if (format == "text")
830  {
831  o << "lat<";
832  sep = ",";
833  }
834  else
835  raise("invalid format: ", format);
836  using swallow = int[];
837  (void) swallow
838  {
839  (o << (I == 0 ? "" : sep),
840  set<I>().print_set(o, format),
841  0)...
842  };
843  if (format == "text")
844  o << '>';
845  return o;
846  }
847 
848  template <unsigned version, std::size_t... I>
849  value_t
850  value_from_json(std::vector<json::node_t*> const& v, seq<I...>)
851  const
852  {return value_t{set<I>().template value_from_json<version>(v[I])...};}
853 
854  template <unsigned version,std::size_t... I>
855  json::object_t*
856  to_json(seq<I...>) const
857  {
858  switch(version) {
859  case 1:
860  default:
861  json::object_t* obj = new json::object_t();
862  obj->push_back("labelKind", new json::string_t("Multi-tape"));
863  json::array_t* l = new json::array_t();
864  for (auto x: {this->set<I>().template to_json<version>()...})
865  l->push_back(x);
866  obj->push_back("tapeLabels", l);
867  return obj;
868  }
869  }
870 
871 
872  template <unsigned version,std::size_t... I>
873  json::array_t*
874  value_to_json(value_t value, seq<I...> const) const
875  {
876  switch(version) {
877  case 1:
878  default:
879  json::array_t* l = new json::array_t();
880  for (auto a : {this->set<I>().template value_to_json<version>(std::get<I>(value))...})
881  l->push_back(a);
882  return l;
883  }
884  }
885 
886 
887  template <std::size_t... I>
888  value_t
889  transpose_(value_t const& l, seq<I...>) const
890  {
891  return value_t{(set<I>().transpose(std::get<I>(l)))...};
892  }
893 
895  template <std::size_t... I>
896  tupleset
897  meet_(const tupleset& rhs, seq<I...>) const
898  {
899  return tupleset{meet(set<I>(), rhs.set<I>())...};
900  }
901 
903  template <std::size_t... I>
904  tupleset
905  join_(const tupleset& rhs, seq<I...>) const
906  {
907  return tupleset{join(set<I>(), rhs.set<I>())...};
908  }
909 
911  friend
912  tupleset
913  meet(const tupleset& lhs, const tupleset& rhs)
914  {
915  return lhs.meet_(rhs, indices);
916  }
917 
919  friend
920  tupleset
921  meet(const tupleset& lhs, const b&)
922  {
923  return lhs;
924  }
925 
927  friend
928  tupleset
929  meet(const b&, const tupleset& rhs)
930  {
931  return rhs;
932  }
933 
935  friend
936  tupleset
937  join(const tupleset& lhs, const tupleset& rhs)
938  {
939  return lhs.join_(rhs, indices);
940  }
941 
943  friend
944  tupleset
945  join(const tupleset& lhs, const b&)
946  {
947  return lhs;
948  }
949 
951  friend
952  tupleset
953  join(const b&, const tupleset& rhs)
954  {
955  return rhs;
956  }
957 
958  valuesets_t sets_;
959  mutable bool open__ = false;
960  };
961 
962  template<typename... Valuesets>
963  auto
964  make_tupleset(std::tuple<Valuesets...> t) -> tupleset<Valuesets...> {
965  return {t};
966  }
967 
968 
969  namespace internal
970  {
971  template <typename T1, typename T2>
972  struct concat_tupleset;
973 
974  template <typename... T1, typename... T2>
975  struct concat_tupleset<tupleset<T1...>, tupleset<T2...>>
976  {
977  using type = tupleset<T1..., T2...>;
978  };
979 
980  }
981 
982 
983  }
984 }//end of ns awali::stc
985 
986 #endif // !AWALI_LABELSET_TUPLESET_HH
std::vector< node_t * > const & values
Definition: node.hh:436
Definition: node.hh:193
virtual array_t const * array() const
Casts this node to array_t.
Definition: node.hh:207
The Boolean semring.
Definition: b.hh:38
bool value_t
Definition: b.hh:56
The semiring of complex numbers.
Definition: c.hh:44
The semiring of Natural numbers.
Definition: n.hh:34
The semiring of floating Numbers.
Definition: r.hh:35
A ValueSet which is a Cartesian product of ValueSets.
Definition: tupleset.hh:80
typename labelset_types< ValueSets... >::letter_t letter_t
A tuple of letters if meaningful, void otherwise.
Definition: tupleset.hh:100
tupleset(ValueSets... ls)
Definition: tupleset.hh:115
value_t rdiv(const value_t &l, const value_t &r) const
Definition: tupleset.hh:316
static constexpr bool has_one()
Definition: tupleset.hh:262
json::node_t * to_json() const
Definition: tupleset.hh:425
value_t conv(std::istream &i) const
Read one letter from i, return the corresponding value.
Definition: tupleset.hh:405
static constexpr bool is_ratexpset()
Definition: tupleset.hh:268
static constexpr bool is_commutative_semiring()
Definition: tupleset.hh:136
std::ostream & print_set(std::ostream &o, const std::string &format="text") const
Definition: tupleset.hh:418
genset_t genset() const
The generators. Meaningful for labelsets only.
Definition: tupleset.hh:181
value_t value(const std::tuple< Args... > &args) const
Construct a value.
Definition: tupleset.hh:174
value_t add(const value_t &l, const value_t &r) const
Definition: tupleset.hh:304
static constexpr bool is_free()
Definition: tupleset.hh:186
static std::string sname()
Definition: tupleset.hh:119
static bool equals(const value_t &l, const value_t &r)
Definition: tupleset.hh:225
value_t ldiv(const value_t &l, const value_t &r) const
Definition: tupleset.hh:322
value_t star(const value_t &l) const
Definition: tupleset.hh:328
std::tuple< typename ValueSets::value_t... > value_t
A tuple of values.
Definition: tupleset.hh:97
value_t value_from_json(json::node_t const *p) const
Definition: tupleset.hh:453
std::string vname(bool full=true) const
Definition: tupleset.hh:124
static constexpr bool is_letterized()
Definition: tupleset.hh:274
void comma(const std::string &s, size_t &p, char &c) const
Definition: tupleset.hh:474
tupleset(valuesets_t vs)
Definition: tupleset.hh:111
static value_t conv(self_type, value_t v)
Definition: tupleset.hh:385
static constexpr std::size_t size()
Definition: tupleset.hh:129
typename std::tuple_element< I, valuesets_t >::type valueset_t
The Ith valueset type.
Definition: tupleset.hh:90
word_t concat(const LhsValue &l, const RhsValue &r) const
Definition: tupleset.hh:367
value_t conv(const T &tset, typename T::value_t v) const
Definition: tupleset.hh:392
static tupleset make(std::istream &is)
Build from the description in is.
Definition: tupleset.hh:142
letter_t value_type
To be iterable.
Definition: tupleset.hh:107
static auto letters_of(const Value &v) -> decltype(letters_of_(v, indices))
Iterate over the letters of v.
Definition: tupleset.hh:209
static value_t special()
Definition: tupleset.hh:238
std::tuple< ValueSets... > valuesets_t
Definition: tupleset.hh:82
std::ostream & print(const value_t &l, std::ostream &o, const std::string &format="text") const
Definition: tupleset.hh:500
static value_t one()
Definition: tupleset.hh:280
Value undelimit(const Value &l) const
Remove first and last characters, that must be "special".
Definition: tupleset.hh:354
value_t parse(const std::string &s, size_t &p, bool fixed_domain=true) const
Definition: tupleset.hh:460
bool open(bool o) const
Whether unknown letters should be added, or rejected.
Definition: tupleset.hh:167
Value delimit(const Value &l) const
Add the special character first and last.
Definition: tupleset.hh:346
static bool less_than(const value_t &l, const value_t &r)
Whether l < r.
Definition: tupleset.hh:232
static bool is_one(const value_t &l)
Definition: tupleset.hh:286
std::set< value_t > convs(std::istream &) const
Definition: tupleset.hh:412
typename labelset_types< ValueSets... >::word_t word_t
A tuple of words if meaningful, void otherwise.
Definition: tupleset.hh:104
bool is_letter(const value_t &) const
Definition: tupleset.hh:298
static size_t hash(const value_t &v)
Definition: tupleset.hh:379
value_t zero() const
Definition: tupleset.hh:250
value_t conv(b, b::value_t v) const
Definition: tupleset.hh:398
bool is_zero(const value_t &l) const
Definition: tupleset.hh:256
static constexpr star_status_t star_status()
Definition: tupleset.hh:360
value_t transpose(const value_t &l) const
Definition: tupleset.hh:373
typename labelset_types< ValueSets... >::genset_t genset_t
A tuple of gensets if meaningful, void otherwise.
Definition: tupleset.hh:102
static bool is_special(const value_t &l)
Definition: tupleset.hh:244
static bool show_one()
Definition: tupleset.hh:292
bool is_tupleset_t
Definition: tupleset.hh:94
value_t plus(const value_t &l) const
Definition: tupleset.hh:334
json::node_t * value_to_json(value_t v) const
Definition: tupleset.hh:438
const valuesets_t & sets() const
The componants valuesets, as a tuple.
Definition: tupleset.hh:152
value_t mul(const value_t &l, const value_t &r) const
Definition: tupleset.hh:310
auto word(const std::tuple< Args... > &v) const -> word_t
Convert to a word.
Definition: tupleset.hh:218
value_t parse_(const std::string &s, size_t &p, bool fixed_domain, seq< I... >) const
Definition: tupleset.hh:485
const valueset_t< I > & set() const
The Ith component valueset.
Definition: tupleset.hh:159
star_status_t
The different behaviours a weightset may have with respect to the star.
Definition: enums.hh:163
@ STARRABLE
The star of every element exists.
Definition: enums.hh:165
any_t word_t
Type for words; it is an alias to any_t since the precise type depends on the context (most of the ti...
Definition: typedefs.hh:67
auto make_inv_tuple() -> std::tuple<>
Definition: tuple.hh:179
Definition: tuple.hh:43
Definition: tuple.hh:70
node_t * parse(std::istream &, bool stop_after_metadata=false)
zip_sequences< Sequences... > zip(Sequences &&... seqs)
Definition: zip.hh:231
void genset_t
Definition: tupleset.hh:55
void word_t
Definition: tupleset.hh:57
void letter_t
Definition: tupleset.hh:56
cross_sequences< Sequences... > cross(Sequences &&... seqs)
Definition: cross.hh:257
std::tuple< typename ValueSets::letter_t... > letter_t
Definition: tupleset.hh:66
A traits so that tupleset may define types that may exist.
Definition: tupleset.hh:54
constant< type_t::one, Label, Weight > one
Definition: fwd.hh:120
void eat(std::istream &is, char c)
Check lookahead character and advance.
Definition: stream.hh:62
RatExpSet::ratexp_t less_than(const RatExpSet &rs, const typename RatExpSet::ratexp_t &v)
Definition: less_than.hh:168
RatExpSet::ratexp_t equals(const RatExpSet &rs, const typename RatExpSet::ratexp_t &v)
Definition: equal_visit.hh:155
auto format(const ValueSet &vs, const typename ValueSet::value_t &v, Args &&... args) -> std::string
Format v via vs.print.
Definition: stream.hh:109
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:45
static const std::string full
Completely version of Awali as a std::string.
Definition: version.hh:42
Main namespace of Awali.
Definition: ato.hh:22
Exceptions thrown during parsing.
Definition: parse_exception.hh:26
Ignore its arguments.
Definition: raise.hh:34
marker type for labelsets where labels are tuples
Definition: kind.hh:84