diff options
Diffstat (limited to 'src/nissy.c')
| -rw-r--r-- | src/nissy.c | 77 |
1 files changed, 22 insertions, 55 deletions
diff --git a/src/nissy.c b/src/nissy.c index 8aa0334..27f2b35 100644 --- a/src/nissy.c +++ b/src/nissy.c | |||
| @@ -17,7 +17,7 @@ long long parse_h48_solver( | |||
| 17 | STATIC bool checkdata(const unsigned char *, const tableinfo_t [static 1]); | 17 | STATIC bool checkdata(const unsigned char *, const tableinfo_t [static 1]); |
| 18 | STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN], | 18 | STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN], |
| 19 | const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t); | 19 | const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t); |
| 20 | STATIC long long write_result(cube_t, char [static NISSY_SIZE_CUBE]); | 20 | STATIC long long write_result(oriented_cube_t, char [static NISSY_SIZE_CUBE]); |
| 21 | STATIC size_t my_strnlen(const char *, size_t); | 21 | STATIC size_t my_strnlen(const char *, size_t); |
| 22 | STATIC long long nissy_dataid(const char *, char [static NISSY_SIZE_DATAID]); | 22 | STATIC long long nissy_dataid(const char *, char [static NISSY_SIZE_DATAID]); |
| 23 | STATIC long long nissy_gendata_unsafe( | 23 | STATIC long long nissy_gendata_unsafe( |
| @@ -117,7 +117,7 @@ distribution_equal( | |||
| 117 | } | 117 | } |
| 118 | 118 | ||
| 119 | STATIC long long | 119 | STATIC long long |
| 120 | write_result(cube_t cube, char result[static NISSY_SIZE_CUBE]) | 120 | write_result(oriented_cube_t cube, char result[static NISSY_SIZE_CUBE]) |
| 121 | { | 121 | { |
| 122 | writecube(cube, NISSY_SIZE_CUBE, result); | 122 | writecube(cube, NISSY_SIZE_CUBE, result); |
| 123 | 123 | ||
| @@ -142,53 +142,12 @@ my_strnlen(const char *str, size_t maxlen) | |||
| 142 | } | 142 | } |
| 143 | 143 | ||
| 144 | long long | 144 | long long |
| 145 | nissy_compose( | ||
| 146 | const char cube[static NISSY_SIZE_CUBE], | ||
| 147 | const char permutation[static NISSY_SIZE_CUBE], | ||
| 148 | char result[static NISSY_SIZE_CUBE] | ||
| 149 | ) | ||
| 150 | { | ||
| 151 | cube_t c, p, res; | ||
| 152 | long long err; | ||
| 153 | |||
| 154 | c = readcube(cube); | ||
| 155 | |||
| 156 | if (!isconsistent(c)) { | ||
| 157 | LOG("[compose] Error: the given cube is invalid\n"); | ||
| 158 | err = NISSY_ERROR_INVALID_CUBE; | ||
| 159 | goto nissy_compose_error; | ||
| 160 | } | ||
| 161 | |||
| 162 | p = readcube(permutation); | ||
| 163 | |||
| 164 | if (!isconsistent(p)) { | ||
| 165 | LOG("[compose] Error: given permutation is invalid\n"); | ||
| 166 | err = NISSY_ERROR_INVALID_CUBE; | ||
| 167 | goto nissy_compose_error; | ||
| 168 | } | ||
| 169 | |||
| 170 | res = compose(c, p); | ||
| 171 | |||
| 172 | if (!isconsistent(res)) { | ||
| 173 | LOG("[compose] Unknown error: resulting cube is invalid\n"); | ||
| 174 | err = NISSY_ERROR_UNKNOWN; | ||
| 175 | goto nissy_compose_error; | ||
| 176 | } | ||
| 177 | |||
| 178 | return write_result(res, result); | ||
| 179 | |||
| 180 | nissy_compose_error: | ||
| 181 | writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); | ||
| 182 | return err; | ||
| 183 | } | ||
| 184 | |||
| 185 | long long | ||
| 186 | nissy_inverse( | 145 | nissy_inverse( |
| 187 | const char cube[static NISSY_SIZE_CUBE], | 146 | const char cube[static NISSY_SIZE_CUBE], |
| 188 | char result[static NISSY_SIZE_CUBE] | 147 | char result[static NISSY_SIZE_CUBE] |
| 189 | ) | 148 | ) |
| 190 | { | 149 | { |
| 191 | cube_t c, res; | 150 | oriented_cube_t c, res; |
| 192 | long long err; | 151 | long long err; |
| 193 | 152 | ||
| 194 | c = readcube(cube); | 153 | c = readcube(cube); |
| @@ -199,7 +158,10 @@ nissy_inverse( | |||
| 199 | goto nissy_inverse_error; | 158 | goto nissy_inverse_error; |
| 200 | } | 159 | } |
| 201 | 160 | ||
| 202 | res = inverse(c); | 161 | res = (oriented_cube_t) { |
| 162 | .cube = inverse(c.cube), | ||
| 163 | .orientation = c.orientation | ||
| 164 | }; | ||
| 203 | 165 | ||
| 204 | if (!isconsistent(res)) { | 166 | if (!isconsistent(res)) { |
| 205 | LOG("[inverse] Unknown error: inverted cube is invalid\n"); | 167 | LOG("[inverse] Unknown error: inverted cube is invalid\n"); |
| @@ -210,7 +172,7 @@ nissy_inverse( | |||
| 210 | return write_result(res, result); | 172 | return write_result(res, result); |
| 211 | 173 | ||
| 212 | nissy_inverse_error: | 174 | nissy_inverse_error: |
| 213 | writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); | 175 | writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result); |
| 214 | return err; | 176 | return err; |
| 215 | } | 177 | } |
| 216 | 178 | ||
| @@ -221,7 +183,7 @@ nissy_applymoves( | |||
| 221 | char result[static NISSY_SIZE_CUBE] | 183 | char result[static NISSY_SIZE_CUBE] |
| 222 | ) | 184 | ) |
| 223 | { | 185 | { |
| 224 | cube_t c, res; | 186 | oriented_cube_t c, res; |
| 225 | long long err; | 187 | long long err; |
| 226 | 188 | ||
| 227 | if (moves == NULL) { | 189 | if (moves == NULL) { |
| @@ -249,7 +211,7 @@ nissy_applymoves( | |||
| 249 | return write_result(res, result); | 211 | return write_result(res, result); |
| 250 | 212 | ||
| 251 | nissy_applymoves_error: | 213 | nissy_applymoves_error: |
| 252 | writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); | 214 | writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result); |
| 253 | return err; | 215 | return err; |
| 254 | } | 216 | } |
| 255 | 217 | ||
| @@ -260,7 +222,7 @@ nissy_applytrans( | |||
| 260 | char result[static NISSY_SIZE_CUBE] | 222 | char result[static NISSY_SIZE_CUBE] |
| 261 | ) | 223 | ) |
| 262 | { | 224 | { |
| 263 | cube_t c, res; | 225 | oriented_cube_t c, res; |
| 264 | long long err; | 226 | long long err; |
| 265 | 227 | ||
| 266 | c = readcube(cube); | 228 | c = readcube(cube); |
| @@ -282,7 +244,7 @@ nissy_applytrans( | |||
| 282 | return write_result(res, result); | 244 | return write_result(res, result); |
| 283 | 245 | ||
| 284 | nissy_applytrans_error: | 246 | nissy_applytrans_error: |
| 285 | writecube(ZERO_CUBE, NISSY_SIZE_CUBE, result); | 247 | writecube(ZERO_ORIENTED_CUBE, NISSY_SIZE_CUBE, result); |
| 286 | return err; | 248 | return err; |
| 287 | } | 249 | } |
| 288 | 250 | ||
| @@ -310,13 +272,14 @@ nissy_getcube( | |||
| 310 | 272 | ||
| 311 | c = getcube(ep, eo, cp, co); | 273 | c = getcube(ep, eo, cp, co); |
| 312 | 274 | ||
| 313 | if (!isconsistent(c)) { | 275 | if (!isconsistent((oriented_cube_t){ .cube = c, .orientation = 0 })) { |
| 314 | LOG("[getcube] Error: could not get cube with ep=%lld, " | 276 | LOG("[getcube] Error: could not get cube with ep=%lld, " |
| 315 | "eo=%lld, cp=%lld, co=%lld.\n", ep, eo, cp, co); | 277 | "eo=%lld, cp=%lld, co=%lld.\n", ep, eo, cp, co); |
| 316 | return NISSY_ERROR_OPTIONS; | 278 | return NISSY_ERROR_OPTIONS; |
| 317 | } | 279 | } |
| 318 | 280 | ||
| 319 | return write_result(c, result); | 281 | /* TODO: should support orientation */ |
| 282 | return write_result((oriented_cube_t){.cube = c, .orientation = 0}, result); | ||
| 320 | } | 283 | } |
| 321 | 284 | ||
| 322 | long long | 285 | long long |
| @@ -497,6 +460,7 @@ nissy_solve( | |||
| 497 | long long stats[static NISSY_SIZE_SOLVE_STATS] | 460 | long long stats[static NISSY_SIZE_SOLVE_STATS] |
| 498 | ) | 461 | ) |
| 499 | { | 462 | { |
| 463 | oriented_cube_t oc; | ||
| 500 | cube_t c; | 464 | cube_t c; |
| 501 | long long parse_ret; | 465 | long long parse_ret; |
| 502 | uint8_t h, k; | 466 | uint8_t h, k; |
| @@ -507,14 +471,17 @@ nissy_solve( | |||
| 507 | return NISSY_ERROR_NULL_POINTER; | 471 | return NISSY_ERROR_NULL_POINTER; |
| 508 | } | 472 | } |
| 509 | 473 | ||
| 510 | c = readcube(cube); | 474 | oc = readcube(cube); |
| 475 | c = oc.cube; | ||
| 511 | 476 | ||
| 512 | if (!isconsistent(c)) { | 477 | /* TODO: solve should handle oriented cubes */ |
| 478 | |||
| 479 | if (!isconsistent(oc)) { | ||
| 513 | LOG("[solve] Error: cube is invalid\n"); | 480 | LOG("[solve] Error: cube is invalid\n"); |
| 514 | return NISSY_ERROR_INVALID_CUBE; | 481 | return NISSY_ERROR_INVALID_CUBE; |
| 515 | } | 482 | } |
| 516 | 483 | ||
| 517 | if (!issolvable(c)) { | 484 | if (!issolvable((oriented_cube_t){ .cube = c, .orientation = 0})) { |
| 518 | /* TODO: this is step-dependent */ | 485 | /* TODO: this is step-dependent */ |
| 519 | LOG("[solve] Error: cube is not solvable\n"); | 486 | LOG("[solve] Error: cube is not solvable\n"); |
| 520 | return NISSY_ERROR_UNSOLVABLE_CUBE; | 487 | return NISSY_ERROR_UNSOLVABLE_CUBE; |
