Do not post your project on a public Github repository.
All the programming projects this semester will be written on the BusTub database management system. This system is written in C++. To ensure that you have the necessary C++ background, we are requiring everyone to complete a simple programming assignment to assess your knowledge of basic C++ features. You will not be given a grade for this project, but you are required to complete the project with a perfect score before being allowed to proceed in the course. Any student that is unable to complete this assignment before the deadline will be asked to drop the course.
All of the code in this programming assignment must be written in C++ (specifically C++17). It is generally sufficient to know C++11. If you have not used C++ before, here is a short tutorial on the language. More detailed documentation of language internals is available on cppreference. A Tour of C++ and Effective Modern C++ are also digitally available from the CMU library.
There are many tutorials available to teach you how to use
gdb effectively. Here are some that we have found useful:
- Debugging Under Unix: gdb Tutorial
- GDB Tutorial: Advanced Debugging Tips For C/C++ Programmers
- Give me 15 minutes & I'll change your view of GDB [VIDEO]
This is a single-person project that will be completed individually (i.e. no groups).
- Release Date: Aug 24, 2020
- Due Date: Sep 13, 2020 @ 11:59pm
In this project, you will implement three classes:
RowMatrixOperations. These matrices are simple two-dimensional matrices that must support addition, matrix multiplication, and a simplified General Matrix Multiply (GEMM) operations.
In this header file, we have defined the three classes that you will need to implement. The
Matrix abstract class defines the common functions for the derived class
RowMatrixOperations class will use
RowMatrix objects to achieve the operations mentioned in overview. The function prototypes and member variables are specified in the file. The project requires you to fill in the implementations of all the constructors, deconstructors, and member functions. Do not add any additional function prototypes or member variables. You only need to modify the defined functions that we provide you.
The instructor and TAs will not provide any assistance on C++ questions. You can freely use Google or StackOverflow to learn about C++ and any errors you encounter.
Creating Your Own Project Repository
If the below
git concepts (e.g., repository, merge, pull, fork) do not make sense to you, please spend some time learning git first.
Follow the instruction to setup your own PRIVATE repository and your own development branch. If you have previuosly forked the repository through the GitHub UI (by clicking Fork), PLEASE DO NOT PUSH ANY CODE TO YOUR PUBLIC FORKED REPOSITORY! Make sure your repository is PRIVATE before you
git push any of your code.
If the instructor makes any changes to the code, you can merge the changes to your code by keeping your private repository connected to the CMU-DB master repository, execute the following commands to add a remote source:
$ git remote add public https://github.com/cmu-db/bustub.git
You can then pull down the latest changes as needed during the semester:
$ git fetch public $ git merge public/master
Setting Up Your Development Environment
First install the packages that BusTub requires:
$ sudo ./build_support/packages.sh
See the README for additional information on how to setup different OS environments.
To build the system from the commandline, execute the following commands:
$ mkdir build $ cd build $ cmake .. $ make
To speed up the build process, you can use multiple threads by passing the
-j flag to make. For example, the following command will build the system using four threads:
$ make -j 4
You can test the individual components of this assignment using our testing framework. We use GTest for unit test cases. There is one file that contain tests for all three classes:
You can compile and run each test individually from the command-line:
$ mkdir build $ cd build $ make starter_test $ ./test/starter_test
You can also run
make check-tests to run ALL of the test cases. Note that some tests are disabled as you have not implemented future projects. You can disable tests in GTest by adding a
DISABLED_ prefix to the test name.
These tests are only a subset of the all the tests that we will use to evaluate and grade your project. You should write additional test cases on your own to check the complete functionality of your implementation.
Make sure that you remove the DISABLED_ prefix from the test names otherwise they will not run!
Execute the following commands to check your syntax. The
format target will automatically correct your code. The
check-clang-tidy targets will print errors and instruct you how to fix it to conform to our style guide.
$ make format $ make check-lint $ make check-clang-tidy
Instead of using
printf statements for debugging, use the
LOG_* macros for logging information like this:
LOG_INFO("# Pages: %d", num_pages); LOG_DEBUG("Fetching page %d", page_id);
To enable logging in your project, you will need to reconfigure it like this:
$ mkdir build $ cd build $ cmake -DCMAKE_BUILD_TYPE=DEBUG .. $ make
The different logging levels are defined in src/include/common/logger.h. After enabling logging, the logging level defaults to
LOG_LEVEL_INFO. Any logging method with a level that is equal to or higher than
LOG_ERROR) will emit logging information. Note that you will need to add
#include "common/logger.h" to any file that you want to use the logging infrastructure.
We encourage you to use
gdb to debug your project if you are having problems.
Post all of your questions about this project on Piazza. Do not email the TAs directly with questions.
In order to pass this project, you must ensure your code follows the following guidelines:
- Does the submission successfully execute all of the test cases and produce the correct answer?
- Does the submission execute without any memory leaks?
- Does the submission follow the code formatting and style policies?
Note that we will use additional test cases to grade your submission that are more complex than the sample test cases that we provide you.
There are no late days for this project.
You will submit your implementation to Gradescope:
You only need to include the following files with their full path in your submission zip file:
You can verify the contents of your file using the
unzip command. The output of this command should look something like this:
$ unzip -l project0-submission.zip Archive: project0-submission.zip Length Date Time Name --------- ---------- ----- ---- 317 2020-08-25 19:25 metadata.yml 0 2020-08-25 19:25 src/ 0 2020-08-25 19:25 src/include/ 0 2020-08-25 19:25 src/include/primer/ 4465 2020-08-25 19:25 src/include/primer/p0_starter.h --------- ------- 4782 5 files
Although you are allowed submit your answers as many times as you like, you should not treat Gradescope as your only debugging tool. Most students submit their projects near the deadline, and thus it will Gradescope take longer to process the requests. You may not get feedback in a timely manner to help you debug problems.
CMU students should use the Gradescope course code announced on Piazza.
- Every student has to work individually on this assignment.
- Students are allowed to discuss high-level details about the project with others.
- Students are not allowed to copy the contents of a white-board after a group meeting with other students.
- Students are not allowed to copy the solutions from another colleague.
WARNING: All of the code for this project must be your own. You may not copy source code from other students or other sources that you find on the web. Plagiarism will not be tolerated. See CMU's Policy on Academic Integrity for additional information.