1 | function varargout = milpsubsref(varargin) |
---|
2 | %MILPSUBSREF |
---|
3 | |
---|
4 | % Author Johan Löfberg |
---|
5 | % $Id: milpsubsref.m,v 1.3 2006/04/27 13:03:15 joloef Exp $ |
---|
6 | |
---|
7 | switch class(varargin{1}) |
---|
8 | case 'double' |
---|
9 | varargin{1} = double(varargin{1}); |
---|
10 | varargin{2}.subs{1} = double(varargin{2}.subs{1}); |
---|
11 | varargout{1} = subsref(varargin{:}); |
---|
12 | |
---|
13 | case 'sdpvar' |
---|
14 | switch length(varargin{2}.subs) |
---|
15 | case 1 |
---|
16 | index = varargin{2}.subs{1}; |
---|
17 | if length(index) > 1 |
---|
18 | y = []; |
---|
19 | for i = 1:length(index) |
---|
20 | varargin{2}.subs{1} = index(i); |
---|
21 | y = [y;yalmip('addextendedvariable',mfilename,varargin{:})]; |
---|
22 | end |
---|
23 | % Figure out dims of variable |
---|
24 | X = randn(size(varargin{1})); |
---|
25 | varargin{2}.subs{1} = ones(size(index)); |
---|
26 | X = subsref(X,varargin{2}); |
---|
27 | y = reshape(y,size(X,1),size(X,2)); |
---|
28 | varargout{1} = y; |
---|
29 | else |
---|
30 | varargout{1} = yalmip('addextendedvariable',mfilename,varargin{:}); |
---|
31 | end |
---|
32 | case 2 |
---|
33 | index1 = varargin{2}.subs{1}; |
---|
34 | index2 = varargin{2}.subs{2}; |
---|
35 | y = []; |
---|
36 | for i = 1:length(index1) |
---|
37 | temp = []; |
---|
38 | for j = 1:length(index2) |
---|
39 | varargin{2}.subs{1} = index1(i); |
---|
40 | varargin{2}.subs{2} = index2(j); |
---|
41 | temp = [temp yalmip('addextendedvariable',mfilename,varargin{:})]; |
---|
42 | end |
---|
43 | y = [y;temp]; |
---|
44 | end |
---|
45 | % Figure out dims of variable |
---|
46 | X = randn(size(varargin{1})); |
---|
47 | varargin{2}.subs{1} = ones(size(index1)); |
---|
48 | varargin{2}.subs{2} = ones(size(index2)); |
---|
49 | X = subsref(X,varargin{2}); |
---|
50 | y = reshape(y,size(X,1),size(X,2)); |
---|
51 | varargout{1} = y; |
---|
52 | |
---|
53 | |
---|
54 | otherwise |
---|
55 | error('Only 1D and 2D variable subsref implemented'); |
---|
56 | end |
---|
57 | |
---|
58 | case 'char' |
---|
59 | switch varargin{1} |
---|
60 | case {'graph','milp'} |
---|
61 | X = varargin{3}; |
---|
62 | Y = varargin{2}; |
---|
63 | if length(varargin{4}.subs) == 1 |
---|
64 | i = varargin{4}.subs{1}; |
---|
65 | M = length(X); |
---|
66 | m = 1; |
---|
67 | F = set(integer(i)); % just to be sure |
---|
68 | d = binvar(length(X),1); |
---|
69 | [Mx,mx]=derivebounds(X); |
---|
70 | for j = m:M |
---|
71 | di = d(j); |
---|
72 | % F = F + set(mx*(1-di) <= Y-X(j) <= Mx*(1-di)); |
---|
73 | F = F + set(-(max(Mx)-min(mx))*(1-di) <= Y-X(j) <= (max(Mx)-min(mx))*(1-di)); |
---|
74 | F = F + set(-(1+M-m)*(1-di) <= i-j <= (1+M-m)*(1-di)); |
---|
75 | end |
---|
76 | F = F + set(sum(d)==1); |
---|
77 | else |
---|
78 | i1 = varargin{4}.subs{1}; |
---|
79 | i2 = varargin{4}.subs{2}; |
---|
80 | M1 = size(X,1); |
---|
81 | M2 = size(X,2); |
---|
82 | m1 = 1; |
---|
83 | m2 = 1; |
---|
84 | if isa(i1,'sdpvar') |
---|
85 | F = set(integer(i1)); % just to be sure |
---|
86 | end |
---|
87 | if isa(i2,'sdpvar') |
---|
88 | F = set(integer(i2)); % just to be sure |
---|
89 | end |
---|
90 | d = binvar(size(X,1),size(X,2),'full'); |
---|
91 | [Mx,mx]=derivebounds(X); |
---|
92 | for i = m1:M1 |
---|
93 | for j = m2:M2 |
---|
94 | di = d(i,j); |
---|
95 | F = F + set(-(max(Mx)-min(mx))*(1-di) <= Y-X(i,j) <= (max(Mx)-min(mx))*(1-di)); |
---|
96 | if isa(i1,'sdpvar') |
---|
97 | F = F + set(-(1+M1-m1)*(1-di) <= i1-i <= (1+M1-m1)*(1-di)); |
---|
98 | end |
---|
99 | if isa(i2,'sdpvar') |
---|
100 | F = F + set(-(1+M2-m2)*(1-di) <= i2-j <= (1+M2-m2)*(1-di)); |
---|
101 | end |
---|
102 | end |
---|
103 | end |
---|
104 | F = F + set(sum(sum(d))==1); |
---|
105 | |
---|
106 | end |
---|
107 | varargout{1} = F; |
---|
108 | varargout{2} = struct('convexity','none','monotonicity','none','definiteness','none'); |
---|
109 | varargout{3} = [X(:);i(:)]; |
---|
110 | |
---|
111 | otherwise |
---|
112 | error('SDPVAR/ABS called with CHAR argument?'); |
---|
113 | end |
---|
114 | otherwise |
---|
115 | error('Strange type on first argument in SDPVAR/ABS'); |
---|
116 | end |
---|