".
- "Current map: \"$CurMap\" ".
- "Current Section: \"$CurSec\" ".
- "Number of valid students: $Count".
- " The Upper 27% has $UpCnt records.".
- " The Lower 27% has $UpCnt records ".
- "The Criterion of sorting the students: ".
- "( Sum of Partial Credits Awarded / ".
- "Total Number of Tries )".
- "
");
- $r->rflush();
- my $low=0;
- my $up=$Count-$UpCnt;
- my @UpList=();
- my @LowList=();
- $Count=0;
- foreach my $key (sort(keys(%DiscFac))){
- $Count++;
-# $r->print("$Count) $key ");
-
- if ($low < $UpCnt || $Count > $up) {
- $low++;
- my $str=$DiscFac{$key};
-# $r->print("$Count) $str ");
- foreach(split(/\:/,$str)){
- if ($_) {
- if ($low<$UpCnt){push(@LowList,$_);}
- else {push(@UpList,$_);}
- }
- }
- }
- }
-
- my %Up=&ProcessDisc(@UpList);
- my %Low=&ProcessDisc(@LowList);
-
- my @list = ();
- my $Useful;
- my $UnUseful;
- $p_count = 0;
-
- foreach my $key( keys %CachData) {
- my @Temp=split(/\:/,$CachData{$key});
- ($UnUseful,$Useful)=split(/\>/,$Temp[0]);
- $list[$p_count]=$Useful.'&'.$CachData{$key};
- $p_count++;
- }
-
- @list = sort MySort (@list);
-
- my $Result = "\n".'
';
- $Result .= "\n".'
P#
';
- $Result .= "\n".'
'.$Header{0}.'
';
- $Result .= "\n".'
'.'Discrimination Factor'.'
';
- $Result .= "\n".'
'.'%Upper Award'.'
';
- $Result .= "\n".'
'.'%Lower Award'.'
';
- $Result .= "\n".'
'.'Upper Records'.'
';
- $Result .= "\n".'
'.'Lower Records'.'
';
- $Result .= "\n".'
'.'%Degree of Difficulty'.'
';
- $Result .= "\n".'
';
- $r->print( $Result );
-
- for ( my $nIdx = 0; $nIdx < $p_count; $nIdx++ ) {
- my( $Pre, $Post ) = split(/\&/,$list[$nIdx]);
- my ($Temp,$MxTries,$StdNo,$TotalTries,$YES,$Override,
- $Wrng,$Avg,$SD,$Sk,$DoD,$res,$Prob)=split(/\:/,$Post);
- my ($UpDis,$UpNo)=split(/\:/,$Up{$Prob});
- my ($LwDis,$LwNo)=split(/\:/,$Low{$Prob});
- $UpNo = ($UpNo) ? $UpNo : 0;
- $LwNo = ($LwNo) ? $LwNo : 0;
- my $U_Dis = sprintf("%.4f", $UpDis)*100;
- my $L_Dis = sprintf("%.4f", $LwDis)*100;
- my $DisFac = $UpDis - $LwDis;
- my $_Dis = sprintf("%.4f", $DisFac)*100;
- $r->print( "\n".'
'.
- "\n".'
'.($nIdx+1).'
'.
- "\n".'
'.$Temp.'
'.
- "\n".'
'.$_Dis.'
'.
- "\n".'
'.$U_Dis.'
'.
- "\n".'
'.$L_Dis.'
'.
- "\n".'
'.$UpNo.'
'.
- "\n".'
'.$LwNo.'
'.
- "\n".'
'.($DoD).'
'.
- "\n".'
' );
- }
- $r->print("\n".'
');
- $r->rflush();
-}
-
-sub CreateDiscFac {
-
- my $CacheDB = "/home/httpd/perl/tmp/$ENV{'user.name'}".
- "_$ENV{'user.domain'}_$cid\_statistics.db";
- my $CachDisFac = "/home/httpd/perl/tmp/$ENV{'user.name'}".
- "_$ENV{'user.domain'}_$cid\_DiscFactor.db";
-
- my $ptr='';
-# $ptr .= ' Discrimination Criterion: '."\n".
-# ' '."\n";
- $ptr .= ' ';
- $r->print($ptr);
-
- if ((-e "$CacheDB")&&
- ($ENV{'form.sort'} ne 'Recalculate Discrimintion Factor')) {
- if (tie(%CachData,'GDBM_File',"$CacheDB",&GDBM_READER,0640)) {
- tie(%DiscFac,'GDBM_File',$CachDisFac,&GDBM_READER,0640);
- #&DiscriminationTable();
- &Classify();
- }
- else {$r->print("Unable to tie hash to db file");}
- }
- else {
- if (tie(%CachData,'GDBM_File',$CacheDB,&GDBM_WRCREAT,0640)) {
- tie(%DiscFac,'GDBM_File',$CachDisFac,&GDBM_WRCREAT,0640);
- foreach (keys %CachData) {delete $CachData{$_};}
- foreach (keys %DiscFac) {delete $DiscFac{$_};}
- $DiscFlag=1;
- &Build_Statistics();
- $DiscFlag=0;
- &DiscriminationTable();
- }
- else {$r->print("Unable to tie hash to db file");}
- }
- untie(%CachData);
- untie(%DiscFac);
-}
-
-
# ------ Create different Student Report
sub StudentReport {
my ($sname,$sdom)=@_;
@@ -431,6 +96,7 @@ sub StudentReport {
my $reply=&Apache::lonnet::reply('dump:'.$sdom.':'.$sname.':'.$cid,$shome );
my %result = ();
my $ResId;
+ my $PrOrd;
my $Code;
my $Tries;
my $TotalTries = 0;
@@ -450,12 +116,12 @@ sub StudentReport {
"\n".'
Tries
'.
"\n".'';
unless ($reply=~/^error\:/) {
- map {
+ foreach (split(/\&/,$reply)){
my ($name,$value)=split(/\=/,&Apache::lonnet::unescape($_));
$result{$name}=$value;
- } split(/\&/,$reply);;
- foreach $ResId (@cols) {
- if ( !$ResId ) {
+ }
+ foreach my $CurCol (@cols) {
+ if (!$CurCol){
my $Set=&Apache::lonnet::declutter($hash{'map_id_'.$1});
if ( $Set ) {
$SetNo++;
@@ -470,6 +136,7 @@ sub StudentReport {
$PtrCod='';
next;
}
+ ($PrOrd,$ResId)=split(/\:/,$CurCol);
$ResId=~/(\d+)\.(\d+)/;
my $Map = &Apache::lonnet::declutter( $hash{'map_id_'.$1} );
if ( $CurMap ne 'All Maps' ) {
@@ -479,17 +146,18 @@ sub StudentReport {
my $meta=$hash{'src_'.$ResId};
my $PartNo = 0;
undef %TempHash;
- map {
+ foreach (split(/\,/,&Apache::lonnet::metadata($meta,'keys'))){
if ($_=~/^stores\_(\d+)\_tries$/) {
my $Part=&Apache::lonnet::metadata($meta,$_.'.part');
if ( $TempHash{"$Part"} eq '' ) {
$TempHash{"$Part"} = $Part;
$TempHash{$PartNo}=$Part;
$TempHash{"$Part.Code"} = '-';
+ $TempHash{"$Part.PrOrd"} = $PrOrd+$PartNo;
$PartNo++;
}
}
- } split(/\,/,&Apache::lonnet::metadata($meta,'keys'));
+ }
my $Prob = $Map.'___'.$2.'___'.
&Apache::lonnet::declutter( $hash{'src_'.$ResId} );
@@ -543,9 +211,31 @@ sub StudentReport {
$r->rflush();
}
+sub CreateTable {
+ my ($Hd, $Hid)=@_;
+ if ( $Hd == 1 ) {
+# $Hid=~/(\d+)\.(\d+)/;
+ $r->print(' '.$hash{'title_'.$Hid}.''
+# .' ('.&Apache::lonnet::declutter($hash{'map_id_'.$1}).')'
+ );
+ }
+ my $Result = "\n".'
';
+ $Result .= '
P#
'."\n";
+ for ( my $nIdx=0; $nIdx < 11; $nIdx++ ) {
+ $Result .= '
'."\n");
+ $r->rflush();
+}
+
# ------------------------------------------- Prepare Statistics Table
sub PreStatTable {
my $CacheDB = "/home/httpd/perl/tmp/$ENV{'user.name'}".
@@ -570,29 +260,24 @@ sub PreStatTable {
' #Stdnts: Total Number of Students opened the problem. '.
' Tries : Total Number of Tries for solving the problem. '.
' Mod : Maximunm Number of Tries for solving the problem. '.
- ' Mean : Average Number of the tries. [ Tries / #Stdns ] '.
+ ' Mean : Average Number of the tries. [ Tries / #Stdnts ] '.
' #YES : Number of students solved the problem correctly. '.
' #yes : Number of students solved the problem by override. '.
- ' %Wrng : Percentage of students tried to solve the problem but still incorrect. [ 100*((#Stdnts-(#YES+#yes))/#Stdnts) ] '.
- ' S.D. : Standard Deviation of the tries.[ sqrt(sum((Xi - Mean)^2)) / (#Stdnts-1) where Xi is every student\'s tries ] '.
- ' Skew. : Skewness of the students tries. [ (sqrt( sum((Xi - Mean)^3) / #Stdnts)) / (S.D.^3) ] '.
+ ' %Wrng : Percentage of students tried to solve the problem but'.
+ ' still incorrect. [ 100*((#Stdnts-(#YES+#yes))/#Stdnts) ] '.
# ' DoDiff : Degree of Difficulty of the problem. [ Tries/(#YES+#yes+0.1) ] '.
' DoDiff : Degree of Difficulty of the problem. [ 1 - ((#YES+#yes) / Tries) ] '.
+ ' S.D. : Standard Deviation of the tries.'.
+ '[ sqrt(sum((Xi - Mean)^2)) / (#Stdnts-1)'.
+ ' where Xi denotes every student\'s tries ] '.
+ ' Skew. : Skewness of the students tries.'.
+ ' [ (sqrt( sum((Xi - Mean)^3) / #Stdnts)) / (S.D.^3) ] '.
+
# ' Dis.F. : Discrimination Factor. [ Sum of Partial Credits Awarded / Total Number of Tries in %27 upper and lower students]'.
'';
$r->print($Ptr);
$r->rflush();
-
- my $Result = "\n".'
';
- $Result .= '
P#
'."\n";
- for ( my $nIdx=0; $nIdx < 12; $nIdx++ ) {
- $Result .= '
'.''.'
'."\n";
- }
- $Result .= "\n".'
'."\n";
- $r->print( $Result );
- $r->rflush();
if ((-e "$CacheDB")&&($ENV{'form.sort'} ne 'Recalculate Statistics')) {
if (tie(%CachData,'GDBM_File',"$CacheDB",&GDBM_READER,0640)) {
@@ -620,10 +305,7 @@ sub PreStatTable {
untie(%CachData);
untie(%GraphDat);
- untie(%DiscFac);
-
- $r->print("\n".'
'."\n");
- $r->rflush();
+ untie(%DiscFac);
}
@@ -641,7 +323,7 @@ sub usection {
if ($key eq $courseid.'_st') { $section=''; }
my ($dummy,$end,$start)=split(/\_/,&Apache::lonnet::unescape($value));
$section=($section) ? $section : '(none)';
- $section=(int($section)) ? int($section) : $section;
+# $section=(int($section)) ? int($section) : $section;
# $r->print($unam.'...'.$section.' ');
return $section;
}
@@ -660,6 +342,7 @@ sub ExtractStudentData {
my $reply=&Apache::lonnet::reply('dump:'.$sdom.':'.$sname.':'.$coid,$shome );
my %result = ();
my $ResId;
+ my $PrOrd;
my $Dis = '';
my $Code;
my $Tries;
@@ -677,15 +360,17 @@ sub ExtractStudentData {
my $SecLimit;
my $MapLimit;
unless ($reply=~/^error\:/) {
- map {
+ foreach (split(/\&/,$reply)) {
my ($name,$value)=split(/\=/,&Apache::lonnet::unescape($_));
$result{$name}=$value;
-#$r->print($name.'='.$value.' ');
- } split(/\&/,$reply);
- foreach $ResId (@cols) {
- if ( !$ResId ) { next; }
+ }
+ foreach my $CurCol(@cols) {
+ ($PrOrd,$ResId)=split(/\:/,$CurCol);
+ if ( !$CurCol ) { next; }
$ResId=~/(\d+)\.(\d+)/;
- my $Map = &Apache::lonnet::declutter( $hash{'map_id_'.$1} );
+ my $MapId=$1;
+ my $PrbId=$2;
+ my $Map = &Apache::lonnet::declutter( $hash{'map_id_'.$MapId} );
if ( $CurMap ne 'All Maps' ) {
my ( $ResMap, $NameMap ) = split(/\=/,$CurMap);
if ( $Map ne $ResMap ) { next; }
@@ -694,19 +379,20 @@ sub ExtractStudentData {
my $PartNo = 0;
$Dis .= ':';
undef %TempHash;
- map {
+ foreach (split(/\,/,&Apache::lonnet::metadata($meta,'keys'))) {
if ($_=~/^stores\_(\d+)\_tries$/) {
my $Part=&Apache::lonnet::metadata($meta,$_.'.part');
if ( $TempHash{"$Part"} eq '' ) {
$TempHash{"$Part"} = $Part;
$TempHash{$PartNo}=$Part;
$TempHash{"$Part.Code"} = 'U';
+ $TempHash{"$Part.PrOrd"} = $PrOrd+$PartNo;
$PartNo++;
}
}
- } split(/\,/,&Apache::lonnet::metadata($meta,'keys'));
+ }
- my $Prob = $Map.'___'.$2.'___'.
+ my $Prob = $Map.'___'.$PrbId.'___'.
&Apache::lonnet::declutter( $hash{'src_'.$ResId} );
$Code='U';
$Tries = 0;
@@ -750,9 +436,10 @@ sub ExtractStudentData {
if ( $TempHash{$part.'.Code'} eq 'C' ||
$TempHash{$part.'.Code'} eq 'O' )
{$ProbSolved++;$Yes=1;}
- my $ptr = "$hash{'title_'.$ResId}";
+# my $ptr = "$hash{'title_'.$ResId}";
+ my $ptr = $TempHash{$part.'.PrOrd'}.':'.$ResId;
if ( $PartNo > 1 ) {
- $ptr .= " (part $part)";
+ $ptr .= "*(part $part)";
$Dis .= ':';
}
my $Fac = ($TempHash{"$part.Tries"}) ?
@@ -765,21 +452,20 @@ sub ExtractStudentData {
# $DisF .= '+'.$TempHash{"$part.Time"};
$TimeTot += $TempHash{"$part.Time"};
$Dis .= $ptr.'*'.$ResId.'='.$DisF.'+'.$Yes;
- $ptr .= "*$ResId:$TempHash{$part.'.Tries'}".
+ $ptr .= ":$TempHash{$part.'.Tries'}".
":$TempHash{$part.'.Wrongs'}".
- ":$TempHash{$part.'.Code'}";
-#$r->print($sname.' -- '.$ptr.'--- timestamp='.$TempHash{"$part.Time"}.' ');
+ ":$TempHash{$part.'.Code'}";
push (@list, $ptr);
$TotalOpend++;
$ProbTot++;
}
}
- else {
- for(my $n=0; $n<$PartNo; $n++) {
- push (@list, "$hash{'title_'.$ResId}*$ResId:0:0:U");
- $ProbTot++;
- }
- }
+ #else {
+ #for(my $n=0; $n<$PartNo; $n++) {
+ # push (@list, "$hash{'title_'.$ResId}*$ResId:0:0:U");
+ # $ProbTot++;
+ #}
+ #}
}
if ( $TotalTries ) {
my $DisFac = ( $TotalTries ) ? ($TotParCr/$TotalTries) : 0;
@@ -787,7 +473,7 @@ sub ExtractStudentData {
my $DisFactor = sprintf( "%.4f", $DisFac );
my $time;
if ($ProbSolved){
- $time = int(($TimeTot/$ProbSolved)/10000000);
+ $time = int(($TimeTot/$ProbSolved)-10000000);
}
$DiscFac{($DisFactor.':'.$sname.':'.$ProbTot.':'.$TotalOpend.':'.
$TotalTries.':'.$ProbSolved.':'.$time)}=$Dis;
@@ -803,41 +489,65 @@ sub tracetable {
my ($rid,$beenhere)=@_;
$rid=~/(\d+)\.(\d+)/;
$maps{&Apache::lonnet::declutter($hash{'map_id_'.$1})}='';#$hash{'title_'.$rid};
+ #$maps{$HWN}=$hash{'title_'.$rid};
unless ($beenhere=~/\&$rid\&/) {
$beenhere.=$rid.'&';
if (defined($hash{'is_map_'.$rid})) {
my $cmap=$hash{'map_type_'.$hash{'map_pc_'.$hash{'src_'.$rid}}};
if ( $cmap eq 'sequence' || $cmap eq 'page' ) {
$cols[$#cols+1]=0;
+ $P_Order++;
+ $HWN=$P_Order;
+ $mapsort{$HWN} = $rid.':';
#$maps{&Apache::lonnet::declutter($hash{'src_'.$rid})}=
# $hash{'title_'.$rid};
}
if ((defined($hash{'map_start_'.$hash{'src_'.$rid}})) &&
(defined($hash{'map_finish_'.$hash{'src_'.$rid}}))) {
- my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}};
+ my $frid=$hash{'map_finish_'.$hash{'src_'.$rid}};
- &tracetable($hash{'map_start_'.$hash{'src_'.$rid}},
- '&'.$frid.'&');
+ &tracetable($hash{'map_start_'.$hash{'src_'.$rid}},
+ '&'.$frid.'&');
- if ($hash{'src_'.$frid}) {
- if ($hash{'src_'.$frid}=~
- /\.(problem|exam|quiz|assess|survey|form)$/) {
- $cols[$#cols+1]=$frid;
- }
- }
+ $cols[$#cols+1]=($P_Order+1).':'.$frid;
+
+ my $meta=$hash{'src_'.$frid};
+ my $PartNo = 0;
+ if ($meta) {
+ if ($meta=~/\.(problem|exam|quiz|assess|survey|form)$/) {
+ foreach (split(/\,/,&Apache::lonnet::metadata($meta,'keys'))) {
+ if ($_=~/^stores\_(\d+)\_tries$/) {
+ &Apache::lonnet::metadata($meta,$_.'.part');
+ $P_Order++;
+ $mapsort{$HWN} .= '&'.$P_Order;
+ $PartNo++;
+ $r->print(' '.$PartNo.'---'.$P_Order);
+ }
+ }
+ }
+ }
}
} else {
- if ($hash{'src_'.$rid}) {
- if ($hash{'src_'.$rid}=~
- /\.(problem|exam|quiz|assess|survey|form)$/) {
- $cols[$#cols+1]=$rid;
- }
- }
+ $cols[$#cols+1]=($P_Order+1).':'.$rid;
+ my $meta=$hash{'src_'.$rid};
+ my $PartNo = 0;
+ if ($meta) {
+ if ($meta=~/\.(problem|exam|quiz|assess|survey|form)$/) {
+ foreach (split(/\,/,&Apache::lonnet::metadata($meta,'keys'))) {
+ if ($_=~/^stores\_(\d+)\_tries$/) {
+ &Apache::lonnet::metadata($meta,$_.'.part');
+ $P_Order++;
+ $mapsort{$HWN} .= '&'.$P_Order;
+ $PartNo++;
+ }
+ }
+ }
+ }
}
if (defined($hash{'to_'.$rid})) {
- map {
+ foreach (split(/\,/,$hash{'to_'.$rid})){
&tracetable($hash{'goesto_'.$_},$beenhere);
- } split(/\,/,$hash{'to_'.$rid});
+ }
}
}
}
@@ -855,16 +565,16 @@ sub MySort {
sub Build_Statistics {
$r->print(<
+
+
ENDPOP
$r->rflush();
@@ -883,7 +593,8 @@ ENDPOP
$r->print('');
$r->rflush();
# -------------------- sorting the Data
- @list = sort(@list);
+ @list = sort (@list);
+
$OpSel2='';
$OpSel1='selected';
@@ -894,137 +605,126 @@ ENDPOP
my $ResId;
my $NoElements = $#list + 1;
#-------------------------------- loop for data representation
- while ( $nIdx < $NoElements ) {
- my %storestats=();
- my ($Prob,$Tries,$Wrongs,$Code)=split(/\:/,$list[$nIdx]);
- my $Temp = $Prob;
- my $MxTries = 0;
- my $TotalTries = 0;
- my $YES = 0;
- my $Incorrect = 0;
- my $Override = 0;
- my $StdNo = 0;
- my @StdLst;
- do {
- $nIdx++;
- $StdNo++;
- $StdLst[ $StdNo ] = $Tries;
- $TotalTries += $Tries;
- if ( $MxTries < $Tries ) { $MxTries = $Tries; }
- if ( $Code eq 'C' ){ $YES++; }
- elsif( $Code eq 'I' ) { $Incorrect++; }
- elsif( $Code eq 'O' ) { $Override++; }
- elsif( $Code eq 'U' ) { $StdNo--; }
- ($Prob,$Tries,$Wrongs,$Code)=split(/\:/,$list[$nIdx]);
- } while ( $Prob eq $Temp && $nIdx < $NoElements );
-
- $p_count++;
-
- ($Temp,$ResId)=split(/\*/,$Temp);
+ foreach (sort keys %mapsort) {
+ my ($Hid,$pr)=split(/\:/,$mapsort{$_});
+ my @lpr=split(/\&/,$pr);
+ &CreateTable(1,$Hid);
+ for (my $i=1; $i<=$#lpr; $i++) {
+ my %storestats=();
+ my ($PrOrd,$Prob,$Tries,$Wrongs,$Code)=split(/\:/,$list[$nIdx]);
+ my $Temp = $Prob;
+ my $MxTries = 0;
+ my $TotalTries = 0;
+ my $YES = 0;
+ my $Incorrect = 0;
+ my $Override = 0;
+ my $StdNo = 0;
+ my @StdLst;
+ while ( $PrOrd == $lpr[$i] )
+ {
+ $nIdx++;
+ $StdNo++;
+ $StdLst[ $StdNo ] = $Tries;
+ $TotalTries += $Tries;
+ if ( $MxTries < $Tries ) { $MxTries = $Tries; }
+ if ( $Code eq 'C' ){ $YES++; }
+ elsif( $Code eq 'I' ) { $Incorrect++; }
+ elsif( $Code eq 'O' ) { $Override++; }
+ elsif( $Code eq 'U' ) { $StdNo--; }
+ ($PrOrd,$Prob,$Tries,$Wrongs,$Code)=split(/\:/,$list[$nIdx]);
+ }
+
+ $p_count++;
+ my $Dummy;
+ ($ResId,$Dummy)=split(/\*/,$Temp);
- $Temp = ''.$Temp.'';
+ $Temp = ''.$hash{'title_'.$ResId}.$Dummy.'';
- my $res = &Apache::lonnet::declutter($hash{'src_'.$ResId});
- my $urlres=$res;
+ my $res = &Apache::lonnet::declutter($hash{'src_'.$ResId});
+ my $urlres=$res;
- $ResId=~/(\d+)\.(\d+)/;
- my $Map = &Apache::lonnet::declutter( $hash{'map_id_'.$1} );
- $urlres=$Map;
+ $ResId=~/(\d+)\.(\d+)/;
+ my $Map = &Apache::lonnet::declutter( $hash{'map_id_'.$1} );
+ $urlres=$Map;
-
- $res = ''.$res.'';
-
- #$Map = ''.$res.'';
+ $res = ''.$res.'';
+ #$Map = ''.$res.'';
#------------------------ Compute the Average of Tries about one problem
- my $Average = ($StdNo) ? $TotalTries/$StdNo : 0;
+ my $Average = ($StdNo) ? $TotalTries/$StdNo : 0;
- $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___timestamp'}=time;
- $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___stdno'}=$StdNo;
- $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___avetries'}=$Average;
+ $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___timestamp'}=time;
+ $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___stdno'}=$StdNo;
+ $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___avetries'}=$Average;
#-------------------------------- Compute percentage of Wrong tries
- my $Wrong = ( $StdNo ) ? 100 * ( $Incorrect / $StdNo ) : 0;
+ my $Wrong = ( $StdNo ) ? 100 * ( $Incorrect / $StdNo ) : 0;
#-------------------------------- Compute Standard Deviation
- my $StdDev = 0;
- if ( $StdNo > 1 ) {
- for ( my $n = 0; $n < $StdNo; $n++ ) {
- my $Dif = $StdLst[ $n ]-$Average;
- $StdDev += $Dif*$Dif;
- }
- $StdDev /= ( $StdNo - 1 );
- $StdDev = sqrt( $StdDev );
- }
+ my $StdDev = 0;
+ if ( $StdNo > 1 ) {
+ for ( my $n = 0; $n < $StdNo; $n++ ) {
+ my $Dif = $StdLst[ $n ]-$Average;
+ $StdDev += $Dif*$Dif;
+ }
+ $StdDev /= ( $StdNo - 1 );
+ $StdDev = sqrt( $StdDev );
+ }
#-------------------------------- Compute Degree of Difficulty
- my $DoDiff = 0;
- if( $TotalTries > 0 ) {
- $DoDiff = 1 - ( ( $YES + $Override ) / $TotalTries );
+ my $DoDiff = 0;
+ if( $TotalTries > 0 ) {
+ $DoDiff = 1 - ( ( $YES + $Override ) / $TotalTries );
# $DoDiff = ($TotalTries)/($YES + $Override+ 0.1);
- }
+ }
- $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___difficulty'}=$DoDiff;
+ $storestats{$ENV{'request.course.id'}.'___'.$urlres.'___difficulty'}=$DoDiff;
#-------------------------------- Compute the Skewness
- my $Skewness = 0;
- my $Sum = 0;
- if ( $StdNo > 0 && $StdDev > 0 ) {
- for ( my $n = 0; $n < $StdNo; $n++ ) {
- my $Dif = $StdLst[ $n ]-$Average;
- $Skewness += $Dif*$Dif*$Dif;
- }
- $Skewness /= $StdNo;
+ my $Skewness = 0;
+ my $Sum = 0;
+ if ( $StdNo > 0 && $StdDev > 0 ) {
+ for ( my $n = 0; $n < $StdNo; $n++ ) {
+ my $Dif = $StdLst[ $n ]-$Average;
+ $Skewness += $Dif*$Dif*$Dif;
+ }
+ $Skewness /= $StdNo;
$Skewness /= $StdDev*$StdDev*$StdDev;
- }
+ }
#----------------- Some restition in presenting the float numbers
- my $Avg = sprintf( "%.2f", $Average );
- my $Wrng = sprintf( "%.1f", $Wrong );
- my $SD = sprintf( "%.1f", $StdDev );
- my $DoD = sprintf( "%.2f", $DoDiff );
- my $Sk = sprintf( "%.1f", $Skewness );
-
- $CachData{($p_count-1)}=$Temp.':'.$StdNo.':'.$TotalTries.':'.
- $MxTries.':'.$Avg.':'.$YES.':'.
- $Override.':'.$Wrng.':'.$SD.':'.
- $Sk.':'.$DoD.':'.$Map.':'.$Prob;
-
- $urlres=~/^(\w+)\/(\w+)/;
- if ($StdNo) {
- &Apache::lonnet::put('resevaldata',\%storestats,$1,$2);
- }
-
+ my $Avg = sprintf( "%.2f", $Average );
+ my $Wrng = sprintf( "%.1f", $Wrong );
+ my $SD = sprintf( "%.1f", $StdDev );
+ my $DoD = sprintf( "%.2f", $DoDiff );
+ my $Sk = sprintf( "%.1f", $Skewness );
+ my $join = $PrOrd.':'.$Temp.':'.$StdNo.':'.
+ $TotalTries.':'.$MxTries.':'.$Avg.':'.
+ $YES.':'.$Override.':'.$Wrng.':'.$DoD.':'.
+ $SD.':'.$Sk.':'.$Map.':'.$Prob;
+ $CachData{($p_count-1)}=$join;
+
+ $urlres=~/^(\w+)\/(\w+)/;
+ if ($StdNo) {
+ &Apache::lonnet::put('resevaldata',\%storestats,$1,$2);
+ }
#-------------------------------- Row of statistical table
- if ( $DiscFlag == 0 ) {
- $r->print( "\n".'
'.
- "\n".'
'.$p_count.'
'.
- "\n".'
'.$Temp.'
'.
- "\n".'
'.$StdNo.'
'.
- "\n".'
'.$TotalTries.'
'.
- "\n".'
'.$MxTries.'
'.
- "\n".'
'.$Avg.'
'.
- "\n".'
'.$YES.'
'.
- "\n".'
'.$Override.'
'.
- "\n".'
'.$Wrng.'
'.
- "\n".'
'.$SD.'
'.
- "\n".'
'.$Sk.'
'.
- "\n".'
'.$DoD.'
'.
- "\n".'
'.$Map.'
'.
- "\n".'
' );
- $GraphDat{$nIdx}=$DoD.':'.$Wrng;
- }
+ if ( $DiscFlag == 0 ) {
+ &TableRow($join,$i,($p_count-1));
+ }
+ }
+ &CloseTable();
}
}
-
sub Cache_Statistics {
my @list = ();
my $Useful;
my $UnUseful;
my %myHeader = reverse( %Header );
$Pos = $myHeader{$ENV{'form.sort'}};
+ if ($Pos > 0) {$Pos++;}
$p_count = 0;
-
foreach my $key( keys %CachData) {
my @Temp=split(/\:/,$CachData{$key});
if ( $Pos == 0 || $Pos == 11 ) {
@@ -1039,27 +739,51 @@ sub Cache_Statistics {
@list = sort MySort (@list);
- for ( my $nIdx = 0; $nIdx < $p_count; $nIdx++ ) {
- my( $Pre, $Post ) = split(/\&/,$list[$nIdx]);
- my ($Temp,$StdNo,$TotalTries,$MxTries,$Avg,$YES,
- $Override,$Wrng,$SD,$Sk,$DoD,$res,$Prob)=split(/\:/,$Post);
- $r->print( "\n".'