function [ LIB, K ] = LibraryGenerator( CPERM,CCOUNT,BIT )

%Funkce ma za ucel z matice cyklickych permutaci vybrat uzivatelem zadany
%pocet permutaci, ktere nejlepe splnuji stanovene podminky

for i=1:size(CPERM,1);                                                      %vedlejsi kriterium - pocet prechodu bitu v kodu
    
    t = [CPERM(i,:),CPERM(i,:)];
    
    for j=1:BIT
        
        if t(j)==t(j+1);
            
            Kv1(i,j) =0 ;
            
        else
            
            Kv1(i,j) = 1;
        end
        
    end
    
end

Kv = sum(Kv1,2)/(2*BIT);                                                    %hodnota vedlejsiho kriteria

K1 = sum(CPERM,2);                                                          %kriterium 1 - rozliseni jednotlivych znacek od 00000000

K2 = BIT*ones(size(K1))-K1;                                                 %kriterium 2 - rozliseni jednotlivych znacek od 111111111

for i=1:size(Kv);                                                           %vlozeni prvniho radku do matice vybranych kalibracnich znacek Af - platna zatim jen dve vyse uvedena kriteria, knihovna je zatim prazdna
    
    if Kv(i)==max(Kv);
        
        LIB(1,:) = CPERM(i,:);
        
        break;
        
    end;
    
end;




while size(LIB,1)<CCOUNT;                                                   %kriterium 3 - maximalni Hammingova vzdalenost mezi prvky v knihovne                                                         
    
    for l=1:size(LIB);                                                       
        
        for k=1:size(CPERM,1);                                              %pro kazdy kod v knihovne l, pro kazdou cykl. permutaci k
            
            g = CPERM(k,:);
            
            for i=1:BIT;                                                    %vygenerovani "rotaci" 
                
                        g = [g(BIT),g];
                        
                        g(BIT+1) = [];
                
                for j=1:BIT;                                                %porovna dany prvek LIB s prvkem "rotace" g
                    
                    if LIB(l,j)==g(j);
                        
                        K31(i,j) = 0;
                        
                    else;
                        
                        K31(i,j) = 1;
                        
                    end;
                    
                end;
                
            end;
            
            K3(k,l) = min(sum(K31,2));
            
        end;
        
    end;
    
    Kmat = [K1+Kv, K2+Kv, K3+Kv];                                           %matice rozliseni shrnujici kriteria - vybere se z ni minimum - tzn. hodnota nejmene splenenho kriteria kazde znacky
      
    Kmin = min(Kmat,[],2);
    
    K = max(Kmin);                                                          %vybere se znacka, ktera nejlepe splnuje vsechny kriteria a zapise se do knihovny, cely proces vypoctu shodnosti s prvky v knihovne pokracuje znovu, az je vybranych znacek pozadovane mnozstvi
    
    for i=1:size(Kmin);                                                     %zjisteni indexu dane znacky
        
        if K==Kmin(i);
            
            count=i;
            
            break;
            
        end;
        
    end;
    
    LIB(size(LIB,1)+1,:) = CPERM(count,:);                                  %ulozeni nejvhodnejsi znacky do knihovny
    
end;

end

