Increasing reward with progressive ratio program

MEDState Notation Repository Forums Coding Help Archive Increasing reward with progressive ratio program

Viewing 9 posts - 1 through 9 (of 9 total)
  • Author
    Posts
  • #12534
    Med_Support
    Moderator
    Ian

    I hope that this is a simple question – I’m only just getting started in the field and hoped that someone can help me.

    I’m currently trying to run ProgressiveRatio_v2.mpc form the repository. The program works pretty well, but I’m struggling to dispense multiple pellets as 1 reward. Increasing the reward time doesn’t seem to help at all! Am I missing something simple or do I need a second pulse to active the pellet dispenser a second time?

    Thanks for any help that you can give!

    #12536
    Med_Support
    Moderator
    Gary Bamberger

    Hi Ian,

    Here is some sample code that shows how to dispense more than one pellet:

    \ Outputs
    ^Pellet = 3
    
    
    
    \ A() = Control Variable with Assigned Aliases as Defined
    Var_Alias Number of Pellets to Dispense = A(0)  \ Default = 2
    
    
    
    \ Z-Pulses Used in this Program
    ^Z_Reward = 1  \ Z1  = Signal Reward
    
    
    
    \***************************************************
    \             PELLET DISPENSER CONTROL
    \***************************************************
    S.S.2,
    S1,
      0.01": SET A(0) = 2 ---> S2
    
    S2,     \ Wait for Reinforcement Signal
      #Z^Z_Reward: ON ^Pellet; ADD P ---> S3
    
    S3,     \ Check if delivered desired Number of Pellets
      0.05": OFF ^Pellet;
             IF P >= A(0) [@Done, @More]
                @Done: SET P = 0 ---> S2
                @More: ---> S4
    
    S4,     \ Must wait a certain amount of time before
            \ trying to dispense the next pellet.  This
            \ delay can be shortened for some Pellet
            \ Dispensers.
      0.5" ON ^Pellet; ADD P ---> S3
    
    #12538
    Med_Support
    Moderator
    Ian

    Thanks Gary!

    I have read and understood the code you wrote posted.  Thank you for doing so!  I added your code into the progressive ratio program, changing A(0) to A(6), S.S.2 to S.S.5, and variable P to N (as these were already in use by the ProgressiveRatio_v2.mpc program).  However, when I run this through Trans IV, I get the following error message:

    ERROR # 8
     0.5"ON^Pellet;ADDN--->S3
     Offending test: "and/or ON^Pellet, ADDN
     Illegal input statement - ! may be missing

    I’ve tinkered with a few things, but have been unable to get past this error.  Do you know if it’s down to something I changed?

    Once again, thank you for any help that you’re able to give!

    #12541
    Med_Support
    Moderator
    Gary Bamberger

    Hi Ian,

    I have to apologize, but there was a bug in my sample code.

     

    S4, \ Must wait a certain amount of time before
     \ trying to dispense the next pellet. This
     \ delay can be shortened for some Pellet
     \ Dispensers.
     0.5" ON ^Pellet; ADD N ---> S3

     

    There is a colon missing after the 0.5″. The following will compile.

     

    S4, \ Must wait a certain amount of time before
     \ trying to dispense the next pellet. This
     \ delay can be shortened for some Pellet
     \ Dispensers.
     0.5": ON ^Pellet; ADD N ---> S3

     

    Remember that this new State Set is replacing S.S.3 in your existing code. You don’t want both State Sets trying to dispense a pellet.

    Gary

    #12544
    Med_Support
    Moderator
    Ian

    Hi Gary,

    Thanks again for your continued help! I have included your changes, and also included a Z^Z_EndReward term to interface appropriately with the rest of the program. Unfortunately, I seem to get 5 pellets every time, and setting A(6) to a different value has no impact. Do you know what this could be? Once again, I really value the help you’re giving me!

    \***************************************************
    \ REWARD CONTROL TIMER
    \***************************************************
    S.S.3,
    S1,
     0.01": SET A(6) = 2 ---> S2
    
    S2, \ Wait for Reinforcement Signal
     #Z^Z_Reward: ON ^Pellet; ADD N ---> S3
    
    
    S3, \ Check if delivered desired Number of Pellets
     0.05": OFF ^Pellet;
     IF N >= A(6) [@Done, @More]
     @Done: SET N = 0; Z^Z_EndReward ---> S2
     @More: ---> S4
    
    S4, \ Must wait a certain amount of time before
     \ trying to dispense the next pellet. This
     \ delay can be shortened for some Pellet
     \ Dispensers.
     0.5": ON ^Pellet; ADD N ---> S3
    #12546
    Med_Support
    Moderator
    Gary Bamberger

    I’m going to need to see the entire program as you currently have it written in order to try and find out why it is not working for you.

    Gary

    #12548
    Med_Support
    Moderator
    Ian

    Hi Gary. Thanks for your response. Here’s the entire program:

    \ Copyright (c) 2013 MEDState Notation Repository, All rights reserved.
    
    \ ProgressiveRatio_v2.mpc
    \
    \ When the program is started it will turn on the HouseLight and the lights over
    \ both Levers, and the current PR Value will be set to the first value drawn in
    \ order from List Z. The program will then wait for the Animal to respond on
    \ the Correct Lever enough times to meet the current PR Value.
    \
    \ When the current PR Value has been met the program will turn on the Reward
    \ Device for the Reward Time. At the end of the Reward Time the program will
    \ time the Time Out Following Reward.
    \
    \ When the Time Out Following Reward has been completed the program set the
    \ current PR Value to the next value drawn in order from List Z.
    \
    \ The program will then once again wait for the Animal to respond on the Correct
    \ Lever enough times to meet the current PR Value.
    \
    \ Responses on the Incorrect Lever will be recorded, but have no adverse affect.
    \
    \ The program will end when the Session Length has been reached.
    
    \ Inputs
    ^LeftLever = 1
    ^RightLever = 2
    
    \ Outputs
    ^Pellet = 3
    ^Dipper = 3 \ If both Pellet and Dipper are ordered
     \ It will be necessary to change one of these
    ^LeftLight = 4
    ^RightLight = 5
    ^HouseLight = 7
    ^Pump = 8
    
    
    
    \ A() = Control Variables with Assigned Aliases as Defined
    Var_Alias Session Length (min) = A(0) \ Default = 10 minutes
    Var_Alias Correct Lever (1=Left 2=Right) = A(1) \ Default = 1-Left
    Var_Alias Reward Device (1=Pellet 2=Dipper 3=Pump) = A(2) \ Default = 1-Pellet
    Var_Alias Reward Time (sec) = A(3) \ Default = 0.05 seconds
    Var_Alias Time Out Following Reward (sec) = A(4) \ Default = 0 seconds
    Var_Alias SoftCR Data Array (1=Yes 0=No) = A(5) \ Default = 1-Yes
    Var_Alias Number of Pellets to Dispense = A(6) \ Default = 2
    
    ^Session = 0
    ^CorrectLev = 1
    ^RewardDevice = 2
    ^RewardTime = 3
    ^TimeOut = 4
    ^SoftCR = 5
    ^RewardTicks = 6
    ^TimeOutTicks = 7
    
    
    
    \ List Data Variables Here
    \ B() = Response Counts
    \ B(0) = Total Responses
    \ B(1) = Total Correct Response Count
    \ B(2) = Total Incorrect Response Count
    \ B(3) = Total Rewards
    \ B(4) = % Correct
    \ B(5) = % Incorrect
    \ B(6) = Last PR Value that was Met
    
    
    
    \ List Working Variables Here
    \ I = Subscript for the IRT Array C
    \ N = Counter to count how many pellets have been dispensed this reward.
    \ P = Current PR Value
    \ R = Ratio Response Counter
    \ S = Elapsed Time in Session
    \ X = Subscript for Progressive Ratio List Z
    \ Z() = Progressive Ratio Default List
    
    
    
    DIM A = 7
    DIM B = 6
    
    LIST Z = 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20,
     22, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88,
     96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184, 192, 200,
     208, 216, 224, 232, 240, 248, 256, 264, 272, 280, 288, 296, 304, 312,
     320, 328, 336, 344, 352, 360, 368, 376, 384, 392, 400, 408, 416, 424,
     432, 440, 448, 456, 464
    
    
    
    \ Z-Pulses Used in this Program
    ^Z_Pellet = 1 \ Signal Pellet Reinforcement
    ^Z_Dipper = 2 \ Signal Dipper Reinforcement
    ^Z_Pump = 3 \ Signal Pump Reinforcement
    ^Z_EndReward = 4 \ Signal End of Reward
    ^Z_End = 32 \ Signal End of Session
    ^Z_Reward = 1 \ Z1 = Signal Reward
    
    
    
    \***************************************************
    \ Progressive Ratio Schedule
    \ S1 - Set Default Values
    \ Session Length (10 minutes)
    \ Correct Lever (1-Left)
    \ Reward Device (1-Pellet)
    \ Reward Time (0.05 seconds)
    \ Time Out Following Reward (0 seconds)
    \ SoftCR Data Array (1-Yes)
    \***************************************************
    S.S.1,
    S1,
     0.01": SET A(^Session) = 10, A(^CorrectLev) = 2, A(^RewardDevice) = 1; 
     SET A(^RewardTime) = 0.05, A(^TimeOut) = 0, A(^SoftCR) = 1 ---> S2
    
    S2, \ First Statement: Wait for START signal, turn HouseLight ON
     \ and turn associated stimulus ON.
     \
     \ Second Statement: Update screen display with default values
     \ for Control Variables. This will show any changes made via
     \ the "Configure | Change Variables" Window prior to START.
     #START: CLEAR 1,200;
     SET A(^RewardTicks) = A(^RewardTime) * 1";
     SET A(^TimeOutTicks) = A(^TimeOut) * 1";
     ON ^HouseLight, ^LeftLight, ^RightLight;
     SHOW 1,Session,S/60 ---> S3
     1": SHOW 1,Session Length,A(^Session), 2,Correct Lever,A(^CorrectLev), 3,Reward Device,A(^RewardDevice);
     SHOW 4,Reward Time,A(^RewardTime), 5,Time Out,A(^TimeOut), 6,SoftCR Code,A(^SoftCR) ---> SX
    
    S3, \ Time Session Length
     0.01": SET S = S + 0.01;
     SHOW 1,Session,S/60;
     IF S/60 >= A(^Session) [@EndSession, @ContinueTiming]
     @End: Z^Z_End ---> S4
     @Cont: ---> SX
    
    S4, \ Wait for Screen Update and end with
     \ STOPABORTFLUSH for Automatic Data Saving
     2": ---> STOPABORTFLUSH
    
    
    
    \***************************************************
    \ MAIN PROGRAM
    \***************************************************
    S.S.2,
    S1, \ Draw first Progressive Ratio from List Z
     #START: LIST P = Z(X) ---> S2
    
    S2, \ Test for Correct Lever
     #RA(^CorrectLev): ADD B(0), B(1), R;
     IF R >= P [@PR_Value_Met, @False]
     @PR_Met: ADD B(3);
     SET B(6) = P, R = 0;
     ZA(^RewardDevice) ---> S3
     @False: ---> SX
     #R^LeftLever: ADD B(0), B(2) ---> SX
     #R^RightLever: ADD B(0), B(2) ---> SX
     #Z^Z_End: ---> S5
    
    S3, \ Wait for End of Reward Signal
     #Z^Z_End: ---> S5
     #Z^Z_EndReward: ---> S4
    
    S4, \ Time Out Interval Following Reward
     \ Update Progressive Ratio P from LIST Z
     A(^TimeOutTicks)#T: LIST P = Z(X) ---> S2
     #Z^Z_End: ---> S5
    
    S5, \ End of Session - Turn Lights Off
     \ Calculate % Correct and % Incorrect
     0.01": OFF ^HouseLight, ^LeftLight, ^RightLight;
     IF B(0) = 0 [@NoCalc, @Calculate]
     @NoCalc: ---> S6
     @Calculate: SET B(4) = B(1) / B(0) * 100;
     SET B(5) = B(2) / B(0) * 100;
     SHOW 7,% Correct,B(4), 8,% Incorrect,B(5), 10,Last PR Met,B(6) ---> S6
    
    S6, \ Holding State at End of Session
     1': ---> SX
    
    
    
    \***************************************************
    \ REWARD CONTROL TIMER
    \***************************************************
    S.S.3,
    S1,
     0.01": SET A(6) = 2 ---> S2
    
    S2, \ Wait for Reinforcement Signal
     #Z^Z_Reward: ON ^Pellet; ADD N ---> S3
    
    
    S3, \ Check if delivered desired Number of Pellets
     0.15": OFF ^Pellet;
     IF N >= A(6) [@Done, @More]
     @Done: SET N = 0; Z^Z_EndReward ---> S2
     @More: ---> S4
    
    S4, \ Must wait a certain amount of time before
     \ trying to dispense the next pellet. This
     \ delay can be shortened for some Pellet
     \ Dispensers.
     0.15": ON ^Pellet; ADD N ---> S3
    
    
    
    \***************************************************
    \ UPDATE DISPLAY
    \***************************************************
    S.S.4,
    S1,
     #START: SHOW 2,Correct Rsp,B(1), 3,Incorrect Rsp,B(2), 4,Rewards,B(3), 5,PR Value,P ---> S2
    
    S2,
     1": SHOW 2,Correct Rsp,B(1), 3,Incorrect Rsp,B(2), 4,Rewards,B(3), 5,PR Value,P ---> S2

     

     

    #12550
    Med_Support
    Moderator
    Gary Bamberger

    Hi Ian,

    The problem is that A(6) is pulling double duty:

    ^RewardTime  = 3
    ^RewardTicks = 6
    
    S2,
      #START: CLEAR 1,200;
              SET A(^RewardTicks) = A(^RewardTime) * 1";
    
    The Reward Time is 0.05 when multiplied by 1" the Reward Ticks becomes 5.
    
      SET A(6) = A(3) * 1"
      SET A(6) = 0.05 * 100
      SET A(6) = 5
    
    

    We need to modify the code so that it is using a variable that is available:

    Var_Alias Number of Pellets to Dispense = A(8)  \ Default = 2
    
    DIM A = 8
    
    
    S.S.3,
    S1,
      0.01": SET A(8) = 2 ---> S2
    
    S2,     \ Wait for Reinforcement Signal
      #Z^Z_Reward: ON ^Pellet; ADD N ---> S3
    
    
    S3,     \ Check if delivered desired Number of Pellets
      0.15": OFF ^Pellet;
             IF N >= A(8) [@Done, @More]

    I hope that this information helps.
    Gary

    #12552
    Med_Support
    Moderator
    Ian

    Hi Gary,

    I really appreciate your help. The program is now working exactly as I wanted, and you’ve helped me understand a lot more about MedState notation in the process. Thank you for all your help! 🙂

    Ian

Viewing 9 posts - 1 through 9 (of 9 total)
  • You must be logged in to reply to this topic.