function varargout=eig(varargin)
%ABS (overloaded)
%
% y = eig(x)
%
% The variable y represents the sorted eigenvalues of x.
% 
% EIG is implemented using a nonlinear operator framework,
% but can currently not be used in any optmization model.

% Author Johan Löfberg 
% $Id: eig.m,v 1.1 2006-08-10 18:00:20 joloef Exp $



% ***************************************************
% This file defines a nonlinear operator for YALMIP
%
% It can take three different inputs
% For double inputs, it returns standard double values
% For sdpvar inputs, it genreates a an internal variable
% When first input is 'model' it generates the epigraph
%
% % ***************************************************
switch class(varargin{1})

    case 'double' % What is the numerical value of this argument (needed for displays etc)
        % SHOULD NEVER HAPPEN, THIS SHOULD BE CAUGHT BY BUILT-IN
        error('Overloaded SDPVAR/EIG CALLED WITH DOUBLE. Report error')

    case 'sdpvar' % Overloaded operator for SDPVAR objects. Pass on args and save them.
        X = varargin{1};
        if size(X,1)~=size(X,2)
            error('Matrix must be square.')
        end
        y=[];
        for i = 1:length(X)
            y=[y;yalmip('addextendedvariable','yeig',X,i)]; %ith eigenvalue
        end
        varargout{1}=y;            

    case 'char' % YALMIP send 'graph' when it wants the epigraph or hypograph
        error('eig operator not supported');
        if isequal(varargin{1},'graph')
            t = varargin{2};
            X = varargin{3};
            varargout{1} = set(-t < X < t);
            varargout{2} = 1; % Convex operator
            error('SDPVAR/ABS called with CHAR argument?');
        end
    otherwise
        error('Strange type on first argument in SDPVAR/ABS');
end
