diff --git a/+DataKit/+Metadata/@sparseBitmask/setBit.m b/+DataKit/+Metadata/@sparseBitmask/setBit.m index 3fdc26d..4a67c15 100644 --- a/+DataKit/+Metadata/@sparseBitmask/setBit.m +++ b/+DataKit/+Metadata/@sparseBitmask/setBit.m @@ -1,4 +1,4 @@ -function obj = setBit(obj,i,j,bit,highlow) +function obj = setBit(obj,i,j,bit,highlow,varargin) % Note: % if the same bit at the same index is adressed multiple times with @@ -17,6 +17,17 @@ import DataKit.arrayhom + if nargin == 5 + fastMode = true; + elseif nargin == 6 + fastMode = varargin{1}; + if ~isscalar(fastMode) || ~islogical(fastMode) + error('Dingi:DataKit:Metadata:sparseBitmask:setBit:invalidFastModeInput',... + 'FastMode has to be provided as a scalar logical.') + end + end + + if any(bit(:) > 52) || any(bit(:) < 1) error('Dingi:DataKit:Metadata:sparseBitmask:setBit:bitPositionExceedsLimit',... 'A bit position exceeds the limits. Only bits 1 to 52 can be set.') @@ -48,13 +59,37 @@ highlow(highlow > 0) = 1; [i,j,bit,highlow] = arrayhom(i,j,bit,highlow); + + if ~fastMode + [u,uind] = unique(cat(2,i,j,bit),'rows'); + + i = u(:,1); + j = u(:,2); + bit = u(:,3); + highlow = highlow(uind); + end + if nnz(obj.Bitmask) == 0 % no non-zero elements bitmaskNew = bitset(zeros(size(bit)),bit,highlow); obj.Bitmask = sparse(i,j,bitmaskNew,Sz(1),Sz(2)); else - % non-zero elements already exist + + %%{ + ind = sub2ind(obj.Sz,i,j); + bitmaskIn = full(obj.Bitmask(ind)); + + if ~fastMode + [uInd,~,uIndInd2] = unique(ind); + bitmaskIn = bitset(bitmaskIn,bit,highlow); + bitmaskOut = accumarray(uIndInd2,bitmaskIn,size(uInd),@sum); + obj.Bitmask(uInd) = bitmaskOut; + else + obj.Bitmask(ind) = bitset(bitmaskIn,bit,highlow); + end + %} + %{ [iBm,jBm] = find(obj.Bitmask); indBm = sub2ind(obj.Sz,iBm,jBm); @@ -86,6 +121,7 @@ bitmask(indChange) = bitmaskChange; obj.Bitmask = bitmask; + %} end % for ii = 1:n diff --git a/+DataKit/+Metadata/@sparseBitmask/sparseBitmask.m b/+DataKit/+Metadata/@sparseBitmask/sparseBitmask.m index c2a4f65..ca56b4a 100644 --- a/+DataKit/+Metadata/@sparseBitmask/sparseBitmask.m +++ b/+DataKit/+Metadata/@sparseBitmask/sparseBitmask.m @@ -128,7 +128,7 @@ methods disp(obj) obj = initializeBitmask(obj,i,j,bit,sz) - obj = setBit(obj,i,j,bit,highlow) + obj = setBit(obj,i,j,bit,highlow,varargin) varargout = getBit(obj,varargin) end methods (Static, Hidden) diff --git a/+DataKit/@dataPool/applyCalibrationFunction.m b/+DataKit/@dataPool/applyCalibrationFunction.m index d2e1a83..8ce1866 100644 --- a/+DataKit/@dataPool/applyCalibrationFunction.m +++ b/+DataKit/@dataPool/applyCalibrationFunction.m @@ -70,6 +70,8 @@ obj.Data{poolIdx}(:,variableIdx) = fh(time,obj.DataRaw{poolIdx}(:,variableIdx)); + obj.IndexNeedsUpdating = true; + if nargout == 1 varargout{1} = obj; end diff --git a/+DataKit/@dataPool/setInfoProperty.m b/+DataKit/@dataPool/setInfoProperty.m index c74b10a..cde2f26 100644 --- a/+DataKit/@dataPool/setInfoProperty.m +++ b/+DataKit/@dataPool/setInfoProperty.m @@ -10,6 +10,8 @@ obj.Info(pool).(property)(idx) = value; + obj.IndexNeedsUpdating = true; + if nargout == 1 varargout{1} = obj; end diff --git a/+DataKit/@dataPool/setMeasuringDeviceProperty.m b/+DataKit/@dataPool/setMeasuringDeviceProperty.m index daa3c35..6f06ecc 100644 --- a/+DataKit/@dataPool/setMeasuringDeviceProperty.m +++ b/+DataKit/@dataPool/setMeasuringDeviceProperty.m @@ -19,6 +19,8 @@ obj.Info(pool).VariableMeasuringDevice(idx).(property) = value; + obj.IndexNeedsUpdating = true; + if nargout == 1 varargout{1} = obj; end diff --git a/+GearKit/@gearDeployment/calibrateMeasuringDevices.m b/+GearKit/@gearDeployment/calibrateMeasuringDevices.m index a699142..5ef33a0 100644 --- a/+GearKit/@gearDeployment/calibrateMeasuringDevices.m +++ b/+GearKit/@gearDeployment/calibrateMeasuringDevices.m @@ -135,6 +135,6 @@ function calibrateMeasuringDevices(obj) obj.data.setInfoProperty(pool(v),var(v),'Variable',valueVariableInfo.Variable); end end - + printDebugMessage('Info','Calibrating %s measuring device(s)... done',char(obj.gearType)) end diff --git a/+Tests/+DataKit/+Metadata/+sparseBitmask/setBit_test.m b/+Tests/+DataKit/+Metadata/+sparseBitmask/setBit_test.m index 54694f1..ab70aef 100644 --- a/+Tests/+DataKit/+Metadata/+sparseBitmask/setBit_test.m +++ b/+Tests/+DataKit/+Metadata/+sparseBitmask/setBit_test.m @@ -121,7 +121,7 @@ function testIndexExceedsSize(testCase) % setBit(testCase.Bitmask,testCase.Sz(1) + 1,1,1,1),... % 'Dingi:DataKit:Metadata:sparseBitmask:setBit:subscriptsExceedBitmaskSize') end - function testSetBit(testCase,i,j,bit,hl) + function testSetBitFastModeDisabled(testCase,i,j,bit,hl) import matlab.unittest.fixtures.SuppressedWarningsFixture import DataKit.Metadata.sparseBitmask import DataKit.arrayhom @@ -147,7 +147,7 @@ function testSetBit(testCase,i,j,bit,hl) % get actual value BitmaskA = testCase.Bitmask; - act = setBit(BitmaskA,i,j,bit,hl); + act = setBit(BitmaskA,i,j,bit,hl,false); % test without fastMode act = act.Bitmask; % determine expected bitmask @@ -159,7 +159,9 @@ function testSetBit(testCase,i,j,bit,hl) [uBits,~,uBitsInd] = unique(cat(2,ind,bit2),'rows'); % get unique index-bit touples for ii = 1:size(uBits,1) mask = uBitsInd == ii; - highlow = max(hl2(mask)); % if the same bit is addressed multiple times set it to the max of the corresponding highlow values. + highlow = hl2(find(mask,1)); % if the same bit is addressed multiple times set it to the first of the corresponding highlow values. +% highlow = max(hl2(mask)); % if the same bit is addressed multiple times set it to the first of the corresponding highlow values. + exp(uBits(ii,1)) = bitset(full(exp(uBits(ii,1))),uBits(ii,2),highlow); end