% Reconstrucción IP con ENO, para r=2s-1. Sin filtros, con cualquier grado
% para el polinomio interpolador. Se eliminan todos los coeficicentes de
% escala.
%       preliipvpenogenultim(xx,ff,grau,nivells)
%       Entradas:
%           xx      = nodos de la funcion inicial
%           ff      = f(xx)
%           grau    = grado del polinomio interpolador (r)
%           nivells = niveles de multirresolucion 
%       Salidas:
%           Plot de la reconstruccion(-), funcion en el nivel mas grosero(o), funcion original con mas nodos (--), diferencia original y aproximacion(:) 
%
% Autor: José Jaime Noguera. +INFO: www.uv.es/anims/noguera

function preliipvpenogenultim(xx,ff,grau,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);
s=(grau+1)/2; %s son los nodos a la izquierda (y derecha) si tomasemos un stencil centrado
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);


for k=2:nivells   
   ultim=1+2^(n-nivells+k-1);
        %%%%%%a%%%%%%%%%% asignacion eno
        %for i=grau+1:ultim-grau+1
        for i=2:ultim
            t=0;
            for l=i-grau+1:i
                t=t+1; %para evitar indices negativos en dif(t)
                if(l-1>=1 && l+grau-1<=ultim)
                   dd=difdiv(x(k-1,l-1:l+grau-1),fr(k-1,l-1:l+grau-1),grau+1);
                   dif(t)=abs(dd(grau+1,grau+1));
                else
                    dif(t)=1e100;
                end    
            end
       % [min,pos]=min(dif(i-grau+1:i));
       [minim,pos]=min(dif(1:grau));
        is(i)=i+pos-grau;
        end
        %%%%%%%%%%%%%%%% fin-eno
   
  fr(k,1)=fr(k-1,1);  
  for i=2:ultim
     fr(k,2*i-2)=interpola(x(k-1,is(i)-1:is(i)+grau-1),fr(k-1,is(i)-1:is(i)+grau-1),x(k,2*i-2));  
     fr(k,2*i-1)=fr(k-1,i);
  end
   
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