h48

A prototype for an optimal Rubik's cube solver, work in progress.
git clone https://git.tronto.net/h48
Download | Log | Files | Refs | README | LICENSE

coorddata_dr.c (1266B)


      1 #include "../test.h"
      2 
      3 #define POW_3_7 2187
      4 #define BOUND   (64430 * POW_3_7 / 100)
      5 #define TGROUP  UINT64_C(4278190335)
      6 
      7 cube_t transform(cube_t, uint8_t);
      8 uint64_t coordinate_dr_coord(cube_t, const void *);
      9 cube_t coordinate_dr_cube(uint64_t, const void *);
     10 uint64_t coordinate_dr_gendata(void *);
     11 
     12 void run(void) {
     13 	bool found;
     14 	uint64_t t;
     15 	char str[STRLENMAX];
     16 	void *data;
     17 	size_t size;
     18 	cube_t cube;
     19 	uint64_t coord, coord2;
     20 
     21 	size = coordinate_dr_gendata(NULL);
     22 	data = malloc(size);
     23 	coordinate_dr_gendata(data);
     24 
     25 	/* Test all possible values for CO coordinate */
     26 	for (coord = 0; coord < BOUND; coord++) {
     27 		cube = coordinate_dr_cube(coord, data);
     28 
     29 		if (!isconsistent(cube)) {
     30 			printf("Error: invcoord of %" PRId64
     31 			    " is not consistent\n", coord);
     32 			goto cleanup;
     33 		}
     34 
     35 		for (t = 0, found = false; t < 48; t++) {
     36 			if (!((UINT64_C(1) << t) & TGROUP))
     37 				continue;
     38 
     39 			coord2 = coordinate_dr_coord(transform(cube, t), data);
     40 			if (coord == coord2) {
     41 				found = true;
     42 				break;
     43 			}
     44 		}
     45 
     46 		if (!found) {
     47 			printf("Error: invcoord of %" PRId64 " returns %"
     48 			    PRId64 " with cube:\n", coord, coord2);
     49 			writecube("H48", cube, STRLENMAX, str);
     50 			printf("%s\n", str);
     51 			goto cleanup;
     52 		}
     53 	}
     54 
     55 	printf("All good\n");
     56 
     57 cleanup:
     58 	free(data);
     59 }