[LON-CAPA-users] Referencing data from one problem in another

Mills, Douglas G dmills at illinois.edu
Wed Apr 18 07:22:13 EDT 2012


Thank you Stuart. Very helpful. Our use case is collecting experimental data during a lab in one problem and then processing it in a postlab in a second problem. We had considered a multiparty problem but think we'll have finer grained control over separate problems if we want to control their availability to specific timeslots for example.

In the set I'm currently working on I've for the moment at least taken to generating random data if the student-entered data is missing-- at least for testing in the construction space, but it may also be a strategy we will consider for handling students who miss their labs but should still do the post-lab.

Thank you Stuart!


Doug

-sent from mobile-

On Apr 17, 2012, at 10:25 PM, "Stuart Raeburn" <raeburn at msu.edu> wrote:

> Doug,
> 
> One thing to keep in mind when creating problems which use information from a different problem is the impact on re-usability.
> 
> If you require paired problems to operate together in a course in such a way that one problem requires data from another problem, it would be good coding practice to test for the existence of the other problem, and to alert the user (e.g., via an <instructorcomment>) if the other problem is not present in the course.
> 
> Another thing to bear in mind is that such problems will show degraded behavior when previewing and testing in Construction Space, and instead need to be published and imported into a course for the full capabilities to be seen.
> 
> That is not too much of an inconvenience, given (a) access to a test course, and (b) the availability of the "Edit resource" function for an item in a course, for which the corresponding Construction Space is housed on the server hosting your current session.
> 
> One question I have is what is your particular use case where separate problems are preferred to a multi-part problem?
> 
> Anyway, the technique you identify -- defining mapalias(es) for the problem(s) in a published sequence file, and importing the published sequence into a course, is the strategy to use here.
> 
> You will, however, be restricted in the data to which you have access between problems. You should be able to retrieve preserved data (i.e., data stored for a particular problem -- including a student's submission), but you will not have access to perl variables in a different problem.  That restriction occurs because of the way LON-CAPA carries out its randomization - this occurs during the process of rendering a problem.
> 
> Future LON-CAPA versions will store the randomseed as part of the stored submission history, which could provide a means to re-construct perl variables used in one problem, when rendering a different problem, as long as the student has made at least one submission in the first problem.  Shared script blocks in published library files would be a way to take advantage of that.
> 
> However, for now, you'll be restricted to the data currently available from the stored submission record, which includes things such as submission, award, solved etc., accessed via an &EXT() call, as shown in /res/msu/albertel/test/ext_examples.library etc., when browsing resource space.
> 
> ******
> 
> As a proof of concept the following pair of problems within a published sequence, use an &EXT() call in the second problem to access the submission from the first problem to determine what the correct answer will be for the second problem.
> 
> ***********
> 
> p1.problem (mapalias = first)
> 
> ***********
> 
> <problem>
> <script type="loncapa/perl">
> $a = &random(0,5,0.1);
> $b = &random(3,12,0.1);
> $c = $a + $b;</script>
> <startouttext />What is $a + $b?
> <endouttext />
> <numericalresponse answer="$c" id="11">
>    <responseparam name="tol" type="tolerance" default="0.01%" description="Numerical Tolerance" />
> 
>    <textline readonly="no" />
> </numericalresponse>
> </problem>
> 
> ***********
> 
> p2.problem (mapalias = second)
> 
> ***********
> 
> 
> <problem>
> <script type="loncapa/perl">
> $othersub = &EXT('user.resource.resource.0.11.submission','first');
> if ($othersub eq '') {
>    $othersub = 0;
> }
> $answer = 2.0*$othersub;
> </script>
> <startouttext />What is double the last number you entered for the previous question?<br />
> <endouttext />
> <numericalresponse answer="$answer" id="11">
>    <responseparam name="tol" type="tolerance" default="0.01%" description="Numerical Tolerance" />
>    <textline readonly="no" />
> </numericalresponse>
> </problem>
> 
> **********
> 
> published sequence (with mapaliases)
> 
> **********
> 
> 
> <map>
> <param to="1" value="first" name="parameter_0_mapalias" type="string" />
> <param to="2" value="second" name="parameter_0_mapalias" type="string" />
> <resource src="/res/raeburn/stuart/paired/p1.problem" id="1" type="start" title="First One" />
> <resource src="/res/raeburn/stuart/paired/p2.problem" id="2" type="finish" title="Last One" />
> <link to="2" index="1" from="1" />
> </map>
> 
> *******
> 
> If you import the published sequence into a course (having set appropriate domain and username in the src attributes in the map), you will find that p2.problem will access the submission from p1.problem.
> 
> If you take a look at the EXT subroutine in lonnet.pm (e.g., see:
> http://source.loncapa.org/cgi-bin/cvsweb.cgi/loncom/lonnet/perl/lonnet.pm?rev=1.1164;content-type=text%2Fplain)
> 
> you will see this block of code:
> 
>    if ($realm eq 'user') {
> # --------------------------------------------------------------- user.resource
>        if ($space eq 'resource') {
>            if ( (defined($Apache::lonhomework::parsing_a_problem)
>                  || defined($Apache::lonhomework::parsing_a_task))
>                 &&
>                 ($symbparm eq &symbread()) ) {
>                # if we are in the middle of processing the resource the
>                # get the value we are planning on committing
>                if (defined($Apache::lonhomework::results{$qualifierrest})) {
>                    return $Apache::lonhomework::results{$qualifierrest};
>                } else {
>                    return $Apache::lonhomework::history{$qualifierrest};
>                }
>            } else {
>                my %restored;
>                if ($publicuser || $env{'request.state'} eq 'construct') {
>                    %restored=&tmprestore($symbparm,$courseid,$udom,$uname);
>                } else {
>                    %restored=&restore($symbparm,$courseid,$udom,$uname);
>                }
>                return $restored{$qualifierrest};
>            }
> 
> The key item here is this test:
> 
> ($symbparm eq &symbread())
> 
> which compares the unique resource instance identifier (the "symb") of the item you are asking about -- which will have been interpolated from the mapalias argument in your &EXT() call -- with the value of symbread, which is the "symb" for the problem currently being rendered.
> 
> If they are different, which is the case you are asking about, the data available come from:
> 
> %restored=&restore($symbparm,$courseid,$udom,$uname);
> 
> which is a call to restore the record for the non-current "symb" in course: $courseid for user $uname:$udom.
> 
> 
> Stuart
> 
> Stuart Raeburn
> MSU LON-CAPA group
> 
> 
> Quoting "Mills, Douglas G" <dmills at illinois.edu>:
> 
>> Following up on the question below, I know that you can use &EXT  functions inside a Conditional statement in a sequence, for example,  to access information from within one of the problems in the  sequence via that problem's mapalias. I'm experimenting to see if  that works also between two problems in a course if one of them has  a mapalias set up, etc.  It appears that this does not work, unless  perhaps I'm not doing it right...  Any tips on the boundaries that  an &EXT function can cross vs. those it cannot, or guidance in its  use or documentation besides
>> 
>> https://s10.lite.msu.edu/res/msu/albertel/test/ext_examples.problem#0
>> 
>> Thank you!
>> 
>> Doug
>> 
>> 
>> On 4/12/12 3:29 PM, "Douglas Mills" <dmills at ad.uiuc.edu> wrote:
>> 
>> Hi All,
>> 
>> I know this can be done between parts in a multipart problem, but is  it also possible to reference student input or other PERL variables  in one problem from a separate problem?  If so, what is the  mechanism for doing so?  Is there an &EXT function that allows that?  Thanks!
>> 
>> Doug
>> 
>> Douglas Mills
>> Director of Instructional Technologies
>> Department of Chemistry
>> University of Illinois
>> dmills at illinois.edu
>> (217) 244-5739
> 
> 
> _______________________________________________
> LON-CAPA-users mailing list
> LON-CAPA-users at mail.lon-capa.org
> http://mail.lon-capa.org/mailman/listinfo/lon-capa-users


More information about the LON-CAPA-users mailing list