Increasing reward with progressive ratio program
MEDState Notation Repository › Forums › Coding Help Archive › Increasing reward with progressive ratio program
- This topic has 8 replies, 1 voice, and was last updated 8 years, 9 months ago by
Med_Support.
-
AuthorPosts
-
March 5, 2015 at 11:25 am #12534
Med_Support
ModeratorIan
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!
March 5, 2015 at 12:56 pm #12536Med_Support
ModeratorGary 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
March 6, 2015 at 10:15 am #12538Med_Support
ModeratorIan
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!
March 6, 2015 at 11:08 am #12541Med_Support
ModeratorGary 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
March 11, 2015 at 12:18 pm #12544Med_Support
ModeratorIan
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
March 11, 2015 at 12:53 pm #12546Med_Support
ModeratorGary 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
March 12, 2015 at 9:52 am #12548Med_Support
ModeratorIan
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
March 12, 2015 at 10:40 am #12550Med_Support
ModeratorGary 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) = 5We 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.
GaryMarch 13, 2015 at 12:21 pm #12552Med_Support
ModeratorIan
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
-
AuthorPosts
- You must be logged in to reply to this topic.