/*
 *  test_tsodyks_depressing.sli
 *
 *  This file is part of NEST.
 *
 *  Copyright (C) 2004 The NEST Initiative
 *
 *  NEST is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  NEST is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with NEST.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

 /* BeginDocumentation
Name: test_tsodyks_depressing - sli script for overall test tsodyks_synapse synapse model.

Synopsis: (test_tsodyks_depressing) run -> compare cout with comments in file


Description:
Script to test Tsodyks short term plasticity depressing synapses according to
'Neural Networks with Dynamic Synapses'
Misha Tsodyks, Klaus Pawelzik, Henry Markram
Neural computation 10, 821--853 (1998)

reproduces figure 1 A


author:  Markus Diesmann, Moritz Helias
date:	 March 2006

*/

/unittest (7039) require
/unittest using


ResetKernel      % clear all existing network elements


userdict begin

      1 /local_num_threads Set
      8 /total_num_virtual_procs Set
      0.1 /h Set

      /Tau 40.0 def	     % membrane time constant
      /Theta 15.0 def	     % threshold
      /U0 0.0 def	     % reset potential of Vm
      /R 1.0 def
      /C Tau R div def         % Tau [ms] / 1.0 GOhm in NEST units
      /TauR 2.0 def	     % refractory time
      /Tau_psc 3.0 def       % time constant of PSC (=Tau_inact)
      /Tau_rec 800.0 def     % recovery time
      /Tau_fac 0.0 def     % facilitation time
      /U 0.5 def	     % facilitation parameter U
      /A 250.0 def	     % PSC weight in pA
      /f 20.0 1000.0 div def % frequency in Hz given converted to 1/ms

      /Tend 1200.0 def	     % simulation time
      /TIstart 50.0 def      % start time of current
      /TIend 1050.0 def      % end time of current
  
      
      % set resolution and limits on delays
      % limits must be set BEFORE connecting any elements
      0
      <<
        /resolution h
	/local_num_threads local_num_threads
%       /total_num_virtual_procs total_num_virtual_procs
      >> SetStatus

      cout 15 setprecision

      /tsodyks_synapse
      << /tau_psc Tau_psc 
         /tau_rec Tau_rec
	 /tau_fac Tau_fac
	 /U U
	 /delay 0.1
	 /weight A
	 /u 0.0
	 /x 1.0
      >> SetDefaults

      /iaf_tum_2000 Create /neuron1 Set
    
      neuron1 << /tau_m Tau
	         /t_ref_tot TauR
                 /t_ref_abs TauR
		 /tau_syn_ex Tau_psc
		 /tau_syn_in Tau_psc
		 /C_m C
		 /V_reset U0
		 /E_L U0
		 /V_th Theta
                 /V_m U0  
              >> SetStatus
      % neuron1 GetStatus info
      
      /iaf_tum_2000 Create /neuron2 Set

      neuron2 << /tau_m Tau
	         /t_ref_tot TauR
                 /t_ref_abs TauR
		 /tau_syn_ex Tau_psc
		 /tau_syn_in Tau_psc
		 /C_m C
		 /V_reset U0
		 /E_L U0
		 /V_th Theta
                 /V_m U0
              >> SetStatus
    % neuron2 GetStatus info
	      
      /I0 Theta C mul Tau div 1.0 1.0 f div TauR sub Tau div neg exp sub div def
      
      /dc_generator Create /dc_gen Set
      dc_gen << /amplitude I0 /start TIstart /stop TIend >> SetStatus

      /voltmeter Create /vm Set
      vm << /withtime true
	    /to_memory true
	    /interval 25.0
         >> SetStatus

      dc_gen neuron1 Connect

      vm neuron2 Connect

      neuron1 neuron2 /tsodyks_synapse Connect

      Tend Simulate

      % compare results to expected voltage trace
      vm [/events [/times /V_m]] get cva
      6 ToUnitTestPrecision
      Transpose /vm_sim Set  % array of recorded data

      % to print to screen
      %vm_sim {
      %  ==	  
      %} forall

      
[
[25 0]
[50 0]
[75 0]
[100 2.401350000000000e+00]
[125 5.302440000000000e+00]
[150 4.108330000000000e+00]
[175 4.322170000000000e+00]
[200 3.053390000000000e+00]
[225 2.871240000000000e+00]
[250 2.028640000000000e+00]
[275 1.908020000000000e+00]
[300 1.396960000000000e+00]
[325 1.375850000000000e+00]
[350 1.057780000000000e+00]
[375 1.103490000000000e+00]
[400 8.865690000000001e-01]
[425 9.693530000000000e-01]
[450 8.028760000000000e-01]
[475 9.046710000000000e-01]
[500 7.626880000000000e-01]
[525 8.738550000000000e-01]
[550 7.435880000000000e-01]
[575 8.592780000000000e-01]
[600 7.345670000000000e-01]
[625 8.524119999999999e-01]
[650 7.303210000000000e-01]
[675 8.491860000000000e-01]
[700 7.283280000000000e-01]
[725 8.476730000000000e-01]
[750 7.273930000000000e-01]
[775 8.469640000000001e-01]
[800 7.269550000000000e-01]
[825 8.466320000000001e-01]
[850 7.267500000000000e-01]
[875 8.464760000000000e-01]
[900 7.266540000000000e-01]
[925 8.464030000000000e-01]
[950 7.266089999999999e-01]
[975 8.463690000000000e-01]
[1000 7.265880000000000e-01]
[1025 8.463530000000000e-01]
[1050 7.265779999999999e-01]
[1075 8.463460000000000e-01]
[1100 4.531260000000000e-01]
[1125 2.425410000000000e-01]
[1150 1.298230000000000e-01]
[1175 6.948920000000000e-02]
] /vm_expected Set

vm_sim vm_expected eq assert_or_die

end

endusing % unittest