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

dr.h (2814B)


      1 #define DREOESEP_CLASSES UINT64_C(64430)
      2 #define DREOESEP_MAX     (POW_2_11 * COMB_12_4)
      3 
      4 STATIC uint64_t coord_dreoesep_nosym(cube_t);
      5 STATIC cube_t invcoord_dreoesep_nosym(uint64_t);
      6 STATIC cube_t coordinate_dr_merge(cube_t, cube_t);
      7 
      8 STATIC uint64_t coordinate_dr_coord(cube_t, const unsigned char *);
      9 STATIC cube_t coordinate_dr_cube(uint64_t, const unsigned char *);
     10 STATIC bool coordinate_dr_isnasty(uint64_t, const unsigned char *);
     11 STATIC size_t coordinate_dr_gendata(unsigned char *);
     12 
     13 STATIC bool is_eoco_solvable(cube_t);
     14 
     15 /* TODO: remove the following two when all coordinates are converted to unsigned */
     16 STATIC uint64_t coord_co_u(cube_t c) { return (uint64_t)coord_co(c); }
     17 STATIC cube_t invcoord_co_u(uint64_t i) { return invcoord_co((int64_t)i); }
     18 
     19 STATIC coord_t coordinate_dr = {
     20 	.name = "DR",
     21 	.coord = &coordinate_dr_coord,
     22 	.cube = &coordinate_dr_cube,
     23 	.isnasty = &coordinate_dr_isnasty,
     24 	.gendata = coordinate_dr_gendata,
     25 	.max = DREOESEP_CLASSES * POW_3_7,
     26 	.trans_mask = TM_UDFIX,
     27 	.moves_mask = MM_ALLMOVES,
     28 	.axistrans = {
     29 		[AXIS_UD] = TRANS_UFr,
     30 		[AXIS_RL] = TRANS_RFr,
     31 		[AXIS_FB] = TRANS_FDr,
     32 	},
     33 	.is_admissible = &solution_lastqt_cw,
     34 	.is_solvable = &is_eoco_solvable,
     35 	.sym = {
     36 		.classes = DREOESEP_CLASSES,
     37 		.max = DREOESEP_MAX,
     38 		.coord = &coord_dreoesep_nosym,
     39 		.cube = &invcoord_dreoesep_nosym,
     40 		.max2 = POW_3_7,
     41 		.coord2 = &coord_co_u,
     42 		.cube2 = &invcoord_co_u,
     43 		.merge = &coordinate_dr_merge,
     44 	},
     45 };
     46 
     47 STATIC uint64_t
     48 coord_dreoesep_nosym(cube_t cube)
     49 {
     50 	uint64_t eo, esep;
     51 
     52 	esep = coord_esep(cube) / COMB_8_4;
     53 	eo = coord_eo(cube);
     54 
     55 	return esep * POW_2_11 + eo;
     56 }
     57 
     58 STATIC cube_t
     59 invcoord_dreoesep_nosym(uint64_t coord)
     60 {
     61 	uint64_t eo, esep;
     62 	cube_t cube;
     63 
     64 	eo = coord % POW_2_11;
     65 	esep = (coord / POW_2_11) * COMB_8_4; 
     66 	cube = invcoord_esep(esep);
     67 	set_eo(&cube, eo);
     68 
     69 	return cube;
     70 }
     71 
     72 STATIC cube_t
     73 coordinate_dr_merge(cube_t c1, cube_t c2)
     74 {
     75 	cube_t merged;
     76 
     77 	merged = c1;
     78 	copy_corners(&merged, c2);
     79 
     80 	return merged;
     81 }
     82 
     83 STATIC uint64_t
     84 coordinate_dr_coord(cube_t cube, const unsigned char *data)
     85 {
     86 	return coord_coord_generic(&coordinate_dr, cube, data);
     87 }
     88 
     89 STATIC cube_t
     90 coordinate_dr_cube(uint64_t i, const unsigned char *data)
     91 {
     92 	return coord_cube_generic(&coordinate_dr, i, data);
     93 }
     94 
     95 STATIC bool
     96 coordinate_dr_isnasty(uint64_t i, const unsigned char *data)
     97 {
     98 	return coord_isnasty_generic(&coordinate_dr, i, data);
     99 }
    100 
    101 STATIC size_t
    102 coordinate_dr_gendata(unsigned char *data)
    103 {
    104 	return coord_gendata_generic(&coordinate_dr, data);
    105 }
    106 
    107 STATIC bool
    108 is_eoco_solvable(cube_t cube) {
    109 	uint8_t c[8], e[12], i, cocount, eocount;
    110 
    111 	pieces(&cube, c, e);
    112 
    113 	for (i = 0, cocount = 0; i < 8; i++)
    114 		cocount += (c[i] & COBITS_2) >> COSHIFT;
    115 
    116 	for (i = 0, eocount = 0; i < 12; i++)
    117 		eocount += (e[i] & EOBIT) >> EOSHIFT;
    118 
    119 	return cocount % 3 == 0 && eocount % 2 == 0;
    120 }