From: Mike G. v. a. <we...@ma...> - 2008-09-23 23:36:33
|
Log Message: ----------- Backport fixes to inheritance and for answerchecker: Fix the check for equivalent answers so that it uses the limits and other settings from the answer checker and the original formula object. from HEAD to rel-2-4-patches Tags: ---- rel-2-4-patches Modified Files: -------------- pg/lib: Value.pm pg/lib/Value: AnswerChecker.pm Formula.pm Revision Data ------------- Index: Value.pm =================================================================== RCS file: /webwork/cvs/system/pg/lib/Value.pm,v retrieving revision 1.53.2.3.2.2 retrieving revision 1.53.2.3.2.3 diff -Llib/Value.pm -Llib/Value.pm -u -r1.53.2.3.2.2 -r1.53.2.3.2.3 --- lib/Value.pm +++ lib/Value.pm @@ -598,8 +598,9 @@ # sub inherit { my $self = shift; - $self = bless {(map {%$_} @_),%$self}, ref($self); - foreach my $id ($self->noinherit) {delete $self->{$id}}; + my %copy = (map {%$_} @_); # copy values from given objects + foreach my $id ($self->noinherit) {delete $copy{$id}} + $self = bless {%copy,%$self}, ref($self); return $self; } Index: AnswerChecker.pm =================================================================== RCS file: /webwork/cvs/system/pg/lib/Value/AnswerChecker.pm,v retrieving revision 1.91.2.2.2.2 retrieving revision 1.91.2.2.2.3 diff -Llib/Value/AnswerChecker.pm -Llib/Value/AnswerChecker.pm -u -r1.91.2.2.2.2 -r1.91.2.2.2.3 --- lib/Value/AnswerChecker.pm +++ lib/Value/AnswerChecker.pm @@ -1624,7 +1624,7 @@ sub cmp_call_filter { my $ans = shift; my $method = shift; - return $ans->{correct_value}->$method($ans); + return $ans->{correct_value}->$method($ans,@_); } sub cmp_prefilter { @@ -1646,10 +1646,14 @@ my $self = shift; my $ans = shift; $ans->{_filter_name} = "produce_equivalence_message"; return $ans if $ans->{ans_message}; # don't overwrite other messages - $ans->{prev_formula} = Parser::Formula($self->{context},$ans->{prev_ans}); + my $context = $self->context; + $ans->{prev_formula} = Parser::Formula($context,$ans->{prev_ans}); if (defined($ans->{prev_formula}) && defined($ans->{student_formula})) { - my $prev = eval {$self->promote($ans->{prev_formula})}; break unless defined($prev); - $ans->{prev_equals_current} = Value::cmp_compare($prev,$ans->{student_formula},{}); + my $prev = eval {$self->promote($ans->{prev_formula})->inherit($self)}; # inherit limits, etc. + break unless defined($prev); + $context->{answerHash} = $ans; # values here can override context flags + $ans->{prev_equals_current} = Value::cmp_compare($prev,$ans->{student_formula},$ans); + $context->{answerHash} = undef; if ( !$ans->{isPreview} # not preview mode and $ans->{prev_equals_current} # equivalent and $ans->{prev_ans} ne $ans->{original_student_ans}) # but not identical @@ -1681,8 +1685,10 @@ sub cmp_postprocess { my $self = shift; my $ans = shift; - return unless $ans->{score} == 0 && !$ans->{isPreview}; - return if $ans->{ans_message}; + return unless $ans->{score} == 0; + eval {$ans->{student_formula}->reduce} if defined($ans->{student_formula}); # check for bad function calls + $self->cmp_error($ans) if $self->{context}{error}{flag}; # and report the error + return if $ans->{ans_message} || $ans->{isPreview}; if ($self->{domainMismatch} && $ans->{showDomainErrors}) { $self->cmp_Error($ans,"The domain of your function doesn't match that of the correct answer"); return; Index: Formula.pm =================================================================== RCS file: /webwork/cvs/system/pg/lib/Value/Formula.pm,v retrieving revision 1.43.2.2.2.1 retrieving revision 1.43.2.2.2.2 diff -Llib/Value/Formula.pm -Llib/Value/Formula.pm -u -r1.43.2.2.2.1 -r1.43.2.2.2.2 --- lib/Value/Formula.pm +++ lib/Value/Formula.pm @@ -220,6 +220,16 @@ } # +# Don't inherit test values or adapted values, or other temporary items +# +sub noinherit { + my $self = shift; + ($self->SUPER::noinherit(@_),"test_values","test_adapt","tree","string","variables", + "f","stack","ref","tokens","values","space","domainMismatch"); +} + + +# # Create the value list from a given set of test points # sub createPointValues { |