Orbiter 2022
Combinatorial Objects
action_on_orthogonal.cpp
Go to the documentation of this file.
1// action_on_orthogonal.cpp
2//
3// Anton Betten
4// September 27, 2012
5
7#include "group_actions.h"
8
9using namespace std;
10
11
12namespace orbiter {
13namespace layer3_group_actions {
14namespace induced_actions {
15
16
18{
19 null();
20}
21
23{
24 free();
25}
26
28{
29 O = NULL;
30 v1 = NULL;
31 v2 = NULL;
32 w1 = NULL;
33 w2 = NULL;
37}
38
40{
41 if (v1) {
42 FREE_int(v1);
43 }
44 if (v2) {
45 FREE_int(v2);
46 }
47 if (w1) {
48 FREE_int(w1);
49 }
50 if (w2) {
51 FREE_int(w2);
52 }
53 null();
54}
55
58 int f_on_points,
59 int f_on_lines,
60 int f_on_points_and_lines,
61 int verbose_level)
62{
63 int f_v = (verbose_level >= 1);
64
65 if (f_v) {
66 cout << "action_on_orthogonal::init" << endl;
67 cout << "f_on_lines=" << f_on_lines << endl;
68 }
70 cout << "action_on_orthogonal::init "
71 "original_action not of linear type" << endl;
72 cout << "action " << original_action->label << endl;
73 exit(1);
74 }
81
86
87 if (f_on_points) {
89 }
90 else if (f_on_lines) {
91 degree = O->nb_lines;
92 }
93 else if (f_on_points_and_lines) {
95 }
96 else {
97 cout << "action_on_orthogonal::init "
98 "no type of action given" << endl;
99 exit(1);
100 }
101 if (f_v) {
102 cout << "action_on_orthogonal::init "
103 "degree=" << degree << endl;
104 }
105
106 if (f_v) {
107 cout << "action_on_orthogonal::init done" << endl;
108 }
109}
110
112{
113 O->unrank_point(v, 1 /* stride */, rk, 0 /* verbose_level */);
114}
115
117{
118 int rk;
119
120 rk = O->rank_point(v, 1 /* stride */, 0 /* verbose_level */);
121 return rk;
122}
123
125 int *Elt, long int i, int verbose_level)
126{
127 int f_v = (verbose_level >= 1);
128 long int j;
130
131 if (f_v) {
132 cout << "action_on_orthogonal::map_a_point" << endl;
133 }
134 A = original_action;
135 O->unrank_point(v1, 1 /* stride */, i, 0 /* verbose_level */);
136 A->element_image_of_low_level(v1, w1, Elt, verbose_level - 1);
137 j = O->rank_point(w1, 1 /* stride */, 0 /* verbose_level */);
138 if (f_v) {
139 cout << "action_on_orthogonal::map_a_point done" << endl;
140 }
141 return j;
142}
143
144long int action_on_orthogonal::map_a_line(int *Elt, long int i, int verbose_level)
145{
146 int f_v = (verbose_level >= 1);
147 int f_vv = (verbose_level >= 2);
148 long int j;
149 long int p1, p2, q1, q2;
151
152 if (f_v) {
153 cout << "action_on_orthogonal::map_a_line" << endl;
154 }
155 A = original_action;
156 O->unrank_line(p1, p2, i, 0 /*verbose_level */);
157 O->unrank_point(v1, 1 /* stride */, p1, 0 /* verbose_level */);
158 O->unrank_point(v2, 1 /* stride */, p2, 0 /* verbose_level */);
159 A->element_image_of_low_level(v1, w1, Elt, verbose_level - 1);
160 A->element_image_of_low_level(v2, w2, Elt, verbose_level - 1);
161 q1 = O->rank_point(w1, 1 /* stride */, 0 /* verbose_level */);
162 q2 = O->rank_point(w2, 1 /* stride */, 0 /* verbose_level */);
163 j = O->rank_line(q1, q2, 0 /*verbose_level */);
164 if (f_vv) {
165 cout << "action_on_orthogonal::map_a_line i=" << i
166 << " p1=" << p1 << " p2=" << p2
167 << " q1=" << q1 << " q2=" << q2 << " j=" << j << endl;
168 }
169 if (f_v) {
170 cout << "action_on_orthogonal::map_a_line done" << endl;
171 }
172 return j;
173}
174
176 int *Elt, long int i, int verbose_level)
177{
178 int f_v = (verbose_level >= 1);
179 long int j;
180 //action *A;
181
182 //A = original_action;
183
184 if (f_v) {
185 cout << "action_on_orthogonal::compute_image_int "
186 "i = " << i << endl;
187 //cout << "A->low_level_point_size="
188 //<< A->low_level_point_size << endl;
189 //cout << "using action " << A->label << endl;
190 }
191
192
193 if (i >= degree) {
194 cout << "action_on_orthogonal::compute_image_int "
195 "i >= degree" << endl;
196 }
197 if (f_on_points) {
198 j = map_a_point(Elt, i, verbose_level - 1);
199 }
200 else if (f_on_lines) {
201 j = map_a_line(Elt, i, verbose_level - 1);
202 }
203 else if (f_on_points_and_lines) {
204 if (i >= O->nb_points) {
205 i -= O->nb_points;
206 j = map_a_line(Elt, i, verbose_level - 1);
207 j += O->nb_points;
208 }
209 else {
210 j = map_a_point(Elt, i, verbose_level - 1);
211 }
212 }
213 else {
214 cout << "action_on_orthogonal::compute_image_int "
215 "need to know the type of action" << endl;
216 exit(1);
217 }
218
219 if (f_v) {
220 cout << "action_on_orthogonal::compute_image_int "
221 "image of " << i << " is " << j << endl;
222 }
223
224 return j;
225}
226
227}}}
228
229
230
long int rank_point(int *v, int stride, int verbose_level)
void unrank_point(int *v, int stride, long int rk, int verbose_level)
long int rank_line(long int p1, long int p2, int verbose_level)
void unrank_line(long int &p1, long int &p2, long int index, int verbose_level)
a permutation group in a fixed action.
Definition: actions.h:99
void element_image_of_low_level(int *input, int *output, void *elt, int verbose_level)
Definition: action_cb.cpp:209
long int map_a_line(int *Elt, long int i, int verbose_level)
long int map_a_point(int *Elt, long int i, int verbose_level)
void init(actions::action *original_action, orthogonal_geometry::orthogonal *O, int f_on_points, int f_on_lines, int f_on_points_and_lines, int verbose_level)
long int compute_image_int(int *Elt, long int i, int verbose_level)
#define FREE_int(p)
Definition: foundations.h:640
#define NEW_int(n)
Definition: foundations.h:625
#define FALSE
Definition: foundations.h:234
the orbiter library for the classification of combinatorial objects