11 namespace search_strategy {
32 gl_printer(printer), gl_automorphism(automorphism) {}
35 std::function<ir::type_selector_hook> *selector) {
53 const auto start_node = ir_tree.
get_level(base_pos);
56 auto next_node_save = start_node->get_save();
57 auto c = next_node_save->get_coloring();
58 auto base_pos_ = next_node_save->get_base_position();
59 int col = (*selector)(c, base_pos_);
60 return level_size * (c->ptn[col] + 1);
65 auto start_node = ir_tree.
get_level(base_pos);
67 while(!start_node->get_base()) {
68 start_node = start_node->get_next();
70 start_node = start_node->get_next();
73 auto next_node = start_node;
77 auto next_node_save = next_node->get_save();
78 auto c = next_node_save->get_coloring();
79 auto this_base_pos = next_node_save->get_base_position();
80 int col = (*selector)(c, this_base_pos);
81 if(!reserve && col >= 0) {
82 const int expected_for_base = c->ptn[col] + 1;
89 for (
int i = 0; i < c->ptn[col] + 1; ++i) {
93 next_node = next_node->get_next();
94 }
while(next_node != start_node);
99 auto next_node_save = node->
get_save();
102 const bool is_pruned = node->
get_prune();
112 const int parent_node_base_vert = parent_node_base_pos>=0?
114 const int vert_on_base = parent_node_base_pos>=0 ?
116 const int vert_on_base_sl = parent_node_base_pos==-1 ?
123 if(parent_node_base_pos == -1 && v != vert_on_base_sl &&
129 constexpr int size_threshold = 1000;
132 if(next_node_save != last_load || g->
v_size < size_threshold) {
153 const bool parent_is_base = node->
get_base();
161 cert = local_state.
certify(g, gl_automorphism);
167 (*hook)(g->
v_size, gl_automorphism.
p(), gl_automorphism.
nsupp(),
168 gl_automorphism.
supp());
171 gl_automorphism.
reset();
173 if(parent_node_base_pos == 0 && vert_on_base == parent_node_base_vert)
234 int s_count_nodes = 0;
237 if((s_count_nodes & 0x00000FFF) == 0)
241 compute_node(g, hook, ir_tree, local_state, todo.first, todo.second, last_load);
242 last_load = todo.first->get_save();
Workspace for sparse automorphisms.
void write_color_diff(const int *vertex_to_col, const int *col_to_vertex)
dej_nodiscard int nsupp() const
dej_nodiscard int * p() const
dej_nodiscard int * supp() const
bool are_in_same_orbit(const int v1, const int v2)
dej_nodiscard bool represents_orbit(const int v) const
void add_automorphism_to_orbit(const int *p, const int nsupp, const int *supp)
void record_no_deviation()
bool check_deviation(unsigned long deviation)
void start(const int h_expected_for_base)
void record_deviation(unsigned long deviation)
std::vector< int > & get_base()
dej_nodiscard int get_base_position() const
tree_node * get_level(int level)
void add_node(int level, limited_save *data, tree_node *parent, bool is_base=false)
void queue_reserve(const int n)
int get_current_level_size()
void queue_missing_node(missing_node node)
int get_level_size(int level)
int h_bfs_automorphism_pw
bool queue_missing_node_empty()
deviation_map stored_deviation
groups::orbit h_bfs_top_level_orbit
void set_finished_up_to(const int new_finished_up_to)
void record_add_invariant(int v, unsigned long inv)
dej_nodiscard int get_finished_up_to() const
missing_node queue_missing_node_pop()
dej_nodiscard unsigned long get_hash() const
dej_nodiscard bool trace_equal() const
dej_nodiscard bool get_prune() const
dej_nodiscard bool get_base() const
limited_save * get_save()
bool h_use_deviation_pruning
bfs_ir(timed_print &printer, groups::automorphism_workspace &automorphism)
static void queue_up_level(std::function< ir::type_selector_hook > *selector, ir::shared_tree &ir_tree, int base_pos)
void work_on_todo(sgraph *g, dejavu_hook *hook, ir::shared_tree *ir_tree, ir::controller &local_state)
void do_a_level(sgraph *g, dejavu_hook *hook, ir::shared_tree &ir_tree, ir::controller &local_state, std::function< ir::type_selector_hook > *selector)
int s_total_automorphism_prune
void compute_node(sgraph *g, dejavu_hook *hook, ir::shared_tree *ir_tree, ir::controller &local_state, ir::tree_node *node, const int v, ir::limited_save *last_load)
static int next_level_estimate(ir::shared_tree &ir_tree, std::function< ir::type_selector_hook > *selector)
Internal graph data structure.
Prints information to the console.
void progress_current_method(const std::string &print) const
Controls movement in IR tree.
std::vector< int > * compare_base_vertex
void use_increase_deviation(bool deviation_inc_active)
void save_reduced_state(limited_save &state)
void move_to_child(sgraph *g, int v)
void use_reversible(const bool reversible)
void use_trace_early_out(bool trace_early_out)
void load_reduced_state_without_coloring(limited_save &state)
void load_reduced_state(limited_save &state)
bool certify(sgraph *g, groups::automorphism_workspace &automorphism)
bool there_is_difference_to_base_including_singles(int domain_size)
std::function< void(int, const int *, int, const int *)> dejavu_hook