--- rat/lonuserstate.pm 2002/06/17 16:40:24 1.28 +++ rat/lonuserstate.pm 2002/06/24 14:09:49 1.29 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Construct and maintain state and binary representation of course for user # -# $Id: lonuserstate.pm,v 1.28 2002/06/17 16:40:24 www Exp $ +# $Id: lonuserstate.pm,v 1.29 2002/06/24 14:09:49 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -67,7 +67,7 @@ my %parmhash;# The hash with the paramet my @cond; # Array with all of the conditions my $errtext; # variable with all errors my $retfurl; # variable with the very first URL in the course - +my %randompick; # randomly picked resources # --------------------------------------------------------- Loads map from disk sub loadmap { @@ -233,9 +233,12 @@ sub loadmap { } else { $hash{'param_'.$referid}=''.$newparam; } - if ($token->[2]->{'name'} eq 'mapalias') { + if ($token->[2]->{'name'} eq 'parameter_mapalias') { $hash{'mapalias_'.$token->[2]->{'value'}}=$referid; } + if ($token->[2]->{'name'} eq 'parameter_randompick') { + $randompick{$referid}=$token->[2]->{'value'}; + } } } @@ -275,7 +278,12 @@ sub traceroute { unless ($beenhere=~/\&$rid\&/) { $beenhere.=$rid.'&'; if ($retfurl eq '') { - $retfurl=$hash{'src_'.$rid}; + my ($mapid,$resid)=split(/\./,$rid); + $retfurl=$hash{'src_'.$rid}.'?symb='. + &Apache::lonnet::symbclean( + &Apache::lonnet::declutter($hash{'map_id_'.$mapid}). + '___'.$resid.'___'. + &Apache::lonnet::declutter($hash{'src_'.$rid})); } if (defined($hash{'conditions_'.$rid})) { $hash{'conditions_'.$rid}=simplify( @@ -398,6 +406,40 @@ sub accinit { "request.course.uri" => $courseuri); } +# ------------------------------------- Selectively delete from randompick maps + +sub pickrandom { + foreach my $rid (keys %randompick) { + my $rndpick=$randompick{$rid}; + my $mpc=$hash{'map_pc_'.$hash{'src_'.$rid}}; +# ------------------------------------------- put existing resources into array + my @currentrids=(); + foreach (keys %hash) { + if ($_=~/^src_($mpc\.\d+)/) { + if ($hash{'src_'.$1}) { push @currentrids, $1; } + } + } + next if ($#currentrids<$rndpick); +# -------------------------------- randomly eliminate the ones that should stay + srand(&Apache::lonnet::rndseed($rid)); # use rid instead of symb + for (my $i=1;$i<=$#currentrids+1-$rndpick;$i++) { + while (1) { + my $randomidx=int(rand($#currentrids+1)); + if ($currentrids[$randomidx]) { + $currentrids[$randomidx]=''; + last; + } + } + } +# -------------------------------------------------------- delete the leftovers + for (my $k=0; $k<=$#currentrids; $k++) { + if ($currentrids[$k]) { + $hash{'randomout_'.$currentrids[$k]}=1; + } + } + } +} + # ---------------------------------------------------- Read map and all submaps sub readmap { @@ -417,6 +459,7 @@ sub readmap { unlink($fn.'_symb.db'); unlink($fn.'.state'); unlink($fn.'parms.db'); + undef %randompick; $retfurl=''; if ((tie(%hash,'GDBM_File',"$fn.db",&GDBM_WRCREAT,0640)) && (tie(%parmhash,'GDBM_File',$fn.'_parms.db',&GDBM_WRCREAT,0640))) { @@ -428,6 +471,7 @@ sub readmap { if (defined($hash{'map_start_'.$uri})) { &traceroute('0',$hash{'map_start_'.$uri},'&'); &accinit($uri,$short,$fn); + &pickrandom(); } unless ((untie(%hash)) && (untie(%parmhash))) { &Apache::lonnet::logthis("WARNING: ".