WeBWorK Problems

Problems with adaptive parameters

Problems with adaptive parameters

by Danny Glin -
Number of replies: 3
I've been working on writing some problems using adaptive parameters by following the wiki entry at http://wwrk.maa.org/wiki/AdaptiveParameters, and I've run into some odd behaviour.

Here is my code:

$aSoln = Compute("e^x");

BEGIN_TEXT
Find one solution to the differential equation
\[ \frac{dy}{dx} = y. \]
\( y = \) \{ ans_rule(35) \}
END_TEXT

ANS( $aSoln->cmp( checker => sub {
my ( $correct, $student, $self ) = @_;
my $context = Context()->copy;
$context->flags->set(no_parameters=>0);
$context->variables->add('C0'=>'Parameter');
my $c0 = Formula($context,'C0');
$student = Formula($context,$student);
$correct = Formula($context,"$c0 ($correct)");
return $correct == $student;
}));



The only change I've made in the checker compared to the code in the wiki is to repace
$correct = Formula($context,"$c0 e^x - 1");
with
$correct = Formula($context,"$c0 ($correct)");
so that I don't have to hard code the correct function into the checker (since all I am looking for is any scalar multiple of the correct function).

Two problems I've run into:
  1. (which also occurs with the original code from the wiki) I get the message "This answer is equivalent to the one you just submitted" any time I submit an answer which is a scalar multiple of my previous answer. This also means that for my code it considers any answer equivalent to 0.
  2. When I submit an answer of 0 followed by any other answer, I get a pink screen with the warning message "Please inform your instructor that an error occurred while checking your answer at [PG]/lib/Value/AnswerChecker.pm line 247".
I suspect that the first issue stems from the fact that it uses the custom checker to determine if the current answer and the previous answer are equivalent, which is not really the behaviour that I want students to see. I'm completely stumped on the second one.

Any help would be appreciated.
Thanks,
Danny
In reply to Danny Glin

Re: Problems with adaptive parameters

by Davide Cervone -
Both of the problems are related. You are correct that the custom checker is used in the check that determines when the previous answer is the same as the current one, and the same solution will fix both problems.

Here is a modified checker:

    ANS( $aSoln->cmp( checker => sub {
      my ( $correct, $student, $self ) = @_;
      if ($self->{_filter_name} ne 'produce_equivalence_message') {
        my $context = Context()->copy;
        $context->flags->set(no_parameters=>0);
        $context->variables->add('C0'=>'Parameter');
        $student = Formula($context,$student);
        $correct = Formula($context,"C0 ($correct)");
      }
      return $correct == $student;
    }));
This skips the adaptive step if the checker is being called by the "equivalent answer" check, and so it just does a normal equality check.

This fixes both problems. It fixes 1 because the message will only be issued when the two are actually equal as functions, since the adaptive parameter is never involved.

It fixes 2 in the following way: the check for equivalent answers is done by passing the previous answer as the "correct" answer and the new answer as the "student" answer. In the case where the previous answer was 0, you ended up with "C0 (0)" as the formula, and you can't solve for C0 in that case (you effectively get division by zero), so the $correct == $student check fails to produce an answer (the actual error message has been suppressed, but it is probably "can't solve for adaptive parameter" or some such thing). In any case, avoiding the adaptive parameter during the equivalence check should take care of it for you.

It is probably worth updating the Wiki example to reflect this. (Note that you don't really need the $c0 variable, as you can just use C0 directly in the new formula for the correct answer).

Hope that helps.

Davide

In reply to Davide Cervone

Re: Problems with adaptive parameters

by Nathan Wallach -
This is a very old thread, but the Wiki page https://webwork.maa.org/wiki/AdaptiveParameters still had (until today) the old code which would lead to the same issues which Danny had when naively modified for the case where the correct answer is a scalar multiple of a standard answer.

I have edited the Wiki page to provide a better standard recipe considering this forum thread and that at https://webwork.maa.org/moodle/mod/forum/discuss.php?d=324 where the proposed approach would also suffer the issues discussed here.