Orbiter 2022
Combinatorial Objects
arc_generator.cpp
Go to the documentation of this file.
1// arc_generator.cpp
2//
3// Anton Betten
4//
5// previous version Dec 6, 2004
6// revised June 19, 2006
7// revised Aug 17, 2008
8// moved here from hyperoval.cpp May 10, 2013
9// moved to TOP_LEVEL from APPS/ARCS: February 23, 2017
10//
11// Searches for arcs and hyperovals in Desarguesian projective planes
12//
13//
14
15#include "orbiter.h"
16
17using namespace std;
18
19namespace orbiter {
20namespace layer5_applications {
21namespace apps_geometry {
22
23
24static void arc_generator_early_test_function(long int *S, int len,
25 long int *candidates, int nb_candidates,
26 long int *good_candidates, int &nb_good_candidates,
27 void *data, int verbose_level);
28#if 0
29static void arc_generator_lifting_prepare_function_new(
30 exact_cover *EC, int starter_case,
31 long int *candidates, int nb_candidates, groups::strong_generators *Strong_gens,
32 solvers::diophant *&Dio, long int *&col_labels,
33 int &f_ruled_out,
34 int verbose_level);
35#endif
36static void arc_generator_print_arc(std::ostream &ost, int len, long int *S, void *data);
37//static void arc_generator_print_point(long int pt, void *data);
38//static void arc_generator_report(isomorph *Iso, void *data, int verbose_level);
39
40
41
43{
44 Descr = NULL;
45 PA = NULL;
46
49
50 //f_semilinear = FALSE;
51
52 //f_has_forbidden_point_set = FALSE;
53 //forbidden_points_string = NULL;
54 forbidden_points = NULL;
56 f_is_forbidden = NULL;
57
58
59 //A = NULL;
60 SG = NULL;
61 //Grass = NULL;
62 //AG = NULL;
63 //A_on_lines = NULL;
64
65 Poset = NULL;
66 //P = NULL;
67
68 line_type = NULL;
69
70 gen = NULL;
71
72 //null();
73
74}
75
77{
78 freeself();
79}
80
82{
83
84}
85
87{
88 int verbose_level = 0;
89 int f_v = (verbose_level >= 1);
90
91 if (f_v) {
92 cout << "arc_generator::freeself" << endl;
93 }
94 if (gen) {
95 if (f_v) {
96 cout << "arc_generator::freeself before FREE_OBJECT(gen)" << endl;
97 }
99 if (f_v) {
100 cout << "arc_generator::freeself after FREE_OBJECT(gen)" << endl;
101 }
102 }
103
104 if (Poset) {
106 }
107 if (line_type) {
109 }
110 null();
111 if (f_v) {
112 cout << "arc_generator::freeself done" << endl;
113 }
114}
115
116void arc_generator::main(int verbose_level)
117{
118 int f_v = (verbose_level >= 1);
119
120 if (f_v) {
121 cout << "arc_generator::main "
122 "verbose_level=" << verbose_level << endl;
123 }
124
125
126
127 if (f_v) {
128 cout << "arc_generator::main before compute_starter" << endl;
129 }
130 compute_starter(verbose_level);
131 if (f_v) {
132 cout << "arc_generator::main after compute_starter" << endl;
133 }
134
135
136
137 if (f_v) {
138 cout << "arc_generator::main done" << endl;
139 }
140}
141
146 int verbose_level)
147{
148 int f_v = (verbose_level >= 1);
151
152 if (f_v) {
153 cout << "arc_generator::init" << endl;
154 }
157
158
160
161
162
163 if (f_v) {
164 cout << "arc_generator::init" << endl;
165 }
166
168 // q * q + q + 1 for planes (n=3)
169
170 if (f_v) {
171 cout << "arc_generator::init nb_points_total = " << nb_points_total << endl;
172 }
173
174 if (Descr->f_affine) {
176 if (f_v) {
177 cout << "arc_generator::init nb_affine_lines = " << nb_affine_lines << endl;
178 }
179 }
180
181
182
183
185 int i, a;
186
188
191 for (i = 0; i < nb_forbidden_points; i++) {
192 a = forbidden_points[i];
193 f_is_forbidden[a] = TRUE;
194 cout << "arc_generator::init point " << a << " is forbidden" << endl;
195 }
196 }
197 if (PA->P->Implementation->Lines_on_point == NULL) {
198 cout << "arc_generator::init "
199 "P->Lines_on_point == NULL" << endl;
200 exit(1);
201 }
202
203 if (f_v) {
204 cout << "arc_generator::init line_type" << endl;
205 }
206
208
209 if (f_v) {
210 cout << "arc_generator::init before prepare_generator Control=" << endl;
211 Descr->Control->print();
212 }
213 if (f_v) {
214 cout << "arc_generator::init before prepare_generator" << endl;
215 }
216
217 prepare_generator(verbose_level - 2);
218
219 if (f_v) {
220 cout << "arc_generator::init after prepare_generator" << endl;
221 }
222
223
224
225 if (f_v) {
226 cout << "arc_generator::init done" << endl;
227 }
228}
229
230
231void arc_generator::prepare_generator(int verbose_level)
232{
233 int f_v = (verbose_level >= 1);
234
235 if (f_v) {
236 cout << "arc_generator::prepare_generator" << endl;
237 cout << "arc_generator::prepare_generator " << endl;
238 }
239
240
241
243 Poset->init_subset_lattice(PA->A, PA->A, SG /* A->Strong_gens*/, verbose_level);
244
246 Poset->print_function = arc_generator_print_arc;
248
249
250 if (!Descr->f_no_arc_testing) {
251 if (f_v) {
252 cout << "arc_generator::init before "
253 "Poset->add_testing_without_group" << endl;
254 }
256 arc_generator_early_test_function,
257 this /* void *data */,
258 verbose_level);
259 }
260
262
263
266 verbose_level - 1);
267
268 if (f_v) {
269 cout << "arc_generator::init "
270 "problem_label_with_path=" << gen->get_problem_label_with_path() << endl;
271 }
272
273
274#if 0
275 if (f_read_data_file) {
276 if (f_v) {
277 cout << "arc_generator::init reading data file "
278 << fname_data_file << endl;
279 }
280
281 gen->read_data_file(depth_completed,
282 fname_data_file, verbose_level - 1);
283 if (f_v) {
284 cout << "arc_generator::init after reading data file "
285 << fname_data_file << " depth_completed = "
286 << depth_completed << endl;
287 }
288 if (f_v) {
289 cout << "arc_generator::init before "
290 "gen->recreate_schreier_vectors_up_to_level" << endl;
291 }
292 gen->recreate_schreier_vectors_up_to_level(depth_completed - 1,
293 verbose_level - 1);
294 if (f_v) {
295 cout << "arc_generator::init after "
296 "gen->recreate_schreier_vectors_up_to_level" << endl;
297 }
298
299 }
300#endif
301
302 if (f_v) {
303 cout << "arc_generator::prepare_generator done" << endl;
304 }
305}
306
307void arc_generator::compute_starter(int verbose_level)
308{
309 int f_v = (verbose_level >= 1);
311 int t0 = Os.os_ticks();
312
313
314 if (f_v) {
315 cout << "arc_generator::compute_starter" << endl;
316 }
317
318 int schreier_depth = 1000;
319 int f_use_invariant_subset_if_available = TRUE;
320 int f_debug = FALSE;
321 int depth;
322 //int f_embedded = TRUE;
323 //int f_sideways = FALSE;
324
325
326#if 0
327 if (f_read_data_file) {
328 int target_depth = 0; // ToDo
329
330 if (f_v) {
331 cout << "arc_generator::compute_starter "
332 "before generator_main" << endl;
333 cout << "arc_generator::compute_starter "
334 "problem_label_with_path=" << gen->get_problem_label_with_path() << endl;
335 }
336 depth = gen->compute_orbits(
337 depth_completed, target_depth,
338 verbose_level - 2);
339 if (f_v) {
340 cout << "arc_generator::compute_starter "
341 "after gen->compute_orbits" << endl;
342 }
343 }
344#endif
345 //else {
346 if (f_v) {
347 cout << "arc_generator::compute_starter "
348 "before gen->main" << endl;
349 cout << "arc_generator::compute_starter "
350 "problem_label_with_path=" << gen->get_problem_label_with_path() << endl;
351 }
352 depth = gen->main(t0,
353 schreier_depth,
354 f_use_invariant_subset_if_available,
355 f_debug,
356 verbose_level);
357 if (f_v) {
358 cout << "arc_generator::compute_starter "
359 "after gen->main" << endl;
360 }
361 //}
362
363 if (f_v) {
364 cout << "arc_generator::compute_starter "
365 "finished, depth=" << depth << endl;
366 }
367
368
369
370#if 0
371 if (f_v) {
372 cout << "arc_generator::compute_starter "
373 "before gen->print_data_structure_tex" << endl;
374 }
375
376 //gen->print_data_structure_tex(depth, 0 /*gen->verbose_level */);
377#endif
378
379#if 0
380 if (f_draw_poset) {
381 if (f_v) {
382 cout << "arc_generator::compute_starter "
383 "before gen->draw_poset" << endl;
384 }
385
386 gen->draw_poset(gen->get_problem_label_with_path(), depth, 0 /* data1 */,
387 f_embedded, f_sideways, 0 /* gen->verbose_level */);
388 }
389#endif
390
391
392#if 0
393 if (nb_recognize) {
394 int h;
395
396 for (h = 0; h < nb_recognize; h++) {
397 long int *recognize_set;
398 int recognize_set_sz;
399 int orb;
400 long int *canonical_set;
401 int *Elt_transporter;
402 int *Elt_transporter_inv;
403
404 cout << "recognize " << h << " / " << nb_recognize << endl;
405 lint_vec_scan(recognize[h], recognize_set, recognize_set_sz);
406 cout << "input set = " << h << " / " << nb_recognize << " : ";
407 lint_vec_print(cout, recognize_set, recognize_set_sz);
408 cout << endl;
409
410 canonical_set = NEW_lint(recognize_set_sz);
411 Elt_transporter = NEW_int(gen->get_A()->elt_size_in_int);
412 Elt_transporter_inv = NEW_int(gen->get_A()->elt_size_in_int);
413
414 orb = gen->trace_set(recognize_set,
415 recognize_set_sz, recognize_set_sz /* level */,
416 canonical_set, Elt_transporter,
417 0 /*verbose_level */);
418
419 cout << "canonical set = ";
420 lint_vec_print(cout, canonical_set, recognize_set_sz);
421 cout << endl;
422 cout << "is orbit " << orb << endl;
423 cout << "transporter:" << endl;
424 A->element_print_quick(Elt_transporter, cout);
425
426 A->element_invert(Elt_transporter, Elt_transporter_inv, 0);
427 cout << "transporter inverse:" << endl;
428 A->element_print_quick(Elt_transporter_inv, cout);
429
430
431 FREE_lint(canonical_set);
432 FREE_int(Elt_transporter);
433 FREE_int(Elt_transporter_inv);
434 FREE_lint(recognize_set);
435 }
436 }
437 if (f_list) {
438 int f_show_orbit_decomposition = FALSE, f_show_stab = FALSE;
439 int f_save_stab = FALSE, f_show_whole_orbit = FALSE;
440
441 gen->generate_source_code(depth, verbose_level);
442
444 TRUE,
445 arc_generator_print_arc,
446 this,
447 f_show_orbit_decomposition,
448 f_show_stab,
449 f_save_stab,
450 f_show_whole_orbit);
451
452
453
454 {
455 spreadsheet *Sp;
457 char fname_csv[1000];
458 sprintf(fname_csv, "orbits_%d.csv", depth);
459 Sp->save(fname_csv, verbose_level);
460 FREE_OBJECT(Sp);
461 }
462
463
464 }
465#endif
466
467
468
469 if (f_v) {
470 cout << "arc_generator::compute_starter done" << endl;
471 }
472
473}
474
476 long int *S, int len, int pt, int nb_E, int verbose_level)
477{
478 int f_v = (verbose_level >= 1);
479 int ret = TRUE;
481
482 if (f_v) {
483 cout << "arc_generator::test_nb_Eckardt_points" << endl;
484 }
485 ret = Gg.test_nb_Eckardt_points(PA->PA2->P, S, len, pt, nb_E, verbose_level);
486 if (f_v) {
487 cout << "arc_generator::test_nb_Eckardt_points done" << endl;
488 }
489 return ret;
490}
491
492int arc_generator::conic_test(long int *S, int len, int pt, int verbose_level)
493{
494 int f_v = (verbose_level >= 1);
495 int ret = TRUE;
496
497 if (f_v) {
498 cout << "arc_generator::conic_test" << endl;
499 }
500 ret = PA->P->conic_test(S, len, pt, verbose_level);
501 if (f_v) {
502 cout << "arc_generator::conic_test done" << endl;
503 }
504 return ret;
505}
506
507void arc_generator::early_test_func(long int *S, int len,
508 long int *candidates, int nb_candidates,
509 long int *good_candidates, int &nb_good_candidates,
510 int verbose_level)
511{
512 int f_v = (verbose_level >= 1);
513 int i, j, a, b;
514 int f_survive;
515
516 if (f_v) {
517 cout << "arc_generator::early_test_func checking set ";
518 Lint_vec_print(cout, S, len);
519 cout << endl;
520 cout << "candidate set of size " << nb_candidates << ":" << endl;
521 Lint_vec_print(cout, candidates, nb_candidates);
522 cout << endl;
523 }
524
525
526 compute_line_type(S, len, 0 /* verbose_level */);
527
528 nb_good_candidates = 0;
529 for (i = 0; i < nb_candidates; i++) {
530 a = candidates[i];
531
532 f_survive = TRUE;
533
535 if (f_is_forbidden[a]) {
536 f_survive = FALSE;
537 }
538 }
539
540
541 if (f_survive && Descr->f_d) {
542 // test that there are no more than d points per line:
543 for (j = 0; j < PA->P->r; j++) {
544 b = PA->P->Implementation->Lines_on_point[a * PA->P->r + j];
545 if (line_type[b] == Descr->d) {
546 if (Descr->f_affine && b < nb_affine_lines) {
547 f_survive = FALSE;
548 }
549 else if (!Descr->f_affine) {
550 f_survive = FALSE;
551 }
552 break;
553 }
554 }
555 }
556
557 if (f_survive && Descr->f_conic_test) {
558 if (conic_test(S, len, a, verbose_level) == FALSE) {
559 f_survive = FALSE;
560 }
561 }
562
563 if (f_survive && Descr->f_test_nb_Eckardt_points) {
564 if (test_nb_Eckardt_points(S, len, a,
565 Descr->nb_E, verbose_level) == FALSE) {
566 f_survive = FALSE;
567 }
568 }
569
570 if (f_survive) {
571 good_candidates[nb_good_candidates++] = candidates[i];
572 }
573 } // next i
574
575}
576
577void arc_generator::print(int len, long int *S)
578{
579 int i, a;
580
581 if (len == 0) {
582 return;
583 }
584
585 compute_line_type(S, len, 0 /* verbose_level */);
586
587 cout << "set ";
588 Lint_vec_print(cout, S, len);
589 cout << " has line type ";
590
592
593 C.init(line_type, PA->P->N_lines, FALSE, 0);
594 C.print_naked(TRUE);
595 cout << endl;
596
597 int *Coord;
598
599 Coord = NEW_int(len * (PA->n + 1));
600 cout << "the coordinates of the points are:" << endl;
601 for (i = 0; i < len; i++) {
602 a = S[i];
603 point_unrank(Coord + i * (PA->n + 1), a);
604 }
605 for (i = 0; i < len; i++) {
606 cout << S[i] << " : ";
607 Int_vec_print(cout, Coord + i * (PA->n + 1), PA->n + 1);
608 cout << endl;
609 }
610
611
612
613 if (Descr->f_d && Descr->d >= 3) {
614 }
615 else {
616 long int **Pts_on_conic;
617 int **Conic_eqn;
618 int *nb_pts_on_conic;
619 int len1;
620
621
622 cout << "Conic intersections:" << endl;
623
624 if (PA->P->n != 2) {
625 cout << "conic intersections "
626 "only defined in the plane" << endl;
627 exit(1);
628 }
629 PA->P->conic_type(
630 S, len,
631 6 /* threshold */,
632 Pts_on_conic, Conic_eqn, nb_pts_on_conic, len1,
633 0 /*verbose_level*/);
634 cout << "The arc intersects " << len1
635 << " conics in 6 or more points. " << endl;
636
637#if 0
638 cout << "These intersections are" << endl;
639 for (i = 0; i < len1; i++) {
640 cout << "conic intersection of size "
641 << nb_pts_on_conic[i] << " : ";
642 int_vec_print(cout, Pts_on_conic[i], nb_pts_on_conic[i]);
643 cout << endl;
644 }
645#endif
646
647
648
649
650
651 for (i = 0; i < len1; i++) {
652 FREE_lint(Pts_on_conic[i]);
653 FREE_int(Conic_eqn[i]);
654 }
655 FREE_int(nb_pts_on_conic);
656 FREE_plint(Pts_on_conic);
657 FREE_pint(Conic_eqn);
658 }
659
660#if 0
661 if (f_simeon) {
662 F->simeon(n, len, S, simeon_s, verbose_level);
663 }
664#endif
665
666 FREE_int(Coord);
667}
668
670{
672}
673
674
675
676
677void arc_generator::point_unrank(int *v, int rk)
678{
679 PA->F->PG_element_unrank_modified(v, 1 /* stride */, (PA->n + 1) /* len */, rk);
680}
681
683{
684 int rk;
685
686 PA->F->PG_element_rank_modified(v, 1 /* stride */, (PA->n + 1), rk);
687 return rk;
688}
689
690void arc_generator::compute_line_type(long int *set, int len, int verbose_level)
691{
692 int f_v = (verbose_level >= 1);
693 int i, j;
694 long int a, b;
695
696 if (f_v) {
697 cout << "arc_generator::compute_line_type" << endl;
698 }
699
700 if (PA->P->Implementation->Lines_on_point == 0) {
701 cout << "arc_generator::compute_line_type "
702 "P->Lines_on_point == 0" << endl;
703 exit(1);
704 }
706 for (i = 0; i < len; i++) {
707 a = set[i];
708 for (j = 0; j < PA->P->r; j++) {
709 b = PA->P->Implementation->Lines_on_point[a * PA->P->r + j];
710 line_type[b]++;
711 }
712 }
713
714}
715
717 exact_cover *E, int starter_case,
718 long int *candidates, int nb_candidates,
719 groups::strong_generators *Strong_gens,
720 solvers::diophant *&Dio, long int *&col_labels,
721 int &f_ruled_out,
722 int verbose_level)
723// compute the incidence matrix of tangent lines versus candidate points
724// extended by external lines versus candidate points
725{
726 int f_v = (verbose_level >= 1);
727 int f_vv = (verbose_level >= 2);
728 int i, j, a, b;
729 int nb_needed;
730 int starter_size;
731
732 if (f_v) {
733 cout << "arc_generator::lifting_prepare_function_new "
734 "nb_candidates=" << nb_candidates << endl;
735 }
736
737 if (PA->n != 2) {
738 cout << "arc_generator::lifting_prepare_function_new "
739 "needs PA->n == 2" << endl;
740 exit(1);
741 }
742 if (Descr->d != 2) {
743 cout << "arc_generator::lifting_prepare_function_new "
744 "needs d == 2" << endl;
745 exit(1);
746 }
747 starter_size = Descr->Control->depth;
748 if (f_v) {
749 cout << "arc_generator::lifting_prepare_function_new "
750 "starter_size=" << starter_size << endl;
751 }
752
753 nb_needed = Descr->target_size - starter_size;
754 f_ruled_out = FALSE;
755
756
757
758 compute_line_type(E->starter, starter_size, 0 /* verbose_level */);
759
760
761
763
764 C.init(line_type, PA->P->N_lines, FALSE, 0);
765 if (f_v) {
766 cout << "arc_generator::lifting_prepare_function_new "
767 "line_type:" << endl;
768 C.print_naked(TRUE);
769 cout << endl;
770 }
771
772
773 // extract the tangent lines:
774
775 int tangent_lines_fst, nb_tangent_lines;
776 int *tangent_lines;
777 int *tangent_line_idx;
778 int external_lines_fst, nb_external_lines;
779 int *external_lines;
780 int *external_line_idx;
781 int fst, len, idx;
782
783
784 // find all tangent lines:
785
786 fst = 0;
787 len = 0;
788 for (i = 0; i < C.nb_types; i++) {
789 fst = C.type_first[i];
790 len = C.type_len[i];
791 idx = C.sorting_perm_inv[fst];
792 if (line_type[idx] == 1) {
793 break;
794 }
795 }
796 if (i == C.nb_types) {
797 cout << "arc_generator::lifting_prepare_function_new "
798 "there are no tangent lines" << endl;
799 exit(1);
800 }
801 tangent_lines_fst = fst;
802 nb_tangent_lines = len;
803 tangent_lines = NEW_int(nb_tangent_lines);
804 tangent_line_idx = NEW_int(PA->P->N_lines);
805 for (i = 0; i < PA->P->N_lines; i++) {
806 tangent_line_idx[i] = -1;
807 }
808 for (i = 0; i < len; i++) {
809 j = C.sorting_perm_inv[tangent_lines_fst + i];
810 tangent_lines[i] = j;
811 tangent_line_idx[j] = i;
812 }
813
814
815 // find all external lines:
816 for (i = 0; i < C.nb_types; i++) {
817 fst = C.type_first[i];
818 len = C.type_len[i];
819 idx = C.sorting_perm_inv[fst];
820 if (line_type[idx] == 0) {
821 break;
822 }
823 }
824 if (i == C.nb_types) {
825 cout << "arc_generator::lifting_prepare_function_new "
826 "there are no external lines" << endl;
827 exit(1);
828 }
829 external_lines_fst = fst;
830 nb_external_lines = len;
831 external_lines = NEW_int(nb_external_lines);
832 external_line_idx = NEW_int(PA->P->N_lines);
833 for (i = 0; i < PA->P->N_lines; i++) {
834 external_line_idx[i] = -1;
835 }
836 for (i = 0; i < len; i++) {
837 j = C.sorting_perm_inv[external_lines_fst + i];
838 external_lines[i] = j;
839 external_line_idx[j] = i;
840 }
841
842
843
844 col_labels = NEW_lint(nb_candidates);
845
846
847 Lint_vec_copy(candidates, col_labels, nb_candidates);
848
849 if (E->f_lex) {
850 if (f_vv) {
851 cout << "arc_generator::lifting_prepare_function_new "
852 "before lexorder test" << endl;
853 }
854 E->lexorder_test(col_labels, nb_candidates, Strong_gens->gens,
855 verbose_level - 2);
856 if (f_vv) {
857 cout << "arc_generator::lifting_prepare_function_new "
858 "after lexorder test" << endl;
859 }
860 }
861
862 if (f_vv) {
863 cout << "arc_generator::lifting_prepare_function_new "
864 "after lexorder test" << endl;
865 cout << "arc_generator::lifting_prepare_function_new "
866 "nb_candidates=" << nb_candidates << endl;
867 }
868
869 // compute the incidence matrix between
870 // tangent lines and candidate points as well as
871 // external lines and candidate points:
872
873
874 int nb_rows;
875 int nb_cols;
876
877 nb_rows = nb_tangent_lines + nb_external_lines;
878 nb_cols = nb_candidates;
879
881 Dio->open(nb_rows, nb_cols);
882 Dio->sum = nb_needed;
883
884 for (i = 0; i < nb_tangent_lines; i++) {
885 Dio->type[i] = t_EQ;
886 Dio->RHS[i] = 1;
887 }
888
889 for (i = 0; i < nb_external_lines; i++) {
890 Dio->type[nb_tangent_lines + i] = t_ZOR;
891 Dio->RHS[nb_tangent_lines + i] = 2;
892 }
893
895
896
897 for (i = 0; i < nb_candidates; i++) {
898 a = col_labels[i];
899 for (j = 0; j < PA->P->r; j++) {
900 b = PA->P->Implementation->Lines_on_point[a * PA->P->r + j];
901 if (line_type[b] == 2) {
902 cout << "arc_generator::lifting_prepare_function "
903 "candidate lies on a secant" << endl;
904 exit(1);
905 }
906 idx = tangent_line_idx[b];
907 if (idx >= 0) {
908 Dio->Aij(idx, i) = 1;
909 }
910 idx = external_line_idx[b];
911 if (idx >= 0) {
912 Dio->Aij(nb_tangent_lines + idx, i) = 1;
913 }
914 }
915 }
916
917
918 FREE_int(tangent_lines);
919 FREE_int(tangent_line_idx);
920 FREE_int(external_lines);
921 FREE_int(external_line_idx);
922
923 if (f_v) {
924 cout << "arc_generator::lifting_prepare_function_new "
925 "done" << endl;
926 }
927}
928
929
930void arc_generator::report(isomorph &Iso, int verbose_level)
931{
932 int f_v = (verbose_level >= 1);
933 char fname[1000];
935
936 if (f_v) {
937 cout << "arc_generator::report" << endl;
938 }
939 if (Descr->target_size == PA->q + 2) {
940 sprintf(fname, "hyperovals_%d.tex", PA->q);
941 }
942 else {
943 sprintf(fname, "arcs_%d_%d.tex", PA->q, Descr->target_size);
944 }
945
946 {
947 ofstream f(fname);
948 int f_book = TRUE;
949 int f_title = TRUE;
950 char title[1000];
951 const char *author = "Orbiter";
952 int f_toc = TRUE;
953 int f_landscape = FALSE;
954 int f_12pt = FALSE;
955 int f_enlarged_page = TRUE;
956 int f_pagenumbers = TRUE;
958
959 if (Descr->target_size == PA->q + 2) {
960 sprintf(title, "Hyperovals over ${\\mathbb F}_{%d}$", PA->q);
961 }
962 else {
963 sprintf(title, "Arcs over ${\\mathbb F}_{%d}$ "
964 "of size $%d$", PA->q, Descr->target_size);
965 }
966 cout << "Writing file " << fname << " with "
967 << Iso.Reps->count << " arcs:" << endl;
968 L.head(f, f_book, f_title,
969 title, author,
970 f_toc, f_landscape, f_12pt, f_enlarged_page, f_pagenumbers,
971 NULL /* extra_praeamble */);
972
973
974 report_do_the_work(f, Iso, verbose_level);
975
976
977
978
979 L.foot(f);
980
981 }
982
983 cout << "Written file " << fname << " of size "
984 << Fio.file_size(fname) << endl;
985
986}
987
988void arc_generator::report_do_the_work(ostream &ost, isomorph &Iso, int verbose_level)
989{
990 int f_v = (verbose_level >= 1);
992
993 if (f_v) {
994 cout << "arc_generator::report_do_the_work" << endl;
995 }
996
997
998
999 ost << "\\chapter{Summary}" << endl << endl;
1000 ost << "There are " << Iso.Reps->count
1001 << " isomorphism types." << endl << endl;
1002
1003
1004 Iso.setup_and_open_solution_database(verbose_level - 1);
1005
1006 int i, first, /*c,*/ id;
1007 int u, v, h, rep, tt;
1009 long int data[1000];
1010
1011
1012
1013 ring_theory::longinteger_object *Ago, *Ago_induced;
1014 int *Ago_int;
1015
1018 Ago_int = NEW_int(Iso.Reps->count);
1019
1020
1021 for (h = 0; h < Iso.Reps->count; h++) {
1022 rep = Iso.Reps->rep[h];
1023 first = Iso.orbit_fst[rep];
1024 //c = Iso.starter_number[first];
1025 id = Iso.orbit_perm[first];
1026 Iso.load_solution(id, data);
1027
1028 groups::sims *Stab;
1029
1030 Stab = Iso.Reps->stab[h];
1031
1032 Iso.Reps->stab[h]->group_order(Ago[h]);
1033 Ago_int[h] = Ago[h].as_int();
1034 if (f_v) {
1035 cout << "arc_generator::report computing induced "
1036 "action on the set (in data)" << endl;
1037 }
1038 Iso.induced_action_on_set_basic(Stab, data, 0 /*verbose_level*/);
1039
1040
1041 Iso.AA->group_order(Ago_induced[h]);
1042 }
1043
1044
1046
1047 C_ago.init(Ago_int, Iso.Reps->count, FALSE, 0);
1048 cout << "Classification by ago:" << endl;
1049 C_ago.print(FALSE /*f_backwards*/);
1050
1051
1052
1053 ost << "\\chapter{Invariants}" << endl << endl;
1054
1055 ost << "Classification by automorphism group order: ";
1056 C_ago.print_naked_tex(ost, FALSE /*f_backwards*/);
1057 ost << "\\\\" << endl;
1058
1059 ost << "\\begin{center}" << endl;
1060 ost << "\\begin{tabular}{|c|l|}" << endl;
1061 ost << "\\hline" << endl;
1062 ost << "Ago & Isom. Types \\\\" << endl;
1063 ost << "\\hline" << endl;
1064 ost << "\\hline" << endl;
1065
1066 int cnt, length, t, vv, *set;
1067
1068 cnt = 0;
1069 for (u = C_ago.nb_types - 1; u >= 0; u--) {
1070 first = C_ago.type_first[u];
1071 length = C_ago.type_len[u];
1072 t = C_ago.data_sorted[first];
1073
1074 ost << t << " & ";
1075
1076 set = NEW_int(length);
1077 for (v = 0; v < length; v++, cnt++) {
1078 vv = first + v;
1079 i = C_ago.sorting_perm_inv[vv];
1080 set[v] = i;
1081 }
1082
1083 Sorting.int_vec_heapsort(set, length);
1084
1085 for (v = 0; v < length; v++, cnt++) {
1086
1087 ost << set[v];
1088
1089 if (v < length - 1) {
1090 ost << ",";
1091 if ((v + 1) % 10 == 0) {
1092 ost << "\\\\" << endl;
1093 ost << " & " << endl;
1094 }
1095 }
1096 }
1097 ost << "\\\\" << endl;
1098 if (u > 0) {
1099 ost << "\\hline" << endl;
1100 }
1101 FREE_int(set);
1102 }
1103 ost << "\\hline" << endl;
1104 ost << "\\end{tabular}" << endl;
1105 ost << "\\end{center}" << endl << endl;
1106
1107
1108 ost << "\\clearpage" << endl << endl;
1109
1110 ost << "\\begin{center}" << endl;
1111 ost << "\\begin{tabular}{|r|r|r|}" << endl;
1112 ost << "\\hline" << endl;
1113 ost << "Isom. Type & $|\\mbox{Aut}|$ & $|\\mbox{Aut}|$ "
1114 "(induced)\\\\" << endl;
1115 ost << "\\hline" << endl;
1116 ost << "\\hline" << endl;
1117
1118 cnt = 0;
1119 for (u = 0; u < C_ago.nb_types; u ++) {
1120 first = C_ago.type_first[u];
1121 length = C_ago.type_len[u];
1122 t = C_ago.data_sorted[first];
1123
1124 set = NEW_int(length);
1125 for (v = 0; v < length; v++) {
1126 vv = first + v;
1127 i = C_ago.sorting_perm_inv[vv];
1128 set[v] = i;
1129 }
1130
1131 Sorting.int_vec_heapsort(set, length);
1132
1133
1134 for (v = 0; v < length; v++) {
1135 vv = first + v;
1136 i = C_ago.sorting_perm_inv[vv];
1137 h = set[v];
1138 ost << setw(3) << h << " & ";
1139 Ago[h].print_not_scientific(ost);
1140 ost << " & ";
1141 Ago_induced[h].print_not_scientific(ost);
1142 ost << "\\\\" << endl;
1143 cnt++;
1144 if ((cnt % 30) == 0) {
1145 ost << "\\hline" << endl;
1146 ost << "\\end{tabular}" << endl;
1147 ost << "\\end{center}" << endl << endl;
1148 ost << "\\begin{center}" << endl;
1149 ost << "\\begin{tabular}{|r|r|r|}" << endl;
1150 ost << "\\hline" << endl;
1151 ost << "Isom. Type & $|\\mbox{Aut}|$ & $|\\mbox{Aut}|$ "
1152 "(induced)\\\\" << endl;
1153 ost << "\\hline" << endl;
1154 ost << "\\hline" << endl;
1155 }
1156 }
1157 FREE_int(set);
1158 }
1159
1160 ost << "\\hline" << endl;
1161 ost << "\\end{tabular}" << endl;
1162 ost << "\\end{center}" << endl << endl;
1163
1164
1165 if (Descr->target_size == PA->q + 2) {
1166 ost << "\\chapter{The Hyperovals}" << endl << endl;
1167 }
1168 else {
1169 ost << "\\chapter{The Arcs}" << endl << endl;
1170 }
1171
1172 ost << "\\clearpage" << endl << endl;
1173
1174
1175 for (h = 0; h < Iso.Reps->count; h++) {
1176 rep = Iso.Reps->rep[h];
1177 first = Iso.orbit_fst[rep];
1178 //c = Iso.starter_number[first];
1179 id = Iso.orbit_perm[first];
1180 Iso.load_solution(id, data);
1181
1182
1183 ost << "\\section{Isomorphism type " << h << "}" << endl;
1184 ost << "\\bigskip" << endl;
1185
1186
1187 if (Iso.Reps->stab[h]) {
1188 Iso.Reps->stab[h]->group_order(go);
1189 ost << "Stabilizer has order $";
1190 go.print_not_scientific(ost);
1191 ost << "$.\\\\" << endl;
1192 }
1193 else {
1194 //cout << endl;
1195 }
1196
1197 groups::sims *Stab;
1198
1199 Stab = Iso.Reps->stab[h];
1200
1201 if (f_v) {
1202 cout << "arc_generator::report computing induced "
1203 "action on the set (in data)" << endl;
1204 }
1205 Iso.induced_action_on_set_basic(Stab, data, 0 /*verbose_level*/);
1206
1208
1209 Iso.AA->group_order(go1);
1210 cout << "action " << Iso.AA->label
1211 << " computed, group order is " << go1 << endl;
1212
1213 ost << "Order of the group that is induced on the set is ";
1214 ost << "$";
1215 go1.print_not_scientific(ost);
1216 ost << "$.\\\\" << endl;
1217
1218
1219 groups::schreier Orb;
1220 //longinteger_object go2;
1221
1223 Stab->gens, verbose_level - 2);
1224 ost << "With " << Orb.nb_orbits
1225 << " orbits on the set.\\\\" << endl;
1226
1228
1229 C_ol.init(Orb.orbit_len, Orb.nb_orbits, FALSE, 0);
1230
1231 ost << "Orbit lengths: ";
1232 //int_vec_print(f, Orb.orbit_len, Orb.nb_orbits);
1233 C_ol.print_naked_tex(ost, FALSE /*f_backwards*/);
1234 ost << " \\\\" << endl;
1235
1236 tt = (Descr->target_size + 3) / 4;
1237
1238 ost << "The points by ranks:\\\\" << endl;
1239 ost << "\\begin{center}" << endl;
1240
1241 for (u = 0; u < 4; u++) {
1242 ost << "\\begin{tabular}[t]{|c|c|c|}" << endl;
1243 ost << "\\hline" << endl;
1244 ost << "$i$ & Rank & Unrank\\\\" << endl;
1245 ost << "\\hline" << endl;
1246 for (i = 0; i < tt; i++) {
1247 v = u * tt + i;
1248 if (v < Descr->target_size) {
1249 int vec[3];
1250
1251 point_unrank(vec, data[v]);
1252 ost << "$" << v << "$ & $" << data[v] << "$ & $";
1253 Int_vec_print(ost, vec, 3);
1254 ost << "$\\\\" << endl;
1255 }
1256 }
1257 ost << "\\hline" << endl;
1258 ost << "\\end{tabular}" << endl;
1259 }
1260 ost << "\\end{center}" << endl;
1261
1262
1263 report_stabilizer(Iso, ost, h /* orbit */, 0 /* verbose_level */);
1264
1265
1266 report_decompositions(Iso, ost, h /* orbit */,
1267 data, verbose_level);
1268
1269 }
1270
1271
1272 char prefix[1000];
1273 char label_of_structure_plural[1000];
1274
1275 sprintf(prefix, "arcs_%d_%d", PA->q, Descr->target_size);
1276 sprintf(label_of_structure_plural, "Arcs");
1277
1278 isomorph_global IG;
1279
1280 IG.init(Iso.A_base, Iso.A, Iso.gen, verbose_level);
1281
1283 prefix, label_of_structure_plural, ost,
1284 verbose_level);
1285
1286
1287 Iso.close_solution_database(verbose_level - 1);
1288
1289 FREE_int(Ago_int);
1290 FREE_OBJECTS(Ago);
1291 FREE_OBJECTS(Ago_induced);
1292
1293 if (f_v) {
1294 cout << "arc_generator::report_do_the_work done" << endl;
1295 }
1296}
1297
1299 isomorph &Iso, ostream &ost, int orbit,
1300 long int *data, int verbose_level)
1301{
1302 int f_v = (verbose_level >= 1);
1303
1304 if (f_v) {
1305 cout << "arc_generator::report_decompositions" << endl;
1306 }
1307 groups::sims *Stab;
1309
1311
1312 Stab = Iso.Reps->stab[orbit];
1313 gens->init_from_sims(Stab, 0 /* verbose_level */);
1314
1316
1318 ost, PA->P,
1319 PA->A /* A_on_points */, PA->A_on_lines,
1320 gens, 25 /* size_limit_for_printing */,
1321 verbose_level);
1322
1323
1324}
1325
1327 ostream &ost, int orbit, int verbose_level)
1328{
1329 groups::sims *Stab;
1330
1331 Stab = Iso.Reps->stab[orbit];
1333
1335 SG->init_from_sims(Stab, verbose_level);
1336
1338
1339 FREE_OBJECT(SG);
1340}
1341
1342
1343
1344// #############################################################################
1345// global functions
1346// #############################################################################
1347
1348
1349static void arc_generator_early_test_function(long int *S, int len,
1350 long int *candidates, int nb_candidates,
1351 long int *good_candidates, int &nb_good_candidates,
1352 void *data, int verbose_level)
1353{
1354 arc_generator *Gen = (arc_generator *) data;
1355 //verbose_level = 1;
1356 int f_v = (verbose_level >= 1);
1357
1358 if (f_v) {
1359 cout << "arc_generator_early_test_function for set ";
1360 Lint_vec_print(cout, S, len);
1361 cout << endl;
1362 }
1363 Gen->early_test_func(S, len,
1364 candidates, nb_candidates,
1365 good_candidates, nb_good_candidates,
1366 verbose_level - 2);
1367 if (f_v) {
1368 cout << "arc_generator_early_test_function nb_candidates=" << nb_candidates
1369 << " nb_good_candidates=" << nb_good_candidates << endl;
1370 }
1371 if (f_v) {
1372 cout << "arc_generator_early_test_function done" << endl;
1373 }
1374}
1375
1376#if 0
1377static void arc_generator_lifting_prepare_function_new(
1378 exact_cover *EC, int starter_case,
1379 long int *candidates, int nb_candidates,
1380 groups::strong_generators *Strong_gens,
1381 solvers::diophant *&Dio, long int *&col_labels,
1382 int &f_ruled_out,
1383 int verbose_level)
1384{
1385 int f_v = (verbose_level >= 1);
1386 arc_generator *Gen = (arc_generator *) EC->user_data;
1387
1388 if (f_v) {
1389 cout << "arc_generator_lifting_prepare_function_new "
1390 "nb_candidates=" << nb_candidates << endl;
1391 }
1392
1393 Gen->lifting_prepare_function_new(EC, starter_case,
1394 candidates, nb_candidates, Strong_gens,
1395 Dio, col_labels, f_ruled_out,
1396 verbose_level - 1);
1397
1398
1399 if (f_v) {
1400 cout << "arc_generator_lifting_prepare_function_new "
1401 "nb_rows=" << Dio->m << " nb_cols=" << Dio->n << endl;
1402 }
1403
1404 if (f_v) {
1405 cout << "arc_generator_lifting_prepare_function_new done" << endl;
1406 }
1407}
1408#endif
1409
1410
1411static void arc_generator_print_arc(ostream &ost, int len, long int *S, void *data)
1412{
1413 arc_generator *Gen = (arc_generator *) data;
1414
1415 Gen->print(len, S);
1416 Gen->print_set_in_affine_plane(len, S);
1417}
1418
1419#if 0
1420static void arc_generator_print_point(long int pt, void *data)
1421{
1422 arc_generator *Gen = (arc_generator *) data;
1423 int v[3];
1424
1425 Gen->PA->F->PG_element_unrank_modified(
1426 v, 1 /* stride */, 3 /* len */, pt);
1427 cout << "(" << v[0] << "," << v[1] << "," << v[2] << ")" << endl;
1428}
1429
1430static void arc_generator_report(
1431 isomorph *Iso, void *data, int verbose_level)
1432{
1433 arc_generator *Gen = (arc_generator *) data;
1434
1435 Gen->report(*Iso, verbose_level);
1436}
1437#endif
1438
1439
1440}}}
1441
1442
1443
a collection of functions related to sorted vectors
a statistical analysis of data consisting of single integers
void init(int *data, int data_length, int f_second, int verbose_level)
Definition: tally.cpp:72
void print_naked_tex(std::ostream &ost, int f_backwards)
Definition: tally.cpp:413
void PG_element_rank_modified(int *v, int stride, int len, int &a)
void PG_element_unrank_modified(int *v, int stride, int len, int a)
various functions related to geometries
Definition: geometry.h:721
int test_nb_Eckardt_points(projective_space *P2, long int *S, int len, int pt, int nb_E, int verbose_level)
void conic_type(long int *set, int set_size, int threshold, long int **&Pts_on_conic, int **&Conic_eqn, int *&nb_pts_on_conic, int &nb_conics, int verbose_level)
projective_space_implementation * Implementation
Definition: geometry.h:1940
int conic_test(long int *S, int len, int pt, int verbose_level)
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)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
diophantine systems of equations (i.e., linear systems over the integers)
Definition: solvers.h:209
void compute_all_point_orbits(groups::schreier &S, data_structures_groups::vector_ge &gens, int verbose_level)
Definition: action.cpp:995
void group_order(ring_theory::longinteger_object &go)
Definition: action.cpp:2223
Schreier trees for orbits of groups on points.
Definition: groups.h:839
a permutation group represented via a stabilizer chain
Definition: groups.h:1273
void group_order(ring_theory::longinteger_object &go)
Definition: sims.cpp:951
data_structures_groups::vector_ge gens
Definition: groups.h:1280
a strong generating set for a permutation group with respect to a fixed action
Definition: groups.h:1703
void init_from_sims(groups::sims *S, int verbose_level)
data_structures_groups::vector_ge * gens
Definition: groups.h:1708
exact cover problems arising with the lifting of combinatorial objects
Definition: solver.h:27
void lexorder_test(long int *live_blocks2, int &nb_live_blocks2, data_structures_groups::vector_ge *stab_gens, int verbose_level)
auxiliary class for class isomorph
Definition: isomorph.h:789
void report_data_in_source_code_inside_tex(isomorph &Iso, const char *prefix, char *label_of_structure_plural, std::ostream &f, int verbose_level)
void init(actions::action *A_base, actions::action *A, poset_classification::poset_classification *gen, int verbose_level)
classification of combinatorial objects using subobjects
Definition: isomorph.h:30
void setup_and_open_solution_database(int verbose_level)
void load_solution(int id, long int *data)
poset_classification::poset_classification * gen
Definition: isomorph.h:122
void induced_action_on_set_basic(groups::sims *S, long int *set, int verbose_level)
void initialize_and_allocate_root_node(poset_classification_control *PC_control, poset_with_group_action *Poset, int depth, int verbose_level)
int compute_orbits(int from_level, int to_level, int schreier_depth, int f_use_invariant_subset_if_available, int verbose_level)
int trace_set(long int *set, int size, int level, long int *canonical_set, int *Elt_transporter, int verbose_level)
int main(int t0, int schreier_depth, int f_use_invariant_subset_if_available, int f_debug, int verbose_level)
void list_all_orbits_at_level(int depth, int f_has_print_function, void(*print_function)(std::ostream &ost, int len, long int *S, void *data), void *print_function_data, int f_show_orbit_decomposition, int f_show_stab, int f_save_stab, int f_show_whole_orbit)
void make_spreadsheet_of_orbit_reps(data_structures::spreadsheet *&Sp, int max_depth)
void draw_poset(std::string &fname_base, int depth, int data, graphics::layered_graph_draw_options *LG_Draw_options, int verbose_level)
void read_data_file(int &depth_completed, std::string &fname, 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(* print_function)(std::ostream &ost, int len, long int *S, void *data)
void report_tactical_decomposition_by_automorphism_group(std::ostream &ost, geometry::projective_space *P, actions::action *A_on_points, actions::action *A_on_lines, groups::strong_generators *gens, int size_limit_for_printing, int verbose_level)
description of a classification problem of arcs in a geometry
Definition: tl_geometry.h:27
poset_classification::poset_classification_control * Control
Definition: tl_geometry.h:32
classification of arcs in desarguesian projective planes
Definition: tl_geometry.h:75
void compute_line_type(long int *set, int len, int verbose_level)
poset_classification::poset_with_group_action * Poset
Definition: tl_geometry.h:97
void lifting_prepare_function_new(exact_cover *E, int starter_case, long int *candidates, int nb_candidates, groups::strong_generators *Strong_gens, solvers::diophant *&Dio, long int *&col_labels, int &f_ruled_out, int verbose_level)
void report_decompositions(isomorph &Iso, std::ostream &ost, int orbit, long int *data, int verbose_level)
void init(arc_generator_description *Descr, projective_geometry::projective_space_with_action *PA, groups::strong_generators *SG, int verbose_level)
void report_do_the_work(std::ostream &ost, isomorph &Iso, int verbose_level)
int conic_test(long int *S, int len, int pt, int verbose_level)
void early_test_func(long int *S, int len, long int *candidates, int nb_candidates, long int *good_candidates, int &nb_good_candidates, int verbose_level)
int test_nb_Eckardt_points(long int *S, int len, int pt, int nb_E, int verbose_level)
projective_geometry::projective_space_with_action * PA
Definition: tl_geometry.h:81
void report_stabilizer(isomorph &Iso, std::ostream &ost, int orbit, int verbose_level)
poset_classification::poset_classification * gen
Definition: tl_geometry.h:104
projective space PG(n,q) with automorphism group PGGL(n+1,q)
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define FREE_OBJECTS(p)
Definition: foundations.h:652
#define Int_vec_scan(A, B, C)
Definition: foundations.h:716
#define FREE_int(p)
Definition: foundations.h:640
#define Int_vec_zero(A, B)
Definition: foundations.h:713
#define FREE_plint(p)
Definition: foundations.h:643
#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 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 FREE_pint(p)
Definition: foundations.h:641
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects