function varargout = norm_nuclear(varargin)
% NORM_NUCLEAR Returns sum of singular values
%
% s = SUMK(X,k)
%
% For a vector X, NORM_NUCLEAR returns the sum of singular values
%
% For a matrix X, NORM_NUCLEAR returns the sum of absolute values.
%
% See also SUMABSK

% Author Johan Löfberg
% $Id: norm_nuclear.m,v 1.3 2007-08-02 19:17:36 joloef Exp $

switch class(varargin{1})
    
    case 'double' % What is the numerical value of this argument (needed for displays etc)
        varargout{1} = sum(svd(varargin{1}));
        
    case 'sdpvar'
        varargout{1} = yalmip('define',mfilename,varargin{:});
        
    case 'char' % YALMIP sends 'model' when it wants the epigraph or hypograph
        if isequal(varargin{1},'graph')
            t = varargin{2};
            X = varargin{3};
            [n,m] = size(X);
            if is(X,'real')
                U = sdpvar(m);
                V = sdpvar(n);
            else
                U = sdpvar(m,m,'hermitian','complex');
                V = sdpvar(n,n,'hermitian','complex');
            end
            F = [trace(U)+trace(V) <= 2*t, [U X';X V]>=0];
            varargout{1} = F;
            varargout{2} = struct('convexity','convex','monotonicity','none','definiteness','positive','model','graph');
            varargout{3} = X;
        else
            varargout{1} = [];
            varargout{2} = [];
            varargout{3} = [];
        end
    otherwise
end