function [k, X, Y, pasos] = vnautovalor(F, signoX, signoXF, orden, numsol)
%vnautovalor
%   [k, X, Y] = vnautovalor(F)
% 
%   Construye todos los menores cuadrados posibles, calcula los
%   autovalores y autovectores por la izquierda y la derecha de cada
%   menor y muestra las soluciones que cumplen las condiciones de VN.
% 
%   [k, X, Y] = vnautovalor(F, signoX, signoXF, orden, numsol)
%      F         recetas en tiempo discreto
%      signoX    signo de las intensidades; por defecto X >= 0
%      signoXF   signo de los balances materiales; por defecto X F(k) = 0
%      orden     si = [] todos los ordenes, si = 0 los de mayor orden
%      numsol    si = [] busca todas las soluciones, si = n busca sólo n
%      k, X, Y   factor, intensidades y valores solución
% 
%   Los códigos para los signos son   0 =    1 >=    2 <=    3 >=<
%   Por defecto busca todas las soluciones en todos los menores.

%   necesita autovalor.m, condicionesvn.m

if nargin < 2, signoX = []; end
if nargin < 3, signoXF = []; end
if nargin < 4, orden = []; end
if nargin < 5, numsol = []; end

[filas, columnas, ancho] = size(F);             %determina el tamaño del problema
orm = min(filas, columnas);                     %determina el orden del menor de mayor tamaño
if isempty(orden), orden=orm:-1:1; elseif orden==0, orden=orm; end %si orden es [] busca en todos; si es 0 en los mayores
if isempty(numsol), numsol = Inf; end           %si numsol no esta definido busca todas las soluciones
k = []; X = []; Y = []; pasos = 0;              %crea las variables para almacenar las soluciones
for c0 = orden                                  %para cada orden de los menores
    combfil = nchoosek(1:filas, c0);                 %establece las filas posibles de los menores
    combcol = nchoosek(1:columnas, c0);              %establece las columnas posibles de los menores
    for c1 = 1:size(combfil, 1)                      %para cada combinación de filas posible
        Xs = zeros(1, filas);                             %define las intensidades de la solución como 0
        film = combfil(c1, :);                            %establece las filas del menor analizado
        for c2 = 1:size(combcol, 1)                       %para cada combinación de columnas posible
            Ys = zeros(columnas, 1);                           %define los valores de la solución como 0
            colm = combcol(c2, :);                             %establece las columnas del menor analizado
            [Km, Xm, Ym] = autovalor(F(film, colm, :), 1);     %calcula los autovalores (positivos) y los autovectores del menor
            pasos = pasos + 1;                                 %contabiliza el número de menores
            for c3 = 1:size(Km, 2)                             %para cada autovalor del menor
                Xs(film) = Xm(c3, :);                               %incluye las intensidades del menor en la solución
                Ys(colm) = Ym(:, c3);                               %incluye los valores del menor en la solución
                if condicionesvn(Km(c3),Xs,Ys,F,signoX,signoXF)     %si la solución cumple las condiciones de VN
                    k = [k, Km(c3)]; X = [X; Xs]; Y = [Y, Ys];           %añade la solución a las almacenadas
                    numsol = numsol-1; if numsol <= 0, return; end       %si se alcanzaron las soluciones buscadas interrumpe
                end                                                 %
                if condicionesvn(Km(c3),-Xs,-Ys,F,signoX,signoXF)   %si la solución con signo - cumple las condiciones de VN
                    k = [k, Km(c3)]; X = [X; -Xs]; Y = [Y, -Ys];         %añade la solución con signo - a las almacenadas
                    numsol = numsol-1; if numsol <= 0, return; end       %si se alcanzaron las soluciones buscadas interrumpe
                end                                                 %
            end
        end
    end
end
