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

dispatch.h (2457B)


      1 typedef struct {
      2 	const char *solvername;
      3 	const char *prefix;
      4 	long long (*dataid)(const char *, char [static NISSY_SIZE_DATAID]);
      5 	long long (*gendata)(
      6 	    const char *, unsigned long long, unsigned char *);
      7 	long long (*checkdata)(
      8 	    const char *, unsigned long long, const unsigned char *);
      9 	long long (*solve)(oriented_cube_t, const char *, unsigned, unsigned,
     10 	    unsigned, unsigned, unsigned, unsigned, unsigned long long,
     11 	    const unsigned char *, unsigned, char *,
     12 	    long long [static NISSY_SIZE_SOLVE_STATS],
     13 	    int (*)(void *), void *);
     14 } solver_dispatch_t;
     15 
     16 STATIC solver_dispatch_t match_solver(const char *);
     17 
     18 solver_dispatch_t solver_dispatchers[] = {
     19 {
     20 	.prefix = "h48",
     21 	.dataid = dataid_h48,
     22 	.gendata = gendata_h48_dispatch,
     23 	.checkdata = checkdata_h48,
     24 	.solve = solve_h48_dispatch,
     25 },
     26 {
     27 	.prefix = "coord_",
     28 	.dataid = dataid_coord,
     29 	.gendata = gendata_coord_dispatch,
     30 	.checkdata = checkdata_coord_dispatch,
     31 	.solve = solve_coord_dispatch,
     32 },
     33 {
     34 	.prefix = "mcoord_",
     35 	.dataid = dataid_coord,
     36 	.gendata = gendata_coord_dispatch,
     37 	.checkdata = checkdata_coord_dispatch,
     38 	.solve = solve_multicoord_dispatch,
     39 },
     40 {
     41 	.prefix = NULL
     42 }
     43 };
     44 
     45 const char *solver_aliases[][2] = {
     46 	{ "optimal", "h48h7k2" },
     47 	{ "eofb", "coord_EO_UF" },
     48 	{ "eorl", "coord_EO_UR" },
     49 	{ "eoud", "coord_EO_FD" },
     50 	{ "drud", "coord_DR_UF" },
     51 	{ "drrl", "coord_DR_RF" },
     52 	{ "drfb", "coord_DR_FD" },
     53 	{ "drudslice", "coord_DRSLICE_UF" },
     54 	{ "drrlslice", "coord_DRSLICE_LF" },
     55 	{ "drfbslice", "coord_DRSLICE_BU" },
     56 	{ "drud-eofb", "coord_DREO_UF" },
     57 	{ "drrl-eofb", "coord_DREO_RF" },
     58 	{ "drud-eorl", "coord_DREO_UR" },
     59 	{ "drfb-eorl", "coord_DREO_RU" },
     60 	{ "drrl-eoud", "coord_DREO_FR" },
     61 	{ "drfb-eoud", "coord_DREO_FD" },
     62 	{ "drudfin", "mcoord_DRFIN_UF" },
     63 	{ "drrlfin", "mcoord_DRFIN_LF" },
     64 	{ "drfbfin", "mcoord_DRFIN_BU" },
     65 	{ "htr-drud", "coord_HTR_UF" },
     66 	{ "htr-drrl", "coord_HTR_LF" },
     67 	{ "htr-drfb", "coord_HTR_BU" },
     68 	{ NULL, NULL }
     69 };
     70 
     71 STATIC solver_dispatch_t
     72 match_solver(const char *name)
     73 {
     74 	const char *prefix;
     75 	solver_dispatch_t ret;
     76 	int i;
     77 
     78 	for (i = 0; solver_aliases[i][0] != NULL; i++)
     79 		if (!strcmp(name, solver_aliases[i][0]))
     80 			return match_solver(solver_aliases[i][1]);
     81 
     82 	for (i = 0; solver_dispatchers[i].prefix != NULL; i++) {
     83 		prefix = solver_dispatchers[i].prefix;
     84 		if (!strncmp(name, prefix, strlen(prefix))) {
     85 			ret = solver_dispatchers[i];
     86 			ret.solvername = name;
     87 			return ret;
     88 		}
     89 	}
     90 
     91 	return solver_dispatchers[i];
     92 }