Add beginning of generation
This commit is contained in:
parent
e0592cb72e
commit
5baff2adfc
@ -21,6 +21,8 @@ constexpr size_t g_max_cgroup_tokens = 16;
|
|||||||
constexpr size_t g_max_wgroup_weights = 8;
|
constexpr size_t g_max_wgroup_weights = 8;
|
||||||
constexpr size_t g_max_match_groups = 8;
|
constexpr size_t g_max_match_groups = 8;
|
||||||
constexpr size_t g_max_match_wgroups = 4;
|
constexpr size_t g_max_match_wgroups = 4;
|
||||||
|
constexpr size_t g_max_leafs = 128;
|
||||||
|
constexpr size_t g_max_wleafs = 128;
|
||||||
|
|
||||||
using token_id_t = uint32_t;
|
using token_id_t = uint32_t;
|
||||||
using group_id_t = uint32_t;
|
using group_id_t = uint32_t;
|
||||||
@ -252,16 +254,38 @@ class generator_t {
|
|||||||
etl::vector<group_output_t, g_max_groups> m_group_outputs;
|
etl::vector<group_output_t, g_max_groups> m_group_outputs;
|
||||||
etl::vector<token_match_t, g_max_tokens> m_token_matches;
|
etl::vector<token_match_t, g_max_tokens> m_token_matches;
|
||||||
|
|
||||||
|
bool m_has_ruleset = false;
|
||||||
group_id_t m_axiom;
|
group_id_t m_axiom;
|
||||||
bool m_empty;
|
|
||||||
|
etl::vector<leaf_t, g_max_leafs> m_leaf_buf1;
|
||||||
|
etl::vector<leaf_t, g_max_leafs> m_leaf_buf2;
|
||||||
|
|
||||||
|
etl::vector<weighted_leaf_t, g_max_leafs> m_wleaf_buf1;
|
||||||
|
etl::vector<weighted_leaf_t, g_max_leafs> m_wleaf_buf2;
|
||||||
|
|
||||||
|
// Need to use pointers betwen etl::ivector does not implement swap :(
|
||||||
|
etl::ivector<leaf_t>* m_leafs_prev = &m_leaf_buf1;
|
||||||
|
etl::ivector<leaf_t>* m_leafs_cur = &m_leaf_buf2;
|
||||||
|
|
||||||
|
etl::ivector<weighted_leaf_t>* m_wleafs_prev = &m_wleaf_buf1;
|
||||||
|
etl::ivector<weighted_leaf_t>* m_wleafs_cur = &m_wleaf_buf2;
|
||||||
|
|
||||||
uint32_t m_gen_num = 0;
|
uint32_t m_gen_num = 0;
|
||||||
|
|
||||||
void parse_group_characteristic(group_id_t gid, group_output_t& output, const ruleset_t& ruleset);
|
void parse_group_characteristic(group_id_t gid, group_output_t& output, const ruleset_t& ruleset);
|
||||||
|
|
||||||
|
void swap_buffers();
|
||||||
|
void clear_current_buffers();
|
||||||
|
void clear_previous_buffers();
|
||||||
|
void clear_all_buffers();
|
||||||
|
|
||||||
|
bool generate_axiom(etl::ivector<marker_t>& out_markers);
|
||||||
|
bool generate_leafs(etl::ivector<marker_t>& out_markers);
|
||||||
|
bool generate_wleafs(etl::ivector<marker_t>& out_markers);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
generator_t() : m_empty(true), m_axiom(0) { }
|
generator_t() : m_axiom(0) { }
|
||||||
generator_t(const ruleset_t& ruleset) : m_empty(false), m_axiom(0) {
|
generator_t(const ruleset_t& ruleset) : m_axiom(0) {
|
||||||
parse_ruleset(ruleset);
|
parse_ruleset(ruleset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -282,8 +306,7 @@ public:
|
|||||||
* the current generation to @p out_markers. If there is not enough room
|
* the current generation to @p out_markers. If there is not enough room
|
||||||
* for all of the child markers, @p out_markers is unmodified.
|
* for all of the child markers, @p out_markers is unmodified.
|
||||||
*/
|
*/
|
||||||
template <typename CONTAINER_T>
|
bool step_generation(etl::ivector<marker_t>& out_markers);
|
||||||
bool step_generation(CONTAINER_T& out_markers);
|
|
||||||
|
|
||||||
uint32_t generation_num() const { return m_gen_num; }
|
uint32_t generation_num() const { return m_gen_num; }
|
||||||
};
|
};
|
||||||
|
|||||||
@ -115,6 +115,8 @@ branch_rule_id_t ruleset_t::add_branch_rule_weighted(token_id_t match, weighted_
|
|||||||
void generator_t::parse_ruleset(const ruleset_t& ruleset) {
|
void generator_t::parse_ruleset(const ruleset_t& ruleset) {
|
||||||
mlog::debug << "Parsing ruleset" << endl;
|
mlog::debug << "Parsing ruleset" << endl;
|
||||||
|
|
||||||
|
clear_all_buffers();
|
||||||
|
m_has_ruleset = true;
|
||||||
m_axiom = ruleset.get_axiom();
|
m_axiom = ruleset.get_axiom();
|
||||||
|
|
||||||
for (weighted_group_id_t wgid = 0; wgid < ruleset.num_weighted_groups(); ++wgid) {
|
for (weighted_group_id_t wgid = 0; wgid < ruleset.num_weighted_groups(); ++wgid) {
|
||||||
@ -135,9 +137,6 @@ void generator_t::parse_ruleset(const ruleset_t& ruleset) {
|
|||||||
|
|
||||||
parse_group_characteristic(gid, m_group_outputs.back(), ruleset);
|
parse_group_characteristic(gid, m_group_outputs.back(), ruleset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
m_empty = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void generator_t::parse_group_characteristic(group_id_t id, group_output_t& output, const ruleset_t& ruleset) {
|
void generator_t::parse_group_characteristic(group_id_t id, group_output_t& output, const ruleset_t& ruleset) {
|
||||||
@ -206,5 +205,50 @@ void generator_t::parse_group_characteristic(group_id_t id, group_output_t& outp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void generator_t::swap_buffers() {
|
||||||
|
std::swap(m_leafs_cur, m_leafs_prev);
|
||||||
|
std::swap(m_wleafs_cur, m_wleafs_prev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void generator_t::clear_current_buffers() {
|
||||||
|
m_leafs_cur->clear();
|
||||||
|
m_wleafs_cur->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void generator_t::clear_previous_buffers() {
|
||||||
|
m_leafs_prev->clear();
|
||||||
|
m_wleafs_prev->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void generator_t::clear_all_buffers() {
|
||||||
|
clear_current_buffers();
|
||||||
|
clear_previous_buffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool generator_t::generate_axiom(etl::ivector<marker_t>& out_markers) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool generator_t::generate_leafs(etl::ivector<marker_t>& out_markers) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
bool generator_t::generate_wleafs(etl::ivector<marker_t>& out_markers) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool generator_t::step_generation(etl::ivector<marker_t>& out_markers) {
|
||||||
|
swap_buffers();
|
||||||
|
clear_current_buffers();
|
||||||
|
|
||||||
|
bool good = true;
|
||||||
|
|
||||||
|
if (m_leafs_prev->empty() && m_leafs_cur->empty()) {
|
||||||
|
good = generate_axiom(out_markers);
|
||||||
|
} else {
|
||||||
|
good = generate_leafs(out_markers) && generate_wleafs(out_markers);
|
||||||
|
}
|
||||||
|
|
||||||
|
return good;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace fractal
|
} // namespace fractal
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user