Orbiter 2022
Combinatorial Objects
blt_set_invariants.cpp
Go to the documentation of this file.
1/*
2 * blt_set_invariants.cpp
3 *
4 * Created on: Apr 7, 2019
5 * Author: betten
6 */
7
8
9#include "foundations.h"
10
11using namespace std;
12
13
14namespace orbiter {
15namespace layer1_foundations {
16namespace orthogonal_geometry {
17
18
19
20
22{
23 D = NULL;
24
25 set_size = 0;
27 the_set_in_PG = NULL;
28
29 intersection_type = NULL;
32 nb_planes = 0;
33
34 Sos = NULL;
35 Sos2 = NULL;
36 Sos3 = NULL;
37
38 D2 = NULL;
39 D3 = NULL;
40
41 Sos2_idx = NULL;
42 Sos3_idx = NULL;
43
44}
45
47{
48 null();
49}
50
52{
53 D = NULL;
54
55 set_size = 0;
57 the_set_in_PG = NULL;
58
59 intersection_type = NULL;
62 nb_planes = 0;
63
64 Sos = NULL;
65 Sos2 = NULL;
66 Sos3 = NULL;
67
68 D2 = NULL;
69 D3 = NULL;
70
71 Sos2_idx = NULL;
72 Sos3_idx = NULL;
73
74}
75
77{
80 }
81 if (the_set_in_PG) {
83 }
84}
85
86void blt_set_invariants::init(blt_set_domain *D, long int *the_set,
87 int verbose_level)
88{
89 int f_v = (verbose_level >= 1);
90 int v5[5];
91 int i;
92
93 if (f_v) {
94 cout << "blt_set_invariants::init" << endl;
95 }
97 set_size = D->q + 1;
101
102 for (i = 0; i < set_size; i++) {
103 D->O->unrank_point(v5, 1, the_set[i], 0 /* verbose_level */);
104 the_set_in_PG[i] = D->P->rank_point(v5);
105 }
106
107 if (f_v) {
108 cout << "blt_set_invariants::init before compute" << endl;
109 }
110 compute(verbose_level);
111 if (f_v) {
112 cout << "blt_set_invariants::init after compute" << endl;
113 }
114
115 if (f_v) {
116 cout << "blt_set_invariants::init done" << endl;
117 }
118}
119
120void blt_set_invariants::compute(int verbose_level)
121{
122 int f_v = (verbose_level >= 1);
123
124 if (f_v) {
125 cout << "blt_set_invariants::compute" << endl;
126 }
127
129
135
136
137 if (f_v) {
138 cout << "blt_set::report before P->plane_intersections" << endl;
139 }
141 the_set_in_PG, set_size, R, *Sos, verbose_level);
142
143
144
145 if (f_v) {
146 cout << "blt_set::report before intersection_matrix" << endl;
147 }
151 verbose_level);
152
153 if (f_v) {
154 cout << "blt_set::report before "
155 "extract_largest_sets" << endl;
156 }
158 Sos2_idx, verbose_level);
159
160 if (f_v) {
161 cout << "blt_set::report before "
162 "remove_sets_of_given_size" << endl;
163 }
165 *Sos3, Sos3_idx, verbose_level);
166
167 if (f_v) {
168 cout << "blt_set::report before "
169 "Sos2->compute_tdo_decomposition" << endl;
170 }
171 Sos2->compute_tdo_decomposition(*D2, verbose_level);
172
173
174 D2->get_row_scheme(verbose_level);
175 D2->get_col_scheme(verbose_level);
176 if (Sos3->nb_sets) {
177 if (f_v) {
178 cout << "blt_set::report before "
179 "Sos3[h].compute_tdo_decomposition" << endl;
180 }
181 Sos3->compute_tdo_decomposition(*D3, verbose_level);
182 D3->get_row_scheme(verbose_level);
183 D3->get_col_scheme(verbose_level);
184 }
185#if 0
186 P->plane_intersection_invariant(G,
187 data2, set_size,
190 verbose_level);
191#endif
192
193 FREE_OBJECTS(R);
194
195 if (f_v) {
196 cout << "blt_set_invariants::compute done" << endl;
197 }
198}
199
200void blt_set_invariants::latex(std::ostream &ost, int verbose_level)
201{
202 int f_v = (verbose_level >= 1);
204
205 if (f_v) {
206 cout << "blt_set_invariants::latex" << endl;
207 }
208
209
210
211 int a, i, j;
212 ost << "Plane intersection type is ";
213 for (i = highest_intersection_number; i >= 0; i--) {
214
215 a = intersection_type[i];
216 if (a == 0) {
217 continue;
218 }
219 ost << "$" << i;
220 if (a > 9) {
221 ost << "^{" << a << "}";
222 }
223 else if (a > 1) {
224 ost << "^" << a;
225 }
226 ost << "$ ";
227 }
228 ost << "\\\\" << endl;
229 ost << "Plane invariant is ";
230
231 if (nb_planes < 10) {
232 ost << "$$";
233 ost << "\\left[" << endl;
234 ost << "\\begin{array}{*{" << nb_planes << "}{c}}" << endl;
235 for (i = 0; i < nb_planes; i++) {
236 for (j = 0; j < nb_planes; j++) {
237 ost << intersection_matrix[i * nb_planes + j];
238 if (j < nb_planes - 1) {
239 ost << " & ";
240 }
241 }
242 ost << "\\\\" << endl;
243 }
244 ost << "\\end{array}" << endl;
245 ost << "\\right]" << endl;
246 ost << "$$" << endl;
247 }
248 else {
249 ost << "too big (" << nb_planes << " planes)\\\\" << endl;
250 }
251
252 int f_enter_math = FALSE;
253 int f_print_subscripts = TRUE;
254
255 ost << "$$" << endl;
257 ost, f_enter_math, f_print_subscripts, verbose_level - 1);
258 ost << "\\quad" << endl;
260 ost, f_enter_math, f_print_subscripts, verbose_level - 1);
261 ost << "$$" << endl;
263
264 if (Sos3->nb_sets) {
265 ost << "$$" << endl;
266
268 ost, f_enter_math, f_print_subscripts, verbose_level - 1);
269 ost << "$$" << endl;
270 ost << "$$" << endl;
272 ost, f_enter_math, f_print_subscripts, verbose_level - 1);
273 ost << "$$" << endl;
275
276 int t, fst_col, fst, len, u, a;
277
278 fst_col = D3->Stack->startCell[1];
279 for (t = 0; t < D3->Stack->ht; t++) {
280 if (!D3->Stack->is_col_class(t)) {
281 continue;
282 }
283 ost << "Column cell " << t << ":\\\\" << endl;
284 len = D3->Stack->cellSize[t];
285 fst = D3->Stack->startCell[t];
286 int *Cell;
287 Cell = NEW_int(len);
288 for (u = 0; u < len; u++) {
289 a = D3->Stack->pointList[fst + u] - fst_col;
290 Cell[u] = a;
291 }
292 Sorting.int_vec_heapsort(Cell, len);
293#if 0
294 for (u = 0; u < len; u++) {
295 a = Cell[u];
296 b = Sos3_idx[h][a];
297 f << a << " (rank = ";
298 R[h][b].print_not_scientific(f);
299 f << ") = ";
300 G->unrank_longinteger(R[h][b], 0 /* verbose_level */);
301 f << "$\\left[" << endl;
302 f << "\\begin{array}{*{" << 5 << "}{c}}" << endl;
303 for (i = 0; i < 3; i++) {
304 for (j = 0; j < 5; j++) {
305 c = G->M[i * 5 + j];
306 f << c;
307 if (j < 4) {
308 f << "&";
309 }
310 }
311 f << "\\\\" << endl;
312 }
313 f << "\\end{array}" << endl;
314 f << "\\right]$\\\\" << endl;
315 }
316#endif
317 FREE_int(Cell);
318 }
319 }
320
321 int tt, u, v;
322 tt = (set_size + 3) / 4;
323
324 ost << "The points by ranks:\\\\" << endl;
325 ost << "\\begin{center}" << endl;
326
327 for (u = 0; u < 4; u++) {
328 ost << "\\begin{tabular}[t]{|c|c|}" << endl;
329 ost << "\\hline" << endl;
330 ost << "$i$ & Rank \\\\" << endl;
331 ost << "\\hline" << endl;
332 for (i = 0; i < tt; i++) {
333 v = u * tt + i;
334 if (v < set_size) {
335 ost << "$" << v << "$ & $" << the_set_in_orthogonal[v]
336 << "$ \\\\" << endl;
337 }
338 }
339 ost << "\\hline" << endl;
340 ost << "\\end{tabular}" << endl;
341 }
342 ost << "\\end{center}" << endl;
343
344 ost << "The points:\\\\" << endl;
345 int v5[5];
346 for (i = 0; i < set_size; i++) {
347 D->O->unrank_point(
348 v5, 1, the_set_in_orthogonal[i], 0 /* verbose_level */);
349 //Grass->unrank_int(data[i], 0/*verbose_level - 4*/);
350 if ((i % 4) == 0) {
351 if (i) {
352 ost << "$$" << endl;
353 }
354 ost << "$$" << endl;
355 }
356 //f << "\\left[" << endl;
357 //f << "\\begin{array}{c}" << endl;
358 ost << "P_{" << i /*data[i]*/ << "}=";
359 Int_vec_print(ost, v5, 5);
360#if 0
361 for (u = 0; u < 5; u++) {
362 for (v = 0; v < n; v++) {
363 f << Grass->M[u * n + v];
364 }
365 ost << "\\\\" << endl;
366 }
367#endif
368 //f << "\\end{array}" << endl;
369 //f << "\\right]" << endl;
370 }
371 ost << "$$" << endl;
372
373
374 if (f_v) {
375 cout << "blt_set_invariants::latex done" << endl;
376 }
377}
378
379
380
381}}}
382
void intersection_matrix(int *&intersection_type, int &highest_intersection_number, int *&intersection_matrix, int &nb_big_sets, int verbose_level)
void extract_largest_sets(set_of_sets &S, int *&Idx, int verbose_level)
void compute_tdo_decomposition(geometry::decomposition &D, int verbose_level)
void remove_sets_of_given_size(int k, set_of_sets &S, int *&Idx, int verbose_level)
a collection of functions related to sorted vectors
decomposition of an incidence matrix
Definition: geometry.h:400
data_structures::partitionstack * Stack
Definition: geometry.h:408
void print_row_decomposition_tex(std::ostream &ost, int f_enter_math, int f_print_subscripts, int verbose_level)
void print_column_decomposition_tex(std::ostream &ost, int f_enter_math, int f_print_subscripts, int verbose_level)
void plane_intersections(grassmann *G, long int *set, int set_size, ring_theory::longinteger_object *&R, data_structures::set_of_sets &SoS, int verbose_level)
void init(blt_set_domain *D, long int *the_set, int verbose_level)
void unrank_point(int *v, int stride, long int rk, int verbose_level)
a class to represent arbitrary precision integers
Definition: ring_theory.h:366
#define Lint_vec_copy(A, B, C)
Definition: foundations.h:694
#define FREE_OBJECTS(p)
Definition: foundations.h:652
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_OBJECT(type)
Definition: foundations.h:638
#define NEW_int(n)
Definition: foundations.h:625
#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 Int_vec_print(A, B, C)
Definition: foundations.h:685
the orbiter library for the classification of combinatorial objects