program HAMMING(input,output);{$R-} {$S-} { direttive per il compilatore }uses crt,graph;
{ pacchetti grafici standard TurboPascal 4.0 }const N = 100;
{ n. nodi di ingresso } M = 9;
{ n.nodi intermedi=n.nodi di uscita=n.di classi } { non oltre 10 per ragioni grafiche } EPSILON = 0.09;
{ costante, deve essere < di 1/M }type indice_ingressi = 1..N;
indice_uscite = 1..M;
valori_ingressi = -1..1;
reticolo = array[indice_ingressi] of valori_ingressi;var W : array[indice_ingressi,indice_uscite] of real;
{ pesi delle connessioni tra i nodi di ingresso e quelli intermedi } THETA : array[indice_uscite] of real;
{ soglie dei nodi intermedi } T : array[indice_uscite,indice_uscite] of real;
{ pesi delle connessioni tra i nodi della sottorete upper } MU,MU_TEMP : array[indice_uscite] of real;
{ uscite dei nodi della sottorete upper } X : reticolo;
{ ingressi della rete } GR_CORRUZ : real;
{ grado di corruzione del pattern incognito } modello : indice_uscite;
ingresso : indice_ingressi;
somma : real;
stringa : string;
iterazione : integer;
i,j,col : integer;{$I HAMMING.UTI} { includo la sezione grafica }function f_thres( ALFA : real ): real;{ function threshold logic without saturation }begin
if ALFA<0 then
f_thres:=0 else
f_thres:=ALFA;
end;
{ of f_thres }function min(x,y : integer):integer;
begin
if x<y then
min:=x else
min:=y;
end;
{ of min }procedure step0;
{ inizializzazione }begin
inizschermo;
{ inizializzo il modo grafico } stile(1);stampa(1,240,'Hamming Net');
{ stampo il titolo } { visualizzo i modelli disponibili } stile(0);stampa(40,10,'Modelli disponibili:');
col:=10;
for modello:=1 to min(6,M)do
begin
pattern(modello,X);
griglia(X,50,col);stampa_int(125,col+40,modello);
col:=col+90;
end;
col:=10;
for modello:=7 to min(10,M)do
begin
pattern(modello,X);
griglia(X,150,col);stampa_int(225,col+40,modello);
col:=col+90;
end;
end;
{ of step0 }procedure step1;
{ assegno i pesi delle connessioni e degli offsets }begin
{ in the lower subnet } for modello:=1 to Mdo
begin
pattern(modello,X);
{ leggo il pattern modello } for ingresso:=1 to Ndo
W[ingresso,modello]:=X[ingresso]/2;
THETA[modello]:=-N/2;
end;
{ in the upper subnet } for i:=1 to Mdo
for j:=1 to Mdo
if i=j then
T[i,j]:=1 else
T[i,j]:=-EPSILON;
end;
{ of step1 }procedure step2;
{ inizializzo con pattern d'ingresso ignoti }begin
{ scelgo il modello e il grado di corruzione } leggimodello(modello,GR_CORRUZ);
pattern(modello,X);
{ carico il modello } { corrompo effettivamente il modello } for ingresso:=1 to Ndo
if random<GR_CORRUZ then
X[ingresso]:=-X[ingresso];
griglia(X,150,425);
{ visualizzo il pattern corrotto } { lo applico all'ingresso } for j:=1 to Mdo
begin
somma:=-THETA[j];
for i:=1 to Ndo
somma:=somma+W[i,j]*X[i];
MU[j]:=f_thres(somma);
end;
iterazione:=1;
end;
{ of step2 }procedure step3;
{ itero }begin
for i:=1 to Mdo
begin
somma:=-MU[i];
for j:=1 to Mdo
somma:=somma+MU[j];
MU_TEMP[i]:=f_thres(MU[i]-EPSILON*somma);
end;
MU:=MU_TEMP;
visualizzauscita;
iterazione:=iterazione+1;
end;
{ of step3 }begin
{ of program } step0;
{ inizializzazione } step1;
{ assegno i pesi delle connessioni e degli offsets } repeat step2;
{ inizializzo con un pattern d'ingresso ignoto } repeat step3;
{ iterazioni } stringa:=upcase(readkey);
until (stringa='N') or (stringa='E');
until (stringa='E');
RestoreCRTmode;
end.
{ of program }