int context_initialize(Context *context, unsigned int image_width, unsigned int image_height, unsigned int screen_width, unsigned int screen_height, StereoPattern *pattern_base) { double wave_strengths[2 * 4]; int i; StereoPattern *pattern; /* Make sure that the context is passed */ if (!context || !pattern_base) { return 0; } /* Initialise the maze */ context->maze.data = maze_create(ARGUMENT_VALUE(maze_size).width, ARGUMENT_VALUE(maze_size).height); if (!context->maze.data) { return 0; } maze_initialize_randomized_prim(context->maze.data, NULL, NULL); maze_door_open(context->maze.data, 0, 0, MAZE_WALL_LEFT); maze_door_open(context->maze.data, context->maze.data->width - 1, context->maze.data->height - 1, MAZE_WALL_RIGHT); for (i = 0; i < 4 * ARGUMENT_VALUE(maze_size).width * ARGUMENT_VALUE(maze_size).height * ARGUMENT_VALUE(shortcut_ratio); i++) { int x = rand() % ARGUMENT_VALUE(maze_size).width; int y = rand() % ARGUMENT_VALUE(maze_size).height; int wall = rand() % 4; switch (wall) { case 0: if (x > 0) { maze_door_open(context->maze.data, x, y, MAZE_WALL_LEFT); } break; case 1: if (x < ARGUMENT_VALUE(maze_size).width - 1) { maze_door_open(context->maze.data, x, y, MAZE_WALL_RIGHT); } break; case 2: if (y > 0) { maze_door_open(context->maze.data, x, y, MAZE_WALL_UP); } break; case 3: if (y < ARGUMENT_VALUE(maze_size).height - 1) { maze_door_open(context->maze.data, x, y, MAZE_WALL_DOWN); } break; } } /* Initialise the stereogram z-buffer */ context->stereo.zbuffer = stereo_zbuffer_create(image_width, image_height, 1); /* Randomise the effect parameters */ for (i = 0; i < sizeof(wave_strengths) / sizeof(double); i++) { wave_strengths[i] = WAVE_STRENGTH_BASE + WAVE_STRENGTH_EXTRA * (double)(rand() - RAND_MAX / 2) / RAND_MAX / (i + 1); } /* Initialise the effect */ pattern = stereo_pattern_create(pattern_base->width, pattern_base->height); context->stereo.effect = stereo_pattern_effect_wave(pattern, sizeof(wave_strengths) / sizeof(double) / 2, wave_strengths, pattern_base); stereo_pattern_effect_apply(context->stereo.effect); /* Initialise the stereogram image */ context->stereo.image = stereo_image_create_from_zbuffer( context->stereo.zbuffer, pattern, ARGUMENT_VALUE(stereogram_strength), 1); /* Automatically update the pattern every frame */ context->stereo.update_pattern = 1; /* Initialise the OpenGL data */ context->gl.ratio = (GLfloat)screen_width / screen_height; glGenFramebuffers(sizeof(context->gl.framebuffers) / sizeof(GLuint), context->gl.framebuffers); glGenRenderbuffers(sizeof(context->gl.renderbuffers) / sizeof(GLuint), context->gl.renderbuffers); glGenTextures(sizeof(context->gl.textures) / sizeof(GLuint), context->gl.textures); context->gl.render_stereo = 1; context->gl.apply_texture = 0; /* Specify the renderbuffer */ GLuint renderbuffer = context->gl.renderbuffers[0]; glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, image_width, image_height); glBindRenderbuffer(GL_RENDERBUFFER, 0); /* Specify the render buffer */ GLuint framebuffer = context->gl.framebuffers[0]; glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER_EXT, renderbuffer); glBindFramebuffer(GL_FRAMEBUFFER, 0); /* Initialise the camera and target */ context->camera.x = context->target.x = 0.0; context->camera.y = context->target.y = 0.5; context->camera.vx = context->target.vx = 0.0; context->camera.vy = context->target.vy = 0.0; context->camera.ax = context->target.ax = 0.0; context->camera.ay = context->target.ay = 0.0; return 1; }
int main(int argc, char **argv) { struct maze *m; struct square s; struct element *e; struct maze_markov_decision_process *mdp; int tmp; if (argc < 2) { printf( "usage: %s <algorithm> [Q-learling limit]\n" "\t[0] Value Iteration\n" "\t[1] Policy Iteration\n" "\t[2] Q-learning\n", argv[0] ); exit(EXIT_SUCCESS); } m = maze_create(5,3); e = (__typeof__(e)) malloc(sizeof(struct element)); s.element = e; e->name = 'R'; e->type = MAZE_ELEM_TYPE_INIT; maze_add(m,&s,0,0); s.element = 0; maze_add(m,&s,0,1); e->name = 'G'; e->reward = 1; e->type = MAZE_ELEM_TYPE_GOAL; s.element = e; maze_add(m,&s,0,2); s.element = 0; maze_add(m,&s,1,2); e->name = 'F'; e->reward = 10; e->type = MAZE_ELEM_TYPE_GOAL; s.element = e; maze_add(m,&s,2,0); s.element = 0; maze_add(m,&s,2,1); maze_add(m,&s,2,2); maze_add(m,&s,3,2); maze_add(m,&s,4,0); maze_add(m,&s,4,1); maze_add(m,&s,4,2); maze_display(m); printf("\n"); /* MAZE_ELEMENT_MOVE_UP(m,e); MAZE_ELEMENT_MOVE_UP(m,e); MAZE_ELEMENT_MOVE_RIGHT(m,e); MAZE_ELEMENT_MOVE_LEFT(m,e); MAZE_ELEMENT_MOVE_LEFT(m,e); MAZE_ELEMENT_MOVE_LEFT(m,e); maze_display(m); */ mdp = maze_markov_decision_process_create(m); maze_markov_decision_process_display(mdp); if ((tmp = atoi(argv[1])) == 0) maze_solver_vi_perform(mdp); else if (tmp == 1) maze_solver_pi_perform(mdp); else { maze_solver_qlearning_perform( mdp, (argv[2] ? atoi(argv[2]) : MAZE_SOLVER_QLEARNING_DEFAULT_ITER ) ); } free(e); maze_delete(m); maze_markov_decision_process_destroy(mdp); return 0; }
int main(int argc, char *argv[]) { unsigned long long dt; int i = 1; struct maze *mp; double q; int solved = 1; char *binin = NULL; char *binout = NULL; FILE *figfp = stdout; char *figout = NULL; int figupc = 300; int figupcgiven = 0; int figvisit = 0; int generate = 0; int rows = 41; int cols = 32; double straightfrac = 0.2; double segbends = 4; double revisit = 0.2; unsigned long seed = current_time(); int startrow = 0; int startcol = 0; int endrow = -1; int endcol = -1; int wallin = 0; int wallinrow; int wallincol; int solve = 1; int clear = 0; /* Parse arguments. */ while (i < argc) { if (strcmp(argv[i], "--input") == 0) { if (generate) usage(argv[0], "Conflict: --input and --generate\n"); if (i >= argc - 1) usage(argv[0], "--input requires path name\n"); binin = argv[++i]; } else if (strcmp(argv[i], "--output") == 0) { if (i >= argc - 1) usage(argv[0], "--output requires path name\n"); binout = argv[++i]; } else if (strcmp(argv[i], "--fig") == 0) { if (i >= argc - 1) usage(argv[0], "--fig requires path name\n"); figout = argv[++i]; figfp = fopen(figout, "w"); if (figfp == NULL) usage(argv[0], "--fig file unwriteable\n"); } else if (strcmp(argv[i], "--figupc") == 0) { if (i >= argc - 1) usage(argv[0], "--figupc requires fig units per cell\n"); figupc = strtol(argv[++i], NULL, 0); if (figupc <= 0) usage(argv[0], "--figupc must be non-negative\n"); figupcgiven = 1; } else if (strcmp(argv[i], "--figlinethickness") == 0) { if (i >= argc - 1) usage(argv[0], "--figlinethickness requires number\n"); line_thickness = strtol(argv[++i], NULL, 0); if (line_thickness <= 0) usage(argv[0], "--figlinethickness must be " "non-negative\n"); } else if (strcmp(argv[i], "--figvisit") == 0) { figvisit = 1; } else if (strcmp(argv[i], "--nofig") == 0) { if (figfp != stdout) usage(argv[0], "Conflict: --fig and --nofig\n"); figfp = NULL; } else if (strcmp(argv[i], "--generate") == 0) { generate = 1; if (binin) usage(argv[0], "Conflict: --generate and --input\n"); if (i < argc - 1 && argv[i + 1][0] != '-') { rows = strtol(argv[++i], NULL, 0); cols = rows; } if (i < argc - 1 && argv[i + 1][0] != '-') cols = strtol(argv[++i], NULL, 0); } else if (strcmp(argv[i], "--gen_sf") == 0) { if (i >= argc - 1) usage(argv[0], "--gen_sf requires straightfrac\n"); straightfrac = strtod(argv[++i], NULL); if (straightfrac <= 0.0) usage(argv[0], "--gen_sf requires straightfrac > 0"); } else if (strcmp(argv[i], "--gen_sb") == 0) { if (i >= argc - 1) usage(argv[0], "--gen_sb requires segbends\n"); segbends = strtod(argv[++i], NULL); if (segbends < 0.0) usage(argv[0], "--gen_sb requires segbends >= 0\n"); } else if (strcmp(argv[i], "--gen_rv") == 0) { if (i >= argc - 1) usage(argv[0], "--gen_rv requires revisit\n"); revisit = strtod(argv[++i], NULL); if (revisit < 0.0 || revisit > 1.0) usage(argv[0], "--gen_rv: 0 <= revisit <= 1\n"); } else if (strcmp(argv[i], "--seed") == 0) { if (i >= argc - 1) usage(argv[0], "--seed requires integer\n"); seed = strtol(argv[++i], NULL, 0); } else if (strcmp(argv[i], "--solve") == 0) { solve = 1; } else if (strcmp(argv[i], "--start") == 0) { if (i >= argc - 2) usage(argv[0], "--start requires position\n"); startrow = strtol(argv[++i], NULL, 0); startcol = strtol(argv[++i], NULL, 0); } else if (strcmp(argv[i], "--end") == 0) { if (i >= argc - 2) usage(argv[0], "--end requires position\n"); endrow = strtol(argv[++i], NULL, 0); endcol = strtol(argv[++i], NULL, 0); } else if (strcmp(argv[i], "--wall-in") == 0) { if (i >= argc - 2) usage(argv[0], "--wall-in requires position\n"); if (wallin) usage(argv[0], "Multiple --wall-in commands\n"); wallin = 1; wallinrow = strtol(argv[++i], NULL, 0); wallincol = strtol(argv[++i], NULL, 0); } else if (strcmp(argv[i], "--nosolve") == 0) { solve = 0; } else if (strcmp(argv[i], "--clear") == 0) { clear = 1; } else if (strcmp(argv[i], "--help") == 0) { usage(argv[0], ""); } else { int j = maze_solve_parse(i, argc, argv); if (i == j) usage(argv[0], "Unrecognized argument: %s\n", argv[i]); i = j - 1; } i++; } /* Get maze. */ srandom(seed); if (generate) { if (startrow < 0) startrow = maze_row_col_frac(rows, 1, -startrow); if (startcol < 0) startcol = maze_row_col_frac(cols, 1, -startcol); if (endrow < 0) endrow = maze_row_col_frac(rows, 1, -endrow); if (endcol < 0) endcol = maze_row_col_frac(cols, 1, -endcol); mp = maze_create(rows, cols, startrow, startcol, straightfrac, segbends, revisit); } else if (binin != NULL) { mp = maze_binary_in(binin); if (mp == NULL) usage(argv[0], "Bad --input file\n"); if (clear) maze_unvisit_all(mp); if (startrow < 0) startrow = maze_row_col_frac(mp->nrows, 1, -startrow); if (startcol < 0) startcol = maze_row_col_frac(mp->ncols, 1, -startcol); if (endrow < 0) endrow = maze_row_col_frac(mp->nrows, 1, -endrow); if (endcol < 0) endcol = maze_row_col_frac(mp->ncols, 1, -endcol); } else { usage(argv[0], "Must specify one of --input and --generate\n"); } if (startrow == endrow && startcol == endcol) usage(argv[0], "--start and --end both (%d, %d)\n", startrow, startcol); /* Wall-in the specified cell. */ if (wallin) { if (wallinrow < 0) wallinrow = maze_row_col_frac(mp->nrows, 1, -wallinrow); if (wallincol < 0) wallincol = maze_row_col_frac(mp->ncols, 1, -wallincol); if (!maze_wall_in(mp, wallinrow, wallincol)) usage(argv[0], "--wall-in %d %d must be within maze, " "limits: %d %d.\n", wallinrow, wallincol, mp->nrows, mp->ncols); } /* Solve maze. */ if (solve) { maze_unvisit_all(mp); /* Erase any prior solution. */ if (!maze_cell_exists(mp, startrow, startcol)) { fprintf(stderr, "Start position %d %d must be within maze: " "(0-%d, 0-%d)\n", startrow, startcol, mp->nrows - 1, mp->ncols - 1); exit(EXIT_FAILURE); } if (!maze_cell_exists(mp, endrow, endcol)) { fprintf(stderr, "End position %d %d must be within maze: " "(0-%d, 0-%d)\n", endrow, endcol, mp->nrows - 1, mp->ncols - 1); exit(EXIT_FAILURE); } q = maze_solve(mp, startrow, startcol, endrow, endcol, &dt); if (q == 0) { fprintf(stderr, "Maze has no solution\n"); solved = 0; } q = q / (double)(abs(endrow - startrow) + abs(endcol - startcol) + 1); fprintf(stderr, "Maze quality: %g dt = %g visits = %d/%d (%g%%)\n", q, ((double)dt) / (double)1000000, mp->vi, mp->nrows * mp->ncols, mp->vi * 100. / (double)(mp->nrows * mp->ncols)); } /* Output binary, if requested. */ if (binout != NULL) maze_binary_out(binout, mp); /* Output fig, if requested. */ if (figfp != NULL) { if (!figupcgiven) { /* Set up for US Letter. */ int fr = 300 * 41 / mp->nrows; int fc = 300 * 32 / mp->ncols; if (fr < fc) figupc = fr; else figupc = fc; } maze_to_fig(figfp, mp, figupc, !solved || figvisit); } return EXIT_SUCCESS; }