%  norepexold

%   This software is protected by german copyright and international treaties.             
%   Copyright 2004 Markus Junghöfer & Peter Peyk. All Rights Reserved.                     
%                                                                                          
%   THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE        
%   NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO,    
%   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE    
%   OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS,
%   TRADEMARKS OR OTHER RIGHTS. COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT,       
%   INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE      
%   OR DOCUMENTATION. 

clear all;
anzahlelemente1=input('anzahl verschiedener elemente in 1.Dimension?');
anzahlelemente2=input('anzahl verschiedener elemente in 2.Dimension?');
anzahlelemente=anzahlelemente1*anzahlelemente2;
if anzahlelemente1==1
                                                                     
    restanzahl=(anzahlelemente2-1);
elseif anzahlelemente2==1
    restanzahl=(anzahlelemente1-1);  
else
    restanzahl=(anzahlelemente1-1)*(anzahlelemente2-1);
end
    
    
sumvec=zeros(1,anzahlelemente);
negeyemat=-eye(anzahlelemente)+ones(anzahlelemente);
idvec=zeros(1,anzahlelemente);




%koordinaten umrechnen
zaehlmat=(linspace(1,anzahlelemente1,anzahlelemente1))';
for q=2:anzahlelemente2
   zaehlmat=[zaehlmat,(linspace(1,anzahlelemente1,anzahlelemente1)+(q-1)*anzahlelemente1)'];
end


    
    alternativen=zeros(anzahlelemente,restanzahl);
    for dings=1:anzahlelemente
        altindices=(find(zaehlmat>0))';
        gleichespalte=find(and(altindices>anzahlelemente1*floor(zaehlmat(dings)/(anzahlelemente1+0.00001)),altindices<=anzahlelemente1+anzahlelemente1*floor(zaehlmat(dings)/(anzahlelemente1+0.00001))));  
        gleichezeile=find(rem(altindices,anzahlelemente1)==rem(zaehlmat(dings),anzahlelemente1));
        anzahlspaltindices=size(gleichespalte);
        anzahlzeilindices=size(gleichezeile);
        equalindices=zeros(anzahlspaltindices(2),anzahlzeilindices(2));
      
        for t=1:anzahlspaltindices(2)
             equalindices(t,:)=(gleichespalte(t)==gleichezeile);
        end
        [equalspaltindices,equalzeilindices]=find(equalindices==1);
        gleichespalte(equalspaltindices)=[];
        if and(anzahlelemente1~=1,anzahlelemente2~=1)
            altindices([gleichespalte gleichezeile])=[];
        elseif anzahlelemente1==1
            altindices(gleichespalte)=[];
        elseif anzahlelemente2==1
            altindices(gleichezeile)=[];
        end
        for bums=1:restanzahl
      	    alternativen(dings,bums)=zaehlmat(altindices(bums));
        end
        alternativen(dings,:)=alternativen(dings,:);
    end


%signallaenge

if or(anzahlelemente1==1,anzahlelemente2==1)
    while 1
    disp(['signallaenge muss ein Vielfaches von ',num2str(anzahlelemente),' sein!']);
	signallaenge=input('signallänge?');
        if rem(signallaenge,anzahlelemente)==0
   	        break
	    else
            disp(['signallaenge muss ein Vielfaches von ',num2str(anzahlelemente),' sein!']);
        end
    end
    pause
else
    while 1
    disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
	signallaenge=input('signallänge?');
        if rem(signallaenge,anzahlelemente)==0   &    rem(signallaenge,restanzahl)==0
   	        break
	    else
            disp(['signallaenge muss ein gemeinsames Vielfaches von ',num2str(restanzahl),' und ',num2str(anzahlelemente),' sein!']);
        end
    end
end

intervall=(signallaenge/anzahlelemente)/restanzahl;


while sum(idvec)<anzahlelemente
   
%choicemat erstellen
   
choicemat=zeros(anzahlelemente,signallaenge/anzahlelemente);
for w=1:anzahlelemente
    helpreihe=randperm(signallaenge/anzahlelemente); 
      	for v=1:restanzahl
         	indices=and(helpreihe>intervall*(v-1),helpreihe<=intervall+intervall*(v-1));
         	helpreihe(indices)=v;
      	end
         
         for y=1:signallaenge/anzahlelemente
            choicemat(w,y)=alternativen(w,helpreihe(y));
         end
     
end
  
%anzahl überprüfen
choicematsumvec=zeros(1,anzahlelemente);
for n=1:anzahlelemente
  choicematsumvec(1,n)=sum(sum(choicemat==n));
end
choicematsumvec
pause

%reihe schreiben
reihe=zeros(1,signallaenge);
zaehler=ones(anzahlelemente,1);
reihe(1,1)=choicemat(1,1);


for k=2:signallaenge
   for m=1:anzahlelemente
      if reihe(1,k-1)==m
         vorher=m;
      end
   end
if zaehler(vorher,1)>signallaenge/anzahlelemente
	zaehler(vorher,1)=1;
end   
reihe(1,k)=choicemat(vorher,zaehler(vorher,1));
zaehler(vorher,1)=zaehler(vorher,1)+1;
zaehler;
end

%anzahl überprüfen

for n=1:anzahlelemente
   sumvec(1,n)=sum(reihe==n);
   idvec=(sumvec(1,1)==sumvec);
end
%sumvec
%pause
end
idvec
sumvec
pause


reihe=reihe';

%Uebergangswahrscheinlichkeiten
anzahlmat=zeros(signallaenge,anzahlelemente);
for k=1:anzahlelemente
anzahlmat(:,k)=(k==reihe(:,1));
end	
anzahlvec=sum(anzahlmat);
equalvec=(anzahlvec(1)==anzahlvec);

uewktmat=zeros(anzahlelemente);
for l=1:(signallaenge-1)
   for m=1:anzahlelemente
      for n=1:anzahlelemente
         if and(anzahlmat(l,m)==1,anzahlmat(l,m)==anzahlmat(l+1,n))
            uewktmat(m,n)=uewktmat(m,n)+1;
         end
      end
   end
end
uewktmat

%helpmat=uewktmat/negeyemat;
%helpmat=helpmat*(1/helpmat(1,1));
%distmat=helpmat-eye(anzahlelemente);
%dist=sum(sum(abs(distmat)));
%if dist<bestdist
%    bestdist=dist
%    bestreihemat=reihemat;
%    bestuewktmat=uewktmat
%end


