--- loncom/homework/response.pm 2004/03/12 18:41:43 1.94 +++ loncom/homework/response.pm 2004/05/27 04:25:13 1.99 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # various response type definitons response definition # -# $Id: response.pm,v 1.94 2004/03/12 18:41:43 albertel Exp $ +# $Id: response.pm,v 1.99 2004/05/27 04:25:13 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -47,11 +47,11 @@ sub start_response { push (@Apache::inputtags::responselist,$id); @Apache::inputtags::inputlist=(); if ($Apache::inputtags::part eq '') { - &Apache::lonxml::error(&HTML::Entities::encode(&mt("Found a <*response> outside of a in a ed problem"))); + &Apache::lonxml::error(&HTML::Entities::encode(&mt("Found a <*response> outside of a in a ed problem"),'<>&"')); } if ($Apache::inputtags::response_with_no_part && $Apache::inputtags::part ne '0') { - &Apache::lonxml::error(&HTML::Entities::encode(&mt("<*response>s are both inside of and outside of , this is not a valid problem, errors in grading may occur.")).'
'); + &Apache::lonxml::error(&HTML::Entities::encode(&mt("<*response>s are both inside of and outside of , this is not a valid problem, errors in grading may occur."),'<>&"').'
'); } if ($Apache::inputtags::part eq '0') { $Apache::inputtags::response_with_no_part=1; @@ -84,26 +84,58 @@ sub end_hintresponse { return ''; } -# used by response to set the non-safe space random number generator to something -# that is stable and unique based on the part number and response number +my @randomseeds; +sub pushrandomnumber { + my $rand_alg=&Apache::lonnet::get_rand_alg(); + if (!$rand_alg || $rand_alg eq '32bit' || $rand_alg eq '64bit' || + $rand_alg eq '64bit2') { + # do nothing + } else { + my @seed=&Math::Random::random_get_seed(); + push (@randomseeds,\@seed); + } + &Apache::response::setrandomnumber(); +} +sub poprandomnumber { + my $rand_alg=&Apache::lonnet::get_rand_alg(); + if (!$rand_alg || $rand_alg eq '32bit' || $rand_alg eq '64bit' || + $rand_alg eq '64bit2') { + return; + } + my $seed=pop(@randomseeds); + if ($seed) { + &Math::Random::random_set_seed(@$seed); + } else { + &Apache::lonxml::error("Unable to restore random algorithm."); + } +} sub setrandomnumber { my $rndseed; $rndseed=&Apache::structuretags::setup_rndseed(); if (!defined($rndseed)) { $rndseed=&Apache::lonnet::rndseed(); } &Apache::lonxml::debug("randseed $rndseed"); # $rndseed=unpack("%32i",$rndseed); - my $rndmod=(&Apache::lonnet::numval($Apache::inputtags::part) << 10); - if (defined($Apache::inputtags::response['-1'])) { - $rndmod+=&Apache::lonnet::numval($Apache::inputtags::response[-1]); - } - if ($rndseed =~/,/) { - { - use integer; - my ($num1,$num2)=split(/,/,$rndseed); - $num1+=$rndmod; - $num2+=$rndmod; - $rndseed="$num1,$num2"; + my $rand_alg=&Apache::lonnet::get_rand_alg(); + my $rndmod; + if (!$rand_alg || $rand_alg eq '32bit' || $rand_alg eq '64bit' || + $rand_alg eq '64bit2') { + $rndmod=(&Apache::lonnet::numval($Apache::inputtags::part) << 10); + if (defined($Apache::inputtags::response[-1])) { + $rndmod+=&Apache::lonnet::numval($Apache::inputtags::response[-1]); + } + } else { + $rndmod=(&Apache::lonnet::numval2($Apache::inputtags::part) << 10); + if (defined($Apache::inputtags::response[-1])) { + $rndmod+=&Apache::lonnet::numval2($Apache::inputtags::response[-1]); } + } + if ($rndseed =~/([,:])/) { + my $char=$1; + use integer; + my ($num1,$num2)=split(/\Q$char\E/,$rndseed); + $num1+=$rndmod; + $num2+=$rndmod; + $rndseed=$num1.$char.$num2; } else { $rndseed+=$rndmod; } @@ -199,7 +231,7 @@ sub check_for_previous { my %previous; $previous{'used'} = 0; foreach my $key (sort(keys(%Apache::lonhomework::history))) { - if ($key =~ /resource\.$partid\.$id\.submission/) { + if ($key =~ /resource\.$partid\.$id\.submission$/) { &Apache::lonxml::debug("Trying $key"); my $pastresponse=$Apache::lonhomework::history{$key}; if ($pastresponse eq $curresponse) { @@ -597,6 +629,15 @@ sub analyze_store_foilgroup { push (@{ $Apache::lonhomework::analyze{"$part_id.shown"} }, @{ $shown }); } +sub check_if_computed { + my ($token,$parstack,$safeeval,$name)=@_; + my $value = &Apache::lonxml::get_param($name,$parstack,$safeeval); + if ($value ne $token->[2]{$name}) { + my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]"; + $Apache::lonhomework::analyze{"$part_id.answercomputed"} = 1; + } +} + sub pick_foil_for_concept { my ($target,$attrs,$hinthash,$parstack,$safeeval)=@_; if (not defined(@{ $Apache::response::conceptgroup{'names'} })) { return; } @@ -632,6 +673,20 @@ sub pick_foil_for_concept { } +sub get_response_param { + my ($id,$name,$default)=@_; + my $parameter; + if ($ENV{'request.state'} eq 'construct' && + defined($Apache::inputtags::params{$name})) { + $parameter=$Apache::inputtags::params{$name}; + } else { + $parameter=&Apache::lonnet::EXT("resource.$id.$name"); + } + if (!defined($parameter) || $parameter eq '') { + $parameter = $default; + } + return $parameter; +} 1; __END__