17 #ifndef AWALI_LABELSET_TUPLESET_HH
18 # define AWALI_LABELSET_TUPLESET_HH
52 template <
typename Enable = void,
typename... ValueSets>
61 template <
typename... ValueSets>
66 using letter_t = std::tuple<
typename ValueSets::letter_t...>;
71 template <
typename... ValueSets>
78 template <
typename... ValueSets>
85 template <std::size_t... I>
89 template <std::
size_t I>
90 using valueset_t =
typename std::tuple_element<I, valuesets_t>::type;
97 using value_t = std::tuple<
typename ValueSets::value_t...>;
121 return sname_(indices);
126 return vname_(
full, indices);
129 static constexpr std::size_t
size()
131 return sizeof...(ValueSets);
134 template <std::size_t... I>
135 static constexpr
bool
138 return all_<valueset_t<I>::is_commutative_semiring()...>();
146 auto res = make_(is, indices);
161 return std::get<I>(sets());
169 return open_(o, indices);
173 template <
typename... Args>
176 return value_(args, indices);
183 return genset_(indices);
188 return is_free_(indices);
193 template <
typename Value, std::size_t... I>
195 letters_of_(
const Value& v, seq<I...>)
196 -> decltype(
internal::zip(valueset_t<I>::letters_of(std::get<I>(v))...))
198 return internal::zip(valueset_t<I>::letters_of(std::get<I>(v))...);
207 template <
typename Value>
210 -> decltype(letters_of_(v, indices))
212 return letters_of_(v, indices);
216 template <
typename... Args>
218 word(
const std::tuple<Args...>& v)
const
221 return word_(v, indices);
227 return equals_(l,
r, indices);
234 return less_than_(l,
r, indices);
240 return special_(indices);
246 return is_special_(l, indices);
252 return zero_(indices);
258 return is_zero_(l, indices);
261 static constexpr
bool
264 return has_one_(indices);
267 static constexpr
bool
270 return is_ratexpset_(indices);
273 static constexpr
bool
276 return is_letterized_(indices);
282 return one_(indices);
288 return is_one_(l, indices);
294 return show_one_(indices);
306 return add_(l,
r, indices);
312 return mul_(l,
r, indices);
318 return rdiv_(l,
r, indices);
324 return ldiv_(l,
r, indices);
330 return star_(l, indices);
338 template <
typename Value>
342 return delimit_(l, indices);
346 template <
typename Value>
350 return undelimit_(l, indices);
359 template <
typename LhsValue,
typename RhsValue>
361 concat(
const LhsValue& l,
const RhsValue&
r)
const
363 return concat_(l,
r, indices);
369 return transpose_(l, indices);
375 return hash_(v, indices);
386 conv(
const T& tset,
typename T::value_t v)
const
388 return conv_(tset, v, indices);
394 return v ? one() : zero();
401 value_t res = conv_(i, indices);
406 std::set<value_t>
convs(std::istream&)
const
408 raise(
"tupleset: ranges not implemented");
414 return print_set_(o,
format, indices);
418 template<
unsigned version = version::fsm_json>
428 return to_json<version>(indices);
433 template<
unsigned version = version::fsm_json>
443 return value_to_json<version>(v, indices);
449 template <
unsigned version, std::size_t... I>
453 {
return value_t{set<I>().template value_from_json<version>(v[I])...};}
456 template<
unsigned version = version::fsm_json>
460 return value_from_json<version>(p->
array()->
values, indices);
464 parse(
const std::string& s,
size_t& p,
bool fixed_domain=
true)
const {
467 # if AWALI_HAVE_CORRECT_LIST_INITIALIZER_ORDER
470 value_t r= parse_(s, p, fixed_domain, indices);
477 template <std::size_t... I>
478 void comma(
const std::string& s,
size_t& p,
char&
c)
const {
487 template <std::size_t... I>
491 # if AWALI_HAVE_CORRECT_LIST_INITIALIZER_ORDER
494 std::get<I>(sets_).
parse(s,p,fixed_domain))...);
496 value_t r = std::make_tuple((comma<I>(s, p,
c),
497 set<I>().
parse(s,p,fixed_domain))...);
505 const std::string&
format =
"text")
const
507 return print_(l, o,
format, indices);
511 template <std::size_t... I>
512 static std::string sname_(seq<I...>)
514 std::string res =
"lat<";
515 const char *sep =
"";
516 for (
auto n: {valueset_t<I>::sname()...})
526 template <
typename T, std::size_t... I>
528 conv_(
const T& tset,
typename T::value_t v, seq<I...>)
const
530 return make_tuple(std::get<I>(this->sets()).
conv(std::get<I>(tset.sets()),std::get<I>(v))...);
534 template <std::size_t... I>
535 std::string vname_(
bool full, seq<I...>)
const
537 std::string res =
"lat<";
538 const char *sep =
"";
539 for (
auto n: {set<I>().vname(
full)...})
549 template <std::size_t... I>
550 static tupleset make_(std::istream& i, seq<I...>)
552 # if AWALI_HAVE_CORRECT_LIST_INITIALIZER_ORDER
553 return tupleset{(eat_separator_<I>(i,
'<',
','),
554 valueset_t<I>::make(i))...};
557 ((eat_separator_<
sizeof...(ValueSets)-1 -I>(i,
'<',
','),
558 valueset_t<
sizeof...(ValueSets)-1 -I>::make(i))...);
562 template <std::size_t... I>
563 bool open_(
bool o, seq<I...>)
const
565 using swallow =
int[];
566 (void) swallow { set<I>().open(o)... };
567 std::swap(o, open__);
571 template <
typename... Args, std::size_t... I>
572 value_t value_(
const std::tuple<Args...>& args, seq<I...>)
const
574 return value_t{set<I>().value(std::get<I>(args))...};
577 template <std::size_t... I>
579 genset_(seq<I...>)
const
584 template <std::size_t... I>
585 static constexpr
bool
588 return all_<valueset_t<I>::is_free()...>();
591 template <
typename... Args, std::size_t... I>
593 word_(
const std::tuple<Args...>& l, seq<I...>)
const
595 return word_t{set<I>().word(std::get<I>(l))...};
598 template <std::size_t... I>
600 equals_(
const value_t& l,
const value_t& r, seq<I...>)
609 template <std::size_t... I>
611 less_than_(
const value_t& l,
const value_t& r, seq<I...>)
616 std::get<I>(l)))...})
624 template <std::size_t... I>
626 hash_(
const value_t& v, seq<I...>)
629 for (
auto h: {valueset_t<I>::hash(std::get<I>(v))...})
630 std::hash_combine(res, h);
634 template <std::size_t... I>
638 return std::make_tuple(valueset_t<I>::special()...);
641 template <std::size_t... I>
643 is_special_(
const value_t& l, seq<I...>)
645 for (
auto n: {valueset_t<I>::is_special(std::get<I>(l))...})
651 template <std::size_t... I>
653 zero_(seq<I...>)
const
655 return value_t{set<I>().zero()...};
658 template <std::size_t... I>
660 is_zero_(
const value_t& l, seq<I...>)
const
662 for (
auto n: {set<I>().is_zero(std::get<I>(l))...})
668 template <std::size_t... I>
669 static constexpr
bool
672 return all_<valueset_t<I>::has_one()...>();
675 template <std::size_t... I>
676 static constexpr
bool
677 is_ratexpset_(seq<I...>)
679 return all_<valueset_t<I>::is_ratexpset()...>();
682 template <std::size_t... I>
683 static constexpr
bool
684 is_letterized_(seq<I...>)
686 return all_<valueset_t<I>::is_letterized()...>();
689 template <std::size_t... I>
696 template <std::size_t... I>
698 is_one_(
const value_t& l, seq<I...>)
700 for (
auto n: {valueset_t<I>::is_one(std::get<I>(l))...})
706 template <std::size_t... I>
710 for (
auto n: {valueset_t<I>::show_one()...})
716 template <std::size_t... I>
718 add_(
const value_t& l,
const value_t& r, seq<I...>)
const
720 return value_t{set<I>().add(std::get<I>(l), std::get<I>(r))...};
723 template <std::size_t... I>
725 mul_(
const value_t& l,
const value_t& r, seq<I...>)
const
727 return value_t{set<I>().mul(std::get<I>(l), std::get<I>(r))...};
730 template <std::size_t... I>
732 rdiv_(
const value_t& l,
const value_t& r, seq<I...>)
const
734 return value_t{set<I>().rdiv(std::get<I>(l), std::get<I>(r))...};
737 template <std::size_t... I>
739 ldiv_(
const value_t& l,
const value_t& r, seq<I...>)
const
741 return value_t{set<I>().ldiv(std::get<I>(l), std::get<I>(r))...};
744 template <std::size_t... I>
746 star_(value_t
const& l, seq<I...>)
const
748 return value_t{set<I>().star(std::get<I>(l))...};
751 template <
typename Value, std::size_t... I>
753 delimit_(Value
const& l, seq<I...>)
const
755 return Value{set<I>().delimit(std::get<I>(l))...};
758 template <
typename Value, std::size_t... I>
760 undelimit_(Value
const& l, seq<I...>)
const
762 return Value{set<I>().undelimit(std::get<I>(l))...};
765 template <
typename LhsValue,
typename RhsValue, std::size_t... I>
767 concat_(
const LhsValue& l,
const RhsValue& r, seq<I...>)
const
769 return word_t{set<I>().concat(std::get<I>(l), std::get<I>(r))...};
772 template <std::size_t... I>
774 conv_(std::istream& i, seq<I...>)
const
776 # if AWALI_HAVE_CORRECT_LIST_INITIALIZER_ORDER
777 return std::make_tuple((eat_separator_<I>(i,
'[',
','),
778 set<I>().
conv(i))...);
782 std::get<
sizeof...(ValueSets)-1 - I>(sets_).
conv(i))...);
789 template <std::
size_t I>
791 eat_separator_(std::istream& i,
char first,
char tail)
793 eat(i, I == 0 ? first : tail);
794 while (isspace(i.peek()))
799 template <std::size_t... I>
801 print_(value_t
const& l, std::ostream& o,
802 const std::string&
format, seq<I...>)
const
806 using swallow =
int[];
809 (o << (I == 0 ?
'[' :
','),
810 set<I>().print(std::get<I>(l), o,
format),
818 template <std::size_t... I>
820 print_set_(std::ostream& o,
const std::string&
format,
823 const char *sep =
"";
826 else if (
format ==
"text")
832 raise(
"invalid format: ",
format);
833 using swallow =
int[];
836 (o << (I == 0 ?
"" : sep),
837 set<I>().print_set(o,
format),
845 template <unsigned version,std::size_t... I>
847 to_json(seq<I...>) const
851 throw parse_exception("[tupleset] Unsupported fsm-json version:"
852 + std::to_string(version));
855 json::object_t* obj = new json::object_t();
856 obj->push_back("labelKind", new json::string_t("Multi-tape"));
857 json::array_t* l = new json::array_t();
858 for (auto x: {this->set<I>().template to_json<version>()...})
860 obj->push_back("tapeLabels", l);
866 template <unsigned version,std::size_t... I>
868 value_to_json(value_t value, seq<I...> const) const
872 throw parse_exception("[tupleset] Unsupported fsm-json version:"
873 + std::to_string(version));
876 json::array_t* l = new json::array_t();
877 for (auto a : {this->set<I>().template value_to_json<version>(std::get<I>(value))...})
884 template <std::size_t... I>
886 transpose_(value_t const& l, seq<I...>) const
888 return value_t{(set<I>().transpose(std::get<I>(l)))...};
892 template <std::size_t... I>
894 meet_(const tupleset& rhs, seq<I...>) const
896 return tupleset{meet(set<I>(), rhs.set<I>())...};
900 template <std::size_t... I>
902 join_(const tupleset& rhs, seq<I...>) const
904 return tupleset{join(set<I>(), rhs.set<I>())...};
910 meet(const tupleset& lhs, const tupleset& rhs)
912 return lhs.meet_(rhs, indices);
918 meet(const tupleset& lhs, const b&)
926 meet(const b&, const tupleset& rhs)
934 join(const tupleset& lhs, const tupleset& rhs)
936 return lhs.join_(rhs, indices);
942 join(const tupleset& lhs, const b&)
950 join(const b&, const tupleset& rhs)
956 mutable bool open__ = false;
959 template<typename... Valuesets>
961 make_tupleset(std::tuple<Valuesets...> t) -> tupleset<Valuesets...> {
968 template <typename T1, typename T2>
969 struct concat_tupleset;
971 template <typename... T1, typename... T2>
972 struct concat_tupleset<tupleset<T1...>, tupleset<T2...>>
974 using type = tupleset<T1..., T2...>;
981 }//end of ns awali::stc
983 #endif // !AWALI_LABELSET_TUPLESET_HH
std::vector< node_t * > const & values
Definition: node.hh:429
virtual array_t const * array() const
Casts this node to array_t.
Definition: node.hh:205
The Boolean semring.
Definition: b.hh:38
bool value_t
Definition: b.hh:56
The semiring of complex numbers.
Definition: c.hh:43
The semiring of Natural numbers.
Definition: n.hh:33
The semiring of floating Numbers.
Definition: r.hh:34
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:419
value_t conv(std::istream &i) const
Read one letter from i, return the corresponding value.
Definition: tupleset.hh:399
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:412
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:458
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:478
tupleset(valuesets_t vs)
Definition: tupleset.hh:111
static value_t conv(self_type, value_t v)
Definition: tupleset.hh:379
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:361
value_t conv(const T &tset, typename T::value_t v) const
Definition: tupleset.hh:386
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:504
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:348
value_t parse(const std::string &s, size_t &p, bool fixed_domain=true) const
Definition: tupleset.hh:464
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:340
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:406
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:373
value_t zero() const
Definition: tupleset.hh:250
value_t conv(b, b::value_t v) const
Definition: tupleset.hh:392
bool is_zero(const value_t &l) const
Definition: tupleset.hh:256
static constexpr star_status_t star_status()
Definition: tupleset.hh:354
value_t transpose(const value_t &l) const
Definition: tupleset.hh:367
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 value_from_json(std::vector< json::node_t * > const &v, seq< I... >) const
Definition: tupleset.hh:451
json::node_t * value_to_json(value_t v) const
Definition: tupleset.hh:434
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:489
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:161
@ STARRABLE
The star of every element exists.
Definition: enums.hh:163
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
node_t * parse(std::istream &)
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
std::tuple< typename ValueSets::word_t... > word_t
Definition: tupleset.hh:67
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:116
std::string to_string(identities i)
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:166
RatExpSet::ratexp_t equals(const RatExpSet &rs, const typename RatExpSet::ratexp_t &v)
Definition: equal_visit.hh:153
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:40
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