function [yout,xout,it]=madb(W1,W2,xin,it_max)

%
% Rede Neural Dinâmica Bidirecional com atualizacoes assincronas
% (Arquitetura para a BAM e ABAM).
%
% Comando: [yout,xout,it]=madp(W1,W2,xin,it_max)
% 
% Entradas:
%        W1 - Matriz dos pesos sinápticos (direção x->y),
%        W2 - Matriz dos pesos sinápticos (direção y->x),
%       xin - Padrao de entrada,
%    it_max - número máximo de iterações (padrao: it_max=max(N,M), num. de neurônios),
%   
% Saídas:
% yout,xout - Padrões recordado pela memória associativa,
%        it - Número de iterações efetuadas,
%

% Número de neurônios da primeira camada,
M=size(W1,1);
% Número de neurônios da segunda camada,
N=size(W2,1);
% Entrada yin,
yin=sign(W1*xin);

% Define o número máximo de iterações,
if nargin<4
    it_max=max(N,M);
end

% it, conta o numero de iterações,
it=0;
% Usado como critério de parada:
Erro=1;
% Calcular até convergir ou até o número máximo de iterações,
while (Erro>1.e-4)&(it<it_max)
    % Conta o número da iterações,
    it=it+1;
    % xout,yout, serão o resultado no final da iteração,     
    xout=xin;
    yout=yin;
    % Escolhe uma seqüência de índices aleatoriamente,
    ind=randperm(N+M);
    % Para cada índice da seqüência gerada aleatoriamente, faça:
    for i=1:N+M
       % Calcula a ativação do neurônio com certo índice,
       if ind(i)<=M
          u=W1(ind(i),:)*xin;
          yout(ind(i))=sign(u);
          % Calcula a saída do neurônio e atualiza xout.
          % Se u=0, então y(t+1)_i = y(t)_i,
          if abs(u)<1.e-9 % Evitar erros de arredondamento! 
             yout(ind(i))=yin(ind(i));
          end
       else
          ind(i)=ind(i)-M;
          u=W2(ind(i),:)*yin;
          xout(ind(i))=sign(u);
          % Calcula a saída do neurônio e atualiza xout.
          % Se u=0, então x(t+1)_i = x(t)_i,
          if abs(u)<1.e-9 % Evitar erros de arredondamento! 
             xout(ind(i))=xin(ind(i));
          end
       end
    end
    % Calcula o erro,    
    Erro=max(norm(xout-xin),norm(yout-yin));
    % Atualiza x(t+1) e y(t+1),
    xin=xout; yin=yout;
 end