home *** CD-ROM | disk | FTP | other *** search
/ ProfitPress Mega CDROM2 …eeware (MSDOS)(1992)(Eng) / ProfitPress-MegaCDROM2.B6I / PROG / MISC / BAM.ZIP / BAM.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1990-05-13  |  19.1 KB  |  937 lines

  1. {$R-}    {Range checking off}
  2. {$B+}    {Boolean complete evaluation on}
  3. {$S+}    {Stack checking on}
  4. {$I+}    {I/O checking on}
  5. {$N+}    {Numeric coprocessor}
  6. {$E+}    {Numeric processor emulation}
  7. {$M 65500,16384,655360} {Turbo 3 default stack and heap}
  8.  
  9.  
  10. {Program Source for BAM simulation}
  11.  
  12.  
  13. PROGRAM Bidirectional_Associative_Memory (input,output);
  14.  
  15.  
  16. {
  17.  
  18. Copyright 1990 by Wesley R. Elsberry.  All rights reserved.
  19.  
  20. Commercial use of this software is prohibited without written consent of
  21. the author.
  22.  
  23. For information, bug reports, and updates contact
  24.  
  25. Wesley R. Elsberry
  26. 528 Chambers Creek Drive South
  27. Everman, Texas 76140
  28. Telephone: (817) 551-7018 (voice)
  29.            (817) 551-9363 (data, Central Neural System BBS
  30.                                  RBBS-Net 8:930/303 )
  31.  
  32. }
  33.  
  34. {BAM program}
  35.  
  36. USES Dos, CRT;
  37.  
  38. CONST
  39.   Max_Iterations = 10;
  40. TYPE
  41.   Weight_node_ptr_ = ^Weight_node_;
  42.   Weight_node_ = RECORD
  43.     na : Weight_node_ptr_;
  44.     nd : Weight_node_ptr_;
  45.     v : REAL;
  46.   END;
  47.   Vector_node_ptr_ = ^Vector_node_;
  48.   Vector_node_ = RECORD
  49.     v : INTEGER;
  50.     w : Weight_node_ptr_;
  51.     nxt : Vector_node_ptr_;
  52.   END;
  53.   Vector_header_ = RECORD
  54.     vns : Vector_node_ptr_;
  55.   END;
  56.  
  57. VAR
  58.   xv : vector_header_;
  59.   yv : vector_header_;
  60.   wm : weight_node_ptr_;
  61.   ii, jj : INTEGER;
  62.   X_LENGTH, Y_LENGTH : INTEGER;
  63.   inchar : CHAR;
  64.   Last_v : CHAR;
  65.   In_dat : Text;
  66.   Out_assoc, Out_weight, Out_stable : Text;
  67.   ttx, tty : Vector_node_ptr_;
  68.   vfilename : string[255];
  69.   files_open : BOOLEAN;
  70.  
  71. PROCEDURE Allocate_X_vector(VAR tt : Vector_node_ptr_);
  72. VAR
  73.   ii : INTEGER;
  74.   Temp : Vector_node_ptr_;
  75. BEGIN
  76.  
  77.   NEW(tt);
  78.   Temp := tt;
  79.   Temp^.v := 1;
  80.   Temp^.w := NIL;
  81.   FOR II := 1 TO X_length-1 DO
  82.     BEGIN
  83.       NEW(Temp^.nxt);
  84.       Temp^.nxt^.v := 1;
  85.       Temp^.nxt^.w := NIL;
  86.       Temp := Temp^.nxt;
  87.     END;
  88.   Temp^.nxt := NIL;
  89.   Temp^.w := NIL;
  90. END;
  91.  
  92. PROCEDURE Allocate_Y_vector(VAR tt : Vector_node_ptr_);
  93. VAR
  94.   ii : INTEGER;
  95.   Temp : Vector_node_ptr_;
  96. BEGIN
  97.  
  98.   NEW(tt);
  99.   Temp := tt;
  100.   Temp^.v := 1;
  101.   Temp^.w := NIL;
  102.   FOR II := 1 TO Y_length-1 DO
  103.     BEGIN
  104.       NEW(Temp^.nxt);
  105.       Temp^.nxt^.v := 1;
  106.       Temp^.nxt^.w := NIL;
  107.       Temp := Temp^.nxt;
  108.     END;
  109.   Temp^.nxt := NIL;
  110.   Temp^.w := NIL;
  111. END;
  112.  
  113. PROCEDURE  Allocate_weight_vector (VAR tv : weight_node_ptr_);
  114. {}
  115. VAR
  116.   ii : INTEGER;
  117.   tpv : weight_node_ptr_;
  118. BEGIN {}
  119.   NEW(tv);
  120.   tpv := tv;
  121.   tpv^.v := 0;
  122.   tpv^.nd := NIL;
  123.   FOR ii := 1 TO Y_Length-1 DO
  124.     BEGIN {}
  125.       NEW(tpv^.na);
  126.       tpv^.v := 0;
  127.       tpv^.nd := NIL;
  128.       tpv := tpv^.na;
  129.       tpv^.v := 0;
  130.       tpv^.nd := NIL;
  131.     END; {}
  132.   tpv^.na := NIL;
  133.   tpv^.nd := NIL;
  134. END; {}
  135.  
  136. PROCEDURE  Link_weights (tu,td : weight_node_ptr_);
  137. {}
  138. VAR
  139.   ii : INTEGER;
  140. BEGIN {}
  141.   FOR ii := 1 TO Y_length DO
  142.     BEGIN {}
  143.       tu^.nd := td;
  144.       tu := tu^.na;
  145.       td := td^.na;
  146.     END; {}
  147. END; {}
  148.  
  149.  
  150. PROCEDURE Allocate_weight_matrix;
  151. VAR
  152.   ii : INTEGER;
  153.   Temp, Tempa, Start, tl, tc, tls, tcs : weight_node_ptr_;
  154.   Vt : Vector_node_ptr_;
  155.   cnt : INTEGER;
  156. BEGIN
  157.   cnt := 0;
  158.   Allocate_weight_vector (wm);
  159.   tls := wm;
  160.   FOR ii := 1 TO X_Length-1 DO
  161.     BEGIN {}
  162.       Allocate_weight_vector (tcs);
  163.       tl := tls;
  164.       tc := tcs;
  165.       Link_weights(tl,tc);
  166.       tls := tcs;
  167.     END; {}
  168.  
  169.   {Link to vectors}
  170.   Start := wm;
  171.   Temp := Start;
  172.   Vt := Xv.vns;
  173.   FOR ii := 1 TO X_Length DO
  174.     BEGIN
  175.       Vt^.w := Temp;
  176.       Temp := Temp^.nd;
  177.       Vt := Vt^.nxt;
  178.     END;
  179.   Temp := Start;
  180.   Vt := Yv.vns;
  181.   FOR ii := 1 TO Y_Length DO
  182.     BEGIN
  183.       Vt^.w := Temp;
  184.       Temp := Temp^.na;
  185.       Vt := Vt^.nxt;
  186.     END;
  187. END;
  188.  
  189. FUNCTION Step(C_val :INTEGER; s_val : Real):INTEGER;
  190. {}
  191. BEGIN {}
  192.     IF (S_val > 0) THEN {}
  193.       BEGIN
  194.         Step := 1;
  195.       END
  196.     ELSE {}
  197.       BEGIN
  198.         IF (S_val < 0) THEN {}
  199.           BEGIN
  200.             Step := -1;
  201.           END
  202.         ELSE {}
  203.           BEGIN
  204.             Step := C_val;
  205.           END;
  206.       END;
  207. END; {}
  208.  
  209. PROCEDURE Toggle_Value(ptr : Vector_node_ptr_);
  210. {}
  211. BEGIN {}
  212.   CASE ptr^.v OF
  213.     1 : ptr^.v := -1;
  214.     -1 : ptr^.v := 1;
  215.   END;
  216.  
  217. END; {}
  218.  
  219. FUNCTION Next_X_Value(Xptr : Vector_node_ptr_):INTEGER;
  220. {}
  221. VAR
  222.   tx, ty : Vector_node_ptr_;
  223.   tw : Weight_node_ptr_;
  224.   ii : INTEGER;
  225.   Sum : REAL;
  226. BEGIN {}
  227.   Sum := 0;
  228.   tx := Xptr;
  229.   ty := Yv.vns;
  230.   tw := tx^.w;
  231.   FOR ii := 1 TO Y_length DO
  232.     BEGIN {}
  233.       Sum := sum + tw^.v * ty^.v;
  234.       tw := tw^.na;
  235.       ty := ty^.nxt;
  236.     END; {}
  237.   Next_X_value := Step(Xptr^.v,sum);
  238. END; {}
  239.  
  240. FUNCTION Next_Y_Value(Yptr : Vector_node_ptr_):INTEGER;
  241. {}
  242. VAR
  243.   tx, ty : Vector_node_ptr_;
  244.   tw : Weight_node_ptr_;
  245.   ii : INTEGER;
  246.   Sum : REAL;
  247. BEGIN {}
  248.   Sum := 0;
  249.   tx := Xv.vns;
  250.   ty := Yptr;
  251.   Tw := ty^.w;
  252.   FOR ii := 1 TO X_length DO
  253.     BEGIN {}
  254.       Sum := sum + tw^.v * tx^.v;
  255.       tw := tw^.nd;
  256.       tx := tx^.nxt;
  257.     END; {}
  258.   Next_Y_value := Step(Yptr^.v,sum);
  259. END; {}
  260.  
  261. PROCEDURE Display_X(Assoc,Stable : BOOLEAN);
  262. {}
  263. VAR
  264.   tx : Vector_node_ptr_;
  265.   ii : INTEGER;
  266. BEGIN {}
  267.   tx := Xv.vns;
  268.   WRITE('Vector X : ');
  269.   FOR ii := 1 TO X_length DO
  270.     BEGIN {}
  271.       IF (tx^.v = 1) THEN {}
  272.         BEGIN
  273.           WRITE('+');
  274.           IF (Assoc) THEN {}
  275.             BEGIN
  276.              IF files_open THEN
  277.                 WRITE(Out_Assoc,'+');
  278.             END;
  279.           IF (Stable) THEN {}
  280.             BEGIN
  281.               IF files_open THEN
  282.                 WRITE(Out_Stable,'+');
  283.             END;
  284.         END
  285.       ELSE {}
  286.         BEGIN
  287.           WRITE('-');
  288.           IF (Assoc) THEN {}
  289.             BEGIN
  290.               IF files_open THEN
  291.                 WRITE(Out_Assoc,'-');
  292.             END;
  293.           IF (Stable) THEN {}
  294.             BEGIN
  295.               IF files_open THEN
  296.                 WRITE(Out_Stable,'-');
  297.             END;
  298.         END;
  299.       tx := tx^.nxt;
  300.     END; {}
  301.   WRITELN;
  302. END; {}
  303.  
  304. PROCEDURE Display_Y(Assoc,Stable : BOOLEAN);
  305. {}
  306. VAR
  307.   ty : Vector_node_ptr_;
  308.   ii : INTEGER;
  309. BEGIN {}
  310.   ty := Yv.vns;
  311.   WRITE('Vector Y : ');
  312.   FOR ii := 1 TO Y_length DO
  313.     BEGIN {}
  314.       IF (ty^.v = 1) THEN {}
  315.         BEGIN
  316.           WRITE('+');
  317.           IF (Assoc) THEN {}
  318.             BEGIN
  319.               IF files_open THEN
  320.                 WRITE(Out_Assoc,'+');
  321.             END;
  322.           IF (Stable) THEN {}
  323.             BEGIN
  324.               IF files_open THEN
  325.                 WRITE(Out_Stable,'+');
  326.             END;
  327.         END
  328.       ELSE {}
  329.         BEGIN
  330.           WRITE('-');
  331.           IF (Assoc) THEN {}
  332.             BEGIN
  333.               IF files_open THEN
  334.                 WRITE(Out_Assoc,'-');
  335.             END;
  336.           IF (Stable) THEN {}
  337.             BEGIN
  338.               IF files_open THEN
  339.                 WRITE(Out_Stable,'-');
  340.             END;
  341.         END;
  342.       ty := ty^.nxt;
  343.     END; {}
  344.   WRITELN;
  345. END; {}
  346.  
  347. PROCEDURE  Set_Weights;
  348. {}
  349. VAR
  350.   tx, ty : Vector_node_ptr_;
  351.   td, ta, tw : Weight_node_ptr_;
  352.   ii, jj : INTEGER;
  353. BEGIN {}
  354.   tw := wm;
  355.   ty := Yv.vns;
  356.   tx := Xv.vns;
  357.   td := tw;
  358.   ta := tw;
  359.   {For 1 to Y_length}
  360.     {Set tx to Xv}
  361.   FOR ii := 1 TO X_length DO
  362.     BEGIN {}
  363.       FOR jj := 1 TO Y_length DO
  364.         BEGIN {}
  365.           ta^.v := ta^.v + tx^.v * ty^.v;
  366.           WRITE(ta^.v:3:1,' ');
  367.           ta := ta^.na;
  368.           ty := ty^.nxt;
  369.         END; {}
  370.       WRITELN;
  371.       ty := Yv.vns;
  372.       tx := tx^.nxt;
  373.       td := td^.nd;
  374.       ta := td;
  375.     END; {}
  376.     IF files_open THEN
  377.       WRITE(Out_Assoc,'X then Y : ');
  378.     Display_X(TRUE,FALSE);
  379.     IF files_open THEN
  380.       WRITE(Out_Assoc,' ');
  381.     Display_Y(TRUE,FALSE);
  382.     IF files_open THEN
  383.       WRITELN(Out_Assoc);
  384. END; {}
  385.  
  386.  
  387. PROCEDURE Display_Links;
  388. {}
  389. VAR
  390.   tx, ty : Vector_node_ptr_;
  391.   tw, tw1 : Weight_node_ptr_;
  392.   ii, jj : INTEGER;
  393. BEGIN {}
  394.  
  395.   tx := NIL;
  396.   WRITELN ('NIL = ',seg(tx^),':',ofs(tx^));
  397.  
  398.   {Display X links}
  399.   tx := Xv.vns;
  400.   WRITE('Vector X : ');
  401.   FOR ii := 1 TO X_length DO
  402.     BEGIN {}
  403.       WRITE (seg(tx^.w^),':',ofs(tx^.w^),' ');
  404.       tx := tx^.nxt;
  405.     END; {}
  406.   WRITELN;
  407.  
  408.   {Display Y links}
  409.   ty := Yv.vns;
  410.   WRITE('Vector Y : ');
  411.   FOR ii := 1 TO Y_length DO
  412.     BEGIN {}
  413.       WRITE (seg(ty^.w^),':',ofs(ty^.w^),' ');
  414.       ty := ty^.nxt;
  415.     END; {}
  416.   WRITELN;
  417.  
  418.   {Display Weight links}
  419.   tw := Wm;
  420.   tw1 := Wm;
  421.   WRITELN ('Weight Matrix');
  422.   WRITELN (seg(wm^),':',ofs(wm^),' ',seg(tw1^),':',ofs(tw1^));
  423.   WRITELN;
  424.  
  425.   FOR jj := 1 TO X_Length DO
  426.     BEGIN
  427.       FOR ii := 1 TO Y_length DO
  428.         BEGIN {}
  429.           WRITE (seg(tw1^),':',ofs(tw1^),' ');
  430.           tw1 := tw1^.na;
  431.         END; {}
  432.       WRITELN;
  433.       tw1 := tw^.nd;
  434.       tw := tw1;
  435.     END;
  436.  
  437. END; {}
  438.  
  439.  
  440. PROCEDURE  Set_X_Vector;
  441. {}
  442. VAR
  443.   inchar : CHAR;
  444.   tx : Vector_node_ptr_;
  445.   ii : INTEGER;
  446. BEGIN {}
  447.   tx := Xv.vns;
  448.   WRITELN('Input X Vector.  Use "-" and "+" for input');
  449.   FOR ii := 1 TO X_Length DO
  450.     BEGIN {}
  451.       REPEAT {}
  452.         inchar := READKEY;
  453.       UNTIL (inchar in ['-','+','=']); {}
  454.       IF (inchar = '=') THEN {}
  455.         BEGIN
  456.           inchar := '+';
  457.         END;
  458.       WRITE(inchar);
  459.       CASE inchar OF
  460.         '+' : tx^.v := 1;
  461.         '-' : tx^.v := -1;
  462.       END; {}
  463.       tx := tx^.nxt;
  464.     END; {FOR}
  465.   WRITELN;
  466.   Last_V := 'X';
  467. END; {}
  468.  
  469. PROCEDURE  Set_Y_Vector;
  470. {}
  471. VAR
  472.   inchar : CHAR;
  473.   ty : Vector_node_ptr_;
  474.   ii : INTEGER;
  475. BEGIN {}
  476.   ty := Yv.vns;
  477.   WRITELN('Input Y Vector.  Use "-" and "+" for input');
  478.   FOR ii := 1 TO Y_Length DO
  479.     BEGIN {}
  480.       REPEAT {}
  481.         inchar := READKEY;
  482.       UNTIL (inchar in ['-','+','=']); {}
  483.       IF (inchar = '=') THEN {}
  484.         BEGIN
  485.           inchar := '+';
  486.         END;
  487.       WRITE(inchar);
  488.       CASE inchar OF
  489.         '+' : ty^.v := 1;
  490.         '-' : ty^.v := -1;
  491.       END; {}
  492.       ty := ty^.nxt;
  493.     END; {FOR}
  494.   WRITELN;
  495.   Last_V := 'Y';
  496. END; {}
  497.  
  498. PROCEDURE Recall_X;
  499. {}
  500. CONST
  501.   A = FALSE;
  502.   S = FALSE;
  503. VAR
  504.   tx : Vector_node_ptr_;
  505.   ii : INTEGER;
  506.  
  507. BEGIN {}
  508.   tx := Xv.vns;
  509.   FOR ii := 1 TO X_length DO
  510.     BEGIN {}
  511.       tx^.v := Next_X_Value(tx);
  512.       tx := tx^.nxt;
  513.     END; {}
  514. {  Display_X (A,S);}
  515. END; {}
  516.  
  517. PROCEDURE Recall_Y;
  518. {}
  519. CONST
  520.   A = FALSE;
  521.   S = FALSE;
  522. VAR
  523.   ty : Vector_node_ptr_;
  524.   ii : INTEGER;
  525. BEGIN {}
  526.   ty := Yv.vns;
  527.   FOR ii := 1 TO Y_length DO
  528.     BEGIN {}
  529.       ty^.v := Next_Y_Value(ty);
  530.       ty := ty^.nxt;
  531.     END; {}
  532. {  Display_Y (A,S);}
  533. END; {}
  534.  
  535. FUNCTION Value_symbol (v : INTEGER): CHAR;
  536. {}
  537. BEGIN {}
  538.   CASE v OF
  539.     1 : Value_Symbol := '+';
  540.     -1 : Value_symbol := '-';
  541.   END;
  542. END; {}
  543.  
  544. PROCEDURE  Dump_weights;
  545. {}
  546. VAR
  547.   td, ta : Weight_node_ptr_;
  548.   ii, jj : INTEGER;
  549. BEGIN {}
  550.   IF files_open THEN
  551.     WRITELN (Out_weight,'Weight Matrix');
  552.   td := wm;
  553.   ta := td;
  554.   FOR ii := 1 TO X_Length DO
  555.     BEGIN {}
  556.       FOR jj := 1 TO Y_Length DO
  557.         BEGIN {}
  558.           IF files_open THEN
  559.             WRITE (Out_weight,ta^.v:5:3,' ');
  560.           ta := ta^.na;
  561.         END; {}
  562.       td := td^.nd;
  563.       ta := td;
  564.       IF files_open THEN
  565.         WRITELN (Out_weight);
  566.     END; {}
  567. END; {}
  568.  
  569. PROCEDURE Recall;
  570. {}
  571. VAR
  572.   ii : INTEGER;
  573. BEGIN {}
  574.   FOR ii := 1 TO Max_Iterations DO
  575.     BEGIN {}
  576.       CASE Last_V OF
  577.         'X':
  578.           BEGIN {}
  579.             Recall_Y;
  580.             Recall_X;
  581.           END; {}
  582.         'Y':
  583.           BEGIN {}
  584.             Recall_X;
  585.             Recall_Y;
  586.           END; {}
  587.       END;
  588.     END; {}
  589.   Display_X (FALSE,FALSE);
  590.   Display_Y (FALSE,FALSE);
  591. END; {}
  592.  
  593. PROCEDURE Copy_list (VAR clst, tt : Vector_node_ptr_);
  594. {}
  595. VAR
  596.   t1, t2 : Vector_node_ptr_;
  597. BEGIN {}
  598.   t1 := tt;
  599.   t2 := clst;
  600.   WHILE (t2 <> NIL) DO
  601.     BEGIN {}
  602.       t1^.v := t2^.v;
  603.       t2 := t2^.nxt;
  604.       t1 := t1^.nxt;
  605.     END; {}
  606. END; {}
  607.  
  608. PROCEDURE  Increment (tt : Vector_node_ptr_);
  609. {}
  610. VAR
  611.   Done : BOOLEAN;
  612. BEGIN {}
  613.   Done := FALSE;
  614.   {toggle v}
  615.   {If v = 1 and nxt <> nil, then next and toggle
  616.    else exit}
  617.   WHILE (NOT Done) DO
  618.     BEGIN {}
  619.       Toggle_Value(tt);
  620.       IF (tt^.v = 1) AND (tt^.nxt <> NIL) THEN {}
  621.         BEGIN
  622.           tt := tt^.nxt;
  623.         END
  624.       ELSE {}
  625.         BEGIN
  626.           Done := TRUE;
  627.         END;
  628.     END; {}
  629. END; {}
  630.  
  631. FUNCTION Done (vt : Vector_node_ptr_):BOOLEAN;
  632. {}
  633. VAR
  634.   Temp_B : BOOLEAN;
  635. BEGIN {}
  636.   Temp_B := TRUE;
  637.   WHILE (vt <> NIL) DO
  638.     BEGIN {}
  639.       IF (vt^.v = 1) THEN {}
  640.         BEGIN
  641.           Temp_B := FALSE;
  642.         END;
  643.       vt := vt^.nxt;
  644.     END; {}
  645.   Done := Temp_B;
  646. END; {}
  647.  
  648. PROCEDURE Find_stable;
  649. {}
  650. VAR
  651.   tx, ty : Vector_node_ptr_;
  652.   tv1, tv2 : Vector_node_ptr_;
  653.   ii, jj : INTEGER;
  654.  
  655. BEGIN {}
  656.   Allocate_X_Vector (tx);
  657.   tv1 := tx;
  658.   tv2 := Xv.vns;
  659.   {Initialize Template}
  660.   WHILE (tv1 <> NIL) DO
  661.     BEGIN {}
  662.       tv1^.v := 1;
  663.       tv1 := tv1^.nxt;
  664.     END; {}
  665.   REPEAT {}
  666.     tv1 := tx;
  667.     Copy_list(Tv1,Tv2);
  668.     Last_V := 'X';
  669.     Recall;
  670.     {Write X, Y to Stable}
  671.     IF files_open THEN
  672.       WRITE(Out_Stable,'X then Y ');
  673.     Display_X (FALSE,TRUE);
  674.     IF files_open THEN
  675.       WRITE(Out_Stable,' ');
  676.     Display_Y (FALSE,TRUE);
  677.     IF files_open THEN
  678.       WRITELN(Out_Stable);
  679.     Increment(tv1);
  680.   UNTIL (Done(tv1)); {}
  681.   tv1 := tx;
  682.   Copy_list(Tv1,Tv2);
  683.   Recall;
  684.   {Write X, Y to Stable}
  685.   IF files_open THEN
  686.     WRITE(Out_Stable,'X then Y ');
  687.   Display_X (FALSE,TRUE);
  688.   IF files_open THEN
  689.     WRITE(Out_Stable,' ');
  690.   Display_Y (FALSE,TRUE);
  691.   IF files_open THEN
  692.     WRITELN(Out_Stable);
  693.  
  694.   {For Y vector}
  695.   Allocate_Y_Vector(ty);
  696.   tv1 := ty;
  697.   tv2 := Yv.vns;
  698.   {Initialize Template}
  699.   WHILE (tv1 <> NIL) DO
  700.     BEGIN {}
  701.       tv1^.v := 1;
  702.       tv1 := tv1^.nxt;
  703.     END; {}
  704.   REPEAT {}
  705.     tv1 := ty;
  706.     Copy_list(Tv1,Tv2);
  707.     Last_V := 'Y';
  708.     Recall;
  709.     {Write X, Y to Stable}
  710.     IF files_open THEN
  711.       WRITE(Out_Stable,'X then Y ');
  712.     Display_X (FALSE,TRUE);
  713.     IF files_open THEN
  714.       WRITE(Out_Stable,' ');
  715.     Display_Y (FALSE,TRUE);
  716.     IF files_open THEN
  717.       WRITELN(Out_Stable);
  718.     Increment(tv1);
  719.   UNTIL (Done(tv1)); {}
  720.   tv1 := ty;
  721.   Copy_list(Tv1,Tv2);
  722.   Recall;
  723.   {Write X, Y to Stable}
  724.   IF files_open THEN
  725.     WRITE(Out_Stable,'X then Y ');
  726.   Display_X (FALSE,TRUE);
  727.   IF files_open THEN
  728.     WRITE(Out_Stable,' ');
  729.   Display_Y (FALSE,TRUE);
  730.   IF files_open THEN
  731.     WRITELN(Out_Stable);
  732. END; {}
  733.  
  734. PROCEDURE  Set_vector_from_file (tv : Vector_node_ptr_);
  735. {}
  736. VAR
  737.   tt : Vector_node_ptr_;
  738.   inchar : CHAR;
  739. BEGIN {}
  740.   tt := tv;
  741.   WHILE (tt <> NIL) DO
  742.     BEGIN {}
  743.       READ(In_dat,inchar);
  744.       CASE inchar OF
  745.         '+','=' :
  746.           BEGIN {}
  747.             tt^.v := 1;
  748.           END; {}
  749.         '-' :
  750.           BEGIN {}
  751.             tt^.v := -1;
  752.           END; {}
  753.       END;
  754.       tt := tt^.nxt;
  755.     END; {}
  756. END; {}
  757.  
  758. PROCEDURE  Set_weights_from_file;
  759. {}
  760. BEGIN {}
  761.  
  762.   ASSIGN (In_dat,vfilename + '.DAT');
  763.   RESET (In_dat);
  764.  
  765.   ASSIGN(Out_assoc,vfilename+'a.bam');
  766.   REWRITE(Out_assoc);
  767.  
  768.   ASSIGN(Out_weight,vfilename+'w.bam');
  769.   REWRITE(Out_weight);
  770.  
  771.   ASSIGN(Out_stable,vfilename+'s.bam');
  772.   REWRITE(Out_stable);
  773.  
  774.   WHILE (NOT EOF(In_dat)) DO
  775.     BEGIN {}
  776.       Set_vector_from_file(Xv.vns);
  777.       Set_vector_from_file(Yv.vns);
  778.       READLN(In_dat);
  779.       Set_weights;
  780.     END; {}
  781.   CLOSE (IN_dat);
  782.  
  783.  
  784.  
  785. END; {}
  786.  
  787. PROCEDURE  Driver;
  788. {}
  789. BEGIN {}
  790.   WRITELN;
  791.   WRITELN('Bidirectional Associative Memory program');
  792.   WRITELN('Copyright 1988 by Wesley R. Elsberry');
  793.   WRITELN(' All Rights Reserved');
  794.   WRITELN;
  795.  
  796.   {Initialize}
  797.   files_open := FALSE;
  798.  
  799.   {BAM Choices}
  800.     {Set up BAM}
  801.  
  802.       REPEAT {}
  803.         {Set X vector length}
  804.         WRITE('Length of X vector? : ');
  805.         READLN(X_length);
  806.         WRITELN;
  807.       UNTIL (x_length >= 1); {}
  808.  
  809.       REPEAT {}
  810.         {Set Y vector length}
  811.         WRITE('Length of Y vector? : ');
  812.         READLN(Y_length);
  813.         WRITELN;
  814.       UNTIL (Y_length >= 1); {}
  815.  
  816.       {Allocate vectors}
  817.       Allocate_X_vector(Xv.vns);
  818.       Allocate_Y_vector(Yv.vns);
  819.  
  820.       {Allocate Weight matrix}
  821.       Allocate_Weight_matrix;
  822.  
  823. { Display_links is handy for debugging}
  824. {      Display_links;}
  825.  
  826.  
  827.     REPEAT {}
  828.       {Set associative weights}
  829.       WRITELN;
  830.       WRITE(
  831. 'Set (X),(Y), (S)et weight, (G)et from file, (H)elp, or (Q)uit setup : ');
  832.       READLN(inchar);
  833.       CASE inchar OF
  834.         'X','x' :
  835.           BEGIN {}
  836.             Set_X_vector;
  837.           END; {}
  838.         'Y','y' :
  839.           BEGIN {}
  840.             Set_Y_vector;
  841.           END; {}
  842.         'S','s' :
  843.           BEGIN {}
  844.             Set_weights;
  845.           END; {}
  846.         'G','g' :
  847.           BEGIN {}
  848.             WRITE ('File to get vectors from? : ');
  849.             READLN(vfilename);
  850.             files_open := TRUE;
  851.             Set_Weights_from_File;
  852.           END; {}
  853.         'H','h' :
  854.           BEGIN
  855.             WRITELN;
  856.             WRITELN(
  857. 'Set (X), (Y) :  These allow you to interactively enter values for X and Y');
  858.             WRITELN(
  859. '                vector pairs.  The weights for the association between  ');
  860.             WRITELN(
  861. '                these is not set until the (S)et weights option is used.');
  862.             WRITELN(
  863. '                Thus, errors in entry can be corrected by recalling the');
  864.             WRITELN(
  865. '                same vector entry routine again before setting weights.');
  866.             WRITELN(
  867. '(S)et weights : This option records an association between the current');
  868.             WRITELN(
  869. '                values of the X and Y vectors, storing this association');
  870.             WRITELN(
  871. '                in a set of weights between the nodes of the network.');
  872.             WRITELN(
  873. '(G)et from file :  This allows a textfile containing vector pairs to be');
  874.             WRITELN(
  875. '                read and weights recorded for each.');
  876.             WRITELN(
  877. '(H)elp  :       This help screen.');
  878.             WRITELN(
  879. '(Q)uit setup  : After the BAM network has the sets of vectors which you');
  880.             WRITELN(
  881. '                wish to train it to, you may leave the setup mode and');
  882.             WRITELN(
  883. '                proceed to an interactive recall session, where you may');
  884.             WRITELN(
  885. '                specify the X and/or Y vector(s) and examine the recalled');
  886.             WRITELN(
  887. '                pattern.');
  888.             WRITELN;
  889.             END;
  890.       END;
  891.     UNTIL (inchar = 'Q') OR (inchar = 'q'); {}
  892.  
  893.     REPEAT {}
  894.       {Choice: Set, Recall, Quit}
  895.       WRITELN;
  896.       WRITE('Set (X), (Y), (R)ecall, or (Q)uit simulation : ');
  897.       READLN(inchar);
  898.       CASE inchar OF
  899.         'X','x' :
  900.           BEGIN {}
  901.             Set_X_vector;
  902.           END; {}
  903.         'Y','y' :
  904.           BEGIN {}
  905.             Set_Y_vector;
  906.           END; {}
  907.         'R','r' :
  908.           BEGIN {}
  909.             Recall;
  910.           END; {}
  911.       END;
  912.     UNTIL (inchar = 'Q') OR (inchar = 'q'); {}
  913.  
  914.   WRITELN;
  915.   WRITELN ('Weights and Stable States ... ');
  916.   WRITELN;
  917.  
  918.   Dump_weights;
  919.   Find_stable;
  920.  
  921.   WRITELN('End of BAM program, exiting to DOS');
  922.  
  923.   IF files_open THEN BEGIN
  924.     FLUSH(Out_assoc);
  925.     FLUSH(Out_weight);
  926.     FLUSH(Out_stable);
  927.     CLOSE(Out_assoc);
  928.     CLOSE(Out_weight);
  929.     CLOSE(Out_stable);
  930.     END;
  931. END; {}
  932.  
  933. BEGIN {MAIN}
  934.   Driver;
  935. END. {MAIN}
  936.  
  937.