--- loncom/homework/default_homework.lcpm 2000/10/25 22:02:53 1.7 +++ loncom/homework/default_homework.lcpm 2001/05/31 20:47:50 1.24 @@ -2,57 +2,156 @@ # used by lonxml::xmlparse() as input variable $safeinit to Apache::run::run() # # +#init some globals +# +# Guy Albertelli +# +# 05/25/2001 H. K. Ng +# 05/31/2001 H. K. Ng +# $RANDOMINIT=0; +$pi=atan2(1,1)*4; +$rad2deg=180.0/$pi; +$deg2rad=$pi/180.0; sub caparesponse_check { - my $answer=''; - my $type=''; - my $tol_type=''; - my $tolerance=''; - my $sig_lbound=''; - my $sig_ubound=''; + my $answer=''; #done + my $type=''; #done + my $tol_type=''; # gets it's value from whether tol has a % or not done + my $tol=''; #done + my $sig=''; #done lowerbnd,upperbnd + my $sig_lbound=''; #done + my $sig_ubound=''; #done my $ans_fmt=''; - my $unit_str=''; + my $units=''; #done my $calc=''; my ($response,$expr)=@_; - ($answer,$type,$tol_type,$tolerance,$sig_lbound,$sig_ubound,$ans_fmt, - $unit_str,$calc) = eval $expr.'return $answer,$type,$tol_type,$tolerance,$sig_lbound,$sig_ubound,$ans_fmt,$unit_str,$calc'; + ($answer,$type,$tol,$sig,$ans_fmt, + $units,$calc) = eval $expr.';return $answer,$type,$tol,$sig,$ans_fmt,$units,$calc'; + #type's definitons come from capaParser.h + if ($type eq '' ) { + if ( $answer eq ($answer *1.0)) { $type = 2; + } else { $type = 3; } + } else { + if ($type eq 'cs') { $type = 4; + } elsif ($type eq 'ci') { $type = 3; + } elsif ($type eq 'mc') { $type = 5; + } elsif ($type eq 'fml') { $type = 8; + } elsif ($type eq 'subj') { $type = 7; + } else { return "ERROR: Unknown type of answer: $type" } + } + + if ($tol eq '') { + $tol=0.0; + $tol_type=1; #TOL_ABSOLUTE + } else { + if ($tol =~ /%$/) { + chop $tol; + $tol_type=2; #TOL_PERCENTAGE + } else { + $tol_type=1; #TOL_ABSOLUTE + } + } + + if ($sig eq '') { + $sig_lbound = 0; #SIG_LB_DEFAULT + $sig_ubound =15; #SIG_UB_DEFAULT + } else { + ($sig_lbound,$sig_ubound) = split /,/,$sig; + } my $result = &caparesponse_capa_check_answer($response,$answer,$type, - $tol_type,$tolerance, + $tol_type,$tol, $sig_lbound,$sig_ubound, - $ans_fmt, $unit_str,$calc); - return ":$result:$response:$answer:"; + $ans_fmt,$units,$calc); + + if ($result == '1') { $result='EXACT_ANS'; } + elsif ($result == '2') { $result='APPROX_ANS'; } + elsif ($result == '3') { $result='SIG_FAIL'; } + elsif ($result == '4') { $result='UNIT_FAIL'; } + elsif ($result == '5') { $result='NO_UNIT'; } + elsif ($result == '6') { $result='UNIT_OK'; } + elsif ($result == '7') { $result='INCORRECT'; } + elsif ($result == '8') { $result='UNIT_NOTNEEDED'; } + elsif ($result == '9') { $result='ANS_CNT_NOT_MATCH'; } + elsif ($result =='10') { $result='SUB_RECORDED'; } + elsif ($result =='11') { $result='BAD_FORMULA'; } + elsif ($result =='12') { $result='WANTED_NUMERIC'; } + else {$result = "ERROR: Unknown Result:$result:$@:";} + + return "$result:
Error $error:
Answer $answer:
Response $response:
$type|$tol|$tol_type|$sig:$sig_lbound:$sig_ubound|$units
"; +} + +sub caparesponse_check_list { + my ($response,$expr)=@_; + my $result=''; + my $aresult=''; + my $current_answer; + my $answer = eval $expr.';return $answer'; + my (@list) = eval $answer; + my (@responselist)=split /,/,$response; + my $unit=''; + $result.="Final response :$responselist['-1']:
"; + if ( $responselist['-1']=~ /(.*[^\s])\s+([^\s]+)/ ) { + $responselist['-1']=$1; + $unit=$2; + } + $result.="Final response :$responselist['-1']:
"; + $unit=~s/\s//; + my $i=0; + my $awards=''; + for ($i=0; $i<@list;$i++) { + if ($unit eq '') { + $aresult=&caparesponse_check($responselist[$i], + $expr.';my $answer='.$list[$i].';'); + } else { + $aresult=&caparesponse_check($responselist[$i]." $unit", + $expr.';my $answer='.$list[$i].';'); + } + my ($temp)=split /:/, $aresult; + $awards.="$temp,"; + $result.=$aresult; + } + chop $awards; + return "$awards:
$result"; } sub tex { if ( $external::target eq "tex" ) { - #$SCRIPT_RESULT.=@_[0]; return @_[0]; } else { - #$SCRIPT_RESULT.=@_[1]; return @_[1]; } } +sub var_in_tex { + if ( $external::target eq "tex" ) { + return @_[0]; + } else { + return ""; + } +} + sub web { if ( $external::target eq "tex" ) { - #$SCRIPT_RESULT.=@_[1]; return @_[1]; } else { if ( $external::target eq "web") { - #$SCRIPT_RESULT.=@_[0]; return @_[0]; } else { - #$SCRIPT_RESULT.=@_[2]; return @_[2]; } } } +sub html { + if ( $external::target eq "web" ) { + return @_[0]; + } +} + sub problem { - $SCRIPT_RESULT.='1'; - return ''; + return '1'; } sub hinton { @@ -67,17 +166,63 @@ sub random { return $result; } +sub abs { abs(shift) } +sub sin { sin(shift) } +sub cos { cos(shift) } +sub exp { exp(shift) } +sub int { int(shift) } +sub log { log(shift) } +sub atan2 { atan2($_[0],$_[1]) } +sub sqrt { sqrt(shift) } + sub tan { sin($_[0]) / cos($_[0]) } -sub acos { atan2(sqrt(1 - $_[0] * $_[0]), $_[0] ); } -sub asin { atan2($_[0], sqrt(1- $_[0] * $_[0]) ); } +#sub atan { atan2($_[0], 1); } +#sub acos { atan2(sqrt(1 - $_[0] * $_[0]), $_[0] ); } +#sub asin { atan2($_[0], sqrt(1- $_[0] * $_[0]) ); } + +sub log10 { log($_[0])/log(10); } + +sub factorial { + my $input = int(shift); + return "Error - unable to take factorial of an negative number ($input)" if $input < 0; + return "Error - factorial result is greater than system limit ($input)" if $input > 170; + return 1 if $input == 0; + my $result = 1; + for (my $i=2; $i<=$input; $i++) { $result *= $i } + return $result; +} -sub html { - if ( $external::target eq "web" ) { - #$SCRIPT_RESULT.=@_[0]; - return @_[0]; - } +sub sgn { + return -1 if $_[0] < 0; + return 0 if $_[0] == 0; + return 1 if $_[0] > 0; +} + +sub min { + my @sorted = sort { $a <=> $b || $a cmp $b } @_; + return shift @sorted; +} + +sub max { + my @sorted = sort { $a <=> $b || $a cmp $b } @_; + return pop @sorted; } +sub roundto { + my ($input,$n) = @_; + return sprintf('%.'.$n.'f',$input); +} + +sub to_string { + my ($input,$n) = @_; + return sprintf('%'.$n,$input) if $n ne ""; + return sprintf($input) if $n eq ""; +} + +sub sub_string { + my ($str,$start,$len) = @_; + return substr($str,$start-1,$len); +} sub pow {return $_[0] ** $_[1]; } sub ceil {return (($_[0]-int($_[0]))== 0.0) ? $_[0] : (int($_[0])+ 1); } @@ -85,7 +230,7 @@ sub floor {return int($_[0]); } sub format { my ($value,$fmt)=@_; - $SCRIPT_RESULT.=sprintf('%.'.$fmt,$value); + return sprintf('%.'.$fmt,$value); } sub map { @@ -106,13 +251,120 @@ sub map { } } +sub capa_id { return } + +sub problem { return } + +sub name{ + my $fullname = &EXT('environment.lastname').', '.&EXT('environment.firstname').' '.&EXT('environment.middlename'); + $fullname = "" if $fullname eq ", "; + $fullname =~ s/\%2d/-/; + return $fullname; +} + +sub student_number { + my $id = &EXT('environment.id'); + $id = '' if $id eq ""; + return $id; +} + +sub class { + my $course = &EXT('course.description'); + $course = '' if $course eq ""; + return $course; +} + +sub sec { + my $sec = &EXT('request.course.sec'); + $sec = '' if $sec eq ""; + return $sec; +} + +sub open_date { + my @dc = split(/\s+/,localtime(&EXT('resource.0.opendate'))); + return '' if ($dc[0] eq "Wed" and $dc[2] == 31 and $dc[4] == 1969); + my @hm = split(/:/,$dc[3]); + my $ampm = " am"; + if ($hm[0] > 12) { + $hm[0]-=12; + $ampm = " pm"; + } + return $dc[0].', '.$dc[1].' '.$dc[2].', '.$dc[4].' at '.$hm[0].':'.$hm[1].$ampm; +} + +sub due_date { + my @dc = split(/\s+/,localtime(&EXT('resource.0.duedate'))); + return '' if ($dc[0] eq "Wed" and $dc[2] == 31 and $dc[4] == 1969); + my @hm = split(/:/,$dc[3]); + my $ampm = " am"; + if ($hm[0] > 12) { + $hm[0]-=12; + $ampm = " pm"; + } + return $dc[0].', '.$dc[1].' '.$dc[2].', '.$dc[4].' at '.$hm[0].':'.$hm[1].$ampm; +# return $dc[0].', '.$dc[1].' '.$dc[2].', '.$dc[4].' at '.$dc[3]; +} + +sub answer_date { + my @dc = split(/\s+/,localtime(&EXT('resource.0.answerdate'))); + return '' if ($dc[0] eq "Wed" and $dc[2] == 31 and $dc[4] == 1969); + my @hm = split(/:/,$dc[3]); + my $ampm = " am"; + if ($hm[0] > 12) { + $hm[0]-=12; + $ampm = " pm"; + } + return $dc[0].', '.$dc[1].' '.$dc[2].', '.$dc[4].' at '.$hm[0].':'.$hm[1].$ampm; +# return $dc[0].', '.$dc[1].' '.$dc[2].', '.$dc[4].' at '.$dc[3]; +} + +sub array_moments { + my @input=@_; + my (@output,$N); + $N=scalar (@input); + $output[0]=$N; + if ($N <= 1) { + $output[1]=$input[0]; + $output[1] = "Input array not defined" if ($N == 0); + $output[2]="variance undefined for N<=1"; + $output[3]="skewness undefined for N<=1"; + $output[4]="kurtosis undefined for N<=1"; + return @output; + } + my $sum=0; + foreach my $line (@input) { + $sum+=$line; + } + $output[1] = $sum/$N; + my ($x,$sdev,$var,$skew,$kurt) = 0; + foreach my $line (@input) { + $x=$line-$output[1]; + $var+=$x**2; + $skew+=$x**3; + $kurt+=$x**4; + } + $output[2]=$var/($N-1); + $sdev=sqrt($output[2]); + if ($sdev == 0) { + $output[3]="inf-variance=0"; + $output[4]="inf-variance=0"; + return @output; + } + $output[3]=$skew/($sdev**3*$N); + $output[4]=$kurt/($sdev**4*$N)-3; + return @output; +} + sub choose { my $num = $_[0]; return $_[$num]; } + #$external::randomseed=time; #$a=2; #$b=2; #$c=2; #&map(1,\$a,\$b,\$c,3,4,5); #print $a."\n".$b."\n"; + +