Orbiter 2022
Combinatorial Objects
flag_orbits.cpp
Go to the documentation of this file.
1// flag_orbits.cpp
2//
3// Anton Betten
4// September 23, 2017
5//
6//
7//
8//
9//
10
12#include "discreta/discreta.h"
15
16using namespace std;
17
18namespace orbiter {
19namespace layer4_classification {
20namespace invariant_relations {
21
23{
24 A = NULL;
25 A2 = NULL;
28
33
35 Flag_orbit_node = NULL;
37 Pt = NULL;
38}
39
41{
42 freeself();
43}
44
46{
47}
48
50{
51 int verbose_level = 0;
52 int f_v = (verbose_level >= 1);
53
54 if (f_v) {
55 cout << "flag_orbits::freeself" << endl;
56 }
57 if (Flag_orbit_node) {
58 if (f_v) {
59 cout << "flag_orbits::freeself before FREE_OBJECTS(Flag_orbit_node)" << endl;
60 }
62 }
63 if (Pt) {
64 if (f_v) {
65 cout << "flag_orbits::freeself before FREE_lint(Pt)" << endl;
66 }
68 }
69 if (f_v) {
70 cout << "flag_orbits::freeself done" << endl;
71 }
72 null();
73}
74
76 int nb_primary_orbits_lower,
77 int pt_representation_sz, int nb_flag_orbits,
78 int upper_bound_for_number_of_traces,
79 void (*func_to_free_received_trace)(void *trace_result, void *data, int verbose_level),
80 void (*func_latex_report_trace)(std::ostream &ost, void *trace_result, void *data, int verbose_level),
81 void *free_received_trace_data,
82 int verbose_level)
83{
84 int f_v = (verbose_level >= 1);
85
86 if (f_v) {
87 cout << "flag_orbits::init" << endl;
88 }
98
101 if (f_v) {
102 cout << "flag_orbits::init done" << endl;
103 }
104}
105
106int flag_orbits::find_node_by_po_so(int po, int so, int &idx,
107 int verbose_level)
108{
109 int f_v = (verbose_level >= 1);
110
111 if (f_v) {
112 cout << "flag_orbits::find_node_by_po_so" << endl;
113 }
114 int l, r, m, res;
115 int f_found = FALSE;
116 int len;
117
118 len = nb_flag_orbits;
119 if (f_v) {
120 cout << "flag_orbits::find_node_by_po_so len=" << len << endl;
121 }
122 if (len == 0) {
123 idx = 0;
124 return FALSE;
125 }
126 l = 0;
127 r = len;
128 // invariant:
129 // v[i] <= a for i < l;
130 // v[i] > a for i >= r;
131 // r - l is the length of the area to search in.
132 while (l < r) {
133 if (f_v) {
134 cout << "flag_orbits::find_node_by_po_so "
135 "l=" << l << " r=" << r << endl;
136 }
137 m = (l + r) >> 1;
138 // if the length of the search area is even
139 // we examine the element above the middle
140
141 if (Flag_orbit_node[m].downstep_primary_orbit < po) {
142 res = -1;
143 }
144 else if (Flag_orbit_node[m].downstep_primary_orbit > po) {
145 res = 1;
146 }
147 else {
148 if (Flag_orbit_node[m].downstep_secondary_orbit < so) {
149 res = -1;
150 }
151 else if (Flag_orbit_node[m].downstep_secondary_orbit > so) {
152 res = 1;
153 }
154 else {
155 res = 0;
156 }
157 }
158 //res = (*compare_func)(a, v[m], data_for_compare);
159 if (f_v) {
160 cout << "m=" << m << " res=" << res << endl;
161 }
162 //res = v[m] - a;
163 //cout << "search l=" << l << " m=" << m << " r="
164 // << r << "a=" << a << " v[m]=" << v[m] << " res=" << res << endl;
165 if (res <= 0) {
166 l = m + 1;
167 if (res == 0) {
168 f_found = TRUE;
169 }
170 }
171 else {
172 r = m;
173 }
174 }
175 // now: l == r;
176 // and f_found is set accordingly */
177 if (f_found) {
178 l--;
179 }
180 idx = l;
181 return f_found;
182}
183
184void flag_orbits::write_file(ofstream &fp, int verbose_level)
185{
186 int f_v = (verbose_level >= 1);
187 int f_vv = FALSE; //(verbose_level >= 1);
188 int i;
189
190 if (f_v) {
191 cout << "flag_orbits::write_file" << endl;
192 }
193 fp.write((char *) &nb_primary_orbits_lower, sizeof(int));
194 fp.write((char *) &nb_primary_orbits_upper, sizeof(int));
195 fp.write((char *) &nb_flag_orbits, sizeof(int));
196 fp.write((char *) &pt_representation_sz, sizeof(int));
197
198 if (f_vv) {
199 cout << "flag_orbits::write_file Pt matrix:" << endl;
201 }
202 for (i = 0; i < nb_flag_orbits * pt_representation_sz; i++) {
203 fp.write((char *) &Pt[i], sizeof(long int));
204 }
205 if (f_v) {
206 cout << "flag_orbits::write_file writing " << nb_flag_orbits << " nodes" << endl;
207 }
208 for (i = 0; i < nb_flag_orbits; i++) {
209 Flag_orbit_node[i].write_file(fp, 0 /*verbose_level*/);
210 }
211
212 if (f_v) {
213 cout << "flag_orbits::write_file finished" << endl;
214 }
215}
216
217void flag_orbits::read_file(ifstream &fp,
219 int verbose_level)
220{
221 int f_v = (verbose_level >= 1);
222 int f_vv = FALSE; //(verbose_level >= 1);
223 int i;
224
225 if (f_v) {
226 cout << "flag_orbits::read_file" << endl;
227 }
230 fp.read((char *) &nb_primary_orbits_lower, sizeof(int));
231 fp.read((char *) &nb_primary_orbits_upper, sizeof(int));
232 fp.read((char *) &nb_flag_orbits, sizeof(int));
233 fp.read((char *) &pt_representation_sz, sizeof(int));
234
236 for (i = 0; i < nb_flag_orbits * pt_representation_sz; i++) {
237 fp.read((char *) &Pt[i], sizeof(long int));
238 }
239 if (f_vv) {
240 cout << "flag_orbits::read_file Pt matrix:" << endl;
242 }
243
244 if (f_v) {
245 cout << "flag_orbits::read_file reading " << nb_flag_orbits << " nodes" << endl;
246 }
248 for (i = 0; i < nb_flag_orbits; i++) {
249 if (f_vv) {
250 cout << "flag_orbits::read_file "
251 "node " << i << " / " << nb_flag_orbits << endl;
252 }
255 Flag_orbit_node[i].read_file(fp, 0 /*verbose_level*/);
256 }
257
258 if (f_v) {
259 cout << "flag_orbits::read_file finished" << endl;
260 }
261}
262
263void flag_orbits::print_latex(ostream &ost,
264 const char *title, int f_print_stabilizer_gens)
265{
266 int verbose_level = 0;
267 int f_v = (verbose_level >= 1);
268
269 if (f_v) {
270 cout << "flag_orbits::print_latex" << endl;
271 }
272
273 //ost << "\\clearpage" << endl;
274 ost << "\\subsection*{" << title << "}" << endl;
275
276
277 ost << "The number of primary orbits below is " << nb_primary_orbits_lower << "\\\\" << endl;
278 ost << "The number of primary orbits above is " << nb_primary_orbits_upper << "\\\\" << endl;
279 ost << "The number of flag orbits is " << nb_flag_orbits << "\\\\" << endl;
280
281 int i;
282
283 ost << "The flag orbits are:" << endl;
284 ost << "\\begin{enumerate}[(1)]" << endl;
285 for (i = 0; i < nb_flag_orbits; i++) {
287
288 F = &Flag_orbit_node[i];
289 ost << "\\item" << endl;
290 F->print_latex(this, ost, f_print_stabilizer_gens);
291 }
292 ost << "\\end{enumerate}" << endl;
293
294}
295
296
297}}}
298
299
a permutation group in a fixed action.
Definition: actions.h:99
to represent a flag orbit; related to the class flag_orbits
Definition: classify.h:123
void print_latex(flag_orbits *Flag_orbits, std::ostream &ost, int f_print_stabilizer_gens)
int find_node_by_po_so(int po, int so, int &idx, int verbose_level)
void(* func_latex_report_trace)(std::ostream &ost, void *trace_result, void *data, int verbose_level)
Definition: classify.h:85
void init(actions::action *A, actions::action *A2, int nb_primary_orbits_lower, int pt_representation_sz, int nb_flag_orbits, int upper_bound_for_number_of_traces, void(*func_to_free_received_trace)(void *trace_result, void *data, int verbose_level), void(*func_latex_report_trace)(std::ostream &ost, void *trace_result, void *data, int verbose_level), void *free_received_trace_data, int verbose_level)
Definition: flag_orbits.cpp:75
void read_file(std::ifstream &fp, actions::action *A, actions::action *A2, int verbose_level)
void print_latex(std::ostream &ost, const char *title, int f_print_stabilizer_gens)
void write_file(std::ofstream &fp, int verbose_level)
void(* func_to_free_received_trace)(void *trace_result, void *data, int verbose_level)
Definition: classify.h:84
#define FREE_OBJECTS(p)
Definition: foundations.h:652
#define Lint_matrix_print(A, B, C)
Definition: foundations.h:708
#define NEW_OBJECTS(type, n)
Definition: foundations.h:639
#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
the orbiter library for the classification of combinatorial objects