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

pause_resume_stop.c (2046B)


      1 #include "../tool.h"
      2 
      3 /*
      4 This tool starts solving a scramble. It then runs for SOLVE_LEN seconds,
      5 pauses for PAUSE_LEN seconds, runs again for SOLVE_LEN seconds and so on,
      6 until eventually stopping after TOTAL_LEN seconds.
      7 */
      8 
      9 #define SOL_BUFFER_LEN 10000
     10 
     11 #define SOLVE_LEN 3000
     12 #define PAUSE_LEN 1500
     13 #define TOTAL_LEN 30000
     14 
     15 char *scramble =
     16     "R' U' F D2 L2 F R2 U2 R2 B D2 L B2 D' B2 L' R' B D2 B U2 L U2 R' U' F";
     17 
     18 char *solver;
     19 int64_t size = 0;
     20 unsigned char *buf;
     21 
     22 int get_status(void *arg) {
     23 	struct timespec start, now;
     24 	double tdsec, tdnano;
     25 	int tdiff;
     26 
     27 	start = *(struct timespec *)arg;
     28 	clock_gettime(CLOCK_MONOTONIC, &now);
     29 
     30 	tdsec = now.tv_sec - start.tv_sec;
     31 	tdnano = now.tv_nsec - start.tv_nsec;
     32 	tdiff = 1000 * (tdsec + 1e-9 * tdnano);
     33 
     34 	fprintf(stderr, "[tool] Status polled at %dms: ", tdiff);
     35 
     36 	if (tdiff > TOTAL_LEN) {
     37 		fprintf(stderr, "Total time elapsed, stopping\n");
     38 		return NISSY_STATUS_STOP;
     39 	}
     40 
     41 	if (tdiff % (SOLVE_LEN + PAUSE_LEN) < SOLVE_LEN) {
     42 		fprintf(stderr, "Running\n");
     43 		return NISSY_STATUS_RUN;
     44 	}
     45 
     46 	fprintf(stderr, "Pausing\n");
     47 	return NISSY_STATUS_PAUSE;
     48 }
     49 
     50 void run(void) {
     51 	int64_t n;
     52 	long long stats[NISSY_SIZE_SOLVE_STATS];
     53 	char sol[SOL_BUFFER_LEN], cube[NISSY_SIZE_CUBE];
     54 	struct timespec starttime;
     55 
     56 	nissy_applymoves(NISSY_SOLVED_CUBE, scramble, cube);
     57 	clock_gettime(CLOCK_MONOTONIC, &starttime);
     58 	n = nissy_solve(cube, solver, NISSY_NISSFLAG_NORMAL,
     59 	    0, 20, 100, -1, 0, size, buf, SOL_BUFFER_LEN, sol, stats,
     60 	    get_status, &starttime);
     61 	if (n == 0)
     62 		printf("No solution found\n");
     63 	else
     64 		printf("Solutions:\n%s\n", sol);
     65 }
     66 
     67 int main(int argc, char **argv) {
     68 	char filename[255], dataid[NISSY_SIZE_DATAID];
     69 
     70 	if (argc < 2) {
     71 		printf("Error: not enough arguments. "
     72 		    "A solver and must be given.\n"); return 1;
     73 	}
     74 
     75 	solver = argv[1];
     76 	srand(time(NULL));
     77 	nissy_setlogger(log_stderr, NULL);
     78 
     79 	sprintf(filename, "tables/%s", solver);
     80 	if (getdata(solver, &buf, filename) != 0)
     81 		return 1;
     82 
     83 	size = nissy_solverinfo(solver, dataid);
     84 
     85 	timerun(run);
     86 
     87 	free(buf);
     88 	return 0;
     89 }