16namespace layer5_applications {
17namespace projective_geometry {
61 int f_v = (verbose_level >= 1);
65 cout <<
"canonical_form_classifier::count_nb_objects_to_test" << endl;
86 cout <<
"canonical_form_classifier::count_nb_objects_to_test "
88 << S.
nb_rows - 1 <<
" objects" << endl;
93 cout <<
"canonical_form_classifier::count_nb_objects_to_test "
102 int f_v = (verbose_level >= 1);
106 cout <<
"canonical_form_classifier::classify";
108 cout <<
" using nauty" << endl;
111 cout <<
" using substructure" << endl;
122 cout <<
"canonical_form_classifier::classify please use -degree <d> to specify the degree" << endl;
126 cout <<
"please use -fname_base_out" << endl;
136 cout <<
"canonical_form_classifier::classify "
137 "before AonHPD->init" << endl;
141 cout <<
"canonical_form_classifier::classify "
142 "after AonHPD->init" << endl;
149 cout <<
"canonical_form_classifier::classify "
150 "before count_nb_objects_to_test" << endl;
157 cout <<
"canonical_form_classifier::classify "
171 cout <<
"canonical_form_classifier::classify "
172 "before classify_nauty" << endl;
176 cout <<
"canonical_form_classifier::classify "
177 "after classify_nauty" << endl;
183 cout <<
"canonical_form_classifier::classify "
184 "before classify_with_substructure" << endl;
188 cout <<
"canonical_form_classifier::classify "
189 "after classify_with_substructure" << endl;
193 cout <<
"canonical_form_classifier::classify please select which algorithm to use" << endl;
205 cout <<
"canonical forms:" << endl;
207 cout << setw(2) << i <<
" : ";
209 cout <<
" : " <<
Goi[i] << endl;
221 cout <<
"Classification of curves:" << endl;
224 cout <<
"transversal:" << endl;
240 cout <<
Goi[j] <<
" : ";
246 cout <<
"for elements ";
247 int_vec_print(cout, sorting_perm_inv + type_first[i], Frequency[i]);
254 cout <<
"canonical_form_classifier::classify "
255 "before write_canonical_forms_csv" << endl;
261 cout <<
"canonical_form_classifier::classify "
262 "after write_canonical_forms_csv" << endl;
267 cout <<
"canonical_form_classifier::classify "
268 "before generate_source_code" << endl;
277 cout <<
"canonical_form_classifier::classify "
278 "after generate_source_code" << endl;
283 cout <<
"canonical_form_classifier::classify done" << endl;
290 int f_v = (verbose_level >= 1);
294 cout <<
"canonical_form_classifier::classify_nauty" << endl;
306 cout <<
"canonical_form_classifier::classify_nauty The number of isomorphism types is " <<
CB->
nb_types << endl;
314 int f_v = (verbose_level >= 1);
318 cout <<
"canonical_form_classifier::classify_with_substructure, "
328 cout <<
"canonical_form_classifier::classify_with_substructure before SubC->classify_substructures" << endl;
340 cout <<
"canonical_form_classifier::classify_with_substructure "
341 "after SubC->classify_substructures" << endl;
342 cout <<
"canonical_form_classifier::classify_with_substructure "
355 cout <<
"canonical_form_classifier::classify_with_substructure before main_loop" << endl;
359 cout <<
"canonical_form_classifier::classify_with_substructure after main_loop" << endl;
365 cout <<
"canonical_form_classifier::classify_with_substructure done" << endl;
373 int f_v = (verbose_level >= 1);
379 cout <<
"canonical_form_classifier::main_loop" << endl;
382 string fname_case_out;
400 cout <<
"canonical_form_classifier::classify_nauty S.nb_rows = " << S.
nb_rows << endl;
401 cout <<
"canonical_form_classifier::classify_nauty S.nb_cols = " << S.
nb_cols << endl;
410 cout <<
"cnt = " << cnt <<
" / " <<
Descr->
nb_files <<
" row = " << row <<
" / " << S.
nb_rows - 1 << endl;
413 sprintf(str,
"_cnt%d",
counter);
416 fname_case_out.append(str);
421 string bitangents_txt;
426 long int *bitangents;
431 if (S.
tokens[t] == NULL) {
432 cout <<
"canonical_form_classifier::classify_nauty token[t] == NULL" << endl;
434 eqn_txt.assign(S.
tokens[t]);
437 if (S.
tokens[t] == NULL) {
438 cout <<
"canonical_form_classifier::classify_nauty token[t] == NULL" << endl;
440 pts_txt.assign(S.
tokens[t]);
443 if (S.
tokens[t] == NULL) {
444 cout <<
"canonical_form_classifier::classify_nauty token[t] == NULL" << endl;
446 bitangents_txt.assign(S.
tokens[t]);
455 cout <<
"row = " << row <<
" eqn=" << eqn_txt <<
" pts_txt=" << pts_txt <<
" =" << bitangents_txt << endl;
463 cout <<
"row = " << row <<
" eqn=";
467 cout <<
" bitangents=";
480 cout <<
"canonical_form_classifier::main_loop "
481 "before classify_curve_nauty" << endl;
485 int *canonical_equation;
486 int *transporter_to_canonical_form;
493 eqn, sz, pts, nb_pts, bitangents, nb_bitangents,
495 transporter_to_canonical_form,
503 FREE_int(transporter_to_canonical_form);
506 cout <<
"canonical_form_classifier::main_loop "
507 "after classify_curve_nauty" << endl;
519 cout <<
"canonical_form_classifier::main_loop "
520 "before CFS->classify_curve_with_substructure" << endl;
549 cout <<
"canonical_form_classifier::main_loop "
550 "after CFS->classify_curve_with_substructure" << endl;
557 cout <<
"canonical_form_classifier::main_loop "
558 "too small for substructure algorithm. Skipping" << endl;
570 cout <<
"canonical_form_classifier::main_loop please select which algorithm to use" << endl;
586 cout <<
"canonical_form_classifier::main_loop done" << endl;
596 long int *bitangents,
598 int *canonical_equation,
599 int *transporter_to_canonical_form,
602 int f_v = (verbose_level >= 1);
605 cout <<
"canonical_form_classifier::classify_curve_nauty" << endl;
626 bitangents, nb_bitangents,
628 transporter_to_canonical_form,
629 gens_stab_of_canonical_equation,
654 cout <<
"After search_and_add_if_new, cnt = " << cnt <<
" row = " << row <<
" The canonical form is new" << endl;
659 cout <<
"After search_and_add_if_new, cnt = " << cnt <<
" row = " << row <<
" We found the canonical form at idx = " << idx << endl;
678 cout <<
"starting loop over idx1" << endl;
681 for (idx1 = idx; idx1 >= 0; idx1--) {
689 cout <<
"canonical_form_classifier::classify_curve_nauty before CB->compare_at idx1 = " << idx1 << endl;
693 cout <<
"canonical_form_classifier::classify_curve_nauty at idx1 = " << idx1 <<
" is not equal, break" << endl;
698 cout <<
"canonical_form_classifier::classify_curve_nauty canonical form at " << idx1 <<
" is equal" << endl;
713 cout <<
"canonical_form_classifier::classify_curve_nauty computing alpha" << endl;
721 cout <<
"canonical_form_classifier::classify_curve_nauty computing gamma" << endl;
740 cout <<
"canonical_form_classifier::classify_curve_nauty before PA->P->reverse_engineer_semilinear_map" << endl;
743 gamma, Mtx, frobenius,
746 cout <<
"canonical_form_classifier::classify_curve_nauty after PA->P->reverse_engineer_semilinear_map" << endl;
754 cout <<
"The isomorphism from C to C1 is given by:" << endl;
768 cout <<
"canonical_form_classifier::classify_curve_nauty before substitute_semilinear" << endl;
773 cout <<
"canonical_form_classifier::classify_curve_nauty after substitute_semilinear" << endl;
780 cout <<
"The mapped equation is:";
793 cout <<
"we found the canonical form but we did not find the equation at idx1=" << idx1 << endl;
800 cout <<
"After search_and_add_if_new, cnt = " << cnt <<
" row = " << row <<
" We found the canonical form and the equation at idx2 " << idx2 <<
", idx1=" << idx1 << endl;
810 if (found_at == -1) {
813 cout <<
"we found the canonical form but we did not find the equation" << endl;
818 long int *bitangents2;
823 bitangents2 =
NEW_lint(nb_bitangents);
825 for (i = 0; i < nb_pts; i++) {
828 for (i = 0; i < nb_bitangents; i++) {
839 cout <<
"we recompute the quartic curve from the canonical equation." << endl;
842 cout <<
"canonical_form_classifier::classify_curve_nauty before C2->quartic_curve" << endl;
850 bitangents2, nb_bitangents,
852 transporter_to_canonical_form,
853 gens_stab_of_canonical_equation,
856 cout <<
"canonical_form_classifier::classify_curve_nauty after C2->quartic_curve" << endl;
860 cout <<
"After search_and_add_if_new, adding at " << idx << endl;
868 cout <<
"we found the equation at index " << found_at << endl;
879 cout <<
"canonical_form_classifier::classify_curve_nauty done" << endl;
886 std::string &fname_base,
889 int f_v = (verbose_level >= 1);
902 cout <<
"canonical_form_classifier::write_canonical_forms_csv" << endl;
904 fname.assign(fname_base);
905 fname.append(
"_canonical_form.csv");
917 ofstream ost(fname.c_str());
919 ost <<
"ROW,SourceFile,SourceRow,Eqn,Pts,Lines,Transporter,CanEqn,CanPts,CanLines,AutTl,AutGens,Ago" << endl;
923 cout <<
"canonical_form_classifier::write_canonical_forms_csv i=" << i <<
" / " <<
nb_objects_to_test << endl;
973 long int *Pts_canonical;
991 long int *bitangents_orig;
992 long int *bitangents_canonical;
997 bitangents_canonical[j] = A_on_lines->
element_image_of(bitangents_orig[j],
CFS_table[i]->transporter_to_canonical_form, 0 );
1034 ost <<
"END" << endl;
1040 cout <<
"written file " << fname <<
" of size "
1041 << Fio.
file_size(fname.c_str()) << endl;
1043 cout <<
"canonical_form_classifier::write_canonical_forms_csv done" << endl;
1050 std::string &fname_base,
1054 int f_v = (verbose_level >= 1);
1055 int f_vv = (verbose_level >= 2);
1067 cout <<
"canonical_form_classifier::generate_source_code" << endl;
1069 fname.assign(fname_base);
1070 fname.append(
".cpp");
1081 ofstream f(fname.c_str());
1083 f <<
"static int " << fname_base.c_str() <<
"_nb_reps = "
1084 << nb_orbits <<
";" << endl;
1085 f <<
"static int " << fname_base.c_str() <<
"_size = "
1086 << nb_monomials <<
";" << endl;
1091 cout <<
"canonical_form_classifier::generate_source_code "
1092 "preparing reps" << endl;
1094 f <<
"// the equations:" << endl;
1095 f <<
"static int " << fname_base.c_str() <<
"_reps[] = {" << endl;
1096 for (orbit_index = 0;
1097 orbit_index < nb_orbits;
1104 cout <<
"canonical_form_classifier::generate_source_code "
1105 "orbit_index = " << orbit_index << endl;
1120 for (i = 0; i < nb_monomials; i++) {
1128 for (i = 0; i < nb_monomials; i++) {
1132 f <<
"// problem" << endl;
1142 cout <<
"canonical_form_classifier::generate_source_code "
1143 "preparing stab_order" << endl;
1145 f <<
"// the stabilizer orders:" << endl;
1146 f <<
"static const char *" << fname_base.c_str() <<
"_stab_order[] = {" << endl;
1147 for (orbit_index = 0;
1148 orbit_index < nb_orbits;
1158 ago.
create(
Goi[idx], __FILE__, __LINE__);
1173 cout <<
"canonical_form_classifier::generate_source_code "
1174 "preparing Bitangents" << endl;
1176 f <<
"// the 28 bitangents:" << endl;
1177 f <<
"static long int " << fname_base.c_str() <<
"_Bitangents[] = { " << endl;
1180 for (orbit_index = 0;
1181 orbit_index < nb_orbits;
1186 cout <<
"canonical_form_classifier::generate_source_code "
1187 "orbit_index = " << orbit_index << endl;
1198 long int *bitangents_orig;
1199 long int *bitangents_canonical;
1211 for (j = 0; j < 28; j++) {
1212 f << bitangents_canonical[j];
1219 for (j = 0; j < 28; j++) {
1223 f <<
"// problem" << endl;
1230 f <<
"static int " << fname_base.c_str() <<
"_make_element_size = "
1234 int *stab_gens_first;
1240 stab_gens_first =
NEW_int(nb_orbits);
1241 stab_gens_len =
NEW_int(nb_orbits);
1243 for (orbit_index = 0;
1244 orbit_index < nb_orbits;
1260 stab_gens_first[orbit_index] = fst;
1261 stab_gens_len[orbit_index] = gens->
gens->
len;
1262 fst += stab_gens_len[orbit_index];
1265 stab_gens_first[orbit_index] = fst;
1266 stab_gens_len[orbit_index] = 0;
1274 cout <<
"canonical_form_classifier::generate_source_code "
1275 "preparing stab_gens_fst" << endl;
1277 f <<
"static int " << fname_base.c_str() <<
"_stab_gens_fst[] = { " << endl <<
"\t";
1278 for (orbit_index = 0;
1279 orbit_index < nb_orbits;
1281 f << stab_gens_first[orbit_index];
1282 if (orbit_index < nb_orbits - 1) {
1285 if (((orbit_index + 1) % 10) == 0) {
1292 cout <<
"canonical_form_classifier::generate_source_code "
1293 "preparing stab_gens_len" << endl;
1295 f <<
"static int " << fname_base.c_str() <<
"_stab_gens_len[] = { " << endl <<
"\t";
1296 for (orbit_index = 0;
1297 orbit_index < nb_orbits;
1299 f << stab_gens_len[orbit_index];
1300 if (orbit_index < nb_orbits - 1) {
1303 if (((orbit_index + 1) % 10) == 0) {
1311 cout <<
"canonical_form_classifier::generate_source_code "
1312 "preparing stab_gens" << endl;
1314 f <<
"static int " << fname_base.c_str() <<
"_stab_gens[] = {" << endl;
1315 for (orbit_index = 0;
1316 orbit_index < nb_orbits;
1320 for (j = 0; j < stab_gens_len[orbit_index]; j++) {
1322 cout <<
"canonical_form_classifier::generate_source_code "
1323 "before extract_strong_generators_in_order "
1324 "generator " << j <<
" / "
1325 << stab_gens_len[orbit_index] << endl;
1345 f <<
"// problem" << endl;
1359 cout <<
"written file " << fname <<
" of size "
1360 << Fio.
file_size(fname.c_str()) << endl;
1362 cout <<
"canonical_form_classifier::generate_source_code done" << endl;
1372 int f_v = (verbose_level >= 1);
1375 cout <<
"canonical_form_classifier::report" << endl;
1382 label.assign(fname_base);
1383 label.append(
"_canonical");
1385 fname.assign(label);
1386 fname.append(
".tex");
1390 ofstream ost(fname);
1396 report2(ost, fname_base, verbose_level);
1402 cout <<
"Written file " << fname <<
" of size "
1407 cout <<
"canonical_form_classifier::report done" << endl;
1414 int f_v = (verbose_level >= 1);
1419 cout <<
"canonical_form_classifier::report2" << endl;
1422 label.assign(fname_base);
1423 label.append(
"_canonical");
1425 fname.assign(label);
1426 fname.append(
"_data.csv");
1465 cout <<
"i=" << i << endl;
1477 Table[i * nb_cols + 0] = i;
1493 Table[i * nb_cols + 5 + j] =
CFS_table[i]->orbit_frequencies[j];
1544 for (h = 6; h <= 20; h++) {
1551 cout <<
"canonical_form_classifier::report2 finished collecting Table" << endl;
1561 cout <<
"Written file " << fname <<
" of size "
1566 cout <<
"canonical_form_classifier::report2 done" << endl;
long int get_allocated_length()
classification of 0/1 matrices using canonical forms
int compare_at(uchar *data, int idx)
void add_at_idx(uchar *data, void *extra_data, int idx, int verbose_level)
void search_and_add_if_new(uchar *data, void *extra_data, int &f_found, int &idx, int verbose_level)
void init(int N, int rep_len, int verbose_level)
void create_string_with_quotes(std::string &str, int *v, int len)
void create_string_with_quotes(std::string &str, long int *v, int len)
a collection of functions related to sorted vectors
void lint_vec_heapsort(long int *v, int len)
for reading and writing of csv files
void read_spreadsheet(std::string &fname, int verbose_level)
void set_entry_lint(int row_idx, int col_idx, long int val)
void save(std::string &fname, int verbose_level)
void init_empty_table(int nb_rows, int nb_cols)
void fill_entry_with_text(int row_idx, int col_idx, const char *text)
a statistical analysis of data consisting of vectors of ints
void get_transversal(int *&transversal, int *&frequency, int &nb_types, int verbose_level)
void init(int *data, int data_length, int data_set_sz, int verbose_level)
void PG_element_normalize_from_front(int *v, int stride, int len)
int reverse_engineer_semilinear_map(int *Elt, int *Mtx, int &frobenius, int verbose_level)
a collection of functions related to file io
long int file_size(std::string &fname)
interface to create latex output files
void head_easy(std::ostream &ost)
void foot(std::ostream &ost)
data_structures::lint_vec * Lint_vec
data_structures::int_vec * Int_vec
homogeneous polynomials of a given degree in a given number of variables over a finite field GF(q)
void init(field_theory::finite_field *F, int nb_vars, int degree, int f_init_incidence_structure, monomial_ordering_type Monomial_ordering_type, int verbose_level)
void print_equation_simple(std::ostream &ost, int *coeffs)
void substitute_semilinear(int *coeff_in, int *coeff_out, int f_semilinear, int frob_power, int *Mtx_inv, int verbose_level)
a class to represent arbitrary precision integers
std::ostream & print_not_scientific(std::ostream &ost)
void create(long int i, const char *file, int line)
a permutation group in a fixed action.
void element_print(void *elt, std::ostream &ost)
void element_print_for_make_element(void *elt, std::ostream &ost)
groups::strong_generators * Strong_gens
int is_semilinear_matrix_group()
void make_element(int *Elt, int *data, int verbose_level)
long int element_image_of(long int a, void *elt, int verbose_level)
a strong generating set for a permutation group with respect to a fixed action
long int group_order_as_lint()
data_structures_groups::vector_ge * gens
void get_gens_data_as_string_with_quotes(std::string &str, int verbose_level)
void group_order(ring_theory::longinteger_object &go)
induced action on the set of homogeneous polynomials over a finite field
void init(actions::action *A, ring_theory::homogeneous_polynomial_domain *HPD, int verbose_level)
int nb_interesting_subsets_rr
int search_equation(int *eqn, int &idx, int verbose_level)
classification of substructures
void classify_substructures(std::string &fname_base_out, actions::action *A, actions::action *A2, groups::strong_generators *gens, int substructure_size, int verbose_level)
geometry::projective_space * P
actions::action * A_on_lines
field_theory::finite_field * F
#define Int_vec_scan(A, B, C)
#define Int_vec_zero(A, B)
#define Lint_vec_scan(A, B, C)
#define Lint_vec_print(A, B, C)
#define Int_vec_copy(A, B, C)
#define Int_vec_print(A, B, C)
orbiter_kernel_system::orbiter_session * Orbiter
global Orbiter session
std::vector< term > equation
the orbiter library for the classification of combinatorial objects