#!/usr/local/bin/webwork-perl
BEGIN {
be_strict();
}
sub CAPA_ans {
my $ans = shift;
my %options = @_;
my $answer_evaluator = 0;
#TEXT("answerCounter =". ++$problemCounter,"$BR"); # checking whether values are reinitialized
if (defined($options{'reltol'}) or defined($options{'tol'}) or defined($options{'unit'}) ) {
if (defined( $options{'unit'} ) ) {
$ans = "$ans $options{'unit'}";
$answer_evaluator = numerical_compare_with_units($ans, %options);
} else { # numerical compare:
if (defined($options{'reltol'}) ) { #relative tolerance is given with a percent sign
my $reltol = $options{ 'reltol' };
my $format = $options{'format'} if defined($options{'format'});
$answer_evaluator = std_num_cmp($ans,$reltol,$format);
} elsif (defined($options{'tol'}) ) {
my $format = $options{'format'} if defined($options{'format'});
$answer_evaluator = std_num_cmp_abs($ans,$options{'tol'},$format);
} else {
my $tol = $ans*$main::numRelPercentTolDefault;
my $format = $options{'format'} if defined($options{'format'});
$answer_evaluator = std_num_cmp_abs($ans,$tol,$format);
}
}
} else {
# string comparisons
if ( defined($options{'str'}) and $options{'str'} =~/CS/i ) {
$answer_evaluator =std_cs_str_cmp($ans);
} elsif ( defined($options{'str'}) and $options{'str'} =~/MC/i ) {
$answer_evaluator = unordered_str_cmp($ans);
} else {
$answer_evaluator = std_str_cmp($ans);
}
}
$answer_evaluator;
}
sub CAPA_import {
my $filePath = shift;
my %save_envir = %main::envir;
my $r_string = read_whole_problem_file($filePath);
$main::envir{'probFileName'} = $filePath;
$main::envir{'fileName'} = $filePath;
includePGtext($r_string); # the 0 prevents a new Safe compartment from being used
%main::envir = %save_envir;
}
sub CAPA_map {
my $seed = shift;
my $array_var_ref = shift;
my $PGrand = new PGrandom($seed);
local $main::array_values_ref = shift; # this must be local since it must be passed to PG_restricted_eval
my $size = @$main::array_values_ref; # get number of values
my @array = 0..($size-1);
my @slice = ();
while ( @slice < $size) {
push(@slice, splice(@array , $PGrand->random(0,$#array) , 1) );
}
my $string = "";
my $var;
my $i = 0;
foreach $var (@$array_var_ref) {
$string .= "\$$var = \$\$main::array_values_ref[ $slice[$i++]]; ";
}
# it is important that PG-restriced eval can accesss the $array_values_ref
my($val, $PG_eval_errors,$PG_full_error_report) =PG_restricted_eval($string);
my $out = '';
$string =~ s/\$/\\\$/g; # protect variables for error message
$out = "Error in MAP subroutine: $PG_eval_errors
\n" . $string ."
\n" if $PG_eval_errors;
$out;
}
sub compare_units {
}
sub CAPA_hint {
my $hint = shift;
TEXT(hint(qq{ HINT: $hint $main::BR}));
}
sub CAPA_explanation {
TEXT(solution( qq{ $main::BR$main::BR EXPLANATION: @_ $main::BR$main::BR} )) if solution(@_);
}
sub pow {
my($base,$exponent)=@_;
$base**$exponent;
}
sub CAPA_tex {
my $tex = shift;
# $tex =~ s|/*|\$|g;
#$tex =~ s/\\/\\\\/g; #protect backslashes???
my $nontex = shift;
&M3($tex, $nontex,$nontex);
}
sub CAPA_web {
my $text = shift;
my $tex = shift;
my $html = shift;
&M3($tex,"\\begin{rawhtml}$html\\end{rawhtml}",$html);
}
sub CAPA_html {
my $html = shift;
&M3("","\\begin{rawhtml}$html\\end{rawhtml}",$html);
}
sub var_in_tex {
my($tex)=$_[0];
&M3( "$tex","$tex","");
}
sub isNumberQ { # determine whether the input is a number
my $in = shift;
$in =~ /^[\d\.\+\-Ee]+$/;
}
sub choose {
# my($in)=join(" ",@_);
my($var)=$_[0];
$_[$var];
}
sub problem {
$main::probNum;
}
sub pin {
$main::psvnNumber;
}
sub section {
$main::sectionNumber;
}
sub name {
$main::studentName;
}
sub set {
$main::setNumber;
}
sub question {
$main::probNum;
}
sub due_date {
$main::formattedDueDate;
}
sub answer_date {
$main::formattedAnswerDate;
}
sub open_date {
$main::formattedOpenDate;
}
sub to_string {
$_[0];
}
sub CAPA_EV {
my $out = &EV3(@_);
$out =~ s/\n\n/\n/g; # hack to prevent introduction of paragraphs in TeX??
# HACK TO DO THE RIGHT THING WITH DOLLAR SIGNS
$out = ev_substring($out,"/*/*","/*/*",\&display_math_ev3);
$out = ev_substring($out,"/*","/*",\&math_ev3);
# TEXT($main::BR, $main::BR, $out,$main::BR,$main::BR);
$out;
}
# these are very commonly needed files
CAPA_import("${main::CAPA_Tools}StdMacros");
CAPA_import("${main::CAPA_Tools}StdUnits");
CAPA_import("${main::CAPA_Tools}StdConst");
#####################
$main::prob_val=""; # gets rid of spurious errors.
$main::prob_try="";
1;