This lab should be done with your lab partner.
First, both you and your partner should run update31 to grab some starting point code.
$ update31 $ cd cs31/labs/06 $ pwd /home/your_user_name/cs31/labs/06 $ ls Makefile gol.c oscillator.txtThe starting point code includes: an empty Makefile that you need to implement; gol.c into which you should implement your solution; and osicllator.txt, a sample input file to your program. You should create other input files to test your solution.
Your world is represented by a 2-D array of values (0 or 1). If a grid cell's value is 1, it represents a live object, if it is 0 a dead object. At each discrete time step, every cell in the 2-D grid gets a new value based on the current value of its eight neighbors:
Your 2-D world should be a TORUS; every cell in the grid has exactly eight neighbors. In the torus world, cells on the edge of the grid have neighbors that wrap around to the opposite edge. For example, the grid locations marked with an 'x' are the eight neighbors of the grid cell whose value is shown as 1.
x 1 x 0 0 0 0 x x x 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 x x x 0 0 0 0Conway's Game of Life description from Wikipedia, shows some example patterns you can use to test the correctness of your solution (like Blinker, Toad or Beacon).
Here are some example command lines:
# run with config values read from file1.txt and do not print the board: ./gol file1.txt 0 # run with config file file2.txt and print the board after each step: ./gol file2.txt 1Your program should handle badly formed command lines (e.g. print out an error message and exit).
num rows num cols num iterations num of following coordinate pairs (set each (i, j) value to 1 i j i j ...You can create your own input files in vim (or emacs) by following the file input format.
For example, a file with the following contents generates an interesting pattern that starts in the lower left and walk up to upper right of grid:
30 30 100 5 29 1 28 2 27 0 27 1 27 2
In addition, you will add timing code to your program to time just the GOL computation (the timing should not including the board initialization phase of your code).
-g -WallYour Makefile should have rules for make and make clean commands. Use Makefiles that I have given you as a guide. Here is some basics on writing makefiles
Note: the only calls to usleep and system should be in the print function(s); running with 0 as the second command line option option should include no output of the game board nor any calls to sleep functions during the run.
int *init_board( ...Functions that return pointer values, generally return NULL on an error. The caller then will check the return value and decide how to handle a NULL return value.
usleep(200000); // sleep for 200,000 micro seconds (.2 seconds)
struct timeval start_time; ... ret = gettimeofday(&start_time, NULL);See the man page (man gettimeofday for more information.
# a run with output: $ ./gol oscillator.txt 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @ - - - - - - - - - - - - - - - - - - @ - - - - - - - - - - - - - - - - - - @ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - total time for 19 iterations of 19x19 is 2.019754 secs # a run with 0 as the second parameter should print no ouput # the total time then measures just the gol computation part because # the printfs and usleeps should not be executed when passed 0 % gol ~/classes/cs31/f13/library/labs/06/oscillator.txt 0 total time for 19 iterations of 19x19 is 0.000381 secsThe starting configuration of the oscillator file board is:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @ @ @ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -As you debug, use config files with small numbers of iterations, and comment out the call to system("clear") so you can examine the results of every iteration.
Even if you do not do the extra challange, you may want to read it over to learn a bit more about running timed experiments, and about gcc compiler optimization flags.
Once you are satisfied with your solution, hand it in by typing handin31 at the unix prompt.
Only one of you or your partner should run handin31 to submit your joint solutions If you accidentally both run it, send me email right away letting me know which of the two solutions I should keep and which I should discard (you don't want the grader to just guess which joint solution to grade).
You may run handin31 as many times as you like, and only the most recent submission will be recorded. This is useful if you realize, after handing in some programs, that you'd like to make a few more changes to them.