function [stimnummerncell,restliste,totwiederholung]=optimiergleichreqs(anzahlnonmetgleichreqs,gleichreqsnonmet,cellstr,dim,restliste,gleichreqs,celladressmat,anzahlsumvec,anzahlstimuli,totwiederholung,stimnummerncell,paramat,absolutreqs,gleichreqsmetmat)
%   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.                                                                      

%%%%%%%%%%%%%%
%gleichreqs  %
%%%%%%%%%%%%%%
ignorerestlistestatus=0;
ignoretauschstatus=0;
erfuellt=0;
if ~isempty(gleichreqs{1,1})
if ~isempty(gleichreqsnonmet)
for korrzaehler=1:anzahlnonmetgleichreqs
    aktivecell1=gleichreqs{gleichreqsnonmet(korrzaehler),2};
    cellnummer1=find(celladressmat==aktivecell1);
    aktivecell2=gleichreqs{gleichreqsnonmet(korrzaehler),3};
    cellnummer2=find(celladressmat==aktivecell2);
    for dimzaehler=1:length(dim)
        if ~isempty(findstr(dim{dimzaehler},gleichreqs{korrzaehler,4}))
            dimnummer=dimzaehler;
        end
    end
    ignorerestlistestatus=0;
     ignoretauschstatus=0;
    restliste=[];
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %  gleichreqsmetmat(j,1)=1;  %  -->cell1 > cell2            %
    %  gleichreqsmetmat(j,1)=2;  %  -->cell1 < cell2            %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    
    if gleichreqsmetmat(gleichreqsnonmet(korrzaehler))==1 %cell1>cell2
     
     while erfuellt~=1 & not(ignorerestlistestatus==1 & ignoretauschstatus==1) 
         disp('hallo1');
         pause
        if anzahlsumvec(2)<anzahlstimuli 
            
            %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
                disp('hallo2');
                pause
               
                %item aus zelle ziehen
                if length(stimnummerncell{cellnummer1})>length(repeatmat1)
                    while 1
                        disp('hallo3');
                        pause
                        z1=round(rand*(length(stimnummerncell{cellnummer1})-1))+1;
                        itemnummer1=stimnummerncell{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;
                   break
                end                
            
                %item aus restliste ziehen
                repeatmat2=[];
                repeatzaehler2=1;
                if length(restliste)>length(repeatmat2)
                        while 1
                            disp('hallo4');
                            pause
                            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;
                        break
               end  
            
               if paramat(itemnummer2,dimnummer)<paramat(itemnummer1,dimnummer) & checkabsreqs(itemnummer2,aktivecell1,stimnummerncell,absolutreqs,dim,paramat)
                        stimnummerncell{cellnummer1}(z1)=itemnummer2;
                        if ~isempty(restliste)
                        restliste(z2)=[];
                        end
                        erfuellt=1;
                        totwiederholung(length(totwiederholung)+1)=itemnummer2;
                        totwiederholung(find(totwiederholung)==itemnummer1)=[];
                        break
               end
            
               if notfound1==1
                        ignorerestlistestatus=1;
                        break
               end
           end
        
       %items vertauschen
       elseif anzahlsumvec(2)<=anzahlstimuli | ignorerestlistestatus==1
         
        
            repeatmat1=[];
            repeatmat2=[];
            repeatzaehler1=1;
            repeatzaehler2=1;
            notfound1=0;
            notfound2=0;
        
            while 1
                disp('hallo5');
                pause
                %item aus zelle1 ziehen
                if length(stimnummerncell{cellnummer1})>length(repeatmat1)
                    while 1
                        disp('hallo6');
                        pause
                        z1=round(rand*(length(stimnummerncell{cellnummer1})-1))+1;
                        itemnummer1=stimnummerncell{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;
                    break
                end                
            
                %item aus zelle2 ziehen
                repeatmat2=[];
                repeatzaehler2=1;
                if length(stimnummerncell{cellnummer2})>length(repeatmat2)
                    while 1
                        disp('hallo7');
                        pause
                        z2=round(rand*(length(stimnummerncell{cellnummer2})-1))+1;
                        itemnummer2=stimnummerncell{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;
                    break
                end
            
                if paramat(itemnummer2,dimnummer)<paramat(itemnummer1,dimnummer)...
                    & checkabsreqs(itemnummer2,aktivecell1,stimnummerncell,absolutreqs,dim,paramat)...
                    & checkabsreqs(itemnummer1,aktivecell2,stimnummerncell,absolutreqs,dim,paramat)
                    stimnummerncell{cellnummer1}(z1)=itemnummer2;
                    stimnummerncell{cellnummer2}(z2)=itemnummer1;
                    if ~isempty(restliste)
                        restliste(z2)=[];
                    end
                    erfuellt=1;
                    break
                end
            
                if notfound1==1;
                    ignoretauschstatus=1;
                    break
                end
            end
        end
    end
    if ignorerestlistestatus==1 & ignoretauschstatus==1 
        disp(['Bedingung ',num2str(aktivecell1),'=',num2str(aktivecell2),' auf ',dim{dimnummer},' konnte durch einfaches vertauschen nicht erfüllt werden']);
        nonmetstatus=nonmetstatus+1; 
    end 
    
    
    else %cell1 < cell2
     while ignorerestlistestatus~=1 |  ignoretauschstatus~=1  
         disp('hallo8');
         pause
        if anzahlsumvec(2)<anzahlstimuli 
            
            %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
                disp('hallo9');
                pause
              
                %item aus zelle ziehen
                if length(stimnummerncell{cellnummer1})>length(repeatmat1)
                    while 1
                        disp('hallo10');
                        pause
                        z1=round(rand*(length(stimnummerncell{cellnummer1})-1))+1;
                        itemnummer1=stimnummerncell{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;
                   break
                end                
            
                %item aus restliste ziehen
                repeatmat2=[];
                repeatzaehler2=1;
                if length(restliste)>length(repeatmat2)
                        while 1
                            disp('hallo11');
                            pause
                            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;
                        break
               end  
            
               if paramat(itemnummer2,dimnummer)>paramat(itemnummer1,dimnummer) & checkabsreqs(itemnummer2,aktivecell1,stimnummerncell,absolutreqs,dim,paramat)
                        stimnummerncell{cellnummer1}(z1)=itemnummer2;
                        if ~isempty(restliste)
                        restliste(z2)=[];
                        end
                        erfuellt=1;
                        totwiederholung(length(totwiederholung)+1)=itemnummer2;
                        totwiederholung(find(totwiederholung)==itemnummer1)=[];
                        break
               end
            
               if notfound1==1
                        ignorerestlistestatus=1;
                        break
               end
           end
        
       %items vertauschen
       elseif anzahlsumvec(2)<=anzahlstimuli | ignorerestlistestatus==1
         
        
            repeatmat1=[];
            repeatmat2=[];
            repeatzaehler1=1;
            repeatzaehler2=1;
            notfound1=0;
            notfound2=0;
        
            while 1
                disp('hallo12');
                pause
                %item aus zelle1 ziehen
                if length(stimnummerncell{cellnummer1})>length(repeatmat1)
                    while 1
                        pause
                        z1=round(rand*(length(stimnummerncell{cellnummer1})-1))+1;
                        itemnummer1=stimnummerncell{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;
                    break
                end                
            
                %item aus zelle2 ziehen
                repeatmat2=[];
                repeatzaehler2=1;
                if length(stimnummerncell{cellnummer2})>length(repeatmat2)
                    while 1
                        disp('hallo13');
                        pause
                        z2=round(rand*(length(stimnummerncell{cellnummer2})-1))+1;
                        itemnummer2=stimnummerncell{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;
                    break
                end
            
                if paramat(itemnummer2,dimnummer)>paramat(itemnummer1,dimnummer)...
                    & checkabsreqs(itemnummer2,aktivecell1,stimnummerncell,absolutreqs,dim,paramat)...
                    & checkabsreqs(itemnummer1,aktivecell2,stimnummerncell,absolutreqs,dim,paramat)
                    stimnummerncell{cellnummer1}(z1)=itemnummer2;
                    stimnummerncell{cellnummer2}(z2)=itemnummer1;
                    if ~isempty(restliste)
                        restliste(z2)=[];
                    end
                    erfuellt=1;
                    break
                end
            
                if notfound1==1;
                    ignoretauschstatus=1;
                    break
                end
            end
        end
    end
    if ignorerestlistestatus==1 & ignoretauschstatus==1 
        disp(['Bedingung ',num2str(aktivecell1),'=',num2str(aktivecell2),' auf ',dim{dimnummer},' konnte durch einfaches vertauschen nicht erfüllt werden']);
        nonmetstatus=nonmetstatus+1; 
    end    
end
end
end
 
end

return