Orbiter 2022
Combinatorial Objects
isomorph_database.cpp
Go to the documentation of this file.
1// isomorph_database.cpp
2//
3// Anton Betten
4// Oct 21, 2008
5//
6// moved here from iso.cpp 3/22/09
7// renamed isomorph_database.cpp from iso2.cpp 7/14/11
8//
9//
10
12#include "discreta/discreta.h"
15
16
17using namespace std;
18
19namespace orbiter {
20namespace layer4_classification {
21
23{
24 int f_v = (verbose_level >= 1);
25
26 if (f_v) {
27 cout << "isomorph::setup_and_open_solution_database" << endl;
28 }
29 if (DB_sol) {
31 DB_sol = NULL;
32 }
35
36 init_DB_sol(0 /*verbose_level - 1*/);
37
38 DB_sol->open(0 /*verbose_level - 1*/);
39}
40
42{
43 int f_v = (verbose_level >= 1);
44
45 if (f_v) {
46 cout << "isomorph::setup_and_create_solution_database" << endl;
47 }
48 if (DB_sol) {
50 DB_sol = NULL;
51 }
54
55 init_DB_sol(0 /*verbose_level - 1*/);
56
57 DB_sol->create(0 /*verbose_level - 1*/);
58}
59
60void isomorph::close_solution_database(int verbose_level)
61{
62 DB_sol->close(0/*verbose_level - 1*/);
63}
64
66// Called from do_iso_test, identify and test_hash
67// (Which are all in isomorph_testing.cpp)
68// Calls init_DB_level for D1 and D2 and D1->open and D2->open.
69// Calls fopen for fp_ge1 and fp_ge2.
70{
71 int f_v = (verbose_level >= 1);
72
73 if (f_v) {
74 cout << "isomorph::setup_and_open_level_database" << endl;
75 }
76
77 if (D1) {
79 D1 = NULL;
80 }
81 if (D2) {
83 D2 = NULL;
84 }
89
90 init_DB_level(*D1, level - 1, verbose_level - 1);
92
93 init_DB_level(*D2, level, verbose_level - 1);
95
96 D1->open(0/*verbose_level - 1*/);
97 D2->open(0/*verbose_level - 1*/);
98
99 fp_ge1 = new ifstream(fname_ge1, ios::binary);
100 fp_ge2 = new ifstream(fname_ge2, ios::binary);
101 //fp_ge1 = fopen(fname_ge1, "r");
102 //fp_ge2 = fopen(fname_ge2, "r");
103}
104
105void isomorph::close_level_database(int verbose_level)
106// Closes D1, D2, fp_ge1, fp_ge2.
107{
108 int f_v = (verbose_level >= 1);
109
110 if (f_v) {
111 cout << "isomorph::close_level_database" << endl;
112 }
113 D1->close(0/*verbose_level - 1*/);
114 D2->close(0/*verbose_level - 1*/);
115 freeobject(D1);
116 freeobject(D2);
117 D1 = NULL;
118 D2 = NULL;
119 delete fp_ge1;
120 delete fp_ge2;
121 //fclose(fp_ge1);
122 //fclose(fp_ge2);
123 fp_ge1 = NULL;
124 fp_ge2 = NULL;
125}
126
127void isomorph::prepare_database_access(int cur_level, int verbose_level)
128// sets DB_level to be D1 or D2, depending on cur_level
129// Called from make_set_smaller_database
130// and load_strong_generators
131// and trace_next_point_database
132{
133 int f_v = (verbose_level >= 1);
134
135 if (f_v) {
136 cout << "isomorph::prepare_database_access "
137 "cur_level=" << cur_level << endl;
138 }
139 if (cur_level == level - 1) {
140 //first_node = gen->first_poset_orbit_node_at_level[level - 1];
141 DB_level = D1;
142 fp_ge = fp_ge1;
143 }
144 else if (cur_level == level) {
145 //first_node = gen->first_poset_orbit_node_at_level[level];
146 DB_level = D2;
147 fp_ge = fp_ge2;
148 }
149 else {
150 cout << "iso_node " << iso_nodes
151 << " isomorph::prepare_database_access "
152 "cur_level = " << cur_level << endl;
153 exit(1);
154 }
155}
156
157void isomorph::init_DB_sol(int verbose_level)
158// We assume that the starter is of size 'level' and that
159// fields 4,..., 4+level-1 are the starter values
160{
161 int f_v = (verbose_level >= 1);
163 layer2_discreta::btree B1, B2, B3, B4;
164 int f_compress = TRUE;
165 int f_duplicatekeys = TRUE;
166 int i;
167
168 if (f_v) {
169 cout << "isomorph::init_DB_sol" << endl;
170 }
171 //cout << "isomorph::init_DB_sol before D.init" << endl;
172 D.init(fname_db1.c_str(), layer2_discreta::VECTOR, f_compress);
173
174
175 //cout << "isomorph::init_DB_sol before B1.init" << endl;
176 B1.init(fname_db2.c_str(), f_duplicatekeys, 0 /* btree_idx */);
177 B1.add_key_int4(0, 0);
178 // the index of the starter
179 B1.add_key_int4(1, 0);
180 // the number of this solution within the solutions
181 // of the same starter
182 D.btree_access().append(B1);
183
184
185 //cout << "isomorph::init_DB_sol before B2.init" << endl;
186 B2.init(fname_db3.c_str(), f_duplicatekeys, 1 /* btree_idx */);
187 // entries 4, 5, ... 4 + level - 1 are the starter values
188 for (i = 0; i < level; i++) {
189 B2.add_key_int4(4 + i, 0);
190 }
191 //B2.add_key_int4(3, 0);
192 //B2.add_key_int4(4, 0);
193 //B2.add_key_int4(5, 0);
194 //B2.add_key_int4(6, 0);
195 //B2.add_key_int4(7, 0);
196 //B2.add_key_int4(8, 0);
197 D.btree_access().append(B2);
198
199
200 //cout << "isomorph::init_DB_sol before B3.init" << endl;
201 B3.init(fname_db4.c_str(), f_duplicatekeys, 2 /* btree_idx */);
202 B3.add_key_int4(2, 0);
203 // the id
204 D.btree_access().append(B3);
205
206
207 B4.init(fname_db5.c_str(), f_duplicatekeys, 3 /* btree_idx */);
208 B4.add_key_int4(0, 0);
209 // the index of the starter
210 B4.add_key_int4(3, 0);
211 // the hash value
212 D.btree_access().append(B4);
213
214
215 //cout << "isomorph::init_DB_sol done" << endl;
216}
217
219 int nb, int id, int no, int nb_solutions, int h, uint_4 &datref,
220 int print_mod, int verbose_level)
221{
222 int f_vvv = (verbose_level >= 3);
224 int j;
225
226 //h = int_vec_hash_after_sorting(data + 1, size);
227 v.m_l_n(4 + size);
228 v.m_ii(0, data[0]); // starter number
229 v.m_ii(1, nb); // solution number within this starter
230 v.m_ii(2, id); // global solution number
231 v.m_ii(3, h); // the hash number
232 for (j = 0; j < size; j++) {
233 v.m_ii(4 + j, data[1 + j]);
234 }
235 if (f_vvv || ((no % print_mod) == 0)) {
236 cout << "Solution no " << no << " / " << nb_solutions
237 << " starter case " << data[0] << " nb " << nb
238 << " id=" << id << " : " << v << " : " << endl;
239 }
240
241 DB_sol->add_object_return_datref(v, datref, 0/*verbose_level - 3*/);
242 if (f_vvv) {
243 cout << "solution added" << endl;
244 }
245}
246
247void isomorph::load_solution(int id, long int *data)
248{
249 int i, j, datref;
251 //int verbose_level = 0;
252
254 for (j = 0; j < size; j++) {
255 data[j] = table_of_solutions[id * size + j];
256 }
257 return;
258 }
259 //DB_sol->get_object_by_unique_int4(2, id, v, verbose_level);
260 datref = id_to_datref[id];
261 DB_sol->get_object((uint_4) datref, v, 0/*verbose_level*/);
262
263 //cout << v << endl;
264 for (i = 0; i < size; i++) {
265 data[i] = v.s_ii(4 + i);
266 }
267}
268
270 int btree_idx, int idx, int &id, long int *data)
271{
272 //int i;
274
275 cout << "isomorph::load_solution_by_btree" << endl;
276 exit(1);
277#if 0
278 DB_sol->ith_object(idx, btree_idx, v, 0 /*verbose_level*/);
279 for (i = 0; i < size; i++) {
280 data[i] = v.s_ii(4 + i);
281 }
282 id = v.s_ii(2);
283#endif
284}
285
286
287
289 long int *set, int case_nb, int &idx, int verbose_level)
290// case_nb is the starter that is associated with the given set.
291// We wish to find out if the set is a solution that has been stored
292// with that starter.
293// If so, we wish to determine the number of that solution amongst all
294// solutions for that starter (returned in idx).
295// Otherwise, we return FALSE.
296
297// returns TRUE if found, FALSE otherwise
298// Called from identify_solution
299// Linear search through all solutions at a given starter.
300// calls load solution for each of the solutions
301// stored with the case and compares the vectors.
302{
303 int f_v = (verbose_level >= 1);
304
305 if (f_v) {
306 cout << "isomorph::find_extension_easy "
307 "case_nb=" << case_nb << endl;
308 }
309#if 0
310 int ret1, idx1;
311 int ret2, idx2;
312 ret1 = find_extension_easy_old(D, set, case_nb, idx1, verbose_level);
313 if (f_v) {
314 cout << "isomorph::find_extension_easy idx1=" << idx1 << endl;
315 }
316 ret2 = find_extension_easy_new(D, set, case_nb, idx2, verbose_level);
317 if (f_v) {
318 cout << "isomorph::find_extension_easy idx2=" << idx2 << endl;
319 }
320 if (ret1 != ret2) {
321 cout << "isomorph::find_extension_easy ret1 != ret2" << endl;
322 exit(1);
323 }
324 if (ret1 && (idx1 != idx2)) {
325 cout << "isomorph::find_extension_easy "
326 "ret1 && (idx1 != idx2)" << endl;
327 exit(1);
328 }
329 idx = idx1;
330 return ret1;
331#else
332 int ret;
333 ret = find_extension_easy_new(set, case_nb, idx, verbose_level);
334 return ret;
335#endif
336}
337
339 int first, int len, int &idx,
340 int f_btree_idx, int btree_idx,
341 int f_through_hash, int verbose_level)
342{
343 long int *data = find_extension_set1;
344 int i, id = 0;
346
347 for (i = 0; i < len; i++) {
348 if (f_btree_idx) {
349 load_solution_by_btree(btree_idx, first + i, id, data);
350 }
351 else {
352 if (f_through_hash) {
353 id = hash_vs_id_id[first + i];
354 }
355 else {
356 id = first + i;
357 }
358 load_solution(id, data);
359 }
360 Sorting.lint_vec_heapsort(data + level, size - level);
361 if (Sorting.lint_vec_compare(set + level, data + level, size - level) == 0) {
362 break;
363 }
364 }
365 if (i == len) {
366 return FALSE;
367 //cout << "isomorph::find_extension_search_interval "
368 //"did not find extension" << endl;
369 //exit(1);
370 }
371 idx = id;
372 return TRUE;
373}
374
376 int case_nb, int &idx, int verbose_level)
377{
378 int f_v = (verbose_level >= 1);
379 int first, len, ret;
381
382 if (f_v) {
383 cout << "isomorph::find_extension_easy_old" << endl;
384 cout << "case_nb=" << case_nb << endl;
385 }
386 Sorting.lint_vec_heapsort(set + level, size - level);
387 first = solution_first[case_nb];
388 len = solution_len[case_nb];
390 first, len, idx, FALSE, 0, FALSE, verbose_level);
391 if (f_v) {
392 if (ret) {
393 cout << "isomorph::find_extension_easy_old "
394 "solution found at idx=" << idx << endl;
395 }
396 else {
397 cout << "isomorph::find_extension_easy_old "
398 "solution not found" << endl;
399 }
400 }
401 return ret;
402}
403
405 int case_nb, int &idx, int verbose_level)
406{
407 int f_v = (verbose_level >= 1);
408 //int f_vv = FALSE; // (verbose_level >= 2);
409 int ret;
410 int f_found, first, idx2, len;
412
413 if (f_v) {
414 cout << "isomorph::find_extension_easy_new" << endl;
415 }
416 Sorting.lint_vec_heapsort(set + level, size - level);
417
418 int h;
420
421 h = Data.lint_vec_hash_after_sorting(set, size);
422 if (f_v) {
423 cout << "isomorph::find_extension_easy_new h=" << h << endl;
424 }
425
426
427 if (f_v) {
428 cout << "isomorph::find_extension_easy_new before "
429 "int_vec_search_first_occurence(h)" << endl;
430 }
432 N, h, first, 0 /*verbose_level*/);
433 if (f_v) {
434 cout << "isomorph::find_extension_easy_new after "
435 "int_vec_search_first_occurence(h) f_found=" << f_found << endl;
436 }
437
438 if (!f_found) {
439 ret = FALSE;
440 goto finish;
441 }
442 if (f_v) {
443 cout << "isomorph::find_extension_easy_new before "
444 "int_vec_search_first_occurence(h + 1) h+1=" << h + 1 << endl;
445 }
447 N, h + 1, idx2, 0 /*verbose_level*/);
448 if (f_v) {
449 cout << "isomorph::find_extension_easy_new after "
450 "int_vec_search_first_occurence(h+1) f_found=" << f_found << endl;
451 }
452 len = idx2 - first;
453 if (f_v) {
454 cout << "isomorph::find_extension_easy_new len=" << len << endl;
455 }
456#if 0
457
458 if (f_vv) {
459 cout << "case_nb=" << case_nb << " h=" << h << endl;
460 }
461 btree &B4 = DB_sol->btree_access_i(3);
462 //int l0 = case_nb;
463 //int u0 = case_nb;
464 //int l1 = h;
465 //int u1 = h + 1;
466 int first, last, len;
467 int f_found1, f_found2;
468 f_found1 = B4.search_int4_int4(case_nb, h, first,
469 0 /*verbose_level */);
470
471#if 0
472 B4.search_interval_int4_int4(l0, u0,
473 l1, u1,
474 first, len,
475 3 /*verbose_level*/);
476#endif
477 if (f_vv) {
478 cout << "f_found1=" << f_found1 << " first=" << first << endl;
479 }
480 f_found2 = B4.search_int4_int4(case_nb, h + 1, last,
481 0 /*verbose_level */);
482 if (f_vv) {
483 cout << "f_found2=" << f_found2 << " last=" << last << endl;
484 }
485 len = last - first + 1;
486#endif
487
488 if (len == 0) {
489 ret = FALSE;
490 }
491 else {
492 if (f_v) {
493 cout << "isomorph::find_extension_easy_new before "
494 "find_extension_search_interval" << endl;
495 }
497 first, len, idx, FALSE, 3, TRUE, 0 /*verbose_level*/);
498 if (f_v) {
499 cout << "isomorph::find_extension_easy_new after "
500 "find_extension_search_interval ret=" << ret << endl;
501 }
502 }
503
504finish:
505
506
507 if (f_v) {
508 if (ret) {
509 cout << "isomorph::find_extension_easy_new "
510 "solution found at idx=" << idx << endl;
511 }
512 else {
513 cout << "isomorph::find_extension_easy_new "
514 "solution not found" << endl;
515 }
516 }
517 return ret;
518
519}
520
522 int *transporter,
523 int f_implicit_fusion, int verbose_level)
524{
525 int f_v = (verbose_level >= 1);
526 int r;
527 int f_failure_to_find_point;
528
529 if (f_v) {
530 cout << "isomorph::open_database_and_identify_object" << endl;
531 }
532
533 setup_and_open_solution_database(0/*verbose_level - 1*/);
534 setup_and_open_level_database(0/*verbose_level - 1*/);
535
537 f_implicit_fusion, f_failure_to_find_point, verbose_level - 2);
538
539 if (f_failure_to_find_point) {
540 cout << "isomorph::open_database_and_identify_object: "
541 "f_failure_to_find_point" << endl;
542 r = -1;
543 }
544
545 else {
546 if (f_v) {
547 cout << "isomorph::open_database_and_identify_object: "
548 "object identified as belonging to isomorphism class "
549 << r << endl;
550 }
551 }
552
553 close_solution_database(0/*verbose_level - 1*/);
554 close_level_database(0/*verbose_level - 1*/);
555 if (f_v) {
556 cout << "isomorph::open_database_and_identify_object done" << endl;
557 }
558 return r;
559}
560
561
562
564 int level, int verbose_level)
565{
566 int f_v = (verbose_level >= 1);
568 int f_compress = TRUE;
569 int f_duplicatekeys = TRUE;
570 int i;
571 char str[1000];
572
573 if (f_v) {
574 cout << "isomorph::init_DB_level level=" << level << endl;
575 }
576
577 fname_db_level.assign(prefix);
578 sprintf(str, "starter_lvl_%d.db", level);
579 fname_db_level.append(str);
580
581
582 //sprintf(fname_db_level, "%sstarter_lvl_%d.db", prefix, level);
583
585 sprintf(str, "starter_lvl_%d_a.idx", level);
586 fname_db_level_idx1.append(str);
587
588 //sprintf(fname_db_level_idx1, "%sstarter_lvl_%d_a.idx", prefix, level);
589
591 sprintf(str, "starter_lvl_%d_b.idx", level);
592 fname_db_level_idx2.append(str);
593
594 //sprintf(fname_db_level_idx2, "%sstarter_lvl_%d_b.idx", prefix, level);
595
597 sprintf(str, "starter_lvl_%d_ge.bin", level);
598 fname_db_level_ge.append(str);
599
600
601 //sprintf(fname_db_level_ge, "%sstarter_lvl_%d_ge.bin", prefix, level);
602
603 D.init(fname_db_level.c_str(), layer2_discreta::VECTOR, f_compress);
604
605 B1.init(fname_db_level_idx1.c_str(), f_duplicatekeys, 0 /* btree_idx */);
606 B1.add_key_int4(0, 0);
607 D.btree_access().append(B1);
608
609 B2.init(fname_db_level_idx2.c_str(), f_duplicatekeys, 1 /* btree_idx */);
610 // 2 up to 2+level-1 are the values of the starter (of size level)
611 for (i = 0; i < level; i++) {
612 B2.add_key_int4(2 + i, 0);
613 }
614 D.btree_access().append(B2);
615}
616
617void isomorph::create_level_database(int level, int verbose_level)
618{
619 int f_v = (verbose_level >= 1);
620 int f_vv = FALSE;//(verbose_level >= 2);
621 //int f_vvv = (verbose_level >= 3);
622 int f, nb_nodes, I, J, i, j, idx, print_mod = 1;
624 long int set1[1000];
625 long int set2[1000];
626 //char *elt;
628
629 if (f_v) {
630 cout << "isomorph::create_level_database "
631 "level = " << level << endl;
632 cout << "verbose_level=" << verbose_level << endl;
633 }
634
636 nb_nodes = gen->nb_orbits_at_level(level);
637
638 if (f_vv) {
639 cout << "f=" << f << endl;
640 cout << "nb_nodes=" << nb_nodes << endl;
641 }
642
644 //FILE *fp;
645 int cnt = 0;
646
647 //elt = NEW_char(gen->A->coded_elt_size_in_char);
648
649 init_DB_level(D, level, verbose_level - 1);
650
651 D.create(0/*verbose_level - 1*/);
652 //fp = fopen(fname_db_level_ge, "wb");
653 {
654 ofstream fp(fname_db_level_ge, ios::binary);
655
656 //if (nb_nodes > 10000) {
657 print_mod = 1000;
658 //}
659 for (i = 0; i < nb_nodes; i++) {
660 I = f + i;
661 O = gen->get_node(I);
662 O->store_set_to(gen, level - 1, set1);
663 if (f_v && ((i % print_mod) == 0)) {
664 cout << "isomorph::create_level_database level "
665 << level << " i=" << i << " / " << nb_nodes
666 << " set=";
667 Lint_vec_print(cout, set1, level);
668 cout << endl;
669 }
670
671 int len, nb_fusion;
673
674
675 // # ints description
676 // 1 global ID
677 // 1 ancestor global ID
678 // level the set itself
679 // 1 # strong generators
680 // A->base_len: tl (only if # strong generators is != 0)
681 // 1 nb_extensions
682 // for each extension:
683 // 1 pt
684 // 1 orbit_len
685 // 1 type
686 // 1 global ID of descendant node
687 // (if type == 1 EXTENSION or type == 2 FUSION)
688
689 // and finally:
690 // 1 ref of first group element
691 // (altogether, we are storing
692 // # strong_generators +
693 // # fusion nodes
694 // group elements.
695 // they have refs d, d+1,...
696
697
698 // A->coded_elt_size_in_char
699
700
701 nb_fusion = 0;
702 for (j = 0; j < O->get_nb_of_extensions(); j++) {
703 if (O->get_E(j)->get_type() == EXTENSION_TYPE_FUSION) {
704 nb_fusion++;
705 }
706 }
707
708 len = 1 + 1 + level + 1;
709 if (O->get_nb_strong_generators()) {
710 len += gen->get_A()->base_len();
711 }
712 len += 1;
713 len += 4 * O->get_nb_of_extensions();
714 len += 1; // for the reference of the first group element
715 //len += O->nb_strong_generators;
716 //len += nb_fusion;
717
718 v.m_l_n(len);
719 idx = 0;
720 v.m_ii(idx++, I);
721 v.m_ii(idx++, O->get_prev());
722 for (j = 0; j < level; j++) {
723 v.m_ii(idx++, set1[j]);
724 }
725 v.m_ii(idx++, O->get_nb_strong_generators());
726 if (O->get_nb_strong_generators()) {
727 for (j = 0; j < gen->get_A()->base_len(); j++) {
728 v.m_ii(idx++, O->get_tl(j));
729 }
730 }
731 v.m_ii(idx++, O->get_nb_of_extensions());
732 for (j = 0; j < O->get_nb_of_extensions(); j++) {
733 v.m_ii(idx++, O->get_E(j)->get_pt());
734 set1[level] = O->get_E(j)->get_pt();
735 v.m_ii(idx++, O->get_E(j)->get_orbit_len());
736 v.m_ii(idx++, O->get_E(j)->get_type());
737 if (O->get_E(j)->get_type() == EXTENSION_TYPE_EXTENSION) {
738 v.m_ii(idx++, O->get_E(j)->get_data());
739 }
740 else if (O->get_E(j)->get_type() == EXTENSION_TYPE_FUSION) {
742
743
744 gen->get_A2()->map_a_set(set1, set2, level + 1, gen->get_Elt1(), 0);
745 Sorting.lint_vec_heapsort(set2, level + 1);
746
747 if (f_vv /*f_vv && (i % print_mod) == 0*/) {
748 cout << "mapping ";
749 Lint_vec_print(cout, set1, level + 1);
750 cout << " to ";
751 Lint_vec_print(cout, set2, level + 1);
752 cout << endl;
753 }
754
755
757 set2, FALSE /* f_tolerant */, 0);
758 v.m_ii(idx++, J);
759 }
760 else {
761 cout << "unknown type " << O->get_E(j)->get_type()
762 << " i=" << i << " j=" << j << endl;
763 exit(1);
764 }
765 }
766#if 0
767 int len_mem, h, idx1;
768 char *mem;
769 if (idx != len - 1) {
770 cout << "idx != len - 1, idx=" << idx << " len=" << len
771 << " i=" << i << " j=" << j << endl;
772 exit(1);
773 }
774 len_mem = (O->nb_strong_generators + nb_fusion) *
775 gen->A->coded_elt_size_in_char;
776 mem = NEW_char(len_mem);
777 idx1 = 0;
778 for (j = 0; j < O->nb_strong_generators; j++) {
779 gen->A->element_retrieve(O->hdl_strong_generators[j],
780 gen->Elt1, FALSE);
781 gen->A->element_pack(gen->Elt1, elt, FALSE);
782 for (h = 0; h < gen->A->coded_elt_size_in_char; h++) {
783 mem[idx1++] = elt[h];
784 }
785 }
786 for (j = 0; j < O->nb_extensions; j++) {
787 if (O->E[j].type == 1)
788 continue;
789 gen->A->element_retrieve(O->E[j].data, gen->Elt1, FALSE);
790 gen->A->element_pack(gen->Elt1, elt, FALSE);
791 for (h = 0; h < gen->A->coded_elt_size_in_char; h++) {
792 mem[idx1++] = elt[h];
793 }
794 }
795 if (idx1 != len_mem) {
796 cout << "idx1 != len_mem idx=" << idx << " len_mem=" << len_mem
797 << " i=" << i << " j=" << j << endl;
798 exit(1);
799 }
800 memory M;
801
802 M.init(len_mem, mem);
803 M.swap(v.s_i(idx));
804#else
805 v.m_ii(idx++, cnt);
806
807 std::vector<int> gen_hdl;
808
809 O->get_strong_generators_handle(gen_hdl, verbose_level);
810
811
812 for (j = 0; j < gen_hdl.size(); j++) {
814 gen_hdl[j], gen->get_Elt1(),
815 FALSE);
817 0/* verbose_level*/);
818 cnt++;
819 }
820 for (j = 0; j < O->get_nb_of_extensions(); j++) {
821 if (O->get_E(j)->get_type() == EXTENSION_TYPE_EXTENSION) {
822 continue;
823 }
826 0/* verbose_level*/);
827 cnt++;
828 }
829 if (idx != len) {
830 cout << "idx != len, idx=" << idx << " len=" << len << endl;
831 exit(1);
832 }
833#endif
834
835
836 D.add_object(v, 0 /*verbose_level - 2*/);
837 if (f_v && ((i % print_mod) == 0)) {
838 cout << "object " << i << " / " << nb_nodes << " added : ";
839 int sz;
840 sz = v.csf();
841 cout << "size on file = " << sz << ", group element "
842 "counter = " << cnt << endl;
843 }
844 }
845
846
847 //fclose(fp);
848
849 }
850
851 D.close(0/*verbose_level - 1*/);
852
854 if (f_v) {
855 cout << "number of group elements in " << fname_db_level_ge
856 << " is " << cnt << endl;
857 cout << "file size is " << Fio.file_size(fname_db_level_ge) << endl;
858 cout << "gen->A->coded_elt_size_in_char="
859 << gen->get_A()->coded_elt_size_in_char << endl;
860 }
861
862 //FREE_char(elt);
863
864}
865
867 int cur_node_local,
870 int verbose_level)
871// Called from compute_stabilizer and from orbit_representative
872{
873 int f_v = (verbose_level >= 1);
874 int f_vv = (verbose_level >= 2);
875 int f_v5 = (verbose_level >= 5);
876
877 if (f_v) {
878 cout << "isomorph::load_strong_generators "
879 "cur_level=" << cur_level << " cur_node_local="
880 << cur_node_local << endl;
881 }
883 if (f_vv) {
884 cout << "isomorph::load_strong_generators "
885 "using database" << endl;
886 }
887 load_strong_generators_database(cur_level, cur_node_local,
888 gens, go, verbose_level);
889 if (f_v5) {
890 cout << "isomorph::load_strong_generators "
891 "found the following strong generators:" << endl;
892 gens.print(cout);
893 }
894 }
895 else {
896 load_strong_generators_oracle(cur_level, cur_node_local,
897 gens, go, verbose_level);
898 }
899}
900
902 int cur_node_local,
905 int verbose_level)
906{
907 int f_v = (verbose_level >= 1);
909 int i, node;
910 //longinteger_domain Dom;
911
912 if (f_v) {
913 cout << "isomorph::load_strong_generators_oracle "
914 "cur_level=" << cur_level << " cur_node_local="
915 << cur_node_local << endl;
916 }
917
918 node = gen->first_node_at_level(cur_level) + cur_node_local;
919 O = gen->get_node(node);
920
921
922 std::vector<int> gen_hdl;
923
924 O->get_strong_generators_handle(gen_hdl, verbose_level);
925
926
927
928#if 0
929 if (O->nb_strong_generators == 0) {
930 gens.init(gen->get_A(), verbose_level - 2);
931 gens.allocate(0, verbose_level - 2);
932 go.create(1, __FILE__, __LINE__);
933 goto finish;
934 }
935 int *tl;
936 tl = NEW_int(gen->get_A()->base_len());
937 for (i = 0; i < gen->get_A()->base_len(); i++) {
938 tl[i] = O->get_tl(i);
939 }
940
941 Dom.multiply_up(go, tl, gen->get_A()->base_len(), 0 /* verbose_level */);
942
943 FREE_int(tl);
944#else
946#endif
947
948 gens.init(gen->get_A(), verbose_level - 2);
949 gens.allocate(gen_hdl.size(), verbose_level - 2);
950
951 for (i = 0; i < gen_hdl.size(); i++) {
953 gen_hdl[i],
954 gens.ith(i), FALSE);
955 }
956//finish:
957 if (f_v) {
958 cout << "isomorph::load_strong_generators_oracle "
959 "cur_level=" << cur_level << " cur_node_local="
960 << cur_node_local << " done" << endl;
961 }
962}
963
965 int cur_node_local,
968 int verbose_level)
969// Reads node cur_node (global index) from database D through btree 0
970// Reads generators from file fp_ge
971{
972 int f_v = (verbose_level >= 1);
973 int f_vv = (verbose_level >= 2);
974 int f_vvv = (verbose_level >= 3);
975 int *tmp_ELT;
977 int i;
978 int set[1000];
979 int *tl;
981
982
983 if (f_v) {
984 cout << "isomorph::load_strong_generators_database "
985 "cur_level=" << cur_level << " cur_node_local="
986 << cur_node_local << endl;
987 }
988
989 prepare_database_access(cur_level, verbose_level);
990
991 tmp_ELT = NEW_int(gen->get_A()->elt_size_in_int);
992
993 //cur_node_local = cur_node - first_node;
994 if (f_v) {
995 cout << "isomorph::load_strong_generators_database "
996 "loading object " << cur_node_local << endl;
997 }
998 DB_level->ith_object(cur_node_local, 0/* btree_idx*/, v,
999 0 /*MINIMUM(1, verbose_level - 2)*/);
1000
1001 if (f_vvv) {
1002 cout << "isomorph::load_strong_generators_database "
1003 "v=" << v << endl;
1004 }
1005 for (i = 0; i < cur_level; i++) {
1006 set[i] = v.s_ii(2 + i);
1007 }
1008 if (f_vv) {
1009 cout << "isomorph::load_strong_generators_database set: ";
1010 Int_vec_print(cout, set, cur_level);
1011 cout << endl;
1012 }
1013 int nb_strong_generators;
1014 int pos, ref;
1015 pos = 2 + cur_level;
1016 nb_strong_generators = v.s_ii(pos++);
1017 if (f_vv) {
1018 cout << "isomorph::load_strong_generators_database "
1019 "nb_strong_generators="
1020 << nb_strong_generators << endl;
1021 }
1022 if (nb_strong_generators == 0) {
1023 gens.init(gen->get_A(), verbose_level - 2);
1024 gens.allocate(0, verbose_level - 2);
1025 go.create(1, __FILE__, __LINE__);
1026 goto finish;
1027 }
1028 tl = NEW_int(gen->get_A()->base_len());
1029 for (i = 0; i < gen->get_A()->base_len(); i++) {
1030 tl[i] = v.s_ii(pos++);
1031 }
1032 Dom.multiply_up(go, tl, gen->get_A()->base_len(), 0 /* verbose_level */);
1033 FREE_int(tl);
1034 pos = v.s_l() - 1;
1035 ref = v.s_ii(pos++);
1036 if (f_vv) {
1037 cout << "isomorph::load_strong_generators_database "
1038 "ref = " << ref << endl;
1039 }
1040
1041 gens.init(gen->get_A(), verbose_level - 2);
1042 gens.allocate(nb_strong_generators, verbose_level - 2);
1043
1044 //fseek(fp_ge, ref * gen->Poset->A->coded_elt_size_in_char, SEEK_SET);
1045 fp_ge->seekg(ref * gen->get_A()->coded_elt_size_in_char, ios::beg);
1046 for (i = 0; i < nb_strong_generators; i++) {
1047 gen->get_A()->element_read_file_fp(gens.ith(i), *fp_ge,
1048 0/* verbose_level*/);
1049 }
1050finish:
1051 FREE_int(tmp_ELT);
1052
1053 if (f_v) {
1054 cout << "isomorph::load_strong_generators_database "
1055 "cur_level=" << cur_level << " cur_node_local="
1056 << cur_node_local << " done" << endl;
1057 }
1058
1059}
1060
1061
1062}}
1063
1064
a catch-all container class for everything related to data structures
a collection of functions related to sorted vectors
int int_vec_search_first_occurence(int *v, int len, int a, int &idx, int verbose_level)
Definition: sorting.cpp:1314
int lint_vec_compare(long int *p, long int *q, int len)
Definition: sorting.cpp:2326
domain to compute with objects of type longinteger
Definition: ring_theory.h:240
void multiply_up(longinteger_object &a, int *x, int len, int verbose_level)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
void create(long int i, const char *file, int line)
DISCRETA vector class for vectors of DISCRETA objects.
Definition: discreta.h:797
Vector & append(discreta_base &x)
Definition: vector.cpp:400
discreta_base & s_i(int i)
Definition: vector.cpp:202
void m_ii(int i, int a)
Definition: discreta.h:824
DISCRETA class for a database.
Definition: discreta.h:1672
void search_interval_int4_int4(int l0, int u0, int l1, int u1, int &first, int &len, int verbose_level)
Definition: btree.cpp:666
void add_key_int4(int field1, int field2)
Definition: btree.cpp:241
void init(const char *file_name, int f_duplicatekeys, int btree_idx)
Definition: btree.cpp:221
int search_int4_int4(int data1, int data2, int &idx, int verbose_level)
Definition: btree.cpp:783
DISCRETA class for a database.
Definition: discreta.h:1525
void close(int verbose_level)
Definition: database.cpp:142
void add_object_return_datref(Vector &the_object, uint_4 &datref, int verbose_level)
Definition: database.cpp:256
void add_object(Vector &the_object, int verbose_level)
Definition: database.cpp:325
void open(int verbose_level)
Definition: database.cpp:128
void create(int verbose_level)
Definition: database.cpp:105
void get_object(uint_4 datref, Vector &the_object, int verbose_level)
Definition: database.cpp:374
void ith_object(int i, int btree_idx, Vector &the_object, int verbose_level)
Definition: database.cpp:547
void init(const char *filename, int objectkind, int f_compress)
Definition: database.cpp:84
void swap(discreta_base &a)
Definition: base.cpp:179
DISCRETA class to serialize data structures.
Definition: discreta.h:582
void init(int length, char *d)
Definition: memory.cpp:138
void element_retrieve(int hdl, void *elt, int verbose_level)
Definition: action_cb.cpp:301
void map_a_set(long int *set, long int *image_set, int n, int *Elt, int verbose_level)
Definition: action.cpp:668
void element_write_file_fp(int *Elt, std::ofstream &fp, int verbose_level)
Definition: action_cb.cpp:587
void element_read_file_fp(int *Elt, std::ifstream &fp, int verbose_level)
Definition: action_cb.cpp:604
void init(actions::action *A, int verbose_level)
Definition: vector_ge.cpp:55
void add_solution_to_database(long int *data, int nb, int id, int no, int nb_solutions, int h, uint_4 &datref, int print_mod, int verbose_level)
int find_extension_easy_new(long int *set, int case_nb, int &idx, int verbose_level)
void setup_and_open_solution_database(int verbose_level)
int identify_solution(long int *set, int *transporter, int f_implicit_fusion, int &f_failure_to_find_point, int verbose_level)
int find_extension_search_interval(long int *set, int first, int len, int &idx, int f_btree_idx, int btree_idx, int f_through_hash, int verbose_level)
void load_strong_generators_database(int cur_level, int cur_node_local, data_structures_groups::vector_ge &gens, ring_theory::longinteger_object &go, int verbose_level)
void load_solution(int id, long int *data)
int find_extension_easy(long int *set, int case_nb, int &idx, int verbose_level)
void load_strong_generators(int cur_level, int cur_node_local, data_structures_groups::vector_ge &gens, ring_theory::longinteger_object &go, int verbose_level)
poset_classification::poset_classification * gen
Definition: isomorph.h:122
void setup_and_open_level_database(int verbose_level)
void prepare_database_access(int cur_level, int verbose_level)
void setup_and_create_solution_database(int verbose_level)
void create_level_database(int level, int verbose_level)
void load_solution_by_btree(int btree_idx, int idx, int &id, long int *data)
void init_DB_level(layer2_discreta::database &D, int level, int verbose_level)
void load_strong_generators_oracle(int cur_level, int cur_node_local, data_structures_groups::vector_ge &gens, ring_theory::longinteger_object &go, int verbose_level)
int find_extension_easy_old(long int *set, int case_nb, int &idx, int verbose_level)
int open_database_and_identify_object(long int *set, int *transporter, int f_implicit_fusion, int verbose_level)
int find_poset_orbit_node_for_set(int len, long int *set, int f_tolerant, int verbose_level)
to represent one poset orbit; related to the class poset_classification
void get_tl(std::vector< int > &tl, poset_classification *PC, int verbose_level)
void get_strong_generators_handle(std::vector< int > &gen_hdl, int verbose_level)
void get_stabilizer_order(poset_classification *gen, ring_theory::longinteger_object &go)
void store_set_to(poset_classification *gen, int i, long int *to)
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_char(n)
Definition: foundations.h:632
#define Lint_vec_print(A, B, C)
Definition: foundations.h:686
#define NEW_int(n)
Definition: foundations.h:625
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
unsigned int uint_4
Definition: foundations.h:184
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
void freeobject(discreta_base *p)
Definition: global.cpp:89
discreta_base * callocobject(kind k)
Definition: global.cpp:81
the orbiter library for the classification of combinatorial objects
#define EXTENSION_TYPE_FUSION
#define EXTENSION_TYPE_EXTENSION