TriuneCadence/THES/SAL.PP

252 lines
7.0 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PROGRAM Salieri_network_training_program (Input,Output);
{
Copyright 1989 by Wesley R. Elsberry. All rights reserved.
Commercial use of this software is prohibited without written consent of
the author.
For information, bug reports, and updates contact
Wesley R. Elsberry
528 Chambers Creek Drive South
Everman, Texas 76140
Telephone: (817) 551-7018
}
USES
DOS, struct, BP_unit, misc1, ANSI_Z, globals, clasinst;
{General}
TYPE
REAL = SINGLE;
bpnp_ = BP_node_ptr_;
wnp_ = weight_node_ptr_;
vnp_ = vector_node_ptr_;
seq_pop_rec_ = RECORD
n : notes_;
t : INTEGER;
e : REAL;
END;
seq_pop_ = ARRAY[0..99] OF seq_pop_rec_;
seq_pop_command_ = (init,replace);
VAR
snet, s31net, s46net : BP_net_;
ii, jj, kk : INTEGER;
Done : BOOLEAN;
cmn : common_area_;
notes : notes_;
tp1, tp2, tp3 : DVE_ptr_;
error_m, tne, sum : ARRAY[1..3] OF REAL;
ss : STRING;
binsum : ARRAY[1..3] OF INTEGER;
fpos, fneg : INTEGER;
tr : REAL;
sinch : CHAR;
scon : STRING;
sp : seq_pop_;
PROCEDURE maintain_seq_pop (VAR sp1 : seq_pop_;
spot : INTEGER;
cmd : seq_pop_command_);
VAR
ii, jj : INTEGER;
BEGIN
CASE cmd OF
init : BEGIN
FOR ii := 0 TO 99 DO BEGIN
FOR jj := 1 TO 5 DO BEGIN
sp1[ii].n[jj] := 0;
END;
sp1[ii].t := 0;
sp1[ii].e := 0.0;
END; {FOR ii}
END; {init}
replace : BEGIN
REPEAT
FOR jj := 1 TO 3 DO BEGIN
IF (jj = 1) THEN BEGIN
sp1[spot].n[jj] := Random(9);
END
ELSE BEGIN
IF (sp1[spot].n[jj-1] = 0) THEN BEGIN
sp1[spot].n[jj] := Random(9);
END
ELSE BEGIN
sp1[spot].n[jj] := Random(8) + 1;
END;
END;
END;
FOR jj := 4 TO v_len_out DO BEGIN
sp1[spot].n[jj] := Random(8) + 1;
END; {FOR jj}
sp1[spot].t := Classical_instructor(sp1[spot].n);
UNTIL (Odd(spot)) OR (sp1[spot].t = 1);
END; {replace}
ELSE
BEGIN
END;
END; {Case CMD}
END;
PROCEDURE Set_input_vector_from_notes (vp : DVE_ptr_;
n : notes_);
VAR
ii : INTEGER;
vpt : DVE_ptr_;
vn : ARRAY[1..40] OF INTEGER;
BEGIN
FillChar (vn,SizeOf(vn),#0);
{Blank the current vector}
FOR ii := 1 TO 5 DO BEGIN{Notes subscript}
IF n[ii] > 0 THEN vn [((ii-1)*8)+n[ii]] := 1;
END; {For notes subscript}
vpt := vp;
FOR ii := 1 TO 40 DO BEGIN
vnp_(vpt^.dptr)^.v := vn[ii];
vpt := vpt^.right;
END; {FOR ii}
END;
BEGIN
Done := FALSE;
s46net.data_fname := 's61.dat';
ANSI_CUP(13,0);
Writeln(MemAvail:8);
Writeln(s46net.data_fname);
Setup_BP_net (s46net,s46net.data_fname);
Writeln;
Writeln(s46net.wt_fname);
Set_BP_net_weights_from_file(s46net,s46net.wt_fname);
ANSI_CLRSCR;
Writeln(MemAvail:8);
maintain_seq_pop(sp,0,init);
FOR ii := 1 TO 100 DO BEGIN
maintain_seq_pop(sp,ii-1,replace);
END;
REPEAT
IF dir_console_IO (sinch) THEN BEGIN
IF (UpCase(sinch) = 'Q') THEN BEGIN
Close (s46net.out_f);
EXIT;
END;
END;
FOR ii := 1 TO 3 DO BEGIN
error_m[ii] := 0;
sum[ii] := 0;
binsum[ii] := 0;
fpos := 0;
fneg := 0;
END;
FOR ii := 1 TO 100 DO BEGIN
IF dir_console_IO (sinch) THEN BEGIN
IF (UpCase(sinch) = 'Q') THEN BEGIN
Close (s46net.out_f);
EXIT;
END;
END;
Set_input_vector_from_notes (s46net.vi,sp[ii-1].n);
vnp_(s46net.vts^.dptr)^.v := sp[ii-1].t;
BP_train_and_change (s46net);
tne[3] := ABS(BP_net_error(s46net));
sp[ii-1].e := tne[3];
notes := sp[ii-1].n;
FOR kk := 3 TO 3 DO BEGIN
error_m[kk] := max_single(ABS(error_m[kk]),tne[kk]);
END;
IF ((tne[3] > 0.50) AND (vnp_(s46net.vts^.dptr)^.v = 1.0)) OR
((tne[3] >= 0.50) AND (vnp_(s46net.vts^.dptr)^.v = 0.0))
THEN BEGIN
INC(binsum[3]);
IF ((tne[3] > 0.50) AND (vnp_(s46net.vts^.dptr)^.v = 1.0))
THEN INC(fneg);
IF ((tne[3] >= 0.50) AND (vnp_(s46net.vts^.dptr)^.v = 0.0)
) THEN INC(fpos);
Write (s46net.out_f,'I ');
FOR kk := 1 TO 5 DO BEGIN
Write (s46net.out_f,(notes[kk]/1.0):1:1,' ');
END;
Writeln (s46net.out_f);
Writeln (s46net.out_f,'T ',vnp_(s46net.vts^.dptr)^.v:1:1);
END;
ANSI_CUP(20,0);
Write(ii:4,' Max Current Ave. Binary ');
FOR kk := 1 TO 5 DO Write(notes[kk]:1);
Write(' ',vnp_(s46net.vts^.dptr)^.v:2:1);
ANSI_CUP(24,17);
FOR kk := 1 TO 5 DO Write(notes[kk]:1);
FOR kk := 3 TO 3 DO BEGIN
ANSI_CUP(20+kk,0);
sum[kk] := sum[kk] + tne[kk];
Write(kk:4,' ',error_m[kk]:5:3,' ',tne[kk]:5:3,
' ',(sum[kk]/ii):5:3,' ',binsum[kk]:3);
END;
Write(' FPOS: ',fpos:3,' FNEG: ',fneg:3);
IF (sp[ii-1].e < Random) THEN BEGIN
maintain_seq_pop(sp,ii-1,replace);
END;
END; {FOR ii}
FOR kk := 3 TO 3 DO BEGIN
ANSI_CUP(14+kk,0);
Write(kk:4,' ',error_m[kk]:5:3,' ',(sum[kk]/100):5:3,' ',
binsum[kk]:3);
END;
Write(' FPOS: ',fpos:3,' FNEG: ',fneg:3);
Done := (error_m[3] <= s46net.errtol);
Dump_BP_net_weights(s46net,s46net.wt_fname);
UNTIL (Done);
Close (s46net.out_f);
END.