home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / PROG / MISC / DATAREP.ZIP / BSBPROC.INC < prev    next >
Encoding:
Text File  |  1990-02-22  |  11.5 KB  |  360 lines

  1. {This is the procedure that does all the work in the BSB model.}
  2.  
  3. PROCEDURE BSBProc;         {Brain-state-in-a-box iterations.}
  4.  
  5.     VAR I, Test_stimulus_nr, 
  6.            Minimum_size,
  7.            Delta_passes, 
  8.            Start_nr_of_passes, 
  9.            Finish_nr_of_passes, 
  10.            Current_check    : INTEGER;
  11.            
  12.         Upper_Limit, 
  13.             Lower_Limit,  
  14.             Feedback_constant,  
  15.             Decay_constant  : REAL; 
  16.  
  17.         Test_stimulus_set,
  18.             Continue_char: CHAR;
  19.  
  20.         Starting_vector, Inp, Outp: Vector;
  21.  
  22.         Unchanged_original,
  23.         Quit, 
  24.         Restart: BOOLEAN;
  25.  
  26.    PROCEDURE BSBvals; 
  27.         VAR Stim: STIMULUS;
  28.             Stimulus_set: CHAR;
  29.             Stimulus_number: INTEGER;
  30.   
  31.       PROCEDURE BSBvals_initialization;
  32.         BEGIN
  33.         CASE Test_stimulus_set OF
  34.             'F','f': Stim:= F_set [Test_stimulus_nr];
  35.             'G','g': Stim:= G_set [Test_stimulus_nr];
  36.             'T','t': Stim:= T_set [Test_stimulus_nr];
  37.             END;
  38.         IF NOT Restart THEN Stim.Val:= Outp;
  39.         END;
  40.  
  41.       PROCEDURE Display_stimulus;
  42.       VAR I, Row_nr, Elements_per_line, 
  43.             Unit_nr, Elements_per_unit, Truncated_value: INTEGER;
  44.             Stim_interpretation: String;
  45.             Sign_char, Value_char: CHAR;
  46.      BEGIN
  47.          Interpret (Threshold, Stim.Val, Stim_Interpretation);
  48.          Clear_block; Scroll_block;
  49.      WRITELN ('            Name: ', Stim.Name);
  50.          WRITELN ('  Interpretation: ', Stim_interpretation);
  51.          WRITELN;
  52.          Elements_per_unit :=  8;  {One byte.  Basic reporting unit.}
  53.      Elements_per_line := 24;  {Three bytes. Number of elements in a line.}
  54.      FOR I:= 1 TO Dimensionality DO 
  55.                 BEGIN
  56.                 IF (I MOD Elements_per_unit = 1) THEN
  57.                          BEGIN
  58.                          Unit_nr:= 1 + I DIV Elements_per_unit;
  59.                          WRITE ( I:6);
  60.                          WRITE (' ',Stim_interpretation [Unit_nr], ' '); 
  61.                          END;
  62.  
  63.                 IF Stim.Val [I] > 0 THEN 
  64.                      BEGIN
  65.                      Sign_char := '+';
  66.                      Truncated_value:= TRUNC (10*Stim.Val[I]/Upper_limit);
  67.                      IF Truncated_value >= 10 THEN Value_char:= 'L' ELSE
  68.                                   Value_char:= CHR (48 + Truncated_value);
  69.                      END;
  70.  
  71.                 IF Stim.Val [I] < 0 THEN 
  72.                      BEGIN
  73.                      Sign_char := '-';
  74.                      Truncated_value:= TRUNC (ABS(10*Stim.Val[I]/Lower_limit));
  75.                      IF Truncated_value >= 10 THEN Value_char:= 'L' ELSE
  76.                                   Value_char:= CHR (48 + Truncated_value);
  77.                      END;
  78.  
  79.                 IF Stim.Val [I] = 0 THEN 
  80.                      BEGIN
  81.                      Sign_char := ' ';
  82.                      Value_char:= '0';
  83.                      END;
  84.  
  85.                 WRITE (Sign_char:1, Value_char:1);
  86.                 IF (I MOD Elements_per_line = 0) 
  87.                    THEN BEGIN WRITE ( I:4); WRITELN  END;
  88.                 END;
  89.      END;
  90.  
  91.  
  92.          BEGIN {Procedure BSB_vals.}
  93.          BSBvals_initialization;
  94.          Display_stimulus;
  95.          END;  {Procedure BSB_vals.} 
  96.  
  97.  
  98.     PROCEDURE Zero_vector (VAR V: VECTOR);
  99.         VAR I: INTEGER;
  100.         BEGIN
  101.         FOR I:= 1 TO Dimensionality DO V[I]:= 0;
  102.         END;
  103.  
  104.     PROCEDURE Initial_BSB_Parameters;
  105.       BEGIN
  106.       Unchanged_original:= FALSE;
  107.       FG_mode           := FALSE;
  108.       Test_stimulus_set := 'T';
  109.       Test_stimulus_nr  := 1;
  110.       Delta_passes      := 16;            {One VT100 screen full.}
  111.       Threshold         := 0.5;
  112.       Restart           := TRUE;
  113.       Quit              := FALSE;
  114.  
  115.       {BSB Computational Parameters.}
  116.  
  117.       Decay_constant    := 0.90;
  118.       Feedback_constant := 0.20;
  119.       Lower_limit       := -1.3;
  120.       Upper_limit       :=  1.3;
  121.       END;
  122.         
  123.    PROCEDURE Write_BSB_parameters;
  124.        BEGIN
  125.        Clear_box;  
  126.        {First line.}
  127.        WRITELN ('BSB>P)asses :', Delta_passes:4,
  128.                 '     U)Limit:', Upper_limit:8, 
  129.                 '  T)hreshold:', Threshold:8,
  130.                 '   Stim. #) :', Test_stimulus_set:2, Test_stimulus_nr:2);
  131.        {Second line.}
  132.        IF Neuron_file_present THEN
  133.           BEGIN
  134.           WRITE   ('Mx: Synapses:', Avg_number_of_synapses:4,
  135.                    '   F)eedback:', Feedback_constant:8,
  136.                    '      D)ecay:', Decay_constant:8);
  137.           WRITELN;
  138.           END;
  139.        {Fourth line.}
  140.        IF Restart THEN WRITE ('RESTART')
  141.                   ELSE WRITE ('It:',Finish_nr_of_passes:4);
  142.        IF Unchanged_original THEN WRITE ('  Add original stimulus.');
  143.        WRITELN;
  144.        END;
  145.  
  146.     PROCEDURE BSB_command;
  147.        VAR BSB_string : STRING;
  148.            I: INTEGER;
  149.            Set_parameters: BOOLEAN;
  150.        BEGIN
  151.        Save_cursor;
  152.        Set_parameters:= FALSE;  
  153.        REPEAT 
  154.         Write_BSB_parameters;
  155.         Bottom_line;
  156.         IF FG_mode THEN WRITE ('FG ') ELSE WRITE ('TF ');
  157.         WRITE 
  158.       ('BSB X)ecute C)hange L)ist R)estart V)als Q)uit > ');
  159.         IF NOT VT100 THEN WRITELN;
  160.         READLN (BSB_string);
  161.         Bottom_line;  Erase_line;
  162.         FOR I:= 1 TO LENGTH (BSB_string) DO
  163.          CASE BSB_string [I] OF  
  164.  
  165.           'C','c': Make_stimulus;
  166.  
  167.           'D','d': BEGIN WRITE ('Trace Decay: '); 
  168.                          READLN (Decay_constant);
  169.                          END;
  170.  
  171.           'F','f': BEGIN WRITE ('Matrix Feedback: '); 
  172.                          READLN (Feedback_constant);
  173.                          END;
  174.  
  175.           'L','l': List_test_set;
  176.  
  177.           'M','m': FG_mode:= NOT FG_mode;
  178.  
  179.           'O','o': BEGIN
  180.                    Unchanged_original:= NOT Unchanged_original;
  181.                    IF Unchanged_original 
  182.                       THEN WRITE ('Will add original stimulus to output.')
  183.                       ELSE WRITE ('Input stimulus will be treated as data.');
  184.                    END;
  185.  
  186.           'P','p': BEGIN WRITE ('Number of Passes: '); 
  187.                          READLN (Delta_passes) END;
  188.  
  189.           'Q','q': Quit:= TRUE;
  190.  
  191.           'R','r': Restart:= TRUE;
  192.  
  193.           'T','t': BEGIN WRITE ('New threshold: '); READLN (Threshold) END;
  194.  
  195.           'U','u': BEGIN WRITE ('Upper Limit: '); READLN (Upper_limit); 
  196.                          WRITE ('Lower Limit: '); READLN (Lower_limit) END;
  197.  
  198.           'V','v': BSBvals;
  199.  
  200.           'X','x': BEGIN WRITELN ('Xecute Iterations.'); 
  201.                          Set_parameters:= TRUE END;
  202.  
  203.           '#'    : BEGIN REPEAT 
  204.                            WRITE  ('Choose stimulus (Set, number) : '); 
  205.                            READLN (Test_stimulus_set, Test_stimulus_nr);
  206.                          UNTIL((Test_stimulus_set IN ['F','f','G','g','T','t'])
  207.                            AND (Test_stimulus_nr IN [1..Maximum_set_size]) )
  208.                    END;
  209.                  END;
  210.          UNTIL Set_parameters OR Quit;
  211.        Restore_cursor;
  212.        END;          
  213.     
  214.     PROCEDURE Limit_vector (VAR V: Vector);
  215.         VAR I: INTEGER;
  216.         BEGIN
  217.  
  218.         {The data input is added to the output of the iteration.}
  219.  
  220.         IF Unchanged_original THEN 
  221.            FOR I:= 1 TO Dimensionality DO 
  222.                V [I]:= V [I] + Starting_vector [I];
  223.  
  224.         {Clipping.}
  225.  
  226.         FOR I:= 1 TO Dimensionality DO
  227.             BEGIN
  228.             IF V [I] > Upper_limit THEN V [I]:= Upper_limit;
  229.             IF V [I] < Lower_limit THEN V [I]:= Lower_limit;
  230.             END;
  231.         END;
  232.  
  233.     {Calculate does most of the computational work.  This procedure  }
  234.     {should be in very fast vector hardware or assembly language.    }
  235.  
  236.     PROCEDURE Calculate (VAR F,O: Vector); {Computes output vector.}
  237.         VAR I,J: INTEGER;
  238.             Sum: REAL;
  239.  
  240.         BEGIN
  241.         FOR I:= 1 TO Dimensionality DO
  242.             BEGIN
  243.             Sum:= 0;
  244.  
  245.             FOR J:= 1 TO Number_of_synapses [I] DO
  246.               Sum:= Sum + Neurons [I].Synapses[J].Strength * 
  247.                     F [Neurons[I].Synapses [J].From];
  248.  
  249.             O[I]:= Sum;
  250.             END;
  251.         END;
  252.  
  253.     {Useful for seeing how far a vector is from a corner.}
  254.  
  255.     FUNCTION Check_vector (V: Vector): INTEGER;  
  256.         VAR I, Count_so_far: INTEGER;  {Returns number of limited elements.}
  257.         BEGIN
  258.         Count_so_far:= 0;
  259.         FOR I:= 1 TO Dimensionality DO
  260.             BEGIN
  261.             IF V [I] >= Upper_limit THEN Count_so_far:= Count_so_far + 1;
  262.             IF V [I] <= Lower_limit THEN Count_so_far:= Count_so_far + 1;
  263.             END;
  264.         Check_vector := Count_so_far;
  265.         END;
  266.  
  267.     PROCEDURE Constant_times_Vector (C: Real; V_in: Vector; VAR V_out: Vector);
  268.         VAR I: INTEGER;
  269.         BEGIN
  270.         FOR I:= 1 TO Dimensionality DO V_out [I]:= C * V_in [I];
  271.         END;
  272.  
  273.     PROCEDURE Vector_plus_Vector (V1, V2: Vector; VAR Vector_Sum: Vector);
  274.         VAR I: INTEGER;
  275.         BEGIN
  276.         FOR I:= 1 TO Dimensionality DO
  277.             Vector_sum [I]:= V1 [I] + V2 [I];
  278.         END;
  279.  
  280.     PROCEDURE W (S: String);
  281.        VAR I, Nr_of_Characters: INTEGER;
  282.        BEGIN
  283.        Nr_of_Characters:= Dimensionality DIV 8;
  284.        FOR I:= 1 TO Nr_of_Characters DO WRITE (S[I]);
  285.        END;
  286.  
  287. {One iterative pass through the matrix.}
  288.  
  289. PROCEDURE One_pass (I: INTEGER; VAR V_in, V_out: Vector);
  290.        VAR  DecayIx, Ax: Vector;
  291.             Interpreted_Vector: String;
  292.  
  293.        BEGIN
  294.        Calculate (V_in, Ax);
  295.  
  296.        {Result is feedback*A*x.}
  297.        Constant_times_vector (Feedback_constant, Ax, Ax);
  298.  
  299.        {Previous state decays.}
  300.        Constant_times_vector (Decay_constant,V_in,DecayIx);
  301.  
  302.        {Output is the sum of these two terms.}
  303.        Vector_plus_vector (Ax, DecayIx, V_out);    
  304.  
  305.        {Will add original state if called for.}
  306.        Limit_vector (V_out); 
  307.        Current_check:= Check_vector (V_out);
  308.        {Write output to file or screen.}
  309.        Interpret (Threshold, V_out, Interpreted_vector);
  310.        WRITE (I:6,'.  ');
  311.          W(Interpreted_vector);
  312.          WRITELN ('  Check: ', Current_check:3);
  313.        END;
  314.  
  315.     PROCEDURE Restart_initialization;
  316.        BEGIN
  317.        Clear_block;  Scroll_block;
  318.        Start_nr_of_passes:= 0;
  319.  
  320.        CASE Test_stimulus_set OF
  321.             'F','f': Starting_vector:= F_set[Test_stimulus_nr].Val;
  322.             'G','g': Starting_vector:= G_set[Test_stimulus_nr].Val;
  323.             'T','t': Starting_vector:= T_set[Test_stimulus_nr].Val;
  324.             END;
  325.  
  326.        Inp:= Starting_vector;
  327.        Limit_vector (Inp);
  328.        Restart:= FALSE;
  329.        Clear_block; Scroll_block;
  330.        END;
  331.  
  332.     PROCEDURE Do_iterations (Start, Finish: INTEGER);
  333.        VAR I: INTEGER;
  334.        BEGIN
  335.  
  336.        I:= Start;
  337.        REPEAT One_pass (I, Inp, Outp);
  338.               I:= I + 1;
  339.               Inp:= Outp;     {New input for next iteration.}
  340.        UNTIL (Current_check = Dimensionality) OR (I = (Finish + 1));
  341.  
  342.        END;
  343.  
  344.     BEGIN {BSB procedure.}
  345.     Initial_BSB_parameters;
  346.     REPEAT  BSB_command;
  347.             IF Restart THEN Restart_initialization;
  348.             Finish_nr_of_passes:= Start_nr_of_passes + Delta_passes;
  349.             IF NOT Quit THEN
  350.                BEGIN
  351.                Do_iterations (Start_nr_of_passes+1,Finish_nr_of_passes);
  352.                Start_nr_of_passes:= Finish_nr_of_passes;
  353.                IF (Current_check = Dimensionality) 
  354.                   THEN WRITELN ('>> Fully limited. Finished.');
  355.                END;
  356.     UNTIL Quit; 
  357.     Restore_scrolling;
  358.     WRITELN;
  359.     END;  {BSB procedure.} 
  360.