#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include "grammar.hh" #include "semiring.hh" #include "sparse_vector.hh" #include "weaver.hh" using namespace std; namespace Hg { struct Node; struct Edge { Node* head; vector tails; score_t score; G::Rule* rule; unsigned int arity = 0; unsigned int mark = 0; inline bool is_marked() { return mark >= arity; } friend ostream& operator<<(ostream& os, const Edge& s); size_t head_id_; vector tails_ids_; // node ids size_t rule_id_; MSGPACK_DEFINE(head_id_, tails_ids_, rule_id_, score, arity); }; struct Node { size_t id; string symbol; short left; short right; score_t score; vector incoming; vector outgoing; unsigned int mark; inline bool is_marked() { return mark >= incoming.size(); }; friend ostream& operator<<(ostream& os, const Node& n); MSGPACK_DEFINE(id, symbol, left, right, score); }; struct Hypergraph { list nodes; vector edges; unordered_map nodes_by_id; unsigned int arity; }; template void init(const list& nodes, const list::iterator root, const Semiring& semiring); void reset(const list nodes, const vector edges); void topological_sort(list& nodes, const list::iterator root); void viterbi(Hypergraph& hg); typedef vector Path; void viterbi_path(Hypergraph& hg, Path& p); void derive(const Path& p, const Node* cur, vector& carry); namespace io { void read(Hypergraph& hg, vector& rules, const string& fn); // FIXME void write(Hypergraph& hg, vector& rules, const string& fn); // FIXME void manual(Hypergraph& hg, vector& rules); } // namespace } // namespace