Orbiter 2022
Combinatorial Objects
packing_was.cpp
Go to the documentation of this file.
1/*
2 * packing_was.cpp
3 *
4 * Created on: Aug 7, 2019
5 * Author: betten
6 */
7
8
9
10
11//
12
13#include "orbiter.h"
14
15using namespace std;
16
17namespace orbiter {
18namespace layer5_applications {
19namespace packings {
20
21
22static int packing_was_set_of_reduced_spreads_adjacency_test_function(long int *orbit1, int len1,
23 long int *orbit2, int len2, void *data);
24static int packing_was_evaluate_orbit_invariant_function(
25 int a, int i, int j, void *evaluate_data, int verbose_level);
26static void packing_was_print_function(std::ostream &ost, long int a, void *data);
27
28
29
31{
32 Descr = NULL;
33
34 H_LG = NULL;
35
36 N_LG = NULL;
37
38 P = NULL;
39
40
41 H_gens = NULL;
42 H_goi = 0;
43 H_sims = NULL;
44
45
46 A = NULL;
48 M = NULL;
49 dim = 0;
50
51 N_gens = NULL;
52 N_goi = 0;
53
54
55 //std::string prefix_point_orbits_under_H;
57
58 //std::string prefix_point_orbits_under_N;
60
61
62 //std::string prefix_line_orbits_under_H;
64
65 //std::string prefix_line_orbits_under_N;
67
68 //std::string prefix_spread_types;
69 Spread_type = NULL;
70
71 //prefix_spread_orbits
73 A_on_spread_orbits = NULL;
74
75 //fname_good_orbits
77 Good_orbit_idx = NULL;
78 Good_orbit_len = NULL;
79 orb = NULL;
80
82 //std::string prefix_spread_types_reduced;
84
86 good_spreads = NULL;
87
89
90 //std::string prefix_reduced_spread_orbits;
93
94
95 Orbit_invariant = NULL;
96 nb_sets = 0;
98
99 Regular_packing = NULL;
100
101}
102
104{
105}
106
108{
109}
110
112{
113 if (Orbit_invariant) {
115 }
116 null();
117}
118
120 packing_classify *P, int verbose_level)
121{
122 int f_v = (verbose_level >= 1);
123
124 if (f_v) {
125 cout << "packing_was::init" << endl;
126 }
127
130
131
132 if (!Descr->f_H) {
133 cout << "packing_was::init "
134 "please use option -H <group description> -end" << endl;
135 exit(1);
136 }
137
138
139
140 // set up the group H:
141
142 if (f_v) {
143 cout << "packing_was::init before init_H" << endl;
144 }
145 init_H(verbose_level - 3);
146 if (f_v) {
147 cout << "packing_was::init after init_H" << endl;
148 }
149
150 orb = NEW_lint(H_goi);
151
152
153 // set up the group N:
154
155
156 if (f_v) {
157 cout << "packing_was::init before init_N" << endl;
158 }
159 init_N(verbose_level - 3);
160 if (f_v) {
161 cout << "packing_was::init after init_N" << endl;
162 }
163
164
165
166
167
168 if (f_v) {
169 cout << "packing_was::init before compute_H_orbits_and_reduce" << endl;
170 }
171 compute_H_orbits_and_reduce(verbose_level);
172 if (f_v) {
173 cout << "packing_was::init after compute_H_orbits_and_reduce" << endl;
174 }
175
176
177 if (f_v) {
178 cout << "packing_was::compute_N_orbits_and_reduce before compute_N_orbits_on_lines" << endl;
179 }
180 compute_N_orbits_on_lines(verbose_level);
181 if (f_v) {
182 cout << "packing_was::compute_N_orbits_and_reduce after compute_N_orbits_on_lines" << endl;
183 }
184
185
186
187
188 if (f_v) {
189 cout << "packing_was::init done" << endl;
190 }
191}
192
194{
195 int f_v = (verbose_level >= 1);
196
197 if (f_v) {
198 cout << "packing_was::compute_H_orbits_and_reduce" << endl;
199 }
200
201 if (f_v) {
202 cout << "H_gens in action on points:" << endl;
204 }
205
206 if (f_v) {
207 cout << "N_gens in action on points:" << endl;
209 }
210
211
212 if (f_v) {
213 cout << "H_gens in action on lines:" << endl;
215 }
216
217 if (f_v) {
218 cout << "N_gens in action on lines:" << endl;
220 }
221
222
223
224 if (f_v) {
225 cout << "packing_was::compute_H_orbits_and_reduce before compute_H_orbits_on_points" << endl;
226 }
227 compute_H_orbits_on_points(verbose_level);
228 if (f_v) {
229 cout << "packing_was::compute_H_orbits_and_reduce after compute_H_orbits_on_points" << endl;
230 }
231
232
233 if (f_v) {
234 cout << "packing_was::compute_H_orbits_and_reduce before compute_N_orbits_on_points" << endl;
235 }
236 compute_N_orbits_on_points(verbose_level);
237 if (f_v) {
238 cout << "packing_was::compute_H_orbits_and_reduce after compute_N_orbits_on_points" << endl;
239 }
240
241
242
243
245
246
248 packing_was_print_function,
249 this /* print_function_data */,
250 verbose_level);
251
252
253 if (f_v) {
254 cout << "packing_was::compute_H_orbits_and_reduce before compute_H_orbits_on_lines" << endl;
255 }
256 compute_H_orbits_on_lines(verbose_level);
257 if (f_v) {
258 cout << "packing_was::compute_H_orbits_and_reduce after compute_H_orbits_on_lines" << endl;
259 }
260
261
262
263
264
265
266
267 if (f_v) {
268 cout << "packing_was::compute_H_orbits_and_reduce before compute_spread_types_wrt_H" << endl;
269 }
270 compute_spread_types_wrt_H(verbose_level);
271 if (f_v) {
272 cout << "packing_was::compute_H_orbits_and_reduce after compute_spread_types_wrt_H" << endl;
273 }
274
275
276 if (f_v) {
277 cout << "packing_was::compute_H_orbits_and_reduce before "
278 "P->Spread_table_with_selection->create_action_on_spreads" << endl;
279 }
281 if (f_v) {
282 cout << "packing_was::compute_H_orbits_and_reduce after "
283 "P->Spread_table_with_selection->create_action_on_spreads" << endl;
284 }
285
286 if (f_v) {
287 cout << "packing_was::compute_H_orbits_and_reduce "
288 "before compute_H_orbits_on_spreads" << endl;
289 }
290 compute_H_orbits_on_spreads(verbose_level);
291 if (f_v) {
292 cout << "packing_was::compute_H_orbits_and_reduce "
293 "after compute_H_orbits_on_spreads" << endl;
294 }
295
296 if (f_v) {
297 cout << "packing_was::compute_H_orbits_and_reduce "
298 "before test_orbits_on_spreads" << endl;
299 }
300 test_orbits_on_spreads(verbose_level);
301 if (f_v) {
302 cout << "packing_was::compute_H_orbits_and_reduce "
303 "after test_orbits_on_spreads" << endl;
304 }
305
306 if (f_v) {
307 cout << "packing_was::compute_H_orbits_and_reduce "
308 "before reduce_spreads" << endl;
309 }
310 reduce_spreads(verbose_level);
311 if (f_v) {
312 cout << "packing_was::compute_H_orbits_and_reduce "
313 "after reduce_spreads" << endl;
314 }
315
316 if (f_v) {
317 cout << "packing_was::compute_H_orbits_and_reduce "
318 "before compute_reduced_spread_types_wrt_H" << endl;
319 }
321 if (f_v) {
322 cout << "packing_was::compute_H_orbits_and_reduce "
323 "after compute_reduced_spread_types_wrt_H" << endl;
324 }
325
326
327 if (f_v) {
328 cout << "packing_was::compute_H_orbits_and_reduce "
329 "before compute_H_orbits_on_reduced_spreads" << endl;
330 }
332 if (f_v) {
333 cout << "packing_was::compute_H_orbits_and_reduce "
334 "after compute_H_orbits_on_reduced_spreads" << endl;
335 }
336
337
338 if (f_v) {
339 cout << "packing_was::compute_H_orbits_and_reduce "
340 "before compute_orbit_invariant_on_classified_orbits" << endl;
341 }
343 if (f_v) {
344 cout << "packing_was::compute_H_orbits_and_reduce "
345 "after compute_orbit_invariant_on_classified_orbits" << endl;
346 }
347
348 if (f_v) {
349 cout << "packing_was::compute_H_orbits_and_reduce "
350 "before classify_orbit_invariant" << endl;
351 }
352 classify_orbit_invariant(verbose_level);
353 if (f_v) {
354 cout << "packing_was::compute_H_orbits_and_reduce "
355 "after classify_orbit_invariant" << endl;
356 }
357
359 if (f_v) {
360 cout << "packing_was::compute_H_orbits_and_reduce "
361 "before init_regular_packing" << endl;
362 }
363 init_regular_packing(verbose_level);
364 if (f_v) {
365 cout << "packing_was::compute_H_orbits_and_reduce "
366 "after init_regular_packing" << endl;
367 }
368 }
369
370 if (f_v) {
371 cout << "packing_was::compute_H_orbits_and_reduce done" << endl;
372 }
373}
374
376{
377 int f_v = (verbose_level >= 1);
378
379 if (f_v) {
380 cout << "packing_was::init_regular_packing" << endl;
381 }
382
384
385 Regular_packing->init(this, verbose_level);
386
387
388 if (f_v) {
389 cout << "packing_was::init_regular_packing done" << endl;
390 }
391}
392
393void packing_was::init_N(int verbose_level)
394{
395 int f_v = (verbose_level >= 1);
397
398 if (f_v) {
399 cout << "packing_was::init_N" << endl;
400 }
401 if (Descr->f_N) {
402 // set up the group N:
403 actions::action *N_A;
404
406
407
408 if (f_v) {
409 cout << "packing_was::init_N before N_LG->init, "
410 "creating the group" << endl;
411 }
412
413 if (P->q != ST.strtoi(Descr->N_Descr->input_q)) {
414 cout << "packing_was::init_N "
415 "q != N_Descr->input_q" << endl;
416 exit(1);
417 }
418 Descr->N_Descr->F = P->F;
419 N_LG->linear_group_init(Descr->N_Descr, verbose_level - 2);
420
421 if (f_v) {
422 cout << "packing_was::init_N after N_LG->linear_group_init" << endl;
423 }
424 N_A = N_LG->A2;
425
426 if (f_v) {
427 cout << "packing_was::init_N created group " << H_LG->label << endl;
428 }
429
430 if (!N_A->is_matrix_group()) {
431 cout << "packing_was::init_N the group is not a matrix group " << endl;
432 exit(1);
433 }
434
436 cout << "the groups N and H must either both be semilinear or not" << endl;
437 exit(1);
438 }
439 if (f_v) {
440 cout << "packing_was::init_N f_semilinear=" << f_semilinear << endl;
441 }
443 if (f_v) {
444 cout << "packing_was::init_N N_gens=" << endl;
446 }
448 if (f_v) {
449 cout << "packing_was::init_N N_goi=" << N_goi << endl;
450 }
451
452
453 if (H_sims) {
454 if (f_v) {
455 cout << "packing_was::init_N before test_if_normalizing" << endl;
456 }
457 N_gens->test_if_normalizing(H_sims, 0 /* verbose_level*/);
458 if (f_v) {
459 cout << "packing_was::init_N after test_if_normalizing" << endl;
460 }
461 }
462 else {
463 cout << "packing_was::init_N H_sims is unavailable" << endl;
464 exit(1);
465 }
466
467 }
468 if (f_v) {
469 cout << "packing_was::init_N done" << endl;
470 }
471}
472
473void packing_was::init_H(int verbose_level)
474{
475 int f_v = (verbose_level >= 1);
476
477 if (f_v) {
478 cout << "packing_was::init_H" << endl;
479 }
481
482 Descr->H_Descr->F = P->F;
483
484 if (f_v) {
485 cout << "packing_was::init_H before H_LG->init, "
486 "creating the group" << endl;
487 }
488
489 H_LG->linear_group_init(Descr->H_Descr, verbose_level - 2);
490
491 if (f_v) {
492 cout << "packing_was::init_H after H_LG->linear_group_init" << endl;
493 }
494
495
496 A = H_LG->A2;
497
498 if (f_v) {
499 cout << "packing_was::init_H created group " << H_LG->label << endl;
500 }
501
502 if (!A->is_matrix_group()) {
503 cout << "packing_was::init_H the group is not a matrix group " << endl;
504 exit(1);
505 }
506
507
509 if (f_v) {
510 cout << "packing_was::init_H f_semilinear=" << f_semilinear << endl;
511 }
512
513
514 M = A->get_matrix_group();
515 dim = M->n;
516
517 if (f_v) {
518 cout << "packing_was::init_H dim=" << dim << endl;
519 }
520
522 if (f_v) {
523 cout << "packing_was::init_H H_gens=" << endl;
525 }
527 if (f_v) {
528 cout << "packing_was::init_H H_goi=" << H_goi << endl;
529 }
530
531 if (f_v) {
532 cout << "packing_was::init_H before H_gens->create_sims" << endl;
533 }
534
535 H_sims = H_gens->create_sims(verbose_level - 2);
536 if (f_v) {
537 cout << "packing_was::init_H after H_gens->create_sims" << endl;
538 }
539
541 prefix_point_orbits_under_H.append("_point_orbits");
543 prefix_point_orbits_under_N.append("_point_orbits");
545 prefix_line_orbits_under_H.append("_line_orbits");
547 prefix_line_orbits_under_N.append("_line_orbits");
549 prefix_spread_types.append("_spread_types");
551 prefix_spread_orbits.append("_spread_orbits");
553 fname_good_orbits.append("_good_orbits");
555 prefix_spread_types_reduced.append("_spread_types_reduced");
557 prefix_reduced_spread_orbits.append("_reduced_spread_orbits");
558
559
560 if (f_v) {
561 cout << "packing_was::init_H prefix_point_orbits_under_H=" << prefix_point_orbits_under_H << endl;
562 cout << "packing_was::init_H prefix_line_orbits_under_H=" << prefix_line_orbits_under_H << endl;
563 cout << "packing_was::init_H prefix_spread_types=" << prefix_spread_types << endl;
564 cout << "packing_was::init_H prefix_spread_orbits=" << prefix_spread_orbits << endl;
565 cout << "packing_was::init_H fname_good_orbits=" << fname_good_orbits << endl;
566 cout << "packing_was::init_H prefix_spread_types_reduced=" << prefix_spread_types_reduced << endl;
567 cout << "packing_was::init_H prefix_reduced_spread_orbits=" << prefix_reduced_spread_orbits << endl;
568 }
569
570 if (f_v) {
571 cout << "packing_was::init_H done" << endl;
572 }
573}
574
576// computes the orbits of H on points
577// and writes to file prefix_point_orbits
578{
579 int f_v = (verbose_level >= 1);
580
581 if (f_v) {
582 cout << "packing_was::compute_H_orbits_on_points" << endl;
583 }
584
585
587
588 if (f_v) {
589 cout << "packing_was::compute_H_orbits_on_points "
590 "prefix_point_orbits_under_H=" << prefix_point_orbits_under_H << endl;
591 }
592
593 Point_orbits_under_H->init(P->T->A, H_gens, TRUE /*f_load_save*/,
595 verbose_level);
596
597 if (f_v) {
598 cout << "packing_was::compute_H_orbits_on_points before Point_orbits_under_H->create_latex_report" << endl;
599 }
601 if (f_v) {
602 cout << "packing_was::compute_H_orbits_on_points after Point_orbits_under_H->create_latex_report" << endl;
603 }
604
605 if (f_v) {
606 cout << "packing_was::compute_H_orbits_on_points done" << endl;
607 }
608}
609
611// computes the orbits of N on points
612// and writes to file prefix_point_orbits
613{
614 int f_v = (verbose_level >= 1);
615
616 if (f_v) {
617 cout << "packing_was::compute_N_orbits_on_points" << endl;
618 }
619
620
622
623 if (f_v) {
624 cout << "packing_was::compute_N_orbits_on_points "
625 "prefix_point_orbits_under_N=" << prefix_point_orbits_under_N << endl;
626 }
627
628 Point_orbits_under_N->init(P->T->A, N_gens, TRUE /*f_load_save*/,
630 verbose_level);
631
632 if (f_v) {
633 cout << "packing_was::compute_N_orbits_on_points before Point_orbits_under_N->create_latex_report" << endl;
634 }
636 if (f_v) {
637 cout << "packing_was::compute_N_orbits_on_points after Point_orbits_under_N->create_latex_report" << endl;
638 }
639
640 if (f_v) {
641 cout << "packing_was::compute_N_orbits_on_points done" << endl;
642 }
643}
644
645
646
648// computes the orbits of H on lines (NOT on spreads!)
649// and writes to file prefix_line_orbits
650{
651 int f_v = (verbose_level >= 1);
652
653 if (f_v) {
654 cout << "packing_was::compute_H_orbits_on_lines" << endl;
655 }
656
657
659
660 if (f_v) {
661 cout << "packing_was::compute_H_orbits_on_lines "
662 "prefix_line_orbits_under_H=" << prefix_line_orbits_under_H << endl;
663 }
664
665 Line_orbits_under_H->init(P->T->A2, H_gens, TRUE /*f_load_save*/,
667 verbose_level);
668
669 if (f_v) {
670 cout << "packing_was::compute_H_orbits_on_lines before Line_orbits_under_H->create_latex_report" << endl;
671 }
673 if (f_v) {
674 cout << "packing_was::compute_H_orbits_on_lines after Line_orbits_under_H->create_latex_report" << endl;
675 }
676
677 if (f_v) {
678 cout << "packing_was::compute_H_orbits_on_lines done" << endl;
679 }
680}
681
683// computes the orbits of N on lines (NOT on spreads!)
684// and writes to file prefix_line_orbits
685{
686 int f_v = (verbose_level >= 1);
687
688 if (f_v) {
689 cout << "packing_was::compute_N_orbits_on_lines" << endl;
690 }
691
692
694
695 if (f_v) {
696 cout << "packing_was::compute_N_orbits_on_lines "
697 "prefix_line_orbits_under_N=" << prefix_line_orbits_under_N << endl;
698 }
699
700 Line_orbits_under_N->init(P->T->A2, N_gens, TRUE /*f_load_save*/,
702 verbose_level);
703
704 if (f_v) {
705 cout << "packing_was::compute_N_orbits_on_lines before Line_orbits_under_N->create_latex_report" << endl;
706 }
708 if (f_v) {
709 cout << "packing_was::compute_N_orbits_on_lines after Line_orbits_under_N->create_latex_report" << endl;
710 }
711
712 if (f_v) {
713 cout << "packing_was::compute_N_orbits_on_lines done" << endl;
714 }
715}
716
718// Spread_types[P->nb_spreads * (group_order + 1)]
719{
720 int f_v = (verbose_level >= 1);
721
722
723 if (f_v) {
724 cout << "packing_was::compute_spread_types_wrt_H" << endl;
725 }
730 P->spread_size,
732 H_goi,
733 verbose_level);
734 if (FALSE) {
735 cout << "The spread types are:" << endl;
736 Spread_type->report(cout, verbose_level);
737 }
738
739
740
741
743
744 if (f_v) {
745 cout << "packing_was::compute_spread_types_wrt_H done" << endl;
746 }
747}
748
750// computes the orbits of H on spreads (NOT on lines!)
751// and writes to file fname_orbits
752{
753 int f_v = (verbose_level >= 1);
755
756 if (f_v) {
757 cout << "packing_was::compute_H_orbits_on_spreads" << endl;
758 }
759
760
762
763
764
765 if (f_v) {
766 cout << "packing_was::compute_H_orbits_on_spreads before Spread_orbits_under_H->init" << endl;
767 }
769 H_gens,
770 TRUE /*f_load_save*/, prefix_spread_orbits,
771 verbose_level);
772 if (f_v) {
773 cout << "packing_was::compute_H_orbits_on_spreads after Spread_orbits_under_H->init" << endl;
774 }
775
776
777
778 if (f_v) {
779 cout << "packing_was::compute_H_orbits_on_lines before Spread_orbits_under_H->create_latex_report" << endl;
780 }
782 if (f_v) {
783 cout << "packing_was::compute_H_orbits_on_lines after Spread_orbits_under_H->create_latex_report" << endl;
784 }
785
786
787
788 if (f_v) {
789 cout << "packing_was::compute_H_orbits_on_spreads "
790 "creating action A_on_spread_orbits" << endl;
791 }
792
793
797 Spread_orbits_under_H->Sch /* H_orbits_on_spreads*/,
798 TRUE /*f_play_it_safe*/, 0 /* verbose_level */);
799
800 if (f_v) {
801 cout << "prime_at_a_time::compute_H_orbits_on_spreads "
802 "created action on orbits of degree "
803 << A_on_spread_orbits->degree << endl;
804 }
805
806 if (f_v) {
807 cout << "packing_was::compute_H_orbits_on_spreads "
808 "created action A_on_spread_orbits done" << endl;
809 }
810}
811
813{
814 int f_v = (verbose_level >= 1);
816
817 if (f_v) {
818 cout << "packing_was::test_orbits_on_spreads "
819 "We will now test "
820 "which of the " << Spread_orbits_under_H->Sch->nb_orbits
821 << " orbits are partial packings:" << endl;
822 }
823
824
825
826
827 if (Fio.file_size(fname_good_orbits.c_str()) > 0) {
828
829 if (f_v) {
830 cout << "packing_was::test_orbits_on_spreads file "
831 << fname_good_orbits << " exists, reading it" << endl;
832 }
833 int *M;
834 int m, n, i;
835
837 0 /* verbose_level */);
838
839 nb_good_orbits = m;
842 for (i = 0; i < m; i++) {
843 Good_orbit_idx[i] = M[i * 2 + 0];
844 Good_orbit_len[i] = M[i * 2 + 1];
845 }
846
847 }
848 else {
849
850
851 if (f_v) {
852 cout << "packing_was::test_orbits_on_spreads file "
854 << " does not exist, computing good orbits" << endl;
855 }
856
857 int orbit_idx;
858
859 nb_good_orbits = 0;
862 for (orbit_idx = 0;
863 orbit_idx < Spread_orbits_under_H->Sch->nb_orbits;
864 orbit_idx++) {
865
866
868 Spread_orbits_under_H->Sch, orbit_idx,
869 orb, 0 /* verbose_level*/)) {
870 Good_orbit_idx[nb_good_orbits] = orbit_idx;
874 }
875
876
877 }
878
879
880 if (f_v) {
881 cout << "packing_was::test_orbits_on_spreads "
882 "We found "
883 << nb_good_orbits << " orbits which are "
884 "partial packings" << endl;
885 }
886
887 long int *Vec[2];
888 const char *Col_labels[2] = {"Orbit_idx", "Orbit_len"};
889
890 Vec[0] = Good_orbit_idx;
891 Vec[1] = Good_orbit_len;
892
893
894 Fio.lint_vec_array_write_csv(2 /* nb_vecs */, Vec,
895 nb_good_orbits, fname_good_orbits, Col_labels);
896 cout << "Written file " << fname_good_orbits
897 << " of size " << Fio.file_size(fname_good_orbits.c_str()) << endl;
898 }
899
900
901 if (f_v) {
902 cout << "packing_was::test_orbits_on_spreads "
903 "We found "
904 << nb_good_orbits << " orbits which "
905 "are partial packings" << endl;
906 }
907
908
909 if (f_v) {
910 cout << "packing_was::test_orbits_on_spreads done" << endl;
911 }
912}
913
914void packing_was::reduce_spreads(int verbose_level)
915{
916 int f_v = (verbose_level >= 1);
918
919 if (f_v) {
920 cout << "packing_was::reduce_spreads " << endl;
921 }
922
923 int i, j, h, f, l, c;
924
925
926 nb_good_spreads = 0;
927 for (i = 0; i < nb_good_orbits; i++) {
928 j = Good_orbit_idx[i];
930 }
931
932 if (f_v) {
933 cout << "packing_was::reduce_spreads "
934 "nb_good_spreads = " << nb_good_spreads << endl;
935 }
936
938
939 c = 0;
940 for (i = 0; i < nb_good_orbits; i++) {
941 j = Good_orbit_idx[i];
944 for (h = 0; h < l; h++) {
946 }
947 }
948 if (c != nb_good_spreads) {
949 cout << "packing_was::reduce_spreads c != nb_good_spreads" << endl;
950 exit(1);
951 }
952
953
954
956
957 if (f_v) {
958 cout << "packing_was::reduce_spreads before "
959 "Spread_tables_reduced->init_reduced" << endl;
960 }
965 verbose_level - 2);
966 if (f_v) {
967 cout << "packing_was::reduce_spreads after "
968 "Spread_tables_reduced->init_reduced" << endl;
969 }
970
971 string fname_reduced_spread_original_idx;
973
974 fname_reduced_spread_original_idx.assign(P->path_to_spread_tables);
975
976 char str[1000];
977 sprintf(str, "reduced_spread_%d_original_idx", NT.i_power_j(P->F->q, 2));
978
979 fname_reduced_spread_original_idx.append(str);
980 fname_reduced_spread_original_idx.append(".csv");
981
982 if (f_v) {
983 cout << "packing_was::reduce_spreads fname_original_idx = " << fname_reduced_spread_original_idx << endl;
984 }
985 Fio.int_matrix_write_csv(fname_reduced_spread_original_idx, good_spreads, nb_good_spreads, 1);
986
987 if (f_v) {
988 cout << "packing_was::reduce_spreads before "
989 "Spread_tables_reduced->save" << endl;
990 }
991 Spread_tables_reduced->save(verbose_level);
992 if (f_v) {
993 cout << "packing_was::reduce_spreads after "
994 "Spread_tables_reduced->save" << endl;
995 }
996
997 if (f_v) {
998 cout << "packing_was::reduce_spreads done" << endl;
999 }
1000
1001}
1002
1004// Spread_types[P->nb_spreads * (group_order + 1)]
1005{
1006 int f_v = (verbose_level >= 1);
1007
1008
1009 if (f_v) {
1010 cout << "packing_was::compute_reduced_spread_types_wrt_H" << endl;
1011 }
1016 P->spread_size,
1018 H_goi,
1019 verbose_level - 2);
1020
1021 if (FALSE) {
1022 cout << "The reduced spread types are:" << endl;
1023 Spread_type_reduced->report(cout, verbose_level);
1024 }
1025
1027
1028 if (f_v) {
1029 cout << "packing_was::compute_reduced_spread_types_wrt_H done" << endl;
1030 }
1031}
1032
1033
1035{
1036 int f_v = (verbose_level >= 1);
1038
1039 if (f_v) {
1040 cout << "packing_was::compute_H_orbits_on_reduced_spreads" << endl;
1041 }
1042
1043 if (f_v) {
1044 cout << "packing_was::compute_H_orbits_on_reduced_spreads "
1045 "creating action A_on_reduced_spreads" << endl;
1046 }
1050 0 /* verbose_level */);
1051
1052 if (f_v) {
1053 cout << "packing_was::compute_H_orbits_on_reduced_spreads "
1054 "creating action A_on_reduced_spreads done" << endl;
1055 cout << "A_on_reduced_spreads->degree = " << A_on_reduced_spreads->degree << endl;
1056 }
1057
1058
1059
1060 if (f_v) {
1061 cout << "H_gens in action on reduced spreads:" << endl;
1063 }
1064
1065#if 0
1066 if (f_v) {
1067 cout << "N_gens in action on reduced spreads:" << endl;
1069 }
1070#endif
1071
1072
1074
1075
1076
1077
1078
1079 if (f_v) {
1080 cout << "packing_was::compute_H_orbits_on_reduced_spreads "
1081 "before reduced_spread_orbits_under_H->init" << endl;
1082 }
1084 H_gens, TRUE /*f_load_save*/,
1086 verbose_level);
1087 if (f_v) {
1088 cout << "packing_was::compute_H_orbits_on_reduced_spreads "
1089 "after reduced_spread_orbits_under_H->init" << endl;
1090 }
1091
1092 if (f_v) {
1093 cout << "reduced_spread_orbits_under_H->Sch->nb_orbits = "
1095 }
1096
1097
1098
1099
1100 if (f_v) {
1101 cout << "packing_was::compute_H_orbits_on_lines before reduced_spread_orbits_under_H->create_latex_report" << endl;
1102 }
1104 if (f_v) {
1105 cout << "packing_was::compute_H_orbits_on_lines after reduced_spread_orbits_under_H->create_latex_report" << endl;
1106 }
1107
1108
1109
1110
1111
1113
1114 if (f_v) {
1115 cout << "packing_was::compute_H_orbits_on_reduced_spreads "
1116 "creating action A_on_reduced_spread_orbits" << endl;
1117 }
1118
1119
1122 reduced_spread_orbits_under_H->Sch /* H_orbits_on_spreads*/,
1123 TRUE /*f_play_it_safe*/, 0 /* verbose_level */);
1124
1125 if (f_v) {
1126 cout << "prime_at_a_time::compute_H_orbits_on_reduced_spreads "
1127 "created action on orbits of degree "
1129 }
1130
1131 if (f_v) {
1132 cout << "packing_was::compute_H_orbits_on_reduced_spreads "
1133 "created action A_on_reduced_spread_orbits done" << endl;
1134 }
1135}
1136
1137actions::action *packing_was::restricted_action(int orbit_length, int verbose_level)
1138{
1139 int f_v = (verbose_level >= 1);
1140 int orbit_idx;
1141 actions::action *Ar;
1142
1143 if (f_v) {
1144 cout << "packing_was::restricted_action" << endl;
1145 }
1146
1147 orbit_idx = find_orbits_of_length_in_reduced_spread_table(orbit_length);
1148 if (orbit_idx == -1) {
1149 cout << "packing_was::restricted_action "
1150 "we don't have any orbits of length " << orbit_length << endl;
1151 exit(1);
1152 }
1153 if (f_v) {
1154 cout << "orbit_idx = " << orbit_idx << endl;
1155 cout << "Number of orbits of length " << orbit_length << " is "
1157 }
1159 NULL,
1162 FALSE /* f_induce_action */,
1163 verbose_level);
1164
1165 if (f_v) {
1166 cout << "packing_was::restricted_action done" << endl;
1167 }
1168 return Ar;
1169}
1170
1172 long int *set1, int len1, long int *set2, int len2,
1173 int verbose_level)
1174// tests if every spread from set1
1175// is line-disjoint from every spread from set2
1176// using Spread_tables_reduced
1177{
1178 int f_v = FALSE; // (verbose_level >= 1);
1179
1180 if (f_v) {
1181 cout << "packing_was::test_if_pair_of_sets_of_reduced_spreads_are_adjacent" << endl;
1182 }
1184 set1, len1,
1185 set2, len2,
1186 verbose_level);
1187}
1188
1190 std::string &fname,
1191 int orbit_length,
1192 int f_has_user_data, long int *user_data, int user_data_size,
1193 int verbose_level)
1194{
1195 int f_v = (verbose_level >= 1);
1196
1197 if (f_v) {
1198 cout << "packing_was::create_graph_and_save_to_file orbit_length = " << orbit_length << endl;
1199 }
1200
1202 int type_idx;
1203
1204 if (f_v) {
1205 cout << "packing_was::create_graph_and_save_to_file before "
1206 "create_graph_on_orbits_of_a_certain_length" << endl;
1207 }
1209 CG,
1210 fname,
1211 orbit_length,
1212 type_idx,
1213 f_has_user_data, user_data, user_data_size,
1214 FALSE /* f_has_colors */, 1 /* nb_colors */, NULL /* color_table */,
1215 packing_was_set_of_reduced_spreads_adjacency_test_function,
1216 this /* void *test_function_data */,
1217 verbose_level - 3);
1218
1219 if (f_v) {
1220 cout << "packing_was::create_graph_and_save_to_file after "
1221 "create_graph_on_orbits_of_a_certain_length" << endl;
1222 }
1223
1224 CG->save(fname, verbose_level);
1225
1226 FREE_OBJECT(CG);
1227
1228 if (f_v) {
1229 cout << "packing_was::create_graph_and_save_to_file done" << endl;
1230 }
1231}
1232
1234 std::string &orbit_lengths_text,
1235 int f_has_user_data, long int *user_data, int user_data_size,
1236 int verbose_level)
1237{
1238 int f_v = (verbose_level >= 1);
1239
1240 if (f_v) {
1241 cout << "packing_was::create_graph_on_mixed_orbits_and_save_to_file orbit_lengths_text = " << orbit_lengths_text << endl;
1242 }
1243 int *Orbit_lengths;
1244 int nb_orbit_lengths;
1245
1246 Int_vec_scan(orbit_lengths_text, Orbit_lengths, nb_orbit_lengths);
1247 if (f_v) {
1248 cout << "packing_was::create_graph_on_mixed_orbits_and_save_to_file orbit_lengths: ";
1249 Int_vec_print(cout, Orbit_lengths, nb_orbit_lengths);
1250 cout << endl;
1251 }
1252
1254 int *Type_idx;
1255 string fname;
1256
1257 Type_idx = NEW_int(nb_orbit_lengths);
1258
1259 fname.assign(H_LG->label);
1260 fname.append("_spread_orbits_graph.bin");
1261 if (f_v) {
1262 cout << "packing_was::create_graph_on_mixed_orbits_and_save_to_file before "
1263 "create_weighted_graph_on_orbits" << endl;
1264 }
1266 CG,
1267 fname,
1268 Orbit_lengths,
1269 nb_orbit_lengths,
1270 Type_idx,
1271 f_has_user_data, user_data, user_data_size,
1272 packing_was_set_of_reduced_spreads_adjacency_test_function,
1273 this /* void *test_function_data */,
1275 verbose_level);
1276
1277 if (f_v) {
1278 cout << "packing_was::create_graph_on_mixed_orbits_and_save_to_file after "
1279 "create_weighted_graph_on_orbits" << endl;
1280 }
1281
1282
1283 if (f_v) {
1284 cout << "packing_was::create_graph_on_mixed_orbits_and_save_to_file Type_idx: ";
1285 Int_vec_print(cout, Type_idx, nb_orbit_lengths);
1286 cout << endl;
1287 }
1288
1289 CG->save(fname, verbose_level);
1290
1291 int i;
1292
1293 for (i = 0; i < nb_orbit_lengths; i++) {
1294
1295 if (f_v) {
1296 cout << "packing_was::create_graph_on_mixed_orbits_and_save_to_file "
1297 "i=" << i << endl;
1298 }
1299
1300 actions::action *Ari;
1301 char str[1000];
1302 string fname1;
1303 string label;
1304
1305 sprintf(str, "_on_spread_orbits_%d", i);
1306
1307 Ari = restricted_action(Orbit_lengths[i], verbose_level);
1308
1309 fname1.assign(N_LG->label);
1310 fname1.append(str);
1311 fname1.append(".makefile");
1312
1313 label.assign(N_LG->label);
1314 label.append(str);
1315
1316 if (f_v) {
1317 cout << "packing_was::create_graph_on_mixed_orbits_and_save_to_file "
1318 "before A_on_mixed_orbits->export_to_orbiter" << endl;
1319 }
1320 Ari->export_to_orbiter(fname1, label, N_LG->Strong_gens, verbose_level);
1321 if (f_v) {
1322 cout << "packing_was::create_graph_on_mixed_orbits_and_save_to_file "
1323 "after A_on_mixed_orbits->export_to_orbiter" << endl;
1324 }
1325
1326 }
1327
1328#if 0
1329 action *A_on_mixed_orbits;
1330
1331 A_on_mixed_orbits = NEW_OBJECT(action);
1332
1333 if (f_v) {
1334 cout << "packing_was::create_graph_on_mixed_orbits_and_save_to_file "
1335 "before creating A_on_mixed_orbits" << endl;
1336 }
1337 A_on_mixed_orbits = A_on_reduced_spreads->restricted_action(CG->points, CG->nb_points,
1338 verbose_level);
1339 if (f_v) {
1340 cout << "packing_was::create_graph_on_mixed_orbits_and_save_to_file "
1341 "after creating A_on_mixed_orbits" << endl;
1342 }
1343
1344
1345
1346
1347
1348 FREE_OBJECT(A_on_mixed_orbits);
1349#endif
1350
1351
1352 FREE_OBJECT(CG);
1353 FREE_int(Type_idx);
1354
1355 if (f_v) {
1356 cout << "packing_was::create_graph_on_mixed_orbits_and_save_to_file done" << endl;
1357 }
1358}
1359
1360
1362{
1364}
1365
1366
1367
1368
1369
1371{
1372 int f_v = (verbose_level >= 1);
1373
1374 if (f_v) {
1375 cout << "packing_was::compute_orbit_invariant_on_classified_orbits" << endl;
1376 }
1377
1378 if (f_v) {
1379 cout << "packing_was::compute_orbit_invariant_on_classified_orbits "
1380 "before reduced_spread_orbits_under_H->compute_orbit_invariant_after_classification" << endl;
1381 }
1384 packing_was_evaluate_orbit_invariant_function,
1385 this /* evaluate_data */,
1386 verbose_level - 3);
1387 if (f_v) {
1388 cout << "packing_was::compute_orbit_invariant_on_classified_orbits "
1389 "after reduced_spread_orbits_under_H->compute_orbit_invariant_after_classification" << endl;
1390 }
1391
1392 if (f_v) {
1393 cout << "packing_was::compute_orbit_invariant_on_classified_orbits done" << endl;
1394 }
1395}
1396
1398 int i, int j, int verbose_level)
1399{
1400 int f_v = (verbose_level >= 1);
1401
1402 if (f_v) {
1403 cout << "packing_was::evaluate_orbit_invariant_function "
1404 "i=" << i << " j=" << j << " a=" << a << endl;
1405 }
1406 int val = 0;
1407 int f, l, h, spread_idx, type_value;
1408
1409 // we are computing the orbit invariant of orbit a in
1410 // orbits_on_something *reduced_spread_orbits_under_H;
1411 // based on
1412 // orbit_type_repository *Spread_type_reduced;
1413
1416 for (h = 0; h < l; h++) {
1417 spread_idx = reduced_spread_orbits_under_H->Sch->orbit[f + h];
1418 type_value = Spread_type_reduced->type[spread_idx];
1419 if (h == 0) {
1420 val = type_value;
1421 }
1422 else {
1423 if (type_value != val) {
1424 cout << "packing_was::evaluate_orbit_invariant_function "
1425 "the invariant is not invariant on the orbit" << endl;
1426 exit(1);
1427 }
1428 }
1429 }
1430
1431 if (f_v) {
1432 cout << "packing_was::evaluate_orbit_invariant_function "
1433 "i=" << i << " j=" << j << " a=" << a << " val=" << val << endl;
1434 }
1435 if (f_v) {
1436 cout << "packing_was::evaluate_orbit_invariant_function done" << endl;
1437 }
1438 return val;
1439}
1440
1442{
1443 int f_v = (verbose_level >= 1);
1444
1445 if (f_v) {
1446 cout << "packing_was::classify_orbit_invariant" << endl;
1447 }
1448 int i;
1449
1450 if (f_v) {
1451 cout << "packing_was::classify_orbit_invariant before "
1452 "Classify_spread_invariant_by_orbit_length[i].init" << endl;
1453 }
1456
1457 for (i = 0; i < nb_sets; i++) {
1460 }
1461 if (f_v) {
1462 cout << "packing_was::classify_orbit_invariant after "
1463 "Classify_spread_invariant_by_orbit_length[i].init" << endl;
1464 }
1465
1466 if (f_v) {
1467 cout << "packing_was::classify_orbit_invariant done" << endl;
1468 }
1469}
1470
1472{
1473 int i, j, h, f, l, len, fst, u;
1474 long int a, b, e, e_idx;
1475 int basis_external_line[12];
1476 int basis_external_line2[12];
1477
1478 ost << "Spread types by orbits of given length:\\\\" << endl;
1479 for (i = 0; i < Orbit_invariant->nb_sets; i++) {
1480 ost << "Orbits of length " <<
1482 << " have the following spread type:\\\\" << endl;
1483
1484 //Classify_spread_invariant_by_orbit_length[i].print(FALSE);
1485 for (h = 0; h < Classify_spread_invariant_by_orbit_length[i].nb_types; h++) {
1489 ost << "Spread type " << a << " = \\\\";
1490 ost << "$$" << endl;
1495 ost << "$$" << endl;
1496 ost << "appears " << l << " times.\\\\" << endl;
1497 }
1500
1501
1502 int B[] = {
1503 1,0,0,0,0,0,
1504 0,0,0,2,0,0,
1505 1,3,0,0,0,0,
1506 0,0,0,1,3,0,
1507 1,0,2,0,0,0,
1508 0,0,0,2,0,4,
1509 };
1510 //int Bv[36];
1511 int Pair[4];
1512
1513
1514 //P->F->matrix_inverse(B, Bv, 6, 0 /* verbose_level */);
1515
1519
1521 Fq3->finite_field_init(NT.i_power_j(P->F->q, 3), FALSE /* f_without_tables */, 0);
1522
1523 ost << "Orbits of length one:\\\\" << endl;
1524 for (j = 0; j < l; j++) {
1528 for (h = 0; h < len; h++) {
1530 // b the the index into Spread_tables_reduced
1532 e = Regular_packing->External_lines[e_idx];
1533 P->T->Klein->P5->unrank_line(basis_external_line, e);
1534 ost << "Short orbit " << j << " / " << l << " is orbit "
1535 << a << " is spread " << b << " is external line "
1536 << e << " is:\\\\" << endl;
1537 ost << "$$" << endl;
1538 P->F->print_matrix_latex(ost, basis_external_line, 2, 6);
1539
1540 P->F->Linear_algebra->mult_matrix_matrix(basis_external_line,
1541 B, basis_external_line2,
1542 2, 6, 6, 0 /* verbose_level*/);
1543 ost << "\\hat{=}" << endl;
1544 P->F->print_matrix_latex(ost, basis_external_line2, 2, 6);
1545
1547
1548 for (u = 0; u < 4; u++) {
1549 Pair[u] = Gg.AG_element_rank(P->F->q,
1550 basis_external_line2 + u * 3, 1, 3);
1551 }
1552 ost << "\\hat{=}" << endl;
1553 ost << "\\left[" << endl;
1554 L.print_integer_matrix_tex(ost, Pair, 2, 2);
1555 ost << "\\right]" << endl;
1556
1557 ost << "\\hat{=}" << endl;
1558 Fq3->print_matrix_latex(ost, Pair, 2, 2);
1559 ost << "$$" << endl;
1560 }
1561 }
1562 FREE_OBJECT(Fq3);
1563
1564 }
1565 }
1566
1567}
1568
1569void packing_was::report2(std::ostream &ost, int verbose_level)
1570{
1571 ost << "\\section{Fixed Objects of $H$}" << endl;
1572 ost << endl;
1574 ost,
1575 P->P3,
1576 0 /* verbose_level */);
1577 ost << endl;
1578
1579 ost << "\\clearpage" << endl;
1580 ost << "\\section{Line Orbits of $H$}" << endl;
1581 ost << endl;
1582 //Line_orbits_under_H->report_orbit_lengths(ost);
1583 report_line_orbits_under_H(ost, verbose_level);
1584 ost << endl;
1585
1586 ost << "\\clearpage" << endl;
1587 ost << "\\section{Spread Orbits of $H$}" << endl;
1588 ost << endl;
1590 ost << endl;
1591
1592 ost << "\\clearpage" << endl;
1593 ost << "\\section{Spread Types}" << endl;
1594 Spread_type->report(ost, verbose_level);
1595 ost << endl;
1596
1597 ost << "\\clearpage" << endl;
1598 ost << "\\section{Reduced Spread Orbits of $H$}" << endl;
1599 ost << endl;
1601 ost << endl;
1602
1603
1604 ost << "\\clearpage" << endl;
1605 ost << "\\section{Reduced Spread Types}" << endl;
1606 Spread_type_reduced->report(ost, verbose_level);
1607 ost << endl;
1608
1609 ost << "\\clearpage" << endl;
1610 ost << "\\section{Reduced Spread Orbits under $H$}" << endl;
1612 ost << endl;
1613
1614
1615 int f_original_spread_numbers = TRUE;
1616
1617 report_reduced_spread_orbits(ost, f_original_spread_numbers, verbose_level);
1618
1619#if 0
1620 f_original_spread_numbers = FALSE;
1621
1622 report_reduced_spread_orbits(ost, f_original_spread_numbers, verbose_level);
1623#endif
1624
1625 ost << "\\clearpage" << endl;
1626 ost << "\\section{Reduced Spread Orbits: Spread invariant}" << endl;
1628 ost << endl;
1629
1630 if (Descr->f_N) {
1631 ost << "\\clearpage" << endl;
1632 ost << "\\section{The Group $N$}" << endl;
1633 ost << "The Group $N$ has order " << N_goi << "\\\\" << endl;
1635
1636 ost << endl;
1637
1638 }
1639}
1640
1641void packing_was::report(int verbose_level)
1642{
1644
1645 {
1646 char fname[1000];
1647 char title[1000];
1648 char author[1000];
1649 //int f_with_stabilizers = TRUE;
1650
1651 sprintf(title, "Packings in PG(3,%d) ", P->q);
1652 sprintf(author, "Orbiter");
1653 sprintf(fname, "Packings_q%d.tex", P->q);
1654
1655 {
1656 ofstream fp(fname);
1658
1659 //latex_head_easy(fp);
1660 L.head(fp,
1661 FALSE /* f_book */,
1662 TRUE /* f_title */,
1663 title, author,
1664 FALSE /*f_toc */,
1665 FALSE /* f_landscape */,
1666 FALSE /* f_12pt */,
1667 TRUE /*f_enlarged_page */,
1668 TRUE /* f_pagenumbers*/,
1669 NULL /* extra_praeamble */);
1670
1671 fp << "\\section{The field of order " << P->q << "}" << endl;
1672 fp << "\\noindent The field ${\\mathbb F}_{"
1673 << P->q
1674 << "}$ :\\\\" << endl;
1675 P->F->cheat_sheet(fp, verbose_level);
1676
1677#if 0
1678 fp << "\\section{The space PG$(3, " << q << ")$}" << endl;
1679
1680 fp << "The points in the plane PG$(2, " << q << ")$:\\\\" << endl;
1681
1682 fp << "\\bigskip" << endl;
1683
1684
1685 Gen->P->cheat_sheet_points(fp, 0 /*verbose_level*/);
1686
1687 fp << endl;
1688 fp << "\\section{Poset Classification}" << endl;
1689 fp << endl;
1690#endif
1691 fp << "\\section{The Group $H$}" << endl;
1693
1694 report2(fp, verbose_level);
1695
1696 L.foot(fp);
1697 }
1698 cout << "Written file " << fname << " of size "
1699 << Fio.file_size(fname) << endl;
1700 }
1701
1702}
1703
1704void packing_was::report_line_orbits_under_H(std::ostream &ost, int verbose_level)
1705{
1707 ost << endl;
1708
1709
1710 //Line_orbits_under_H->report_classified_orbits_by_lengths(ost);
1711 int i, j, h;
1712 long int a, b;
1714
1715
1716
1717
1718 ost << "\\bigskip" << endl;
1719 ost << "\\noindent" << endl;
1720
1721 for (i = 0; i < Line_orbits_under_H->Orbits_classified->nb_sets; i++) {
1722 ost << "Set " << i << " has size " << Line_orbits_under_H->Orbits_classified->Set_size[i] << "\\\\" << endl;
1723
1724 for (j = 0; j < Line_orbits_under_H->Orbits_classified->Set_size[i]; j++) {
1726 ost << "Line orbit " << a << " is:\\\\" << endl;
1727
1728
1729 std::vector<int> Orb;
1730
1731
1733 a /* orbit_idx */, 0 /* verbose_level */);
1734
1735 for (h = 0; h < Orb.size(); h++) {
1736 ost << Orb[h];
1737 if (h < Orb.size() - 1) {
1738 ost << ", ";
1739 }
1740 }
1741 ost << "\\\\" << endl;
1742 ost << "The orbit consists of the following lines:\\\\" << endl;
1743 for (h = 0; h < Orb.size(); h++) {
1744 b = Orb[h];
1745 ost << "$";
1747 ost << "_{" << b << "}";
1748 ost << "$";
1749 if (i < Orb.size() - 1) {
1750 ost << ", ";
1751 }
1752 }
1753 ost << "\\\\" << endl;
1754 }
1755 }
1756
1757}
1758
1760 int &nb_orbits, int &orbit_length,
1761 long int *&orbit_idx,
1762 long int *&spreads_in_reduced_orbits_by_type,
1763 int f_original_spread_numbers,
1764 int verbose_level)
1765{
1766 int f_v = (verbose_level >= 1);
1767 int j, h;
1768 long int a, b, c;
1769 long int nb_spreads;
1770
1771 if (f_v) {
1772 cout << "packing_was::get_spreads_in_reduced_orbits_by_type" << endl;
1773 }
1774 nb_spreads = 0;
1775
1777
1778 orbit_idx = NEW_lint(nb_orbits);
1779
1780 orbit_length = -1;
1781 for (j = 0; j < nb_orbits; j++) {
1783
1784 orbit_idx[j] = a;
1785 std::vector<int> Orb;
1786
1788 a /* orbit_idx */, 0 /* verbose_level */);
1789
1790 if (orbit_length == -1) {
1791 orbit_length = Orb.size();
1792 }
1793 else if (orbit_length != Orb.size()) {
1794 cout << "we have orbits of different lengths" << endl;
1795 exit(1);
1796 }
1797 }
1798
1799 nb_spreads = nb_orbits * orbit_length;
1800
1801 cout << "Type " << type_idx << " has " << nb_spreads << " spreads:\\\\" << endl;
1802
1803 spreads_in_reduced_orbits_by_type = NEW_lint(nb_spreads);
1804 orbiter_kernel_system::Orbiter->Lint_vec->zero(spreads_in_reduced_orbits_by_type, nb_spreads);
1805
1806
1807
1808 for (j = 0; j < nb_orbits; j++) {
1810
1811 std::vector<int> Orb;
1812
1813
1815 a /* orbit_idx */, 0 /* verbose_level */);
1816
1817 for (h = 0; h < Orb.size(); h++) {
1818
1819 b = Orb[h];
1820
1821 if (f_original_spread_numbers) {
1822 c = good_spreads[b];
1823 }
1824 else {
1825 c = b;
1826 }
1827 spreads_in_reduced_orbits_by_type[j * orbit_length + h] = c;
1828 }
1829 }
1830
1831
1832 //FREE_lint(spreads_in_reduced_orbits_by_type);
1833
1834}
1835
1836
1837void packing_was::export_reduced_spread_orbits_csv(std::string &fname_base, int f_original_spread_numbers, int verbose_level)
1838{
1839 int f_v = (verbose_level >= 1);
1840 //ost << "\\bigskip" << endl;
1841 //ost << "\\noindent" << endl;
1842
1843 if (f_v) {
1844 cout << "packing_was::export_reduced_spread_orbits_csv" << endl;
1845 }
1846 //reduced_spread_orbits_under_H->report_classified_orbits_by_lengths(ost);
1848 int type_idx;
1849 string fname;
1850
1851
1852 for (type_idx = 0; type_idx < reduced_spread_orbits_under_H->Orbits_classified->nb_sets; type_idx++) {
1853
1854 char str[1000];
1856
1857
1858 int nb_orbits;
1859 int orbit_length;
1860 long int *orbit_idx;
1861 long int *spreads_in_reduced_orbits_by_type;
1862
1864 nb_orbits, orbit_length,
1865 orbit_idx,
1866 spreads_in_reduced_orbits_by_type,
1867 f_original_spread_numbers,
1868 verbose_level);
1869
1870
1871 sprintf(str, "_of_length_%d", orbit_length);
1872
1873 fname.assign(fname_base);
1874 fname.append("_reduced_spead_orbits");
1875 fname.append(str);
1876 fname.append(".csv");
1877
1878
1879 Fio.lint_matrix_write_csv(fname, spreads_in_reduced_orbits_by_type, nb_orbits, orbit_length);
1880
1881 cout << "Written file " << fname << " of size " << Fio.file_size(fname) << endl;
1882
1883 }
1884
1885}
1886
1887void packing_was::report_reduced_spread_orbits(std::ostream &ost, int f_original_spread_numbers, int verbose_level)
1888{
1889 //ost << "\\bigskip" << endl;
1890 //ost << "\\noindent" << endl;
1891
1892 //reduced_spread_orbits_under_H->report_classified_orbits_by_lengths(ost);
1894 int type_idx;
1895
1896
1897 for (type_idx = 0; type_idx < reduced_spread_orbits_under_H->Orbits_classified->nb_sets; type_idx++) {
1898
1899 int nb_orbits;
1900 int orbit_length;
1901 long int *orbit_idx;
1902 long int *spreads_in_reduced_orbits_by_type;
1903
1905 nb_orbits, orbit_length,
1906 orbit_idx,
1907 spreads_in_reduced_orbits_by_type,
1908 f_original_spread_numbers,
1909 verbose_level);
1910
1911 ost << "Type " << type_idx << " has " << nb_orbits
1912 << " orbits of length " << orbit_length << ":\\\\" << endl;
1913#if 0
1914 int j;
1915 int nb_orbits1 = 5;
1916
1917 if (nb_orbits > 100) {
1918
1919 ost << "Too many to list, listing only the first " << nb_orbits1 << ":\\\\" << endl;
1920 }
1921 else {
1922 nb_orbits1 = nb_orbits;
1923 }
1924
1925 for (j = 0; j < nb_orbits1; j++) {
1926 ost << j << " : " << orbit_idx[j] << " : ";
1927 Orbiter->Lint_vec.print(ost, spreads_in_reduced_orbits_by_type + j * orbit_length, orbit_length);
1928 ost << "\\\\" << endl;
1929 if (j && (j % 40) == 0) {
1930 ost << endl;
1931 ost << "\\clearpage" << endl;
1932 ost << endl;
1933 }
1934 }
1935 ost << "\\clearpage" << endl;
1936#endif
1937
1938 }
1939
1940#if 0
1941 int i, j, h;
1942 long int a, b;
1943 long int *spreads_in_reduced_orbits;
1944 int nb_spreads, spread_cnt;
1945 int orbit_length;
1946 spreads_in_reduced_orbits = NEW_lint(nb_spreads * orbit_length);
1947 lint_vec_zero(spreads_in_reduced_orbits, nb_spreads * orbit_length);
1948
1949
1950 spread_cnt = 0;
1951
1953
1954 ost << "Set " << i << " has size " << reduced_spread_orbits_under_H->Orbits_classified->Set_size[i] << "\\\\" << endl;
1955
1956 for (j = 0; j < reduced_spread_orbits_under_H->Orbits_classified->Set_size[i]; j++, spread_cnt++) {
1958 ost << "Spread orbit " << a << " is:\\\\" << endl;
1959
1960
1961 std::vector<int> Orb;
1962
1963
1965 a /* orbit_idx */, 0 /* verbose_level */);
1966
1967 for (h = 0; h < Orb.size(); h++) {
1968 spreads_in_reduced_orbits[spread_cnt * orbit_length + h] = Orb[h];
1969 }
1970
1971 for (h = 0; h < Orb.size(); h++) {
1972 ost << Orb[h];
1973 if (h < Orb.size() - 1) {
1974 ost << ", ";
1975 }
1976 }
1977 ost << "\\\\" << endl;
1978 }
1979 }
1980
1981 ost << "Table of spreads in reduced orbits:\\\\" << endl;
1982 ost << "$$" << endl;
1983 L.lint_matrix_print_tex(ost, spreads_in_reduced_orbits, nb_spreads, orbit_length);
1984 ost << "$$" << endl;
1985
1986 tally T1;
1987
1988 T1.init_lint(spreads_in_reduced_orbits, nb_spreads * orbit_length, FALSE, 0);
1989
1990 ost << "$$" << endl;
1991 T1.print_naked_tex(ost, TRUE /* f_backwards */);
1992 ost << "$$" << endl;
1993
1994#if 0
1995 ost << "$$" << endl;
1996 T1.print_array_tex(ost, TRUE /* f_backwards */);
1997 ost << "$$" << endl;
1998#endif
1999
2000 int *lines_in_spreads;
2001
2002
2003 lines_in_spreads = NEW_int(nb_spreads * orbit_length * Spread_tables_reduced->spread_size);
2004 for (i = 0; i < nb_spreads * orbit_length; i++) {
2005 a = spreads_in_reduced_orbits[i];
2006 for (j = 0; j < Spread_tables_reduced->spread_size; j++) {
2008 lines_in_spreads[i * Spread_tables_reduced->spread_size + j] = b;
2009 }
2010 }
2011
2012 tally T2;
2013
2014 T2.init(lines_in_spreads,
2015 nb_spreads * orbit_length * Spread_tables_reduced->spread_size,
2016 FALSE, 0);
2017
2018 ost << "Frequencies of lines appearing in spreads appearing in these orbits:\\\\" << endl;
2019 ost << "$$" << endl;
2020 T2.print_naked_tex(ost, TRUE /* f_backwards */);
2021 ost << "$$" << endl;
2022
2023 long int *spreads_in_reduced_orbits_with_original_labels;
2024
2025 spreads_in_reduced_orbits_with_original_labels = NEW_lint(nb_spreads * orbit_length);
2026 for (i = 0; i < nb_spreads * orbit_length; i++) {
2027 a = spreads_in_reduced_orbits[i];
2028 b = good_spreads[a];
2029 spreads_in_reduced_orbits_with_original_labels[i] = b;
2030 }
2031
2032 string fname_reduced_orbits;
2033
2034 if (Descr->f_output_path) {
2035 fname_reduced_orbits.assign(Descr->output_path);
2036 }
2037 else {
2038 fname_reduced_orbits.assign("");
2039 }
2040 fname_reduced_orbits.append(H_LG->label);
2041 if (Descr->f_problem_label) {
2042 fname_reduced_orbits.append(Descr->problem_label);
2043 }
2044 fname_reduced_orbits.append("_reduced_orbits.csv");
2045
2046 file_io Fio;
2047
2048 Fio.lint_matrix_write_csv(fname_reduced_orbits,
2049 spreads_in_reduced_orbits_with_original_labels,
2050 nb_spreads, orbit_length);
2051
2052 cout << "Written file " << fname_reduced_orbits << " of size " << Fio.file_size(fname_reduced_orbits) << endl;
2053
2054
2055
2056
2057 FREE_int(lines_in_spreads);
2058 FREE_lint(spreads_in_reduced_orbits);
2059 FREE_lint(spreads_in_reduced_orbits_with_original_labels);
2060
2061
2062 ost << "\\bigskip" << endl;
2063 ost << "\\noindent" << endl;
2064
2066 ost << "Set " << i << " has size " << reduced_spread_orbits_under_H->Orbits_classified->Set_size[i] << "\\\\" << endl;
2067
2068 for (j = 0; j < reduced_spread_orbits_under_H->Orbits_classified->Set_size[i]; j++) {
2070 ost << "Spread orbit " << a << " is:\\\\" << endl;
2071
2072
2073 std::vector<int> Orb;
2074
2075
2077 a /* orbit_idx */, 0 /* verbose_level */);
2078
2079 for (h = 0; h < Orb.size(); h++) {
2080 ost << Orb[h];
2081 if (h < Orb.size() - 1) {
2082 ost << ", ";
2083 }
2084 }
2085 ost << "\\\\" << endl;
2086 ost << "The orbit consists of the following spreads:\\\\" << endl;
2087 for (h = 0; h < Orb.size(); h++) {
2088 b = Orb[h];
2089 ost << "Spread " << b << " is:\\\\" << endl;
2091 ost << "\\\\" << endl;
2092 }
2093 }
2094 }
2095#endif
2096
2097}
2098
2100{
2101 long int i, a;
2102
2103 ost << "The number of good spreads is " << nb_good_spreads << "\\\\" << endl;
2104 ost << "The good spreads are:\\\\" << endl;
2105 for (i = 0; i < nb_good_spreads; i++) {
2106 a = good_spreads[i];
2107 ost << a;
2108 if (i < nb_good_spreads - 1) {
2109 ost << ", ";
2110 }
2111 if ((i % 100) == 0) {
2112 ost << "\\\\" << endl;
2113 }
2114 }
2115 ost << "\\ \\\\" << endl;
2116
2117}
2118
2119// #############################################################################
2120// global functions:
2121// #############################################################################
2122
2123
2124static int packing_was_set_of_reduced_spreads_adjacency_test_function(
2125 long int *set1, int len1,
2126 long int *set2, int len2, void *data)
2127{
2128 packing_was *P = (packing_was *) data;
2129
2131 set1, len1, set2, len2, 0 /*verbose_level*/);
2132}
2133
2134
2135
2136
2137static int packing_was_evaluate_orbit_invariant_function(int a, int i, int j,
2138 void *evaluate_data, int verbose_level)
2139{
2140 int f_v = FALSE; //(verbose_level >= 1);
2141 packing_was *P = (packing_was *) evaluate_data;
2142
2143 if (f_v) {
2144 cout << "packing_was_evaluate_orbit_invariant_function "
2145 "i=" << i << " j=" << j << " a=" << a << endl;
2146 }
2147 int val;
2148
2149 val = P->evaluate_orbit_invariant_function(a, i, j, 0 /*verbose_level*/);
2150
2151 if (f_v) {
2152 cout << "packing_was_evaluate_orbit_invariant_function "
2153 "i=" << i << " j=" << j << " a=" << a << " val=" << val << endl;
2154 }
2155 if (f_v) {
2156 cout << "packing_was_evaluate_orbit_invariant_function done" << endl;
2157 }
2158 return val;
2159}
2160
2161
2162static void packing_was_print_function(std::ostream &ost, long int a, void *data)
2163{
2164 packing_was *P = (packing_was *) data;
2165 induced_actions::action_on_grassmannian *AG = P->P->T->A2->G.AG;
2166
2167 int verbose_level = 0;
2168 int orbit_idx1, orbit_pos1;
2169 int orbit_idx2, orbit_pos2;
2170 int Mtx[4 * 4];
2171 long int b;
2172
2174 Mtx, a, 0 /*verbose_level*/);
2175
2176 b = AG->G->rank_lint_here(
2177 Mtx + 8, 0 /*verbose_level*/);
2178
2179 P->Line_orbits_under_H->get_orbit_number_and_position(a, orbit_idx1, orbit_pos1, verbose_level);
2180 P->Line_orbits_under_H->get_orbit_number_and_position(b, orbit_idx2, orbit_pos2, verbose_level);
2181 ost << "=(" << orbit_idx1 << "," << orbit_pos1 << ")" << endl;
2182 ost << "dual=";
2183 Int_vec_print(ost, Mtx + 8, 8);
2184 ost << "=(" << orbit_idx2 << "," << orbit_pos2 << ")" << endl;
2185}
2186
2187}}}
2188
2189
void print(std::ostream &ost, long int *v, int len)
Definition: lint_vec.cpp:246
functions related to strings and character arrays
a statistical analysis of data consisting of single integers
void init_lint(long int *data, int data_length, int f_second, int verbose_level)
Definition: tally.cpp:123
void print_matrix_latex(std::ostream &ost, int *A, int m, int n)
void cheat_sheet(std::ostream &f, int verbose_level)
void finite_field_init(int q, int f_without_tables, int verbose_level)
various functions related to geometries
Definition: geometry.h:721
long int AG_element_rank(int q, int *v, int stride, int len)
void unrank_lint_here_and_compute_perp(int *Mtx, long int rk, int verbose_level)
Definition: grassmann.cpp:979
long int rank_lint_here(int *Mtx, int verbose_level)
Definition: grassmann.cpp:275
void print_single_generator_matrix_tex(std::ostream &ost, long int a)
Definition: grassmann.cpp:122
tables with line-spreads in PG(3,q)
Definition: geometry.h:2335
void init_reduced(int nb_select, int *select, spread_tables *old_spread_table, std::string &path_to_spread_tables, int verbose_level)
int test_if_pair_of_sets_are_adjacent(long int *set1, int sz1, long int *set2, int sz2, int verbose_level)
void save(std::string &fname, int verbose_level)
void mult_matrix_matrix(int *A, int *B, int *C, int m, int n, int o, int verbose_level)
void int_matrix_write_csv(std::string &fname, int *M, int m, int n)
Definition: file_io.cpp:1300
void lint_matrix_write_csv(std::string &fname, long int *M, int m, int n)
Definition: file_io.cpp:1323
void int_matrix_read_csv(std::string &fname, int *&M, int &m, int &n, int verbose_level)
Definition: file_io.cpp:1477
void lint_vec_array_write_csv(int nb_vecs, long int **Vec, int len, std::string &fname, const char **column_label)
Definition: file_io.cpp:1270
void print_integer_matrix_tex(std::ostream &ost, int *p, int m, int n)
void head(std::ostream &ost, int f_book, int f_title, const char *title, const char *author, int f_toc, int f_landscape, int f_12pt, int f_enlarged_page, int f_pagenumbers, const char *extras_for_preamble)
void lint_matrix_print_tex(std::ostream &ost, long int *p, int m, int n)
a permutation group in a fixed action.
Definition: actions.h:99
action * restricted_action(long int *points, int nb_points, int verbose_level)
action * create_induced_action_on_sets(int nb_sets, int set_size, long int *sets, int verbose_level)
void induced_action_on_orbits(action *old_action, groups::schreier *Sch, int f_play_it_safe, int verbose_level)
void export_to_orbiter(std::string &fname, std::string &label, groups::strong_generators *SG, int verbose_level)
Definition: action_io.cpp:1011
action * create_induced_action_by_restriction(groups::sims *S, int size, long int *set, int f_induce, int verbose_level)
groups::matrix_group * get_matrix_group()
Definition: action.cpp:2986
A collection of invariants called orbit type associated with a system of sets. The orbit types are ba...
void init(groups::orbits_on_something *Oos, int nb_sets, int set_size, long int *Sets, long int goi, int verbose_level)
creates a linear group from command line arguments using linear_group_description
Definition: groups.h:244
void linear_group_init(linear_group_description *description, int verbose_level)
compute orbits of a group in a given action; allows file io
Definition: groups.h:492
void compute_orbit_invariant_after_classification(data_structures::set_of_sets *&Orbit_invariant, int(*evaluate_orbit_invariant_function)(int a, int i, int j, void *evaluate_data, int verbose_level), void *evaluate_data, int verbose_level)
void create_graph_on_orbits_of_a_certain_length(graph_theory::colored_graph *&CG, std::string &fname, int orbit_length, int &type_idx, int f_has_user_data, long int *user_data, int user_data_size, int f_has_colors, int number_colors, int *color_table, int(*test_function)(long int *orbit1, int orbit_length1, long int *orbit2, int orbit_length2, void *data), void *test_function_data, int verbose_level)
void report_type(std::ostream &ost, long int *orbit_type, long int goi)
void create_weighted_graph_on_orbits(graph_theory::colored_graph *&CG, std::string &fname, int *Orbit_lengths, int nb_orbit_lengths, int *&Type_idx, int f_has_user_data, long int *user_data, int user_data_size, int(*test_function)(long int *orbit1, int orbit_length1, long int *orbit2, int orbit_length2, void *data), void *test_function_data, data_structures::set_of_sets *my_orbits_classified, int verbose_level)
void init(actions::action *A, strong_generators *SG, int f_load_save, std::string &prefix, int verbose_level)
data_structures::set_of_sets * Orbits_classified
Definition: groups.h:506
void get_orbit_in_order(std::vector< int > &Orb, int orbit_idx, int verbose_level)
Definition: schreier.cpp:2134
void report_fixed_objects_in_P3(std::ostream &ost, geometry::projective_space *P3, int verbose_level)
void print_with_given_action(std::ostream &ost, actions::action *A2)
induced action on the grassmannian (subspaces of a fixed dimension of a vectors space)
void add_print_function(void(*print_function)(std::ostream &ost, long int a, void *data), void *print_function_data, int verbose_level)
classification of packings in PG(3,q)
Definition: packings.h:66
spreads::spread_table_with_selection * Spread_table_with_selection
Definition: packings.h:85
int test_if_orbit_is_partial_packing(groups::schreier *Orbits, int orbit_idx, long int *orbit1, int verbose_level)
command line description of tasks for packings with assumed symmetry
Definition: packings.h:402
construction of packings in PG(3,q) with assumed symmetry
Definition: packings.h:564
geometry::spread_tables * Spread_tables_reduced
Definition: packings.h:631
void report_reduced_spread_orbits(std::ostream &ost, int f_original_spread_numbers, int verbose_level)
void report_line_orbits_under_H(std::ostream &ost, int verbose_level)
groups::orbits_on_something * Point_orbits_under_H
Definition: packings.h:590
data_structures::set_of_sets * Orbit_invariant
Definition: packings.h:652
groups::orbits_on_something * reduced_spread_orbits_under_H
Definition: packings.h:645
groups::orbits_on_something * Spread_orbits_under_H
Definition: packings.h:611
groups::orbits_on_something * Point_orbits_under_N
Definition: packings.h:595
int evaluate_orbit_invariant_function(int a, int i, int j, int verbose_level)
void create_graph_and_save_to_file(std::string &fname, int orbit_length, int f_has_user_data, long int *user_data, int user_data_size, int verbose_level)
data_structures_groups::orbit_type_repository * Spread_type_reduced
Definition: packings.h:639
void compute_orbit_invariant_on_classified_orbits(int verbose_level)
void get_spreads_in_reduced_orbits_by_type(int type_idx, int &nb_orbits, int &orbit_length, long int *&orbit_idx, long int *&spreads_in_reduced_orbits_by_type, int f_original_spread_numbers, int verbose_level)
void create_graph_on_mixed_orbits_and_save_to_file(std::string &orbit_lengths_text, int f_has_user_data, long int *user_data, int user_data_size, int verbose_level)
int test_if_pair_of_sets_of_reduced_spreads_are_adjacent(long int *orbit1, int len1, long int *orbit2, int len2, int verbose_level)
void init(packing_was_description *Descr, packing_classify *P, int verbose_level)
void report2(std::ostream &ost, int verbose_level)
data_structures_groups::orbit_type_repository * Spread_type
Definition: packings.h:608
int find_orbits_of_length_in_reduced_spread_table(int orbit_length)
data_structures::tally * Classify_spread_invariant_by_orbit_length
Definition: packings.h:663
groups::orbits_on_something * Line_orbits_under_N
Definition: packings.h:604
groups::orbits_on_something * Line_orbits_under_H
Definition: packings.h:600
void export_reduced_spread_orbits_csv(std::string &fname_base, int f_original_spread_numbers, int verbose_level)
actions::action * restricted_action(int orbit_length, int verbose_level)
a regular packing as a partition of the Klein quadric into elliptic quadrics
Definition: packings.h:784
void init(packing_was *PW, int verbose_level)
geometry::klein_correspondence * Klein
Definition: spreads.h:161
#define Int_vec_scan(A, B, C)
Definition: foundations.h:716
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
#define NEW_OBJECTS(type, n)
Definition: foundations.h:639
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
the orbiter library for the classification of combinatorial objects
induced_actions::action_on_grassmannian * AG