Orbiter 2022
Combinatorial Objects
spreads.h
Go to the documentation of this file.
1/*
2 * spreads.h
3 *
4 * Created on: May 25, 2021
5 * Author: betten
6 */
7
8#ifndef SRC_LIB_TOP_LEVEL_SPREADS_SPREADS_H_
9#define SRC_LIB_TOP_LEVEL_SPREADS_SPREADS_H_
10
11
12namespace orbiter {
13namespace layer5_applications {
14namespace spreads {
15
16
17// #############################################################################
18// recoordinatize.cpp
19// #############################################################################
20
22
23
25public:
26 int n;
27 int k;
28 int q;
29 geometry::grassmann *Grass;
30 field_theory::finite_field *F;
31 actions::action *A; // P Gamma L(n,q)
32 actions::action *A2; // action of A on grassmannian of k-subspaces of V(n,q)
35 int nCkq; // n choose k in q
36 int (*check_function_incremental)(int len, long int *S,
37 void *check_function_incremental_data, int verbose_level);
39
40 //std::string fname_live_points;
41
42
44 int *M;
45 int *M1;
46 int *AA;
47 int *AAv;
48 int *TT;
49 int *TTv;
50 int *B;
51 int *C;
52 int *N;
53 int *Elt;
54
55 // initialized in compute_starter():
57 actions::action *A0; // P Gamma L(k,q)
58 actions::action *A0_linear; // PGL(k,q), needed for compute_live_points
59 data_structures_groups::vector_ge *gens2;
60
61 long int *live_points;
63
64
67 void null();
68 void freeself();
69 void init(int n, int k, field_theory::finite_field *F,
70 geometry::grassmann *Grass,
71 actions::action *A, actions::action *A2,
73 int (*check_function_incremental)(int len, long int *S,
74 void *data, int verbose_level),
76 int verbose_level);
77 void do_recoordinatize(long int i1, long int i2, long int i3, int verbose_level);
78 void compute_starter(long int *&S, int &size,
79 groups::strong_generators *&Strong_gens, int verbose_level);
80 void stabilizer_of_first_three(groups::strong_generators *&Strong_gens,
81 int verbose_level);
82 void compute_live_points(int verbose_level);
84 int &nb_live_points, int verbose_level);
85 void make_first_three(long int &j1, long int &j2, long int &j3, int verbose_level);
86};
87
88
89
90// #############################################################################
91// spread_classify.cpp
92// #############################################################################
93
94#define SPREAD_OF_TYPE_FTWKB 1
95#define SPREAD_OF_TYPE_KANTOR 2
96#define SPREAD_OF_TYPE_KANTOR2 3
97#define SPREAD_OF_TYPE_GANLEY 4
98#define SPREAD_OF_TYPE_LAW_PENTTILA 5
99#define SPREAD_OF_TYPE_DICKSON_KANTOR 6
100#define SPREAD_OF_TYPE_HUDSON 7
101
102
104
105
107public:
108
110
111 groups::matrix_group *Mtx;
112
113
114 int order;
115 int spread_size; // = order + 1
116 int n; // = a multiple of k
117 int k;
118 int kn; // = k * n
119 int q;
120 int nCkq; // n choose k in q
121 int r, nb_pts;
122 int nb_points_total; // = nb_pts = {n choose 1}_q
123 int block_size; // = r = {k choose 1}_q
124
125
127
128
129 actions::action *A;
130 // P Gamma L(n,q)
131 actions::action *A2;
132 // action of A on grassmannian of k-subspaces of V(n,q)
133 induced_actions::action_on_grassmannian *AG;
134 geometry::grassmann *Grass;
135 // {n choose k}_q
136
137
140 poset_classification::classification_base_case *Base_case;
141
142 // if f_recoordinatize is TRUE:
143 long int *Starter;
145 groups::strong_generators *Starter_Strong_gens;
146
147 // for check_function_incremental:
148 int *tmp_M1;
149 int *tmp_M2;
150 int *tmp_M3;
151 int *tmp_M4;
152
153 poset_classification::poset_with_group_action *Poset;
154 poset_classification::poset_classification *gen;
155
156
158
159
160 // only if n = 2 * k:
161 geometry::klein_correspondence *Klein;
163
164
165 int Nb;
166 int *Data1;
167 // [max_depth * kn],
168 // previously [Nb * n], which was too much
169 int *Data2;
170 // [n * n]
171
172
175 void null();
176 void freeself();
177 void init(
179 int k,
181 int verbose_level);
182 void init2(
183 poset_classification::poset_classification_control *Control,
184 int verbose_level);
185 void unrank_point(int *v, long int a);
186 long int rank_point(int *v);
187 void unrank_subspace(int *M, long int a);
188 long int rank_subspace(int *M);
189 void print_points();
190 void print_points(long int *pts, int len);
191 void print_elements();
193 void compute(int verbose_level);
194 void early_test_func(long int *S, int len,
195 long int *candidates, int nb_candidates,
196 long int *good_candidates, int &nb_good_candidates,
197 int verbose_level);
198 int check_function(int len, long int *S, int verbose_level);
199 int incremental_check_function(int len, long int *S, int verbose_level);
200 void lifting_prepare_function_new(exact_cover *E, int starter_case,
201 long int *candidates, int nb_candidates,
202 groups::strong_generators *Strong_gens,
203 solvers::diophant *&Dio, long int *&col_labels,
204 int &f_ruled_out,
205 int verbose_level);
206 void compute_dual_spread(int *spread, int *dual_spread,
207 int verbose_level);
208
209
210 // spread_classify2.cpp
211 void print_isomorphism_type(isomorph *Iso,
212 int iso_cnt, groups::sims *Stab, groups::schreier &Orb,
213 long int *data, int verbose_level);
214 // called from callback_print_isomorphism_type()
215 void print_isomorphism_type2(isomorph *Iso,
216 std::ostream &ost,
217 int iso_cnt, groups::sims *Stab, groups::schreier &Orb,
218 long int *data, int verbose_level);
219 void save_klein_invariants(char *prefix,
220 int iso_cnt,
221 long int *data, int data_size, int verbose_level);
222 void klein(std::ostream &ost,
223 isomorph *Iso,
224 int iso_cnt, groups::sims *Stab, groups::schreier &Orb,
225 long int *data, int data_size, int verbose_level);
227 geometry::projective_space *P3,
228 geometry::projective_space *P5,
229 geometry::grassmann *Gr,
230 long int *data, int size,
231 int *&intersection_type, int &highest_intersection_number,
232 int verbose_level);
233
234 void czerwinski_oakden(int level, int verbose_level);
235 void write_spread_to_file(int type_of_spread, int verbose_level);
236 void make_spread(long int *data, int type_of_spread, int verbose_level);
237 void make_spread_from_q_clan(long int *data, int type_of_spread,
238 int verbose_level);
239 void read_and_print_spread(std::string &fname, int verbose_level);
240 void HMO(std::string &fname, int verbose_level);
241 void get_spread_matrices(int *F, int *G, long int *data, int verbose_level);
242 void print_spread(std::ostream &ost, long int *data, int sz);
243 void report2(isomorph &Iso, int verbose_level);
244 void report3(isomorph &Iso, std::ostream &ost, int verbose_level);
245 void all_cooperstein_thas_quotients(isomorph &Iso, int verbose_level);
246 void cooperstein_thas_quotients(isomorph &Iso, std::ofstream &f,
247 int h, int &cnt, int verbose_level);
248 void orbit_info_short(std::ostream &ost, isomorph &Iso, int h);
249 void report_stabilizer(isomorph &Iso, std::ostream &ost, int orbit,
250 int verbose_level);
251 void print(std::ostream &ost, int len, long int *S);
252};
253
254
255
256
257
258// #############################################################################
259// spread_create_description.cpp
260// #############################################################################
261
263
265
266public:
267
268 int f_q;
269 int q;
270 int f_k;
271 int k;
273 int iso;
275 std::string family_name;
276
277
278
281 void null();
282 void freeself();
283 int read_arguments(int argc, std::string *argv,
284 int verbose_level);
285 void print();
286};
287
288// #############################################################################
289// spread_create.cpp
290// #############################################################################
291
293
294
295
297
298public:
300
301 std::string prefix;
302 std::string label_txt;
303 std::string label_tex;
304
305 int q;
306 field_theory::finite_field *F;
307 int k;
308
310
311 actions::action *A;
313
314 long int *set;
315 int sz;
316
318 groups::strong_generators *Sg;
319
320
321
322
325 void null();
326 void freeself();
327 void init(spread_create_description *Descr, int verbose_level);
329 std::vector<std::string> transform_coeffs,
330 std::vector<int> f_inverse_transform, int verbose_level);
331};
332
333
334
335// #############################################################################
336// spread_lifting.cpp
337// #############################################################################
338
340
341
343public:
344
346 exact_cover *E;
347
348 long int *starter;
352 int f_lex;
353
354 long int *candidates;
356 groups::strong_generators *Strong_gens;
357
359 // [nb_points_covered_by_starter]
361
363 long int *free_point_list; // [nb_free_points]
364 long int *point_idx; // [nb_points_total]
365 // point_idx[i] = index of a point in free_point_list
366 // or -1 if the point is in points_covered_by_starter
367
368
370
371 long int *col_labels; // [nb_cols]
373
374
377 void null();
378 void freeself();
379 void init(spread_classify *S, exact_cover *E,
380 long int *starter, int starter_size,
382 long int *candidates, int nb_candidates,
383 groups::strong_generators *Strong_gens,
384 int f_lex,
385 int verbose_level);
387 int verbose_level);
389 int verbose_level);
390 solvers::diophant *create_system(int verbose_level);
391 void find_coloring(solvers::diophant *Dio,
392 int *&col_color, int &nb_colors,
393 int verbose_level);
394
395};
396
397
398// #############################################################################
399// spread_table_activity_description.cpp
400// #############################################################################
401
403
404
406public:
407
408
410 std::string find_spread_text;
411
414
417
420
424
425
429
432
433
434
437 int read_arguments(
438 int argc, std::string *argv,
439 int verbose_level);
440 void print();
441
442};
443
444
445// #############################################################################
446// spread_table_activity.cpp
447// #############################################################################
448
450
451
453public:
454
457
458
459
464 int verbose_level);
465 void perform_activity(int verbose_level);
466 void export_spreads_to_csv(std::string &fname, int *spread_idx, int nb, int verbose_level);
467 void report_spreads(int *spread_idx, int nb, int verbose_level);
468 void report_spread2(std::ostream &ost, int spread_idx, int verbose_level);
469
470};
471
472
473// #############################################################################
474// spread_table_with_selection.cpp
475// #############################################################################
476
478
479
481public:
482
484 field_theory::finite_field *F;
485 int q;
491
494
495
497
498
499 long int *spread_reps; // [nb_spread_reps * T->spread_size]
500 int *spread_reps_idx; // [nb_spread_reps]
501 long int *spread_orbit_length; // [nb_spread_reps]
503 long int total_nb_of_spreads; // = sum i : spread_orbit_length[i]
505 // the number of spreads
506 // from the classification
509
510 geometry::spread_tables *Spread_tables;
511 int *tmp_isomorphism_type_of_spread; // for packing_swap_func
512
513 data_structures::bitvector *Bitvec;
514
515 actions::action *A_on_spreads;
516
519 void init(spread_classify *T,
520 int f_select_spread,
521 std::string &select_spread_text,
522 std::string &path_to_spread_tables,
523 int verbose_level);
524 void compute_spread_table(int verbose_level);
525 void compute_spread_table_from_scratch(int verbose_level);
526 void create_action_on_spreads(int verbose_level);
527 int find_spread(long int *set, int verbose_level);
528 long int *get_spread(int spread_idx);
529 void find_spreads_containing_two_lines(std::vector<int> &v,
530 int line1, int line2, int verbose_level);
531 int test_if_packing_is_self_dual(int *packing, int verbose_level);
533 actions::action *A,
534 groups::strong_generators *Strong_gens,
535 int verbose_level);
537 actions::action *A, actions::action *A2,
538 groups::strong_generators *Strong_gens,
539 long int **&Sets, int *&Prev, int *&Label, int *&first, int *&len,
540 int *&isomorphism_type_of_spread,
541 int verbose_level);
543 long int *&points_covered_by_starter,
544 int &nb_points_covered_by_starter,
545 long int *starter, int starter_size,
546 int verbose_level);
547 // points_covered_by_starter are the lines that
548 // are contained in the spreads chosen for the starter
550 long int *&free_points2, int &nb_free_points2, long int *&free_point_idx,
551 long int *points_covered_by_starter,
552 int nb_points_covered_by_starter,
553 long int *starter, int starter_size,
554 int verbose_level);
555 // free_points2 are actually the free lines,
556 // i.e., the lines that are not
557 // yet part of the partial packing
559 exact_cover *EC, int starter_case,
560 long int *&live_blocks2, int &nb_live_blocks2,
561 long int *points_covered_by_starter, int nb_points_covered_by_starter,
562 long int *starter, int starter_size,
563 int verbose_level);
564 void compute_adjacency_matrix(int verbose_level);
565 int is_adjacent(int i, int j);
566
567};
568
569
570
571// #############################################################################
572// translation_plane_via_andre_model.cpp
573// #############################################################################
574
576
577
578
580public:
581 field_theory::finite_field *F;
582 int q;
583 int k;
584 int n;
585 int k1;
586 int n1;
587
588 geometry::andre_construction *Andre;
589 int N; // number of points = number of lines
590 int twoN; // 2 * N
592
593 geometry::andre_construction_line_element *Line;
594 int *Incma;
596 int *Line_through_two_points; // [N * N]
597 int *Line_intersection; // [N * N]
598
599 actions::action *An;
600 actions::action *An1;
601
602 actions::action *OnAndre;
603
604 groups::strong_generators *strong_gens;
605
606 geometry::incidence_structure *Inc;
607 data_structures::partitionstack *Stack;
608
609 poset_classification::poset_classification_control *Control;
610 poset_classification::poset_with_group_action *Poset;
611 poset_classification::poset_classification *arcs;
612
614
615 std::string label;
616
619 void null();
620 void freeself();
621 void init(long int *spread_elements_numeric,
622 int k, actions::action *An, actions::action *An1,
623 data_structures_groups::vector_ge *spread_stab_gens,
624 ring_theory::longinteger_object &spread_stab_go,
625 std::string &label,
626 int verbose_level);
627 void classify_arcs(const char *prefix,
628 int depth, int verbose_level);
629 void classify_subplanes(const char *prefix,
630 int verbose_level);
631 int check_arc(long int *S, int len, int verbose_level);
632 int check_subplane(long int *S, int len, int verbose_level);
634 long int *S, int *subplane7,
635 int verbose_level);
636 void create_latex_report(int verbose_level);
637 void report(std::ostream &ost, int verbose_level);
638
639};
640
641
642
643
644
645
646
647}}}
648
649
650
651#endif /* SRC_LIB_TOP_LEVEL_SPREADS_SPREADS_H_ */
tactical decomposition of an incidence structure with respect to a given group
the Singer cycle in a finite projective geometry
Definition: tl_geometry.h:853
classification of packings in PG(3,q)
Definition: packings.h:66
projective space PG(n,q) with automorphism group PGGL(n+1,q)
three skew lines in PG(3,q), used to classify spreads
Definition: spreads.h:24
void do_recoordinatize(long int i1, long int i2, long int i3, int verbose_level)
void compute_starter(long int *&S, int &size, groups::strong_generators *&Strong_gens, int verbose_level)
int(* check_function_incremental)(int len, long int *S, void *check_function_incremental_data, int verbose_level)
Definition: spreads.h:36
void stabilizer_of_first_three(groups::strong_generators *&Strong_gens, int verbose_level)
void compute_live_points_low_level(long int *&live_points, int &nb_live_points, int verbose_level)
void make_first_three(long int &j1, long int &j2, long int &j3, int verbose_level)
data_structures_groups::vector_ge * gens2
Definition: spreads.h:59
void init(int n, int k, field_theory::finite_field *F, geometry::grassmann *Grass, actions::action *A, actions::action *A2, int f_projective, int f_semilinear, int(*check_function_incremental)(int len, long int *S, void *data, int verbose_level), void *check_function_incremental_data, int verbose_level)
to classify spreads of PG(k-1,q) in PG(n-1,q) where k divides n
Definition: spreads.h:106
poset_classification::poset_with_group_action * Poset
Definition: spreads.h:153
poset_classification::poset_classification * gen
Definition: spreads.h:154
groups::strong_generators * Starter_Strong_gens
Definition: spreads.h:145
void save_klein_invariants(char *prefix, int iso_cnt, long int *data, int data_size, int verbose_level)
void read_and_print_spread(std::string &fname, int verbose_level)
void print_isomorphism_type(isomorph *Iso, int iso_cnt, groups::sims *Stab, groups::schreier &Orb, long int *data, int verbose_level)
void init(projective_geometry::projective_space_with_action *PA, int k, int f_recoordinatize, int verbose_level)
void report3(isomorph &Iso, std::ostream &ost, int verbose_level)
void report_stabilizer(isomorph &Iso, std::ostream &ost, int orbit, int verbose_level)
void print(std::ostream &ost, int len, long int *S)
void get_spread_matrices(int *F, int *G, long int *data, int verbose_level)
void make_spread_from_q_clan(long int *data, int type_of_spread, 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 write_spread_to_file(int type_of_spread, int verbose_level)
void print_spread(std::ostream &ost, long int *data, int sz)
int incremental_check_function(int len, long int *S, int verbose_level)
induced_actions::action_on_grassmannian * AG
Definition: spreads.h:133
void cooperstein_thas_quotients(isomorph &Iso, std::ofstream &f, int h, int &cnt, int verbose_level)
void klein(std::ostream &ost, isomorph *Iso, int iso_cnt, groups::sims *Stab, groups::schreier &Orb, long int *data, int data_size, 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 orbit_info_short(std::ostream &ost, isomorph &Iso, int h)
void plane_intersection_type_of_klein_image(geometry::projective_space *P3, geometry::projective_space *P5, geometry::grassmann *Gr, long int *data, int size, int *&intersection_type, int &highest_intersection_number, int verbose_level)
int check_function(int len, long int *S, int verbose_level)
void all_cooperstein_thas_quotients(isomorph &Iso, int verbose_level)
void init2(poset_classification::poset_classification_control *Control, int verbose_level)
void HMO(std::string &fname, int verbose_level)
void make_spread(long int *data, int type_of_spread, int verbose_level)
void print_isomorphism_type2(isomorph *Iso, std::ostream &ost, int iso_cnt, groups::sims *Stab, groups::schreier &Orb, long int *data, int verbose_level)
layer1_foundations::orthogonal_geometry::orthogonal * O
Definition: spreads.h:162
projective_geometry::projective_space_with_action * PA
Definition: spreads.h:109
geometry::klein_correspondence * Klein
Definition: spreads.h:161
poset_classification::classification_base_case * Base_case
Definition: spreads.h:140
void compute_dual_spread(int *spread, int *dual_spread, int verbose_level)
to describe the construction of a known spread from the command line
Definition: spreads.h:264
int read_arguments(int argc, std::string *argv, int verbose_level)
to create a known spread using a description from class spread_create_description
Definition: spreads.h:296
void init(spread_create_description *Descr, int verbose_level)
void apply_transformations(std::vector< std::string > transform_coeffs, std::vector< int > f_inverse_transform, int verbose_level)
creates spreads from partial spreads using class exact_cover
Definition: spreads.h:342
solvers::diophant * create_system(int verbose_level)
void find_coloring(solvers::diophant *Dio, int *&col_color, int &nb_colors, int verbose_level)
void init(spread_classify *S, exact_cover *E, long int *starter, int starter_size, int starter_case_number, int starter_number_of_cases, long int *candidates, int nb_candidates, groups::strong_generators *Strong_gens, int f_lex, int verbose_level)
description of an activity for a spread table
Definition: spreads.h:405
void init(spreads::spread_table_activity_description *Descr, packings::packing_classify *P, int verbose_level)
void report_spreads(int *spread_idx, int nb, int verbose_level)
void export_spreads_to_csv(std::string &fname, int *spread_idx, int nb, int verbose_level)
void report_spread2(std::ostream &ost, int spread_idx, int verbose_level)
spreads tables with a selection of isomorphism types
Definition: spreads.h:480
void compute_live_blocks2(exact_cover *EC, int starter_case, long int *&live_blocks2, int &nb_live_blocks2, long int *points_covered_by_starter, int nb_points_covered_by_starter, long int *starter, int starter_size, int verbose_level)
void find_spreads_containing_two_lines(std::vector< int > &v, int line1, int line2, int verbose_level)
void compute_covered_points(long int *&points_covered_by_starter, int &nb_points_covered_by_starter, long int *starter, int starter_size, int verbose_level)
void init(spread_classify *T, int f_select_spread, std::string &select_spread_text, std::string &path_to_spread_tables, int verbose_level)
void make_spread_table(actions::action *A, actions::action *A2, groups::strong_generators *Strong_gens, long int **&Sets, int *&Prev, int *&Label, int *&first, int *&len, int *&isomorphism_type_of_spread, int verbose_level)
void predict_spread_table_length(actions::action *A, groups::strong_generators *Strong_gens, int verbose_level)
void compute_free_points2(long int *&free_points2, int &nb_free_points2, long int *&free_point_idx, long int *points_covered_by_starter, int nb_points_covered_by_starter, long int *starter, int starter_size, int verbose_level)
Andre / Bruck / Bose model of a translation plane.
Definition: spreads.h:579
poset_classification::poset_classification_control * Control
Definition: spreads.h:609
int check_if_quadrangle_defines_a_subplane(long int *S, int *subplane7, int verbose_level)
poset_classification::poset_with_group_action * Poset
Definition: spreads.h:610
poset_classification::poset_classification * arcs
Definition: spreads.h:611
void init(long int *spread_elements_numeric, int k, actions::action *An, actions::action *An1, data_structures_groups::vector_ge *spread_stab_gens, ring_theory::longinteger_object &spread_stab_go, std::string &label, int verbose_level)
the orbiter library for the classification of combinatorial objects