% Script for calling the gateway function AREBENCH.f, for generating
% the continuous and discrete-time AREs from the benchmark collection.
%

% RELEASE 2.0 of SLICOT Basic Systems and Control Toolbox.
% Based on SLICOT RELEASE 5.7, Copyright (c) 2002-2020 NICONET e.V.
%
% D. Sima, Sept. 2001.
%
% Revisions:
% V. Sima, March 2009.

dico = input('Continuous-time example: 1 (default) or discrete-time example: 2   '); 
disp(' ')
if isempty(dico), dico = 1; end
while ((dico<1) || (dico>2))
        dico = input('Example type (1:2)  ');
end
    
disp('Select the group number:')
disp('1 - parameter-free problems of fixed size (default)')
disp('2 - parameter-dependent problems of fixed size')
disp('3 - examples of scalable size without parameters')
disp('4 - parameter-dependent examples of scalable size')
nr1 = input('Group number (1:4)  ');
disp(' ')
if isempty(nr1)
    nr1 = 1; 
end
while ((nr1<1) || (nr1>4))
        nr1 = input('Group number (1:4)  ');
end

if (dico==1)
    % CARE
    ex = [6 9 2 4];
    nr2 = input(['Select the example number (1:',num2str(ex(nr1)),')  ']);
    disp(' ')
    if isempty(nr2) 
        nr2 = 1; 
    end
    while (nr2<1) || (nr2>ex(nr1))
        nr2 = input(['Select the example number (1:',num2str(ex(nr1)),')  ']);
    end
    
    formG = input('Obtain G in unfactored form (1) or as B and R (0-default)?  ');
    disp(' ')
    if isempty(formG) || ((formG~=1) && (formG~=0)) 
        formG = 0; 
    end
    formQ = input('Obtain Q in unfactored form (1) or as C and W (0-default)?  ');
    disp(' ')
    if isempty(formQ) || ((formQ~=1) && (formQ~=0)) 
        formQ = 0; 
    end
   
    switch nr1
    case 1,
        if (formG==1)
            if (formQ==1)
                [X,A,G,Q] = arebench(1,1,nr2);
            else 
                [X,A,G,W,C] = arebench(1,1,nr2,[1 0]);
            end
        else 
            if (formQ==1)
                [X,A,R,Q,B] = arebench(1,1,nr2,[0 1]);
            else 
                [X,A,R,W,B,C] = arebench(1,1,nr2,[0 0]);
            end
        end
    case 2,
        epsilon = input('Epsilon: (press Enter to use the default value)'  );
        disp(' ')
        if isempty(epsilon)
            if (formG==1)
                if (formQ==1)
                    [X,A,G,Q] = arebench(1,2,nr2);
                else 
                    [X,A,G,W,C] = arebench(1,2,nr2,[1 0]);
                end
            else 
                if (formQ==1)
                    [X,A,R,Q,B] = arebench(1,2,nr2,[0 1]);
                else 
                    [X,A,R,W,B,C] = arebench(1,2,nr2,[0 0]);
                end
            end
        else if (formG==1)
                if (formQ==1)
                    [X,A,G,Q] = arebench(1,2,nr2,[1 1],epsilon);
                else 
                    [X,A,G,W,C] = arebench(1,2,nr2,[1 0],epsilon);
                end
            else 
                if (formQ==1)
                    [X,A,R,Q,B] = arebench(1,2,nr2,[0 1],epsilon);
                else 
                    [X,A,R,W,B,C] = arebench(1,2,nr2,[0 0],epsilon);
                end
            end
        end
    case 3,
        sizeN = input('The scalable size N: (press Enter to use the default value)  ');
        disp(' ')
        if isempty(sizeN)
            if (formG==1)
                if (formQ==1)
                    [X,A,G,Q] = arebench(1,3,nr2);
                else 
                    [X,A,G,W,C] = arebench(1,3,nr2,[1 0]);
                end
            else 
                if (formQ==1)
                    [X,A,R,Q,B] = arebench(1,3,nr2,[0 1]);
                else 
                    [X,A,R,W,B,C] = arebench(1,3,nr2,[0 0]);
                end
            end
        else 
            if (formG==1)
                if (formQ==1)
                    [X,A,G,Q] = arebench(1,3,nr2,[1 1],[],sizeN);
                else 
                    [X,A,G,W,C] = arebench(1,3,nr2,[1 0],[],sizeN);
                end
            else 
                if (formQ==1)
                    [X,A,R,Q,B] = arebench(1,3,nr2,[0 1],[],sizeN);
                else 
                    [X,A,R,W,B,C] = arebench(1,3,nr2,[0 0],[],sizeN);
                end
            end
        end
    otherwise, 
        switch nr2
        case 1,
            sizeN = input('The scalable size N: (press Enter to use the default value)  ');
            disp(' ')
            if ~isempty(sizeN)
                q = input('Parameter q: ');
                disp(' ')
                r = input('Parameter r: ');
                disp(' ')
                param = [q r];
            else param = [];    
            end
        case 2,
            sizeN = input('The scalable size N: (press Enter to use the default value)  ');
            disp(' ')
            if ~isempty(sizeN)
                a = input('Parameter a: ');
                disp(' ')
                b = input('Parameter b: ');
                disp(' ')
                c = input('Parameter c: ');
                disp(' ')
                beta1 = input('Parameter beta1: ');
                disp(' ')
                beta2 = input('Parameter beta2: ');
                disp(' ')
                gam1 = input('Parameter gamma1: ');
                disp(' ')
                gam2 = input('Parameter gamma2: ');
                disp(' ')
                param = [a b c beta1 beta2 gam1 gam2];
            else param = [];    
            end
        case 3,
            sizeN = input('The scalable size N: (press Enter to use the default value)  ');
            disp(' ')
            if ~isempty(sizeN)
                mu = input('Parameter mu: ');
                disp(' ')
                delta = input('Parameter delta: ');
                disp(' ')
                ka = input('Parameter kappa: ');
                disp(' ')
                param = [mu delta ka];
            else param = [];    
            end  
        otherwise,    
            sizeN = input('The scalable size N: (press Enter to use the default value)  ');
            disp(' ')
        end
        
        if isempty(sizeN)
            if (formG==1)
                if (formQ==1)
                    [X,A,G,Q] = arebench(1,4,nr2,[1 1]);
                else 
                    [X,A,G,W,C] = arebench(1,4,nr2,[1 0]);
                end
            else if (formQ==1)
                    [X,A,R,Q,B] = arebench(1,4,nr2,[0 1]);
                 else 
                    [X,A,R,W,B,C] = arebench(1,4,nr2,[0 0]);
                 end
            end
        else if (formG==1)
                 if (formQ==1)
                     [X,A,G,Q] = arebench(1,4,nr2,[1 1],param,sizeN);
                 else 
                     [X,A,G,W,C] = arebench(1,4,nr2,[1 0],param,sizeN);
                 end
             else if (formQ==1)
                     [X,A,R,Q,B] = arebench(1,4,nr2,[0 1],param,sizeN);
                 else 
                     [X,A,R,W,B,C] = arebench(1,4,nr2,[0 0],param,sizeN);
                 end
             end
        end
    end
%
else
    % DAREs
    ex = [13 5 0 1];
    if (nr1==3) 
        disp('Section empty')
        break
    end
    nr2 = input(['Select the example number (1:',num2str(ex(nr1)),')  ']);
    disp(' ')
    if isempty(nr2) 
        nr2 = 1;
    end
    while (nr2<1) || (nr2>ex(nr1))
        nr2 = input(['Select the example number (1:',num2str(ex(nr1)),')  ']);
    end
    
    formG = input('Obtain G in unfactored form (1) or as B and R (0-default)?  ');
    disp(' ')
    if isempty(formG) || ((formG~=1) && (formG~=0)) 
        formG = 0;
    end
    formQ = input('Obtain Q in unfactored form (1) or as C and W (0-default)?  ');
    disp(' ')
    if isempty(formQ) || ((formQ~=1) && (formQ~=0)) 
        formQ = 0;
    end
    formS = input('Return S (1=yes, 0=no (default))?'  );
    disp(' ')
    if isempty(formS) || ((formS~=1) && (formS~=0)) 
        formS = 0;
    end

    switch nr1
    case 1,
        if (formG==1)
            if (formQ==1)
                if (formS==1)
                    [X,A,G,Q,S] = arebench(2,1,nr2);
                else 
                    [X,A,G,Q] = arebench(2,1,nr2,[1 1 0]);
                end
            else
                if (formS==1)
                    [X,A,G,W,C,S] = arebench(2,1,nr2,[1 0 1]);
                else 
                    [X,A,G,W,C] = arebench(2,1,nr2,[1 0 0]);
                end
            end
        else 
            if (formQ==1)
                if (formS==1)
                    [X,A,G,Q,S] = arebench(2,1,nr2,[0 1 1]);
                else 
                    [X,A,G,Q] = arebench(2,1,nr2,[0 1 0]);
                end
            else
                if (formS==1)
                    [X,A,G,W,C,S] = arebench(2,1,nr2,[0 0 1]);
                else 
                    [X,A,G,W,C] = arebench(2,1,nr2,[0 0 0]);
                end
            end
        end
   case 2,
       if (nr2<5)
        delta = input('delta: (press Enter to use the default value)  ');
        disp(' ')
        if isempty(delta)
            if (formG==1)
                if (formQ==1)
                    if (formS==1)
                        [X,A,G,Q,S] = arebench(2,2,nr2);
                    else 
                        [X,A,G,Q] = arebench(2,2,nr2,[1 1 0]);
                    end
                else
                    if (formS==1)
                        [X,A,G,W,C,S] = arebench(2,2,nr2,[1 0 1]);
                    else 
                        [X,A,G,W,C] = arebench(2,2,nr2,[1 0 0]);
                    end
                end
            else 
                if (formQ==1)
                    if (formS==1)
                        [X,A,G,Q,S] = arebench(2,2,nr2,[0 1 1]);
                    else 
                        [X,A,G,Q] = arebench(2,2,nr2,[0 1 0]);
                    end
                else
                    if (formS==1)
                        [X,A,G,W,C,S] = arebench(2,2,nr2,[0 0 1]);
                    else 
                        [X,A,G,W,C] = arebench(2,2,nr2,[0 0 0]);
                    end
                end
            end
        else
            if (formG==1)
                if (formQ==1)
                    if (formS==1)
                        [X,A,G,Q,S] = arebench(2,2,nr2,[1 1 1],delta);
                    else 
                        [X,A,G,Q] = arebench(2,2,nr2,[1 1 0],delta);
                    end
                else
                    if (formS==1)
                        [X,A,G,W,C,S] = arebench(2,2,nr2,[1 0 1],delta);
                    else 
                        [X,A,G,W,C] = arebench(2,2,nr2,[1 0 0],delta);
                    end
                end
            else 
                if (formQ==1)
                    if (formS==1)
                        [X,A,G,Q,S] = arebench(2,2,nr2,[0 1 1],delta);
                    else 
                        [X,A,G,Q] = arebench(2,2,nr2,[0 1 0],delta);
                    end
                else
                    if (formS==1)
                        [X,A,G,W,C,S] = arebench(2,2,nr2,[0 0 1],delta);
                    else 
                        [X,A,G,W,C] = arebench(2,2,nr2,[0 0 0],delta);
                    end
                end
            end
        end
       else
        tau = input('Parameter tau: (press Enter to use the default value)  ');
        disp(' ')
        if isempty(tau)
            if (formG==1)
                if (formQ==1)
                    if (formS==1)
                        [X,A,G,Q,S] = arebench(2,2,nr2);
                    else 
                        [X,A,G,Q] = arebench(2,2,nr2,[1 1 0]);
                    end
                else
                    if (formS==1)
                        [X,A,G,W,C,S] = arebench(2,2,nr2,[1 0 1]);
                    else 
                        [X,A,G,W,C] = arebench(2,2,nr2,[1 0 0]);
                    end
                end
            else 
                if (formQ==1)
                    if (formS==1)
                        [X,A,G,Q,S] = arebench(2,2,nr2,[0 1 1]);
                    else 
                        [X,A,G,Q] = arebench(2,2,nr2,[0 1 0]);
                    end
                else
                    if (formS==1)
                        [X,A,G,W,C,S] = arebench(2,2,nr2,[0 0 1]);
                    else 
                        [X,A,G,W,C] = arebench(2,2,nr2,[0 0 0]);
                    end
                end
            end
        else
            D = input('Parameter D: ');
            disp(' ')
            K = input('Parameter K: ');
            disp(' ')
            r = input('Parameter r: ');
            disp(' ')
            param = [tau D K r];
            if (formG==1)
                if (formQ==1)
                    if (formS==1)
                        [X,A,G,Q,S] = arebench(2,2,nr2,[1 1 1],param);
                    else 
                        [X,A,G,Q] = arebench(2,2,nr2,[1 1 0],param);
                    end
                else
                    if (formS==1)
                        [X,A,G,W,C,S] = arebench(2,2,nr2,[1 0 1],param);
                    else 
                        [X,A,G,W,C] = arebench(2,2,nr2,[1 0 0],param);
                    end
                end
            else 
                if (formQ==1)
                    if (formS==1)
                        [X,A,G,Q,S] = arebench(2,2,nr2,[0 1 1],param);
                    else 
                        [X,A,G,Q] = arebench(2,2,nr2,[0 1 0],param);
                    end
                else
                    if (formS==1)
                        [X,A,G,W,C,S] = arebench(2,2,nr2,[0 0 1],param);
                    else 
                        [X,A,G,W,C] = arebench(2,2,nr2,[0 0 0],param);
                    end
                end
            end
        end
       end
    case 4,
        sizeN = input('The scalable size N: (press Enter to use the default value)  ');
        disp(' ')
        if isempty(sizeN)
            if (formG==1)
                if (formQ==1)
                    if (formS==1)
                        [X,A,G,Q,S] = arebench(2,4,nr2);
                    else 
                        [X,A,G,Q] = arebench(2,4,nr2,[1 1 0]);
                    end
                else
                    if (formS==1)
                        [X,A,G,W,C,S] = arebench(2,4,nr2,[1 0 1]);
                    else 
                        [X,A,G,W,C] = arebench(2,4,nr2,[1 0 0]);
                    end
                end
            else                     
                if (formQ==1)
                    if (formS==1)
                        [X,A,G,Q,S] = arebench(2,4,nr2,[0 1 1]);
                    else 
                        [X,A,G,Q] = arebench(2,4,nr2,[0 1 0]);
                    end
                else
                    if (formS==1)
                        [X,A,G,W,C,S] = arebench(2,4,nr2,[0 0 1]);
                    else 
                        [X,A,G,W,C] = arebench(2,4,nr2,[0 0 0]);
                    end
                end
            end
        else
            r = input('Parameter r: ');
            disp(' ')
            if (formG==1)
                if (formQ==1)
                    if (formS==1)
                        [X,A,G,Q,S] = arebench(2,4,nr2,[1 1 1],r,sizeN);
                    else 
                        [X,A,G,Q] = arebench(2,4,nr2,[1 1 0],r,sizeN);
                    end
                else
                    if (formS==1)
                        [X,A,G,W,C,S] = arebench(2,4,nr2,[1 0 1],r,sizeN);
                    else 
                        [X,A,G,W,C] = arebench(2,4,nr2,[1 0 0],r,sizeN);
                    end
                end
            else 
                if (formQ==1)
                    if (formS==1)
                        [X,A,G,Q,S] = arebench(2,4,nr2,[0 1 1],r,sizeN);
                    else 
                        [X,A,G,Q] = arebench(2,4,nr2,[0 1 0],r,sizeN);
                    end
                else
                    if (formS==1)
                        [X,A,G,W,C,S] = arebench(2,4,nr2,[0 0 1],r,sizeN);
                    else 
                        [X,A,G,W,C] = arebench(2,4,nr2,[0 0 0],r,sizeN);
                    end
                end
            end
        end
    end
end