function Y=plot(varargin)
%PLOT (overloaded)

% Fast version for plotting simple PWA objects
if nargin == 1
X = varargin{1};
if isa(varargin{1},'sdpvar')
if length(X) == 1
if isequal(full(getbase(X)),[zeros(length(X),1) eye(length(X))])
extstruct = yalmip('extstruct',getvariables(X));
if ~isempty(extstruct)
if isequal(extstruct.fcn,'pwa_yalmip') | isequal(extstruct.fcn,'pwq_yalmip')%#ok
% Maybe some reduction has been performed so we
% actually can plot it
xarg = extstruct.arg{2};
switch extstruct.arg{3}
case ''
otherwise
Pn = polytope; Bi = {}; Ci = {};
index = extstruct.arg{5};
for i = 1:length(extstruct.arg{1})
% Pick out row
for j = 1:length(extstruct.arg{1}{i}.Bi)
extstruct.arg{1}{i}.Bi{j} = extstruct.arg{1}{i}.Bi{j}(index,:);
extstruct.arg{1}{i}.Ci{j} = extstruct.arg{1}{i}.Ci{j}(index,:);
end
if isempty(extstruct.arg{1}{i}.Ai{1})
Pn = [Pn extstruct.arg{1}{i}.Pn];
Bi = cat(2, Bi, extstruct.arg{1}{i}.Bi);
Ci = cat(2, Ci, extstruct.arg{1}{i}.Ci);
else
if nnz([extstruct.arg{1}{i}.Ai{:}]) == 0
Pn = [Pn extstruct.arg{1}{i}.Pn];
Bi = cat(2, Bi, extstruct.arg{1}{i}.Bi);
Ci = cat(2, Ci, extstruct.arg{1}{i}.Ci);
else
hold on
[extstruct.arg{1}{i}.Pn,extstruct.arg{1}{i}.Bi,extstruct.arg{1}{i}.Ci,extstruct.arg{1}{i}.Ai] = reduce_basis(extstruct.arg{1}{i}.Pn,extstruct.arg{1}{i}.Bi,extstruct.arg{1}{i}.Ci,extstruct.arg{1}{i}.Ai,xarg);
Y = mpt_plotPWQ(extstruct.arg{1}{i}.Pn, extstruct.arg{1}{i}.Ai,extstruct.arg{1}{i}.Bi,extstruct.arg{1}{i}.Ci);
hold off
end
end
end
if ~isempty(Bi),
hold on
[Pn,Bi,Ci] = reduce_basis(Pn,Bi,Ci,[],xarg);
if size(Bi{1},2) > 2
error('Cannot plot high-dimensional PWA functions')
end
mpt_plotPWA(Pn, Bi, Ci);
hold off
end
drawnow
return
end
end
end
end
else
for j = 1:length(X)
plot(extsubsref(X,j));
end
return
end
end
end

% More complex expression. Get epi-graph model
% project to our variables, and extract defining facets
if nargin == 1
[p,Bi,Ci,Pn,Pfinal] = pwa(varargin{1});%#ok
elseif isa(varargin{2},'lmi')
[p,Bi,Ci,Pn,Pfinal] = pwa(varargin{1},varargin{2});%#ok
else
error('Second argument should be a domain defining SET object.');
end
if nargout>0
Y = mpt_plotPWA(Pn,Bi,Ci);
else
mpt_plotPWA(Pn,Bi,Ci);
end

function S = extractrow(S,index)
for i = 1:length(S)
S{i} = S{i}(index,:);
end

function [Pnnew,Binew,Cinew,Ainew] = reduce_basis(Pn,Bi,Ci,Ai,xarg);
%
if ~isequal(getbase(xarg),[zeros(length(xarg),1) eye(length(xarg))])
base = getbase(xarg);
c = base(:,1);
D = base(:,2:end);
Pnnew = [];
Ainew = [];
Binew = [];
Cinew = [];
for i = 1:length(Pn)
[H,K] = double(Pn(i));
Phere = polytope(H*D,K-H*c);
if isfulldim(Phere)
Pnnew = [Pnnew Phere];
if ~isempty(Ai)
Cinew{end+1} = Ci{i} + Bi{i}*c + c'*Ai{i}*c;
Binew{end+1} = Bi{i}*D + 2*c'*Ai{i}*D;
Ainew{end+1} = D'*Ai{i}*Ai{i};
else
Cinew{end+1} = Ci{i} + Bi{i}*c;
Binew{end+1} = Bi{i}*D;
end
end
end
else
Pnnew = Pn;
Ainew = Ai;
Binew = Bi;
Cinew = Ci;
end