From 70598074820b53bc67a6f32fec5696d3aa046425 Mon Sep 17 00:00:00 2001 From: Chris Marooney Date: Thu, 12 Dec 2024 10:28:25 +0000 Subject: [PATCH 1/4] add and test hash serialize --- .../store2020_1.mat | Bin 0 -> 2888 bytes .../test_unique_objects.m | 10 ++++ .../@serializable/private/from_bare_struct_.m | 1 + .../private/check_combo_arg_.m | 7 +-- .../unique_objects_container.m | 45 ++++++++++++++++-- 5 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 _test/test_unique_objects_container/store2020_1.mat diff --git a/_test/test_unique_objects_container/store2020_1.mat b/_test/test_unique_objects_container/store2020_1.mat new file mode 100644 index 0000000000000000000000000000000000000000..0986498cef3edff20b9707e1bc6eab2d7dbb4cbd GIT binary patch literal 2888 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 literal 0 HcmV?d00001 diff --git a/_test/test_unique_objects_container/test_unique_objects.m b/_test/test_unique_objects_container/test_unique_objects.m index 279f1ca989..b71889adf7 100644 --- a/_test/test_unique_objects_container/test_unique_objects.m +++ b/_test/test_unique_objects_container/test_unique_objects.m @@ -496,5 +496,15 @@ function test_arrays_of_containers(obj) assertTrue(isa(arr{2},'unique_objects_container')); end + function test_hashing_preserved_over_save_and_load(obj) + uoc = unique_objects_container('baseclass','IX_inst'); + uoc{1} = obj.mi1; + uoc{2} = IX_null_inst(); + save('store2020_1.mat','uoc'); + zzz = load('store2020_1.mat'); + assertEqual(uoc.stored_hashes, zzz.uoc.stored_hashes); + + end + end end diff --git a/herbert_core/utilities/classes/@serializable/private/from_bare_struct_.m b/herbert_core/utilities/classes/@serializable/private/from_bare_struct_.m index 79e870bf68..14b2038237 100644 --- a/herbert_core/utilities/classes/@serializable/private/from_bare_struct_.m +++ b/herbert_core/utilities/classes/@serializable/private/from_bare_struct_.m @@ -79,6 +79,7 @@ obj(i).do_check_combo_arg_ = true; % Check interdependent properties. If the object is invalid, an % exception is thrown + obj(i) = obj(i).check_combo_arg(); end if nobj > 1 diff --git a/herbert_core/utilities/classes/@unique_objects_container/private/check_combo_arg_.m b/herbert_core/utilities/classes/@unique_objects_container/private/check_combo_arg_.m index 0420901a61..a83e510b0f 100644 --- a/herbert_core/utilities/classes/@unique_objects_container/private/check_combo_arg_.m +++ b/herbert_core/utilities/classes/@unique_objects_container/private/check_combo_arg_.m @@ -45,6 +45,7 @@ obj.baseclass,disp2str(non_type_ind),class(invalid_obj)) end end -if do_rehashify - obj = obj.rehashify_all(with_checks); -end +% not doing rehashify here as hashes are now loaded from a saved object +%if do_rehashify +% obj = obj.rehashify_all(with_checks); +%end diff --git a/herbert_core/utilities/classes/@unique_objects_container/unique_objects_container.m b/herbert_core/utilities/classes/@unique_objects_container/unique_objects_container.m index b3e6299988..0c8e5faef4 100644 --- a/herbert_core/utilities/classes/@unique_objects_container/unique_objects_container.m +++ b/herbert_core/utilities/classes/@unique_objects_container/unique_objects_container.m @@ -195,6 +195,17 @@ error('HERBERT:unique_objects_container:invalid_set', ... 'attempt to set unique objects in container outside of loadobj'); end + %--{ + if ~isempty(self.stored_hashes_) + for ii = 1:numel(self.stored_hashes_) + hash = self.stored_hashes_{ii}; + hash2 = Hashing.hashify_obj(self.unique_objects_{ii}); + if hash ~= hash2 + error("bad hash"); + end + end + end + %--} end % function x = get.stored_hashes(self) @@ -202,6 +213,31 @@ % objects. Only really useful for debugging. x = self.stored_hashes_; end + + function self = set.stored_hashes(self, val) + %GET.STORED_HASHES - list the hashes corresponding to the unique + % objects. Only really useful for debugging. + if ~self.do_check_combo_arg_ + if ~iscell(val) + val = {val}; + end + self.stored_hashes_ = val; + else + error('HERBERT:unique_objects_container:invalid_set', ... + 'attempt to set stored hashes in container outside of loadobj'); + end + %--{ + if ~isempty(self.unique_objects_) + for ii = 1:numel(self.unique_objects) + obj = self.unique_objects_{ii}; + hash = Hashing.hashify_obj(obj); + if hash ~= self.stored_hashes_{ii} + error("bad hash"); + end + end + end + %--} + end % function x = get.idx(self) %GET.IDX - get the indices of each stored object in the container @@ -795,6 +831,7 @@ function list(self,field) fields_to_save_ = { 'baseclass', ... 'unique_objects',... + 'stored_hashes', ... 'idx', ... 'conv_func_string'}; end @@ -847,9 +884,11 @@ function list(self,field) % save-able class obj = unique_objects_container(); obj = loadobj@serializable(S,obj); - if obj.do_check_combo_arg - obj.check_combo_arg(true,true); - end + % not doing a check combo arg here as it is done in the loadobj + % of serializable above + %if obj.do_check_combo_arg + % obj.check_combo_arg(true,true); + %end end function out = concatenate(objs, type) From bd847e7c3b3ecd5a45e26834da7dcf6dbcd91050 Mon Sep 17 00:00:00 2001 From: Chris Marooney Date: Thu, 12 Dec 2024 17:12:21 +0000 Subject: [PATCH 2/4] fix required hashing --- .../@unique_objects_container/private/check_combo_arg_.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/herbert_core/utilities/classes/@unique_objects_container/private/check_combo_arg_.m b/herbert_core/utilities/classes/@unique_objects_container/private/check_combo_arg_.m index a83e510b0f..890704ff25 100644 --- a/herbert_core/utilities/classes/@unique_objects_container/private/check_combo_arg_.m +++ b/herbert_core/utilities/classes/@unique_objects_container/private/check_combo_arg_.m @@ -49,3 +49,6 @@ %if do_rehashify % obj = obj.rehashify_all(with_checks); %end +if isempty(obj.stored_hashes_) && ~isempty(obj.unique_objects) + obj = obj.rehashify_all(with_checks); +end From 1aa5aa5f4ca6456a94e466472955eef68f702557 Mon Sep 17 00:00:00 2001 From: Chris Marooney Date: Fri, 13 Dec 2024 15:38:43 +0000 Subject: [PATCH 3/4] remove temporary error checks --- .../unique_objects_container.m | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/herbert_core/utilities/classes/@unique_objects_container/unique_objects_container.m b/herbert_core/utilities/classes/@unique_objects_container/unique_objects_container.m index 0c8e5faef4..463b7a65f3 100644 --- a/herbert_core/utilities/classes/@unique_objects_container/unique_objects_container.m +++ b/herbert_core/utilities/classes/@unique_objects_container/unique_objects_container.m @@ -195,7 +195,10 @@ error('HERBERT:unique_objects_container:invalid_set', ... 'attempt to set unique objects in container outside of loadobj'); end - %--{ + %{ + % test that the current hashing reproduces the hashing loaded + % from file. Note that this code will cause some tests to fail + % that deliberately corrupt the container. if ~isempty(self.stored_hashes_) for ii = 1:numel(self.stored_hashes_) hash = self.stored_hashes_{ii}; @@ -205,7 +208,7 @@ end end end - %--} + %} end % function x = get.stored_hashes(self) @@ -226,7 +229,10 @@ error('HERBERT:unique_objects_container:invalid_set', ... 'attempt to set stored hashes in container outside of loadobj'); end - %--{ + %{ + % test that the current hashing reproduces the hashing loaded + % from file. Note that this code will cause some tests to fail + % that deliberately corrupt the container. if ~isempty(self.unique_objects_) for ii = 1:numel(self.unique_objects) obj = self.unique_objects_{ii}; @@ -236,7 +242,7 @@ end end end - %--} + %} end % function x = get.idx(self) From f6efdf9f602d3402cd597adde5b213b16b554cba Mon Sep 17 00:00:00 2001 From: Chris Marooney Date: Fri, 13 Dec 2024 15:56:21 +0000 Subject: [PATCH 4/4] complete version testing --- .../store2020_1.mat | Bin 2888 -> 2888 bytes .../store2024_1.mat | Bin 0 -> 2940 bytes .../store_current.mat | Bin 0 -> 2888 bytes .../test_unique_objects.m | 10 +++++++++- .../@serializable/private/from_bare_struct_.m | 1 - 5 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 _test/test_unique_objects_container/store2024_1.mat create mode 100644 _test/test_unique_objects_container/store_current.mat diff --git a/_test/test_unique_objects_container/store2020_1.mat b/_test/test_unique_objects_container/store2020_1.mat index 0986498cef3edff20b9707e1bc6eab2d7dbb4cbd..c282e41ab8b22b0b21ab464250039e9f38f7f30c 100644 GIT binary patch delta 41 xcmX>hc0z1|iG*8Grh-dqvVx(pf}yFEv89!%p@NZtk;%kB<%tQb8%wTm0Ra9<3>*Le delta 41 xcmX>hc0z1|i9~p6ih@gOvVx(Zf}w?#fti)5rGk-xk;%kB<%tQb8%wTm0RaA43?2Xg diff --git a/_test/test_unique_objects_container/store2024_1.mat b/_test/test_unique_objects_container/store2024_1.mat new file mode 100644 index 0000000000000000000000000000000000000000..a69bf10d68cf340c06fa8d9040a84675f7000123 GIT binary patch literal 2940 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 literal 0 HcmV?d00001 diff --git a/_test/test_unique_objects_container/test_unique_objects.m b/_test/test_unique_objects_container/test_unique_objects.m index b71889adf7..eaef3ab98b 100644 --- a/_test/test_unique_objects_container/test_unique_objects.m +++ b/_test/test_unique_objects_container/test_unique_objects.m @@ -500,9 +500,17 @@ function test_hashing_preserved_over_save_and_load(obj) uoc = unique_objects_container('baseclass','IX_inst'); uoc{1} = obj.mi1; uoc{2} = IX_null_inst(); - save('store2020_1.mat','uoc'); + % store the current uoc and compare its save/load with the + % initial construct + save('store_current.mat','uoc'); + zzz = load('store_current.mat'); + assertEqual(uoc.stored_hashes, zzz.uoc.stored_hashes); + % load the one created with R2020b and compare zzz = load('store2020_1.mat'); assertEqual(uoc.stored_hashes, zzz.uoc.stored_hashes); + % load the one created with r2024b and compare + zzz = load('store2024_1.mat'); + assertEqual(uoc.stored_hashes, zzz.uoc.stored_hashes); end diff --git a/herbert_core/utilities/classes/@serializable/private/from_bare_struct_.m b/herbert_core/utilities/classes/@serializable/private/from_bare_struct_.m index 14b2038237..79e870bf68 100644 --- a/herbert_core/utilities/classes/@serializable/private/from_bare_struct_.m +++ b/herbert_core/utilities/classes/@serializable/private/from_bare_struct_.m @@ -79,7 +79,6 @@ obj(i).do_check_combo_arg_ = true; % Check interdependent properties. If the object is invalid, an % exception is thrown - obj(i) = obj(i).check_combo_arg(); end if nobj > 1