Orbiter 2022
Combinatorial Objects
incidence.cpp
Go to the documentation of this file.
1// incidence.cpp
2
3#include "foundations.h"
4
5using namespace std;
6
7
8
9namespace orbiter {
10namespace layer1_foundations {
11namespace geometry_builder {
12
13
14
16{
17 gg = NULL;
18 Encoding = NULL;
19
20 K = NULL;
21
22
23 theY = NULL;
24
25 pairs = NULL;
26
27 gl_nb_GEN = 0;
28
29 iso_type_at_line = NULL;
30 iso_type_no_vhbars = NULL;
31
32 back_to_line = 0;
33
34}
35
37{
38 if (K) {
39 FREE_int(K);
40 }
41 if (theY) {
42 int i;
43
44 for (i = 0; i < gg->GB->B; i++) {
45 FREE_int(theY[i]);
46 }
48 }
49 if (pairs) {
50 int i;
51
52 for (i = 1; i < gg->GB->V; i++) {
53 FREE_int(pairs[i]);
54 }
56 }
57 if (Encoding) {
59 }
60
61
62 if (iso_type_at_line) {
63 int i;
64
65 for (i = 0; i < gg->GB->V; i++) {
66 if (iso_type_at_line[i]) {
68 }
69 }
71 }
72
75 }
76
77}
78
79void incidence::init(gen_geo *gg, int v, int b, int *R, int verbose_level)
80{
81 int f_v = (verbose_level >= 1);
82
83 if (f_v) {
84 cout << "incidence::init" << endl;
85 }
86
87 int i, j;
88
91
92 if (f_v) {
93 cout << "incidence::init before Encoding->init" << endl;
94 }
95 Encoding->init(v, b, R, verbose_level);
96 if (f_v) {
97 cout << "incidence::init after Encoding->init" << endl;
98 }
99
100
101 K = NEW_int(gg->GB->B);
102 for (j = 0; j < gg->GB->B; j++) {
103 K[j] = 0;
104 }
105
106 theY = NEW_pint(gg->GB->B);
107 for (j = 0; j < gg->GB->B; j++) {
108 theY[j] = NEW_int(gg->GB->V);
109 }
110
111
113 for (i = 0; i < gg->GB->V; i++) {
114 iso_type_at_line[i] = NULL;
115 }
116 iso_type_no_vhbars = NULL;
117
118 if (f_v) {
119 cout << "incidence::init before init_pairs" << endl;
120 }
121 init_pairs(verbose_level);
122 if (f_v) {
123 cout << "incidence::init after init_pairs" << endl;
124 }
125
126
127 back_to_line = -1;
128
129 gl_nb_GEN = 0;
130
131 if (f_v) {
132 cout << "incidence::init done" << endl;
133 }
134}
135
136
137
138
139void incidence::init_pairs(int verbose_level)
140{
141 int f_v = (verbose_level >= 1);
142 int i1, i2;
143
144 if (f_v) {
145 cout << "incidence::init_pairs" << endl;
146 }
147
148 pairs = NEW_pint(gg->GB->V);
149
150 for (i1 = 1; i1 <= gg->GB->V; i1++) {
151 pairs[i1] = NEW_int(i1 - 1);
152 for (i2 = 0; i2 < i1 - 1; i2++) {
153 pairs[i1][i2] = 0;
154 }
155 }
156 if (f_v) {
157 cout << "incidence::init_pairs done" << endl;
158 }
159}
160
162{
163 int i1, i2, a;
164 int *M;
165
166 M = NEW_int(v * v);
167 for (i1 = 0; i1 < v; i1++) {
168 //cout << i1 << " : ";
169 for (i2 = 0; i2 < v; i2++) {
170 if (i2 == i1) {
171 a = 0;
172 }
173 else if (i2 < i1) {
174 a = pairs[i1][i2];
175 }
176 else {
177 a = pairs[i2][i1];
178 }
179 M[i1 * v + i2] = a;
180 }
181 }
182 Int_matrix_print(M, v, v);
183 FREE_int(M);
184}
185
186
187int incidence::find_square(int m, int n)
188{
189 return Encoding->find_square(m, n);
190}
191
193{
194 //int i;
195
196 cout << "V = " << Encoding->v << ", B = " << Encoding->b << endl;
197
198#if 0
199 cout << "vbar: ";
200 for (i = 0; i < nb_i_vbar; i++) {
201 cout << i_vbar[i];
202 if (i < nb_i_vbar - 1) {
203 cout << ", ";
204 }
205 }
206 cout << endl;
207
208 cout << "hbar: ";
209 for (i = 0; i < nb_i_hbar; i++) {
210 cout << i_hbar[i];
211 if (i < nb_i_hbar - 1) {
212 cout << ", ";
213 }
214 }
215 cout << endl;
216#endif
217
218}
219
220
221
223{
224 int i;
225
226 for (i = 0; i < Encoding->v; i++) {
227 if (iso_type_at_line[i]) {
229 }
230 iso_type_at_line[i] = NULL;
231 }
232 if (iso_type_no_vhbars) {
234 }
235 iso_type_no_vhbars = NULL;
236}
237
238void incidence::print_R(int v, cperm *p, cperm *q)
239{
240 int i;
241
242 cout << "p = ";
243 p->print();
244 cout << ", q = ";
245 q->print();
246 cout << ", R=";
247 for (i = 0; i < v; i++) {
248 cout << Encoding->R[i];
249 if (i < v - 1) {
250 cout << ", ";
251 }
252 }
253 cout << endl;
254}
255
256
257
258
260 int row,
261 int f_orderly,
262 int verbose_level)
263// last row is ok
264{
265 int f_v = (verbose_level >= 1);
266
267 if (f_v) {
268 cout << "incidence::install_isomorphism_test_after_a_given_row line = " << row << endl;
269 }
270 if (row > 0 && row <= Encoding->v) {
272 iso_type_at_line[row - 1]->init(gg, row, f_orderly, verbose_level);
273 }
274 else {
275 cout << "incidence::install_isomorphism_test_after_a_given_row "
276 "out of range: i = " << row << ", v = " << Encoding->v << endl;
277 exit(1);
278 }
279}
280
282 int row,
283 int f_orderly,
284 int verbose_level)
285// last row is not allowed
286{
287 int f_v = (verbose_level >= 1);
288
289 if (f_v) {
290 cout << "incidence::install_isomorphism_test_of_second_kind_after_a_given_row "
291 "line = " << row << endl;
292 }
293 if (row > 0 && row < Encoding->v) {
295 iso_type_at_line[row - 1]->init(gg, row, f_orderly, verbose_level);
296 iso_type_at_line[row - 1]->second();
297 }
298 else {
299 cout << "incidence::install_isomorphism_test_of_second_kind_after_a_given_row "
300 "out of range: row = " << row << ", v = " << Encoding->v << endl;
301 exit(1);
302 }
303}
304
305void incidence::set_split(int row, int remainder, int modulo)
306{
307 if (row > 0 && row < Encoding->v) {
308 iso_type_at_line[row - 1]->set_split(remainder, modulo);
309 }
310 else {
311 cout << "incidence::set_range "
312 "out of range: row = " << row << ", v = " << Encoding->v << endl;
313 exit(1);
314 }
315}
316
317
318
319void incidence::print_geo(std::ostream &ost, int v, int *theGEO)
320{
321 int i, j, s, a;
322
323 s = 0;
324 for (i = 0; i < v; i++) {
325 for (j = 0; j < Encoding->R[i]; j++, s++) {
326 a = theGEO[s];
327 ost << i * Encoding->b + a << " ";
328 }
329 }
330
331}
332
333void incidence::print_inc(std::ostream &ost, int v, long int *theInc)
334{
335 int i, j, s;
336 long int a;
337
338 s = 0;
339 for (i = 0; i < v; i++) {
340 for (j = 0; j < Encoding->R[i]; j++, s++) {
341 a = theInc[s];
342 ost << a << " ";
343 }
344 }
345
346}
347
348void incidence::print_blocks(std::ostream &ost, int v, long int *theInc)
349{
350 long int *Blocks;
351 int i, b;
352
353 compute_blocks_ranked(Blocks, v, theInc);
354
355 b = Encoding->b;
356
357 for (i = 0; i < b; i++) {
358 ost << Blocks[i] << " ";
359 }
360 FREE_lint(Blocks);
361}
362
363void incidence::compute_blocks(long int *&Blocks, int *&K, int v, long int *theInc)
364{
365 int i, j, s, b, h;
366 long int a;
367 int *Incma;
369
370 b = Encoding->b;
371
372 Incma = NEW_int(v * b);
373
374 K = NEW_int(b);
375 for (i = 0; i < b; i++) {
376 K[i] = 0;
377 }
378
379 Blocks = NEW_lint(b * v);
380 for (i = 0; i < v * b; i++) {
381 Incma[i] = 0;
382 }
383
384 s = 0;
385 for (i = 0; i < v; i++) {
386 for (j = 0; j < Encoding->R[i]; j++, s++) {
387 a = theInc[s];
388 Incma[a] = 1;
389 }
390 }
391 for (j = 0; j < b; j++) {
392 h = 0;
393 for (i = 0; i < v; i++) {
394 if (Incma[i * b + j]) {
395 Blocks[j * v + h++] = i;
396 }
397 }
398 K[j] = h;
399 }
400 FREE_int(Incma);
401}
402
403
404void incidence::compute_blocks_ranked(long int *&Blocks, int v, long int *theInc)
405{
406 int i, j, s, b, k, h;
407 long int a;
408 int *Incma;
409 int *block;
411
412 b = Encoding->b;
413 Incma = NEW_int(v * b);
414 block = NEW_int(v);
415 Blocks = NEW_lint(b);
416 for (i = 0; i < v * b; i++) {
417 Incma[i] = 0;
418 }
419
420 s = 0;
421 for (i = 0; i < v; i++) {
422 for (j = 0; j < Encoding->R[i]; j++, s++) {
423 a = theInc[s];
424 Incma[a] = 1;
425 }
426 }
427 for (j = 0; j < b; j++) {
428 for (i = 0; i < v; i++) {
429 block[i] = 0;
430 }
431 h = 0;
432 for (i = 0; i < v; i++) {
433 if (Incma[i * b + j]) {
434 block[h++] = i;
435 }
436 }
437 if (j == 0) {
438 k = h;
439 }
440 else {
441 if (k != h) {
442 cout << "incidence::compute_blocks_ranked not column tactical" << endl;
443 exit(1);
444 }
445 }
446 Blocks[j] = Combi.rank_k_subset(block, v, k);
447 }
448 FREE_int(block);
449 FREE_int(Incma);
450}
451
452int incidence::compute_k(int v, long int *theInc)
453{
454 int i, j, s, b, k, h;
455 long int a;
456 int *Incma;
457 int *block;
459
460 b = Encoding->b;
461 Incma = NEW_int(v * b);
462 block = NEW_int(v);
463 for (i = 0; i < v * b; i++) {
464 Incma[i] = 0;
465 }
466
467 s = 0;
468 for (i = 0; i < v; i++) {
469 for (j = 0; j < Encoding->R[i]; j++, s++) {
470 a = theInc[s];
471 Incma[a] = 1;
472 }
473 }
474 for (j = 0; j < b; j++) {
475 h = 0;
476 for (i = 0; i < v; i++) {
477 if (Incma[i * b + j]) {
478 block[h++] = i;
479 }
480 }
481 if (j == 0) {
482 k = h;
483 }
484 else {
485 if (k != h) {
486 cout << "incidence::compute_blocks not column tactical" << endl;
487 exit(1);
488 }
489 }
490 }
491 FREE_int(block);
492 FREE_int(Incma);
493 return k;
494}
495
496int incidence::is_block_tactical(int v, long int *theInc)
497{
498 int i, j, s, b, k, h, ret;
499 long int a;
500 int *Incma;
501 int *block;
503
504 b = Encoding->b;
505 Incma = NEW_int(v * b);
506 block = NEW_int(v);
507 for (i = 0; i < v * b; i++) {
508 Incma[i] = 0;
509 }
510
511 ret = TRUE;
512 s = 0;
513 for (i = 0; i < v; i++) {
514 for (j = 0; j < Encoding->R[i]; j++, s++) {
515 a = theInc[s];
516 Incma[a] = 1;
517 }
518 }
519 for (j = 0; j < b; j++) {
520 h = 0;
521 for (i = 0; i < v; i++) {
522 if (Incma[i * b + j]) {
523 block[h++] = i;
524 }
525 }
526 if (j == 0) {
527 k = h;
528 }
529 else {
530 if (k != h) {
531 ret = FALSE;
532 break;
533 }
534 }
535 }
536 FREE_int(block);
537 FREE_int(Incma);
538 return ret;
539}
540
541
542void incidence::geo_to_inc(int v, int *theGEO, long int *theInc, int nb_flags)
543{
544 int i, j, s, a;
545
546 s = 0;
547 for (i = 0; i < v; i++) {
548 for (j = 0; j < Encoding->R[i]; j++, s++) {
549 a = theGEO[i * Encoding->dim_n + j];
550 theInc[s] = i * Encoding->b + a;
551 }
552 }
553 if (s != nb_flags) {
554 cout << "incidence::geo_to_inc s != nb_flags" << endl;
555 exit(1);
556 }
557
558}
559
560void incidence::inc_to_geo(int v, long int *theInc, int *theGEO, int nb_flags)
561{
562 int i, j, s, a;
563
564 s = 0;
565 for (i = 0; i < v; i++) {
566 for (j = 0; j < Encoding->R[i]; j++, s++) {
567 a = theInc[s] - i * Encoding->b;
568 theGEO[i * Encoding->dim_n + j] = a;
569 }
570 }
571 if (s != nb_flags) {
572 cout << "incidence::inc_to_geo s != nb_flags" << endl;
573 exit(1);
574 }
575
576}
577
578
579}}}
580
581
582
a permutation for use in class gen_geo
classification of geometries with a given row-tactical decomposition
row-by-row encoding of an incidence geometry
void init(int v, int b, int *R, int verbose_level)
void print_blocks(std::ostream &ost, int v, long int *theInc)
Definition: incidence.cpp:348
void print_inc(std::ostream &ost, int v, long int *theInc)
Definition: incidence.cpp:333
void init(gen_geo *gg, int v, int b, int *R, int verbose_level)
Definition: incidence.cpp:79
void print_geo(std::ostream &ost, int v, int *theGEO)
Definition: incidence.cpp:319
void inc_to_geo(int v, long int *theInc, int *theGEO, int nb_flags)
Definition: incidence.cpp:560
void compute_blocks_ranked(long int *&Blocks, int v, long int *theInc)
Definition: incidence.cpp:404
void geo_to_inc(int v, int *theGEO, long int *theInc, int nb_flags)
Definition: incidence.cpp:542
void set_split(int row, int remainder, int modulo)
Definition: incidence.cpp:305
void install_isomorphism_test_after_a_given_row(int i, int f_orderly, int verbose_level)
Definition: incidence.cpp:259
void install_isomorphism_test_of_second_kind_after_a_given_row(int i, int f_orderly, int verbose_level)
Definition: incidence.cpp:281
void compute_blocks(long int *&Blocks, int *&K, int v, long int *theInc)
Definition: incidence.cpp:363
classification of geometries based on canonical forms
void init(gen_geo *gg, int v, int f_orderly, int verbose_level)
Definition: iso_type.cpp:55
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_pint(n)
Definition: foundations.h:627
#define NEW_pvoid(n)
Definition: foundations.h:637
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define FREE_OBJECT(p)
Definition: foundations.h:651
#define NEW_int(n)
Definition: foundations.h:625
#define FREE_pvoid(p)
Definition: foundations.h:650
#define Int_matrix_print(A, B, C)
Definition: foundations.h:707
#define TRUE
Definition: foundations.h:231
#define FALSE
Definition: foundations.h:234
#define FREE_lint(p)
Definition: foundations.h:642
#define NEW_lint(n)
Definition: foundations.h:628
#define FREE_pint(p)
Definition: foundations.h:641
the orbiter library for the classification of combinatorial objects