Code covered by the BSD License  

Highlights from
Fuzzy ARTMAP

image thumbnail
from Fuzzy ARTMAP by Massimiliano Versace
This package contains an implementation of Fuzzy ARTMAP.

ART_depleter_new(sampleNumber,weight_j,A,e_Attention,lambda_Attention,M,model_num,varargin)
function [out_e_Attention,out_A_Attention,out_x_Attention] = ART_depleter_new(sampleNumber,weight_j,A,e_Attention,lambda_Attention,M,model_num,varargin)
ON=1;OFF=0;

if nargin==8
    deplete_fast=varargin{1};
else
    deplete_fast=-1;
end


if (((model_num==26) ||  (model_num==28)) && (deplete_fast==0)) %(same as 22, but the mismatch comparison is different)
    %Same as 4, but no deplete in mismatch
    keep_dynamic_depleting=ON;
    e_AttentionTemp=e_Attention;
    dyn_count=1;
    while keep_dynamic_depleting==ON;
        %X_dash=max(weight_j-min(A,weight_j)-lambda_Attention*e_Attention,0);
        X_dash=min(max(A-lambda_Attention*e_AttentionTemp,0),weight_j);
        X_dashDoubled=X_dash+[X_dash(M+1:2*M,1) ; X_dash(1:M,1)];
        e_inc=.01*max(max(X_dashDoubled-sum(X_dash)/M,0)-e_AttentionTemp,0);
        e_AttentionTemp=e_AttentionTemp+e_inc;

        dyn_count=dyn_count+1;
        if (dyn_count==5000)
            disp('reached second threshold');
        end

        if (sum(e_inc)<.0001)
            keep_dynamic_depleting=OFF;
        end

    end
    out_e_Attention=e_AttentionTemp;
    out_A_Attention=max(A-lambda_Attention*e_AttentionTemp,0);
    out_x_Attention=min(out_A_Attention,weight_j);

end



if ((model_num==28) && (deplete_fast==1))  %FAST VERSION: SLOW VERSION COMMENTED OUT BELOW
    %Same as 4, but no deplete in mismatch
    keep_dynamic_depleting=ON;
    e_AttentionTemp=e_Attention;
    dyn_count=1;
    while keep_dynamic_depleting==ON;
        %X_dash=max(weight_j-min(A,weight_j)-lambda_Attention*e_Attention,0);
        X_dash=min(max(A-lambda_Attention*e_AttentionTemp,0),weight_j);
        X_dashDoubled=X_dash+[X_dash(M+1:2*M,1) ; X_dash(1:M,1)];
        e_AttentionPrev=e_AttentionTemp;
        A_prev=max(A-lambda_Attention*e_AttentionTemp,0)';
        e_AttentionTemp=max(max(X_dashDoubled-sum(X_dash)/M,0),e_AttentionTemp);
        A_curr=max(A-lambda_Attention*e_AttentionTemp,0)';
        out_e_Attention=e_AttentionTemp;
        out_A_Attention=max(A-lambda_Attention*e_AttentionTemp,0);
        out_x_Attention=min(max(A-lambda_Attention*e_AttentionTemp,0),weight_j);

        dyn_count=dyn_count+1;
        if (dyn_count==5000)
            disp('reached second threshold');
        end

        %if (sum(abs(e_AttentionPrev-e_AttentionTemp))<10^(-7))
        if (sum(abs(A_prev-A_curr))<10^(-7))
            keep_dynamic_depleting=OFF;
        end

    end

end



if (model_num==29) %(same (or almost the sam) as 28, but the MT formulation is different
    keep_dynamic_depleting=ON;
    e_AttentionTemp=e_Attention;
    dyn_count=1;
    while keep_dynamic_depleting==ON;
        %X_dash=max(weight_j-min(A,weight_j)-lambda_Attention*e_Attention,0);
        A_dep=max(A-lambda_Attention*e_AttentionTemp,0);
        X_dash=min(max(weight_j-lambda_Attention*e_AttentionTemp,0),max(A_dep-lambda_Attention*e_AttentionTemp,0));
        X_dashDoubled=X_dash+[X_dash(M+1:2*M,1) ; X_dash(1:M,1)];
        e_inc=.01*max(max(X_dashDoubled-sum(X_dash)/M,0)-e_AttentionTemp,0);
        e_AttentionTemp=e_AttentionTemp+e_inc;

        dyn_count=dyn_count+1;
        if (dyn_count==5000)
            disp('reached second threshold');
        end

        if (sum(e_inc)<.0001)
            keep_dynamic_depleting=OFF;
        end

    end
    out_e_Attention=e_AttentionTemp;
    out_A_Attention=max(A-lambda_Attention*e_AttentionTemp,0);
    out_x_Attention=min(out_A_Attention,weight_j);

end


if ((model_num==30) && (deplete_fast==0)) %SLOW VERSION (same (or almost the sam) as 28, but the MT formulation is different
    keep_dynamic_depleting=ON;
    e_AttentionTemp=e_Attention;
    dyn_count=1;
    while keep_dynamic_depleting==ON;
        %X_dash=max(weight_j-min(A,weight_j)-lambda_Attention*e_Attention,0
        %);
        X_dash=min(max(weight_j-lambda_Attention*e_AttentionTemp,0),max(A-lambda_Attention*e_AttentionTemp,0));
        X_dashDoubled=X_dash+[X_dash(M+1:2*M,1) ; X_dash(1:M,1)];
        e_inc=.01*max(max(X_dashDoubled-sum(X_dash)/M,0)-e_AttentionTemp,0);
        e_AttentionTemp=e_AttentionTemp+e_inc;

        dyn_count=dyn_count+1;
        if (dyn_count==5000)
            disp('reached second threshold');
        end

        if (sum(e_inc)<.0001)
            keep_dynamic_depleting=OFF;
        end

    end
    out_e_Attention=e_AttentionTemp;
    out_A_Attention=max(A-lambda_Attention*e_AttentionTemp,0);
    out_x_Attention=min(out_A_Attention,max(weight_j-lambda_Attention*e_AttentionTemp,0));
end


if ((model_num==30) && (deplete_fast==1))  %FAST VERSION:

    e_AttentionTemp=e_Attention;


    %X_dash=max(weight_j-min(A,weight_j)-lambda_Attention*e_Attention,0);
    X_dash=min(max(weight_j-lambda_Attention*e_AttentionTemp,0),max(A-lambda_Attention*e_AttentionTemp,0));
    X_dashDoubled=X_dash+[X_dash(M+1:2*M,1) ; X_dash(1:M,1)];
    e_AttentionTemp=max(max(X_dashDoubled-sum(X_dash)/M,0),e_AttentionTemp);
    out_e_Attention=e_AttentionTemp;
    out_A_Attention=max(A-lambda_Attention*e_AttentionTemp,0);
    out_x_Attention=min(max(A-lambda_Attention*e_AttentionTemp,0),max(weight_j-lambda_Attention*e_AttentionTemp,0));



end


if ((model_num==31) && (deplete_fast==0)) %SLOW VERSION (same (or almost the sam) as 28, but the MT formulation is different
    keep_dynamic_depleting=ON;
    e_AttentionTemp=e_Attention;
    dyn_count=1;
    if (lambda_Attention>0)
    while keep_dynamic_depleting==ON;
        %X_dash=max(weight_j-min(A,weight_j)-lambda_Attention*e_Attention,0
        %);
        X_dash=min(max(weight_j-lambda_Attention*e_AttentionTemp,0),max(A-lambda_Attention*e_AttentionTemp,0));
        X_dashDoubled=X_dash+[X_dash(M+1:2*M,1) ; X_dash(1:M,1)];
        e_inc=.0001*max(max(X_dashDoubled-sum(min(A,weight_j))/M,0)-e_AttentionTemp,0);
        e_AttentionTemp=e_AttentionTemp+e_inc;

        dyn_count=dyn_count+1;
        if (dyn_count==50000)
            disp('reached second threshold');
        end

        if (sum(e_inc)<.000001)
            keep_dynamic_depleting=OFF;
        end

    end
    out_e_Attention=e_AttentionTemp;
    out_A_Attention=max(A-lambda_Attention*e_AttentionTemp,0);
    out_x_Attention=min(out_A_Attention,max(weight_j-lambda_Attention*e_AttentionTemp,0));
    else
    out_e_Attention=e_AttentionTemp;
    out_A_Attention=A;
    out_x_Attention=min(A,weight_j);
        
    end
end




if ((model_num==31) && (deplete_fast==1))  %FAST VERSION:

    e_AttentionTemp=e_Attention;


    %X_dash=max(weight_j-min(A,weight_j)-lambda_Attention*e_Attention,0);
    X_dash=min(max(weight_j-e_AttentionTemp,0),max(A-e_AttentionTemp,0));
    X=min(weight_j,A);
    X_dashDoubled=X_dash+[X_dash(M+1:2*M,1) ; X_dash(1:M,1)];
    e_increasers=sign02(X_dashDoubled-sum(min(A,weight_j))/M);
    e_C_case=sign02(sum(X)/M-abs(X(1:M)-X(M+1:2*M)));
    e_C=.5*(X(1:M)+X(M+1:2*M)-sum(X)/M);
    e_A=(X(1:M)-sum(X)/M).*sign02(max(e_AttentionTemp(1:M),e_C)-X(M+1:2*M)).*(~e_C_case);
    e_B=(X(M+1:2*M)-sum(X)/M).*sign02(max(e_AttentionTemp(1:M),e_C)-X(1:M)).*(~e_C_case);
    e_C=e_C.*e_C_case;
    %        X_Doubled=X+[X(M+1:2*M,1) ; X(1:M,1)];
    e_new_possible=[e_A+e_B+e_C;e_A+e_B+e_C];
    if (sum((e_new_possible<e_AttentionTemp).*(e_new_possible>0).*(e_increasers))>0)
        error('Weirdness!');
    end
    out_e_Attention=e_AttentionTemp.*(~e_increasers)+e_increasers.*e_new_possible;
    out_A_Attention=max(A-out_e_Attention,0);
    out_x_Attention=min(max(A-out_e_Attention,0),max(weight_j-out_e_Attention,0));



end



if ((model_num==32) && (deplete_fast==0))  %SLOW VERSION NOT ACTUALLY SLOW:

    if lambda_Attention>0
        e_AttentionTemp=e_Attention;
        f_AttentionTemp=e_Attention.*lambda_Attention;

        %X_dash=max(weight_j-min(A,weight_j)-lambda_Attention*e_Attention,0);
        X_dash=min(max(weight_j-f_AttentionTemp,0),max(A-f_AttentionTemp,0));
        X=min(weight_j,A);
        e_increasers=sign02(X_dash-sum(min(A,weight_j))/(2*M)-e_AttentionTemp);
        f_new_possible=(X-sum(X)/(2*M))/(1+(1/lambda_Attention));
        e_new_possible=f_new_possible/lambda_Attention;
        f_new=f_AttentionTemp.*(~e_increasers)+e_increasers.*f_new_possible;
        if (sum((e_new_possible<e_AttentionTemp).*(e_new_possible>0).*(e_increasers))>0)
            error('Weirdness!');
        end
        out_e_Attention=f_new/lambda_Attention;
        out_A_Attention=max(A-lambda_Attention.*out_e_Attention,0);
        out_x_Attention=min(max(A-lambda_Attention.*out_e_Attention,0),max(weight_j-lambda_Attention.*out_e_Attention,0));
    else
        out_e_Attention=e_Attention;
        out_A_Attention=A;
        out_x_Attention=min(weight_j,A);
    end



end



if ((model_num==32) && (deplete_fast==1))  %FAST VERSION:

     e_AttentionTemp=e_Attention;
     f_AttentionTemp=e_Attention;

        %X_dash=max(weight_j-min(A,weight_j)-lambda_Attention*e_Attention,0);
        X_dash=min(max(weight_j-f_AttentionTemp,0),max(A-f_AttentionTemp,0));
        X=min(weight_j,A);
        e_increasers=sign02(X_dash-sum(min(A,weight_j))/(2*M)-e_AttentionTemp);
        f_new_possible=(X-sum(X)/(2*M));
        e_new_possible=f_new_possible;
        f_new=f_AttentionTemp.*(~e_increasers)+e_increasers.*f_new_possible;
        if (sum((e_new_possible<e_AttentionTemp).*(e_new_possible>0).*(e_increasers))>0)
            error('Weirdness!');
        end
        out_e_Attention=f_new;
        out_A_Attention=max(A-out_e_Attention,0);
        out_x_Attention=min(max(A-out_e_Attention,0),max(weight_j-out_e_Attention,0));


end

Contact us at files@mathworks.com