function [stimnummerncell,restliste,totwiederholung]=optimierkleinerreqs(anzahlnonmetkleinerreqs,kleinerreqsnonmet,cellstr,dim,restliste,kleinerreqs,celladressmat,anzahlsumvec,anzahlstimuli,totwiederholung,stimnummerncell,paramat,absolutreqs,kleinerreqsmetmat)
%   optimierkleinerreqs

%   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.                                                                      



%%%%%%%%%%%%%%
%kleinerreqs%%
%%%%%%%%%%%%%%
ignorerestlistestatus=0;
ignoretauschstatus=0;
erfuellt=0;
if~isempty(kleinerreqs{1,1})
if ~isempty(kleinerreqsnonmet)
for korrzaehler=1:anzahlnonmetkleinerreqs
    aktivecell1=kleinerreqs{kleinerreqsnonmet(korrzaehler),2};
    cellnummer1=find(celladressmat==aktivecell1);
    aktivecell2=kleinerreqs{kleinerreqsnonmet(korrzaehler),3};
    cellnummer2=find(celladressmat==aktivecell2);
    for dimzaehler=1:length(dim)
        if ~isempty(findstr(dim{dimzaehler},kleinerreqs{korrzaehler,4}))
            dimnummer=dimzaehler;
        end
    end
    %neues Item ziehen
    restliste=[];
    
    while erfuellt~=1 & not(ignorerestlistestatus==1 & ignoretauschstatus==1) 
        if anzahlsumvec(2)<anzahlstimuli & ignorerestlistestatus~=1 
            
            %restliste erstellen
            stimnummernliste=linspace(1,anzahlstimuli,anzahlstimuli);
            for g=1:length(totwiederholung)
                wegindexmat(g)=find(totwiederholung(g)==stimnummernliste);
            end
            restliste=stimnummernliste;
            restliste(wegindexmat)=[];
            repeatmat1=[];
            repeatmat2=[];
            repeatzaehler1=1;
            repeatzaehler2=1;
            notfound1=0;
            notfound2=0;
            while 1
                %item aus zelle ziehen
                if length(stimnummercell{cellnummer1})>length(repeatmat1)
                    while 1
                        z1=round(rand*(length(stimnummercell{cellnummer1})-1))+1;
                        itemnummer1=stimnummercell{cellnummer1}(z1);
                        if ~isempty(repeatmat1)
                            if isempty(find(repeatmat1==z1))
                                break
                            end
                        else 
                            break
                        end
                    end
                    repeatmat1(repeatzaehler1)=z1;
                    repeatzaehler1=repeatzaehler1+1;
                else
                   notfound1=1;
                end  
                
                %item aus restliste ziehen
                repeatmat2=[];
                repeatzaehler2=1;
                if length(restliste)>length(repeatmat2)
                        while 1
                            z2=round(rand*(length(restliste)-1))+1;
                            itemnummer2=restliste(z2);
                            if ~isempty(repeatmat2)
                                if isempty(find(repeatmat2==z2))
                                    break
                                end
                            else
                                break
                            end
                        end
                        repeatmat2(repeatzaehler2)=z2;
                        repeatzaehler2=repeatzaehler2+1;
               else
                        notfound2=1;
               end  
            
               if paramat(itemnummer2,dimnummer)<paramat(itemnummer1,dimnummer) checkabsreqs(itemnummer2,aktivecell1,stimnummercell,absolutreqs,dim,paramat)
                        stimnummercell{cellnummer1}(z1)=itemnummer2;
                        restliste(z2)=[];
                        totwiederholung(length(totwiederholung)+1)=itemnummer2;
                        totwiederholung(find(totwiederholung)==itemnummer1)=[];
                        erfuellt=1;
                        break
               end
            
               if notfound1==1
                        ignorerestlistestatus=1;
                        break
               end
           end
        
       %items vertauschen
       elseif anzahlsumvec(2)<=anzahlstimuli & ignoretauschstatus~=1
           
          if anzahlsumvec(2)>=anzahlstimuli
              ignorerestlistestatus=1;
          end
        
            repeatmat1=[];
            repeatmat2=[];
            repeatzaehler1=1;
            repeatzaehler2=1;
            notfound1=0;
            notfound2=0;
        
            while 1
                %item aus zelle1 ziehen
                if length(stimnummercell{cellnummer1})>length(repeatmat1)
                    while 1
                        z1=round(rand*(length(stimnummercell{cellnummer1})-1))+1;
                        itemnummer1=stimnummercell{cellnummer1}(z1);
                        if ~isempty(repeatmat1)
                            if isempty(find(repeatmat1==z1))
                                break
                            end
                        else
                            break
                        end
                    end
                    repeatmat1(repeatzaehler1)=z1;
                    repeatzaehler1=repeatzaehler1+1;
                else
                    notfound1=1;
                end  
                %item aus zelle2 ziehen
                repeatmat2=[];
                repeatzaehler2=1;
                if length(stimnummercell{cellnummer2})>length(repeatmat2)
                    while 1
                        z2=round(rand*(length(stimnummercell{cellnummer2})-1))+1;
                        itemnummer2=stimnummercell{cellnummer2}(z2);
                        if ~isempty(repeatmat2)
                            if isempty(find(repeatmat2==z2))
                                break
                            end
                        else
                            break
                        end
                    end
                    repeatmat2(repeatzaehler2)=z2;
                    repeatzaehler2=repeatzaehler2+1;
                else
                    notfound2=1;
                end
                
                if paramat(itemnummer2,dimnummer)<paramat(itemnummer1,dimnummer)...
                    & checkabsreqs(itemnummer2,aktivecell1,stimnummercell,absolutreqs,dim,paramat)...
                    & checkabsreqs(itemnummer1,aktivecell2,stimnummercell,absolutreqs,dim,paramat)
                    stimnummercell{cellnummer1}(z1)=itemnummer2;
                    stimnummercell{cellnummer2}(z2)=itemnummer1;
                    if ~isempty(restliste)
                        restliste(z2)=[];
                    end
                    erfuellt=1;
                    break
                end
            
                if notfound1==1;
                    ignoretauschstatus=1;
                    break
                end
            end
        else
            fprintf(1,'oh oh!');
            pause
            break
        end
    end
    if ignorerestlistestatus==1 & ignoretauschstatus==1 & erfuellt==0
        disp(['Bedingung ',num2str(aktivecell1),'<',num2str(aktivecell2),' auf ',dim{dimnummer},' konnte durch einfaches vertauschen nicht erfüllt werden']);
        nonmetstatus=nonmetstatus+1
    end    
end
end
end