Orbiter 2022
Combinatorial Objects
tl_combinatorics.h
Go to the documentation of this file.
1/*
2 * tl_combinatorics.h
3 *
4 * Created on: Oct 27, 2019
5 * Author: betten
6 */
7
8#ifndef ORBITER_SRC_LIB_TOP_LEVEL_COMBINATORICS_TL_COMBINATORICS_H_
9#define ORBITER_SRC_LIB_TOP_LEVEL_COMBINATORICS_TL_COMBINATORICS_H_
10
11
12namespace orbiter {
13namespace layer5_applications {
14namespace apps_combinatorics {
15
16
17// #############################################################################
18// boolean_function_classify.cpp
19// #############################################################################
20
21
23
24
26
27public:
28
29 combinatorics::boolean_function_domain *BF;
30
31 // group stuff:
32 actions::action *A;
33 data_structures_groups::vector_ge *nice_gens;
34
35 induced_actions::action_on_homogeneous_polynomials *AonHPD;
36 groups::strong_generators *SG;
37 ring_theory::longinteger_object go;
38
39 actions::action *A_affine; // restricted action on affine points
40
43
44 void init_group(combinatorics::boolean_function_domain *BF, int verbose_level);
45 void search_for_bent_functions(int verbose_level);
46
47};
48
49
50
51
52
53
54
55
56
57// #############################################################################
58// combinatorial_object_activity_description.cpp
59// #############################################################################
60
61
63
65public:
66
67
68 // options that apply to GOC = geometric_object_create
69
70 int f_save;
71
73 std::string save_as_fname;
74
76 std::string extract_subset_set;
78
80
83
85
88
89
90 // options that apply to IS = data_input_stream
91
96 combinatorics::classification_of_objects_description *Canonical_form_PG_Descr;
97
99 combinatorics::classification_of_objects_description *Canonical_form_Descr;
100
102 combinatorics::classification_of_objects_report_options *Classification_of_objects_report_options;
103
106
109
113
118
119
122 int read_arguments(
123 int argc, std::string *argv,
124 int verbose_level);
125 void print();
126
127};
128
129// #############################################################################
130// combinatorial_object_activity.cpp
131// #############################################################################
132
133
135
137public:
139
141 geometry::geometric_object_create *GOC;
142
144 data_structures::data_input_stream *IS;
145
146
150 geometry::geometric_object_create *GOC,
151 int verbose_level);
153 data_structures::data_input_stream *IS,
154 int verbose_level);
155 void perform_activity(int verbose_level);
156 void perform_activity_GOC(int verbose_level);
157 void perform_activity_IS(int verbose_level);
158 void do_save(std::string &save_as_fname,
159 int f_extract, long int *extract_idx_set, int extract_size,
160 int verbose_level);
162 combinatorics::classification_of_objects *CO,
164 int f_projective_space,
166 std::string &prefix,
167 int verbose_level);
168 void classification_report(combinatorics::classification_of_objects *CO,
169 object_with_properties *OwP, int verbose_level);
170 void latex_report(
171 combinatorics::classification_of_objects_report_options *Report_options,
172 combinatorics::classification_of_objects *CO,
174 int verbose_level);
176 std::ostream &fp,
177 combinatorics::classification_of_objects_report_options *Report_options,
178 combinatorics::classification_of_objects *CO,
180 int verbose_level);
182 std::ostream &fp,
183 combinatorics::classification_of_objects_report_options *Report_options,
184 combinatorics::classification_of_objects *CO,
186 int i, int verbose_level);
187 void report_object(std::ostream &fp,
188 combinatorics::classification_of_objects_report_options *Report_options,
189 combinatorics::classification_of_objects *CO,
191 int object_idx,
192 int verbose_level);
194 std::string &prefix,
195 data_structures::data_input_stream *IS,
196 int verbose_level);
198 std::string &prefix,
199 std::string &group_label,
200 data_structures::data_input_stream *IS,
201 int verbose_level);
203 std::string &prefix,
204 std::string &projective_space_label,
205 std::string &lines,
206 data_structures::data_input_stream *IS,
207 int verbose_level);
208
209};
210
211
212
213
214
215// #############################################################################
216// combinatorics_global.cpp
217// #############################################################################
218
219
221
222
224
225public:
226
230 std::string &problem_label,
231 design_tables *&T,
232 groups::strong_generators *Gens,
233 int verbose_level);
235 std::string &problem_label,
236 design_tables *&T,
237 groups::strong_generators *Gens,
238 int verbose_level);
239
240 void Hill_cap56(
241 char *fname, int &nb_Pts, long int *&Pts,
242 int verbose_level);
243 void append_orbit_and_adjust_size(groups::schreier *Orb, int idx, int *set, int &sz);
245 data_structures::data_input_stream_description *Data,
246 data_structures::classify_bitvectors *CB,
247 std::string &output_fname,
248 int verbose_level);
250 data_structures::classify_bitvectors *CB,
251 int nb_objects_to_test, int t0,
252 std::string &fname, int input_file_idx, int nb_input_files,
253 int N_points, int design_b, int design_k, int partition_class_size,
254 long int *Ago, std::vector<std::vector<long int> > &Reps,
255 int verbose_level);
256 void process_object(
257 data_structures::classify_bitvectors *CB,
258 data_structures_groups::incidence_structure_with_group *IG,
259 geometry::incidence_structure *&Inc_out,
260 int nb_objects_to_test,
261 int &f_found, int &idx,
262 ring_theory::longinteger_object &go,
263 int verbose_level);
264
265
266};
267
268
269// #############################################################################
270// delandtsheer_doyen_description.cpp
271// #############################################################################
272
273#define MAX_MASK_TESTS 1000
274
275
277
278
280public:
281
283 int depth;
284
285 int f_d1;
286 int d1;
287
288 int f_d2;
289 int d2;
290
291 int f_q1;
292 int q1;
293
294 int f_q2;
295 int q2;
296
298 std::string group_label;
299
301 std::string mask_label;
302
304 std::string problem_label;
305
306
307
310 int f_K;
311 int K;
312
314 poset_classification::poset_classification_control *Pair_search_control;
315
317 poset_classification::poset_classification_control *Search_control;
318
319 // row intersection type
320 int f_R;
322 int *row_type; // [nb_row_types + 1]
323
324 // col intersection type
325 int f_C;
327 int *col_type; // [nb_col_types + 1]
328
329
332
333
334 // mask related test:
338 // 1 = x
339 // 2 = y
340 // 3 = x+y
341 // 4 = singletons
343 // 1 = eq
344 // 2 = ge
345 // 3 = le
347
350 std::string subgroup_gens;
351 std::string subgroup_order;
352
354
355
358 int read_arguments(
359 int argc, std::string *argv,
360 int verbose_level);
361 void print();
362
363};
364
365
366
367// #############################################################################
368// delandtsheer_doyen.cpp
369// #############################################################################
370
371
372
374
375
376
378public:
379
381
382 field_theory::finite_field *F1;
383 field_theory::finite_field *F2;
384
385 int Xsize; // = D = q1 = # of rows
386 int Ysize; // = C = q2 = # of cols
387
388 int V; // = Xsize * Ysize
389 int b;
390 long int *line; // [K];
391 int *row_sum; // [Xsize]
392 int *col_sum; // [Ysize]
393
394
395 groups::matrix_group *M1;
396 groups::matrix_group *M2;
397 actions::action *A1;
398 actions::action *A2;
399
400 actions::action *A;
401 actions::action *A0;
402
403 groups::strong_generators *SG;
404 ring_theory::longinteger_object go;
405 groups::direct_product *P;
406 poset_classification::poset_with_group_action *Poset_pairs;
407 poset_classification::poset_with_group_action *Poset_search;
408 poset_classification::poset_classification *Pairs;
409 poset_classification::poset_classification *Gen;
410
411 // orbits on pairs:
412 int *pair_orbit; // [V * V]
416 int *orbit_length; // [nb_orbits]
417 int *orbit_covered; // [nb_orbits]
418 int *orbit_covered_max; // [nb_orbits]
419 // orbit_covered_max[i] = orbit_length[i] / b;
420 int *orbits_covered; // [K * K]
421
422
423 // intersection type tests:
424
427
428 // row intersection type
429 int *row_type_cur; // [nb_row_types + 1]
430 int *row_type_this_or_bigger; // [nb_row_types + 1]
431
432 // col intersection type
433 int *col_type_cur; // [nb_col_types + 1]
434 int *col_type_this_or_bigger; // [nb_col_types + 1]
435
436
437
438 // for testing the mask:
439 int *f_row_used; // [Xsize];
440 int *f_col_used; // [Ysize];
441 int *row_idx; // [Xsize];
442 int *col_idx; // [Ysize];
443 int *singletons; // [K];
444
445 // temporary data
446 int *row_col_idx; // [Xsize];
447 int *col_row_idx; // [Ysize];
448
449 long int *live_points; // [V]
451
454 void init(delandtsheer_doyen_description *Descr, int verbose_level);
455 void show_generators(int verbose_level);
456 void search_singletons(int verbose_level);
457 void search_starter(int verbose_level);
458 void compute_orbits_on_pairs(groups::strong_generators *Strong_gens, int verbose_level);
459 groups::strong_generators *scan_subgroup_generators(int verbose_level);
460 void create_monomial_group(int verbose_level);
461 void create_action(int verbose_level);
462 void create_graph(long int *line0, int len, int verbose_level);
463 int find_pair_orbit(int i, int j, int verbose_level);
464 int find_pair_orbit_by_tracing(int i, int j, int verbose_level);
465 void compute_pair_orbit_table(int verbose_level);
466 void write_pair_orbit_file(int verbose_level);
467 void print_mask_test_i(std::ostream &ost, int i);
468 void early_test_func(long int *S, int len,
469 long int *candidates, int nb_candidates,
470 long int *good_candidates, int &nb_good_candidates,
471 int verbose_level);
472 int check_conditions(long int *S, int len, int verbose_level);
473 int check_orbit_covering(long int *line, int len, int verbose_level);
474 int check_row_sums(long int *line, int len, int verbose_level);
475 int check_col_sums(long int *line, int len, int verbose_level);
476 int check_mask(long int *line, int len, int verbose_level);
478 long int *line, int len,
479 int &nb_rows_used, int &nb_cols_used,
480 int &nb_singletons, int verbose_level);
481};
482
483
484
485
486// #############################################################################
487// design_activity_description.cpp
488// #############################################################################
489
491
492
493
495
496public:
497
498#if 0
499 int f_create_table;
500 std::string create_table_label;
501 std::string create_table_group;
502#endif
503
505 std::string load_table_label;
506 std::string load_table_group;
507
508
511 std::string load_table_H_gens;
513
514
516 combinatorics::classification_of_objects_description *Canonical_form_Descr;
517
525
530
533 int read_arguments(int argc, std::string *argv,
534 int verbose_level);
535 void print();
536
537};
538
539
540// #############################################################################
541// design_activity.cpp
542// #############################################################################
543
545
546
547
549
550public:
552
553
557 design_create *DC, int verbose_level);
559 design_create *DC,
560 std::string &label,
561 std::string &group_label,
562 std::string &fname_in,
563 std::string &fname_out,
564 std::string &prefix_text,
565 int f_csv_format,
566 int verbose_level);
567 void do_create_table(
568 design_create *DC,
569 std::string &label,
570 std::string &group_label,
571 int verbose_level);
572 void do_load_table(
573 design_create *DC,
574 std::string &label,
575 std::string &group_label,
576 std::string &H_label,
577 std::string &H_go_text,
578 std::string &H_generators_data,
579 int selected_orbit_length,
580 int verbose_level);
581 void do_canonical_form(combinatorics::classification_of_objects_description *Canonical_form_Descr,
582 int verbose_level);
583 void do_export_inc(
584 design_create *DC,
585 int verbose_level);
586 void do_export_blocks(
587 design_create *DC,
588 int verbose_level);
589 void do_row_sums(
590 design_create *DC,
591 int verbose_level);
593 design_create *DC,
594 int verbose_level);
595
596};
597
598
599
600// #############################################################################
601// design_create_description.cpp
602// #############################################################################
603
605
606
607
609
610public:
611
612 int f_q;
613 int q;
615 int iso;
617 std::string family_name;
622
625
627
628
631 void null();
632 void freeself();
633 int read_arguments(int argc, std::string *argv,
634 int verbose_level);
635 int get_q();
636 void print();
637
638};
639
640
641
642// #############################################################################
643// design_create.cpp
644// #############################################################################
645
647
648
649
651
652public:
654
655 std::string prefix;
656 std::string label_txt;
657 std::string label_tex;
658
659 int q;
660 field_theory::finite_field *F;
661 int k;
662
663 //int f_semilinear;
664
665 actions::action *A; // Sym(degree)
666 actions::action *A2; // Sym(degree), in the action on k-subsets
667
668
669 actions::action *Aut;
670 // PGGL(3,q) in case of PG_2_q with q not prime
671 // PGL(3,q) in case of PG_2_q with q prime
672 actions::action *Aut_on_lines; // Aut induced on lines
673
675
676 long int *set;
677 int sz; // = b, the number of blocks
678
680 groups::strong_generators *Sg;
681
682
684 geometry::projective_space *P;
685
686 int *block; // [k]
687
688
691 void null();
692 void freeself();
694 void create_design_PG_2_q(field_theory::finite_field *F,
695 long int *&set, int &sz, int &k, int verbose_level);
697 int rk, int verbose_level);
699 int verbose_level);
700 int get_nb_colors_as_two_design(int verbose_level);
701 int get_color_as_two_design_assume_sorted(long int *design, int verbose_level);
702};
703
704
705// #############################################################################
706// design_tables.cpp
707// #############################################################################
708
710
711
713
714public:
715
716 actions::action *A;
717 actions::action *A2;
718 long int *initial_set;
720 std::string label;
722 groups::strong_generators *Strong_generators;
723
725 long int *the_table; // [nb_designs * design_size]
726
727
730 void init(actions::action *A, actions::action *A2, long int *initial_set, int design_size,
731 std::string &label,
732 groups::strong_generators *Strong_generators, int verbose_level);
733 void create_table(int verbose_level);
734 void create_action(actions::action *&A_on_designs, int verbose_level);
736 int nb_sol, int Index_width, int *Index,
737 std::string &ouput_fname_csv,
738 int verbose_level);
740 long int *set, int set_sz,
741 long int *&reduced_table, long int *&reduced_table_idx, int &nb_reduced_designs,
742 int verbose_level);
743 void init_from_file(actions::action *A, actions::action *A2,
744 long int *initial_set, int design_size,
745 std::string &label,
746 groups::strong_generators *Strong_generators, int verbose_level);
748 std::string &label,
749 int verbose_level);
750 void save(int verbose_level);
751 void load(int verbose_level);
752 int test_if_designs_are_disjoint(int i, int j);
753 int test_set_within_itself(long int *set_of_designs_by_index, int set_size);
755 long int *set_of_designs_by_index1, int set_size1,
756 long int *set_of_designs_by_index2, int set_size2);
757
758};
759
760
761
762
763// #############################################################################
764// difference_set_in_heisenberg_group.cpp
765// #############################################################################
766
767
769
770
772
773public:
774 std::string fname_base;
775
776 int n;
777 int q;
778 field_theory::finite_field *F;
779 algebra::heisenberg *H;
780 int *Table;
782 int *gens;
784
785#if 0
786 int *N_gens;
787 int N_nb_gens;
788 int N_go;
789#endif
790 actions::action *A;
791 groups::strong_generators *Aut_gens;
792 ring_theory::longinteger_object Aut_order;
793
794 int given_base_length; // = nb_gens
795 long int *given_base; // = gens
798 int *E1;
799 int rk_E1;
800
801 std::string prefix;
802 std::string fname_magma_out;
803 groups::sims *Aut;
804 groups::sims *U;
805 ring_theory::longinteger_object U_go;
806 data_structures_groups::vector_ge *U_gens;
807 groups::schreier *Sch;
808
809
810 // N = normalizer of U in Aut
811 int *N_gens;
813 actions::action *N;
814 ring_theory::longinteger_object N_order;
815
816 actions::action *N_on_orbits;
819 long int *Pairs;
821
822
827 int *Sets1;
828 int *Sets2;
829
830
831 long int *Short_pairs;
832 long int *Long_pairs;
833
836
837 actions::action *A_on_short_orbits;
840
841 poset_classification::poset_classification *gen;
842
843
844
845
846 void init(int n, field_theory::finite_field *F, int verbose_level);
847 void do_n2q3(int verbose_level);
848 void check_overgroups_of_order_nine(int verbose_level);
849 void create_minimal_overgroups(int verbose_level);
850 void early_test_func(long int *S, int len,
851 long int *candidates, int nb_candidates,
852 long int *good_candidates, int &nb_good_candidates,
853 int verbose_level);
854
855};
856
857
858
859// #############################################################################
860// flag_orbits_incidence_structure.cpp
861// #############################################################################
862
864
865
866
867
869
870public:
871
873
876
879 int *Flags; // [nb_flags]
880 long int *Flag_table; // [nb_flags * 2]
881
882 actions::action *A_on_flags;
883
884 groups::orbits_on_something *Orb;
885
889 int f_anti_flags, actions::action *A_perm,
890 groups::strong_generators *SG, int verbose_level);
891 int find_flag(int i, int j);
892 void report(std::ostream &ost, int verbose_level);
893
894};
895
896
897
898
899// #############################################################################
900// hadamard_classify.cpp
901// #############################################################################
902
904
905
906
907
909
910public:
911 int n;
912 int N, N2;
913 data_structures::bitvector *Bitvec;
914 graph_theory::colored_graph *CG;
915
916 actions::action *A;
917
918 int *v;
919
920 poset_classification::poset_classification *gen;
922
923 void init(int n, int f_draw, int verbose_level, int verbose_level_clique);
924 int clique_test(long int *set, int sz);
925 void early_test_func(long int *S, int len,
926 long int *candidates, int nb_candidates,
927 long int *good_candidates, int &nb_good_candidates,
928 int verbose_level);
929 int dot_product(int a, int b, int n);
930};
931
932
933
934
935
936// #############################################################################
937// hall_system_classify.cpp
938// #############################################################################
939
941
942
944public:
945 //int e;
946 int n; // 3^e
947 int nm1; // n-1
948 // number of points different from the reflection point
950 // nm1 / 2
951 // = number of lines (=triples) through the reflection point
952 // = number of lines (=triples) through any point
953 int nb_pairs2; // = nm1 choose 2
954 // number of pairs of points different from the reflection point.
955 // these are the pairs of points that are covered by the
956 // triples that we will choose.
957 // The other pairs have been covered by the lines through
958 // the reflection point, so they are fine because we assume that
959 // these lines exist.
960 int nb_blocks_overall; // {n \choose 2} / 6
961 int nb_blocks_needed; // nb_blocks_overall - (n - 1) / 2
962 int nb_orbits_needed; // nb_blocks_needed / 2
963 int depth;
964 int N;
965 // {nb_pairs choose 3} * 8
966 // {nb_pairs choose 3} counts the number of ways to choose three lines
967 // through the reflection point.
968 // the times 8 is because every triple of lines through the
969 // reflection point has 2^3 ways of choosing one point on each line.
970 int N0; // {nb_pairs choose 3} * 4
971 int *row_sum; // [nm1]
972 // this is where we test whether each of the
973 // points different from the reflection point lies on
974 // the right number of triples.
975 // The right number is nb_pairs
976 int *pair_covering; // [nb_pairs2]
977 // this is where we test whether each of the
978 // pairs of points not including the reflection point
979 // is covered once
980
981
982 long int *triples; // [N0 * 6]
983 // a table of all triples so that
984 // we can induce the group action on to them.
985
986
987 actions::action *A;
988 // The symmetric group on nm1 points.
989 actions::action *A_on_triples;
990 // the induced action on unordered triples as stored in triples[].
991 groups::strong_generators *Strong_gens_Hall_reflection;
992 // the involution which switches the
993 // points on every line through the center (other than the center).
994 groups::strong_generators *Strong_gens_normalizer;
995 // Strong generators for the normalizer of the involution.
996 groups::sims *S;
997 // The normalizer of the involution
998
999 std::string prefix;
1001 groups::schreier *Orbits_on_triples;
1002 // Orbits of the reflection group on triples.
1003 actions::action *A_on_orbits;
1004 // Induced action of A_on_triples
1005 // on the orbit of the reflection group.
1007
1008 poset_classification::poset_classification_control *Control;
1009 poset_classification::poset_with_group_action *Poset;
1010 // subset lattice for action A_on_orbits
1011 poset_classification::poset_classification *PC;
1012 // Classification of subsets in the action A_on_orbits
1013
1014
1017 void null();
1018 void freeself();
1019 void init(int argc, const char **argv,
1020 int n, int depth,
1021 int verbose_level);
1022 void orbits_on_triples(int verbose_level);
1023 void print(std::ostream &ost, long int *S, int len);
1024 void unrank_triple(long int *T, int rk);
1025 void unrank_triple_pair(long int *T1, long int *T2, int rk);
1026 void early_test_func(long int *S, int len,
1027 long int *candidates, int nb_candidates,
1028 long int *good_candidates, int &nb_good_candidates,
1029 int verbose_level);
1030};
1031
1032
1033
1034
1035
1036
1037
1038// #############################################################################
1039// large_set_activity_description.cpp
1040// #############################################################################
1041
1043
1044
1046public:
1047
1048
1049
1052 int read_arguments(
1053 int argc, std::string *argv,
1054 int verbose_level);
1055
1056};
1057
1058
1059// #############################################################################
1060// large_set_activity.cpp
1061// #############################################################################
1062
1064
1065
1067public:
1068
1071
1072
1073
1077 large_set_was *LSW, int verbose_level);
1078
1079};
1080
1081
1082
1083// #############################################################################
1084// large_set_classify.cpp
1085// #############################################################################
1086
1088
1090public:
1092 int design_size; // = DC->sz = b, the number of blocks in the design
1093 int nb_points; // = DC->A->degree
1094 int nb_lines; // = DC->A2->degree
1096
1097 std::string problem_label;
1098
1100 int size_of_large_set; // = nb_lines / design_size
1101
1102
1104
1105 int nb_colors; // = DC->get_nb_colors_as_two_design(0 /* verbose_level */);
1106 int *design_color_table; // [nb_designs]
1107
1108 actions::action *A_on_designs; // action on designs in Design_table
1109 //DC->A2->create_induced_action_on_sets(
1110 // Design_table->nb_designs, Design_table->design_size,
1111 // Design_table->the_table,
1112 // 0 /* verbose_level */);
1113
1114
1115 data_structures::bitvector *Bitvec;
1117
1118 poset_classification::poset_classification_control *Control;
1119 poset_classification::poset_with_group_action *Poset;
1120 poset_classification::poset_classification *gen;
1121
1123
1124
1125
1126
1129 void null();
1130 void freeself();
1131 void init(design_create *DC,
1132 design_tables *T,
1133 int verbose_level);
1134 void create_action_and_poset(int verbose_level);
1135 void compute(int verbose_level);
1137 data_structures_groups::orbit_transversal *&T,
1138 int level, int verbose_level);
1140 data_structures_groups::set_and_stabilizer *&Rep,
1141 int level, int case_nr, int verbose_level);
1142 void compute_colors(
1144 int verbose_level);
1145 int test_if_designs_are_disjoint(int i, int j);
1146
1147};
1148
1149
1150
1151
1152
1153
1154
1155
1156// #############################################################################
1157// large_set_was_activity_description.cpp
1158// #############################################################################
1159
1161
1162
1164public:
1165
1169 poset_classification::poset_classification_control *normalizer_on_orbits_of_a_given_length_control;
1170
1174
1178
1182
1183
1184
1187 int read_arguments(
1188 int argc, std::string *argv,
1189 int verbose_level);
1190 void print();
1191
1192};
1193
1194
1195// #############################################################################
1196// large_set_was_activity.cpp
1197// #############################################################################
1198
1200
1201
1203public:
1204
1207
1208
1212 large_set_was *LSW, int verbose_level);
1214 int select_orbits_of_length_length, int verbose_level);
1215
1216};
1217
1218
1219
1220
1221
1222// #############################################################################
1223// large_set_was_description.cpp
1224// #############################################################################
1225
1227
1229public:
1230
1231
1232 int f_H;
1233 std::string H_go;
1235
1236 int f_N;
1237 std::string N_go;
1239
1241
1243 std::string prefix;
1244
1247
1250 int read_arguments(int argc, std::string *argv,
1251 int verbose_level);
1252 void print();
1253
1254};
1255
1256
1257
1258// #############################################################################
1259// large_set_was.cpp
1260// #############################################################################
1261
1263
1265public:
1266
1268
1270
1271 groups::strong_generators *H_gens;
1272
1273 groups::orbits_on_something *H_orbits;
1274
1275 //H_orbits->init(LS->A_on_designs,
1276 // H_gens,
1277 // FALSE /* f_load_save */,
1278 // Descr->prefix,
1279 // verbose_level);
1280
1281 groups::strong_generators *N_gens;
1282
1283 groups::orbits_on_something *N_orbits;
1284
1285
1286 // used in do_normalizer_on_orbits_of_a_given_length:
1289 int type_idx; // orbits of length orbit_length in H_orbits->Orbits_classified
1290 long int *Orbit1;
1291 long int *Orbit2;
1292
1293 actions::action *A_on_orbits;
1294 // action on H_orbits->Sch
1295 actions::action *A_on_orbits_restricted;
1296 // action A_on_orbits restricted to H_orbits->Orbits_classified->Sets[type_idx]
1297
1298
1299 // used in do_normalizer_on_orbits_of_a_given_length_multiple_orbits::
1300 poset_classification::poset_classification *PC;
1301 poset_classification::poset_classification_control *Control;
1302 poset_classification::poset_with_group_action *Poset;
1303
1304
1306 int type_idx2; // orbits of length orbit_length2 in H_orbits->Orbits_classified
1307
1308#if 0
1309 // reduced designs are those which are compatible
1310 // with all the designs in the chosen set
1311
1312 design_tables *Design_table_reduced;
1313
1314 //long int *Design_table_reduced; // [nb_reduced * design_size]
1315 long int *Design_table_reduced_idx; // [nb_reduced], index into Design_table[]
1316 //int nb_reduced;
1317
1318
1319 int nb_remaining_colors; // = nb_colors - set_sz; // we assume that k = 4
1320 int *reduced_design_color_table; // [nb_reduced]
1321 // colors of the reduced designs after throwing away
1322 // the colors covered by the designs in the chosen set.
1323 // The remaining colors are relabeled consecutively.
1324
1325 action *A_reduced;
1326 // reduced action A_on_designs based on Design_table_reduced_idx[]
1327 schreier *Orbits_on_reduced;
1328 int *color_of_reduced_orbits;
1329#endif
1330
1332
1333
1334 large_set_was();
1338 int verbose_level);
1340 int orbit_length,
1342 poset_classification::poset_classification_control *Control,
1343 int verbose_level);
1345 int orbit_length,
1346 int verbose_level);
1348 int orbit_length,
1350 poset_classification::poset_classification_control *Control,
1351 int verbose_level);
1353 std::string &fname, int orbit_length,
1354 int verbose_level);
1356 std::string &fname_mask, int orbit_length2,
1357 int verbose_level);
1358 void read_solution_file(
1359 std::string &solution_file_name,
1360 long int *starter_set,
1361 int starter_set_sz,
1362 int orbit_length,
1363 int verbose_level);
1364 void normalizer_orbits_early_test_func(long int *S, int len,
1365 long int *candidates, int nb_candidates,
1366 long int *good_candidates, int &nb_good_candidates,
1367 int verbose_level);
1368 int normalizer_orbits_check_conditions(long int *S, int len, int verbose_level);
1369
1370};
1371
1373 long int *candidates, int nb_candidates,
1374 long int *good_candidates, int &nb_good_candidates,
1375 void *data, int verbose_level);
1376int large_set_was_design_test_orbit(long int *orbit, int orbit_length,
1377 void *extra_data);
1378int large_set_was_classify_test_pair_of_orbits(long int *orbit1, int orbit_length1,
1379 long int *orbit2, int orbit_length2, void *extra_data);
1380
1381
1382
1383// #############################################################################
1384// object_with_properties.cpp
1385// #############################################################################
1386
1388
1389
1391public:
1392
1393 geometry::object_with_canonical_form *OwCF;
1394
1395 std::string label;
1396
1397 data_structures::nauty_output *NO;
1398
1401 groups::strong_generators *SG; // only used if f_projective_space
1402
1403 actions::action *A_perm;
1404
1405 combinatorics::tdo_scheme_compute *TDO;
1406
1407 flag_orbits_incidence_structure *Flags; // if !f_projective_space
1409
1412 void init(
1413 geometry::object_with_canonical_form *OwCF,
1414 data_structures::nauty_output *NO,
1416 int max_TDO_depth,
1417 std::string &label,
1418 int verbose_level);
1419 void compute_flag_orbits(int verbose_level);
1420 void lift_generators_to_matrix_group(int verbose_level);
1422 geometry::object_with_canonical_form *OwCF,
1423 data_structures::nauty_output *NO,
1425 std::string &label,
1426 int verbose_level);
1427 void latex_report(std::ostream &ost,
1428 combinatorics::classification_of_objects_report_options *Report_options,
1429 int verbose_level);
1430 void compute_TDO(int max_TDO_depth, int verbose_level);
1431 void print_TDO(std::ostream &ost,
1432 combinatorics::classification_of_objects_report_options *Report_options);
1433 void export_TDA_with_flag_orbits(std::ostream &ost,
1434 groups::schreier *Sch,
1435 int verbose_level);
1436 void export_INP_with_flag_orbits(std::ostream &ost,
1437 groups::schreier *Sch,
1438 int verbose_level);
1439
1440};
1441
1442
1443
1444
1445
1446// #############################################################################
1447// regular_linear_space_description.cpp
1448// #############################################################################
1449
1450
1452
1453
1455public:
1456
1457 int f_m;
1458 int m;
1459 int f_n;
1460 int n;
1461 int f_k;
1462 int k;
1463 int f_r;
1464 int r;
1467
1470
1472 poset_classification::poset_classification_control *Control;
1473
1474
1475
1479 const char *str, int verbose_level);
1480 int read_arguments(
1481 int argc, std::string *argv,
1482 int verbose_level);
1483
1484
1485};
1486
1487
1488
1489// #############################################################################
1490// regular_ls_classify.cpp
1491// #############################################################################
1492
1493
1495
1496
1497
1498
1500
1501public:
1502
1504
1505 int m2;
1506 int *v1; // [k]
1507
1508 poset_classification::poset_with_group_action *Poset;
1509 poset_classification::poset_classification *gen;
1510 actions::action *A;
1511 actions::action *A2;
1512 induced_actions::action_on_k_subsets *Aonk; // only a pointer, do not free
1513
1514 int *row_sum; // [m]
1515 int *pairs; // [m2]
1516 int *open_rows; // [m]
1517 int *open_row_idx; // [m]
1518 int *open_pairs; // [m2]
1519 int *open_pair_idx; // [m2]
1520
1523 void null();
1524 void freeself();
1525 void init_and_run(
1527 int verbose_level);
1528 void init_group(int verbose_level);
1529 void init_action_on_k_subsets(int onk, int verbose_level);
1530 void init_generator(
1531 poset_classification::poset_classification_control *Control,
1532 groups::strong_generators *Strong_gens,
1533 int verbose_level);
1534 void early_test_func(long int *S, int len,
1535 long int *candidates, int nb_candidates,
1536 long int *good_candidates, int &nb_good_candidates,
1537 int verbose_level);
1538 void print(std::ostream &ost, long int *S, int len);
1539 void lifting_prepare_function_new(exact_cover *E, int starter_case,
1540 long int *candidates, int nb_candidates, groups::strong_generators *Strong_gens,
1541 solvers::diophant *&Dio, long int *&col_labels,
1542 int &f_ruled_out,
1543 int verbose_level);
1544};
1545
1546
1547
1548
1549void regular_ls_classify_print_set(std::ostream &ost, int len, long int *S, void *data);
1550void regular_ls_classify_early_test_function(long int *S, int len,
1551 long int *candidates, int nb_candidates,
1552 long int *good_candidates, int &nb_good_candidates,
1553 void *data, int verbose_level);
1555 void *data, int verbose_level);
1557 exact_cover *EC, int starter_case,
1558 long int *candidates, int nb_candidates, groups::strong_generators *Strong_gens,
1559 solvers::diophant *&Dio, long int *&col_labels,
1560 int &f_ruled_out,
1561 int verbose_level);
1562
1563
1564
1565// #############################################################################
1566// tactical_decomposition.cpp
1567// #############################################################################
1568
1570
1571
1572
1574public:
1575
1578 geometry::incidence_structure *Inc;
1580 actions::action *A;
1581 actions::action *A_on_points;
1582 actions::action *A_on_lines;
1583 groups::strong_generators * gens;
1584 data_structures::partitionstack *Stack;
1585 groups::schreier *Sch;
1586 groups::schreier *Sch_points;
1587 groups::schreier *Sch_lines;
1588
1591 void init(int nb_rows, int nb_cols,
1592 geometry::incidence_structure *Inc,
1594 actions::action *Aut,
1595 actions::action *A_on_points,
1596 actions::action *A_on_lines,
1597 groups::strong_generators * gens,
1598 int verbose_level);
1599 void report(int f_enter_math, std::ostream &ost);
1600
1601};
1602
1603
1604
1605
1606
1607}}}
1608
1609
1610#endif /* ORBITER_SRC_LIB_TOP_LEVEL_COMBINATORICS_TL_COMBINATORICS_H_ */
void init_group(combinatorics::boolean_function_domain *BF, int verbose_level)
induced_actions::action_on_homogeneous_polynomials * AonHPD
combinatorics::classification_of_objects_report_options * Classification_of_objects_report_options
void draw_incidence_matrices(std::string &prefix, data_structures::data_input_stream *IS, int verbose_level)
void report_isomorphism_type(std::ostream &fp, combinatorics::classification_of_objects_report_options *Report_options, combinatorics::classification_of_objects *CO, object_with_properties *OwP, int i, int verbose_level)
void classification_report(combinatorics::classification_of_objects *CO, object_with_properties *OwP, int verbose_level)
void line_covering_type(std::string &prefix, std::string &projective_space_label, std::string &lines, data_structures::data_input_stream *IS, int verbose_level)
void init_input_stream(combinatorial_object_activity_description *Descr, data_structures::data_input_stream *IS, int verbose_level)
void do_save(std::string &save_as_fname, int f_extract, long int *extract_idx_set, int extract_size, int verbose_level)
void init(combinatorial_object_activity_description *Descr, geometry::geometric_object_create *GOC, int verbose_level)
void report_object(std::ostream &fp, combinatorics::classification_of_objects_report_options *Report_options, combinatorics::classification_of_objects *CO, object_with_properties *OwP, int object_idx, int verbose_level)
void report_all_isomorphism_types(std::ostream &fp, combinatorics::classification_of_objects_report_options *Report_options, combinatorics::classification_of_objects *CO, object_with_properties *OwP, int verbose_level)
void latex_report(combinatorics::classification_of_objects_report_options *Report_options, combinatorics::classification_of_objects *CO, object_with_properties *OwP, int verbose_level)
void unpack_from_restricted_action(std::string &prefix, std::string &group_label, data_structures::data_input_stream *IS, int verbose_level)
void post_process_classification(combinatorics::classification_of_objects *CO, object_with_properties *&OwP, int f_projective_space, projective_geometry::projective_space_with_action *PA, std::string &prefix, int verbose_level)
void classify_objects_using_nauty(data_structures::data_input_stream_description *Data, data_structures::classify_bitvectors *CB, std::string &output_fname, int verbose_level)
void create_design_table(design_create *DC, std::string &problem_label, design_tables *&T, groups::strong_generators *Gens, int verbose_level)
void append_orbit_and_adjust_size(groups::schreier *Orb, int idx, int *set, int &sz)
void handle_input_file(data_structures::classify_bitvectors *CB, int nb_objects_to_test, int t0, std::string &fname, int input_file_idx, int nb_input_files, int N_points, int design_b, int design_k, int partition_class_size, long int *Ago, std::vector< std::vector< long int > > &Reps, int verbose_level)
void load_design_table(design_create *DC, std::string &problem_label, design_tables *&T, groups::strong_generators *Gens, int verbose_level)
void Hill_cap56(char *fname, int &nb_Pts, long int *&Pts, int verbose_level)
void process_object(data_structures::classify_bitvectors *CB, data_structures_groups::incidence_structure_with_group *IG, geometry::incidence_structure *&Inc_out, int nb_objects_to_test, int &f_found, int &idx, ring_theory::longinteger_object &go, int verbose_level)
poset_classification::poset_classification_control * Pair_search_control
poset_classification::poset_classification_control * Search_control
search for line transitive point imprimitive linear spaces as described by Delandtsheer and Doyen
poset_classification::poset_with_group_action * Poset_search
void init(delandtsheer_doyen_description *Descr, int verbose_level)
int check_col_sums(long int *line, int len, int verbose_level)
int check_row_sums(long int *line, int len, int verbose_level)
void create_graph(long int *line0, int len, 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 compute_orbits_on_pairs(groups::strong_generators *Strong_gens, int verbose_level)
groups::strong_generators * scan_subgroup_generators(int verbose_level)
void get_mask_core_and_singletons(long int *line, int len, int &nb_rows_used, int &nb_cols_used, int &nb_singletons, int verbose_level)
int check_orbit_covering(long int *line, int len, int verbose_level)
poset_classification::poset_with_group_action * Poset_pairs
combinatorics::classification_of_objects_description * Canonical_form_Descr
void do_export_blocks(design_create *DC, int verbose_level)
void do_tactical_decomposition(design_create *DC, int verbose_level)
void do_extract_solutions_by_index(design_create *DC, std::string &label, std::string &group_label, std::string &fname_in, std::string &fname_out, std::string &prefix_text, int f_csv_format, int verbose_level)
void do_canonical_form(combinatorics::classification_of_objects_description *Canonical_form_Descr, int verbose_level)
void do_create_table(design_create *DC, std::string &label, std::string &group_label, int verbose_level)
void do_load_table(design_create *DC, std::string &label, std::string &group_label, std::string &H_label, std::string &H_go_text, std::string &H_generators_data, int selected_orbit_length, int verbose_level)
void perform_activity(design_activity_description *Descr, design_create *DC, int verbose_level)
to describe the construction of a known design from the command line
to create a known design using a description from class design_create_description
void unrank_block_in_PG_2_q(int *block, int rk, int verbose_level)
void init(apps_combinatorics::design_create_description *Descr, int verbose_level)
projective_geometry::projective_space_with_action * PA
int get_color_as_two_design_assume_sorted(long int *design, int verbose_level)
void create_design_PG_2_q(field_theory::finite_field *F, long int *&set, int &sz, int &k, int verbose_level)
int test_between_two_sets(long int *set_of_designs_by_index1, int set_size1, long int *set_of_designs_by_index2, int set_size2)
void init_from_file(actions::action *A, actions::action *A2, long int *initial_set, int design_size, std::string &label, groups::strong_generators *Strong_generators, int verbose_level)
int test_set_within_itself(long int *set_of_designs_by_index, int set_size)
void extract_solutions_by_index(int nb_sol, int Index_width, int *Index, std::string &ouput_fname_csv, int verbose_level)
void create_action(actions::action *&A_on_designs, int verbose_level)
void init(actions::action *A, actions::action *A2, long int *initial_set, int design_size, std::string &label, groups::strong_generators *Strong_generators, int verbose_level)
void make_reduced_design_table(long int *set, int set_sz, long int *&reduced_table, long int *&reduced_table_idx, int &nb_reduced_designs, int verbose_level)
int test_if_table_exists(std::string &label, 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(object_with_properties *OwP, int f_anti_flags, actions::action *A_perm, groups::strong_generators *SG, int verbose_level)
void init(int n, int f_draw, int verbose_level, int verbose_level_clique)
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)
poset_classification::poset_classification_control * Control
void init(int argc, const char **argv, int n, int depth, 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 perform_activity(large_set_activity_description *Descr, large_set_was *LSW, int verbose_level)
void read_classification_single_case(data_structures_groups::set_and_stabilizer *&Rep, int level, int case_nr, int verbose_level)
void init(design_create *DC, design_tables *T, int verbose_level)
poset_classification::poset_classification_control * Control
void read_classification(data_structures_groups::orbit_transversal *&T, int level, int verbose_level)
void compute_colors(design_tables *Design_table, int *&design_color_table, int verbose_level)
description of an activity for a large set search with assumed symmetry
poset_classification::poset_classification_control * normalizer_on_orbits_of_a_given_length_control
an activity for a large set search with assumed symmetry
void do_normalizer_on_orbits_of_a_given_length(int select_orbits_of_length_length, int verbose_level)
void perform_activity(large_set_was_activity_description *Descr, large_set_was *LSW, int verbose_level)
command line description of tasks for large sets with assumed symmetry
classification of large sets of designs with assumed symmetry
poset_classification::poset_with_group_action * Poset
void do_normalizer_on_orbits_of_a_given_length_single_orbit(int orbit_length, int verbose_level)
void init(large_set_was_description *Descr, large_set_classify *LS, int verbose_level)
void create_graph_on_orbits_of_length(std::string &fname, int orbit_length, int verbose_level)
poset_classification::poset_classification_control * Control
int normalizer_orbits_check_conditions(long int *S, int len, int verbose_level)
void read_solution_file(std::string &solution_file_name, long int *starter_set, int starter_set_sz, int orbit_length, int verbose_level)
void create_graph_on_orbits_of_length_based_on_N_orbits(std::string &fname_mask, int orbit_length2, int verbose_level)
void do_normalizer_on_orbits_of_a_given_length_multiple_orbits(int orbit_length, int nb_of_orbits_to_choose, poset_classification::poset_classification_control *Control, int verbose_level)
void do_normalizer_on_orbits_of_a_given_length(int orbit_length, int nb_of_orbits_to_choose, poset_classification::poset_classification_control *Control, int verbose_level)
void normalizer_orbits_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)
object properties which are derived from nauty canonical form
void print_TDO(std::ostream &ost, combinatorics::classification_of_objects_report_options *Report_options)
void init_object_in_projective_space(geometry::object_with_canonical_form *OwCF, data_structures::nauty_output *NO, projective_geometry::projective_space_with_action *PA, std::string &label, int verbose_level)
void export_TDA_with_flag_orbits(std::ostream &ost, groups::schreier *Sch, int verbose_level)
void export_INP_with_flag_orbits(std::ostream &ost, groups::schreier *Sch, int verbose_level)
void init(geometry::object_with_canonical_form *OwCF, data_structures::nauty_output *NO, int f_projective_space, projective_geometry::projective_space_with_action *PA, int max_TDO_depth, std::string &label, int verbose_level)
projective_geometry::projective_space_with_action * PA
void latex_report(std::ostream &ost, combinatorics::classification_of_objects_report_options *Report_options, int verbose_level)
a description of a class of regular linear spaces from the command line
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_generator(poset_classification::poset_classification_control *Control, groups::strong_generators *Strong_gens, int verbose_level)
void lifting_prepare_function_new(exact_cover *E, int starter_case, long int *candidates, int nb_candidates, groups::strong_generators *Strong_gens, solvers::diophant *&Dio, long int *&col_labels, int &f_ruled_out, int verbose_level)
void init_and_run(regular_linear_space_description *Descr, int verbose_level)
tactical decomposition of an incidence structure with respect to a given group
void init(int nb_rows, int nb_cols, geometry::incidence_structure *Inc, int f_combined_action, actions::action *Aut, actions::action *A_on_points, actions::action *A_on_lines, groups::strong_generators *gens, int verbose_level)
projective space PG(n,q) with automorphism group PGGL(n+1,q)
void large_set_was_normalizer_orbits_early_test_func_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 regular_ls_classify_early_test_function(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 regular_ls_classify_print_set(ostream &ost, int len, long int *S, void *data)
int large_set_was_design_test_orbit(long int *orbit, int orbit_length, void *extra_data)
int large_set_was_classify_test_pair_of_orbits(long int *orbit1, int orbit_length1, long int *orbit2, int orbit_length2, void *extra_data)
int regular_ls_classify_check_function_incremental_callback(int len, int *S, void *data, int verbose_level)
void regular_ls_classify_lifting_prepare_function_new(exact_cover *EC, int starter_case, long int *candidates, int nb_candidates, groups::strong_generators *Strong_gens, solvers::diophant *&Dio, long int *&col_labels, int &f_ruled_out, int verbose_level)
the orbiter library for the classification of combinatorial objects
#define MAX_MASK_TESTS