0001 function partitionData = generateConfinementPartition(dec, hC, zerotol)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 if exist('hC', 'var')
0024 partitionData.sampleHc = hC;
0025 else
0026 partitionData.sampleHc = [];
0027 end
0028 partitionData.flagResult = [];
0029 partitionData.hrep = [];
0030 partitionData.isValid = [];
0031 partitionData.isConfined = [];
0032 partitionData.unifiedIndex = [];
0033 partitionData.validityProjectionMatrix = [];
0034 partitionData.validityProjectionConstraintMatrix = [];
0035 partitionData.violatedConstraintIndexVector = [];
0036
0037
0038 partitionData.debug = [];
0039
0040
0041
0042 if ~exist('dec', 'var')
0043 partitionData(:) = [];
0044 return
0045 end
0046
0047
0048
0049 hE = dec.properData.mappingNewToProper * hC;
0050
0051
0052 projectionData = obtainProjectionDataForVector(dec.properData, hE, 0);
0053
0054 partitionData.validityProjectionMatrix = projectionData.projectionMatrix;
0055 partitionData.validityProjectionConstraintMatrix = ...
0056 projectionData.constraintMatrix;
0057
0058 partitionData.violatedConstraintIndexVector = ...
0059 projectionData.violatedConstraintIndexVector;
0060
0061
0062 unifiedIndex = computePartitionIndexDec(dec.properData, ...
0063 projectionData.projectionMatrix*hE, zerotol, 1);
0064
0065
0066
0067
0068 if all((dec.properData.validityCone.A * hE) < 0)
0069
0070
0071
0072 partitionData.flagResult = 1;
0073
0074 partitionData.isValid = 1;
0075 partitionData.isConfined = 1;
0076
0077
0078 thisA = dec.properData.unifiedPartition{unifiedIndex}.A;
0079
0080
0081 partitionData.unifiedIndex = unifiedIndex;
0082
0083 elseif rank(projectionData.projectionMatrix * dec.properData.mappingNewToProper, ...
0084 zerotol) == dec.nC
0085
0086
0087
0088 partitionData.flagResult = 1;
0089
0090 partitionData.isValid = 0;
0091 partitionData.isConfined = 1;
0092
0093
0094
0095 thisA = [projectionData.constraintMatrix; ...
0096 dec.properData.unifiedPartition{unifiedIndex}.A*...
0097 projectionData.projectionMatrix];
0098
0099
0100 partitionData.unifiedIndex = unifiedIndex;
0101
0102 else
0103
0104
0105
0106
0107
0108 partitionData.flagResult = 1;
0109 partitionData.isValid = 0;
0110 partitionData.isConfined = 0;
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120 thisA = [projectionData.constraintMatrix; ...
0121 dec.properData.unifiedPartition{unifiedIndex}.A*...
0122 projectionData.projectionMatrix];
0123
0124 partitionData.unifiedIndex = unifiedIndex;
0125
0126
0127 end
0128
0129
0130
0131 partitionData.debug.embeddingConstraintMatrix = thisA;
0132
0133
0134 thisA = thisA*dec.properData.mappingNewToProper;
0135
0136
0137
0138
0139
0140
0141 thisA = trimConstraintMatrix(thisA, zerotol, 1);
0142
0143 thisA = unique(thisA, 'rows');
0144
0145
0146 partitionData.hrep.A = thisA;
0147 partitionData.hrep.h = zeros(size(thisA, 1), 1);
0148 partitionData.debug.projectionData = projectionData;
0149
0150
0151 end
0152
0153 function [projectionMatrix constraintMatrix] = ...
0154 concatenateProjectionData(projectionData, filterVector)
0155
0156
0157
0158
0159
0160
0161
0162
0163 if ~exist('filterVector', 'var')
0164 filterVector = (1:length(projectionData.projectionList))>0;
0165 end
0166 properNc = size(projectionData.projectionList{1}, 1);
0167
0168
0169 projectionMatrix = eye(properNc);
0170 constraintMatrix = zeros(0, properNc);
0171
0172
0173 for iProj = find(filterVector)
0174 constraintMatrix = [constraintMatrix; ...
0175 projectionData.constraintList{iProj}];
0176 projectionMatrix = projectionMatrix * ...
0177 projectionData.projectionList{iProj};
0178 end
0179
0180 end