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 (2647B)


      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 
      7 STATIC uint64_t coordinate_dr_coord(cube_t, const unsigned char *);
      8 STATIC cube_t coordinate_dr_cube(uint64_t, const unsigned char *);
      9 STATIC bool coordinate_dr_isnasty(uint64_t, const unsigned char *);
     10 STATIC size_t coordinate_dr_gendata(unsigned char *);
     11 
     12 STATIC bool is_eoco_solvable(cube_t);
     13 
     14 STATIC coord_t coordinate_dr = {
     15 	.name = "DR",
     16 	.coord = &coordinate_dr_coord,
     17 	.cube = &coordinate_dr_cube,
     18 	.isnasty = &coordinate_dr_isnasty,
     19 	.gendata = coordinate_dr_gendata,
     20 	.max = DREOESEP_CLASSES * POW_3_7,
     21 	.trans_mask = TM_UDFIX,
     22 	.moves_mask_gendata = MM18_ALLMOVES,
     23 	.moves_mask_solve = MM18_ALLMOVES,
     24 	.is_admissible = &solution_lastqt_cw,
     25 	.solution_prune = NULL,
     26 	.is_solvable = &is_eoco_solvable,
     27 	.is_solved = NULL,
     28 	.allow_niss = true,
     29 	.pruning_distribution = {
     30 		[0] = 1,
     31 		[1] = 1,
     32 		[2] = 5,
     33 		[3] = 44,
     34 		[4] = 487,
     35 		[5] = 5841,
     36 		[6] = 68364,
     37 		[7] = 776568,
     38 		[8] = 7950748,
     39 		[9] = 52098876,
     40 		[10] = 76236234,
     41 		[11] = 3771112,
     42 		[12] = 129,
     43 	},
     44 	.pruning_max = 12,
     45 	.sym = {
     46 		.classes = DREOESEP_CLASSES,
     47 		.max = DREOESEP_MAX,
     48 		.coord = &coord_dreoesep_nosym,
     49 		.cube = &invcoord_dreoesep_nosym,
     50 		.max2 = POW_3_7,
     51 		.coord2 = &coord_co,
     52 		.cube2 = &invcoord_co,
     53 		.merge = &coordinate_merge_ec,
     54 	},
     55 };
     56 
     57 STATIC uint64_t
     58 coord_dreoesep_nosym(cube_t cube)
     59 {
     60 	uint64_t eo, esep;
     61 
     62 	esep = coord_esep(cube) / COMB_8_4;
     63 	eo = coord_eo(cube);
     64 
     65 	return esep * POW_2_11 + eo;
     66 }
     67 
     68 STATIC cube_t
     69 invcoord_dreoesep_nosym(uint64_t coord)
     70 {
     71 	uint64_t eo, esep;
     72 	cube_t cube;
     73 
     74 	eo = coord % POW_2_11;
     75 	esep = (coord / POW_2_11) * COMB_8_4; 
     76 	cube = invcoord_esep(esep);
     77 	set_eo(&cube, eo);
     78 
     79 	return cube;
     80 }
     81 
     82 STATIC uint64_t
     83 coordinate_dr_coord(cube_t cube, const unsigned char *data)
     84 {
     85 	return coord_coord_generic(&coordinate_dr, cube, data);
     86 }
     87 
     88 STATIC cube_t
     89 coordinate_dr_cube(uint64_t i, const unsigned char *data)
     90 {
     91 	return coord_cube_generic(&coordinate_dr, i, data);
     92 }
     93 
     94 STATIC bool
     95 coordinate_dr_isnasty(uint64_t i, const unsigned char *data)
     96 {
     97 	return coord_isnasty_generic(&coordinate_dr, i, data);
     98 }
     99 
    100 STATIC size_t
    101 coordinate_dr_gendata(unsigned char *data)
    102 {
    103 	return coord_gendata_generic(&coordinate_dr, data);
    104 }
    105 
    106 STATIC bool
    107 is_eoco_solvable(cube_t cube) {
    108 	uint8_t c[8], e[12], i, cocount, eocount;
    109 
    110 	pieces(&cube, c, e);
    111 
    112 	for (i = 0, cocount = 0; i < 8; i++)
    113 		cocount += (c[i] & COBITS_2) >> COSHIFT;
    114 
    115 	for (i = 0, eocount = 0; i < 12; i++)
    116 		eocount += (e[i] & EOBIT) >> EOSHIFT;
    117 
    118 	return cocount % 3 == 0 && eocount % 2 == 0;
    119 }