Orbiter 2022
Combinatorial Objects
classify_double_sixes.cpp
Go to the documentation of this file.
1// classify_double_sixes.cpp
2//
3// Anton Betten
4//
5// October 10, 2017
6//
7// based on surface_classify_wedge.cpp started September 2, 2016
8//
9//
10//
11
12#include "orbiter.h"
13
14using namespace std;
15
16namespace orbiter {
17namespace layer5_applications {
18namespace applications_in_algebraic_geometry {
19namespace cubic_surfaces_and_double_sixes {
20
21
22static void callback_partial_ovoid_test_early(long int *S, int len,
23 long int *candidates, int nb_candidates,
24 long int *good_candidates, int &nb_good_candidates,
25 void *data, int verbose_level);
26
27
29{
30 null();
31}
32
34{
35 freeself();
36}
37
39{
40 q = 0;
41 F = NULL;
42 Surf_A = NULL;
43 Surf = NULL;
44
45 //LG = NULL;
46
47 A2 = NULL;
48 AW = NULL;
49 Elt0 = NULL;
50 Elt1 = NULL;
51 Elt2 = NULL;
52 Elt3 = NULL;
53 Elt4 = NULL;
54 Surf = NULL;
55 SG_line_stab = NULL;
56 Neighbors = NULL;
57 Neighbor_to_line = NULL;
58 Neighbor_to_klein = NULL;
59 //Line_to_neighbor = NULL;
60 Stab = NULL;
61 stab_gens = NULL;
62 orbit = NULL;
63 line_to_orbit = NULL;
64 orbit_to_line = NULL;
65 Pts_klein = NULL;
66 Pts_wedge = NULL;
67 Pts_wedge_to_line = NULL;
68 line_to_pts_wedge = NULL;
69 A_on_neighbors = NULL;
70 Control = NULL;
71 Poset = NULL;
72 Five_plus_one = NULL;
73 u = NULL;
74 v = NULL;
75 w = NULL;
76 u1 = NULL;
77 v1 = NULL;
78 len = 0;
79 Idx = NULL;
80 nb = 0;
81 Po = NULL;
82
84
85 Flag_orbits = NULL;
86
87 Double_sixes = NULL;
88
89}
90
92{
93 if (Elt0) {
95 }
96 if (Elt1) {
98 }
99 if (Elt2) {
100 FREE_int(Elt2);
101 }
102 if (Elt3) {
103 FREE_int(Elt3);
104 }
105 if (Elt4) {
106 FREE_int(Elt4);
107 }
108 if (Idx) {
109 FREE_int(Idx);
110 }
111 if (Po) {
112 FREE_int(Po);
113 }
116 }
117 if (Flag_orbits) {
119 }
120 if (Double_sixes) {
122 }
123 null();
124}
125
129 int verbose_level)
130{
131 int f_v = (verbose_level >= 1);
132
133 if (f_v) {
134 cout << "classify_double_sixes::init" << endl;
135 }
137 //classify_double_sixes::LG = LG;
138 F = Surf_A->PA->F;
139 q = F->q;
140 Surf = Surf_A->Surf;
141
142
143 u = NEW_int(6);
144 v = NEW_int(6);
145 w = NEW_int(6);
146 u1 = NEW_int(6);
147 v1 = NEW_int(6);
148
149
150
151 //A = LG->A_linear;
152 //A2 = LG->A2;
153 //A = Surf_A->PA->A;
154 A = Surf_A->A;
155 A2 = Surf_A->A_wedge;
156
158 cout << "classify_double_sixes::init group must "
159 "act in wedge action" << endl;
160 exit(1);
161 }
162
163 AW = A2->G.AW;
164
170
171 pt0_line = 0; // pt0 = the line spanned by 1000, 0100
172 // (we call it point because it is a point on the Klein quadric)
173 pt0_wedge = 0; // in wedge coordinates 100000
174 pt0_klein = 0; // in klein coordinates 100000
175
176
177 if (f_v) {
178 cout << "classify_double_sixes::init before "
179 "SG_line_stab->generators_for_parabolic_subgroup" << endl;
180 }
181
182
185 A->G.matrix_grp, 2, verbose_level - 1);
186
187 if (f_v) {
188 cout << "classify_double_sixes::init after "
189 "SG_line_stab->generators_for_parabolic_subgroup" << endl;
190 }
191
192
193
194 if (f_v) {
195 cout << "classify_double_sixes::init "
196 "before compute_neighbors" << endl;
197 }
198 compute_neighbors(verbose_level);
199 if (f_v) {
200 cout << "classify_double_sixes::init "
201 "after compute_neighbors" << endl;
202 }
203 {
205 if (f_v) {
206 cout << "classify_double_sixes::init "
207 "before make_spreadsheet_of_neighbors" << endl;
208 }
209 make_spreadsheet_of_neighbors(Sp, 0 /* verbose_level */);
210 if (f_v) {
211 cout << "classify_double_sixes::init "
212 "after make_spreadsheet_of_neighbors" << endl;
213 }
214 FREE_OBJECT(Sp);
215 }
216 if (f_v) {
217 cout << "classify_double_sixes::init "
218 "after compute_neighbors "
219 "nb_neighbors = " << nb_neighbors << endl;
220 cout << "Neighbors=";
222 cout << endl;
223 }
224
225
226
227
228
229 if (f_v) {
230 cout << "classify_double_sixes::init "
231 "computing restricted action on neighbors" << endl;
232 }
233
236 NULL,
238 FALSE /* f_induce_action */,
239 0 /* verbose_level */);
240
241 if (f_v) {
242 cout << "classify_double_sixes::init "
243 "restricted action on neighbors "
244 "has been computed" << endl;
245 }
246
247
251 verbose_level);
252
253 if (f_v) {
254 cout << "classify_double_sixes::init before "
255 "Poset->add_testing_without_group" << endl;
256 }
259 callback_partial_ovoid_test_early,
260 this /* void *data */,
261 verbose_level);
262
264 Control->depth = 5;
265
266
267 if (f_v) {
268 cout << "classify_double_sixes::init "
269 "before Five_plus_one->init" << endl;
270 }
272
274 5 /* sz */,
275 verbose_level - 1);
276 if (f_v) {
277 cout << "classify_double_sixes::init "
278 "after Five_plus_one->init" << endl;
279 }
280
281
282 //Five_plus_one->init_check_func(callback_partial_ovoid_test,
283 // (void *)this /* candidate_check_data */);
284
285
286 //Five_plus_one->f_print_function = TRUE;
287 //Five_plus_one->print_function = callback_print_set;
288 //Five_plus_one->print_function_data = (void *) this;
289
290
291 if (f_v) {
292 cout << "classify_double_sixes::init done" << endl;
293 }
294}
295
296
298{
299 int f_v = (verbose_level >= 1);
300 long int i, a, b, c;
302
303 if (f_v) {
304 cout << "classify_double_sixes::compute_neighbors" << endl;
305 }
306
307 nb_neighbors = (long int) (q + 1) * q * (q + 1);
308 if (f_v) {
309 cout << "classify_double_sixes::compute_neighbors "
310 "nb_neighbors = " << nb_neighbors << endl;
311 }
315
316 int sz;
317
318 // At first, we get the neighbors
319 // as points on the Klein quadric:
320 // Later, we will change them to wedge ranks:
321
322 if (f_v) {
323 cout << "classify_double_sixes::compute_neighbors "
324 "before Surf->O->perp" << endl;
325 }
326 Surf->O->perp(0, Neighbors, sz, 0 /*verbose_level - 3*/);
327 if (f_v) {
328 cout << "classify_double_sixes::compute_neighbors "
329 "after Surf->O->perp" << endl;
330
331 //cout << "Neighbors:" << endl;
332 //lint_matrix_print(Neighbors, (sz + 9) / 10, 10);
333 }
334
335 if (sz != nb_neighbors) {
336 cout << "classify_double_sixes::compute_neighbors "
337 "sz != nb_neighbors" << endl;
338 cout << "sz = " << sz << endl;
339 cout << "nb_neighbors = " << nb_neighbors << endl;
340 exit(1);
341 }
342 if (f_v) {
343 cout << "classify_double_sixes::compute_neighbors "
344 "nb_neighbors = " << nb_neighbors << endl;
345 }
346
347 if (f_v) {
348 cout << "classify_double_sixes::compute_neighbors "
349 "allocating Line_to_neighbor, "
350 "Surf->nb_lines_PG_3=" << Surf->nb_lines_PG_3 << endl;
351 }
352
353#if 0
354 Line_to_neighbor = NEW_lint(Surf->nb_lines_PG_3);
355 for (i = 0; i < Surf->nb_lines_PG_3; i++) {
356 Line_to_neighbor[i] = -1;
357 }
358#endif
359
360
361 // Convert Neighbors[] from points
362 // on the Klein quadric to wedge points:
363 if (f_v) {
364 cout << "classify_double_sixes::compute_neighbors "
365 "before Surf->klein_to_wedge_vec" << endl;
366 }
368
369 // Sort the set Neighbors:
371
372
373
374
375 // Establish the bijection between Neighbors and Lines in PG(3,q)
376 // by going through the Klein correspondence.
377 // It is important that this be done after we sort Neighbors.
378 if (f_v) {
379 cout << "classify_double_sixes::compute_neighbors "
380 "Establish the bijection between Neighbors and Lines in "
381 "PG(3,q), nb_neighbors=" << nb_neighbors << endl;
382 }
383 int N100;
384
385 N100 = nb_neighbors / 100 + 1;
386
387 for (i = 0; i < nb_neighbors; i++) {
388 if ((i % N100) == 0) {
389 cout << "classify_double_sixes::compute_neighbors i=" << i << " / "
390 << nb_neighbors << " at "
391 << (double)i * 100. / nb_neighbors << "%" << endl;
392 }
393 a = Neighbors[i];
394 AW->unrank_point(w, a);
396 if (FALSE) {
397 cout << i << " : ";
398 Int_vec_print(cout, v, 6);
399 cout << endl;
400 }
401 b = Surf->O->rank_point(v, 1, 0 /* verbose_level*/);
402 if (FALSE) {
403 cout << " : " << b;
404 cout << endl;
405 }
406 c = Surf->Klein->point_on_quadric_to_line(b, 0 /* verbose_level*/);
407 if (FALSE) {
408 cout << " : " << c << endl;
409 cout << endl;
410 }
411 Neighbor_to_line[i] = c;
412 //Line_to_neighbor[c] = i;
413 }
414
415 if (f_v) {
416 cout << "classify_double_sixes::compute_neighbors "
417 "before int_vec_apply" << endl;
418 }
419 for (i = 0; i < nb_neighbors; i++) {
421 Neighbor_to_line[i], 0 /* verbose_level*/);
422 }
423#if 0
424 lint_vec_apply(Neighbor_to_line,
425 Surf->Klein->Line_to_point_on_quadric,
427#endif
428
429
430 if (f_v) {
431 cout << "classify_double_sixes::compute_neighbors done" << endl;
432 }
433}
434
436 data_structures::spreadsheet *&Sp, int verbose_level)
437{
438 int f_v = (verbose_level >= 1);
439 char str[1000];
440 string fname_csv;
441
442 if (f_v) {
443 cout << "classify_double_sixes::make_spreadsheet_of_neighbors" << endl;
444 }
445
446 sprintf(str, "neighbors_%d.csv", q);
447 fname_csv.assign(str);
448
449
452 Neighbor_to_klein, nb_neighbors, 0 /* verbose_level */);
453
454 if (f_v) {
455 cout << "before Sp->save " << fname_csv << endl;
456 }
457 Sp->save(fname_csv, verbose_level);
458 if (f_v) {
459 cout << "after Sp->save " << fname_csv << endl;
460 }
461
462
463
464
465
466 if (f_v) {
467 cout << "classify_double_sixes::make_spreadsheet_of_neighbors done" << endl;
468 }
469}
470
472{
473 int f_v = (verbose_level >= 1);
474 int schreier_depth = 10000;
475 int f_use_invariant_subset_if_available = TRUE;
476 int f_debug = FALSE;
478 int t0 = Os.os_ticks();
479
480
481 if (f_v) {
482 cout << "classify_double_sixes::classify_partial_ovoids" << endl;
483 }
484 if (f_v) {
485 cout << "classify_double_sixes::classify_partial_ovoids "
486 "nb_neighbors = " << nb_neighbors << endl;
487 cout << "Neighbors=";
489 cout << endl;
490 }
491 if (f_v) {
492 cout << "classify_double_sixes::classify_partial_ovoids "
493 "classifying starter" << endl;
494 }
495 Five_plus_one->main(t0,
496 schreier_depth,
497 f_use_invariant_subset_if_available,
498 f_debug,
499 verbose_level);
500 if (f_v) {
501 cout << "classify_double_sixes::classify_partial_ovoids "
502 "classifying starter done" << endl;
503 }
504
505 if (q < 20) {
506 {
509 char str[1000];
510 string fname_csv;
511 sprintf(str, "fiveplusone_%d.csv", q);
512 fname_csv.assign(str);
513 Sp->save(fname_csv, verbose_level);
514 FREE_OBJECT(Sp);
515 }
516 }
517 if (f_v) {
518 cout << "classify_double_sixes::classify_partial_ovoids done" << endl;
519 }
520}
521
522void classify_double_sixes::report(std::ostream &ost,
525 int verbose_level)
526{
527 int f_v = (verbose_level >= 1);
528
529
530 if (f_v) {
531 cout << "classify_double_sixes::report" << endl;
532 }
533
534
535 if (f_v) {
536 cout << "classify_double_sixes::report reporting groups" << endl;
537 }
538 //ost << "\\section*{The groups}" << endl;
539 ost << "\\section*{The semilinear group}" << endl;
540 A->report(ost, A->f_has_sims, A->Sims, A->f_has_strong_generators, A->Strong_gens, draw_options, verbose_level);
541 A->latex_all_points(ost);
542
543 if (f_v) {
544 cout << "classify_double_sixes::report reporting orthogonal group" << endl;
545 }
546 ost << "\\section*{The orthogonal group}" << endl;
547 A2->report(ost, A2->f_has_sims, A2->Sims, A2->f_has_strong_generators, A2->Strong_gens, draw_options, verbose_level);
548 if (A2->degree < 100) {
549 A2->latex_all_points(ost);
550 }
551
552 if (f_v) {
553 cout << "classify_double_sixes::report reporting line stabilizer" << endl;
554 }
555 ost << "\\section*{The group stabilizing the fixed line}" << endl;
557 A_on_neighbors->f_has_strong_generators, A_on_neighbors->Strong_gens, draw_options, verbose_level);
559
560 ost << "{\\small\\arraycolsep=2pt" << endl;
562 ost << "}" << endl;
563
564 if (f_v) {
565 cout << "classify_double_sixes::report before Five_plus_one->report" << endl;
566 }
567 ost << "\\section*{The classification of five-plus-ones}" << endl;
568 Five_plus_one->report(ost, Opt, verbose_level);
569 if (f_v) {
570 cout << "classify_double_sixes::report after Five_plus_one->report" << endl;
571 }
572
573
574 if (f_v) {
575 cout << "classify_double_sixes::report done" << endl;
576 }
577}
578
580 long int *candidates, int nb_candidates,
581 long int *good_candidates, int &nb_good_candidates,
582 int verbose_level)
583{
584 int f_v = (verbose_level >= 1);
585 int f_vv = FALSE; //(verbose_level >= 2);
586 int i, j;
587 int u[6];
588 int v[6];
589 int fxy;
590 int f_OK;
591
592 if (f_v) {
593 cout << "classify_double_sixes::partial_ovoid_test_early checking set ";
594 Lint_vec_print(cout, S, len);
595 cout << endl;
596 cout << "candidate set of size "
597 << nb_candidates << ":" << endl;
598 Lint_vec_print(cout, candidates, nb_candidates);
599 cout << endl;
600 }
601
602 if (len > 5) {
603 cout << "classify_double_sixes::partial_ovoid_test_early len > 5" << endl;
604 exit(1);
605 }
606 for (i = 0; i < len; i++) {
607 AW->unrank_point(u, Neighbors[S[i]]);
609 }
610
611 if (len == 0) {
612 Lint_vec_copy(candidates, good_candidates, nb_candidates);
613 nb_good_candidates = nb_candidates;
614 }
615 else {
616 nb_good_candidates = 0;
617
618 if (f_vv) {
619 cout << "classify_double_sixes::partial_ovoid_test_early "
620 "before testing" << endl;
621 }
622 for (j = 0; j < nb_candidates; j++) {
623
624
625 if (f_vv) {
626 cout << "classify_double_sixes::partial_ovoid_test_early "
627 "testing " << j << " / "
628 << nb_candidates << endl;
629 }
630
631 AW->unrank_point(u, Neighbors[candidates[j]]);
633
634 f_OK = TRUE;
635 for (i = 0; i < len; i++) {
637 Pts_for_partial_ovoid_test + i * 6, v, 1);
638
639 if (fxy == 0) {
640 f_OK = FALSE;
641 break;
642 }
643 }
644 if (f_OK) {
645 good_candidates[nb_good_candidates++] =
646 candidates[j];
647 }
648 } // next j
649 } // else
650}
651
652
653
655{
656 //verbose_level += 2;
657 int f_v = (verbose_level >= 1);
658 int f_vv = FALSE; // (verbose_level >= 2);
659 int i, r;
660 long int S[5];
661 long int S2[6];
662
663 if (f_v) {
664 cout << "classify_double_sixes::test_orbits" << endl;
665 cout << "verbose_level = " << verbose_level << endl;
666 }
668
669 if (f_v) {
670 cout << "classify_double_sixes::test_orbits testing "
671 << len << " orbits of 5-sets of lines:" << endl;
672 }
673 nb = 0;
674 Idx = NEW_int(len);
675 for (i = 0; i < len; i++) {
676 if ((i % 1000) == 0) {
677 cout << "classify_double_sixes::test_orbits orbit "
678 << i << " / " << len << ":" << endl;
679 }
681 if (f_vv) {
682 cout << "set: ";
683 Lint_vec_print(cout, S, 5);
684 cout << endl;
685 }
686
687
689 S2[5] = pt0_line;
690 if (f_vv) {
691 cout << "5+1 lines = ";
692 Lint_vec_print(cout, S2, 6);
693 cout << endl;
694 }
695
696#if 1
697 if (f_vv) {
698 Surf->Gr->print_set(S2, 6);
699 }
700#endif
701
702 r = Surf->rank_of_system(6,
703 S2, 0 /*verbose_level*/);
704 if (f_vv) {
705 cout << "classify_double_sixes::test_orbits orbit "
706 << i << " / " << len
707 << " has rank = " << r << endl;
708 }
709 if (r == 19) {
710 Idx[nb++] = i;
711 }
712 }
713
714 if (f_v) {
715 cout << "classify_double_sixes::test_orbits we found "
716 << nb << " / " << len
717 << " orbits where the rank is 19" << endl;
718 cout << "Idx=";
719 Int_vec_print(cout, Idx, nb);
720 cout << endl;
721 }
722 if (f_v) {
723 cout << "classify_double_sixes::test_orbits done" << endl;
724 }
725}
726
729 int verbose_level)
730{
731 int f_v = (verbose_level >= 1);
732 //int nb_orbits;
733 int i, k;
734 int *Stab_order;
735 int *Len;
736 char **Transporter;
737 char **Text;
738 long int *rep;
739 long int *lines;
740 int *data;
743 string fname_csv;
744 char str[1000];
745
746
747 if (f_v) {
748 cout << "classify_double_sixes::make_spreadsheet_"
749 "of_fiveplusone_configurations" << endl;
750 }
751 sprintf(str, "fiveplusone19_%d.csv", q);
752 fname_csv.assign(str);
753
754 k = 5;
755
756 //nb_orbits = Five_plus_one->nb_orbits_at_level(k);
757 rep = NEW_lint(k);
758 lines = NEW_lint(k);
759 Stab_order = NEW_int(nb);
760 Len = NEW_int(nb);
761 Transporter = NEW_pchar(nb);
762 Text = NEW_pchar(nb);
763 data = NEW_int(A->make_element_size);
764
765 for (i = 0; i < nb; i++) {
770 Stab_order[i] = go.as_int();
771 Len[i] = len.as_int();
772 }
773 for (i = 0; i < nb; i++) {
776
777 Lint_vec_print_to_str(str, lines, k);
778
779 Text[i] = NEW_char(strlen(str) + 1);
780 strcpy(Text[i], str);
781 }
782
783#if 0
784 if (f_with_fusion) {
785 for (i = 0; i < nb; i++) {
786 if (Fusion[i] == -2) {
787 str[0] = 0;
788 strcat(str, "\"N/A\"");
789 }
790 else {
791 A->element_code_for_make_element(transporter->ith(i), data);
792
793
794 int_vec_print_to_str(str, data, A->make_element_size);
795
796 }
797 Transporter[i] = NEW_char(strlen(str) + 1);
798 strcpy(Transporter[i], str);
799 }
800 }
801#endif
802
803
805#if 0
806 if (f_with_fusion) {
807 Sp->init_empty_table(nb + 1, 7);
808 }
809 else {
810 Sp->init_empty_table(nb + 1, 5);
811 }
812#endif
813 Sp->init_empty_table(nb + 1, 5);
814 Sp->fill_column_with_row_index(0, "Orbit");
815 Sp->fill_column_with_int(1, Idx, "Idx");
816 Sp->fill_column_with_text(2, (const char **) Text, "Rep");
817 Sp->fill_column_with_int(3, Stab_order, "Stab_order");
818 Sp->fill_column_with_int(4, Len, "Orbit_length");
819#if 0
820 if (f_with_fusion) {
821 Sp->fill_column_with_int(5, Fusion, "Fusion");
823 (const char **) Transporter, "Transporter");
824 }
825#endif
826 cout << "before Sp->save " << fname_csv << endl;
827 Sp->save(fname_csv, verbose_level);
828 cout << "after Sp->save " << fname_csv << endl;
829
830 FREE_lint(rep);
831 FREE_lint(lines);
832 FREE_int(Stab_order);
833 FREE_int(Len);
834 for (i = 0; i < nb; i++) {
835 FREE_char(Text[i]);
836 }
837 FREE_pchar(Text);
838 for (i = 0; i < nb; i++) {
839 FREE_char(Transporter[i]);
840 }
841 FREE_pchar(Transporter);
842 FREE_int(data);
843 if (f_v) {
844 cout << "classify_double_sixes::make_spreadsheet_"
845 "of_fiveplusone_configurations done" << endl;
846 }
847}
848
849
851 long int *five_lines, long int transversal_line,
852 long int *five_lines_out_as_neighbors, int &orbit_index,
853 int *transporter, int verbose_level)
854{
855 int f_v = (verbose_level >= 1);
856 long int W1[5];
857 long int W2[5];
858 long int N1[5];
860
861 if (f_v) {
862 cout << "classify_double_sixes::identify_five_plus_one" << endl;
863 cout << "classify_double_sixes::identify_five_plus_one "
864 "transversal_line=" << transversal_line << endl;
865 cout << "classify_double_sixes::identify_five_plus_one "
866 "five_lines=";
867 Lint_vec_print(cout, five_lines, 5);
868 cout << endl;
869 cout << "verbose_level = " << verbose_level << endl;
870 }
871
872
873 Surf->line_to_wedge_vec(five_lines, W1, 5);
874 if (f_v) {
875 cout << "classify_double_sixes::identify_five_plus_one W1=";
876 Lint_vec_print(cout, W1, 5);
877 cout << endl;
878 }
879
880
882 Surf->Gr,
883 transversal_line,
884 Elt0,
885 0 /* verbose_level */);
886 if (f_v) {
887 cout << "classify_double_sixes::identify_five_plus_one "
888 "element which moves transversal line:" << endl;
889 A->element_print(Elt0, cout);
890 }
891
892
893 A2->map_a_set(
894 W1,
895 W2,
896 5,
897 Elt0, 0 /* verbose_level */);
898 if (f_v) {
899 cout << "classify_double_sixes::identify_five_plus_one W2=";
900 Lint_vec_print(cout, W2, 5);
901 cout << endl;
902 }
903
905 W2, 5, N1);
906
907 if (f_v) {
908 cout << "classify_double_sixes::identify_five_plus_one "
909 "tracing the set N1=";
910 Lint_vec_print(cout, N1, 5);
911 cout << endl;
912 }
913 orbit_index = Five_plus_one->trace_set(
914 N1, 5, 5,
915 five_lines_out_as_neighbors,
916 Elt1,
917 0/*verbose_level - 2*/);
918 if (f_v) {
919 cout << "classify_double_sixes::identify_five_plus_one "
920 "orbit_index = " << orbit_index << endl;
921 }
922 if (f_v) {
923 cout << "classify_double_sixes::identify_five_plus_one "
924 "element which moves neighbor set:" << endl;
925 A->element_print(Elt1, cout);
926 }
927
928
929 A->element_mult(Elt0, Elt1, transporter, 0);
930 if (f_v) {
931 cout << "classify_double_sixes::identify_five_plus_one "
932 "element which moves five_plus_one:" << endl;
933 A->element_print(transporter, cout);
934 }
935 if (f_v) {
936 cout << "classify_double_sixes::identify_five_plus_one "
937 "done" << endl;
938 }
939}
940
941void classify_double_sixes::classify(int verbose_level)
942{
943 int f_v = (verbose_level >= 1);
944
945
946 if (f_v) {
947 cout << "classify_double_sixes::classify" << endl;
948 }
949
950 if (f_v) {
951 cout << "classify_double_sixes::classify "
952 "before downstep" << endl;
953 }
954 downstep(verbose_level);
955 if (f_v) {
956 cout << "classify_double_sixes::classify "
957 "after downstep" << endl;
958 cout << "we found " << Flag_orbits->nb_flag_orbits
959 << " flag orbits out of "
961 << " orbits" << endl;
962 }
963
964 if (f_v) {
965 cout << "classify_double_sixes::classify "
966 "before upstep" << endl;
967 }
968 upstep(verbose_level);
969 if (f_v) {
970 cout << "classify_double_sixes::classify "
971 "after upstep" << endl;
972 cout << "we found " << Double_sixes->nb_orbits
973 << " double sixes out of "
975 << " flag orbits" << endl;
976 }
977
978 if (f_v) {
979 cout << "classify_double_sixes::classify done" << endl;
980 }
981}
982
983
984void classify_double_sixes::downstep(int verbose_level)
985{
986 int f_v = (verbose_level >= 1);
987 int f_vv = (verbose_level >= 2);
988 //int f_vvv = (verbose_level >= 3);
989 int f, i, nb_orbits, nb_flag_orbits, c;
990
991 if (f_v) {
992 cout << "classify_double_sixes::downstep" << endl;
993 cout << "verbose_level = " << verbose_level << endl;
994 }
995
996 if (f_v) {
997 cout << "classify_double_sixes::downstep "
998 "before test_orbits" << endl;
999 }
1000 test_orbits(verbose_level - 1);
1001 if (f_v) {
1002 cout << "classify_double_sixes::downstep "
1003 "after test_orbits" << endl;
1004 cout << "Idx=";
1005 Int_vec_print(cout, Idx, nb);
1006 cout << endl;
1007 }
1008
1009
1010
1011 nb_orbits = Five_plus_one->nb_orbits_at_level(5);
1012
1014 Flag_orbits->init(A, A2,
1015 nb_orbits /* nb_primary_orbits_lower */,
1016 5 + 6 + 12 /* pt_representation_sz */,
1017 nb,
1018 1 /* upper_bound_for_number_of_traces */, // ToDo
1019 NULL /* void (*func_to_free_received_trace)(void *trace_result, void *data, int verbose_level) */,
1020 NULL /* void (*func_latex_report_trace)(std::ostream &ost, void *trace_result, void *data, int verbose_level)*/,
1021 NULL /* void *free_received_trace_data */,
1022 verbose_level);
1023
1024 if (f_v) {
1025 cout << "classify_double_sixes::downstep "
1026 "initializing flag orbits" << endl;
1027 }
1028
1029 int f_process = FALSE;
1030 int nb_100 = 1;
1031
1032 if (nb > 1000) {
1033 f_process = TRUE;
1034 nb_100 = nb / 100 + 1;
1035 }
1036
1037 nb_flag_orbits = 0;
1038 for (f = 0; f < nb; f++) {
1039
1040 i = Idx[f];
1041 if (f_v) {
1042 cout << "classify_double_sixes::downstep "
1043 "orbit " << f << " / " << nb
1044 << " with rank = 19 is orbit "
1045 << i << " / " << nb_orbits << endl;
1046 }
1047 if (f_process) {
1048 if ((f % nb_100) == 0) {
1049 cout << "classify_double_sixes::downstep orbit "
1050 << i << " / " << nb_orbits << ", progress at " << f / nb_100 << "%" << endl;
1051 }
1052 }
1053
1057 long int dataset[23];
1058
1060 5 /* level */,
1061 i /* orbit_at_level */,
1062 0 /* verbose_level */);
1063
1065 i /* node */, 5 /* level */, ol);
1066
1068
1069 Lint_vec_copy(R->data, dataset, 5);
1070
1072 Neighbor_to_line, dataset + 5, 5);
1073
1074 dataset[10] = pt0_line;
1075
1076 long int double_six[12];
1077 if (f_vv) {
1078 cout << "5+1 lines = ";
1079 Lint_vec_print(cout, dataset + 5, 6);
1080 cout << endl;
1081 }
1082
1083 if (f_vv) {
1084 cout << "classify_double_sixes::downstep before "
1085 "create_double_six_from_five_lines_with_"
1086 "a_common_transversal" << endl;
1087 }
1088
1090 dataset + 5, pt0_line, double_six,
1091 verbose_level - 2);
1092
1093 if (c) {
1094
1095 if (f_vv) {
1096 cout << "The starter configuration is good, "
1097 "a double six has been computed:" << endl;
1098 Lint_matrix_print(double_six, 2, 6);
1099 }
1100
1101 Lint_vec_copy(double_six, dataset + 11, 12);
1102
1103
1104 Flag_orbits->Flag_orbit_node[nb_flag_orbits].init(
1106 nb_flag_orbits /* flag_orbit_index */,
1107 i /* downstep_primary_orbit */,
1108 0 /* downstep_secondary_orbit */,
1109 ol.as_int() /* downstep_orbit_len */,
1110 FALSE /* f_long_orbit */,
1111 dataset /* int *pt_representation */,
1112 R->Strong_gens,
1113 verbose_level - 2);
1114 R->Strong_gens = NULL;
1115
1116 if (f_vv) {
1117 cout << "orbit " << f << " / " << nb
1118 << " with rank = 19 is orbit " << i
1119 << " / " << nb_orbits << ", stab order "
1120 << go << endl;
1121 }
1122 nb_flag_orbits++;
1123 }
1124 else {
1125 if (f_vv) {
1126 cout << "classify_double_sixes::downstep "
1127 "orbit " << f << " / " << nb
1128 << " with rank = 19 does not yield a "
1129 "double six, skipping" << endl;
1130 }
1131 }
1132
1133
1134 FREE_OBJECT(R);
1135 }
1136
1137 Flag_orbits->nb_flag_orbits = nb_flag_orbits;
1138
1139
1140 Po = NEW_int(nb_flag_orbits);
1141 for (f = 0; f < nb_flag_orbits; f++) {
1143 }
1144 if (f_v) {
1145 cout << "classify_double_sixes::downstep we found "
1146 << nb_flag_orbits << " flag orbits out of "
1147 << nb_orbits << " orbits" << endl;
1148 }
1149 if (f_v) {
1150 cout << "classify_double_sixes::downstep "
1151 "initializing flag orbits done" << endl;
1152 }
1153}
1154
1155
1156void classify_double_sixes::upstep(int verbose_level)
1157{
1158 int f_v = (verbose_level >= 1);
1159 int i, j, h, k, i0;
1160 int f, po, so;
1161 int *f_processed;
1162 int nb_processed;
1164
1165 if (f_v) {
1166 cout << "classify_double_sixes::upstep" << endl;
1167 cout << "verbose_level = " << verbose_level << endl;
1168 }
1169
1170
1171 f_processed = NEW_int(Flag_orbits->nb_flag_orbits);
1173 nb_processed = 0;
1174
1176
1178 A->group_order(go);
1179
1182 verbose_level);
1183
1184
1185 if (f_v) {
1186 cout << "flag orbit : downstep_primary_orbit" << endl;
1187 cout << "f : po" << endl;
1188 for (f = 0; f < Flag_orbits->nb_flag_orbits; f++) {
1190 cout << f << " : " << po << endl;
1191 }
1192 }
1193 for (f = 0; f < Flag_orbits->nb_flag_orbits; f++) {
1194
1195 double progress;
1196 long int dataset[23];
1197
1198 if (f_processed[f]) {
1199 continue;
1200 }
1201
1202 progress = ((double)nb_processed * 100. ) /
1203 (double) Flag_orbits->nb_flag_orbits;
1204
1205 if (f_v) {
1206 cout << "classify_double_sixes::upstep "
1207 "Defining n e w orbit "
1209 << " from flag orbit " << f << " / "
1211 << " progress=" << progress << "%" << endl;
1212 }
1215
1216
1217 if (Flag_orbits->pt_representation_sz != 23) {
1218 cout << "Flag_orbits->pt_representation_sz != 23" << endl;
1219 exit(1);
1220 }
1223 if (f_v) {
1224 cout << "po=" << po << " so=" << so << endl;
1225 }
1226 Lint_vec_copy(Flag_orbits->Pt + f * 23, dataset, 23);
1227
1228
1229
1230
1232 int nb_coset_reps;
1233
1235 coset_reps->init(Surf_A->A, verbose_level - 2);
1236 coset_reps->allocate(12, verbose_level - 2);
1237
1238
1241 long int double_six[12];
1242
1243 Lint_vec_copy(dataset + 11, double_six, 12);
1244
1245 if (f_v) {
1246 cout << "double six:";
1247 Lint_vec_print(cout, double_six, 12);
1248 cout << endl;
1249 }
1251 S->group_order(go);
1252 if (f_v) {
1253 cout << "po=" << po << " so=" << so
1254 << " go=" << go << endl;
1255 }
1256
1257 nb_coset_reps = 0;
1258 for (i = 0; i < 2; i++) {
1259 for (j = 0; j < 6; j++) {
1260
1261 if (f_v) {
1262 cout << "i=" << i << " j=" << j << endl;
1263 }
1264 long int transversal_line;
1265 long int five_lines[5];
1266 //int five_lines_in_wedge[5];
1267 long int five_lines_out_as_neighbors[5];
1268 int orbit_index;
1269 int f2;
1270
1271 transversal_line = double_six[i * 6 + j];
1272 i0 = 1 - i;
1273 k = 0;
1274 for (h = 0; h < 6; h++) {
1275 if (h == j) {
1276 continue;
1277 }
1278 five_lines[k++] = double_six[i0 * 6 + h];
1279 }
1280
1281 //int_vec_apply(five_lines,
1282 //Line_to_neighbor, five_lines_in_wedge, 5);
1283
1284 if (f_v) {
1285 cout << "transversal_line = "
1286 << transversal_line << " five_lines=";
1287 Lint_vec_print(cout, five_lines, 5);
1288 cout << endl;
1289 }
1290 identify_five_plus_one(five_lines, transversal_line,
1291 five_lines_out_as_neighbors, orbit_index,
1292 Elt3 /* transporter */, verbose_level - 2);
1293
1294 if (f_v) {
1295 cout << "We found a transporter:" << endl;
1296 A->element_print_quick(Elt3, cout);
1297 }
1298
1300 orbit_index, f2)) {
1301 cout << "cannot find orbit " << orbit_index
1302 << " in Po" << endl;
1303 cout << "Po=";
1305 cout << endl;
1306 exit(1);
1307 }
1308
1310 != orbit_index) {
1311 cout << "Flag_orbits->Flag_orbit_node[f2].downstep_"
1312 "primary_orbit != orbit_index" << endl;
1313 exit(1);
1314 }
1315
1316
1317
1318
1319
1320
1321 if (f2 == f) {
1322 if (f_v) {
1323 cout << "We found an automorphism of "
1324 "the double six:" << endl;
1325 A->element_print_quick(Elt3, cout);
1326 cout << endl;
1327 }
1328 A->element_move(Elt3, coset_reps->ith(nb_coset_reps), 0);
1329 nb_coset_reps++;
1330 //S->add_single_generator(Elt3,
1331 //2 /* group_index */, verbose_level - 2);
1332 }
1333 else {
1334 if (f_v) {
1335 cout << "We are identifying flag orbit "
1336 << f2 << " with flag orbit " << f << endl;
1337 }
1338 if (!f_processed[f2]) {
1342 = TRUE;
1344 = f;
1349 0);
1350 f_processed[f2] = TRUE;
1351 nb_processed++;
1352 }
1353 else {
1354 cout << "Flag orbit " << f2 << " has already been "
1355 "identified with flag orbit " << f << endl;
1356 if (Flag_orbits->Flag_orbit_node[f2].fusion_with != f) {
1357 cout << "Flag_orbits->Flag_orbit_node[f2]."
1358 "fusion_with != f" << endl;
1359 exit(1);
1360 }
1361 }
1362 }
1363 } // next j
1364 } // next i
1365
1366
1367 coset_reps->reallocate(nb_coset_reps, verbose_level - 2);
1368
1369 groups::strong_generators *Aut_gens;
1370
1371 {
1373
1374 if (f_v) {
1375 cout << "classify_double_sixes::upstep "
1376 "Extending the group by a factor of "
1377 << nb_coset_reps << endl;
1378 }
1380 Aut_gens->init_group_extension(S,
1381 coset_reps, nb_coset_reps,
1382 verbose_level - 2);
1383 if (f_v) {
1384 cout << "classify_double_sixes::upstep "
1385 "Aut_gens tl = ";
1386 Int_vec_print(cout,
1387 Aut_gens->tl, Aut_gens->A->base_len());
1388 cout << endl;
1389 }
1390
1391 Aut_gens->group_order(ago);
1392
1393
1394 if (f_v) {
1395 cout << "the double six has a stabilizer of order "
1396 << ago << endl;
1397 cout << "The double six stabilizer is:" << endl;
1398 Aut_gens->print_generators_tex(cout);
1399 }
1400 }
1401
1402
1403
1407 Aut_gens, dataset + 11, NULL /* extra_data */, verbose_level);
1408
1409 FREE_OBJECT(coset_reps);
1410 FREE_OBJECT(S);
1411
1412 f_processed[f] = TRUE;
1413 nb_processed++;
1415 } // next f
1416
1417
1418 if (nb_processed != Flag_orbits->nb_flag_orbits) {
1419 cout << "nb_processed != Flag_orbits->nb_flag_orbits" << endl;
1420 cout << "nb_processed = " << nb_processed << endl;
1421 cout << "Flag_orbits->nb_flag_orbits = "
1422 << Flag_orbits->nb_flag_orbits << endl;
1423 exit(1);
1424 }
1425
1427
1428 if (f_v) {
1429 cout << "We found " << Flag_orbits->nb_primary_orbits_upper
1430 << " orbits of double sixes" << endl;
1431 }
1432
1433 FREE_int(f_processed);
1434
1435
1436 if (f_v) {
1437 cout << "classify_double_sixes::upstep done" << endl;
1438 }
1439}
1440
1441
1443{
1444 int f, i, l;
1445
1447
1448 //ost << "\\clearpage" << endl;
1449 ost << "\\subsection*{Classification of $5+1$ Configurations "
1450 "in $\\PG(3," << q << ")$}" << endl;
1451
1452
1453
1454 {
1457
1458 ost << "The order of the group is ";
1460 ost << "\\\\" << endl;
1461
1462 ost << "\\bigskip" << endl;
1463 }
1464
1465
1466
1469 Ol.create(0, __FILE__, __LINE__);
1470
1471 ost << "The group has "
1472 << l
1473 << " orbits on five plus one configurations in $\\PG(3,"
1474 << q << ").$" << endl << endl;
1475
1476 ost << "Of these, " << nb << " impose 19 conditions."
1477 << endl << endl;
1478
1479
1480 ost << "Of these, " << Flag_orbits->nb_flag_orbits
1481 << " are associated with double sixes. "
1482 "They are:" << endl << endl;
1483
1484
1485 for (f = 0; f < Flag_orbits->nb_flag_orbits; f++) {
1486
1488
1489
1491
1493 5 /* level */,
1494 i /* orbit_at_level */,
1495 0 /* verbose_level */);
1497 i /* node */,
1498 5 /* level */, ol);
1499 D.add_in_place(Ol, ol);
1500
1501 ost << "$" << f << " / " << Flag_orbits->nb_flag_orbits
1502 << "$ is orbit $" << i << " / " << l << "$ $" << endl;
1503 R->print_set_tex(ost);
1504 ost << "$ orbit length $";
1505 ol.print_not_scientific(ost);
1506 ost << "$\\\\" << endl;
1507
1508 FREE_OBJECT(R);
1509 }
1510
1511 ost << "The overall number of five plus one configurations "
1512 "associated with double sixes in $\\PG(3," << q
1513 << ")$ is: " << Ol << "\\\\" << endl;
1514
1515
1516 //Double_sixes->print_latex(ost, "Classification of Double Sixes");
1517}
1518
1520 int *transporter, int &orbit_index, int verbose_level)
1521{
1522 int f_v = (verbose_level >= 1);
1523 int f_vv = (verbose_level >= 4);
1524 int f, f2;
1525 int *Elt1;
1526 int *Elt2;
1527 long int transversal_line;
1528 long int five_lines[5];
1529 long int five_lines_out_as_neighbors[5];
1530 int po;
1532
1533 if (f_v) {
1534 cout << "classify_double_sixes::identify_double_six" << endl;
1535 }
1538
1539 if (f_v) {
1540 cout << "classify_double_sixes::identify_double_six "
1541 "identifying the five lines a_1,...,a_5 "
1542 "with transversal b_6" << endl;
1543 }
1544 transversal_line = double_six[11];
1545 Lint_vec_copy(double_six, five_lines, 5);
1546
1547 identify_five_plus_one(five_lines, transversal_line,
1548 five_lines_out_as_neighbors, po,
1549 Elt1 /* transporter */, 0 /* verbose_level */);
1550
1551 if (f_vv) {
1552 cout << "po=" << po << endl;
1553 cout << "Elt1=" << endl;
1554 A->element_print_quick(Elt1, cout);
1555 }
1556
1557
1558 if (!Sorting.int_vec_search(Po, Flag_orbits->nb_flag_orbits, po, f)) {
1559 cout << "classify_double_sixes::identify_double_six "
1560 "did not find po in Po" << endl;
1561 exit(1);
1562 }
1563
1564 if (f_vv) {
1565 cout << "po=" << po << " f=" << f << endl;
1566 }
1567
1572 orbit_index =
1574 }
1575 else {
1576 f2 = -1;
1577 A->element_move(Elt1, Elt2, 0);
1579 }
1580 if (f_v) {
1581 cout << "classify_double_sixes::identify_double_six "
1582 "f=" << f << " f2=" << f2 << " orbit_index="
1583 << orbit_index << endl;
1584 }
1585 A->element_move(Elt2, transporter, 0);
1586 if (f_vv) {
1587 cout << "transporter=" << endl;
1588 A->element_print_quick(transporter, cout);
1589 }
1590
1591 FREE_int(Elt1);
1592 FREE_int(Elt2);
1593 if (f_v) {
1594 cout << "classify_double_sixes::identify_double_six done" << endl;
1595 }
1596}
1597
1598void classify_double_sixes::write_file(ofstream &fp, int verbose_level)
1599{
1600 int f_v = (verbose_level >= 1);
1601 int i;
1602
1603 if (f_v) {
1604 cout << "classify_double_sixes::write_file" << endl;
1605 }
1606 fp.write((char *) &q, sizeof(int));
1607 fp.write((char *) &nb_neighbors, sizeof(int));
1608 fp.write((char *) &len, sizeof(int));
1609 fp.write((char *) &nb, sizeof(int));
1610 fp.write((char *) &Flag_orbits->nb_flag_orbits, sizeof(int));
1611
1612 for (i = 0; i < nb; i++) {
1613 fp.write((char *) &Idx[i], sizeof(int));
1614 }
1615 for (i = 0; i < Flag_orbits->nb_flag_orbits; i++) {
1616 fp.write((char *) &Po[i], sizeof(int));
1617 }
1618
1619
1620 if (f_v) {
1621 cout << "classify_double_sixes::write_file before Five_plus_one->write_file" << endl;
1622 }
1624 5 /* depth_completed */, 0 /*verbose_level*/);
1625 if (f_v) {
1626 cout << "classify_double_sixes::write_file after Five_plus_one->write_file" << endl;
1627 }
1628
1629
1630 if (f_v) {
1631 cout << "classify_double_sixes::write_file before Flag_orbits->write_file" << endl;
1632 }
1633 Flag_orbits->write_file(fp, 0 /*verbose_level*/);
1634 if (f_v) {
1635 cout << "classify_double_sixes::write_file after Flag_orbits->write_file" << endl;
1636 }
1637
1638 if (f_v) {
1639 cout << "classify_double_sixes::write_file before Double_sixes->write_file" << endl;
1640 }
1641 Double_sixes->write_file(fp, 0 /*verbose_level*/);
1642 if (f_v) {
1643 cout << "classify_double_sixes::write_file after Double_sixes->write_file" << endl;
1644 }
1645
1646 if (f_v) {
1647 cout << "classify_double_sixes::write_file finished" << endl;
1648 }
1649}
1650
1651void classify_double_sixes::read_file(ifstream &fp, int verbose_level)
1652{
1653 int f_v = (verbose_level >= 1);
1654 int i, nb_flag_orbits;
1655
1656 if (f_v) {
1657 cout << "classify_double_sixes::read_file" << endl;
1658 }
1659 fp.read((char *) &q, sizeof(int));
1660 fp.read((char *) &nb_neighbors, sizeof(int));
1661 fp.read((char *) &len, sizeof(int));
1662 fp.read((char *) &nb, sizeof(int));
1663 fp.read((char *) &nb_flag_orbits, sizeof(int));
1664
1665 if (f_v) {
1666 cout << "classify_double_sixes::read_file q=" << q << endl;
1667 cout << "classify_double_sixes::read_file nb_neighbors=" << nb_neighbors << endl;
1668 cout << "classify_double_sixes::read_file len=" << len << endl;
1669 cout << "classify_double_sixes::read_file nb=" << nb << endl;
1670 cout << "classify_double_sixes::read_file nb_flag_orbits=" << nb_flag_orbits << endl;
1671 }
1672
1673 Idx = NEW_int(nb);
1674 for (i = 0; i < nb; i++) {
1675 fp.read((char *) &Idx[i], sizeof(int));
1676 }
1677
1678 Po = NEW_int(nb_flag_orbits);
1679 for (i = 0; i < nb_flag_orbits; i++) {
1680 fp.read((char *) &Po[i], sizeof(int));
1681 }
1682
1683
1684 int depth_completed;
1685
1686 if (f_v) {
1687 cout << "classify_double_sixes::read_file before Five_plus_one->read_file" << endl;
1688 }
1689 Five_plus_one->read_file(fp, depth_completed, verbose_level);
1690 if (f_v) {
1691 cout << "classify_double_sixes::read_file after Five_plus_one->read_file" << endl;
1692 }
1693 if (depth_completed != 5) {
1694 cout << "classify_double_sixes::read_file "
1695 "depth_completed != 5" << endl;
1696 exit(1);
1697 }
1698
1699
1701 //Flag_orbits->A = A;
1702 //Flag_orbits->A2 = A;
1703 if (f_v) {
1704 cout << "classify_double_sixes::read_file before Flag_orbits->read_file" << endl;
1705 }
1706 Flag_orbits->read_file(fp, A, A2, 0 /*verbose_level*/);
1707 if (f_v) {
1708 cout << "classify_double_sixes::read_file after Flag_orbits->read_file" << endl;
1709 }
1710
1712 //Double_sixes->A = A;
1713 //Double_sixes->A2 = A2;
1714
1716 A->group_order(go);
1717 //A->group_order(Double_sixes->go);
1718
1719 if (f_v) {
1720 cout << "classify_double_sixes::read_file before Double_sixes->read_file" << endl;
1721 }
1722 Double_sixes->read_file(fp, A, A2, go, 0/*verbose_level*/);
1723 if (f_v) {
1724 cout << "classify_double_sixes::read_file after Double_sixes->read_file" << endl;
1725 }
1726
1727 if (f_v) {
1728 cout << "classify_double_sixes::read_file finished" << endl;
1729 }
1730}
1731
1732
1733int classify_double_sixes::line_to_neighbor(long int line_rk, int verbose_level)
1734{
1735 int f_v = (verbose_level >= 1);
1736 int idx;
1737 long int point_rk;
1739
1740 if (f_v) {
1741 cout << "classify_double_sixes::line_to_neighbor" << endl;
1742 }
1743 point_rk = Surf->Klein->line_to_point_on_quadric(line_rk, 0 /* verbose_level*/);
1744 if (!Sorting.lint_vec_search(Neighbors, nb_neighbors, point_rk,
1745 idx, 0 /* verbose_level */)) {
1746 cout << "classify_double_sixes::line_to_neighbor line " << line_rk
1747 << " = point " << point_rk << " not found in Neighbors[]" << endl;
1748 exit(1);
1749 }
1750 return idx;
1751}
1752
1753
1754
1755
1756static void callback_partial_ovoid_test_early(long int *S, int len,
1757 long int *candidates, int nb_candidates,
1758 long int *good_candidates, int &nb_good_candidates,
1759 void *data, int verbose_level)
1760{
1761 classify_double_sixes *Classify_double_sixes = (classify_double_sixes *) data;
1762 int f_v = (verbose_level >= 1);
1763
1764 if (f_v) {
1765 cout << "callback_partial_ovoid_test_early for set ";
1766 Lint_vec_print(cout, S, len);
1767 cout << endl;
1768 }
1769 Classify_double_sixes->partial_ovoid_test_early(S, len,
1770 candidates, nb_candidates,
1771 good_candidates, nb_good_candidates,
1772 verbose_level - 2);
1773 if (f_v) {
1774 cout << "callback_partial_ovoid_test_early done" << endl;
1775 }
1776}
1777
1778}}}}
1779
1780
1781
1782
void line_to_wedge_vec(long int *Line_rk, long int *Wedge_rk, int len)
void make_spreadsheet_of_lines_in_three_kinds(data_structures::spreadsheet *&Sp, long int *Wedge_rk, long int *Line_rk, long int *Klein_rk, int nb_lines, int verbose_level)
void klein_to_wedge_vec(long int *Klein_rk, long int *Wedge_rk, int len)
void apply(long int *from, long int *through, long int *to, int len)
Definition: lint_vec.cpp:32
a collection of functions related to sorted vectors
int int_vec_search(int *v, int len, int a, int &idx)
Definition: sorting.cpp:1094
void lint_vec_search_vec(long int *v, int len, long int *A, int A_sz, long int *Idx)
Definition: sorting.cpp:61
int lint_vec_search(long int *v, int len, long int a, int &idx, int verbose_level)
Definition: sorting.cpp:1157
void fill_column_with_text(int col_idx, const char **text, const char *heading)
void fill_column_with_row_index(int col_idx, const char *heading)
void save(std::string &fname, int verbose_level)
void fill_column_with_int(int col_idx, int *data, const char *heading)
long int line_to_point_on_quadric(long int line_rk, int verbose_level)
long int point_on_quadric_to_line(long int point_rk, int verbose_level)
options for drawing an object of type layered_graph
Definition: graphics.h:457
long int rank_point(int *v, int stride, int verbose_level)
void perp(long int pt, long int *Perp_without_pt, int &sz, int verbose_level)
domain to compute with objects of type longinteger
Definition: ring_theory.h:240
void add_in_place(longinteger_object &a, longinteger_object &b)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
void create(long int i, const char *file, int line)
a permutation group in a fixed action.
Definition: actions.h:99
void element_print_quick(void *elt, std::ostream &ost)
Definition: action_cb.cpp:353
void element_print(void *elt, std::ostream &ost)
Definition: action_cb.cpp:347
void map_a_set(long int *set, long int *image_set, int n, int *Elt, int verbose_level)
Definition: action.cpp:668
void element_mult(void *a, void *b, void *ab, int verbose_level)
Definition: action_cb.cpp:315
void report(std::ostream &ost, int f_sims, groups::sims *S, int f_strong_gens, groups::strong_generators *SG, graphics::layered_graph_draw_options *LG_Draw_options, int verbose_level)
Definition: action_io.cpp:22
groups::strong_generators * Strong_gens
Definition: actions.h:130
void element_code_for_make_element(void *elt, int *data)
Definition: action_cb.cpp:403
void make_element_which_moves_a_line_in_PG3q(geometry::grassmann *Gr, long int line_rk, int *Elt, int verbose_level)
Definition: action.cpp:2811
void element_invert(void *a, void *av, int verbose_level)
Definition: action_cb.cpp:322
void element_move(void *a, void *b, int verbose_level)
Definition: action_cb.cpp:335
void group_order(ring_theory::longinteger_object &go)
Definition: action.cpp:2223
action * create_induced_action_by_restriction(groups::sims *S, int size, long int *set, int f_induce, int verbose_level)
void reallocate(int new_length, int verbose_level)
Definition: vector_ge.cpp:444
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void generators_for_parabolic_subgroup(actions::action *A_PGL_n_q, matrix_group *Mtx, int k, int verbose_level)
void init_group_extension(strong_generators *subgroup, int *data, int index, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
a single step classification of combinatorial objects
Definition: classify.h:29
void init(actions::action *A, actions::action *A2, int max_orbits, int representation_sz, ring_theory::longinteger_object &go, int verbose_level)
void read_file(std::ifstream &fp, actions::action *A, actions::action *A2, ring_theory::longinteger_object &go, int verbose_level)
void init(flag_orbits *Flag_orbits, int flag_orbit_index, int downstep_primary_orbit, int downstep_secondary_orbit, int downstep_orbit_len, int f_long_orbit, long int *pt_representation, groups::strong_generators *Strong_gens, int verbose_level)
stores the set of flag orbits; related to the class classification_step
Definition: classify.h:75
void init(actions::action *A, actions::action *A2, int nb_primary_orbits_lower, int pt_representation_sz, int nb_flag_orbits, int upper_bound_for_number_of_traces, void(*func_to_free_received_trace)(void *trace_result, void *data, int verbose_level), void(*func_latex_report_trace)(std::ostream &ost, void *trace_result, void *data, int verbose_level), void *free_received_trace_data, int verbose_level)
Definition: flag_orbits.cpp:75
void read_file(std::ifstream &fp, actions::action *A, actions::action *A2, int verbose_level)
void write_file(std::ofstream &fp, int verbose_level)
void init(classification_step *C, int orbit_index, groups::strong_generators *gens, long int *Rep, void *extra_data, int verbose_level)
Definition: orbit_node.cpp:41
to control the behavior of the poset classification algorithm
to control the behavior of the poset classification report function
void initialize_and_allocate_root_node(poset_classification_control *PC_control, poset_with_group_action *Poset, int depth, int verbose_level)
int trace_set(long int *set, int size, int level, long int *canonical_set, int *Elt_transporter, int verbose_level)
data_structures_groups::set_and_stabilizer * get_set_and_stabilizer(int level, int orbit_at_level, int verbose_level)
int main(int t0, int schreier_depth, int f_use_invariant_subset_if_available, int f_debug, int verbose_level)
void orbit_length(int orbit_at_level, int level, ring_theory::longinteger_object &len)
void make_spreadsheet_of_orbit_reps(data_structures::spreadsheet *&Sp, int max_depth)
void write_file(std::ofstream &fp, int depth_completed, int verbose_level)
void get_stabilizer_order(int level, int orbit_at_level, ring_theory::longinteger_object &go)
void read_file(std::ifstream &fp, int &depth_completed, int verbose_level)
void report(std::ostream &ost, poset_classification_report_options *Opt, int verbose_level)
void init_subset_lattice(actions::action *A, actions::action *A2, groups::strong_generators *Strong_gens, int verbose_level)
void add_testing_without_group(void(*func)(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, void *data, int verbose_level), void *data, int verbose_level)
void init(cubic_surfaces_in_general::surface_with_action *Surf_A, poset_classification::poset_classification_control *Control, int verbose_level)
void partial_ovoid_test_early(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, int verbose_level)
void report(std::ostream &ost, graphics::layered_graph_draw_options *draw_options, poset_classification::poset_classification_report_options *Opt, int verbose_level)
void identify_five_plus_one(long int *five_lines, long int transversal_line, long int *five_lines_out_as_neighbors, int &orbit_index, int *transporter, int verbose_level)
int create_double_six_from_five_lines_with_a_common_transversal(long int *five_lines, long int transversal_line, long int *double_six, int verbose_level)
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define Lint_matrix_print(A, B, C)
Definition: foundations.h:708
#define NEW_pchar(n)
Definition: foundations.h:635
#define FREE_pchar(p)
Definition: foundations.h:648
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#define NEW_char(n)
Definition: foundations.h:632
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define Lint_vec_print_to_str(A, B, C)
Definition: foundations.h:697
#define FREE_char(p)
Definition: foundations.h:646
#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_wedge_product * AW