function [X, Y] = formasolucion(Xn, Yn, signoX, signoXF, problema)
%formasolucion
%   [X, Y] = formasolucion(Xn, Yn, signoX, signoXF, problema)
%
%   Convierte una solución transformada a la forma estándar o canónica a la
%   forma original. 
%      Xn, Yn      intensidades y valores transformados
%      signoX      signo de las intensidades
%      signoXF     signo de los balances materiales
%      problema    [] desde la forma estándar y 1 desde la forma canónica
%      X, Y        intensidades y valores originales

if nargin < 2, Yn = []; end
if nargin < 3, signoX = []; end
if nargin < 4, signoXF = []; end
if nargin < 5, problema = []; end

if isempty(problema), problema = 0; end
switch problema
    case 0
        X = ajustaX(Xn, signoX);
        Y = Yn;
    case 1
        X = ajustaX(Xn, signoX);
        Y = ajustaY(Yn, signoXF);
    case 2
        X = Xn;
        Y = ajustaY(Yn, signoXF);
end






function X = ajustaX(Xn, signoX)
if isempty(Xn)
    X = Xn;
else
    filas = size(signoX, 2);
    if sum(signoX == 1) == filas
        X = Xn(:, 1:filas);
    else
        soluciones = size(Xn, 1);
        X = zeros(soluciones, filas);
        c2 = 1;
        for c1 = 1:filas
            switch signoX(c1)
                case 0, X(:,c1) = 0;
                case 1, X(:,c1) = Xn(:,c2); c2 = c2 + 1;
                case 2, X(:,c1) = -Xn(:,c2); c2 = c2 + 1;
                case 3, X(:,c1) = Xn(:,c2) - Xn(:,c2+1); c2 = c2 + 2;
            end
        end
    end
end






function Y = ajustaY(Yn, signoXF)
if isempty(Yn)
    Y = Yn;
else
    columnas = size(signoXF, 2);
    if sum(signoXF == 1) == columnas
        Y = Yn(1:columnas, :);
    else
        soluciones = size(Yn, 2);
        Y = zeros(columnas, soluciones);
        c2 = 1;
        for c1 = 1:columnas
            switch signoXF(c1)
                case 0, Y(c1,:) = Yn(c2,:) - Yn(c2+1,:); c2 = c2 + 2;
                case 1, Y(c1,:) = Yn(c2,:); c2 = c2 + 1;
                case 2, Y(c1,:) = -Yn(c2,:); c2 = c2 + 1;
                case 3, Y(c1,:) = 0;
            end
        end
    end
end
