Orbiter 2022
Combinatorial Objects
geo_parameter.cpp
Go to the documentation of this file.
1// geo_parameter.cpp
2// Anton Betten
3//
4// started: May 6, 2008
5
6#include "foundations.h"
7
8using namespace std;
9
10
11namespace orbiter {
12namespace layer1_foundations {
13namespace combinatorics {
14
15
17{
19 fuse_type = 0;
20 v = 0;
21 b = 0;
22
23 mode = 0;
24 //label;
25
26 nb_V = 0;
27 nb_B = 0;
28 V = NULL;
29 B = NULL;
30 scheme = NULL;
31 fuse = NULL;
32
33 nb_parts = 0;
34 nb_entries = 0;
35
36 part = NULL;
37 entries = NULL;
38 part_nb_alloc = 0;
40
41 lambda_level = 0;
42 row_level = 0;
43 col_level = 0;
46}
47
49{
50 if (V) {
51 FREE_int(V);
52 V = NULL;
53 }
54 if (B) {
55 FREE_int(B);
56 B = NULL;
57 }
58 if (scheme) {
60 scheme = NULL;
61 }
62 if (fuse) {
64 fuse = NULL;
65 }
66 if (part) {
68 part = NULL;
69 }
70 if (entries) {
72 entries = NULL;
73 }
74}
75
77{
78 int nb_alloc;
79
80 if (part == NULL) {
81 nb_alloc = 1000;
82 part = NEW_int(nb_alloc);
83 part_nb_alloc = nb_alloc;
84 nb_parts = 0;
85 }
86 else if (nb_parts == part_nb_alloc) {
87 nb_alloc = nb_parts + 1000;
88 int *new_part, i;
89 new_part = NEW_int(nb_alloc);
90 for (i = 0; i < nb_parts; i++) {
91 new_part[i] = part[i];
92 }
94 part = new_part;
95 part_nb_alloc = nb_alloc;
96 }
97 part[nb_parts++] = a;
98}
99
100void geo_parameter::append_to_entries(int a1, int a2, int a3, int a4)
101{
102 int nb_alloc;
103
104 if (entries == NULL) {
105 nb_alloc = 1000;
106 entries = NEW_int(4 * nb_alloc);
107 entries_nb_alloc = nb_alloc;
108 nb_entries = 0;
109 }
110 else if (nb_entries == entries_nb_alloc) {
111 nb_alloc = nb_entries + 1000;
112 int *new_entries, i;
113 new_entries = NEW_int(4 * nb_alloc);
114 for (i = 0; i < 4 * nb_entries; i++) {
115 new_entries[i] = entries[i];
116 }
118 entries = new_entries;
119 entries_nb_alloc = nb_alloc;
120 }
121 entries[4 * nb_entries + 0] = a1;
122 entries[4 * nb_entries + 1] = a2;
123 entries[4 * nb_entries + 2] = a3;
124 entries[4 * nb_entries + 3] = a4;
125 nb_entries++;
126}
127
128void geo_parameter::write(ofstream &aStream, std::string &label)
129{
130
131 if (mode == MODE_SINGLE) {
132 write_mode_single(aStream, label);
133 }
134 else if (mode == MODE_STACK) {
135 write_mode_stack(aStream, label);
136 }
137 else {
138 cout << "geo_parameter::write unknown mode" << endl;
139 exit(1);
140 }
141}
142
143void geo_parameter::write_mode_single(ofstream &aStream, std::string &label)
144{
145 int i, j, sum, pt_level = -1, bt_level = -1, xy, x, y, z, w;
146
147 aStream << label << " " << v + b << " " << v << " ";
148 sum = V[0];
149 for (i = 1; i < nb_V; i++) {
150 aStream << sum << " ";
151 sum += V[i];
152 }
153 sum = B[0];
154 for (j = 1; j < nb_B; j++) {
155 aStream << v + sum << " ";
156 sum += B[j];
157 }
158 aStream << " -1 ";
161 pt_level = nb_V + nb_B;
162 for (i = 0; i < nb_V; i++) {
163 for (j = 0; j < nb_B; j++) {
164 aStream << pt_level << " "
165 << partition_number_row(i) << " "
166 << partition_number_col(j) << " "
167 << scheme[i * nb_B + j] << " ";
168 }
169 }
170 }
173 bt_level = nb_V + nb_B;
174 for (i = 0; i < nb_V; i++) {
175 for (j = 0; j < nb_B; j++) {
177 w = scheme[i * nb_B + j];
178 }
179 else {
180 x = scheme[i * nb_B + j];
181 y = V[i];
182 z = B[j];
183 xy = x * y;
184 if (xy % z) {
185 cout << "geo_parameter::write_mode_single scheme "
186 "cannot be block tactical in position "
187 << i << "," << j << endl;
188 exit(1);
189 }
190 w = xy / z;
191 }
192 aStream << bt_level << " "
193 << partition_number_col(j) << " "
194 << partition_number_row(i) << " "
195 << w << " ";
196 }
197 }
198 }
199 aStream << " -1 ";
200 int lambda_level = 2;
201 int extra_row_level = -1;
202 int extra_col_level = -1;
203 aStream << pt_level << " " << bt_level << " " << lambda_level << " " <<
204 extra_row_level << " " << extra_col_level << endl;
205}
206
207void geo_parameter::write_mode_stack(ofstream &aStream, std::string &label)
208{
209 int i;
210
211 aStream << label << " ";
212 for (i = 0; i < nb_parts; i++) {
213 aStream << part[i] << " ";
214 }
215 aStream << " -1 ";
216 for (i = 0; i < 4 * nb_entries; i++) {
217 aStream << entries[i] << " ";
218 }
219 aStream << " -1 ";
220 aStream << row_level << " "
221 << col_level << " "
222 << lambda_level << " "
223 << extra_row_level << " "
224 << extra_col_level << endl;
225
226}
227
229{
230 int f_v = (verbose_level >= 1);
231 int i, j, sum, x, y, z, w, xy;
232
233 row_level = -1;
234 col_level = -1;
235 lambda_level = 2;
236 extra_row_level = -1;
237 extra_col_level = -1;
238
239
240 if (f_v) {
241 cout << "geo_parameter::convert_single_to_stack" << endl;
242 cout << "v=" << v << endl;
243 cout << "b=" << b << endl;
244 }
245 nb_parts = 0;
246 nb_entries = 0;
247 append_to_part(v + b);
249 sum = V[0];
250 for (i = 1; i < nb_V; i++) {
251 append_to_part(sum);
252 sum += V[i];
253 }
254 sum = B[0];
255 for (j = 1; j < nb_B; j++) {
256 append_to_part(v + sum);
257 sum += B[j];
258 }
259 if (f_v) {
260 for (i = 0; i < nb_V + nb_B; i++) {
261 cout << part[i] << " ";
262 }
263 cout << endl;
264 }
265 if (f_v) {
266 cout << "decomposition_type=";
268 cout << "POINTTACTICAL" << endl;
269 }
270 else if (decomposition_type == BLOCKTACTICAL) {
271 cout << "BLOCKTACTICAL" << endl;
272 }
274 cout << "POINTANDBLOCKTACTICAL" << endl;
275 }
276
277 }
280 row_level = nb_V + nb_B;
281 for (i = 0; i < nb_V; i++) {
282 for (j = 0; j < nb_B; j++) {
286 scheme[i * nb_B + j]);
287 //entries.push_back(row_level);
288 //entries.push_back(partition_number_row(i));
289 //entries.push_back(partition_number_col(j));
290 //entries.push_back(scheme[i * nb_B + j]);
291 //nb_entries++;
292 }
293 }
294 }
297 col_level = nb_V + nb_B;
298 for (i = 0; i < nb_V; i++) {
299 for (j = 0; j < nb_B; j++) {
301 w = scheme[i * nb_B + j];
302 }
303 else {
304 x = scheme[i * nb_B + j];
305 y = V[i];
306 z = B[j];
307 xy = x * y;
308 if (xy % z) {
309 cout << "geo_parameter::convert_single_to_stack "
310 "scheme cannot be block tactical in "
311 "position " << i << "," << j << endl;
312 exit(1);
313 }
314 w = xy / z;
315 }
319 w);
320 //entries.push_back(col_level);
321 //entries.push_back(partition_number_col(j));
322 //entries.push_back(partition_number_row(i));
323 //entries.push_back(w);
324 //nb_entries++;
325 }
326 }
327 }
329
330
332 //tdo_scheme G;
333
334
337 }
338 else if (decomposition_type == BLOCKTACTICAL) {
340 }
341 else {
342 cout << "while converting to partition stack, "
343 "I cannot figure out which fuse info you meant" << endl;
344 exit(1);
345 }
346 }
347 else if (fuse_type == FUSE_TYPE_DOUBLE) {
348 //tdo_scheme G;
349
350
353 }
354 else if (decomposition_type == BLOCKTACTICAL) {
355 cout << "convert_single_to_stack_fuse_double_bt nyi" << endl;
356 exit(1);
357 //convert_single_to_stack_fuse_double_bt(verbose_level);
358 }
359 else {
360 cout << "while converting to partition stack, "
361 "I cannot figure out which fuse info you meant" << endl;
362 exit(1);
363 }
364 }
365}
366
368{
369 if (row_idx == 0) {
370 return 0;
371 }
372 else {
373 return row_idx + 1;
374 }
375}
376
378{
379 if (col_idx == 0) {
380 return 1;
381 }
382 else {
383 return nb_V + col_idx;
384 }
385}
386
387int geo_parameter::input(ifstream &aStream)
388{
389#ifdef SYSTEMUNIX
390 cout << "geo_parameter::input SYSTEMUNIX" << endl;
391 string str;
392 //Reset();
393 //tTDO::Stream(aStream);
394 aStream.ignore(INT_MAX, '<');
395 aStream >> str;
396 v = 0;
397 b = 0;
398 if (str == "HTDO") {
399 cout << "geo_parameter::input read HTDO, "
400 "before input_mode_single" << endl;
401 return input_mode_single(aStream);
402 }
403 else {
404 cout << "geo_parameter::input str = " << str << endl;
405 return FALSE;
406 }
407#endif
408#ifdef SYSTEMWINDOWS
409 cout << "geo_parameter::input SYSTEMWINDOWS" << endl;
410 cout << "geo_parameter::input has a problem "
411 "under windows"<< endl;
412 exit(1);
413#endif
414 cout << "geo_parameter::input neither SYSTEMUNIX "
415 "nor SYSTEMWINDOWS" << endl;
416 return FALSE;
417}
418
420{
421#ifdef SYSTEMUNIX
422 int i, j, l, val, eqpos;
423 bool brk;
424 string str, mapkey, mapval;
426
427
429 brk = false;
430 label[0] = 0;
431 while (!brk) { // read the header
432 aStream >> str;
433 if (str.substr(str.size() - 1, 1) == ">") {
434 str = str.substr(0, str.size() - 1);
435 brk = true;
436 }
437 eqpos = str.find("=");
438 if (eqpos > 0) {
439 mapkey = str.substr(0, eqpos);
440 mapval = str.substr(eqpos + 1, str.size() - eqpos - 1);
441 if (mapkey == "type") {
442 if (mapval == "pt")
444 else if (mapval == "bt")
446 else if (mapval == "geo")
448 else
450 }
451 else if (mapkey == "ptanz" || mapkey == "nb_V") {
452 nb_V = ST.str2int(mapval);
453 }
454 else if (mapkey == "btanz" || mapkey == "nb_B") {
455 nb_B = ST.str2int(mapval);
456 }
457 else if (mapkey == "fuse") {
458#if 0
459 if (mapval == "tdo")
460 fuse_type = FUSE_TYPE_TDO;
461 else if (mapval == "multi")
462 fuse_type = FUSE_TYPE_MULTI;
463#endif
464 if (mapval == "simple" || mapval == "single")
466 else if (mapval == "double")
468 else {
469 cout << "fuse type not recognized" << endl;
470 exit(1);
471 //fuse_type = FUSE_TYPE_NONE;
472 }
473 }
474 else if (mapkey == "isotest") {
475 //_isotestnecessary=str2bool(mapval);
476 }
477 else if (mapkey == "defekt") {
478 //SetDefekt(str2int(mapval));
479 }
480 else if (mapkey == "id") {
481 l = mapval.size();
482 if (l >= 1000 - 1) {
483 cout << "geo_parameter::input_mode_single "
484 "label too long" << endl;
485 exit(1);
486 }
487 for (i = 0; i < l; i++) {
488 label[i] = mapval[i];
489 }
490 label[l] = 0;
491#if 0
492 ppos = mapval.find_last_of(".");
493 _idadd = mapval.substr(0, ppos + 1);
494 mapval = mapval.substr(ppos + 1, mapval.size() - ppos - 1);
495 _id = str2int(mapval);
496#endif
497 }
498 }
499 brk = brk || aStream.eof();
500 }
501 //cout << "nb_V=" << nb_V << " nb_B=" << nb_B << endl;
502 V = NEW_int(nb_V);
503 B = NEW_int(nb_B);
504 scheme = NEW_int(nb_V * nb_B);
505 fuse = NULL;
507 cout << "decomposition_type needs to be defined"<<endl;
508 exit(1);
509 }
510 if (nb_V == 0) {
511 cout << "nb_V == 0"<<endl;
512 exit(1);
513 }
514 if (nb_B == 0) {
515 cout << "nb_B == 0"<<endl;
516 exit(1);
517 }
518 v = 0;
519 b = 0;
520 for (j = 0; j < nb_B; j++) {
521 //cout << "j=" << j << endl;
522 aStream >> val;
523 //cout << "read " << val << endl;
524 B[j] = val;
525 b += val;
526 }
527 for (i = 0; i < nb_V; i++) {
528 aStream >> val;
529 //cout << "read " << val << endl;
530 V[i] = val;
531 v += val;
532 for (j = 0; j < nb_B; j++) {
533 aStream >> val;
534 //cout << "read " << val << endl;
535 scheme[i * nb_B + j] = val;
536 }
537 }
538 //cout << "after reading scheme" << endl;
539#if 0
540 if (fuse_type == FUSE_TYPE_MULTI) {
541 for (i = 0; i < nb_V; i++) {
542 for (j = 0; j < nb_B; j++) {
543 aStream >> val;
544 //cout << "read " << val << endl;
545 fuse[i * nb_B + j] = val;
546 }
547 }
548 }
549#endif
552 fuse = NEW_int(nb_V);
553 for (i = 0; i < nb_V; i++) {
554 aStream >> val;
555 //cout << "read " << val << endl;
556 fuse[i] = val;
557 }
558 }
559 else if (decomposition_type == BLOCKTACTICAL) {
560 fuse = NEW_int(nb_B);
561 for (i = 0; i < nb_B; i++) {
562 aStream >> val;
563 //cout << "read " << val << endl;
564 fuse[i] = val;
565 }
566 }
567 else {
568 cout << "while reading fuse, I cannot figure out "
569 "which fuse info you meant" << endl;
570 exit(1);
571 }
572 }
573 else if (fuse_type == FUSE_TYPE_DOUBLE) {
575 fuse = NEW_int(4 + 2 * nb_V);
576 for (i = 0; i < 4 + 2 * nb_V; i++) {
577 aStream >> val;
578 //cout << "read " << val << endl;
579 fuse[i] = val;
580 }
581 }
582 else if (decomposition_type == BLOCKTACTICAL) {
583 fuse = NEW_int(4 + 2 * nb_B);
584 for (i = 0; i < 4 + (2 * nb_B); i++) {
585 aStream >> val;
586 //cout << "read " << val << endl;
587 fuse[i] = val;
588 }
589 }
590 else {
591 cout << "while reading fuse, I cannot figure out "
592 "which fuse info you meant" << endl;
593 exit(1);
594 }
595 }
596 //cout << "before ignore" << endl;
597 aStream.ignore(INT_MAX, '>');
598 //cout << "geo_parameter::input_mode_single
599 //v=" << v << " b=" << b << endl;
600#endif
601#ifdef SYSTEMWINDOWS
602 cout << "geo_parameter::input_mode_single "
603 "has a problem under windows" << endl;
604 exit(1);
605#endif
606 return TRUE;
607}
608
610 ifstream &aStream, int verbose_level)
611{
612#if defined(SYSTEMUNIX) || defined(SYSTEM_IS_MACINTOSH)
613 int f_v = (verbose_level >= 1);
614 string str;
615 int i, l, val, v1, v2, v3, v4;
616
617 //part.clear();
618 //entries.clear();
619
620 if (f_v) {
621 cout << "geo_parameter::input_mode_stack" << endl;
622 }
623 aStream >> str;
624 if (str == "-1") {
625 return FALSE;
626 }
627 if (f_v) {
628 cout << "geo_parameter::input_mode_stack "
629 "read \"" << str << "\"" << endl;
630 }
631 l = str.length();
632 if (l >= 1000 - 1) {
633 cout << "geo_parameter::input_mode_stack "
634 "label too long" << endl;
635 exit(1);
636 }
637 for (i = 0; i < l; i++) {
638 label[i] = str[i];
639 }
640 label[l] = 0;
641 if (f_v) {
642 cout << "geo_parameter::input_mode_stack "
643 "label='" << label << "'" << endl;
644 }
645 nb_parts = 0;
646 if (part) {
647 FREE_int(part);
648 part = NULL;
649 }
650 if (f_v) {
651 cout << "geo_parameter::input_mode_stack "
652 "reading part" << endl;
653 }
654 part = NULL;
655 while (TRUE) {
656 aStream >> val;
657 if (val == -1) {
658 append_to_part(val);
659 nb_parts--;
660 //part.push_back(val);
661 break;
662 }
663 append_to_part(val);
664 }
665 if (f_v) {
666 cout << "geo_parameter::input_mode_stack "
667 "reading entries" << endl;
668 }
669 nb_entries = 0;
670 if (entries) {
672 entries = NULL;
673 }
674 entries = NULL;
675 while (TRUE) {
676 aStream >> v1;
677 if (v1 == -1) {
678 break;
679 }
680
681 aStream >> v2;
682
683 aStream >> v3;
684
685 aStream >> v4;
686
687 append_to_entries(v1, v2, v3, v4);
688
689 }
690 if (f_v) {
691 cout << "geo_parameter::input_mode_stack "
692 "reading row_level" << endl;
693 }
694 aStream >> row_level;
695 aStream >> col_level;
696 aStream >> lambda_level;
697 aStream >> extra_row_level;
698 aStream >> extra_col_level;
699 //cout << "nb_parts=" << nb_parts << endl;
700 //cout << "nb_entries=" << nb_entries << endl;
701#endif
702#ifdef SYSTEMWINDOWS
703 cout << "geo_parameter::input_mode_stack has a "
704 "problem under windows" << endl;
705 exit(1);
706#endif
707 if (f_v) {
708 cout << "geo_parameter::input_mode_stack done" << endl;
709 }
710 return TRUE;
711}
712
714{
715 int f_v = (verbose_level >= 1);
716 int i;
717
718 if (f_v) {
719 cout << "geo_parameter::init_tdo_scheme" << endl;
720 cout << "nb_parts=" << nb_parts << endl;
721 cout << "nb_entries=" << nb_entries << endl;
722 }
723 G.part = NEW_int(nb_parts + 1);
724 for (i = 0; i < nb_parts; i++) {
725 G.part[i] = part[i];
726 }
727 G.part[nb_parts] = -1;
729 G.entries = NEW_int(nb_entries * 4 + 1);
730 for (i = 0; i < 4 * nb_entries; i++) {
731 G.entries[i] = entries[i];
732 }
733 G.entries[4 * nb_entries] = -1;
735
741
747
748 if (f_v) {
749 cout << "geo_parameter::init_tdo_scheme "
750 "calling G.init_partition_stack" << endl;
751 }
752 G.init_partition_stack(verbose_level - 5);
753 if (f_v) {
754 cout << "after G.init_partition_stack" << endl;
755 }
756}
757
759{
760 cout << "geo_parameter::print_schemes" << endl;
761 cout << "decomposition " << label << ":" << endl;
763 if (row_level >= 2) {
765 }
766 if (col_level >= 2) {
768 }
769 if (extra_row_level > 2) {
771 }
772 if (extra_col_level > 2) {
774 }
775}
776
778{
779 cout << "decomposition " << label << ":" << endl;
781 if (row_level >= 2) {
783 }
784 if (col_level >= 2) {
786 }
787 if (extra_row_level > 2) {
789 }
790 if (extra_col_level > 2) {
792 }
793}
794
796{
798}
799
801{
802 int i, j;
803
804 cout << "char *name = \"" << label << "\";" << endl;
805 cout << "int part[] = {";
806 for (i = 0; i < nb_parts; i++)
807 cout << part[i] << ",";
808 cout << "-1};" << endl;
809 cout << "// this is the partition of rows and columns" << endl;
810 cout << "int entries[] = {" << endl;
811 for (i = 0; i < nb_entries; i++) {
812 for (j = 0; j < 4; j++) {
813 cout << setw(3) << entries[i * 4 + j] << ",";
814 }
815 cout << endl;
816 }
817 cout << "-1, };" << endl;
818 cout << "int col_level = " << col_level << ";" << endl;
819 cout << "int row_level = " << row_level << ";" << endl;
820 cout << "int extra_row_level = " << extra_row_level << ";" << endl;
821 cout << "int extra_col_level = " << extra_col_level << ";" << endl;
822 cout << "int lambda_level = " << lambda_level << ";" << endl;
823 cout << "int f_has_lambda = TRUE;" << endl;
824 cout << "int lambda_target[] = {1};" << endl;
825 cout << "int lambda_mode[] = {EQ};" << endl;
826 cout << "int f_has_mu = FALSE;" << endl;
827 cout << "int mu = 0;" << endl;
828 cout << "int f_girth = FALSE;" << endl;
829 cout << "int girth = 0;" << endl;
830 cout << "int f_starter = FALSE;" << endl;
831 cout << "int starter[] = {};" << endl;
832 cout << "int listofcases_table_depth = 0;" << endl;
833 cout << "int listofcases_table_length = 0;" << endl;
834 cout << "int listofcases_table[] = {" << endl;
835 cout << "};" << endl;
836 cout << "int AGO_THRESHOLD = 100000000;" << endl;
837 cout << "int PRint_intERVAL = 10000;" << endl;
838 cout << "int PRint_intERVAL_HOURS = 0;" << endl;
839 cout << "int PRint_intERVAL_MINUTES = 0;" << endl;
840 cout << "int PRint_intERVAL_SECONDS = 10;" << endl;
841}
842
844 int verbose_level)
845{
846 int f_v = (verbose_level >= 1);
847 //int f_vv = (verbose_level >= 2);
848 int I, u, l, i, j, a, sum, s, M, c, e, h, c1, c2, f;
851
852 if (f_v) {
853 cout << "geo_parameter::convert_single_to_stack_fuse_simple_pt" << endl;
854 }
855
856
857 int *class_first, *class_len, nb_classes;
858 int *block_length;
859 int *prev_scheme;
860 int *class_relabel;
861 int prev_level;
862
863 if (f_v) {
864 cout << "processing fuse simple for "
865 "pointtactical decomposition" << endl;
866 }
867 init_tdo_scheme(G, verbose_level);
868 h = ROW_SCHEME;
869
870 class_first = NEW_int(nb_V);
871 class_len = NEW_int(nb_V);
872 block_length = NEW_int(nb_V);
873 class_relabel = NEW_int(nb_V + nb_B);
874 for (i = 0; i < nb_V + nb_B; i++) {
875 class_relabel[i] = -1;
876 }
877 class_relabel[0] = 0;
878 class_relabel[nb_V] = 1;
879
880 Sorting.sorted_vec_get_first_and_length(fuse, nb_V, class_first, class_len, nb_classes);
881
882
883 prev_scheme = NEW_int(nb_classes * nb_B);
884 for (I = 0; I < nb_classes; I++) {
885 block_length[I] = tdo_scheme_get_row_class_length_fused(G, h,
886 class_first[I], class_len[I]);
887#if 0
888 l = class_len[I];
889 L = 0;
890 for (u = 0; u < l; u++) {
891 i = class_first[I] + u;
892 a = G.row_classes_len[h][i];
893 L += a;
894 }
895 block_length[I] = L;
896#endif
897 }
898 if (f_v) {
899 cout << "found " << nb_classes << " classes in the "
900 "previous row decomposition" << endl;
901 cout << "class_first: ";
902 Int_vec_print(cout, class_first, nb_classes);
903 cout << endl;
904 cout << "class_len: ";
905 Int_vec_print(cout, class_len, nb_classes);
906 cout << endl;
907 cout << "block_length: ";
908 Int_vec_print(cout, block_length, nb_classes);
909 cout << endl;
910 }
911
912 for (j = 0; j < nb_B; j++) {
913 for (I = 0; I < nb_classes; I++) {
914 l = class_len[I];
915 s = 0;
916 for (u = 0; u < l; u++) {
917 i = class_first[I] + u;
918 a = G.row_classes_len[h][i];
919 c = scheme[i * nb_B + j];
920 s += a * c;
921 }
922 M = G.col_classes_len[h][j];
923 e = s / M;
924 if (e * M != s) {
925 cout << "problems figuring out the previous scheme" << endl;
926 cout << "s=" << s << endl;
927 //cout << "L=" << L << endl;
928 cout << "M=" << M << endl;
929 cout << "j=" << j << endl;
930 cout << "I=" << I << endl;
931 exit(1);
932 }
933 prev_scheme[I * nb_B + j] = e;
934 }
935 } // next j
936 if (f_v) {
937 cout << "the previous col scheme is" << endl;
939 prev_scheme, nb_classes, nb_B, nb_B, 4);
940 }
941 //part.clear();
942 nb_parts = 0;
943 append_to_part(v + b);
945 //part.push_back(v + b);
946 //part.push_back(v);
947 //nb_parts = 2;
948 sum = block_length[0];
949 for (I = 1; I < nb_classes; I++) {
950 class_relabel[class_first[I]] = nb_parts;
951 append_to_part(sum);
952 //part.push_back(sum);
953 //nb_parts++;
954 sum += block_length[I];
955 }
956 sum = B[0];
957 for (j = 1; j < nb_B; j++) {
958 class_relabel[nb_V + j] = nb_parts;
959 append_to_part(v + sum);
960 //part.push_back(v + sum);
961 //nb_parts++;
962 sum += B[j];
963 }
964 prev_level = nb_parts;
965 if (f_v) {
966 cout << "the previous decomposition is " << endl;
968 //for (i = 0; i < nb_parts; i++) {
969 //cout << part[i] << " ";
970 //}
971 cout << endl;
972 cout << "class_relabel: " << endl;
973 Int_vec_print(cout, class_relabel, nb_V + nb_B);
974 cout << endl;
975 }
976 nb_entries = 0;
977 //entries.clear();
978 for (I = 0; I < nb_classes; I++) {
979 for (j = 0; j < nb_B; j++) {
980 c = prev_scheme[I * nb_B + j];
981 if (I == 0)
982 c1 = 0;
983 else
984 c1 = I + 1;
985 if (j == 0)
986 c2 = 1;
987 else
988 c2 = nb_classes + j;
989 if (f_v) {
990 cout << "entry " << nb_entries << " : " << prev_level
991 << " " << c2 << " " << c1 << " " << c << endl;
992 }
993 append_to_entries(prev_level, c2, c1, c);
994 }
995 }
996 nb_parts = prev_level;
997 col_level = prev_level;
998 sum = 0;
999 for (I = 0; I < nb_classes; I++) {
1000 l = class_len[I];
1001 f = class_first[I];
1002 sum += G.row_classes_len[h][f + 0];
1003 for (u = 1; u < l; u++) {
1004 class_relabel[f + u] = nb_parts;
1005 //part.push_back(sum);
1006 //nb_parts++;
1007 append_to_part(sum);
1008 sum += G.row_classes_len[h][f + u];
1009 }
1010 }
1011 if (f_v) {
1012 cout << "the extended decomposition is " << endl;
1013 Int_vec_print(cout, part, nb_parts);
1014 //for (i = 0; i < nb_parts; i++) {
1015 //cout << part[i] << " ";
1016 //}
1017 cout << endl;
1018 cout << "class_relabel: " << endl;
1019 Int_vec_print(cout, class_relabel, nb_V + nb_B);
1020 cout << endl;
1021 }
1023 for (i = 0; i < nb_V; i++) {
1024 for (j = 0; j < nb_B; j++) {
1025 c = scheme[i * nb_B + j];
1026 c1 = class_relabel[i];
1027 c2 = class_relabel[nb_V + j];
1028 if (f_v) {
1029 cout << "entry " << nb_entries << " : " << row_level
1030 << " " << c1 << " " << c2 << " " << c << endl;
1031 }
1032 append_to_entries(row_level, c1, c2, c);
1033 //nb_entries++;
1034 }
1035 }
1036 FREE_int(class_first);
1037 FREE_int(class_len);
1038 FREE_int(block_length);
1039 FREE_int(prev_scheme);
1040 FREE_int(class_relabel);
1041 //exit(1);
1042}
1043
1045 int verbose_level)
1046{
1047 int f_v = (verbose_level >= 1);
1048 //int f_vv = (verbose_level >= 2);
1049 int J, u, l, i, j, a, sum, s, L, M, c, e, h, c1, c2, f;
1052
1053 if (f_v) {
1054 cout << "geo_parameter::convert_single_to_stack_fuse_simple_bt" << endl;
1055 }
1056
1057 int *class_first, *class_len, nb_classes;
1058 int *block_length;
1059 int *prev_scheme;
1060 int *class_relabel;
1061 int prev_level;
1062
1063 if (f_v) {
1064 cout << "processing fuse simple for "
1065 "blocktactical decomposition" << endl;
1066 }
1067 init_tdo_scheme(G, verbose_level);
1068 h = COL_SCHEME;
1069 class_first = NEW_int(nb_B);
1070 class_len = NEW_int(nb_B);
1071 block_length = NEW_int(nb_B);
1072 class_relabel = NEW_int(nb_V + nb_B);
1073 for (i = 0; i < nb_V + nb_B; i++) {
1074 class_relabel[i] = -1;
1075 }
1076 class_relabel[0] = 0;
1077 class_relabel[nb_V] = 1;
1078
1079 Sorting.sorted_vec_get_first_and_length(fuse, nb_B, class_first, class_len, nb_classes);
1080
1081 prev_scheme = NEW_int(nb_V * nb_classes);
1082 for (J = 0; J < nb_classes; J++) {
1083 block_length[J] = tdo_scheme_get_col_class_length_fused(G, h,
1084 class_first[J], class_len[J]);
1085#if 0
1086 l = class_len[J];
1087 L = 0;
1088 for (u = 0; u < l; u++) {
1089 j = class_first[J] + u;
1090 a = G.col_classes_len[h][j];
1091 L += a;
1092 }
1093 block_length[J] = L;
1094#endif
1095 }
1096
1097 if (f_v) {
1098 cout << "found " << nb_classes << " classes in the previous "
1099 "column decomposition" << endl;
1100 cout << "class_first: ";
1101 Int_vec_print(cout, class_first, nb_classes);
1102 cout << endl;
1103 cout << "class_len: ";
1104 Int_vec_print(cout, class_len, nb_classes);
1105 cout << endl;
1106 cout << "block_length: ";
1107 Int_vec_print(cout, block_length, nb_classes);
1108 cout << endl;
1109 }
1110
1111 for (i = 0; i < nb_V; i++) {
1112 for (J = 0; J < nb_classes; J++) {
1113 l = class_len[J];
1114 s = 0;
1115 L = 0;
1116 for (u = 0; u < l; u++) {
1117 j = class_first[J] + u;
1118 a = G.col_classes_len[h][j];
1119 c = scheme[i * nb_B + j];
1120 s += a * c;
1121 L += a;
1122 }
1123
1124 M = G.row_classes_len[h][i];
1125 e = s / M;
1126 if (e * M != s) {
1127 cout << "problems figuring out the previous scheme" << endl;
1128 exit(1);
1129 }
1130 prev_scheme[i * nb_classes + J] = e;
1131 }
1132 } // next j
1133 if (f_v) {
1134 cout << "the previous row scheme is" << endl;
1136 prev_scheme, nb_V, nb_classes, nb_classes, 4);
1137 }
1138 nb_parts = 0;
1139 //part.clear();
1140 append_to_part(v + b);
1142 //part.push_back(v + b);
1143 //part.push_back(v);
1144 //nb_parts = 2;
1145 sum = block_length[0];
1146 for (J = 1; J < nb_classes; J++) {
1147 class_relabel[nb_V + class_first[J]] = nb_parts;
1148 append_to_part(v + sum);
1149 //part.push_back(v + sum);
1150 //nb_parts++;
1151 sum += block_length[J];
1152 }
1153 sum = V[0];
1154 for (i = 1; i < nb_V; i++) {
1155 class_relabel[i] = nb_parts;
1156 append_to_part(sum);
1157 //nb_parts++;
1158 sum += V[i];
1159 }
1160 prev_level = nb_parts;
1161 if (f_v) {
1162 cout << "the previous decomposition is " << endl;
1163 Int_vec_print(cout, part, nb_parts);
1164 //for (i = 0; i < nb_parts; i++) {
1165 //cout << part[i] << " ";
1166 //}
1167 cout << endl;
1168 cout << "class_relabel: " << endl;
1169 Int_vec_print(cout, class_relabel, nb_V + nb_B);
1170 cout << endl;
1171 }
1172 nb_entries = 0;
1173 //entries.clear();
1174 for (i = 0; i < nb_V; i++) {
1175 for (J = 0; J < nb_classes; J++) {
1176 c = prev_scheme[i * nb_classes + J];
1177 if (i == 0) {
1178 c1 = 0;
1179 }
1180 else {
1181 c1 = nb_classes + i;
1182 }
1183 if (J == 0) {
1184 c2 = 1;
1185 }
1186 else {
1187 c2 = 1 + J;
1188 }
1189 if (f_v) {
1190 cout << "entry " << nb_entries << " : " << prev_level
1191 << " " << c1 << " " << c2 << " " << c << endl;
1192 }
1193 append_to_entries(prev_level, c1, c2, c);
1194 //nb_entries++;
1195 }
1196 }
1197 nb_parts = prev_level;
1198 row_level = prev_level;
1199 sum = v;
1200 for (J = 0; J < nb_classes; J++) {
1201 l = class_len[J];
1202 f = class_first[J];
1203 sum += G.col_classes_len[h][f + 0];
1204 for (u = 1; u < l; u++) {
1205 class_relabel[nb_V + f + u] = nb_parts;
1206 append_to_part(sum);
1207 //part.push_back(sum);
1208 //nb_parts++;
1209 sum += G.col_classes_len[h][f + u];
1210 }
1211 }
1212 if (f_v) {
1213 cout << "the extended decomposition is " << endl;
1214 Int_vec_print(cout, part, nb_parts);
1215 //for (i = 0; i < nb_parts; i++) {
1216 //cout << part[i] << " ";
1217 //}
1218 cout << endl;
1219 cout << "class_relabel: " << endl;
1220 Int_vec_print(cout, class_relabel, nb_V + nb_B);
1221 cout << endl;
1222 }
1224 for (i = 0; i < nb_V; i++) {
1225 for (j = 0; j < nb_B; j++) {
1226 c = scheme[i * nb_B + j];
1227 c1 = class_relabel[i];
1228 c2 = class_relabel[nb_V + j];
1229 if (f_v) {
1230 cout << "entry " << nb_entries << " : " << col_level
1231 << " " << c2 << " " << c1 << " " << c << endl;
1232 }
1233 append_to_entries(col_level, c2, c1, c);
1234 //nb_entries++;
1235 }
1236 }
1237 FREE_int(class_first);
1238 FREE_int(class_len);
1239 FREE_int(block_length);
1240 FREE_int(prev_scheme);
1241 FREE_int(class_relabel);
1242 //exit(1);
1243}
1244
1245
1246
1247
1248
1249
1250
1252 int verbose_level)
1253{
1254 int f_v = (verbose_level >= 1);
1255 int f_vv = (verbose_level >= 2);
1256 int I, u, l, i, j, ii, jj, a, sum, s, M, c, e, h, c1, c2, f, d;
1257 int fuse_block_first[2], fuse_block_len[2];
1258 int *the_fuse[2];
1260
1262
1263 if (f_v) {
1264 cout << "geo_parameter::convert_single_to_stack_fuse_double_pt" << endl;
1265 }
1266 fuse_block_first[0] = fuse[0];
1267 fuse_block_len[0] = fuse[1];
1268 fuse_block_first[1] = fuse[2];
1269 fuse_block_len[1] = fuse[3];
1270 the_fuse[0] = fuse + 4;
1271 the_fuse[1] = the_fuse[0] + nb_V;
1272
1273
1274 int *class_first[2], *class_len[2], *class_idx[3], nb_classes[2];
1275 int *block_length[2];
1276 int *prev_scheme[2];
1277 int *class_relabel;
1278 int prev_level[2];
1279
1280 if (f_v) {
1281 cout << "processing fuse double for "
1282 "pointtactical decomposition" << endl;
1283 cout << "fuse_block_first[0]=" << fuse_block_first[0] << endl;
1284 cout << "fuse_block_len[0] =" << fuse_block_len[0] << endl;
1285 cout << "fuse_block_first[1]=" << fuse_block_first[1] << endl;
1286 cout << "fuse_block_len[1] =" << fuse_block_len[1] << endl;
1287 cout << "the_fuse[0] : ";
1288 Int_vec_print(cout, the_fuse[0], nb_V);
1289 cout << endl;
1290 cout << "the_fuse[1] : ";
1291 Int_vec_print(cout, the_fuse[1], nb_V);
1292 cout << endl;
1293 }
1294 init_tdo_scheme(G, 0 /*verbose_level*/);
1295 h = ROW_SCHEME;
1296
1297 class_relabel = NEW_int(nb_V + nb_B);
1298 for (i = 0; i < nb_V + nb_B; i++) {
1299 class_relabel[i] = -1;
1300 }
1301 class_relabel[0] = 0;
1302 class_relabel[nb_V] = 1;
1303
1304
1305
1306
1307 for (d = 0; d < 2; d++) {
1308 if (f_vv) {
1309 cout << "d=" << d << endl;
1310 }
1311
1312 class_first[d] = NEW_int(nb_V);
1313 class_len[d] = NEW_int(nb_V);
1314 block_length[d] = NEW_int(nb_V);
1315
1316 Sorting.sorted_vec_get_first_and_length(the_fuse[d], nb_V,
1317 class_first[d], class_len[d], nb_classes[d]);
1318 for (I = 0; I < nb_classes[d]; I++) {
1319 block_length[d][I] =
1321 class_first[d][I], class_len[d][I]);
1322 }
1323 class_idx[d] = NEW_int(nb_classes[d]);
1324 if (f_v) {
1325 cout << "row decomposition " << d << " found "
1326 << nb_classes[d] << " classes" << endl;
1327 cout << "class_first: ";
1328 Int_vec_print(cout, class_first[d], nb_classes[d]);
1329 cout << endl;
1330 cout << "class_len: ";
1331 Int_vec_print(cout, class_len[d], nb_classes[d]);
1332 cout << endl;
1333 cout << "block_length: ";
1334 Int_vec_print(cout, block_length[d], nb_classes[d]);
1335 cout << endl;
1336 }
1337
1338 if (f_v) {
1339 cout << "computing previous scheme at depth " << d << endl;
1340 }
1341 prev_scheme[d] = NEW_int(nb_classes[d] * fuse_block_len[d]);
1342 for (jj = 0; jj < fuse_block_len[d]; jj++) {
1343 j = fuse_block_first[d] + jj;
1344 for (I = 0; I < nb_classes[d]; I++) {
1345 l = class_len[d][I];
1346 if (f_v) {
1347 cout << "j=" << j << " I=" << I
1348 << " class_len[d][I]=" << l << endl;
1349 }
1350 s = 0;
1351 for (u = 0; u < l; u++) {
1352 i = class_first[d][I] + u;
1353 a = G.row_classes_len[h][i];
1354 c = scheme[i * nb_B + j];
1355 s += a * c;
1356 if (f_v) {
1357 cout << "i=" << i << endl;
1358 cout << "G.row_classes_len[h][i]="
1359 << G.row_classes_len[h][i] << endl;
1360 cout << "scheme[i * nb_B + j]="
1361 << scheme[i * nb_B + j] << endl;
1362 cout << "s=" << s << endl;
1363 }
1364 }
1365 M = G.col_classes_len[h][j];
1366 if (f_v) {
1367 cout << "G.col_classes_len[h][j]=" << M << endl;
1368 }
1369 e = s / M;
1370 if (e * M != s) {
1371 cout << "problems figuring out the "
1372 "previous scheme" << endl;
1373 cout << "d=" << d << endl;
1374 cout << "s=" << s << endl;
1375 //cout << "L=" << L << endl;
1376 cout << "M=" << M << endl;
1377 cout << "j=" << j << endl;
1378 cout << "I=" << I << endl;
1379 exit(1);
1380 }
1381 prev_scheme[d][I * fuse_block_len[d] + jj] = e;
1382 }
1383 } // next j
1384 if (f_v) {
1385 cout << "depth " << d << ", the previous "
1386 "col scheme is" << endl;
1388 prev_scheme[d], nb_classes[d],
1389 fuse_block_len[d], fuse_block_len[d], 4);
1390 }
1391
1392
1393 } // next d
1394 class_idx[2] = NEW_int(nb_V);
1395
1396 //exit(1);
1397
1398 nb_parts = 0;
1399 append_to_part(v + b);
1401 //part.clear();
1402 //part.push_back(v + b);
1403 //part.push_back(v);
1404 //nb_parts = 2;
1405
1406 // do the column classes first:
1407 sum = B[0];
1408 for (j = 1; j < nb_B; j++) {
1409 class_relabel[nb_V + j] = nb_parts;
1410 append_to_part(v + sum);
1411 //part.push_back(v + sum);
1412 //nb_parts++;
1413 sum += B[j];
1414 }
1415
1416 // do the classes for the coarse row-decomposition first:
1417 d = 0;
1418 sum = block_length[d][0];
1419 class_idx[d][0] = 0;
1420 for (I = 1; I < nb_classes[d]; I++) {
1421 class_idx[d][I] = nb_parts;
1422 ii = class_first[d][I];
1423 class_relabel[ii] = nb_parts;
1424 append_to_part(sum);
1425 //part.push_back(sum);
1426 //nb_parts++;
1427 sum += block_length[d][I];
1428 }
1429 prev_level[d] = nb_parts;
1430 if (f_v) {
1431 cout << "class_idx[0]=";
1432 Int_vec_print(cout, class_idx[0], nb_classes[0]);
1433 cout << endl;
1434 }
1435
1436 // now do the classes for the fine row-decomposition:
1437 d = 1;
1438 sum = block_length[d][0];
1439 class_idx[d][0] = 0;
1440 for (I = 1; I < nb_classes[d]; I++) {
1441 ii = class_first[d][I];
1442 if (f_v) {
1443 cout << "I=" << I << endl;
1444 cout << "class_first[d][I]=ii=" << ii << endl;
1445 cout << "class_relabel[ii]=" << class_relabel[ii] << endl;
1446 }
1447 if (class_relabel[ii] == -1) {
1448 //part.push_back(sum);
1449 class_idx[d][I] = nb_parts;
1450 class_relabel[ii] = nb_parts;
1451 //nb_parts++;
1452 append_to_part(sum);
1453 }
1454 else {
1455 class_idx[d][I] = class_relabel[ii];
1456 }
1457 sum += block_length[d][I];
1458 }
1459 prev_level[d] = nb_parts;
1460 if (f_v) {
1461 cout << "class_idx[1]=";
1462 Int_vec_print(cout, class_idx[1], nb_classes[1]);
1463 cout << endl;
1464 }
1465
1466
1467 if (f_v) {
1468 cout << "prev_level[0]" << prev_level[0] << endl;
1469 cout << "prev_level[1]" << prev_level[1] << endl;
1470 cout << "the previous decomposition is " << endl;
1471 Int_vec_print(cout, part, nb_parts);
1472 //for (i = 0; i < nb_parts; i++) {
1473 //cout << part[i] << " ";
1474 // }
1475 cout << endl;
1476 cout << "class_relabel: " << endl;
1477 Int_vec_print(cout, class_relabel, nb_V + nb_B);
1478 cout << endl;
1479 }
1480
1481 nb_entries = 0;
1482 //entries.clear();
1483 d = 0;
1484 if (f_v) {
1485 cout << "writing scheme at depth " << d << " level "
1486 << prev_level[d] << endl;
1487 }
1488 for (I = 0; I < nb_classes[d]; I++) {
1489 for (jj = 0; jj < fuse_block_len[d]; jj++) {
1490 j = fuse_block_first[d] + jj;
1491 c = prev_scheme[d][I * fuse_block_len[d] + jj];
1492 c1 = class_idx[d][I];
1493 c2 = 1 + j;
1494 if (f_v) {
1495 cout << "entry " << nb_entries << " : " << prev_level[d]
1496 << " " << c2 << " " << c1 << " " << c << endl;
1497 }
1498 append_to_entries(prev_level[d], c2, c1, c);
1499 //nb_entries++;
1500 }
1501 }
1502 d = 1;
1503 if (f_v) {
1504 cout << "writing scheme at depth " << d << " level "
1505 << prev_level[d] << endl;
1506 }
1507 for (I = 0; I < nb_classes[d]; I++) {
1508 for (jj = 0; jj < fuse_block_len[d]; jj++) {
1509 j = fuse_block_first[d] + jj;
1510 c = prev_scheme[d][I * fuse_block_len[d] + jj];
1511 c1 = class_idx[d][I];
1512 c2 = 1 + j;
1513 if (f_v) {
1514 cout << "entry " << nb_entries << " : " << prev_level[d]
1515 << " " << c2 << " " << c1 << " " << c << endl;
1516 }
1517 append_to_entries(prev_level[d], c2, c1, c);
1518 //nb_entries++;
1519 }
1520 }
1521 extra_col_level = prev_level[0];
1522 col_level = prev_level[1];
1523
1524 d = 2;
1525
1526 class_idx[d][0] = 0;
1527 sum = 0;
1528 for (I = 0; I < nb_classes[1]; I++) {
1529 l = class_len[1][I];
1530 f = class_first[1][I];
1531 sum += G.row_classes_len[h][f + 0];
1532 class_idx[d][f + 0] = class_idx[d - 1][I];
1533 for (u = 1; u < l; u++) {
1534 class_relabel[f + u] = nb_parts;
1535 class_idx[d][f + u] = nb_parts;
1536 //part.push_back(sum);
1537 //nb_parts++;
1538 append_to_part(sum);
1539 sum += G.row_classes_len[h][f + u];
1540 }
1541 }
1542 if (f_v) {
1543 cout << "the extended decomposition is " << endl;
1544 Int_vec_print(cout, part, nb_parts);
1545 //for (i = 0; i < nb_parts; i++) {
1546 //cout << part[i] << " ";
1547 //}
1548 cout << endl;
1549 cout << "class_relabel: " << endl;
1550 Int_vec_print(cout, class_relabel, nb_V + nb_B);
1551 cout << endl;
1552 cout << "class_idx[2]=";
1553 Int_vec_print(cout, class_idx[2], nb_V);
1554 cout << endl;
1555 }
1557 for (i = 0; i < nb_V; i++) {
1558 for (j = 0; j < nb_B; j++) {
1559 c = scheme[i * nb_B + j];
1560 c1 = class_idx[2][i];
1561 c2 = 1 + j;
1562 if (f_v) {
1563 cout << "entry " << nb_entries << " : " << row_level
1564 << " " << c1 << " " << c2 << " " << c << endl;
1565 }
1566 append_to_entries(row_level, c1, c2, c);
1567 //nb_entries++;
1568 }
1569 }
1570
1571}
1572
1574 int *&part_relabel, int *&part_length,
1575 int verbose_level)
1576{
1577 int f_v = (verbose_level >= 1);
1578 int f_vv = (verbose_level >= 2);
1580 int w, j, S, i;
1581 int *Part;
1582 int *Entries;
1583
1584 if (f_v) {
1585 cout << "geo_parameter::cut_off_two_lines" << endl;
1586 }
1587 if (f_vv) {
1588 cout << "row_level = " << row_level << endl;
1589 cout << "col_level = " << col_level << endl;
1590 cout << "extra_row_level = " << extra_row_level << endl;
1591 cout << "extra_col_level = " << extra_col_level << endl;
1592 cout << "lambda_level = " << lambda_level << endl;
1593 }
1594 Part = NEW_int(nb_parts + 1);
1595 Entries = NEW_int(4 * nb_entries + 1);
1596 for (i = 0; i < nb_parts; i++) {
1597 Part[i] = part[i];
1598 }
1599 Part[nb_parts] = -1;
1600 for (i = 0; i < 4 * nb_entries; i++) {
1601 Entries[i] = entries[i];
1602 }
1603 Entries[4 * nb_entries] = -1;
1604
1605 TDO.init_TDO(Part, Entries, row_level, col_level,
1607 lambda_level, 0/*verbose_level - 1*/);
1608
1609 FREE_int(Part);
1610 FREE_int(Entries);
1611 w = 0;
1612 for (j = TDO.nb_col_classes[COL_SCHEME] - 1; j >= 0; j--) {
1613 S = 0;
1614 for (i = 0; i < TDO.nb_row_classes[COL_SCHEME]; i++) {
1615 S += TDO.the_col_scheme[i * TDO.nb_col_classes[COL_SCHEME] + j];
1616 }
1617 if (S != 2) {
1618 break;
1619 }
1620 w += TDO.col_classes_len[COL_SCHEME][j];
1621 }
1622 if (f_v) {
1623 cout << "cutting off " << w << " columns" << endl;
1624 }
1625 cut_off(GP2, w, part_relabel, part_length, verbose_level);
1626}
1627
1628#if 0
1629void geo_parameter::cut_off_some_lines(geo_parameter &GP2, int w,
1630 int *&part_relabel, int *&part_length,
1631 int verbose_level)
1632{
1633 int f_v = (verbose_level >= 1);
1634
1635 if (f_v) {
1636 cout << "geo_parameter::cut_off_some_lines w=" << w << endl;
1637 }
1638 cut_off(GP2, w, part_relabel, part_length, verbose_level);
1639}
1640#endif
1641
1643 int *&part_relabel, int *&part_length,
1644 int verbose_level)
1645{
1646 int f_v = (verbose_level >= 1);
1647 int f_vv = (verbose_level >= 3);
1648 int i, W, a, /*u,*/ b, c, d, A, B, C;
1649
1650 if (f_v) {
1651 cout << "geo_parameter::cut_off cutting off "
1652 "w=" << w << " columns" << endl;
1653 }
1654 if (f_vv) {
1655 cout << "row_level = " << row_level << endl;
1656 cout << "col_level = " << col_level << endl;
1657 cout << "extra_row_level = " << extra_row_level << endl;
1658 cout << "extra_col_level = " << extra_col_level << endl;
1659 cout << "lambda_level = " << lambda_level << endl;
1660 cout << "label = " << label << endl;
1661 }
1663 GP2.fuse_type = fuse_type;
1664 GP2.v = v;
1665 GP2.b = GP2.b - w;
1666 GP2.mode = MODE_STACK;
1667 GP2.label.assign(label);
1668
1669 part_relabel = NEW_int(nb_parts + 1);
1670 part_length = NEW_int(nb_parts + 1);
1671 W = part[0] - w;
1672 GP2.nb_parts = 0;
1673 GP2.part = NULL;
1674 GP2.append_to_part(W);
1675 //GP2.part.push_back(W);
1676 //W = new_part[0] = part[0] - w;
1677 //u = 1;
1678 part_relabel[0] = 0;
1679 part_length[0] = 0;
1680 for (i = 1; i <= nb_parts; i++) {
1681 part_length[i] = GP2.nb_parts;
1682 if (i == nb_parts) {
1683 break;
1684 }
1685 a = part[i];
1686 if (a >= W) {
1687 part_relabel[i] = -1;
1688 }
1689 else {
1690 part_relabel[i] = GP2.nb_parts;
1691 GP2.append_to_part(a);
1692 //GP2.part.push_back(a);
1693 //new_part[u] = a;
1694 //u++;
1695 }
1696 }
1697 //new_nb_parts = u;
1698 //GP2.nb_parts = u;
1699 //new_part[new_nb_parts] = -1;
1700 //GP2.part.push_back(-1);
1701 part_relabel[nb_parts] = -1;
1702 if (f_vv) {
1703 cout << "new_nb_parts = " << GP2.nb_parts << endl;
1704 cout << "part_relabel:" << endl;
1705 for (i = 0; i < nb_parts; i++) {
1706 cout << i << " : " << part_relabel[i] << endl;
1707 }
1708 }
1709 GP2.nb_entries = 0;
1710 GP2.entries = NULL;
1711 //u = 0;
1712 for (i = 0; i < nb_entries; i++) {
1713 a = entries[i * 4 + 0];
1714 b = entries[i * 4 + 1];
1715 c = entries[i * 4 + 2];
1716 d = entries[i * 4 + 3];
1717 A = part_length[a];
1718 B = part_relabel[b];
1719 C = part_relabel[c];
1720 if (B >= 0 && C >= 0) {
1721 if (f_vv) {
1722 cout << a << " " << b << " " << c << " " << d
1723 << " -> " << A << " " << B << " " << C
1724 << " " << d << endl;
1725 }
1726 GP2.append_to_entries(A, B, C, d);
1727 //GP2.entries.push_back(A);
1728 //GP2.entries.push_back(B);
1729 //GP2.entries.push_back(C);
1730 //GP2.entries.push_back(d);
1731 //new_entries[u * 4 + 0] = A;
1732 //new_entries[u * 4 + 1] = B;
1733 //new_entries[u * 4 + 2] = C;
1734 //new_entries[u * 4 + 3] = d;
1735 //u++;
1736 }
1737 else {
1738 if (f_vv) {
1739 cout << a << " " << b << " " << c << " " << d
1740 << " eliminated" << endl;
1741 }
1742 }
1743 }
1744 //new_nb_entries = u;
1745 //GP2.nb_entries = u;
1746 //new_entries[new_nb_entries * 4] = -1;
1747 //GP2.entries.push_back(-1);
1748 if (f_vv) {
1749 cout << "new_nb_entries = " << GP2.nb_entries << endl;
1750 }
1751 if (row_level >= 0) {
1752 GP2.row_level = part_length[row_level];
1753 }
1754 else {
1755 GP2.row_level = row_level;
1756 }
1757 if (col_level >= 0) {
1758 GP2.col_level = part_length[col_level];
1759 }
1760 else {
1761 GP2.col_level = col_level;
1762 }
1763 GP2.extra_row_level = -1;
1764 GP2.extra_col_level = -1;
1765 if (lambda_level >= 0) {
1766 GP2.lambda_level = part_length[lambda_level];
1767 }
1768 else {
1770 }
1771#if 0
1772 if (extra_row_level >= 0) {
1773 GP2.extra_row_level = part_length[extra_row_level];
1774 }
1775 else {
1777 }
1778 if (extra_col_level >= 0) {
1779 GP2.extra_col_level = part_length[extra_col_level];
1780 }
1781 else {
1783 }
1784 if (lambda_level >= 0) {
1785 GP2.lambda_level = part_length[lambda_level];
1786 }
1787 else {
1789 }
1790#endif
1791#if 1
1792 if (f_v) {
1793 int j;
1794 cout << "new_part:" << endl;
1795 for (i = 0; i < GP2.nb_parts; i++) {
1796 cout << GP2.part[i] << " ";
1797 }
1798 cout << endl;
1799 cout << "new_entries:" << endl;
1800 for (i = 0; i < GP2.nb_entries; i++) {
1801 for (j = 0; j < 4; j++) {
1802 cout << GP2.entries[i * 4 + j] << " ";
1803 }
1804 cout << endl;
1805 }
1806 cout << endl;
1807 }
1808#endif
1809 if (f_v) {
1810 cout << "calling GP2.print_schemes" << endl;
1811 GP2.print_schemes();
1812 }
1813}
1814
1816{
1817 int i;
1818
1820 GP2.fuse_type = fuse_type;
1821 GP2.v = v;
1822 GP2.b = b;
1823 GP2.mode = MODE_STACK;
1824 GP2.label.assign(label);
1826 GP2.row_level = row_level;
1827 GP2.col_level = col_level;
1830 //GP2.part.clear();
1831 GP2.nb_parts = 0;
1832 for (i = 0; i < nb_parts; i++) {
1833 GP2.append_to_part(part[i]);
1834 //GP2.part.push_back(part[i]);
1835 }
1836 //GP2.part.push_back(-1);
1837 //GP2.nb_parts = nb_parts;
1838 GP2.nb_entries = 0;
1839 //GP2.entries.clear();
1840 for (i = 0; i < nb_entries; i++) {
1841 GP2.append_to_entries(entries[4 * i + 0],
1842 entries[4 * i + 1],
1843 entries[4 * i + 2],
1844 entries[4 * i + 3]);
1845 //GP2.entries.push_back(entries[i]);
1846 }
1847 //GP2.entries.push_back(-1);
1848 //GP2.nb_entries = nb_entries;
1849}
1850
1852{
1853 cout << "geo_parameter::print_schemes" << endl;
1854#if 1
1855 int i;
1857 int *Part, *Entries;
1858
1859 Part = NEW_int(nb_parts + 1);
1860 Entries = NEW_int(4 * nb_entries + 1);
1861 for (i = 0; i < nb_parts; i++) {
1862 Part[i] = part[i];
1863 }
1864 Part[nb_parts] = -1;
1865 for (i = 0; i < 4 * nb_entries; i++) {
1866 Entries[i] = entries[i];
1867 }
1868 Entries[4 * nb_entries] = -1;
1869
1870
1871#if 1
1872 cout << "row_level=" << row_level << endl;
1873 cout << "col_level=" << col_level << endl;
1874 cout << "extra_row_level=" << extra_row_level << endl;
1875 cout << "extra_col_level=" << extra_col_level << endl;
1876 cout << "lambda_level=" << lambda_level << endl;
1877 cout << "geo_parameter::print_schemes "
1878 "before TDO.init_TDO" << endl;
1879#endif
1880 TDO.init_TDO(Part, Entries, row_level, col_level,
1882 lambda_level, 0/*verbose_level - 1*/);
1883 //cout << "geo_parameter::print_schemes
1884 //after TDO.init_TDO" << endl;
1885
1886 FREE_int(Part);
1887 FREE_int(Entries);
1888
1889 TDO.print_all_schemes();
1890 cout << "geo_parameter::print_schemes after "
1891 "TDO.print_all_schemes" << endl;
1892#endif
1893}
1894
1895
1896
1898 int h, int class_first, int class_len)
1899{
1900 int L, u;
1901
1902 L = 0;
1903 for (u = 0; u < class_len; u++) {
1904 L += G.row_classes_len[h][class_first + u];
1905 }
1906 return L;
1907}
1908
1910 int h, int class_first, int class_len)
1911{
1912 int L, u;
1913
1914 L = 0;
1915 for (u = 0; u < class_len; u++) {
1916 L += G.col_classes_len[h][class_first + u];
1917 }
1918 return L;
1919}
1920
1921
1922
1923
1924}}}
1925
1926
1927
decomposition stack of a linear space or incidence geometry
void write(std::ofstream &aStream, std::string &label)
void write_mode_stack(std::ofstream &aStream, std::string &label)
void cut_off(geo_parameter &GP2, int w, int *&part_relabel, int *&part_length, int verbose_level)
int input_mode_stack(std::ifstream &aStream, int verbose_level)
void print_scheme_tex(std::ostream &ost, tdo_scheme_synthetic &G, int h)
int tdo_scheme_get_row_class_length_fused(tdo_scheme_synthetic &G, int h, int class_first, int class_len)
void append_to_entries(int a1, int a2, int a3, int a4)
int tdo_scheme_get_col_class_length_fused(tdo_scheme_synthetic &G, int h, int class_first, int class_len)
void init_tdo_scheme(tdo_scheme_synthetic &G, int verbose_level)
void write_mode_single(std::ofstream &aStream, std::string &label)
void cut_off_two_lines(geo_parameter &GP2, int *&part_relabel, int *&part_length, int verbose_level)
canonical tactical decomposition of an incidence structure
void print_scheme_tex_fancy(std::ostream &ost, int h, int f_label, std::string &label)
void init_TDO(int *Part, int *Entries, int Row_level, int Col_level, int Extra_row_level, int Extra_col_level, int Lambda_level, int verbose_level)
a collection of functions related to sorted vectors
void sorted_vec_get_first_and_length(int *v, int len, int *class_first, int *class_len, int &nb_classes)
Definition: sorting.cpp:2904
functions related to strings and character arrays
#define LAMBDA_SCHEME
#define UNKNOWNTYPE
#define EXTRA_ROW_SCHEME
#define MODE_STACK
#define FUSE_TYPE_DOUBLE
#define BLOCKTACTICAL
#define EXTRA_COL_SCHEME
#define MODE_SINGLE
#define POINTANDBLOCKTACTICAL
#define COL_SCHEME
#define POINTTACTICAL
#define FUSE_TYPE_SIMPLE
#define ROW_SCHEME
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_int(n)
Definition: foundations.h:625
#define Int_vec_print_integer_matrix_width(A, B, C, D, E, F)
Definition: foundations.h:691
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects