diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2024-10-14 00:05:43 +0200 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2024-10-14 14:45:22 +0200 |
| commit | 8a91354f7b94c669c77fe628a81f9bfe9f599ef0 (patch) | |
| tree | ba29a8b0416cb3464b49fd7cfb69e7f407b892c8 /src/nissy.c | |
| parent | 7dbd34574f629cacf3b89292d2a06ad0ae612f26 (diff) | |
| download | nissy-core-8a91354f7b94c669c77fe628a81f9bfe9f599ef0.tar.gz nissy-core-8a91354f7b94c669c77fe628a81f9bfe9f599ef0.zip | |
Interface changes, progress with python
Diffstat (limited to 'src/nissy.c')
| -rw-r--r-- | src/nissy.c | 115 |
1 files changed, 35 insertions, 80 deletions
diff --git a/src/nissy.c b/src/nissy.c index 6b083e0..fe2747b 100644 --- a/src/nissy.c +++ b/src/nissy.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include "solvers/solvers.h" | 12 | #include "solvers/solvers.h" |
| 13 | 13 | ||
| 14 | int parse_h48_solver(const char *, uint8_t [static 1], uint8_t [static 1]); | 14 | int parse_h48_solver(const char *, uint8_t [static 1], uint8_t [static 1]); |
| 15 | STATIC int64_t write_result(cube_t, char [static NISSY_SIZE_B32]); | 15 | STATIC long long write_result(cube_t, char [static NISSY_SIZE_B32]); |
| 16 | STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN], | 16 | STATIC bool distribution_equal(const uint64_t [static INFO_DISTRIBUTION_LEN], |
| 17 | const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t); | 17 | const uint64_t [static INFO_DISTRIBUTION_LEN], uint8_t); |
| 18 | STATIC bool checkdata(const char *, const tableinfo_t *); | 18 | STATIC bool checkdata(const char *, const tableinfo_t *); |
| @@ -20,7 +20,7 @@ STATIC bool checkdata(const char *, const tableinfo_t *); | |||
| 20 | #define GETCUBE_OPTIONS(S, F) { .option = S, .fix = F } | 20 | #define GETCUBE_OPTIONS(S, F) { .option = S, .fix = F } |
| 21 | struct { | 21 | struct { |
| 22 | char *option; | 22 | char *option; |
| 23 | void (*fix)(int64_t *, int64_t *, int64_t *, int64_t *); | 23 | void (*fix)(long long *, long long *, long long *, long long *); |
| 24 | } getcube_options[] = { | 24 | } getcube_options[] = { |
| 25 | GETCUBE_OPTIONS("fix", getcube_fix), | 25 | GETCUBE_OPTIONS("fix", getcube_fix), |
| 26 | GETCUBE_OPTIONS(NULL, NULL) | 26 | GETCUBE_OPTIONS(NULL, NULL) |
| @@ -105,7 +105,7 @@ distribution_equal( | |||
| 105 | return wrong == 0; | 105 | return wrong == 0; |
| 106 | } | 106 | } |
| 107 | 107 | ||
| 108 | STATIC int64_t | 108 | STATIC long long |
| 109 | write_result(cube_t cube, char result[static NISSY_SIZE_B32]) | 109 | write_result(cube_t cube, char result[static NISSY_SIZE_B32]) |
| 110 | { | 110 | { |
| 111 | writecube("B32", cube, NISSY_SIZE_B32, result); | 111 | writecube("B32", cube, NISSY_SIZE_B32, result); |
| @@ -118,7 +118,7 @@ write_result(cube_t cube, char result[static NISSY_SIZE_B32]) | |||
| 118 | return NISSY_OK; | 118 | return NISSY_OK; |
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | int64_t | 121 | long long |
| 122 | nissy_compose( | 122 | nissy_compose( |
| 123 | const char cube[static NISSY_SIZE_B32], | 123 | const char cube[static NISSY_SIZE_B32], |
| 124 | const char permutation[static NISSY_SIZE_B32], | 124 | const char permutation[static NISSY_SIZE_B32], |
| @@ -126,7 +126,7 @@ nissy_compose( | |||
| 126 | ) | 126 | ) |
| 127 | { | 127 | { |
| 128 | cube_t c, p, res; | 128 | cube_t c, p, res; |
| 129 | int64_t err; | 129 | long long err; |
| 130 | 130 | ||
| 131 | c = readcube("B32", cube); | 131 | c = readcube("B32", cube); |
| 132 | 132 | ||
| @@ -159,14 +159,14 @@ nissy_compose_error: | |||
| 159 | return err; | 159 | return err; |
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | int64_t | 162 | long long |
| 163 | nissy_inverse( | 163 | nissy_inverse( |
| 164 | const char cube[static NISSY_SIZE_B32], | 164 | const char cube[static NISSY_SIZE_B32], |
| 165 | char result[static NISSY_SIZE_B32] | 165 | char result[static NISSY_SIZE_B32] |
| 166 | ) | 166 | ) |
| 167 | { | 167 | { |
| 168 | cube_t c, res; | 168 | cube_t c, res; |
| 169 | int64_t err; | 169 | long long err; |
| 170 | 170 | ||
| 171 | c = readcube("B32", cube); | 171 | c = readcube("B32", cube); |
| 172 | 172 | ||
| @@ -191,7 +191,7 @@ nissy_inverse_error: | |||
| 191 | return err; | 191 | return err; |
| 192 | } | 192 | } |
| 193 | 193 | ||
| 194 | int64_t | 194 | long long |
| 195 | nissy_applymoves( | 195 | nissy_applymoves( |
| 196 | const char cube[static NISSY_SIZE_B32], | 196 | const char cube[static NISSY_SIZE_B32], |
| 197 | const char *moves, | 197 | const char *moves, |
| @@ -199,7 +199,7 @@ nissy_applymoves( | |||
| 199 | ) | 199 | ) |
| 200 | { | 200 | { |
| 201 | cube_t c, res; | 201 | cube_t c, res; |
| 202 | int64_t err; | 202 | long long err; |
| 203 | 203 | ||
| 204 | if (moves == NULL) { | 204 | if (moves == NULL) { |
| 205 | LOG("Error: 'moves' argument is NULL\n"); | 205 | LOG("Error: 'moves' argument is NULL\n"); |
| @@ -230,7 +230,7 @@ nissy_applymoves_error: | |||
| 230 | return err; | 230 | return err; |
| 231 | } | 231 | } |
| 232 | 232 | ||
| 233 | int64_t | 233 | long long |
| 234 | nissy_applytrans( | 234 | nissy_applytrans( |
| 235 | const char cube[static NISSY_SIZE_B32], | 235 | const char cube[static NISSY_SIZE_B32], |
| 236 | const char transformation[static NISSY_SIZE_TRANSFORMATION], | 236 | const char transformation[static NISSY_SIZE_TRANSFORMATION], |
| @@ -238,7 +238,7 @@ nissy_applytrans( | |||
| 238 | ) | 238 | ) |
| 239 | { | 239 | { |
| 240 | cube_t c, res; | 240 | cube_t c, res; |
| 241 | int64_t err; | 241 | long long err; |
| 242 | 242 | ||
| 243 | c = readcube("B32", cube); | 243 | c = readcube("B32", cube); |
| 244 | 244 | ||
| @@ -263,47 +263,17 @@ nissy_applytrans_error: | |||
| 263 | return err; | 263 | return err; |
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | int64_t | 266 | long long |
| 267 | nissy_frommoves( | ||
| 268 | const char *moves, | ||
| 269 | char result[static NISSY_SIZE_B32] | ||
| 270 | ) | ||
| 271 | { | ||
| 272 | cube_t res; | ||
| 273 | int64_t err; | ||
| 274 | |||
| 275 | if (moves == NULL) { | ||
| 276 | LOG("Error: 'moves' argument is NULL\n"); | ||
| 277 | err = NISSY_ERROR_NULL_POINTER; | ||
| 278 | goto nissy_frommoves_error; | ||
| 279 | } | ||
| 280 | |||
| 281 | res = applymoves(SOLVED_CUBE, moves); | ||
| 282 | |||
| 283 | if (!isconsistent(res)) { | ||
| 284 | /* Assume we got a reasonable error message from applymoves */ | ||
| 285 | err = NISSY_ERROR_INVALID_MOVES; | ||
| 286 | goto nissy_frommoves_error; | ||
| 287 | } | ||
| 288 | |||
| 289 | return write_result(res, result); | ||
| 290 | |||
| 291 | nissy_frommoves_error: | ||
| 292 | writecube("B32", ZERO_CUBE, NISSY_SIZE_B32, result); | ||
| 293 | return err; | ||
| 294 | } | ||
| 295 | |||
| 296 | int64_t | ||
| 297 | nissy_convert( | 267 | nissy_convert( |
| 298 | const char *format_in, | 268 | const char *format_in, |
| 299 | const char *format_out, | 269 | const char *format_out, |
| 300 | const char *cube_string, | 270 | const char *cube_string, |
| 301 | uint64_t result_size, | 271 | unsigned result_size, |
| 302 | char result[result_size] | 272 | char result[result_size] |
| 303 | ) | 273 | ) |
| 304 | { | 274 | { |
| 305 | cube_t c; | 275 | cube_t c; |
| 306 | int64_t err; | 276 | long long err; |
| 307 | 277 | ||
| 308 | if (format_in == NULL) { | 278 | if (format_in == NULL) { |
| 309 | LOG("Error: 'format_in' argument is NULL\n"); | 279 | LOG("Error: 'format_in' argument is NULL\n"); |
| @@ -337,12 +307,12 @@ nissy_convert_error: | |||
| 337 | return err; | 307 | return err; |
| 338 | } | 308 | } |
| 339 | 309 | ||
| 340 | int64_t | 310 | long long |
| 341 | nissy_getcube( | 311 | nissy_getcube( |
| 342 | int64_t ep, | 312 | long long ep, |
| 343 | int64_t eo, | 313 | long long eo, |
| 344 | int64_t cp, | 314 | long long cp, |
| 345 | int64_t co, | 315 | long long co, |
| 346 | const char *options, | 316 | const char *options, |
| 347 | char result[static NISSY_SIZE_B32] | 317 | char result[static NISSY_SIZE_B32] |
| 348 | ) | 318 | ) |
| @@ -371,7 +341,7 @@ nissy_getcube( | |||
| 371 | return write_result(c, result); | 341 | return write_result(c, result); |
| 372 | } | 342 | } |
| 373 | 343 | ||
| 374 | int64_t | 344 | long long |
| 375 | nissy_datasize( | 345 | nissy_datasize( |
| 376 | const char *solver | 346 | const char *solver |
| 377 | ) | 347 | ) |
| @@ -385,7 +355,7 @@ nissy_datasize( | |||
| 385 | return nissy_gendata(solver, 0, NULL); | 355 | return nissy_gendata(solver, 0, NULL); |
| 386 | } | 356 | } |
| 387 | 357 | ||
| 388 | int64_t | 358 | long long |
| 389 | nissy_datainfo( | 359 | nissy_datainfo( |
| 390 | uint64_t data_size, | 360 | uint64_t data_size, |
| 391 | const char data[data_size], | 361 | const char data[data_size], |
| @@ -394,7 +364,7 @@ nissy_datainfo( | |||
| 394 | { | 364 | { |
| 395 | uint8_t i; | 365 | uint8_t i; |
| 396 | tableinfo_t info; | 366 | tableinfo_t info; |
| 397 | int64_t ret; | 367 | long long ret; |
| 398 | 368 | ||
| 399 | ret = readtableinfo(data_size, data, &info); | 369 | ret = readtableinfo(data_size, data, &info); |
| 400 | if (ret != 0) | 370 | if (ret != 0) |
| @@ -434,10 +404,10 @@ nissy_datainfo( | |||
| 434 | return NISSY_OK; | 404 | return NISSY_OK; |
| 435 | } | 405 | } |
| 436 | 406 | ||
| 437 | int64_t | 407 | long long |
| 438 | nissy_gendata( | 408 | nissy_gendata( |
| 439 | const char *solver, | 409 | const char *solver, |
| 440 | uint64_t data_size, | 410 | unsigned long long data_size, |
| 441 | char data[data_size] | 411 | char data[data_size] |
| 442 | ) | 412 | ) |
| 443 | { | 413 | { |
| @@ -463,9 +433,9 @@ nissy_gendata( | |||
| 463 | } | 433 | } |
| 464 | } | 434 | } |
| 465 | 435 | ||
| 466 | int64_t | 436 | long long |
| 467 | nissy_checkdata( | 437 | nissy_checkdata( |
| 468 | uint64_t data_size, | 438 | unsigned long long data_size, |
| 469 | const char data[data_size] | 439 | const char data[data_size] |
| 470 | ) | 440 | ) |
| 471 | { | 441 | { |
| @@ -488,18 +458,18 @@ nissy_checkdata( | |||
| 488 | return NISSY_OK; | 458 | return NISSY_OK; |
| 489 | } | 459 | } |
| 490 | 460 | ||
| 491 | int64_t | 461 | long long |
| 492 | nissy_solve( | 462 | nissy_solve( |
| 493 | const char cube[static NISSY_SIZE_B32], | 463 | const char cube[static NISSY_SIZE_B32], |
| 494 | const char *solver, | 464 | const char *solver, |
| 495 | uint8_t nissflag, | 465 | unsigned nissflag, |
| 496 | int8_t minmoves, | 466 | unsigned minmoves, |
| 497 | int8_t maxmoves, | 467 | unsigned maxmoves, |
| 498 | int64_t maxsols, | 468 | unsigned maxsols, |
| 499 | int8_t optimal, | 469 | int optimal, |
| 500 | uint64_t data_size, | 470 | unsigned long long data_size, |
| 501 | const char data[data_size], | 471 | const char data[data_size], |
| 502 | uint64_t sols_size, | 472 | unsigned sols_size, |
| 503 | char sols[sols_size] | 473 | char sols[sols_size] |
| 504 | ) | 474 | ) |
| 505 | { | 475 | { |
| @@ -524,21 +494,6 @@ nissy_solve( | |||
| 524 | return NISSY_ERROR_UNSOLVABLE_CUBE; | 494 | return NISSY_ERROR_UNSOLVABLE_CUBE; |
| 525 | } | 495 | } |
| 526 | 496 | ||
| 527 | if (minmoves < 0) { | ||
| 528 | LOG("solve: 'minmoves' is negative, setting it to 0\n"); | ||
| 529 | minmoves = 0; | ||
| 530 | } | ||
| 531 | |||
| 532 | if (maxmoves < 0) { | ||
| 533 | LOG("solve: 'maxmoves' is negative, setting it to 20\n"); | ||
| 534 | maxmoves = 20; | ||
| 535 | } | ||
| 536 | |||
| 537 | if (maxsols < 0) { | ||
| 538 | LOG("solve: 'maxsols' is negative, stopping\n"); | ||
| 539 | return NISSY_ERROR_OPTIONS; | ||
| 540 | } | ||
| 541 | |||
| 542 | if (maxsols == 0) { | 497 | if (maxsols == 0) { |
| 543 | LOG("solve: 'maxsols' is 0, returning no solution\n"); | 498 | LOG("solve: 'maxsols' is 0, returning no solution\n"); |
| 544 | return 0; | 499 | return 0; |
| @@ -565,7 +520,7 @@ nissy_solve( | |||
| 565 | } | 520 | } |
| 566 | } | 521 | } |
| 567 | 522 | ||
| 568 | int64_t | 523 | long long |
| 569 | nissy_setlogger( | 524 | nissy_setlogger( |
| 570 | void (*log)(const char *, ...) | 525 | void (*log)(const char *, ...) |
| 571 | ) | 526 | ) |
