yalmip('clear')
%clear all

% Data
A = [2 -1;1 0];nx = 2;
B1 = [1;0];
B2 = pi*B1;
nu = 1;
C = [0.5 0.5];

% Prediction horizon
N = 4;

% States x(k), ..., x(k+N)
x = sdpvar(repmat(nx,1,N),repmat(1,1,N));

% Inputs u(k), ..., u(k+N) (last one not used)
u = sdpvar(repmat(nu,1,N),repmat(1,1,N));

% Binary for PWA selection
d = binvar(repmat(2,1,N),repmat(1,1,N));

% Value functions
J = cell(1,N);

% Initialize value function at stage N
J{N} = 0;

% DP iteration from final state
for k = N-1:-1:1

    % Control constraints
    F = set(-1 < u{k} < 1);
    
    % We are in a feasible region...
    F = F + set(-1 < C*x{k}   < 1);
    F = F + set(-5 < x{k}     < 5);
    
    % ...and go to a feasible region
    F = F + set(-1 < C*x{k+1} < 1);
    F = F + set(-5 < x{k+1}   < 5);

    % PWA Dynamics
    F = F + set(implies(d{k}(1),[x{k+1} == A*x{k}+B1*u{k}, x{k}(1) > 0]));
    F = F + set(implies(d{k}(2),[x{k+1} == A*x{k}+B2*u{k}, x{k}(1) < 0]));
    F = F + set(sum(d{k}) == 1);
    
    % L1 objective
    obj = norm(x{k},1) + norm(u{k},1);
        
   [mpsol{k},sol{k},aux{k},J{k},U{k}] = solvemp(F,obj + J{k+1},[],x{k},u{k});

end





break



break
mpsol{1} = mpt_removeOverlaps(mpsol{1})

% Compare
sysStruct.A{1} = A;
sysStruct.B{1} = B1;
sysStruct.C{1} = C;
sysStruct.D{1} = [0];
sysStruct.A{2} = A;
sysStruct.B{2} = B2;
sysStruct.C{2} = C;
sysStruct.D{2} = [0];
sysStruct.guardX{1} = [-1 0];
sysStruct.guardU{1} = [0];
sysStruct.guardC{1} = [0];
sysStruct.guardX{2} = [1 0];
sysStruct.guardU{2} = [0];
sysStruct.guardC{2} = [0];

%set constraints on output
sysStruct.ymin    =   -1;
sysStruct.ymax    =    1;

%set constraints on input
sysStruct.umin    =   -1;
sysStruct.umax    =   1;

sysStruct.xmin    =   [-5;-5];
sysStruct.xmax    =   [5;5];

probStruct.norm=1;
probStruct.Q=eye(2);
probStruct.R=1;
probStruct.N=N-1;
probStruct.P_N=zeros(2);
probStruct.subopt_lev=0;
probStruct.y0bounds=1;
probStruct.Tconstraint=0;
ctrl=mpt_control(sysStruct,probStruct)

mpt_isPWAbigger(ctrl,mpsol{1})
break
%[ii,jj] = isinside(ctrl.Pn,[1.2;0.8]);
%ctrl.Bi{jj}*[1.2;0.8]+ctrl.Ci{jj}

% 
% 
% Online
obj = 0;
F = set([]);
dd = [];
for k = N-1:-1:1
    
    % Feasible region
    F = F + set(-1 < u{k}     < 1);
    F = F + set(-1 < C*x{k}   < 1);
    F = F + set(-5 < x{k}     < 5);
    F = F + set(-1 < C*x{k+1} < 1);
    F = F + set(-5 < x{k+1}   < 5);

    % PWA Dynamics
    d = binvar(2,1);dd = [dd;d];
    F = F + set(implies(d(1),x{k+1} == (A*x{k}+B1*u{k})));
    F = F + set(implies(d(2),x{k+1} == (A*x{k}+B2*u{k})));
    F = F + set(implies(d(1),x{k}(1) > 0));
    F = F + set(implies(d(2),x{k}(1) < 0));
    F = F + set(sum(d) == 1);
    
    F1 = set(x{k+1} == (A*x{k}+B1*u{k})) + set(x{k}(1) > 0);
    F2 = set(x{k+1} == (A*x{k}+B2*u{k})) + set(x{k}(1) < 0);
    
    %F = F + hull(F1,F2);
    
   % obj = obj + norm([x{k};u{k}],1);
    obj = obj + norm([x{k};u{k}],1);
%    obj = obj + norm([x{k};u{k}],1);
    % Compute value function for one step backwards     
end
mpsol2{k} = solvemp(F,obj,[],x{k},u{k});
mpsol3{k} = dua_test(F,obj,[],x{k});
solvesdp(F+set(x{k}==[0.5;0.5]),obj)
solvesdp(F+set(x{k}==[1.2;0.8]),obj)
mpsol{k} = solvemp(F,obj,[],x{k},u);
mpsol2{1} = rmovlps(mpsol2{1});

mpsol1{k} = solvemp(F,obj,[],x{k},u{k});
% 
