Orbiter 2022
Combinatorial Objects
poset_classification.h
Go to the documentation of this file.
1/*
2 * poset_classification.h
3 *
4 * Created on: Aug 9, 2018
5 * Author: Anton Betten
6 *
7 * started: September 20, 2007
8 * pulled out of snakesandladders.h: Aug 9, 2018
9 */
10
11
12#ifndef ORBITER_SRC_LIB_CLASSIFICATION_POSET_CLASSIFICATION_POSET_CLASSIFICATION_H_
13#define ORBITER_SRC_LIB_CLASSIFICATION_POSET_CLASSIFICATION_POSET_CLASSIFICATION_H_
14
15
16
17namespace orbiter {
18namespace layer4_classification {
19namespace poset_classification {
20
21
22// #############################################################################
23// classification_base_case.cpp
24// #############################################################################
25
26
27
29
30
31
33
34public:
36
37 int size;
38 long int *orbit_rep; // [size]
39 groups::strong_generators *Stab_gens;
40 long int *live_points;
43 int (*recognition_function)(long int *Set, int len, int *Elt,
44 void *data, int verbose_level);
45 int *Elt;
46
50 int size, long int *orbit_rep,
51 long int *live_points, int nb_live_points,
52 groups::strong_generators *Stab_gens,
54 int (*recognition_function)(long int *Set, int len,
55 int *Elt, void *data, int verbose_level),
56 int verbose_level);
57 int invoke_recognition(long int *Set, int len,
58 int *Elt, int verbose_level);
59};
60
61// #############################################################################
62// extension.cpp
63// #############################################################################
64
65#define NB_EXTENSION_TYPES 5
66
67#define EXTENSION_TYPE_UNPROCESSED 0
68#define EXTENSION_TYPE_EXTENSION 1
69#define EXTENSION_TYPE_FUSION 2
70#define EXTENSION_TYPE_PROCESSING 3
71#define EXTENSION_TYPE_NOT_CANONICAL 4
72
73
75
76
77
78class extension {
79
80private:
81 long int pt;
82 int orbit_len;
83 int type;
84 // EXTENSION_TYPE_UNPROCESSED = unprocessed
85 // EXTENSION_TYPE_EXTENSION = extension node
86 // EXTENSION_TYPE_FUSION = fusion node
87 // EXTENSION_TYPE_PROCESSING = currently processing
88 // EXTENSION_TYPE_NOT_CANONICAL = no extension formed
89 // because it is not canonical
90 int data;
91 // if EXTENSION_TYPE_EXTENSION: a handle to the next
92 // poset_orbit_node
93 // if EXTENSION_TYPE_FUSION: a handle to a fusion element
94 int data1;
95 // if EXTENSION_TYPE_FUSION: node to which we are fusing
96 int data2;
97 // if EXTENSION_TYPE_FUSION: extension within that
98 // node to which we are fusing
99
100public:
101
102 extension();
103 ~extension();
104 int get_pt();
105 void set_pt(int pt);
106 int get_type();
107 void set_type(int type);
108 int get_orbit_len();
109 void set_orbit_len(int orbit_len);
110 int get_data();
111 void set_data(int data);
112 int get_data1();
113 void set_data1(int data1);
114 int get_data2();
115 void set_data2(int data1);
116};
117
118
119void print_extension_type(std::ostream &ost, int t);
120
121
122// #############################################################################
123// orbit_based_testing.cpp
124// #############################################################################
125
126
127#define MAX_CALLBACK 100
128
129
131
133
134public:
135
138 long int *local_S; // [max_depth]
141 long int *S, int len, void *data, int verbose_level);
143
146 long int *S, int len,
147 long int *candidates, int nb_candidates,
148 long int *good_candidates, int &nb_good_candidates,
149 void *data, int verbose_level);
151
154 void null();
155 void freeself();
156 void init(
158 int max_depth,
159 int verbose_level);
160 void add_callback(
161 int (*func)(orbit_based_testing *Obt,
162 long int *S, int len, void *data, int verbose_level),
163 void *data,
164 int verbose_level);
166 void (*func)(long int *S, int len,
167 long int *candidates, int nb_candidates,
168 long int *good_candidates, int &nb_good_candidates,
169 void *data, int verbose_level),
170 void *data,
171 int verbose_level);
172 void early_test_func(
173 long int *S, int len,
174 long int *candidates, int nb_candidates,
175 long int *good_candidates, int &nb_good_candidates,
176 int verbose_level);
178 long int *S, int len,
179 long int *candidates, int nb_candidates,
180 long int *good_candidates, int &nb_good_candidates,
181 int verbose_level);
182};
183
184
185
186
187
188// #############################################################################
189// poset_classification_control.cpp
190// #############################################################################
191
192
194
195
197
198public:
199
201 std::string problem_label;
202
204 std::string path;
205
207 int depth;
208
210 graphics::layered_graph_draw_options *draw_options;
211
214
216 std::string recover_fname;
217
221 std::string extend_fname;
222
223 int f_lex;
224
225
226 int f_w; // write output in level files (only last level)
227 int f_W; // write output in level files (each level)
229
230 int f_T; // draw tree file (each level)
231 int f_t; // draw tree file (only last level)
232
233 int f_write_tree; // create a tree
234
237
238
241
242
244
245
247
252
256
259
262
265
270
271
272 std::vector<std::string> recognize;
273
274
275
279 // comes after problem_label_with_path
280
282
284 std::vector<std::vector<int> > preferred_choice;
285
287 std::string clique_test_graph;
288 graph_theory::colored_graph *clique_test_CG;
289
292 int read_arguments(
293 int argc, std::string *argv,
294 int verbose_level);
295 void print();
298 long int *S, int len,
299 long int *candidates, int nb_candidates,
300 long int *good_candidates, int &nb_good_candidates,
301 int verbose_level);
302
303};
304
306 groups::schreier *Sch, void *data, int data2, int verbose_level);
307
308
309
310
311
312// #############################################################################
313// poset_classification.cpp
314// #############################################################################
315
317
318
320
321private:
322 int t0;
323
325
326
327 std::string problem_label; // = Control->problem_label
328 std::string problem_label_with_path; // Control->path + Control->problem_label
329
330
332
333
334 int f_base_case;
335 classification_base_case *Base_case;
336
337
338 data_structures_groups::schreier_vector_handler *Schreier_vector_handler;
339
340
341 int depth;
342
343
344 // used as storage for the current set:
345 // poset_orbit_node::store_set stores to set_S[]
346 long int *set_S; // [sz]
347
348 int sz; // = depth, the target depth
349 int max_set_size; // A2->degree
350
351
352 int *Elt_memory; // [6 * elt_size_in_int]
353 int *Elt1;
354 int *Elt2;
355 int *Elt3;
356 int *Elt4;
357 int *Elt5;
358 int *Elt6; // for poset_orbit_node::read_memory_object / write_memory_object
359
360 long int *tmp_set_apply_fusion;
361 // used in poset_orbit_upstep.cpp poset_orbit_node::apply_isomorphism
362
363
364 // for vector space actions, allocated in init:
365 int *tmp_find_node_for_subspace_by_rank1;
366 // [vector_space_dimension] used in poset_classification_trace.cpp:
367 // find_node_for_subspace_by_rank
368 int *tmp_find_node_for_subspace_by_rank2;
369 // [sz * vector_space_dimension] used in poset_classification_trace.cpp:
370 // find_node_for_subspace_by_rank
371
372
373
374 //int nb_times_trace;
375 //int nb_times_trace_was_saved;
376
377 // data for recognize:
378 data_structures_groups::vector_ge *transporter; // [sz + 1]
379 long int **set; // [sz + 1][max_set_size]
380 // used in poset_classification_recognize.cpp
381
382
383 poset_of_orbits *Poo;
384
385
386
387
388 int f_has_invariant_subset_for_root_node;
389 int *invariant_subset_for_root_node;
390 int invariant_subset_for_root_node_size;
391
392
393 int f_do_group_extension_in_upstep;
394 // is TRUE by default
395
396 int f_allowed_to_show_group_elements;
397 int downstep_orbits_print_max_orbits;
398 int downstep_orbits_print_max_points_per_orbit;
399
400
401
402 long int nb_times_image_of_called0;
403 long int nb_times_mult_called0;
404 long int nb_times_invert_called0;
405 long int nb_times_retrieve_called0;
406 long int nb_times_store_called0;
407
408 double progress_last_time;
409 double progress_epsilon;
410
411public:
412
413
414
415 // poset_classification.cpp:
417 std::string &get_problem_label_with_path();
418 std::string &get_problem_label();
419 int first_node_at_level(int i);
420 poset_orbit_node *get_node(int node_idx);
421 data_structures_groups::vector_ge *get_transporter();
422 long int *get_S();
423 long int *get_set_i(int i);
424 long int *get_set0();
425 long int *get_set1();
426 long int *get_set3();
427 int *get_Elt1();
428 int *get_Elt2();
429 long int *get_tmp_set_apply_fusion();
434 actions::action *get_A();
435 actions::action *get_A2();
436 algebra::vector_space *get_VS();
437 data_structures_groups::schreier_vector_handler *get_schreier_vector_handler();
438 int has_base_case();
443 int node_has_schreier_vector(int node_idx);
447 long int *the_set, int lvl,
448 long int *candidates,
449 int nb_candidates,
450 long int *good_candidates,
451 int &nb_good_candidates,
452 int verbose_level);
453 int nb_orbits_at_level(int level);
454 long int nb_flag_orbits_up_at_level(int level);
455 poset_orbit_node *get_node_ij(int level, int node);
456 int poset_structure_is_contained(long int *set1, int sz1,
457 long int *set2, int sz2, int verbose_level);
458 data_structures_groups::orbit_transversal *get_orbit_transversal(
459 int level, int verbose_level);
461 int level, int orbit_at_level, int verbose_level);
462 data_structures_groups::set_and_stabilizer *get_set_and_stabilizer(int level,
463 int orbit_at_level, int verbose_level);
464 void get_set_by_level(int level, int node, long int *set);
465 void get_set(int node, long int *set, int &size);
466 void get_set(int level, int orbit, long int *set, int &size);
467
468 int find_poset_orbit_node_for_set(int len, long int *set,
469 int f_tolerant, int verbose_level);
471 int node, int len, long int *set, int f_tolerant,
472 int verbose_level);
473 long int count_extension_nodes_at_level(int lvl);
474 double level_progress(int lvl);
475 void count_automorphism_group_orders(int lvl, int &nb_agos,
476 ring_theory::longinteger_object *&agos, int *&multiplicities,
477 int verbose_level);
479 std::ostream &ost);
480 void stabilizer_order(int node, ring_theory::longinteger_object &go);
481 void orbit_length(int orbit_at_level, int level,
482 ring_theory::longinteger_object &len);
483 void get_orbit_length_and_stabilizer_order(int node, int level,
484 ring_theory::longinteger_object &stab_order,
485 ring_theory::longinteger_object &len);
486 int orbit_length_as_int(int orbit_at_level, int level);
488 int verbose_level);
490 int verbose_level);
492 int level, int order, int verbose_level);
493 void get_all_stabilizer_orders_at_level(int level, long int *&Ago, int &nb);
494 void get_stabilizer_order(int level, int orbit_at_level,
495 ring_theory::longinteger_object &go);
496 long int get_stabilizer_order_lint(int level,
497 int orbit_at_level);
498 void get_stabilizer_group(data_structures_groups::group_container *&G,
499 int level, int orbit_at_level, int verbose_level);
500 void get_stabilizer_generators_cleaned_up(groups::strong_generators *&gens,
501 int level, int orbit_at_level, int verbose_level);
502 void get_stabilizer_generators(groups::strong_generators *&gens,
503 int level, int orbit_at_level, int verbose_level);
504 void orbit_element_unrank(int depth, int orbit_idx,
505 long int rank, long int *set, int verbose_level);
506 void orbit_element_rank(int depth, int &orbit_idx,
507 long int &rank, long int *set,
508 int verbose_level);
509 void coset_unrank(int depth, int orbit_idx, long int rank,
510 int *Elt, int verbose_level);
511 long int coset_rank(int depth, int orbit_idx, int *Elt,
512 int verbose_level);
513 void list_all_orbits_at_level(int depth,
514 int f_has_print_function,
515 void (*print_function)(std::ostream &ost, int len, long int *S, void *data),
516 void *print_function_data,
517 int f_show_orbit_decomposition, int f_show_stab,
518 int f_save_stab, int f_show_whole_orbit);
520 int depth,
521 int nb_orbits, int *Orbit_idx,
522 int (*compute_function)(int len, long int *S, void *data),
523 void *compute_function_data,
524 int *&Data);
526 int nb_orbits, int *Orbit_idx,
527 int f_has_print_function,
528 void (*print_function)(std::ostream &ost, int len, long int *S, void *data),
529 void *print_function_data,
530 int f_show_orbit_decomposition, int f_show_stab,
531 int f_save_stab, int f_show_whole_orbit);
532 void test_property(int depth,
533 int (*test_property_function)(int len, long int *S, void *data),
534 void *test_property_data,
535 int &nb, int *&Orbit_idx);
536 void list_whole_orbit(int depth, int orbit_idx,
537 int f_has_print_function,
538 void (*print_function)(std::ostream &ost, int len, long int *S, void *data),
539 void *print_function_data,
540 int f_show_orbit_decomposition, int f_show_stab,
541 int f_save_stab, int f_show_whole_orbit);
542 void get_whole_orbit(
543 int depth, int orbit_idx,
544 long int *&Orbit, int &orbit_length, int verbose_level);
545 void map_to_canonical_k_subset(long int *the_set, int set_size,
546 int subset_size, int subset_rk,
547 long int *reduced_set, int *transporter, int &local_idx,
548 int verbose_level);
549 // fills reduced_set[set_size - subset_size],
550 // transporter and local_idx
551 // local_idx is the index of the orbit that the
552 // subset belongs to
553 // (in the list of orbit of subsets of size subset_size)
554 void get_representative_of_subset_orbit(long int *set, int size,
555 int local_orbit_no,
556 groups::strong_generators *&Strong_gens,
557 int verbose_level);
558 void find_interesting_k_subsets(long int *the_set, int n, int k,
559 int *&interesting_sets, int &nb_interesting_sets,
560 int &orbit_idx, int verbose_level);
561 void classify_k_subsets(long int *the_set, int n, int k,
562 data_structures::tally *&C, int verbose_level);
564 long int *the_set,
565 int n, int k, int &nCk, int *&isotype, int *&orbit_frequencies, int &nb_orbits,
566 int verbose_level);
567 void trace_all_k_subsets(long int *the_set, int n, int k,
568 int &nCk, int *&isotype, int verbose_level);
569 void get_orbit_representatives(int level, int &nb_orbits,
570 long int *&Orbit_reps, int verbose_level);
571 void unrank_point(int *v, long int rk);
572 long int rank_point(int *v);
573 void unrank_basis(int *Basis, long int *S, int len);
574 void rank_basis(int *Basis, long int *S, int len);
575
576 // poset_classification_init.cpp:
579 void null();
580 void freeself();
581 void init_internal(
584 int sz, int verbose_level);
588 int depth,
589 int verbose_level);
593 int depth,
594 classification_base_case *Base_case,
595 int verbose_level);
597 int *invariant_subset, int invariant_subset_size,
598 int verbose_level);
600 int verbose_level);
601 // Does not initialize the first starter nodes.
602 // This is done in init_root_node
603
604 // poset_classification_classify.cpp:
606 int target_depth,
609 int verbose_level);
610 int main(int t0,
611 int schreier_depth,
612 int f_use_invariant_subset_if_available,
613 int f_debug,
614 int verbose_level);
615 // f_use_invariant_subset_if_available is
616 // an option that affects the downstep.
617 // if FALSE, the orbits of the stabilizer
618 // on all points are computed.
619 // if TRUE, the orbits of the stabilizer
620 // on the set of points that were
621 // possible in the previous level are computed only
622 // (using Schreier.orbits_on_invariant_subset_fast).
623 // The set of possible points is stored
624 // inside the schreier vector data structure (sv).
625 int compute_orbits(int from_level, int to_level,
626 int schreier_depth,
627 int f_use_invariant_subset_if_available,
628 int verbose_level);
629 // returns the last level that has at least one orbit
630 void post_processing(int actual_size, int verbose_level);
631 void recognize(std::string &set_to_recognize,
632 int h, int nb_to_recognize, int verbose_level);
633 void extend_level(int size,
634 int f_create_schreier_vector,
635 int f_use_invariant_subset_if_available,
636 int f_debug,
637 int f_write_candidate_file,
638 int verbose_level);
639 // calls compute_flag_orbits, upstep
640 void compute_flag_orbits(int size,
641 int f_create_schreier_vector,
642 int f_use_invariant_subset_if_available,
643 int verbose_level);
644 // calls root[prev].downstep_subspace_action
645 // or root[prev].downstep
646 void upstep(int size, int f_debug,
647 int verbose_level);
648 // calls extend_node
649 void extend_node(int size,
650 int prev, int &cur,
651 int f_debug,
652 int f_indicate_not_canonicals,
653 int verbose_level);
654 // called by poset_classification::upstep
655 // Uses an upstep_work structure to handle the work.
656 // Calls upstep_work::handle_extension
657
658
659
660 // poset_classification_combinatorics.cpp
661 void Plesken_matrix_up(int depth,
662 int *&P, int &N, int verbose_level);
663 void Plesken_matrix_down(int depth,
664 int *&P, int &N, int verbose_level);
665 void Plesken_submatrix_up(int i, int j,
666 int *&Pij, int &N1, int &N2, int verbose_level);
667 void Plesken_submatrix_down(int i, int j,
668 int *&Pij, int &N1, int &N2, int verbose_level);
669 int count_incidences_up(int lvl1, int po1,
670 int lvl2, int po2, int verbose_level);
671 int count_incidences_down(int lvl1,
672 int po1, int lvl2, int po2, int verbose_level);
673 void Asup_to_Ainf(int t, int k, int *M_sup,
674 int *M_inf, int verbose_level);
676 int depth, int verbose_level);
678 int level, long int *&M, int &nb_rows, int &nb_cols, int verbose_level);
679 void Mtk_via_Mtr_Mrk(int t, int r, int k,
680 long int *Mtr, long int *Mrk, long int *&Mtk,
681 int nb_r1, int nb_c1, int nb_r2, int nb_c2, int &nb_r3, int &nb_c3,
682 int verbose_level);
683 // Computes $M_{tk}$ via a recursion formula:
684 // $M_{tk} = {{k - t} \choose {k - r}} \cdot M_{t,r} \cdot M_{r,k}$.
685 void Mtk_from_MM(long int **pM,
686 int *Nb_rows, int *Nb_cols,
687 int t, int k,
688 long int *&Mtk, int &nb_r, int &nb_c,
689 int verbose_level);
690
691
692 // poset_classification_draw.cpp:
693 void draw_poset_fname_base_aux_poset(std::string &fname, int depth);
694 void draw_poset_fname_base_poset_lvl(std::string &fname, int depth);
695 void draw_poset_fname_base_tree_lvl(std::string &fname, int depth);
696 void draw_poset_fname_base_poset_detailed_lvl(std::string &fname, int depth);
697 void draw_poset_fname_aux_poset(std::string &fname, int depth);
698 void draw_poset_fname_poset(std::string &fname, int depth);
699 void draw_poset_fname_tree(std::string &fname, int depth);
700 void draw_poset_fname_poset_detailed(std::string &fname, int depth);
701 void write_treefile(std::string &fname_base,
702 int lvl,
703 graphics::layered_graph_draw_options *draw_options,
704 int verbose_level);
705 int write_treefile(std::string &fname_base, int lvl,
706 int verbose_level);
707 void draw_tree(
708 std::string &fname_base, int lvl,
709 graphics::tree_draw_options *Tree_draw_options,
710 graphics::layered_graph_draw_options *Draw_options,
711 int xmax, int ymax, int rad, int f_embedded,
712 int f_sideways, int verbose_level);
714 std::string &fname,
715 graphics::tree_draw_options *Tree_draw_options,
716 graphics::layered_graph_draw_options *Draw_options,
717 int nb_nodes,
718 int *coord_xyw, int *perm, int *perm_inv,
719 int f_draw_points, int f_draw_extension_points,
720 int f_draw_aut_group_order,
721 int xmax, int ymax, int rad, int f_embedded,
722 int f_sideways,
723 int verbose_level);
724 void draw_tree_low_level1(graphics::mp_graphics &G, int nb_nodes,
725 int *coords, int *perm, int *perm_inv,
726 int f_draw_points, int f_draw_extension_points,
727 int f_draw_aut_group_order,
728 int radius, int verbose_level);
729 void draw_poset_full(std::string &fname_base,
730 int depth, int data,
731 graphics::layered_graph_draw_options *LG_Draw_options,
732 double x_stretch,
733 int verbose_level);
734 void draw_poset(
735 std::string &fname_base,
736 int depth, int data,
737 graphics::layered_graph_draw_options *LG_Draw_options,
738 int verbose_level);
739 void draw_level_graph(
740 std::string &fname_base,
741 int depth, int data, int level,
742 graphics::layered_graph_draw_options *LG_Draw_options,
743 int verbose_level);
745 int depth, const char *fname_prefix, int verbose_level);
746 void make_full_poset_graph(int depth, graph_theory::layered_graph *&LG,
747 int data1, double x_stretch,
748 int verbose_level);
749 // Draws the full poset: each element of each orbit is drawn.
750 // The orbits are indicated by grouping the elements closer together.
751 // Uses int_vec_sort_and_test_if_contained to test containment relation.
752 // This is only good for actions on sets, not for actions on subspaces
753 void make_auxiliary_graph(int depth,
754 graph_theory::layered_graph *&LG, int data1,
755 int verbose_level);
756 // makes a graph of the poset of orbits with 2 * depth + 1 layers.
757 // The middle layers represent the flag orbits.
758 void make_graph(int depth, graph_theory::layered_graph *&LG,
759 int data1, int f_tree, int verbose_level);
760 // makes a graph of the poset of orbits with depth + 1 layers.
761 void make_level_graph(int depth, graph_theory::layered_graph *&LG,
762 int data1, int level, int verbose_level);
763 // makes a graph with 4 levels showing the relation between
764 // orbits at level 'level' and orbits at level 'level' + 1
765 void make_poset_graph_detailed(graph_theory::layered_graph *&LG,
766 int data1, int max_depth, int verbose_level);
767 // creates the poset graph, with two middle layers at each level.
768 // In total, the graph that is created will have 3 * depth + 1 layers.
769 void print_data_structure_tex(int depth, int verbose_level);
770
771
772 // in poset_classification_io.cpp:
773 void print_set_verbose(int node);
774 void print_set_verbose(int level, int orbit);
775 void print_set(int node);
776 void print_set(int level, int orbit);
777 void print_progress_by_extension(int size, int cur,
778 int prev, int cur_ex, int nb_ext_cur, int nb_fuse_cur);
779 void print_progress(int size, int cur, int prev,
780 int nb_ext_cur, int nb_fuse_cur);
781 void print_progress(double progress);
782 void print_progress_by_level(int lvl);
783 void print_orbit_numbers(int depth);
784 void print();
787 void prepare_fname_data_file(std::string &fname,
788 std::string &fname_base, int depth_completed);
789 void print_representatives_at_level(int lvl);
790 void print_lex_rank(long int *set, int sz);
791 void print_problem_label();
792 void print_level_info(int prev_level, int prev);
793 void print_level_extension_info(int prev_level,
794 int prev, int cur_extension);
795 void print_level_extension_coset_info(int prev_level,
796 int prev, int cur_extension, int coset, int nb_cosets);
797 void print_node(int node);
798 void print_extensions_at_level(std::ostream &ost, int lvl);
799 void print_fusion_nodes(int depth);
800 void read_data_file(int &depth_completed,
801 std::string &fname, int verbose_level);
802 void write_data_file(int depth_completed,
803 std::string &fname_base, int verbose_level);
804 void write_file(std::ofstream &fp, int depth_completed,
805 int verbose_level);
806 void read_file(std::ifstream &fp, int &depth_completed,
807 int verbose_level);
808 void housekeeping(int i, int f_write_files, int t0,
809 int verbose_level);
810 void housekeeping_no_data_file(int i, int t0, int verbose_level);
811 void create_fname_sv_level_file_binary(std::string &fname,
812 std::string &fname_base, int level);
813 int test_sv_level_file_binary(int level, std::string &fname_base);
814 void read_sv_level_file_binary(int level, std::string &fname_base,
815 int f_split, int split_mod, int split_case,
816 int f_recreate_extensions, int f_dont_keep_sv,
817 int verbose_level);
818 void write_sv_level_file_binary(int level, std::string &fname_base,
819 int f_split, int split_mod, int split_case,
820 int verbose_level);
821 void read_level_file_binary(int level, std::string &fname_base,
822 int verbose_level);
823 void write_level_file_binary(int level, std::string &fname_base,
824 int verbose_level);
825 void recover(std::string &recover_fname,
826 int &depth_completed, int verbose_level);
827 void make_fname_lvl_file_candidates(std::string &fname,
828 std::string &fname_base, int lvl);
829 void make_fname_lvl_file(std::string &fname,
830 std::string &fname_base, int lvl);
831 void make_fname_lvl_reps_file(std::string &fname,
832 std::string &fname_base, int lvl);
833 void log_current_node(std::ostream &f, int size);
835 data_structures::spreadsheet *&Sp,
836 int max_depth);
838 data_structures::spreadsheet *&Sp,
839 int max_depth, int verbose_level);
841 std::string &fname_mask);
843 std::string &fname_mask);
845 std::string &fname_mask);
847 std::string &fname, int node);
848 void make_fname_candidates_file_default(char *fname2000, int level);
850 int n, int q, int vector_space_dimension,
851 int level, int verbose_level);
852 void write_reps_csv(int lvl, int verbose_level);
853
854 // poset_classification_export_source_code.cpp:
855 void generate_source_code(int level, int verbose_level);
856 void generate_history(int level, int verbose_level);
857
858
859 // poset_classification_recognize.cpp:
861 int size, int f_implicit_fusion,
862 int lvl, int current_node,
863 int &final_node, int verbose_level);
864 // Called from poset_orbit_node::recognize_recursion
865 // when trace_next_point returns FALSE
866 // This can happen only if f_implicit_fusion is TRUE
868 int size, int f_implicit_fusion,
869 int lvl, int current_node, int &final_node,
870 int verbose_level);
871 // this routine is called by upstep_work::recognize
872 // we are dealing with a set of size len + 1.
873 // but we can only trace the first len points.
874 // the tracing starts at lvl = 0 with current_node = 0
875 void recognize(
876 long int *the_set, int size, int *transporter, int f_implicit_fusion,
877 int &final_node, int verbose_level);
878
879
880 // in poset_classification_report.cpp:
881 void report(std::ostream &ost,
882 poset_classification_report_options *Opt, int verbose_level);
883 void report_orbits_in_detail(std::ostream &ost,
885 int verbose_level);
886 void report_number_of_orbits_at_level(std::ostream &ost,
888 void report_orbits_summary(std::ostream &ost,
889 poset_classification_report_options *Opt, int verbose_level);
890 void report_poset_of_orbits(std::ostream &ost, int verbose_level);
891 void report_orbit(int level, int orbit_at_level,
893 std::ostream &ost);
894
895 // poset_classification_trace.cpp:
896 int find_isomorphism(long int *set1, long int *set2, int sz,
897 int *transporter, int &orbit_idx, int verbose_level);
898 data_structures_groups::set_and_stabilizer *identify_and_get_stabilizer(
899 long int *set, int sz, int *transporter,
900 int &orbit_at_level,
901 int verbose_level);
902 void identify(long int *data, int sz, int *transporter,
903 int &orbit_at_level, int verbose_level);
904 void test_identify(int level, int nb_times, int verbose_level);
906 int cur_level, int size, int cur_node, int cur_ex,
907 long int *set_in, long int *set_out,
908 int verbose_level);
909 int poset_classification_apply_isomorphism(int level, int size,
910 int current_node, int current_extension,
911 long int *set_in, long int *set_out, long int *set_tmp,
912 int *transporter_in, int *transporter_out,
913 int f_tolerant,
914 int verbose_level);
915 int trace_set_recursion(int cur_level, int cur_node,
916 int size, int level,
917 long int *canonical_set, long int *tmp_set1, long int *tmp_set2,
918 int *Elt_transporter, int *tmp_Elt1,
919 int f_tolerant,
920 int verbose_level);
921 // called by poset_classification::trace_set
922 // returns the node in the poset_classification that corresponds
923 // to the canonical_set
924 // or -1 if f_tolerant and the node could not be found
925 int trace_set(long int *set, int size, int level,
926 long int *canonical_set, int *Elt_transporter,
927 int verbose_level);
928 // returns the case number of the canonical set
929 long int find_node_for_subspace_by_rank(long int *set, int len,
930 int verbose_level);
931
932};
933
934
937
938
939
940// #############################################################################
941// poset_classification_report_options.cpp
942// #############################################################################
943
944
946
947
949
950public:
951
954
957
960
962
965 int read_arguments(
966 int argc, std::string *argv,
967 int verbose_level);
968 void print();
969 int is_selected_by_group_order(long int so);
970
971};
972
973
974
975
976// #############################################################################
977// poset_of_orbits.cpp
978// #############################################################################
979
981
982
984
985private:
986
988
989 int sz;
990 int max_set_size;
991 long int t0;
992
993 long int nb_poset_orbit_nodes_used;
994 long int nb_poset_orbit_nodes_allocated;
995 long int poset_orbit_nodes_increment;
996 long int poset_orbit_nodes_increment_last;
997
998 poset_orbit_node *root;
999
1000 long int *first_poset_orbit_node_at_level;
1001
1002 long int *nb_extension_nodes_at_level_total;
1003 long int *nb_extension_nodes_at_level;
1004 long int *nb_fusion_nodes_at_level;
1005 long int *nb_unprocessed_nodes_at_level;
1006
1007public:
1008 long int *set0; // [max_set_size] temporary storage
1009 long int *set1; // [max_set_size] temporary storage
1010 long int *set3; // [max_set_size] temporary storage
1011
1012
1015 void init(poset_classification *PC,
1016 int nb_poset_orbit_nodes, int sz, int max_set_size, long int t0,
1017 int verbose_level);
1019 int nb_poset_orbit_nodes,
1020 int verbose_level);
1021 void reallocate();
1022 void reallocate_to(long int new_number_of_nodes,
1023 int verbose_level);
1025 long int get_nb_extension_nodes_at_level_total(int level);
1026 void set_nb_poset_orbit_nodes_used(int value);
1027 int first_node_at_level(int i);
1028 void set_first_node_at_level(int i, int value);
1029 poset_orbit_node *get_node(int node_idx);
1030 long int *get_set0();
1031 long int *get_set1();
1032 long int *get_set3();
1033 int nb_orbits_at_level(int level);
1034 long int nb_flag_orbits_up_at_level(int level);
1035 poset_orbit_node *get_node_ij(int level, int node);
1036 int node_get_nb_of_extensions(int node);
1037 void get_set(int node, long int *set, int &size);
1038 void get_set(int level, int orbit, long int *set, int &size);
1040 int node_idx,
1041 long int pt, int verbose_level);
1042 long int count_extension_nodes_at_level(int lvl);
1043 double level_progress(int lvl);
1044 void change_extension_type(int level,
1045 int node, int cur_ext, int type, int verbose_level);
1046 void get_table_of_nodes(long int *&Table,
1047 int &nb_rows, int &nb_cols, int verbose_level);
1049 int level,
1050 int node_local, int verbose_level);
1051 void print_progress_by_level(int lvl);
1052 void print_tree();
1053 void init_root_node_from_base_case(int verbose_level);
1054 void init_root_node(int verbose_level);
1055 void make_tabe_of_nodes(int verbose_level);
1057 int max_depth,
1058 int *&perm, int *&perm_inv, int verbose_level);
1059 void read_memory_object(
1060 int &depth_completed,
1061 orbiter_kernel_system::memory_object *m, int &nb_group_elements,
1062 int verbose_level);
1064 int depth_completed,
1065 orbiter_kernel_system::memory_object *m, int &nb_group_elements,
1066 int verbose_level);
1067 long int calc_size_on_file(int depth_completed,
1068 int verbose_level);
1070 int level, std::ifstream &fp,
1071 int f_split, int split_mod, int split_case,
1072 int f_recreate_extensions, int f_dont_keep_sv,
1073 int verbose_level);
1075 int level, std::ofstream &fp,
1076 int f_split, int split_mod, int split_case,
1077 int verbose_level);
1079 int level, std::ifstream &fp,
1080 int &nb_group_elements, int verbose_level);
1082 int level, std::ofstream &fp,
1083 int &nb_group_elements, int verbose_level);
1085 const char *fname_base,
1086 int lvl, int t0, int verbose_level);
1087 void read_level_file(int level,
1088 std::string &fname, int verbose_level);
1090 std::string &fname_base, int lvl, int t0,
1091 int verbose_level);
1093 int lvl, long int *&Data, int &nb_reps, int verbose_level);
1095 std::string &fname_base,
1096 int lvl,
1097 int verbose_level);
1098 void write_lvl_file(
1099 std::string &fname_base,
1100 int lvl, int t0, int f_with_stabilizer_generators,
1101 int f_long_version,
1102 int verbose_level);
1103 void write_lvl(
1104 std::ostream &f, int lvl, int t0,
1105 int f_with_stabilizer_generators, int f_long_version,
1106 int verbose_level);
1108 int cur, int depth,
1109 std::ostream &f, int f_recurse, int verbose_level);
1110 void save_representatives_at_level_to_csv(std::string &fname,
1111 int lvl, int verbose_level);
1112
1113};
1114
1115
1116
1117// #############################################################################
1118// poset_description.cpp
1119// #############################################################################
1120
1122
1123
1125public:
1127
1130 int q;
1131
1132
1135
1136
1139 void null();
1140 void freeself();
1142 const char *str, int verbose_level);
1143 int read_arguments(int argc, const char **argv,
1144 int verbose_level);
1145};
1146
1147
1148
1149
1150
1151// #############################################################################
1152// poset_orbit_node.cpp, poset_orbit_node_io.cpp, poset_orbit_node_upstep.cpp,
1153// poset_orbit_node_upstep_subspace_action.cpp,
1154// poset_orbit_node_downstep.cpp, poset_orbit_node_downstep_subspace_action.cpp:
1155// #############################################################################
1156
1157
1159
1160
1162
1163private:
1164 int node;
1165 int prev;
1166
1167 long int pt;
1168 int nb_strong_generators;
1169 //int *hdl_strong_generators;
1170 int first_strong_generator_handle; // if there is a generator
1171 int *tl; // if the group is not trivial
1172
1173 int nb_extensions;
1174 extension *E;
1175
1176 data_structures_groups::schreier_vector *Schreier_vector;
1177
1178 actions::action *A_on_upset;
1179 // only used for actions on subspace lattices
1180 // it records the action on the factor space modulo the current subspace
1181 // used in poset_orbit_node_downstep_subspace_action.cpp
1182 // and poset_orbit_node_upstep_subspace_action.cpp
1183
1184public:
1185
1186 // poset_orbit_node.cpp:
1189 void null();
1190 void freeself();
1191 void init_root_node(poset_classification *gen, int verbose_level);
1192 // copies gen->SG0 and gen->tl into the poset_orbit_node
1193 // structure using store_strong_generators
1194 void init_node(int node, int prev, long int pt, int verbose_level);
1195 int get_node();
1196 void set_node(int node);
1198 void allocate_E(int nb_extensions, int verbose_level);
1201 void get_strong_generators_handle(std::vector<int> &gen_hdl, int verbose_level);
1202 void get_tl(std::vector<int> &tl, poset_classification *PC, int verbose_level);
1203 int get_tl(int i);
1204 int has_Schreier_vector();
1205 data_structures_groups::schreier_vector *get_Schreier_vector();
1207 int *live_points();
1211 extension *get_E(int idx);
1212 long int get_pt();
1213 void set_pt(long int pt);
1214 int get_prev();
1215 void set_prev(int prev);
1218 int max_depth,
1219 int &idx, int hdl, int cur_depth, int *perm, int *perm_inv);
1220 int find_extension_from_point(poset_classification *gen, long int pt,
1221 int verbose_level);
1222 void print_extensions(std::ostream &ost);
1224 int s, std::ostream &f, int verbose_level);
1225 void log_current_node(poset_classification *gen, int s,
1226 std::ostream &f, int f_with_stabilizer_poset_classifications,
1227 int verbose_level);
1229 poset_classification *gen, int s, std::ostream &f, int hdl,
1230 int verbose_level);
1232 int lvl, std::ostream &f, int verbose_level);
1234 void store_set(poset_classification *gen, int i);
1235 // stores a set of size i + 1 to gen->S
1237 int verbose_level);
1238 // stores a set of size i + 1 to gen->S[]
1239 void store_set_to(poset_classification *gen, int i, long int *to);
1240 void store_set_to(poset_classification *gen, long int *to);
1242 int i, long int *set);
1248 int verbose_level);
1249 int nb_extension_points();
1250 // sums up the lengths of orbits in all extensions
1251
1252 // in poset_orbit_node_group_theory.cpp:
1254 groups::strong_generators *Strong_gens);
1256 ring_theory::longinteger_object &go);
1259 data_structures_groups::group_container &G,
1260 ring_theory::longinteger_object &go_G,
1261 int verbose_level);
1264 groups::strong_generators *&Strong_gens,
1265 int verbose_level);
1268 int prev, int prev_ex, int size,
1269 data_structures_groups::group_container &G,
1270 ring_theory::longinteger_object &go_G,
1271 int verbose_level);
1272 // sets up the group G using the strong
1273 // poset_classifications that are stored
1276 int prev, int prev_ex, int size,
1277 data_structures_groups::group_container &G,
1278 ring_theory::longinteger_object &go_G,
1279 data_structures_groups::group_container &H,
1280 ring_theory::longinteger_object &go_H,
1281 long int pt, int pt_orbit_len,
1282 int verbose_level);
1283 // sets up the group H which is the stabilizer
1284 // of the point pt in G
1287 int prev, int prev_ex, int size,
1288 data_structures_groups::group_container &G,
1289 ring_theory::longinteger_object &go_G,
1290 data_structures_groups::group_container &H,
1291 ring_theory::longinteger_object &go_H,
1292 long int pt, int pt_orbit_len,
1293 int verbose_level);
1296 int prev, int prev_ex, int size,
1297 data_structures_groups::group_container &G,
1298 ring_theory::longinteger_object &go_G,
1299 data_structures_groups::group_container &H, /* longinteger_object &go_H, */
1300 int pt, int pt_orbit_len,
1301 int verbose_level);
1304 int f_create_schreier_vector,
1305 groups::schreier *Schreier, int verbose_level);
1306 // called from downstep_orbit_test_and_schreier_vector
1307 // calls Schreier.get_schreier_vector
1310 int f_create_schreier_vector,
1311 groups::schreier &Schreier,
1312 actions::action *A_factor_space, induced_actions::action_on_factor_space *AF,
1313 int verbose_level);
1314
1315
1316 // in poset_orbit_node_io.cpp:
1317 void read_memory_object(
1319 actions::action *A, orbiter_kernel_system::memory_object *m,
1320 int &nb_group_elements, int verbose_level);
1323 actions::action *A, orbiter_kernel_system::memory_object *m,
1324 int &nb_group_elements, int verbose_level);
1325 long int calc_size_on_file(
1326 actions::action *A, int verbose_level);
1327 void sv_read_file(
1329 std::ifstream &fp, int verbose_level);
1330 void sv_write_file(
1332 std::ofstream &fp, int verbose_level);
1333 void read_file(
1334 actions::action *A, std::ifstream &fp, int &nb_group_elements,
1335 int verbose_level);
1336 void write_file(
1337 actions::action *A, std::ofstream &fp, int &nb_group_elements,
1338 int verbose_level);
1341 groups::schreier *Schreier,
1342 int verbose_level);
1345 int verbose_level);
1348 groups::schreier *Schreier,
1349 int f_using_invariant_subset, actions::action *AR,
1350 int verbose_level);
1351
1352
1353 // poset_orbit_node_upstep.cpp:
1355 int lvl, int current_node,
1356 int current_extension, int len, int f_tolerant,
1357 int verbose_level);
1358 // returns next_node
1360 int lvl, int current_node,
1361 int my_node, int my_extension, int my_coset,
1362 long int pt0, int current_extension,
1363 int f_debug, int f_implicit_fusion,
1364 int verbose_level);
1365 // Called from poset_orbit_node::handle_last_level
1367 int current_node,
1368 int len, int f_implicit_fusion, int &f_failure_to_find_point,
1369 int verbose_level);
1370 // Called from upstep_work::recognize_recursion
1371 // applies the permutation which maps the point with index lvl
1372 // (i.e. the lvl+1-st point) to its orbit representative.
1373 // also maps all the other points under that permutation.
1374 // we are dealing with a set of size len + 1
1375 // returns FALSE if we are using implicit fusion nodes
1376 // and the set becomes lexicographically
1377 // less than before, in which case trace has to be restarted.
1379 int lvl, int current_node, int size,
1380 long int *cur_set, long int *tmp_set,
1381 int *cur_transporter, int *tmp_transporter,
1382 int f_implicit_fusion, int &f_failure_to_find_point,
1383 int verbose_level);
1384 // called by poset_classification::trace_set_recursion
1385 void trace_starter(poset_classification *gen, int size,
1386 long int *cur_set, long int *next_set,
1387 int *cur_transporter, int *next_transporter,
1388 int verbose_level);
1390 int lvl, int current_node, int size,
1391 long int *cur_set, long int *next_set,
1392 int *cur_transporter, int *next_transporter,
1393 int f_implicit_fusion, int &f_failure_to_find_point,
1394 int verbose_level);
1395 // Called by poset_orbit_node::trace_next_point_wrapper
1396 // and by poset_orbit_node::trace_next_point_in_place
1397 // returns FALSE only if f_implicit_fusion is TRUE and
1398 // the set becomes lexcographically less
1400 int lvl, long int pt_to_trace, long int &pt0, int *&cosetrep,
1401 int verbose_level);
1402 // called by poset_orbit_node::trace_next_point
1403 // FALSE means the point to trace was not found.
1404 // This can happen if nodes were eliminated due to clique_test
1405
1406 // poset_orbit_node_upstep_subspace_action.cpp:
1409 int lvl, long int pt_to_trace, long int &pt0, int *&cosetrep,
1410 int verbose_level);
1411 // called by poset_orbit_node::trace_next_point
1412
1413
1414 // poset_orbit_node_downstep.cpp
1415 // top level functions:
1418 int lvl,
1419 int f_create_schreier_vector,
1420 int f_use_invariant_subset_if_available,
1421 int f_implicit_fusion,
1422 int verbose_level);
1423 // Called from poset_classification::compute_flag_orbits
1424 // if we are acting on sets
1425 // (i.e., not on subspaces).
1426 // Calls downstep_orbits,
1427 // downstep_orbit
1429 int lvl, int verbose_level);
1430 // called from poset_classification::recreate_schreier_vectors_at_level
1431 // and from poset_classification::count_live_points
1432 // calls downstep_apply_early_test
1433 // and check_orbits
1434 // and Schreier.get_schreier_vector
1435 void get_candidates(
1437 int lvl,
1438 long int *&candidates, int &nb_candidates,
1439 int verbose_level);
1440
1441 // 1st level under downstep:
1442 void schreier_forest(
1444 groups::schreier &Schreier, actions::action *&AR,
1445 int lvl,
1446 int f_use_invariant_subset_if_available,
1447 int &f_using_invariant_subset,
1448 int verbose_level);
1449 // calls downstep_get_invariant_subset,
1450 // downstep_apply_early_test,
1451 // and AR.induced_action_by_restriction
1452 // if f_use_invariant_subset_if_available and
1453 // f_using_invariant_subset
1454 //
1455 // Sets up the schreier data structure Schreier
1456 // If f_using_invariant_subset, we will use the
1457 // restricted action AR, otherwise the action gen->A2
1458 // In this action, the orbits are computed using
1459 // Schreier.compute_all_point_orbits
1460 // and possibly printed using downstep_orbits_print
1463 groups::schreier *Schreier, actions::action *AR,
1464 int lvl,
1465 int f_use_invariant_subset_if_available,
1466 int f_using_invariant_subset,
1467 int f_create_schreier_vector,
1468 int &nb_good_orbits, int &nb_points,
1469 int verbose_level);
1470 // called from downstep once downstep_orbits is completed
1471 // Calls check_orbits_wrapper and
1472 // create_schreier_vector_wrapper
1473 // The order in which these two functions are called matters.
1476 groups::schreier &Schreier, actions::action *AR,
1477 int f_using_invariant_subset,
1478 int lvl,
1479 int f_implicit_fusion,
1480 int good_orbits1, int nb_points1,
1481 int verbose_level);
1482 // called from downstep,
1483 // once downstep_orbit_test_and_schreier_vector is done
1484 // calls test_orbits_for_implicit_fusion
1486 groups::schreier &O, actions::action *AR, int f_using_invariant_subset,
1487 int lvl,
1488 int verbose_level);
1489 // called by downstep
1490 // prepares all extension nodes and marks them as unprocessed.
1491 // we are at depth lvl, i.e., currently,
1492 // we have a set of size lvl.
1493
1494
1495 // second level under downstep:
1498 int lvl,
1499 int &n, long int *&subset,
1500 int verbose_level);
1501 // called from downstep_orbits
1502 // Gets the live points at the present node.
1505 int lvl,
1506 int n, long int *subset,
1507 long int *candidates, int &nb_candidates,
1508 int verbose_level);
1509 // called from downstep_orbits, compute_schreier_vector
1510 // calls the callback early test function if available
1511 // and calls test_point_using_check_functions otherwise
1512
1514 groups::schreier *Schreier, actions::action *AR,
1515 int lvl,
1516 int &nb_good_orbits1, int &nb_points1,
1517 //int f_use_incremental_test_func_if_available,
1518 int verbose_level);
1519 // called from downstep_orbit_test_and_schreier_vector
1520 // This function and create_schreier_vector_wrapper
1521 // are used in pairs.
1522 // Except, the order in which the function is used matters.
1523 // Calls check_orbits
1524
1526 groups::schreier &Schreier, actions::action *AR,
1527 int f_using_invariant_subset,
1528 int lvl, int verbose_level);
1529 // called from downstep_implicit_fusion
1530 // eliminates implicit fusion orbits from the
1531 // Schreier data structure,
1533 groups::schreier *Schreier, actions::action *AR,
1534 //int f_using_invariant_subset,
1535 int lvl,
1536 //int f_use_incremental_test_func_if_available,
1537 int verbose_level);
1538 // called from compute_schreier_vector
1539 // and check_orbits_wrapper (which is called from
1540 // downstep_orbit_test_and_schreier_vector)
1541 // calls test_point_using_check_functions
1542 // eliminates bad orbits from the Schreier data structure,
1543 // does not eliminate implicit fusion orbits
1545 int lvl, int rep, int *the_set,
1546 int verbose_level);
1547 // called by check_orbits and downstep_apply_early_test
1548 // Calls gen->check_the_set_incrementally
1549 // (if gen->f_candidate_incremental_check_func).
1550 // Otherwise, calls gen->check_the_set
1551 // (if gen->f_candidate_check_func).
1552 // Otherwise accepts any point.
1553 void relabel_schreier_vector(actions::action *AR, int verbose_level);
1554 // called from compute_schreier_vector,
1555 // downstep_orbit_test_and_schreier_vector
1557 groups::schreier *Schreier, actions::action *AR,
1558 int lvl,
1559 int f_print_orbits,
1560 int max_orbits, int max_points_per_orbit);
1561
1562
1563 // poset_orbit_node_downstep_subspace_action.cpp
1566 int lvl,
1567 int f_create_schreier_vector,
1568 int f_use_invariant_subset_if_available,
1569 int f_implicit_fusion,
1570 int verbose_level);
1571 // called from poset_classification::downstep
1572 // creates action *A_factor_space
1573 // and action_on_factor_space *AF
1574 // and disposes them at the end.
1577 induced_actions::action_on_factor_space &AF,
1578 int lvl, int verbose_level);
1581 induced_actions::action_on_factor_space &AF, actions::action &A_factor_space,
1582 int lvl, int verbose_level);
1585 induced_actions::action_on_factor_space &AF,
1586 actions::action &A_factor_space,
1587 int lvl, int f_compute_tables,
1588 int verbose_level);
1590 poset_classification *gen, groups::schreier &Schreier,
1591 int lvl,
1592 int f_print_orbits,
1593 int verbose_level);
1595 poset_classification *gen, groups::schreier &Schreier,
1596 int lvl,
1597 int f_use_invariant_subset_if_available,
1598 int &f_using_invariant_subset,
1599 int verbose_level);
1601 poset_classification *gen, groups::schreier &O,
1602 actions::action *A_factor_space,
1603 induced_actions::action_on_factor_space *AF,
1604 int lvl, int f_implicit_fusion, int verbose_level);
1605};
1606
1607
1608// #############################################################################
1609// poset_with_group_action.cpp
1610// #############################################################################
1611
1613
1614
1616public:
1618
1620 int n;
1621
1623 algebra::vector_space *VS;
1624
1625 actions::action *A; // the action in which the group is given
1626 actions::action *A2; // the action in which we do the search
1627
1628 groups::strong_generators *Strong_gens;
1629 ring_theory::longinteger_object go;
1630
1633
1635 void (*print_function)(std::ostream &ost, int len, long int *S, void *data);
1637
1640 void null();
1641 void freeself();
1642 void init_subset_lattice(actions::action *A, actions::action *A2,
1643 groups::strong_generators *Strong_gens,
1644 int verbose_level);
1645 void init_subspace_lattice(actions::action *A, actions::action *A2,
1646 groups::strong_generators *Strong_gens,
1647 algebra::vector_space *VS,
1648 int verbose_level);
1650 actions::action *A, // the action in which the group is given
1651 actions::action *A2, // the action in which we do the search
1652 groups::strong_generators *Strong_gens,
1653 int verbose_level);
1655 int independence_value,
1656 int verbose_level);
1657 void add_testing(
1658 int (*func)(orbit_based_testing *Obt,
1659 long int *S, int len, void *data, int verbose_level),
1660 void *data,
1661 int verbose_level);
1663 void (*func)(long int *S, int len,
1664 long int *candidates, int nb_candidates,
1665 long int *good_candidates, int &nb_good_candidates,
1666 void *data, int verbose_level),
1667 void *data,
1668 int verbose_level);
1669 void print();
1670 void early_test_func(
1671 long int *S, int len,
1672 long int *candidates, int nb_candidates,
1673 long int *good_candidates, int &nb_good_candidates,
1674 int verbose_level);
1675 void unrank_point(int *v, long int rk);
1676 long int rank_point(int *v);
1677 void orbits_on_k_sets(
1679 int k, long int *&orbit_reps, int &nb_orbits, int verbose_level);
1682 int k, int verbose_level);
1683 void invoke_print_function(std::ostream &ost, int sz, long int *set);
1684};
1685
1686
1687
1688
1689// #############################################################################
1690// upstep_work.cpp
1691// #############################################################################
1692
1693
1695
1697
1700 // as in the loop in upstep_work::upstep_subspace_action
1701 // goes from 0 to degree - 1.
1702
1703 int node; // = final_node as computed by recognize
1704 int ex; // = final_ex as computed by recognize
1705 int type; // = return value of recognize
1706
1711};
1712
1713
1715
1716
1718public:
1720 int size; // size = size of the object at prev
1721 int prev;
1723 int cur;
1731
1732
1733 int pt;
1735
1736 int *path; // [size + 1]
1737 // path[i] is the node that represents set[0,..,i-1]
1738
1739
1740
1743
1744 data_structures_groups::group_container *G;
1745 data_structures_groups::group_container *H;
1746 ring_theory::longinteger_object go_G, go_H;
1747
1749
1753
1754
1755
1756 upstep_work();
1757 ~upstep_work();
1759 int size,
1760 int prev,
1761 int prev_ex,
1762 int cur,
1763 int f_debug,
1766 int verbose_level);
1767 // called from poset_classification::extend_node
1768 void handle_extension(int &nb_fuse_cur, int &nb_ext_cur,
1769 int verbose_level);
1770 // called from poset_classification::extend_node
1771 // Calls handle_extension_fusion_type
1772 // or handle_extension_unprocessed_type
1773 //
1774 // Handles the extension 'cur_ex' in node 'prev'.
1775 // We are extending a set of size 'size'
1776 // to a set of size 'size' + 1.
1777 // Calls poset_orbit_node::init_extension_node for the
1778 // n e w node that is (possibly) created
1779 void handle_extension_fusion_type(int verbose_level);
1780 // called from upstep_work::handle_extension
1781 // Handles the extension 'cur_ex' in node 'prev'.
1782 void handle_extension_unprocessed_type(int verbose_level);
1783 // called from upstep_work::handle_extension
1784 // calls init_extension_node
1785 int init_extension_node(int verbose_level);
1786 // Called from upstep_work::handle_extension_unprocessed_type
1787 // Calls upstep_subspace_action or upstep_for_sets,
1788 // depending on the type of action
1789 // then changes the type of the extension to
1790 // EXTENSION_TYPE_EXTENSION
1791
1792 // Establishes a n e w node at depth 'size'
1793 // (i.e., a set of size 'size') as an extension
1794 // of a previous node (prev) at depth size - 1
1795 // with respect to a given point (pt).
1796 // This function is to be called for the next
1797 // free poset_orbit_node node which will
1798 // become the descendant of the previous node (prev).
1799 // the extension node corresponds to the point pt.
1800 // returns FALSE if the set is not canonical
1801 // (provided f_indicate_not_canonicals is TRUE)
1802 int upstep_for_sets(int verbose_level);
1803 // This routine is called from upstep_work::init_extension_node
1804 // It is testing a set of size 'size'.
1805 // The newly added point is in gen->S[size - 1]
1806 // returns FALSE if the set is not canonical
1807 // (provided f_indicate_not_canonicals is TRUE)
1808 //void print_level_extension_info_original_size();
1811
1812 // upstep_work_subspace_action.cpp:
1813 int upstep_subspace_action(int verbose_level);
1814 // This routine is called from upstep_work::init_extension_node
1815 // It computes coset_table.
1816 // It is testing a set of size 'size'.
1817 // The newly added point is in gen->S[size - 1]
1818 // The extension is initiated from node 'prev'
1819 // and from extension 'prev_ex'
1820 // The node 'prev' is at depth 'size' - 1
1821 // returns FALSE if the set is not canonical
1822 // (provided f_indicate_not_canonicals is TRUE)
1823
1824
1825 // upstep_work_trace.cpp:
1826
1828 int &final_node, int &final_ex, int f_tolerant,
1829 int verbose_level);
1831 int lvl, int current_node, int &final_node, int &final_ex,
1832 int f_tolerant, int verbose_level);
1834 int lvl, int current_node, int current_extension, int pt0,
1835 int &final_node, int &final_ex,
1836 int verbose_level);
1838 int lvl, int current_node,
1839 int &final_node, int &final_ex,
1840 int f_tolerant, int verbose_level);
1841};
1842
1843
1844}}}
1845
1846
1847#endif /* ORBITER_SRC_LIB_CLASSIFICATION_POSET_CLASSIFICATION_POSET_CLASSIFICATION_H_ */
1848
1849
1850
represents a known classification with constructive recognition, to be used as base case for poset_cl...
int invoke_recognition(long int *Set, int len, int *Elt, int verbose_level)
void init(poset_with_group_action *Poset, int size, long int *orbit_rep, long int *live_points, int nb_live_points, groups::strong_generators *Stab_gens, void *recognition_function_data, int(*recognition_function)(long int *Set, int len, int *Elt, void *data, int verbose_level), int verbose_level)
int(* recognition_function)(long int *Set, int len, int *Elt, void *data, int verbose_level)
represents a flag in the poset classification algorithm; related to poset_orbit_node
maintains a list of test functions which define a G-invariant poset
void(* callback_testing_no_group[MAX_CALLBACK])(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, void *data, int verbose_level)
void init(poset_classification *PC, int max_depth, int verbose_level)
void early_test_func_by_using_group(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, int verbose_level)
void early_test_func(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, int verbose_level)
void add_callback_no_group(void(*func)(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, void *data, int verbose_level), void *data, int verbose_level)
void add_callback(int(*func)(orbit_based_testing *Obt, long int *S, int len, void *data, int verbose_level), void *data, int verbose_level)
int(* callback_testing[MAX_CALLBACK])(orbit_based_testing *Obt, long int *S, int len, void *data, int verbose_level)
to control the behavior of the poset classification algorithm
void early_test_func_for_clique_search(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, int verbose_level)
to control the behavior of the poset classification report function
void print_progress_by_extension(int size, int cur, int prev, int cur_ex, int nb_ext_cur, int nb_fuse_cur)
void initialize_and_allocate_root_node(poset_classification_control *PC_control, poset_with_group_action *Poset, int depth, int verbose_level)
int poset_classification_apply_isomorphism(int level, int size, int current_node, int current_extension, long int *set_in, long int *set_out, long int *set_tmp, int *transporter_in, int *transporter_out, int f_tolerant, int verbose_level)
void make_graph(int depth, graph_theory::layered_graph *&LG, int data1, int f_tree, int verbose_level)
void make_fname_lvl_file_candidates(std::string &fname, std::string &fname_base, int lvl)
void classify_k_subsets(long int *the_set, int n, int k, data_structures::tally *&C, int verbose_level)
int compute_orbits(int from_level, int to_level, int schreier_depth, int f_use_invariant_subset_if_available, int verbose_level)
void init_root_node_invariant_subset(int *invariant_subset, int invariant_subset_size, int verbose_level)
int trace_set(long int *set, int size, int level, long int *canonical_set, int *Elt_transporter, int verbose_level)
void print_progress(int size, int cur, int prev, int nb_ext_cur, int nb_fuse_cur)
void extend_level(int size, int f_create_schreier_vector, int f_use_invariant_subset_if_available, int f_debug, int f_write_candidate_file, int verbose_level)
data_structures_groups::set_and_stabilizer * get_set_and_stabilizer(int level, int orbit_at_level, int verbose_level)
void draw_level_graph(std::string &fname_base, int depth, int data, int level, graphics::layered_graph_draw_options *LG_Draw_options, int verbose_level)
void list_whole_orbit(int depth, int orbit_idx, int f_has_print_function, void(*print_function)(std::ostream &ost, int len, long int *S, void *data), void *print_function_data, int f_show_orbit_decomposition, int f_show_stab, int f_save_stab, int f_show_whole_orbit)
void make_spreadsheet_of_level_info(data_structures::spreadsheet *&Sp, int max_depth, int verbose_level)
int main(int t0, int schreier_depth, int f_use_invariant_subset_if_available, int f_debug, int verbose_level)
void housekeeping(int i, int f_write_files, int t0, int verbose_level)
void init_internal(poset_classification_control *PC_control, poset_with_group_action *Poset, int sz, int verbose_level)
void extend_node(int size, int prev, int &cur, int f_debug, int f_indicate_not_canonicals, int verbose_level)
void report_orbits_summary(std::ostream &ost, poset_classification_report_options *Opt, int verbose_level)
void draw_tree(std::string &fname_base, int lvl, graphics::tree_draw_options *Tree_draw_options, graphics::layered_graph_draw_options *Draw_options, int xmax, int ymax, int rad, int f_embedded, int f_sideways, int verbose_level)
void list_all_orbits_at_level(int depth, int f_has_print_function, void(*print_function)(std::ostream &ost, int len, long int *S, void *data), void *print_function_data, int f_show_orbit_decomposition, int f_show_stab, int f_save_stab, int f_show_whole_orbit)
data_structures_groups::orbit_transversal * get_orbit_transversal(int level, int verbose_level)
void stabilizer_order(int node, ring_theory::longinteger_object &go)
void orbit_length(int orbit_at_level, int level, ring_theory::longinteger_object &len)
data_structures_groups::set_and_stabilizer * identify_and_get_stabilizer(long int *set, int sz, int *transporter, int &orbit_at_level, int verbose_level)
void invoke_early_test_func(long int *the_set, int lvl, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, int verbose_level)
void write_treefile(std::string &fname_base, int lvl, graphics::layered_graph_draw_options *draw_options, int verbose_level)
void make_fname_lvl_file(std::string &fname, std::string &fname_base, int lvl)
int poset_structure_is_contained(long int *set1, int sz1, long int *set2, int sz2, int verbose_level)
void compute_integer_property_of_selected_list_of_orbits(int depth, int nb_orbits, int *Orbit_idx, int(*compute_function)(int len, long int *S, void *data), void *compute_function_data, int *&Data)
void orbit_element_unrank(int depth, int orbit_idx, long int rank, long int *set, int verbose_level)
void make_flag_orbits_on_relations(int depth, const char *fname_prefix, int verbose_level)
void make_spreadsheet_of_orbit_reps(data_structures::spreadsheet *&Sp, int max_depth)
void Kramer_Mesner_matrix_neighboring(int level, long int *&M, int &nb_rows, int &nb_cols, int verbose_level)
int count_incidences_up(int lvl1, int po1, int lvl2, int po2, int verbose_level)
void map_to_canonical_k_subset(long int *the_set, int set_size, int subset_size, int subset_rk, long int *reduced_set, int *transporter, int &local_idx, int verbose_level)
void recognize_start_over(int size, int f_implicit_fusion, int lvl, int current_node, int &final_node, int verbose_level)
void get_orbit_representatives(int level, int &nb_orbits, long int *&Orbit_reps, int verbose_level)
void write_level_file_binary(int level, std::string &fname_base, int verbose_level)
void write_file(std::ofstream &fp, int depth_completed, int verbose_level)
void coset_unrank(int depth, int orbit_idx, long int rank, int *Elt, int verbose_level)
void make_auxiliary_graph(int depth, graph_theory::layered_graph *&LG, int data1, int verbose_level)
void draw_tree_low_level(std::string &fname, graphics::tree_draw_options *Tree_draw_options, graphics::layered_graph_draw_options *Draw_options, int nb_nodes, int *coord_xyw, int *perm, int *perm_inv, int f_draw_points, int f_draw_extension_points, int f_draw_aut_group_order, int xmax, int ymax, int rad, int f_embedded, int f_sideways, int verbose_level)
void find_interesting_k_subsets(long int *the_set, int n, int k, int *&interesting_sets, int &nb_interesting_sets, int &orbit_idx, int verbose_level)
void compute_orbits_on_subsets(int target_depth, poset_classification_control *PC_control, poset_with_group_action *Poset, int verbose_level)
void get_stabilizer_generators_cleaned_up(groups::strong_generators *&gens, int level, int orbit_at_level, int verbose_level)
void initialize_with_base_case(poset_classification_control *PC_control, poset_with_group_action *Poset, int depth, classification_base_case *Base_case, int verbose_level)
long int coset_rank(int depth, int orbit_idx, int *Elt, int verbose_level)
void draw_tree_low_level1(graphics::mp_graphics &G, int nb_nodes, int *coords, int *perm, int *perm_inv, int f_draw_points, int f_draw_extension_points, int f_draw_aut_group_order, int radius, int verbose_level)
void recognize_recursion(int size, int f_implicit_fusion, int lvl, int current_node, int &final_node, int verbose_level)
void get_orbit_length_and_stabilizer_order(int node, int level, ring_theory::longinteger_object &stab_order, ring_theory::longinteger_object &len)
void get_stabilizer_group(data_structures_groups::group_container *&G, int level, int orbit_at_level, int verbose_level)
void read_sv_level_file_binary(int level, std::string &fname_base, int f_split, int split_mod, int split_case, int f_recreate_extensions, int f_dont_keep_sv, int verbose_level)
void get_whole_orbit(int depth, int orbit_idx, long int *&Orbit, int &orbit_length, int verbose_level)
int test_if_stabilizer_is_trivial(int level, int orbit_at_level, int verbose_level)
void identify(long int *data, int sz, int *transporter, int &orbit_at_level, int verbose_level)
void create_fname_sv_level_file_binary(std::string &fname, std::string &fname_base, int level)
void get_representative_of_subset_orbit(long int *set, int size, int local_orbit_no, groups::strong_generators *&Strong_gens, int verbose_level)
void get_stabilizer_generators(groups::strong_generators *&gens, int level, int orbit_at_level, int verbose_level)
void report_orbit(int level, int orbit_at_level, poset_classification_report_options *Opt, std::ostream &ost)
void get_stabilizer_order(int level, int orbit_at_level, ring_theory::longinteger_object &go)
void Mtk_via_Mtr_Mrk(int t, int r, int k, long int *Mtr, long int *Mrk, long int *&Mtk, int nb_r1, int nb_c1, int nb_r2, int nb_c2, int &nb_r3, int &nb_c3, int verbose_level)
void init_base_case(classification_base_case *Base_case, int verbose_level)
int find_isomorphism(long int *set1, long int *set2, int sz, int *transporter, int &orbit_idx, int verbose_level)
void write_sv_level_file_binary(int level, std::string &fname_base, int f_split, int split_mod, int split_case, int verbose_level)
void poset_classification_apply_isomorphism_no_transporter(int cur_level, int size, int cur_node, int cur_ex, long int *set_in, long int *set_out, int verbose_level)
void write_data_file(int depth_completed, std::string &fname_base, int verbose_level)
void make_fname_lvl_reps_file(std::string &fname, std::string &fname_base, int lvl)
int count_incidences_down(int lvl1, int po1, int lvl2, int po2, int verbose_level)
void prepare_fname_data_file(std::string &fname, std::string &fname_base, int depth_completed)
void make_full_poset_graph(int depth, graph_theory::layered_graph *&LG, int data1, double x_stretch, int verbose_level)
void trace_all_k_subsets_and_compute_frequencies(long int *the_set, int n, int k, int &nCk, int *&isotype, int *&orbit_frequencies, int &nb_orbits, int verbose_level)
void Plesken_submatrix_up(int i, int j, int *&Pij, int &N1, int &N2, int verbose_level)
int find_poset_orbit_node_for_set(int len, long int *set, int f_tolerant, int verbose_level)
void Plesken_submatrix_down(int i, int j, int *&Pij, int &N1, int &N2, int verbose_level)
void orbit_element_rank(int depth, int &orbit_idx, long int &rank, long int *set, int verbose_level)
int trace_set_recursion(int cur_level, int cur_node, int size, int level, long int *canonical_set, long int *tmp_set1, long int *tmp_set2, int *Elt_transporter, int *tmp_Elt1, int f_tolerant, int verbose_level)
void list_selected_set_of_orbits_at_level(int depth, int nb_orbits, int *Orbit_idx, int f_has_print_function, void(*print_function)(std::ostream &ost, int len, long int *S, void *data), void *print_function_data, int f_show_orbit_decomposition, int f_show_stab, int f_save_stab, int f_show_whole_orbit)
void compute_flag_orbits(int size, int f_create_schreier_vector, int f_use_invariant_subset_if_available, int verbose_level)
void print_level_extension_coset_info(int prev_level, int prev, int cur_extension, int coset, int nb_cosets)
int find_poset_orbit_node_for_set_basic(int from, int node, int len, long int *set, int f_tolerant, int verbose_level)
void recover(std::string &recover_fname, int &depth_completed, int verbose_level)
void draw_poset(std::string &fname_base, int depth, int data, graphics::layered_graph_draw_options *LG_Draw_options, int verbose_level)
void trace_all_k_subsets(long int *the_set, int n, int k, int &nCk, int *&isotype, int verbose_level)
void report_number_of_orbits_at_level(std::ostream &ost, poset_classification_report_options *Opt)
void wedge_product_export_magma(int n, int q, int vector_space_dimension, int level, int verbose_level)
void make_poset_graph_detailed(graph_theory::layered_graph *&LG, int data1, int max_depth, int verbose_level)
void read_level_file_binary(int level, std::string &fname_base, int verbose_level)
void read_file(std::ifstream &fp, int &depth_completed, int verbose_level)
void report(std::ostream &ost, poset_classification_report_options *Opt, int verbose_level)
void recognize(std::string &set_to_recognize, int h, int nb_to_recognize, int verbose_level)
void report_orbits_in_detail(std::ostream &ost, poset_classification_report_options *Opt, int verbose_level)
void test_property(int depth, int(*test_property_function)(int len, long int *S, void *data), void *test_property_data, int &nb, int *&Orbit_idx)
void Mtk_from_MM(long int **pM, int *Nb_rows, int *Nb_cols, int t, int k, long int *&Mtk, int &nb_r, int &nb_c, int verbose_level)
data_structures_groups::schreier_vector_handler * get_schreier_vector_handler()
void draw_poset_full(std::string &fname_base, int depth, int data, graphics::layered_graph_draw_options *LG_Draw_options, double x_stretch, int verbose_level)
long int find_node_for_subspace_by_rank(long int *set, int len, int verbose_level)
void read_data_file(int &depth_completed, std::string &fname, int verbose_level)
void count_automorphism_group_orders(int lvl, int &nb_agos, ring_theory::longinteger_object *&agos, int *&multiplicities, int verbose_level)
void make_level_graph(int depth, graph_theory::layered_graph *&LG, int data1, int level, int verbose_level)
int read_arguments(int argc, const char **argv, int verbose_level)
the data structure for the poset of orbits in the poset classification algorithm
void read_sv_level_file_binary2(int level, std::ifstream &fp, int f_split, int split_mod, int split_case, int f_recreate_extensions, int f_dont_keep_sv, int verbose_level)
void write_candidates_binary_using_sv(const char *fname_base, int lvl, int t0, int verbose_level)
void read_level_file_binary2(int level, std::ifstream &fp, int &nb_group_elements, int verbose_level)
void write_level_file_binary2(int level, std::ofstream &fp, int &nb_group_elements, int verbose_level)
void poset_orbit_node_depth_breadth_perm_and_inverse(int max_depth, int *&perm, int *&perm_inv, int verbose_level)
void write_lvl(std::ostream &f, int lvl, int t0, int f_with_stabilizer_generators, int f_long_version, int verbose_level)
int count_live_points(int level, int node_local, int verbose_level)
void save_representatives_at_level_to_csv(std::string &fname, int lvl, int verbose_level)
int find_extension_from_point(int node_idx, long int pt, int verbose_level)
void init_poset_orbit_node(int nb_poset_orbit_nodes, int verbose_level)
void write_memory_object(int depth_completed, orbiter_kernel_system::memory_object *m, int &nb_group_elements, int verbose_level)
long int calc_size_on_file(int depth_completed, int verbose_level)
void read_memory_object(int &depth_completed, orbiter_kernel_system::memory_object *m, int &nb_group_elements, int verbose_level)
void log_nodes_for_treefile(int cur, int depth, std::ostream &f, int f_recurse, int verbose_level)
void write_sv_level_file_binary2(int level, std::ofstream &fp, int f_split, int split_mod, int split_case, int verbose_level)
void reallocate_to(long int new_number_of_nodes, int verbose_level)
void write_orbit_reps_at_level(std::string &fname_base, int lvl, int verbose_level)
void get_orbit_reps_at_level(int lvl, long int *&Data, int &nb_reps, int verbose_level)
void write_lvl_file(std::string &fname_base, int lvl, int t0, int f_with_stabilizer_generators, int f_long_version, int verbose_level)
void read_level_file(int level, std::string &fname, int verbose_level)
void change_extension_type(int level, int node, int cur_ext, int type, int verbose_level)
void get_table_of_nodes(long int *&Table, int &nb_rows, int &nb_cols, int verbose_level)
void write_lvl_file_with_candidates(std::string &fname_base, int lvl, int t0, int verbose_level)
void init(poset_classification *PC, int nb_poset_orbit_nodes, int sz, int max_set_size, long int t0, int verbose_level)
to represent one poset orbit; related to the class poset_classification
void store_set_with_verbose_level(poset_classification *gen, int i, int verbose_level)
void create_schreier_vector_wrapper_subspace_action(poset_classification *gen, int f_create_schreier_vector, groups::schreier &Schreier, actions::action *A_factor_space, induced_actions::action_on_factor_space *AF, int verbose_level)
int trace_next_point_wrapper(poset_classification *gen, int lvl, int current_node, int len, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
void get_tl(std::vector< int > &tl, poset_classification *PC, int verbose_level)
void downstep_apply_early_test(poset_classification *gen, int lvl, int n, long int *subset, long int *candidates, int &nb_candidates, int verbose_level)
void downstep_orbit_test_and_schreier_vector(poset_classification *gen, groups::schreier *Schreier, actions::action *AR, int lvl, int f_use_invariant_subset_if_available, int f_using_invariant_subset, int f_create_schreier_vector, int &nb_good_orbits, int &nb_points, int verbose_level)
void init_node(int node, int prev, long int pt, int verbose_level)
void log_current_node(poset_classification *gen, int s, std::ostream &f, int f_with_stabilizer_poset_classifications, int verbose_level)
void compute_flag_orbits_subspace_action(poset_classification *gen, int lvl, int f_create_schreier_vector, int f_use_invariant_subset_if_available, int f_implicit_fusion, int verbose_level)
void read_memory_object(poset_classification *PC, actions::action *A, orbiter_kernel_system::memory_object *m, int &nb_group_elements, int verbose_level)
void orbit_representative_and_coset_rep_inv_subspace_action(poset_classification *gen, int lvl, long int pt_to_trace, long int &pt0, int *&cosetrep, int verbose_level)
int downstep_get_invariant_subset(poset_classification *gen, int lvl, int &n, long int *&subset, int verbose_level)
int orbit_representative_and_coset_rep_inv(poset_classification *gen, int lvl, long int pt_to_trace, long int &pt0, int *&cosetrep, int verbose_level)
void draw_schreier_forest(poset_classification *PC, groups::schreier *Schreier, int f_using_invariant_subset, actions::action *AR, int verbose_level)
void sv_read_file(poset_classification *PC, std::ifstream &fp, int verbose_level)
void write_memory_object(poset_classification *PC, actions::action *A, orbiter_kernel_system::memory_object *m, int &nb_group_elements, int verbose_level)
void find_extensions_subspace_action(poset_classification *gen, groups::schreier &O, actions::action *A_factor_space, induced_actions::action_on_factor_space *AF, int lvl, int f_implicit_fusion, int verbose_level)
void init_extension_node_prepare_H(poset_classification *gen, int prev, int prev_ex, int size, data_structures_groups::group_container &G, ring_theory::longinteger_object &go_G, data_structures_groups::group_container &H, ring_theory::longinteger_object &go_H, long int pt, int pt_orbit_len, int verbose_level)
void log_current_node_without_group(poset_classification *gen, int s, std::ostream &f, int verbose_level)
void get_candidates(poset_classification *gen, int lvl, long int *&candidates, int &nb_candidates, int verbose_level)
void downstep_subspace_action_print_orbits(poset_classification *gen, groups::schreier &Schreier, int lvl, int f_print_orbits, int verbose_level)
int trace_next_point(poset_classification *gen, int lvl, int current_node, int size, long int *cur_set, long int *next_set, int *cur_transporter, int *next_transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
void downstep_orbits_print(poset_classification *gen, groups::schreier *Schreier, actions::action *AR, int lvl, int f_print_orbits, int max_orbits, int max_points_per_orbit)
void poset_orbit_node_depth_breadth_perm_and_inverse(poset_classification *gen, int max_depth, int &idx, int hdl, int cur_depth, int *perm, int *perm_inv)
void get_strong_generators_handle(std::vector< int > &gen_hdl, int verbose_level)
int check_node_and_set_consistency(poset_classification *gen, int i, long int *set)
void compute_point_stabilizer_in_subspace_setting(poset_classification *gen, int prev, int prev_ex, int size, data_structures_groups::group_container &G, ring_theory::longinteger_object &go_G, data_structures_groups::group_container &H, ring_theory::longinteger_object &go_H, long int pt, int pt_orbit_len, int verbose_level)
void schreier_forest(poset_classification *gen, groups::schreier &Schreier, actions::action *&AR, int lvl, int f_use_invariant_subset_if_available, int &f_using_invariant_subset, int verbose_level)
void install_fusion_node(poset_classification *gen, int lvl, int current_node, int my_node, int my_extension, int my_coset, long int pt0, int current_extension, int f_debug, int f_implicit_fusion, int verbose_level)
int test_point_using_check_functions(poset_classification *gen, int lvl, int rep, int *the_set, int verbose_level)
void compute_schreier_vector(poset_classification *gen, int lvl, int verbose_level)
void downstep_implicit_fusion(poset_classification *gen, groups::schreier &Schreier, actions::action *AR, int f_using_invariant_subset, int lvl, int f_implicit_fusion, int good_orbits1, int nb_points1, int verbose_level)
void check_orbits_wrapper(poset_classification *gen, groups::schreier *Schreier, actions::action *AR, int lvl, int &nb_good_orbits1, int &nb_points1, int verbose_level)
void write_file(actions::action *A, std::ofstream &fp, int &nb_group_elements, int verbose_level)
void store_strong_generators(poset_classification *gen, groups::strong_generators *Strong_gens)
void get_stabilizer_generators(poset_classification *PC, groups::strong_generators *&Strong_gens, int verbose_level)
void check_orbits(poset_classification *gen, groups::schreier *Schreier, actions::action *AR, int lvl, int verbose_level)
void reconstruct_extensions_from_sv(poset_classification *gen, int verbose_level)
void setup_factor_space_action_with_early_test(poset_classification *gen, induced_actions::action_on_factor_space &AF, actions::action &A_factor_space, int lvl, int verbose_level)
void compute_point_stabilizer_in_standard_setting(poset_classification *gen, int prev, int prev_ex, int size, data_structures_groups::group_container &G, ring_theory::longinteger_object &go_G, data_structures_groups::group_container &H, int pt, int pt_orbit_len, int verbose_level)
void compute_flag_orbits(poset_classification *gen, int lvl, int f_create_schreier_vector, int f_use_invariant_subset_if_available, int f_implicit_fusion, int verbose_level)
int apply_isomorphism(poset_classification *gen, int lvl, int current_node, int current_extension, int len, int f_tolerant, int verbose_level)
void save_schreier_forest(poset_classification *PC, groups::schreier *Schreier, int verbose_level)
void downstep_orbits_subspace_action(poset_classification *gen, groups::schreier &Schreier, int lvl, int f_use_invariant_subset_if_available, int &f_using_invariant_subset, int verbose_level)
void create_schreier_vector_wrapper(poset_classification *gen, int f_create_schreier_vector, groups::schreier *Schreier, int verbose_level)
int trace_next_point_in_place(poset_classification *gen, int lvl, int current_node, int size, long int *cur_set, long int *tmp_set, int *cur_transporter, int *tmp_transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
void log_current_node_after_applying_group_element(poset_classification *gen, int s, std::ostream &f, int hdl, int verbose_level)
void get_stabilizer_order(poset_classification *gen, ring_theory::longinteger_object &go)
void init_extension_node_prepare_G(poset_classification *gen, int prev, int prev_ex, int size, data_structures_groups::group_container &G, ring_theory::longinteger_object &go_G, int verbose_level)
void sv_write_file(poset_classification *PC, std::ofstream &fp, int verbose_level)
void find_extensions(poset_classification *gen, groups::schreier &O, actions::action *AR, int f_using_invariant_subset, int lvl, int verbose_level)
void save_shallow_schreier_forest(poset_classification *PC, int verbose_level)
void trace_starter(poset_classification *gen, int size, long int *cur_set, long int *next_set, int *cur_transporter, int *next_transporter, int verbose_level)
void get_stabilizer(poset_classification *PC, data_structures_groups::group_container &G, ring_theory::longinteger_object &go_G, int verbose_level)
void test_orbits_for_implicit_fusion(poset_classification *gen, groups::schreier &Schreier, actions::action *AR, int f_using_invariant_subset, int lvl, int verbose_level)
void setup_factor_space_action_light(poset_classification *gen, induced_actions::action_on_factor_space &AF, int lvl, int verbose_level)
void log_current_node_with_candidates(poset_classification *gen, int lvl, std::ostream &f, int verbose_level)
void read_file(actions::action *A, std::ifstream &fp, int &nb_group_elements, int verbose_level)
int find_extension_from_point(poset_classification *gen, long int pt, int verbose_level)
void store_set_to(poset_classification *gen, int i, long int *to)
void setup_factor_space_action(poset_classification *gen, induced_actions::action_on_factor_space &AF, actions::action &A_factor_space, int lvl, int f_compute_tables, int verbose_level)
void init_root_node(poset_classification *gen, int verbose_level)
void init(poset_description *description, actions::action *A, actions::action *A2, groups::strong_generators *Strong_gens, int verbose_level)
void init_subset_lattice(actions::action *A, actions::action *A2, groups::strong_generators *Strong_gens, int verbose_level)
void early_test_func(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, int verbose_level)
void init_subspace_lattice(actions::action *A, actions::action *A2, groups::strong_generators *Strong_gens, algebra::vector_space *VS, int verbose_level)
void add_testing(int(*func)(orbit_based_testing *Obt, long int *S, int len, void *data, int verbose_level), void *data, int verbose_level)
void add_testing_without_group(void(*func)(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, void *data, int verbose_level), void *data, int verbose_level)
poset_classification * orbits_on_k_sets_compute(poset_classification_control *Control, int k, int verbose_level)
void orbits_on_k_sets(poset_classification_control *Control, int k, long int *&orbit_reps, int &nb_orbits, int verbose_level)
void(* print_function)(std::ostream &ost, int len, long int *S, void *data)
auxiliary class for the poset classification algorithm to deal with flag orbits
void init(poset_classification *gen, int size, int prev, int prev_ex, int cur, int f_debug, int f_implicit_fusion, int f_indicate_not_canonicals, int verbose_level)
Definition: upstep_work.cpp:94
trace_result recognize_recursion(int lvl, int current_node, int &final_node, int &final_ex, int f_tolerant, int verbose_level)
trace_result start_over(int lvl, int current_node, int &final_node, int &final_ex, int f_tolerant, int verbose_level)
trace_result handle_last_level(int lvl, int current_node, int current_extension, int pt0, int &final_node, int &final_ex, int verbose_level)
void handle_extension(int &nb_fuse_cur, int &nb_ext_cur, int verbose_level)
trace_result recognize(int &final_node, int &final_ex, int f_tolerant, int verbose_level)
void poset_classification_control_preferred_choice_function(int pt, int &pt_pref, groups::schreier *Sch, void *data, int data2, int verbose_level)
the orbiter library for the classification of combinatorial objects
#define MAX_CALLBACK
a helper class for the poset classification algorithm to build up a coset transversal for the automor...
int coset
int node
int type
int nb_times_invert_called
int nb_times_mult_called
int ex
int nb_times_retrieve_called
int nb_times_image_of_called