%  Multirresolución mediante la recosntrucción AC con la técnica SR y con
%  la idea de aproximar tanto en pares como en impares. Anulamos todos lod
%  d(k,i)
%    capiamincmcenosruideau(xx,ff,nl,nr,grau,nivells)
%    Entradas:
%           xx       = nodos de la funcion inicial
%           ff       = f(xx)
%           nl       = numero de nodos a la izquierda de f^{k-1}_{i} 
%           nl       = numero de nodos a la derecha de f^{k-1}_{i}         
%           grau     = grado para F (grau-1 para f)
%           nivells  = niveles de multiresolucion 
%    Salidas: plot de la funcion original(--), de la recosntruccion(-),de los nodos del nivel mas grosero (o) y de la diferencia entre la original y la reconstruccion (:)
%
% Autor: José Jaime Noguera.  +INFO: www.uv.es/anims/noguera

function capiamincmcenosruideau(xx,ff,nl,nr,grau,nivells)
grau=grau-1;
nivells=nivells+1;
[xn,xm]=size(xx);
n=log(xm)/log(2);
f=zeros(nivells,xm);
x=zeros(nivells,xm);
f(nivells,1:xm)=ff(1:xm);
x(nivells,1:xm)=xx(1:xm);
ntot=nl+nr+1;

%BAJANDO NIVELES
for k=nivells:-1:2
   for i=1:2^(n-(nivells-k+1)) 
      f(k-1,i)=(1/2)*(f(k,2*i-1)+f(k,2*i));
      x(k-1,i)=(x(k,2*i)+x(k,2*i-1))/2;  % solo lo uso al final para el plot, ya que trabajo en nodos enteros
   end
end
    fr=zeros(nivells,xm);
    fr(1,1:2^(n-(nivells-1)))=f(1,1:2^(n-(nivells-1))); %para asegurarme de que toda la reconstruccion es nueva

%SUBIENDO NIVELES
for k=2:nivells
     ultim=2^(n-(nivells-k+1));    
     %%%%%%%%%%%%ENO%%%%%%%%%%%%%%%%
     for i=1:ultim
        for l=1:ntot
           if(i+l-1<=ultim && i-ntot+l>0)
                  dd=difdiv(x(k-1,i-ntot+l:i+l-1),fr(k-1,i-ntot+l:i+l-1),ntot);
                  dif(l)=abs(dd(ntot,ntot));
           else
                  dif(l)=1e100;  %le doy un valor excesivo para tocar menos codigo en el tratamiento de fronteras  
           end
        end
     [minim,pos]=min(dif(1:ntot));
     vnl(k,i)=ntot-pos; %num nodos a la izquierda de f^{k}_{2i-1} para ENO
     vnr(k,i)=nl+nr-vnl(k,i);
     end
   % FIN ENO

   for i=2:ultim-1       
      if(vnr(k,i-1)==0 && vnl(k,i+1)==0)% SOSPECHOSA
         
                    Gl=capiaiamccoefsrgenusol(0,fr,nl,nr,grau,i,k);
                    Gc=capiaiamccoefsrgenusol(0.5,fr,nl,nr,grau,i,k);
                    Gr=capiaiamccoefsrgenusol(1,fr,nl,nr,grau,i,k);
                    
                   if(Gl*Gr<0) %SINGULAR
                        if(Gl*Gc<0)
                              %debemos extender de la derecha
                              fr(k,2*i)=capiamincsrdretau(fr,nl,nr,grau,i,k);                 
                              fr(k,2*i-1)=capiamincsrdretauidea(fr,nl,nr,grau,i,k);              
                         else
                             %debemos extender de la izquierda
                             fr(k,2*i-1)=capiamincsresquerrau(fr,nl,nr,grau,i,k);
                             fr(k,2*i)=capiamincsresquerrauidea(fr,nl,nr,grau,i,k);    
                         end
                    else %hacemos eno
                             fr(k,2*i-1)=capiamincmccoefisolu(vnl(k,i),vnr(k,i),grau)*[fr(k-1,i-vnl(k,i):i+vnr(k,i))]';  
                             fr(k,2*i)=capiamincmccoefisoluidea(vnl(k,i),vnr(k,i),grau)*[fr(k-1,i-vnl(k,i):i+vnr(k,i))]';
                    end
      else %hacemos eno 
         fr(k,2*i-1)=capiamincmccoefisolu(vnl(k,i),vnr(k,i),grau)*[fr(k-1,i-vnl(k,i):i+vnr(k,i))]';  
         fr(k,2*i)=capiamincmccoefisoluidea(vnl(k,i),vnr(k,i),grau)*[fr(k-1,i-vnl(k,i):i+vnr(k,i))]';
      end   
   end  
        %fronteras
        i=1; 
        fr(k,2*i-1)=capiamincmccoefisolu(vnl(k,i),vnr(k,i),grau)*[fr(k-1,i-vnl(k,i):i+vnr(k,i))]';  
        fr(k,2*i)=capiamincmccoefisoluidea(vnl(k,i),vnr(k,i),grau)*[fr(k-1,i-vnl(k,i):i+vnr(k,i))]';
        i=ultim; 
        fr(k,2*i-1)=capiamincmccoefisolu(vnl(k,i),vnr(k,i),grau)*[fr(k-1,i-vnl(k,i):i+vnr(k,i))]';  
        fr(k,2*i)=capiamincmccoefisoluidea(vnl(k,i),vnr(k,i),grau)*[fr(k-1,i-vnl(k,i):i+vnr(k,i))]';    
        %fin_fronteras    
end   
    
[xor,yor]=funtesi(256,0); 

hold on
plot(xor, yor,'--k','LineWidth',2)                                          %original discretizada con 256 pts 
plot(x(1,1:2^(n-(nivells-2+1))),f(1,1:2^(n-(nivells-2+1))),'ko')            %original en el nivel mas grosero
plot(xx,(ff-fr(nivells,1:xm))-(0.1)*ones(1,xm),':k','LineWidth',3)          %original-reconstruccion
plot(xx,fr(nivells,1:xm),'-k','LineWidth',3)                                %reconstruccion
axis([0 1 -0.2 1.1 ]);
set(gca,'Xtick',[0 .5 1], 'FontSize',15)
set(gca,'Ytick',[0 .5 1], 'FontSize',15)
box
hold off
