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

dreo.h (2285B)


      1 #define DRESEP_CLASSES 81
      2 
      3 STATIC uint64_t coord_dresep_nosym(cube_t);
      4 STATIC cube_t invcoord_dresep_nosym(uint64_t);
      5 
      6 STATIC uint64_t coordinate_dreo_coord(cube_t, const unsigned char *);
      7 STATIC cube_t coordinate_dreo_cube(uint64_t, const unsigned char *);
      8 STATIC bool coordinate_dreo_isnasty(uint64_t, const unsigned char *);
      9 STATIC size_t coordinate_dreo_gendata(unsigned char *);
     10 
     11 STATIC bool is_dreo_solvable(cube_t);
     12 
     13 STATIC coord_t coordinate_dreo = {
     14 	.name = "DREO",
     15 	.coord = &coordinate_dreo_coord,
     16 	.cube = &coordinate_dreo_cube,
     17 	.isnasty = &coordinate_dreo_isnasty,
     18 	.gendata = coordinate_dreo_gendata,
     19 	.max = DRESEP_CLASSES * POW_3_7,
     20 	.trans_mask = TM_UDRLFIX,
     21 	.moves_mask_gendata = MM18_EO,
     22 	.moves_mask_solve = MM18_EO,
     23 	.is_admissible = &solution_lastqt_cw,
     24 	.solution_prune = NULL,
     25 	.is_solvable = &is_dreo_solvable,
     26 	.is_solved = NULL,
     27 	.allow_niss = true,
     28 	.pruning_distribution = {
     29 		[0] = 1,
     30 		[1] = 1,
     31 		[2] = 4,
     32 		[3] = 22,
     33 		[4] = 160,
     34 		[5] = 1286,
     35 		[6] = 8550,
     36 		[7] = 42152,
     37 		[8] = 90748,
     38 		[9] = 33466,
     39 		[10] = 757,
     40 	},
     41 	.pruning_max = 10,
     42 	.sym = {
     43 		.classes = DRESEP_CLASSES,
     44 		.max = COMB_12_4,
     45 		.coord = &coord_dresep_nosym,
     46 		.cube = &invcoord_dresep_nosym,
     47 		.max2 = POW_3_7,
     48 		.coord2 = &coord_co,
     49 		.cube2 = &invcoord_co,
     50 		.merge = &coordinate_merge_ec,
     51 	},
     52 };
     53 
     54 STATIC uint64_t
     55 coord_dresep_nosym(cube_t cube)
     56 {
     57 	return coord_esep(cube) / COMB_8_4;
     58 }
     59 
     60 STATIC cube_t
     61 invcoord_dresep_nosym(uint64_t coord)
     62 {
     63 	return invcoord_esep(coord * COMB_8_4);
     64 }
     65 
     66 STATIC uint64_t
     67 coordinate_dreo_coord(cube_t cube, const unsigned char *data)
     68 {
     69 	return coord_coord_generic(&coordinate_dreo, cube, data);
     70 }
     71 
     72 STATIC cube_t
     73 coordinate_dreo_cube(uint64_t i, const unsigned char *data)
     74 {
     75 	return coord_cube_generic(&coordinate_dreo, i, data);
     76 }
     77 
     78 STATIC bool
     79 coordinate_dreo_isnasty(uint64_t i, const unsigned char *data)
     80 {
     81 	return coord_isnasty_generic(&coordinate_dreo, i, data);
     82 }
     83 
     84 STATIC size_t
     85 coordinate_dreo_gendata(unsigned char *data)
     86 {
     87 	return coord_gendata_generic(&coordinate_dreo, data);
     88 }
     89 
     90 STATIC bool
     91 is_dreo_solvable(cube_t cube) {
     92 	uint8_t c[8], e[12], i, cocount;
     93 
     94 	if (coord_eo(cube) != 0)
     95 		return false;
     96 
     97 	pieces(&cube, c, e);
     98 
     99 	for (i = 0, cocount = 0; i < 8; i++)
    100 		cocount += (c[i] & COBITS_2) >> COSHIFT;
    101 
    102 	return cocount % 3 == 0;
    103 }