function [k, X, Y, pasos, hessiano] = vnnolineal(F, signoX, signoXF, k0, X0)
%vnnolineal
%   [k, X, Y] = vnnolineal(F)
%
%   Resuelve VN utilizando las funciones para programas no lineales constr
%   en Matlab 5 y fmincon en las versiones superiores de Matlab; esta
%   función no está implementada en Octave.
%
%   [k, X, Y] = vnnolineal(F, signoX, signoXF, k0, X0)
%      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
%      k0        factor con el que se inicia la iteración
%      X0        intensidades con las que se inicia la iteración
%      k, X, Y   factor, intensidades y valores solución
%
%   Los códigos para los signos son   0 =    1 >=    2 <=    3 >=<

%necesita vnnolinealaux1, vnnolinealaux2, vnnolinealaux3

if nargin < 2, signoX = []; end
if nargin < 3, signoXF = []; end
if nargin < 4, k0 = []; end
if nargin < 5, X0 = []; end

if exist('OCTAVE_VERSION')
   k = []; X = []; Y = []; pasos = []; hessiano = [];
   disp('Atención, esta función no ha sido redactada para Octave');
else
   v = version;
   if v([1,2]) == '5.'
      [k, X, Y, pasos, hessiano] = vnnolinealmatlab5(F, signoX, signoXF, k0, X0);
   else
      [k, X, Y, pasos, hessiano] = vnnolinealaux3(F, signoX, signoXF, k0, X0);
   end
end







function [k, X, Y, pasos, HESS] = vnnolinealmatlab5(F, signoX, signoXF, k0, X0)
[F, signoX, signoXF] = formaproblema(F, signoX, signoXF, 1);
[filas, columnas, ancho] = size(F);
if isempty(k0), k0 = 1; end
if isempty(X0), X0 = ones(1, filas)/filas; end
OPTIONS = foptions;
OPTIONS(2) = 1e-12;  %Termination tolerance for X.(Default: 1e-4).
OPTIONS(3) = 1e-12;  %Termination tolerance on F.(Default: 1e-4).
OPTIONS(4) = 1e-12;  %Termination criterion on constraint violation.(Default: 1e-6)
LB = [0, zeros(1, filas)];
UB = [Inf, Inf*ones(1, filas)];
[V, optsal, LAMBDA, HESS] = constr('vnnolinealaux1', [k0,X0], OPTIONS, LB, UB, 'vnnolinealaux2', F);
k = V(1);
X = V(2:filas+1);
Y = LAMBDA(1:columnas);
pasos = optsal(10);
[X, Y] = formasolucion(X, Y, signoX, signoXF, 1);
