Because the Tiger Compiler is a project with stages, the computation of the marks depends on the stages too. To spell it out explicitly:
A stage is penalized by bad results on tests performed for previous stages.
It means, for instance, that a T3 compiler will be exercised on T1, T2, and T3. If there are still errors on T1 and T2 tests, they will pessimize the result of T3 tests. The older the errors are, the more expensive they are.
As an example, here are the formulas to compute the global success rate of T3 and T5:
global-rate-T3 := rate-T3 * (+ 2 * rate-T1 + 1 * rate-T2) / 3 global-rate-T5 := rate-T5 * (+ 4 * rate-T1 + 3 * rate-T2 + 2 * rate-T3 + 1 * rate-T4) / 10
Because a project which fail half of the time is not a project that deserves half of 20, the global-rate is elevated to 1.7 before computing the mark:
mark-T3 := roundup (power (global-rate-T3, 1.7) * 20 - malus-T3, 1)
where roundup (x, 1) is x rounded up to one decimal (roundup (15, 1) = 15, roundup (15.01, 1) = 15.1).
When the project is also evaluated by a human, power is not used. Rather, the success rate modifies the mark given by the examiner:
mark-T2 := roundup (eval-T2 * global-rate-T2 - malus-T2, 1)