nissy-core

The "engine" of nissy, including the H48 optimal solver.
git clone https://git.tronto.net/nissy-core
Download | Log | Files | Refs | README | LICENSE

dr.h (3056B)


      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 = MM18_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 	.pruning_distribution = {
     36 		[0] = 1,
     37 		[1] = 1,
     38 		[2] = 5,
     39 		[3] = 44,
     40 		[4] = 487,
     41 		[5] = 5841,
     42 		[6] = 68364,
     43 		[7] = 776568,
     44 		[8] = 7950748,
     45 		[9] = 52098876,
     46 		[10] = 76236234,
     47 		[11] = 3771112,
     48 		[12] = 129,
     49 	},
     50 	.pruning_max = 12,
     51 	.sym = {
     52 		.classes = DREOESEP_CLASSES,
     53 		.max = DREOESEP_MAX,
     54 		.coord = &coord_dreoesep_nosym,
     55 		.cube = &invcoord_dreoesep_nosym,
     56 		.max2 = POW_3_7,
     57 		.coord2 = &coord_co_u,
     58 		.cube2 = &invcoord_co_u,
     59 		.merge = &coordinate_dr_merge,
     60 	},
     61 };
     62 
     63 STATIC uint64_t
     64 coord_dreoesep_nosym(cube_t cube)
     65 {
     66 	uint64_t eo, esep;
     67 
     68 	esep = coord_esep(cube) / COMB_8_4;
     69 	eo = coord_eo(cube);
     70 
     71 	return esep * POW_2_11 + eo;
     72 }
     73 
     74 STATIC cube_t
     75 invcoord_dreoesep_nosym(uint64_t coord)
     76 {
     77 	uint64_t eo, esep;
     78 	cube_t cube;
     79 
     80 	eo = coord % POW_2_11;
     81 	esep = (coord / POW_2_11) * COMB_8_4; 
     82 	cube = invcoord_esep(esep);
     83 	set_eo(&cube, eo);
     84 
     85 	return cube;
     86 }
     87 
     88 STATIC cube_t
     89 coordinate_dr_merge(cube_t c1, cube_t c2)
     90 {
     91 	cube_t merged;
     92 
     93 	merged = c1;
     94 	copy_corners(&merged, c2);
     95 
     96 	return merged;
     97 }
     98 
     99 STATIC uint64_t
    100 coordinate_dr_coord(cube_t cube, const unsigned char *data)
    101 {
    102 	return coord_coord_generic(&coordinate_dr, cube, data);
    103 }
    104 
    105 STATIC cube_t
    106 coordinate_dr_cube(uint64_t i, const unsigned char *data)
    107 {
    108 	return coord_cube_generic(&coordinate_dr, i, data);
    109 }
    110 
    111 STATIC bool
    112 coordinate_dr_isnasty(uint64_t i, const unsigned char *data)
    113 {
    114 	return coord_isnasty_generic(&coordinate_dr, i, data);
    115 }
    116 
    117 STATIC size_t
    118 coordinate_dr_gendata(unsigned char *data)
    119 {
    120 	return coord_gendata_generic(&coordinate_dr, data);
    121 }
    122 
    123 STATIC bool
    124 is_eoco_solvable(cube_t cube) {
    125 	uint8_t c[8], e[12], i, cocount, eocount;
    126 
    127 	pieces(&cube, c, e);
    128 
    129 	for (i = 0, cocount = 0; i < 8; i++)
    130 		cocount += (c[i] & COBITS_2) >> COSHIFT;
    131 
    132 	for (i = 0, eocount = 0; i < 12; i++)
    133 		eocount += (e[i] & EOBIT) >> EOSHIFT;
    134 
    135 	return cocount % 3 == 0 && eocount % 2 == 0;
    136 }