[LON-CAPA-cvs] cvs: loncom /homework functionplotresponse.pm

www www@source.lon-capa.org
Sun, 07 Nov 2010 12:28:28 -0000


www		Sun Nov  7 12:28:28 2010 EDT

  Modified files:              
    /loncom/homework	functionplotresponse.pm 
  Log:
  * Even simpler is even better
  * Implemented checking properties over a range
  * Left to do:
   - colorful editor for functionplotrule
   - labels for plots that are not bound to coordinates
   - fix second derivative
   - remove debug code
  
  
Index: loncom/homework/functionplotresponse.pm
diff -u loncom/homework/functionplotresponse.pm:1.26 loncom/homework/functionplotresponse.pm:1.27
--- loncom/homework/functionplotresponse.pm:1.26	Sun Nov  7 11:15:37 2010
+++ loncom/homework/functionplotresponse.pm	Sun Nov  7 12:28:28 2010
@@ -1,7 +1,7 @@
 # LearningOnline Network with CAPA
 # option list style responses
 #
-# $Id: functionplotresponse.pm,v 1.26 2010/11/07 11:15:37 www Exp $
+# $Id: functionplotresponse.pm,v 1.27 2010/11/07 12:28:28 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -557,42 +557,6 @@
 }
 
 #
-# Actual x-value of array index
-#
-
-sub index_x {
-   my ($xmin,$xmax,$i)=@_;
-   return $i*($xmax-$xmin)/400.+$xmin;
-}
-
-#
-# Function value
-#
-
-sub func_val {
-   my ($xmin,$xmax,$x)=@_;
-   return $Apache::functionplotresponse::func[&array_index($xmin,$xmax,$x)];
-}
-
-#
-# First derivative
-#
-
-sub dfuncdx_val {
-   my ($xmin,$xmax,$x)=@_;
-   return $Apache::functionplotresponse::dfuncdx[&array_index($xmin,$xmax,$x)];
-}
-
-#
-# Second derivative
-#
-
-sub d2funcdx2_val {
-   my ($xmin,$xmax,$x)=@_;
-   return $Apache::functionplotresponse::d2funcdx2[&array_index($xmin,$xmax,$x)];
-}
-
-#
 # Populate the arrays
 #
 
@@ -635,7 +599,7 @@
 # d^2y/dx^2
                    my $d2xdt2=&d2dt2_cubic_hermite($t,@xparms);
                    if ($d2xdt2) {
-                      $Apache::functionplotresponse::d2funcd2x[$xi]=&d2dt2_cubic_hermite($t,@yparms)/$d2xdt2;
+                      $Apache::functionplotresponse::d2funcdx2[$xi]=&d2dt2_cubic_hermite($t,@yparms)/$d2xdt2;
                    }
                 }
             }
@@ -744,6 +708,9 @@
 
 sub compare_rel {
    my ($relationship,$value,$realval,$tol)=@_;
+   
+
+  &Apache::lonnet::logthis("Rel $relationship Val $value RV $realval T $tol");
 # is the real value defined?
    unless (defined($realval)) {
       if ($relationship eq 'eq') {
@@ -802,36 +769,39 @@
    if ($xinitial eq '') {
       $xinitial=0;
    }
-   if ($xfinal ne '') {
-      if ($xinitial>$xfinal) {
-         $xfinal=$xinitial;
-      }
+   if ($xfinal eq '') {
+      $xfinal=$xinitial;
+   }
+   if ($xinitial>$xfinal) {
+       $xfinal=$xinitial;
    }
    &Apache::lonnet::logthis("Init $xinitial Final $xfinal");
-   if (($xfinal eq '') || ($xinitial==$xfinal)) {
-# This is only one point
-        &Apache::lonnet::logthis("One point $xinitial");
-        my $tol;
+   my $tol=$tolfunc;
+   if ($derivative==2) {
+      $tol=$told2fdx2;
+   } elsif ($derivative==1) {
+      $tol=$toldfdx;
+   }
+
+   my $li=&array_index($xmin,$xmax,$xinitial);
+   my $lh=&array_index($xmin,$xmax,$xfinal);
+   for (my $i=$li; $i<=$lh; $i++) {
         my $val;
         if ($derivative==2) {
-           $val=&d2funcdx2_val($xmin,$xmax,$xinitial);
-           $tol=$told2fdx2;
+            &Apache::lonnet::logthis("Second ".
+
+$Apache::functionplotresponse::d2funcdx2[$i-1].'__'.$Apache::functionplotresponse::d2funcdx2[$i].'__'.$Apache::functionplotresponse::d2funcdx2[$i+1]);
+           $val=$Apache::functionplotresponse::d2funcdx2[$i];
         } elsif ($derivative==1) {
-           $val=&dfuncdx_val($xmin,$xmax,$xinitial);
-           $tol=$toldfdx;
+           $val=$Apache::functionplotresponse::dfuncdx[$i];
         } else {
-           $val=&func_val($xmin,$xmax,$xinitial);
-           $tol=$tolfunc;
+           $val=$Apache::functionplotresponse::func[$i];
         }
-        &Apache::lonnet::logthis("Value $value ActVal $val Tol $tol");
-        return &compare_rel($relationship,$value,$val,$tol);
-   } else {
-# This is a range
+        unless (&compare_rel($relationship,$value,$val,$tol)) { return 0; };
    }
-   return 0;
+   return 1;
 }
 
-
 sub end_functionplotresponse {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   &Apache::response::end_response;
@@ -846,7 +816,7 @@
          && &Apache::response::submitted()
          && $Apache::lonhomework::type eq 'exam') {
 
-        #&Apache::response::scored_response($partid,$id);
+        &Apache::response::scored_response($partid,$id);
 
     } elsif ($target eq 'grade'
          && &Apache::response::submitted()
@@ -865,7 +835,11 @@
         $ymin=(defined($ymin)?$ymin:-10);
         my $ymax=&Apache::lonxml::get_param('ymax',$parstack,$safeeval);
         $ymax=(defined($ymax)?$ymax:10);
-        my $tolfunc=5.*($ymax-$ymin)/100.;
+
+        my $percent=&Apache::lonxml::get_param('percenterror',$parstack,$safeeval);
+        $percent=(defined($percent)?$percent:5);
+
+        my $tolfunc=$percent*($ymax-$ymin)/100.;
         my $toldfdx=1;
         my $told2fdx2=1;
         if ($xmax>$xmin) {