Introduction

Analogous to traditional on-campus collegiate courses, online edX learners also have numerical grades associated with their interactions in edX courses.  Currently, learners are graded for their responses to problems in different assignments, such as homeworks, labs, and exams.  Assignments in the current edX platform are at the Subsection level of a course.  Whenever a learner submits an answer to a problem, an asynchronous task is launched to update the learner's grade of the containing Subsection and of the containing Course.

In the future, we may extend this model to assess other MOOC interactions, such as participation in forums and other social engagements.

Terminology

Term

Definition

Raw Score

Unweighted (earned, possible) points tuple. For a CapaModule (our most common problem type), each response entry is a point. So a single CapaModule problem with two multiple choice responses has a possible raw score of 2.

Weighted Score

The result of applying the weight settings-scoped XBlock attribute to the raw score. The weight is an indication of how much the total problem should be worth, so the weighted score tuple looks like ((earned / possible) * weight, weight). So if someone has a raw score of 1/2 and the problem weight is 10, then 5/10 is what will show up on the progress page as the weighted score. Problem weights are attributes that are placed on the XBlock/XModuleDescriptor and can be manipulated via Studio.

Grade

Grades are the result of aggregating multiple scores.

Assignment Grade

Aggregated grade for a particular assignment, such as HW1. This is determined by adding the weighted scores of all problems in the assignment.

Assignment-Type Grade

Aggregated grade for an assignment category, like Homework or Final. Grading can be configured to drop the lowest n assignments when calculating an assignment-type grade - otherwise all assignments count equally (i.e. there is no weighting of assignments within an assignment category). The course grading policy specifies the minimum number of assignments expected for each category in advance.

Overall Percentage

Float value between 0 and 1 that marks the student's percentage for the course. This is calculated by weighing each assignment-type according to the rules specified in CourseDescriptor.grader. The grader is an extensible interface, but the only rules currently used in practice are simple weight by assignment-type (e.g. 30% Final, 40% HW, etc.). The grader will return the actual percentage as a value between 0 and 1. The overall grade calculation process will then take this number and do a small bit of rounding up: round(actual_percent * 100 + 0.05) / 100. This is so that someone who has been scoring an 89.5% and has been seeing their average rounded to 90% on the progress page is not suddenly surprised at the end of the course. The denominator for this is based on the total possible at the end of the course, and does not adjust for unreleased assignments – getting a perfect score on your first homework may only give you a 4% overall percentage.

Overall Grade

Letter grade based on CourseDescriptor.grade_cutoffs and the Overall Percentage (so after rounding up).

XBlock

The fundamental building block of edX course content. Everything that shows up in the courseware tab is some subclass of XBlock: a chapter, a video, a problem, etc. The entire course is a tree of XBlocks, which act like mini web-applications that can cooperatively build a web page together. They define their own views and can define state in multiple scopes like content (e.g. problem definition) and student state (e.g. a student's answer). XBlocks in edx-platform store their student state as a JSON text field in the StudentModule model.

Courseware
StudentModule

The Django model that XBlocks use to store their student state. Raw scores are also stored here. There are many legacy artifacts in this model, so please read the documentation if you're going to work with it. The vast majority of scores in the system are stored here.

Submissions API

A newer API created to store submissions and scores separately from XBlock state. The long term goals were to make a more auditable, performant, and flexible scoring system. Scores and submissions are immutable (you never edit old entries, just create new ones). Because it is not derived from XBlock state, it is also possible to later record scores for more abstract things like "class participation", though that functionality is not presently used. This API is relatively new and few things use it.

Modulestore

The interface that we use to instantiate XBlocks in edx-platform. Content is loaded from MongoDB as part of this process.
Block StructuresAn extensible framework for caching xBlock data from the modulestore and storing it in a denormalized read-optimized form.  See the BlockStructure Readme for more information.

Note: In more recent times, we've tried to distinguish "score" (tied to a single problem) from "grade" (which includes aggregation and policy).

Course Structure in context of Grading

xBlocks

The edX course is built as a hierarchical structure of xBlocks as recursive compositional building blocks.  In the context of grading, the following xBlocks are of particular interest:

Live Editing and Content Versioning

Content in edX courses are managed as live mutable data.  So it is quite possible for course authors to modify any course content or course setting during the live management of a course.  Such live editing is supported in both self-paced courses (courses without constrained start-end dates) as well as instructor-paced courses (seasonal courses supervised by a set of instructors).

Modulestores are the underlying storage infrastructure for course content.  The newest modulestore, Split Mongo, released in the fall of 2014, has support for versioning of content.  It treats all content as immutable and versions each change that is stored.  Each block is immutable and whenever its data is changed, an entire new copy is stored, while retaining a copy of the older version.  The version number of the containing course structure is updated whenever any of its block content is changed.

When Grades are persisted, the course's version number and edit timestamp are kept along with the grade - for debugging/auditing purposes.

Grade Computation

Numerical grades/scores are computed at each of the following course levels.

Overall Course Grade

Assignment Grades

Problem Scores

When weight is valid (a numerical value greater than 0):

Else, when weight is not valid:

Grading Policy

As described above in the Grade Computation section, the grading policy is distributed across the configuration of the course and includes all of the following:

Grade Overrides / Exceptions

Today, we support the following features to adjust grades, but don't have a general feature to override a grade for any xBlock:

ORA2's Immutable Data

It is relevant to note that ORA2 has its own immutable data model and thus, an inherent capability to retain previous submissions and grades when its rubrics/contents are changed: