function [inds]=findindforrep(mat1,mat2,outmat,anzahlwiederholungen,berichtstatus)

%   findindforrep

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


% findindforrep([1 1 1 1 1 1],[2 2 2 2 2 2 2 2 2 2 2],[1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2],1,1)
indssort=[];

%indices ziehen
%-----------------
inds=shuffle(linspace(1,length(outmat),length(outmat)));
inds=sort(inds(1:length(mat1)));

%wenn wiederholungsbeschränkt
%---------------------------
if anzahlwiederholungen~=-1
	problemstellenvec=[];
	problemstellenzaehler=1;
	resourcestellenvec=[];
	resourcestellenzaehler=1;
	check=[];
	diffs = diff(inds);
	%problempos finden
	%---------------------
	for i=1:length(mat1)
        diffmat=zeros(anzahlwiederholungen+(anzahlwiederholungen-2),1);
        groessediffmat = anzahlwiederholungen+(anzahlwiederholungen-2);
        if anzahlwiederholungen == 1
            if i<=length(diffs)
                diffmat=diffs(i);
            else
                diffmat=0;
            end
        end
        for j=1:anzahlwiederholungen-1
            %upper
            if i+j-1<length(diffs)
                if groessediffmat/2+j<=length(diffmat)
                    diffmat(groessediffmat/2+j)=diffs(i+j-1);
                end
            end
            %lower
            if i-j>0
                if groessediffmat/2+1-j>0
                    diffmat(groessediffmat/2+1-j)=diffs(i-j*1);
                end
            end  
        end
        evalstring='diffmat==1';
        for t=1:anzahlwiederholungen-1
            evalstring=['diff(find(',evalstring,'))==1'];
        end
        evalstring=['if ~isempty(find(',evalstring,'));',...
                'problemstellenvec(problemstellenzaehler)=i;problemstellenzaehler=problemstellenzaehler+1;end'];
        if sum(1==diffmat)>=anzahlwiederholungen-1
             warning off
             eval(evalstring);
             warning on
        end
	end
	%resourcenpos finden
	%--------------------
	resourcenstellenvec=[];
	indshelp=inds;
	if inds(1)~=1;indshelp=[-1,indshelp];end
	if inds(end)~=length(outmat);indshelp=[indshelp,length(outmat)+2];end
	diffinds=diff(indshelp);
	resourcenzaehler=1;
	naechsteserie=1;
	resourcenstellen=find(diffinds>3);
    sonderresourcen=find(diffinds==3);
    for q=1:length(sonderresourcen)
        sonderresourcenstellenvec(q)=indshelp(sonderresourcen(q));
    end

	for i=1:length(resourcenstellen)
        naechsteserie = 1;
        serienabschnitte = 0;
        while naechsteserie == 1
            naechsteserie = 0;
            serienzaehler = 1;
            while serienzaehler<=anzahlwiederholungen & serienzaehler<diffinds(resourcenstellen(i))-2
                resourcenstellenvec(resourcenzaehler)=indshelp(resourcenstellen(i))+1+serienzaehler+serienabschnitte;
                resourcenzaehler=resourcenzaehler+1;
                serienzaehler = serienzaehler + 1; 
            end
            if indshelp(resourcenstellen(i))+1+serienabschnitte + serienzaehler + 1 < indshelp(resourcenstellen(i)+1)-1
                naechsteserie = 1;
                serienabschnitte=serienabschnitte + serienzaehler;
            end
        end
	end
	%abbruch
	%-------
	if ~isempty(problemstellenvec)
        if isempty(resourcenstellenvec)
            if berichtstatus == 1
                inds
                problemstellenvec
                resourcenstellen
                uiwait(errordlg('Verteilung der <mergemat> unter geforderten Wiederholungsbedingungen schwierig in findindforrep.m!','Achtung:'));
            end
            inds=[];
            return;
        end
    else
        if berichtstatus ==1
            uiwait(msgbox('Alles klar in findindforrep.m!','Gute Nachricht:'));
        end
        
        return
	end
    
	if berichtstatus == 1
		length(problemstellenvec)
		indini=inds
	end        
    
	%problempos auf resourcenpos verteilen
	%------------------------------------
	anzahloptimierungsdurchgaenge=1;
	if berichtstatus == 1
        disp([num2str(length(problemstellenvec)),' verbleibende Problemstellen...']);
	end
	problemstellenvectmp=problemstellenvec;
    tryagain = 0;
    trysonderresourcenstatus = 0;
    durchgangzaehler=1;
	%Optimierung
	%-----------------
	while length(problemstellenvec)>0
        
        
            
        %Abbruch ermöglichen
        %--------------------
        durchgangzaehler=durchgangzaehler+1;
        if mod(durchgangzaehler,200)==0
%             answer=questdlg('Optimierung in findindforrep wiederholt nicht erfolgreich! Weitersuchen?','findindforrep:','ja','nein','debug','ja');
%             if strcmp(answer,'nein')
                inds=[];
                return
%             elseif strcmp(answer,'debug')
%                 dbstop if error
%                 asdfkjdf
%             end
        end
        
        
%         if tryagain==1 & trysonderresourcenstatus ==1
%             if berichtstatus ==1
%                 uiwait(errordlg('findindforrep nicht erfolgreich!','Achtung:'));
%             end
%             inds=[];
%             return
%         end
        
        
        indstmp=inds;
        anzahlresourcenstellen = length(resourcenstellenvec);
        anzahlproblemstellen = length(problemstellenvec);
        
        %Normale Resourcen
        %---------------------
        if anzahlresourcenstellen~=0
            if tryagain==0
                anzahlresourcenstellen = length(resourcenstellenvec);
                anzahlproblemstellen = length(problemstellenvec);
                tryagainzaehler=1;
                indstmp(problemstellenvec(tryagainzaehler))=resourcenstellenvec(tryagainzaehler);
            elseif tryagain==1
                tryagainzaehler=tryagainzaehler+1;
                if floor(tryagainzaehler/anzahlresourcenstellen)+1>anzahlproblemstellen
                    trysonderresourcenstatus = 1;
                end
                if trysonderresourcenstatus ==0
                    indstmp(problemstellenvec(floor(tryagainzaehler/anzahlresourcenstellen)+1))=resourcenstellenvec(mod(tryagainzaehler,anzahlresourcenstellen)+1);
                end 
            end
        else
           trysonderresourcenstatus = 1;
        end
       
        %Sonderresourcen
        %---------------
        if trysonderresourcenstatus == 1
            if berichtstatus == 1
                fprintf('Sonderresourcen...');
            end
            for sonderresourcenzaehler=1:length(sonderresourcen)-1
                indstmp(sonderresourcen(sonderresourcenzaehler)+1:end)=indstmp(sonderresourcen(sonderresourcenzaehler)+1:end)-1;
            end
        end
        
        %Sackgasse
        %-----------
        if ~isempty(find(finddiffel(inds,1)>1))
            inds=shuffle(linspace(1,length(outmat),length(outmat)));
            inds=sort(inds(1:length(mat1)));
            indstmp=inds;
        end
            
        indssort=sort(indstmp);
        diffs = diff(indssort);
        
		%problemposveränderung testen
		%----------------------------
		problemstellenvectmp=[];
		problemstellenzaehlertmp=1;
		for i=1:length(mat1)
            diffmat=zeros(anzahlwiederholungen+(anzahlwiederholungen-2),1);
            groessediffmat = anzahlwiederholungen+(anzahlwiederholungen-2);
            if anzahlwiederholungen == 1
                if i<=length(diffs)
                    diffmat=diffs(i);
                else
                    diffmat=0;
                end
            end
            for j=1:anzahlwiederholungen-1
                %upper
                if i+j-1<length(diffs)
                    if groessediffmat/2+j<=length(diffmat)
                        diffmat(groessediffmat/2+j)=diffs(i+j-1);
                    end
                end
                %lower
                if i-j>0
                    if groessediffmat/2+1-j>0
                        diffmat(groessediffmat/2+1-j)=diffs(i-j*1);
                    end
                end  
            end
            evalstring='diffmat==1';
            for t=1:anzahlwiederholungen-1
                evalstring=['diff(find(',evalstring,'))==1'];
            end
            evalstring=['if ~isempty(find(',evalstring,'));',...
            'problemstellenvectmp(problemstellenzaehlertmp)=i;problemstellenzaehlertmp=problemstellenzaehlertmp+1;end'];
          if sum(1==diffmat)>=anzahlwiederholungen-1
                 warning off
                 eval(evalstring);
                 warning on
            end
		end
        
		%Progress
		%-------------------
		if length(problemstellenvectmp)<length(problemstellenvec) | trysonderresourcenstatus == 1
            problemstellenvec=problemstellenvectmp;
            inds=indssort;
            anzahloptimierungsdurchgaenge=anzahloptimierungsdurchgaenge+1;
            updateresourcenstatus =1;
            tryagain = 0;
            trysonderresourcenstatus = 0;
            if berichtstatus == 1
                disp([num2str(length(problemstellenvectmp)),' verbleibende Problemstellen...']);
            end
		else
            tryagain=1;
            updateresourcenstatus=0;
		end
        
        %resourcen updaten
        %-------------------
        if updateresourcenstatus==1
            
			resourcenstellenvec=[];
			indshelp=inds;
			if inds(1)~=1;indshelp=[-1,indshelp];end
			if inds(end)~=length(outmat);indshelp=[indshelp,length(outmat)+2];end
			diffinds=diff(indshelp);
			resourcenzaehler=1;
			naechsteserie=1;
			resourcenstellen=find(diffinds>3);
            sonderresourcen=find(diffinds==3);
            for q=1:length(sonderresourcen)
                sonderresourcenstellenvec(q)=indshelp(sonderresourcen(q));
            end
			for i=1:length(resourcenstellen)
                naechsteserie = 1;
                serienabschnitte = 0;
                while naechsteserie == 1
                    naechsteserie = 0;
                    serienzaehler = 1;
                    while serienzaehler<=anzahlwiederholungen & serienzaehler<diffinds(resourcenstellen(i))-2
                        resourcenstellenvec(resourcenzaehler)=indshelp(resourcenstellen(i))+1+serienzaehler+serienabschnitte;
                        resourcenzaehler=resourcenzaehler+1;
                        serienzaehler = serienzaehler + 1; 
                    end
                    if indshelp(resourcenstellen(i))+1+serienabschnitte + serienzaehler + 1 < indshelp(resourcenstellen(i)+1)-1
                        naechsteserie = 1;
                        serienabschnitte=serienabschnitte + serienzaehler;
                    end
                end
			end
        end
	end
end

return
