version 1.34, 2010/11/11 15:57:49
|
version 1.35, 2010/11/12 02:16:20
|
Line 376 sub start_functionplotrule {
|
Line 376 sub start_functionplotrule {
|
&Apache::lonxml::warning(&mt('Rule relationship not defined.')); |
&Apache::lonxml::warning(&mt('Rule relationship not defined.')); |
$relationship='eq'; |
$relationship='eq'; |
} |
} |
my $derivative=&Apache::lonxml::get_param('derivative',$parstack,$safeeval); |
my $derivative=&Apache::lonxml::get_param('derivativeorder',$parstack,$safeeval); |
unless (($derivative==0) || ($derivative==1) || ($derivative==2)) { |
unless (($derivative==0) || ($derivative==1) || ($derivative==2)) { |
&Apache::lonxml::warning(&mt('Rule derivative not defined.')); |
&Apache::lonxml::warning(&mt('Rule derivative not defined.')); |
$derivative=0; |
$derivative=0; |
Line 388 sub start_functionplotrule {
|
Line 388 sub start_functionplotrule {
|
$beginninglabel, |
$beginninglabel, |
&Apache::lonxml::get_param('xfinal',$parstack,$safeeval), |
&Apache::lonxml::get_param('xfinal',$parstack,$safeeval), |
$endinglabel, |
$endinglabel, |
|
&Apache::lonxml::get_param('minimumlength',$parstack,$safeeval), |
|
&Apache::lonxml::get_param('maximumlength',$parstack,$safeeval), |
$relationship, |
$relationship, |
&Apache::lonxml::get_param('value',$parstack,$safeeval), |
&Apache::lonxml::get_param('value',$parstack,$safeeval), |
&Apache::lonxml::get_param('percenterror',$parstack,$safeeval) |
&Apache::lonxml::get_param('percenterror',$parstack,$safeeval) |
Line 396 sub start_functionplotrule {
|
Line 398 sub start_functionplotrule {
|
$result=&Apache::edit::tag_start($target,$token,'Function Plot Evaluation Rule'). |
$result=&Apache::edit::tag_start($target,$token,'Function Plot Evaluation Rule'). |
&Apache::edit::text_arg('Index:','index', |
&Apache::edit::text_arg('Index:','index', |
$token,'4').' '. |
$token,'4').' '. |
&Apache::edit::select_arg(&mt('Function:'),'derivative', |
&Apache::edit::select_arg(&mt('Function:'),'derivativeorder', |
[['0','Function itself'], |
[['0','Function itself'], |
['1','First derivative'], |
['1','First derivative'], |
['2','Second derivative']],$token).'<br />'. |
['2','Second derivative']],$token).'<br />'. |
|
|
&Apache::edit::text_arg('(Initial) x-value:','xinitial', |
&Apache::edit::text_arg('(Initial) x-value:','xinitial', |
$token,'4'). |
$token,'8'). |
&Apache::edit::select_or_text_arg('(Initial) x-value label:','xinitiallabel', |
&Apache::edit::select_or_text_arg('(Initial) x-value label:','xinitiallabel', |
[['start','Start of Plot']],$token,'8').'<br />'. |
[['start','Start of Plot']],$token,'8').'<br />'. |
|
|
&Apache::edit::text_arg('Optional final x-value for ranges:','xfinal', |
&Apache::edit::text_arg('Optional final x-value for ranges:','xfinal', |
$token,'4'). |
$token,'8'). |
&Apache::edit::select_or_text_arg('Optional final x-value label:','xfinallabel', |
&Apache::edit::select_or_text_arg('Optional final x-value label:','xfinallabel', |
[['end','End of Plot']],$token,'8').'<br />'. |
[['end','End of Plot']],$token,'8').'<br />'. |
|
&Apache::edit::text_arg('Optional minimum length for range:','minimumlength', |
|
$token,'8'). |
|
&Apache::edit::text_arg('Optional maximum length for range:','maximumlength', |
|
$token,'8').'<br />'. |
&Apache::edit::select_arg(&mt('Relationship:'),'relationship', |
&Apache::edit::select_arg(&mt('Relationship:'),'relationship', |
[['eq','equal'], |
[['eq','equal'], |
['ne','not equal'], |
['ne','not equal'], |
Line 419 sub start_functionplotrule {
|
Line 423 sub start_functionplotrule {
|
['lt','less than'], |
['lt','less than'], |
['le','less than or equal']],$token). |
['le','less than or equal']],$token). |
$result.= &Apache::edit::select_or_text_arg('Value:','value', |
$result.= &Apache::edit::select_or_text_arg('Value:','value', |
[['undef','not defined']],$token,'4'). |
[['undef','not defined']],$token,'8'). |
&Apache::edit::text_arg('Percent error:','percenterror', |
&Apache::edit::text_arg('Percent error:','percenterror', |
$token,'4'). |
$token,'8'). |
&Apache::edit::end_row(); |
&Apache::edit::end_row(); |
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
my $constructtag=&Apache::edit::get_new_args($token,$parstack, |
my $constructtag=&Apache::edit::get_new_args($token,$parstack, |
$safeeval,'index','derivative','xinitial','xinitiallabel','xfinal','xfinallabel','relationship', |
$safeeval,'index','derivativeorder', |
'value','percenterror'); |
'xinitial','xinitiallabel','xfinal','xfinallabel', |
|
'minimumlength','maximumlength', |
|
'relationship','value','percenterror'); |
if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); } |
if ($constructtag) { $result=&Apache::edit::rebuild_tag($token); } |
} |
} |
return $result; |
return $result; |
Line 597 sub array_index {
|
Line 603 sub array_index {
|
sub populate_arrays { |
sub populate_arrays { |
my ($id,$xmin,$xmax)=@_; |
my ($id,$xmin,$xmax)=@_; |
for (my $i=0; $i<=400; $i++) { |
for (my $i=0; $i<=400; $i++) { |
|
$Apache::functionplotresponse::actualxval[$i]=undef; |
$Apache::functionplotresponse::func[$i]=undef; |
$Apache::functionplotresponse::func[$i]=undef; |
$Apache::functionplotresponse::dfuncdx[$i]=undef; |
$Apache::functionplotresponse::dfuncdx[$i]=undef; |
$Apache::functionplotresponse::d2funcd2x[$i]=undef; |
$Apache::functionplotresponse::d2funcd2x[$i]=undef; |
Line 618 sub populate_arrays {
|
Line 625 sub populate_arrays {
|
$env{'form.HWVAL_'.$id.'_'.$label.'S'.$ni.'_y'}); |
$env{'form.HWVAL_'.$id.'_'.$label.'S'.$ni.'_y'}); |
# Run in small steps over spline parameter |
# Run in small steps over spline parameter |
for (my $t=0; $t<=1; $t+=0.0001) { |
for (my $t=0; $t<=1; $t+=0.0001) { |
my $xi=&array_index($xmin,$xmax,&cubic_hermite($t,@xparms)); |
my $xreal=&cubic_hermite($t,@xparms); |
|
my $xi=&array_index($xmin,$xmax,$xreal); |
if ($xi<$xiold) { return 'no_func'; } |
if ($xi<$xiold) { return 'no_func'; } |
if (($xi>$xiold) && ($xi>=0) && ($xi<=400)) { |
if (($xi>$xiold) && ($xi>=0) && ($xi<=400)) { |
if (defined($Apache::functionplotresponse::func[$xi])) { return 'no_func'; } |
if (defined($Apache::functionplotresponse::func[$xi])) { return 'no_func'; } |
$xiold=$xi; |
$xiold=$xi; |
|
$Apache::functionplotresponse::actualxval[$xi]=$xreal; |
# Function value |
# Function value |
my $funcval=&cubic_hermite($t,@yparms); |
my $funcval=&cubic_hermite($t,@yparms); |
$Apache::functionplotresponse::func[$xi]=$funcval; |
$Apache::functionplotresponse::func[$xi]=$funcval; |
Line 745 sub start_functionplotresponse {
|
Line 754 sub start_functionplotresponse {
|
$result.=&axes_script($internalid,$xmin,$xmax,$ymin,$ymax,$xaxisvisible,$yaxisvisible,$gridvisible); |
$result.=&axes_script($internalid,$xmin,$xmax,$ymin,$ymax,$xaxisvisible,$yaxisvisible,$gridvisible); |
$result.=&axes_label($internalid,$xlabel,$ylabel); |
$result.=&axes_label($internalid,$xlabel,$ylabel); |
# init script is left open |
# init script is left open |
} |
} elsif (($target eq 'answer') && |
|
($env{'form.answer_output_mode'} ne 'tex') && |
|
($Apache::lonhomework::viewgrades == 'F')) { |
|
my (undef,undef,$udom,$uname)=&Apache::lonnet::whichuser(); |
|
my $windowopen=&Apache::lonhtmlcommon::javascript_docopen(); |
|
my $start_page = &Apache::loncommon::start_page('Rules Log', undef, |
|
{'only_body' => 1, |
|
'bgcolor' => '#FFFFFF', |
|
'js_ready' => 1,}); |
|
my $end_page = &Apache::loncommon::end_page({'js_ready' => 1,}); |
|
$uname =~s/\W//g; |
|
$udom =~s/\W//g; |
|
my $function_name = |
|
join('_','LONCAPA_scriptvars',$uname,$udom, |
|
$env{'form.counter'},$Apache::lonxml::curdepth); |
|
my $rules_var ="<script type=\"text/javascript\"> |
|
// <![CDATA[ |
|
function $function_name() {newWindow=open('','new_W','width=500,height=500,scrollbars=1,resizable=yes');newWindow.$windowopen;newWindow.document.writeln('$start_page<pre>". |
|
$Apache::functionplotresponse::ruleslog. |
|
"<\\/pre>$end_page');newWindow.document.close();newWindow.focus()} |
|
// ]]> |
|
</script><a href=\"javascript:$function_name();void(0);\">".&mt('Rules Log')."</a><br />"; |
|
&Apache::lonxml::add_script_result($rules_var); |
|
} |
|
|
return $result; |
return $result; |
} |
} |
|
|
Line 787 sub compare_rel {
|
Line 820 sub compare_rel {
|
return 0; |
return 0; |
} |
} |
|
|
|
sub addlog { |
|
my ($text)=@_; |
|
$Apache::functionplotresponse::ruleslog.=$text.'<br />'; |
|
} |
|
|
|
sub actualval { |
|
my ($i,$xmin,$xmax)=@_; |
|
return $xmin+$i/400.*($xmax-$xmin); |
|
} |
|
|
sub functionplotrulecheck { |
sub functionplotrulecheck { |
my ($rule,$xmin,$xmax,$ymin,$ymax)=@_; |
my ($rule,$xmin,$xmax,$ymin,$ymax)=@_; |
|
|
# &Apache::lonnet::logthis("Rule $rule $xmin $xmax $ymin $ymax"); |
my ($label,$derivative,$xinitial,$xinitiallabel,$xfinal,$xfinallabel,$minimumlength,$maximumlength,$relationship,$value,$percent) |
|
|
my ($label,$derivative,$xinitial,$xinitiallabel,$xfinal,$xfinallabel,$relationship,$value,$percent) |
|
=split(/\:/,$rule); |
=split(/\:/,$rule); |
$percent=($percent>0?$percent:5); |
$percent=($percent>0?$percent:5); |
|
&addlog("================="); |
|
&addlog("Rule $label for ".('function itself','first derivative','second derivative')[$derivative]." $relationship $value"); |
my $li=0; |
my $li=0; |
my $lh=400; |
my $lh=400; |
|
|
Line 821 sub functionplotrulecheck {
|
Line 863 sub functionplotrulecheck {
|
} |
} |
# if the label is defined, use it |
# if the label is defined, use it |
if (defined($Apache::functionplotresponse::functionplotrulelabels{$xinitiallabel})) { |
if (defined($Apache::functionplotresponse::functionplotrulelabels{$xinitiallabel})) { |
|
&addlog("Using lower label $xinitiallabel"); |
$li=$Apache::functionplotresponse::functionplotrulelabels{$xinitiallabel}; |
$li=$Apache::functionplotresponse::functionplotrulelabels{$xinitiallabel}; |
} else { |
} else { |
$li=&array_index($xmin,$xmax,$xinitial); |
$li=&array_index($xmin,$xmax,$xinitial); |
} |
} |
unless ($findupper) { |
unless ($findupper) { |
if (defined($Apache::functionplotresponse::functionplotrulelabels{$xfinallabel})) { |
if (defined($Apache::functionplotresponse::functionplotrulelabels{$xfinallabel})) { |
|
&addlog("Using upper label $xfinallabel"); |
$lh=$Apache::functionplotresponse::functionplotrulelabels{$xfinallabel}-1; |
$lh=$Apache::functionplotresponse::functionplotrulelabels{$xfinallabel}-1; |
} else { |
} else { |
$lh=&array_index($xmin,$xmax,$xfinal); |
$lh=&array_index($xmin,$xmax,$xfinal); |
Line 839 sub functionplotrulecheck {
|
Line 883 sub functionplotrulecheck {
|
$lh=$li; |
$lh=$li; |
} |
} |
|
|
# &Apache::lonnet::logthis("Init $xinitial=$li Final $xfinal=$lh Findupper: $findupper"); |
&addlog("Boundaries: x=".&actualval($li,$xmin,$xmax)." (".$Apache::functionplotresponse::actualxval[$li]."; index $li)) to x=". |
|
&actualval($lh,$xmin,$xmax)." (".$Apache::functionplotresponse::actualxval[$lh]."; index $lh))"); |
|
if ($findupper) { |
|
&addlog("Looking for label $xfinallabel"); |
|
} |
my $tol=$percent*($ymax-$ymin)/100; |
my $tol=$percent*($ymax-$ymin)/100; |
if ($xmax>$xmin) { |
if ($xmax>$xmin) { |
if ($derivative==2) { |
if ($derivative==2) { |
Line 858 sub functionplotrulecheck {
|
Line 906 sub functionplotrulecheck {
|
$val=$Apache::functionplotresponse::func[$i]; |
$val=$Apache::functionplotresponse::func[$i]; |
} |
} |
unless (&compare_rel($relationship,$value,$val,$tol)) { |
unless (&compare_rel($relationship,$value,$val,$tol)) { |
# &Apache::lonnet::logthis("Condition false $findupper at $i with $val tol:$tol from $value"); |
&addlog("Condition not fulfilled at x=".&actualval($i,$xmin,$xmax)." (".$Apache::functionplotresponse::actualxval[$i]."; index $i)"); |
|
&addlog("Actual value ".(defined($val)?$val:'undef').", expected $value, tolerance $tol"); |
if (($findupper) && ($i>$li)) { |
if (($findupper) && ($i>$li)) { |
|
# check for minimum and maximum lengths |
|
my $length=&actualval($i,$xmin,$xmax)-&actualval($li,$xmin,$xmax); |
|
if ($minimumlength) { |
|
if ($length<$minimumlength) { |
|
&addlog("Rule $label failed, actual length $length, minimum length $minimumlength"); |
|
return 0; |
|
} |
|
} |
|
if ($maximumlength) { |
|
if ($length>$maximumlength) { |
|
&addlog("Rule $label failed, actual length $length, maximum length $maximumlength"); |
|
return 0; |
|
} |
|
} |
$Apache::functionplotresponse::functionplotrulelabels{$xfinallabel}=$i; |
$Apache::functionplotresponse::functionplotrulelabels{$xfinallabel}=$i; |
# &Apache::lonnet::logthis("Setting $xfinallabel to $i"); |
&addlog("Rule $label passed, setting label $xfinallabel"); |
return 1; |
return 1; |
} else { |
} else { |
|
&addlog("Rule $label failed."); |
return 0; |
return 0; |
} |
} |
} |
} |
} |
} |
|
&addlog("Rule $label passed."); |
return 1; |
return 1; |
} |
} |
|
|
Line 907 sub end_functionplotresponse {
|
Line 972 sub end_functionplotresponse {
|
|
|
my $ad=''; |
my $ad=''; |
undef %Apache::functionplotresponse::functionplotrulelabels; |
undef %Apache::functionplotresponse::functionplotrulelabels; |
|
$Apache::functionplotresponse::ruleslog=''; |
$Apache::functionplotresponse::functionplotrulelabels{'start'}=400; |
$Apache::functionplotresponse::functionplotrulelabels{'start'}=400; |
$Apache::functionplotresponse::functionplotrulelabels{'end'}=0; |
$Apache::functionplotresponse::functionplotrulelabels{'end'}=0; |
if (&populate_arrays($internalid,$xmin,$xmax) eq 'no_func') { |
if (&populate_arrays($internalid,$xmin,$xmax) eq 'no_func') { |
$ad='NOT_FUNCTION'; |
$ad='NOT_FUNCTION'; |
} else { |
} else { |
|
&addlog("Start of function ".&actualval($Apache::functionplotresponse::functionplotrulelabels{'start'},$xmin,$xmax)." (index ". |
|
$Apache::functionplotresponse::functionplotrulelabels{'start'}.")"); |
|
&addlog("End of function ".&actualval($Apache::functionplotresponse::functionplotrulelabels{'end'},$xmin,$xmax)." (index ". |
|
$Apache::functionplotresponse::functionplotrulelabels{'end'}.")"); |
|
|
# We have a function that we can actually grade, go through the spline rules. |
# We have a function that we can actually grade, go through the spline rules. |
foreach my $rule (@Apache::functionplotresponse::functionplotrules) { |
foreach my $rule (@Apache::functionplotresponse::functionplotrules) { |
unless (&functionplotrulecheck($rule,$xmin,$xmax,$ymin,$ymax)) { |
unless (&functionplotrulecheck($rule,$xmin,$xmax,$ymin,$ymax)) { |