aboutsummaryrefslogtreecommitdiff
path: root/src/solvers/coord
diff options
context:
space:
mode:
Diffstat (limited to 'src/solvers/coord')
-rw-r--r--src/solvers/coord/common.h25
-rw-r--r--src/solvers/coord/gendata.h4
-rw-r--r--src/solvers/coord/solve.h61
-rw-r--r--src/solvers/coord/types_macros.h2
4 files changed, 41 insertions, 51 deletions
diff --git a/src/solvers/coord/common.h b/src/solvers/coord/common.h
index d570b6d..8553658 100644
--- a/src/solvers/coord/common.h
+++ b/src/solvers/coord/common.h
@@ -4,9 +4,9 @@ coord_t *all_coordinates[] = {
4}; 4};
5 5
6STATIC void append_coord_name(const coord_t *, char *); 6STATIC void append_coord_name(const coord_t *, char *);
7STATIC coord_t *parse_coord(const char *, int); 7STATIC coord_t *parse_coord(size_t n, const char [n]);
8STATIC uint8_t parse_axis(const char *, int); 8STATIC uint8_t parse_axis(size_t n, const char [n]);
9STATIC void parse_coord_and_axis(const char *, int, coord_t **, uint8_t *); 9STATIC void parse_coord_and_axis(size_t n, const char [n], coord_t **, uint8_t *);
10STATIC int64_t dataid_coord(const char *, char [static NISSY_DATAID_SIZE]); 10STATIC int64_t dataid_coord(const char *, char [static NISSY_DATAID_SIZE]);
11 11
12STATIC void 12STATIC void
@@ -22,7 +22,7 @@ append_coord_name(const coord_t *coord, char *str)
22} 22}
23 23
24STATIC coord_t * 24STATIC coord_t *
25parse_coord(const char *coord, int n) 25parse_coord(size_t n, const char coord[n])
26{ 26{
27 int i; 27 int i;
28 28
@@ -34,7 +34,7 @@ parse_coord(const char *coord, int n)
34} 34}
35 35
36STATIC uint8_t 36STATIC uint8_t
37parse_axis(const char *axis, int n) 37parse_axis(size_t n, const char axis[n])
38{ 38{
39 if (!strncmp(axis, "UD", n) || !strncmp(axis, "DU", n)) { 39 if (!strncmp(axis, "UD", n) || !strncmp(axis, "DU", n)) {
40 return AXIS_UD; 40 return AXIS_UD;
@@ -48,19 +48,24 @@ parse_axis(const char *axis, int n)
48} 48}
49 49
50STATIC void 50STATIC void
51parse_coord_and_axis(const char *str, int n, coord_t **coord, uint8_t *axis) 51parse_coord_and_axis(
52 size_t n,
53 const char str[n],
54 coord_t **coord,
55 uint8_t *axis
56)
52{ 57{
53 int i; 58 size_t i;
54 59
55 for (i = 0; i < n; i++) 60 for (i = 0; i < n; i++)
56 if (str[i] == '_') 61 if (str[i] == '_')
57 break; 62 break;
58 63
59 if (coord != NULL) 64 if (coord != NULL)
60 *coord = parse_coord(str, i); 65 *coord = parse_coord(i, str);
61 66
62 if (axis != NULL) 67 if (axis != NULL)
63 *axis = i == n ? UINT8_ERROR : parse_axis(str+i+1, n-i-1); 68 *axis = i == n ? UINT8_ERROR : parse_axis(n-i-1, str+i+1);
64} 69}
65 70
66STATIC int64_t 71STATIC int64_t
@@ -68,7 +73,7 @@ dataid_coord(const char *ca, char dataid[static NISSY_DATAID_SIZE])
68{ 73{
69 coord_t *c; 74 coord_t *c;
70 75
71 parse_coord_and_axis(ca, strlen(ca), &c, NULL); 76 parse_coord_and_axis(strlen(ca), ca, &c, NULL);
72 77
73 if (c == NULL) { 78 if (c == NULL) {
74 LOG("dataid_coord: cannot parse coordinate from '%s'\n", ca); 79 LOG("dataid_coord: cannot parse coordinate from '%s'\n", ca);
diff --git a/src/solvers/coord/gendata.h b/src/solvers/coord/gendata.h
index 93ffc65..5819608 100644
--- a/src/solvers/coord/gendata.h
+++ b/src/solvers/coord/gendata.h
@@ -11,7 +11,7 @@ gendata_coord_dispatch(const char *coordstr, void *buf)
11{ 11{
12 coord_t *coord; 12 coord_t *coord;
13 13
14 parse_coord_and_axis(coordstr, strlen(coordstr), &coord, NULL); 14 parse_coord_and_axis(strlen(coordstr), coordstr, &coord, NULL);
15 15
16 if (coord == NULL) { 16 if (coord == NULL) {
17 LOG("Could not parse coordinate '%s'\n", coord); 17 LOG("Could not parse coordinate '%s'\n", coord);
@@ -137,7 +137,7 @@ getdistribution_coord(
137 137
138 memset(distr, 0, INFO_DISTRIBUTION_LEN * sizeof(uint64_t)); 138 memset(distr, 0, INFO_DISTRIBUTION_LEN * sizeof(uint64_t));
139 139
140 if((c = parse_coord(coord, strlen(coord))) == NULL) 140 if((c = parse_coord(strlen(coord), coord)) == NULL)
141 return; 141 return;
142 142
143 for (i = 0; i < c->max; i++) { 143 for (i = 0; i < c->max; i++) {
diff --git a/src/solvers/coord/solve.h b/src/solvers/coord/solve.h
index 6903d1e..fa160f8 100644
--- a/src/solvers/coord/solve.h
+++ b/src/solvers/coord/solve.h
@@ -1,10 +1,8 @@
1#define MAXLEN_COORDSOL 20
2
3typedef struct { 1typedef struct {
4 cube_t cube; 2 cube_t cube;
5 uint8_t depth; 3 uint8_t depth;
6 uint8_t nmoves; 4 uint8_t nmoves;
7 uint8_t moves[MAXLEN_COORDSOL]; 5 uint8_t moves[MAXLEN];
8 coord_t *coord; 6 coord_t *coord;
9 const void *coord_data; 7 const void *coord_data;
10 const uint8_t *ptable; 8 const uint8_t *ptable;
@@ -13,23 +11,22 @@ typedef struct {
13 int64_t maxsolutions; 11 int64_t maxsolutions;
14 int optimal; 12 int optimal;
15 uint8_t *shortest_sol; 13 uint8_t *shortest_sol;
16 uint64_t solutions_size; 14 size_t solutions_size;
17 uint64_t *solutions_used; 15 size_t *solutions_used;
18 char **solutions; 16 char **solutions;
19} dfsarg_solve_coord_t; 17} dfsarg_solve_coord_t;
20 18
21STATIC int64_t solve_coord(cube_t, coord_t *, uint8_t, uint8_t, uint8_t, 19STATIC int64_t solve_coord(cube_t, coord_t *, uint8_t, uint8_t, uint8_t,
22 uint8_t, uint64_t, int, int, uint64_t, const void *, uint64_t, char *); 20 uint8_t, uint64_t, int, int, uint64_t, const void *, size_t, char *);
23STATIC int64_t solve_coord_dispatch(cube_t, const char *, uint8_t, uint8_t, 21STATIC int64_t solve_coord_dispatch(cube_t, const char *, uint8_t, uint8_t,
24 uint8_t, uint64_t, int, int, uint64_t, const void *, uint64_t, char *); 22 uint8_t, uint64_t, int, int, uint64_t, const void *, size_t, char *);
25STATIC bool solve_coord_appendchar(char *, uint64_t, uint64_t *, char);
26STATIC int64_t solve_coord_appendsolution(dfsarg_solve_coord_t *); 23STATIC int64_t solve_coord_appendsolution(dfsarg_solve_coord_t *);
27STATIC int64_t solve_coord_dfs(dfsarg_solve_coord_t *); 24STATIC int64_t solve_coord_dfs(dfsarg_solve_coord_t *);
28 25
29STATIC int64_t 26STATIC int64_t
30solve_coord_appendsolution(dfsarg_solve_coord_t *arg) 27solve_coord_appendsolution(dfsarg_solve_coord_t *arg)
31{ 28{
32 uint8_t i, t, tmoves[MAXLEN_COORDSOL]; 29 uint8_t i, t, tmoves[MAXLEN];
33 int64_t strl; 30 int64_t strl;
34 uint64_t l; 31 uint64_t l;
35 char *m; 32 char *m;
@@ -44,18 +41,18 @@ solve_coord_appendsolution(dfsarg_solve_coord_t *arg)
44 for (i = 0; i < arg->nmoves; i++) 41 for (i = 0; i < arg->nmoves; i++)
45 tmoves[i] = transform_move(arg->moves[i], t); 42 tmoves[i] = transform_move(arg->moves[i], t);
46 43
47 sortparallel(tmoves, arg->nmoves); 44 sortparallel(arg->nmoves, tmoves);
48 45
49 l = arg->solutions_size - *arg->solutions_used; 46 l = arg->solutions_size - *arg->solutions_used;
50 m = *arg->solutions + *arg->solutions_used; 47 m = *arg->solutions + *arg->solutions_used;
51 strl = writemoves(tmoves, arg->nmoves, l, m); 48 strl = writemoves(arg->nmoves, tmoves, l, m);
52 if (strl < 0) 49 if (strl < 0)
53 goto solve_coord_appendsolution_error; 50 goto solve_coord_appendsolution_error;
54 51
55 *arg->solutions_used += MAX(0, strl-1); 52 *arg->solutions_used += MAX(0, strl-1);
56 53
57 if (!solve_coord_appendchar( 54 if (!appendchar(
58 *arg->solutions, arg->solutions_size, arg->solutions_used, '\n')) 55 arg->solutions_size, *arg->solutions, arg->solutions_used, '\n'))
59 goto solve_coord_appendsolution_error; 56 goto solve_coord_appendsolution_error;
60 57
61 (*arg->nsols)++; 58 (*arg->nsols)++;
@@ -68,18 +65,6 @@ solve_coord_appendsolution_error:
68 return NISSY_ERROR_BUFFER_SIZE; 65 return NISSY_ERROR_BUFFER_SIZE;
69} 66}
70 67
71STATIC bool
72solve_coord_appendchar(char *s, uint64_t s_size, uint64_t *s_used, char c)
73{
74 if (s_size == *s_used)
75 return false;
76
77 s[*s_used] = c;
78 (*s_used)++;
79
80 return true;
81}
82
83STATIC int64_t 68STATIC int64_t
84solve_coord_dfs(dfsarg_solve_coord_t *arg) 69solve_coord_dfs(dfsarg_solve_coord_t *arg)
85{ 70{
@@ -104,7 +89,7 @@ solve_coord_dfs(dfsarg_solve_coord_t *arg)
104 backup_cube = arg->cube; 89 backup_cube = arg->cube;
105 90
106 ret = 0; 91 ret = 0;
107 mm = allowednextmove_mask(arg->moves, arg->nmoves); 92 mm = allowednextmove_mask(arg->nmoves, arg->moves);
108 arg->nmoves++; 93 arg->nmoves++;
109 for (m = 0; m < 18; m++) { 94 for (m = 0; m < 18; m++) {
110 if (!(mm & (1 << m))) 95 if (!(mm & (1 << m)))
@@ -135,7 +120,7 @@ solve_coord_dispatch(
135 int threads, 120 int threads,
136 uint64_t data_size, 121 uint64_t data_size,
137 const void *data, 122 const void *data,
138 uint64_t sols_size, 123 size_t solutions_size,
139 char *sols 124 char *sols
140) 125)
141{ 126{
@@ -143,7 +128,7 @@ solve_coord_dispatch(
143 uint8_t axis; 128 uint8_t axis;
144 129
145 parse_coord_and_axis( 130 parse_coord_and_axis(
146 coord_and_axis, strlen(coord_and_axis), &coord, &axis); 131 strlen(coord_and_axis), coord_and_axis, &coord, &axis);
147 132
148 if (coord == NULL) { 133 if (coord == NULL) {
149 LOG("Could not parse coordinate from '%s'\n", coord_and_axis); 134 LOG("Could not parse coordinate from '%s'\n", coord_and_axis);
@@ -156,7 +141,8 @@ solve_coord_dispatch(
156 } 141 }
157 142
158 return solve_coord(cube, coord, axis, nissflag, minmoves, maxmoves, 143 return solve_coord(cube, coord, axis, nissflag, minmoves, maxmoves,
159 maxsolutions, optimal, threads, data_size, data, sols_size, sols); 144 maxsolutions, optimal, threads, data_size, data,
145 solutions_size, sols);
160} 146}
161 147
162STATIC int64_t 148STATIC int64_t
@@ -172,14 +158,14 @@ solve_coord(
172 int threads, 158 int threads,
173 uint64_t data_size, 159 uint64_t data_size,
174 const void *data, 160 const void *data,
175 uint64_t sols_size, 161 size_t solutions_size,
176 char *sols 162 char *sols
177) 163)
178{ 164{
179 int8_t d; 165 int8_t d;
180 uint8_t t, shortest_sol; 166 uint8_t t, shortest_sol;
181 int64_t nsols, ndepth; 167 int64_t nsols, ndepth;
182 uint64_t sols_used; 168 size_t solutions_used;
183 cube_t c; 169 cube_t c;
184 const void *coord_data; 170 const void *coord_data;
185 const uint8_t *ptable; 171 const uint8_t *ptable;
@@ -200,8 +186,8 @@ solve_coord(
200 } 186 }
201 187
202 nsols = 0; 188 nsols = 0;
203 sols_used = 0; 189 solutions_used = 0;
204 shortest_sol = MAXLEN_COORDSOL + 1; 190 shortest_sol = MAXLEN + 1;
205 t = coord->axistrans[axis]; 191 t = coord->axistrans[axis];
206 c = transform(cube, t); 192 c = transform(cube, t);
207 193
@@ -215,16 +201,15 @@ solve_coord(
215 .maxsolutions = (int64_t)maxsolutions, 201 .maxsolutions = (int64_t)maxsolutions,
216 .optimal = optimal, 202 .optimal = optimal,
217 .shortest_sol = &shortest_sol, 203 .shortest_sol = &shortest_sol,
218 .solutions_size = sols_size, 204 .solutions_size = solutions_size,
219 .solutions_used = &sols_used, 205 .solutions_used = &solutions_used,
220 .solutions = &sols, 206 .solutions = &sols,
221 }; 207 };
222 208
223 if (coord->coord(c, coord_data) == 0) { 209 if (coord->coord(c, coord_data) == 0) {
224 if (minmoves == 0) { 210 if (minmoves == 0) {
225 nsols = 1; 211 nsols = 1;
226 if (!solve_coord_appendchar( 212 if (!appendchar(solutions_size, sols, &solutions_used, '\n'))
227 sols, sols_size, &sols_used, '\n'))
228 goto solve_coord_error_buffer; 213 goto solve_coord_error_buffer;
229 } 214 }
230 goto solve_coord_done; 215 goto solve_coord_done;
@@ -254,7 +239,7 @@ solve_coord(
254 } 239 }
255 240
256solve_coord_done: 241solve_coord_done:
257 if (!solve_coord_appendchar(sols, sols_size, &sols_used, '\0')) 242 if (!appendchar(solutions_size, sols, &solutions_used, '\0'))
258 goto solve_coord_error_buffer; 243 goto solve_coord_error_buffer;
259 244
260 return nsols; 245 return nsols;
diff --git a/src/solvers/coord/types_macros.h b/src/solvers/coord/types_macros.h
index 2309efc..f2d436c 100644
--- a/src/solvers/coord/types_macros.h
+++ b/src/solvers/coord/types_macros.h
@@ -11,5 +11,5 @@ typedef struct {
11 uint32_t moves_mask; 11 uint32_t moves_mask;
12 uint64_t trans_mask; 12 uint64_t trans_mask;
13 uint8_t axistrans[3]; 13 uint8_t axistrans[3];
14 bool (*is_admissible)(int n, uint8_t [n]); 14 bool (*is_admissible)(size_t n, uint8_t [n]);
15} coord_t; 15} coord_t;

Generated with cgit - Back to sebastiano.tronto.net