% IA CON ENO-SR para VP. Interpola-aproxima. En general, sin filtros. Bajamos niveles, eliminamos todos los d(k,i) y subinos los mismos niveles CON ENO-SR. 
%       capiaiavpenosrultim(xx,ff,nl,nr,r,nivells)
%       Entradas:
%           xx       = nodos de la funcion inicial
%           ff       = f(x)
%           nl       = numero de nodos del stencil a la izquierda de x^{k}_{2i-1}
%           nr       = numero de nodos del stencil a la derecha de x^{k}_{2i-1}
%           r        = grado del polinomio IA 
%           nivells  = niveles de multiresolucion 
%       Salidas:
%           Plot de la reconstruccion(.-), funcion original(o), funcion original con mas nodos (-),intervalos iniciales(-+), diferencia original y aproximacion(:) 

function capiaiavpenosrultim(xx,ff,nl,nr,r,nivells)

nivells=nivells+1;
[xn,xm]=size(xx);
n=log(xm-1)/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;

%BAJANDO NIVELES
for k=nivells:-1:2
   for i=1:1+2^(n-nivells+k-1)
      f(k-1,i)=f(k,2*i-1);
      x(k-1,i)=x(k,2*i-1);
   end 
end
fr=zeros(nivells,xm); %fr significa la reconstruccion
fr(1,1:2^(n-nivells+1)+1)=f(1,1:2^(n-nivells+1)+1); %trabajamos con fr y asi nos aseguramos que ningun dato proviene de f
     
%SUBIENDO NIVELES
for k=2:nivells
   ultim=1+2^(n-nivells+k-1);
   %%%%%%%%%%%%ENO%%%%%%%%%%%%%%%%
   for i=2:ultim
      for l=1:ntot-1
           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-1));
      vnl(k,i)=ntot-pos; %num nodos a la izquierda de x^{k}_{2i-1} para ENO
   end
   
   %asignaemos al valor derecho , por comodidad
   for i=1:ultim
      vnr(k,i)=ntot-vnl(k,i); 
   end   
   %%%%%%%%%%%%%%%%%%FIN ENO%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

   fr(k,1)=fr(k-1,1);
   %Reconstruyendo por IA con valores puntuales
   vnl(k,1)=0;
   for i=2:ultim-1    
        if(vnl(k,i-1)==ntot-1 && vnl(k,i+1)==1) %SOPECHOSA 
              if((capiaiavpcoefifunciongsol(nl,nr,r,0)*fr(k-1,i-nl-nr:i+nl+nr-1)')*(capiaiavpcoefifunciongsol(nl,nr,r,1)*fr(k-1,i-nl-nr:i+nl+nr-1)')<0)                
                  if((capiaiavpcoefifunciongsol(nl,nr,r,0)*fr(k-1,i-nl-nr:i+nl+nr-1)')*(capiaiavpcoefifunciongsol(nl,nr,r,1/2)*fr(k-1,i-nl-nr:i+nl+nr-1)')<0)
                        %ESTAMOS A LA DERECHA DE LA DISCONTINUIDAD
                        fr(k,2*i-2)=capiaiavpcoefidretasrsol(nl,nr,r)*fr(k-1,i:i+nl+nr-1)';
                  else
                        %ESTAMOS A LA IZQUIERDA DE LA DISCONTINUIDAD
                        fr(k,2*i-2)=capiaiavpcoefiesquerrasrsol(nl,nr,r)*fr(k-1,i-nl-nr:i-1)';
                  end
              else
                   %APLICAMOS ENO
                   fr(k,2*i-2)=capiacoefiiavpsol(vnl(k,i),vnr(k,i),r)*fr(k-1,i-vnl(k,i):i+vnr(k,i)-1)';
              end
        else   
              %APLICAMOS ENO
              fr(k,2*i-2)=capiacoefiiavpsol(vnl(k,i),vnr(k,i),r)*fr(k-1,i-vnl(k,i):i+vnr(k,i)-1)';  
        end
        fr(k,2*i-1)=fr(k-1,i);
   end       
        %frontera dreta
        fr(k,2*ultim-1)=fr(k-1,ultim);
        fr(k,2*ultim-2)=capiacoefiiavpsol(ntot-1,1,r)*fr(k-1,ultim-ntot+1:ultim)';
end

[xor,yor]=funtreballtesi(257,0); 

hold on
plot(xor, yor,'--k','LineWidth',2)                                                        %original discretizada con 257 pts 
plot(x(1,1:1+2^(n-(nivells-2+1))),f(1,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
