wiki:BoltRef

Version 33 (modified by davea, 16 years ago) (diff)

--

Bolt reference manual

A Bolt course consists of:

  • Lessons: any web-based teaching material
  • Exercises, used for reinforcement and/or assessment.
  • A course document describing the order in which lessons and exercises are shown.

To use Bolt:

  • create a BOINC project; use make_project --web_only so that you don't have to compile any (irrelevant) programs. Similarly, you can upgrade Bolt software using upgrade --web_only.
  • In the boinc/db directory, run
    mysql project_name < bolt_schema.sql
    mysql project_name < bolt_constraints.sql
    
    to create the Bolt database tables.
  • Put your lessons, exercises and course document in the project's html/user directory
  • Edit and run the html/ops/bolt_setup_sample.php script to create one or more courses.

Lessons

A Lesson contains instructional material. It may be either an HTML file or PHP script. It may contain embedded audio, video, Flash, or any other content. Some restrictions:

  • It shouldn't contain enclosing <html> or <body> tags (Bolt will supply these, as well as navigational header and footer).
  • It shouldn't contain any hyperlinks (Bolt will supply navigational links).

If a lesson is implemented as a PHP script, information about the student is available to it in a global variable $student, This information may be used to customize the page. The available information is:

$student->sex;    // 0=unknown, 1=male, 2=female (as in ISO 5218)
$student->birth_year;
$student->country;
$student->name;
$student->bandwidth;  // 1: <100Kb; 2: <1Mb; 3: <10Mb etc.
$student->has_audio_output;    // 1: no, 2: yes
$student->has_audio_input;

For example, suppose you want to use a larger font for students over 50:

if ($student->age > 50) {
    echo '<style type="text/css">
        body {font-size: large;}
        </style>
    ';
}

An alternative way to vary content based on student attributes is to use separate lesson files, selected in the course document.

Exercises

Exercises are PHP scripts that call Bolt API functions. Here's an example consisting of a multiple-choice question:

<?php
echo 'Conifers are so named because:';
exclusive_choice(
   array(
      'They carry their seeds in cones.'
      'They are cone-shaped.',
      'They originated during the Coniceous era.',
   ),
);
?>

The correct choice is the first element of the array. Each time the question is shown, the choices are presented in a random order.

Here's an example that shows an image; a correct answer is a click in the indicated subrectangle.

<?php
echo "Click on the dog's nose:<p>";
image_rect(
   'dog.jpg',
   array(100, 60, 110, 70)
);
?>

Bolt supplies functions for other types of questions, such as inclusive multiple-choice and fill-in-the-blank. An exercise can include multiple questions.

Course documents

The structure of a Bolt course is defined by a PHP script called a course document. The script calls Bolt API functions to create a hierarchy of "units" of two types:

  • Basic units: lessons and exercises
  • Control structures representing sets of units, together with rules the govern their use.

The function lesson() specifies a lesson. For example, the following course consists of a single lesson:

<?php
return lesson(
    name('lesson 1'),
    title('The ecology of a conifer forest'),
    filename('lesson_1.php?arg=4'),
    reading_level(11.0),
    detail_level(.5)
);
?>

The parameters of the lesson are:

name the "logical name", used as an internal identifier but not visible to students; see "Names and state" below
title a name shown to students
filename the file containing lesson content, optionally followed by a query string.
reading_level, detail_level optional attributes of the lesson

The query string specified in filename() is passed in a global variable $bolt_query_string, rather than in $_GET. To parse it, use

parse_str($bolt_query_string);

Similarly, exercise() specifies an exercise:

<?php 
return exercise(
    name('exercise 1'),
    filename('bolt_sample_exercise1.php')
);
?>

There are various control structures; see below. The simples one is a 'sequence', which specifies a set of units that are shown in sequence. Here's an example of a course with two lessons followed by an exercise:

<?php
return sequence(
    name('course'),
    lesson(...),
    lesson(...),
    exercise(...)
);
?>

Changing course documents

Course documents can change over time. In fact, that's the whole point of Bolt: to constantly study the effectiveness of course materials, and change the course based on the results of that study.

If a course changes while students are in the middle of it, Bolt recovers as gracefully as possible. For each student, Bolt maintains a "course state" - a set of data, for each control structure that the student has visited in the course, describing the student's "position" in that control structure. When a student clicks the Next button, or resumes the course after an interval, Bolt uses the course state to decide what item to display next.

For example, suppose your course has a sequence with 3 elements, with logical names (red, yellow, blue). and a student is on the third. The course state for the sequence consists of two items: (blue, 2). 'blue' is the logical name of the third element, and the index number 2 (indicates that the student has completed 2 units in the sequence).

If the student resumes the course, Bolt will find their place in the sequence first by looking up the logical name; if it is not found, then it will use the index number. For example:

  • If you change the sequence to (red, blue, green, yellow) then the student will be shown the units blue, green, and yellow.
  • If you change the sequence to (red, yellow, green) then the student will be shown the unit 'green'.
  • If you change the sequence to (red, yellow) then the student will have finished the sequence.

Nesting and functions

Control structures may be nested. For example:

sequence(
    name("x");
    lesson(...),
    sequence(
        name("y"),
        lesson(...),
        exercise(...)
    )
);

You can also use PHP functions as a way of organizing course structure:

function my_unit() {
    return sequence(
        name("y"),
        lesson(...),
        exercise(...)
    )
}

sequence(
    name("x"),
    lesson(...),
    my_unit()
);

Logical names and state

In general, units must have unique logical names. However, two units may have the same logical name if they are identical. For example:

function my_unit() {
    return random(
        name("y"),
        lesson(...),
        lesson(...)
    )
}

return sequence(
    name("x"),
    my_unit(),
    exercise_set(
        name("z"),
        exercise(...),
        review(.5, my_unit())
    )
);

This specifies a course in which my_unit() is displayed, then an exercise is given. If the student scores below .5 on the exercise, he is shown my_unit() again and the exercise is repeated.

So there are two units with logical name 'y' in this course, but they are identical, so this is allowed.

When there are multiple units with the same logical name, they share a single state.

Control structures

Sequences

Sequences were described above.

Select

The select structure takes a set of units and a 'value function', which returns the predicted benefit of showing the unit to the student. The unit for which this value is greatest is shown. The value function may be partly or entirely random.

This structure can be used to implement

  • "experiments" where different lessons are compared;
  • "adaptive courses" where different lessons are shown to different types of students.

or a mixture of the two.

<?php
function value($student, $unit) {
    return abs($student->verbal_level - $unit->verbal_level);
}

return select(
    name('course'),
    valuator('value'),
    lesson(
        name('lesson 1'),
        filename('bolt_sample_lesson1.php')
    ),
    lesson(
        name('lesson 2'),
        filename('bolt_sample_lesson2.php')
    ),
);
?>

Random

The random control structure selects randomly (without replacement) from a set of units.

<?php
return random(
    name('foobar'),
    number(2),
    lesson(
        name('lesson 1'),
        filename('bolt_sample_lesson1.php')
    ),
    lesson(
        name('lesson 2'),
        filename('bolt_sample_lesson2.php')
    ),
    lesson(
        name('lesson 3'),
        filename('bolt_sample_lesson3.php')
    ),
);
?>

If 'number()' is given, that many units are shown; the default is one.

The 'without replacement' applies across multiple visits to the same structure (e.g. because of review or refresh).

Exercise set

The 'exercise_set' structure specifies a set of exercises and a value 'number' (default one). This number of exercises is chosen randomly (without replacement) and administered.

The navigation links on the answer page of the last exercise may allow the student to review for and/or repeat the exercise set (see below).

Exercise sets may not be nested.

Example:

exercise_set(
    name('exer_set'),
    number(1),
    exercise(
        name('exercise 1'),
        filename('file_1.php')
    ),
    exercise(
        name('exercise 1'),
        filename('file_1.php')
    ),
    repeat(.3, basic_review(), REVIEW),
    repeat(.7, int_review(), REVIEW|REPEAT),
    repeat(1, null, REPEAT|NEXT),
    refresh(array(7, 14, 28))
);

Exercise review and repeat

The "repeat" items in an exercise set determine the student's options to review for and repeat the exercise set. ( Each repeat item is a function call of the form

repeat(grade_threshold, review_unit, nav_flags);

The arguments are:

  • grade_threshold: the highest grade to which this item applies
  • review_unit: a unit that reviews the material assessed by for the exercise set.
  • nav_flags: a bitmask determining which navigation options will be presented:
    • REVIEW: show the review units, then repeat the exercise set
    • REPEAT: repeat exercise set immediately
    • NEXT: continue without repeating the exercise set

A student's score on an exercise set is the average score of the selected exercises. Call this Y; the "selected repeat item" is the one with the least X such that Y < X.

If there is no such repeat item, the student is not given an option to repeat the exercise set; i.e., they see only a Next button.

Otherwise let R be the selected repeat item. If R.repeat_optional is true, a Next button is shown. If R.review_optional is true, a "Repeat" button is shown. If R.review_unit is present, a "Review" button is shown.

Thus, in the example above, the student's options are:

grade options
[0, .3) review and repeat exercise
[.3, .7) review and repeat exercise, or repeat exercise
[.7, 1) repeat exercise, or continue
1 continue

Memory refresh

If a refresh() argument is given to exercise_set(), then when the set is completed by a student it is added to a "refresh schedule". Each element in a refresh schedule specifies The intervals (in days) are given as arguments to refresh().

At a given point, one or more exercise sets may be due for refresh. The student may choose any of them to view. Bolt keeps track of the state independently for each set; the student may begin refresh for set A while partway through refresh for set B.