From 2952d18343a49edaae676225e33fac31c664c08d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org> Date: Thu, 10 Jun 2021 15:54:19 +0200 Subject: [PATCH] =?UTF-8?q?Testsuite:=20improve=20and=20integrate=20unit?= =?UTF-8?q?=20test=20for=20A=C2=B7(B=E2=8A=97C)=20MEX=20files?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In particular, add a test for the sparse A·(B⊗C) where B≠C. --- tests/.gitignore | 2 +- tests/Makefile.am | 11 ++++-- tests/kronecker/small_matrices.mat | Bin 320 -> 0 bytes tests/kronecker/test_kron.m | 51 ++++++++++++++++---------- tests/run_kronecker_tests.m | 56 +++++++++++++++++++++++++++++ 5 files changed, 97 insertions(+), 23 deletions(-) delete mode 100644 tests/kronecker/small_matrices.mat create mode 100644 tests/run_kronecker_tests.m diff --git a/tests/.gitignore b/tests/.gitignore index 355c011cf9..cad54782c7 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -95,7 +95,6 @@ wsOct !/kalman_filter_smoother/testsmoother.m !/kalman_steady_state/test1.m !/kronecker/nash_matrices.mat -!/kronecker/small_matrices.mat !/kronecker/test_kron.m !/load_octave_packages.m !/ls2003/data_ca1.m @@ -152,6 +151,7 @@ wsOct !/run_all_unitary_tests.m !/run_block_byte_tests_matlab.m !/run_block_byte_tests_octave.m +!/run_kronecker_tests.m !/run_m_script.m !/run_o_script.m !/run_reporting_test_matlab.m diff --git a/tests/Makefile.am b/tests/Makefile.am index ae05fc9292..38ab3118e0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1075,7 +1075,8 @@ M_TRS_FILES += run_block_byte_tests_matlab.m.trs \ run_all_unitary_tests.m.trs \ histval_initval_file_unit_tests.m.trs \ test_aggregate_routine_1_2.m.trs \ - test_aggregate_routine_1_2_3.m.trs + test_aggregate_routine_1_2_3.m.trs \ + run_kronecker_tests.m.trs M_XFAIL_TRS_FILES = $(patsubst %.mod, %.m.trs, $(XFAIL_MODFILES)) @@ -1085,7 +1086,8 @@ O_TRS_FILES += $(patsubst %.mod, %.o.trs, $(PARTICLEFILES)) O_TRS_FILES += run_block_byte_tests_octave.o.trs \ run_reporting_test_octave.o.trs \ run_all_unitary_tests.o.trs \ - histval_initval_file_unit_tests.o.trs + histval_initval_file_unit_tests.o.trs \ + run_kronecker_tests.o.trs O_XFAIL_TRS_FILES = $(patsubst %.mod, %.o.trs, $(XFAIL_MODFILES)) @@ -1255,7 +1257,10 @@ EXTRA_DIST = \ histval_initval_file/my_assert.m \ histval_initval_file/ramst_data.xls \ histval_initval_file/ramst_data.xlsx \ - histval_initval_file/ramst_initval_file_data.m + histval_initval_file/ramst_initval_file_data.m \ + run_kronecker_tests.m \ + kronecker/test_kron.m \ + kronecker/nash_matrices.mat if ENABLE_MATLAB check-local: check-matlab diff --git a/tests/kronecker/small_matrices.mat b/tests/kronecker/small_matrices.mat deleted file mode 100644 index 498427c6e9262438a7ed391521e00440a680b7d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmeZu4DoSvQZUssQ1EpO(M`+DN!3vZ$Vn_o%P-2cQgHY2i?A@$QE)CwO)N=GQOM7; zQV32gQE*93R!}fhFtD^THMBA@QZO<wFjpWIFfe-h@-Z+l1TZi#urV+&a6oAW1_lOJ zD4&^ufq|2Ofq{{Mk-?FHfq{vEfk7I~2Z@0&BSerH#AaY-WnckmX8@U-05uPnxgfJZ z<~l*`FkoO{xVlm%F7)50{c7pI{2zor-#_cFOPe_B%l%hAJpRxY`OkiC+Oh2?&V8}3 M7hYxAvv1LU0A1!fF#rGn diff --git a/tests/kronecker/test_kron.m b/tests/kronecker/test_kron.m index 956e69652c..f25776e23a 100644 --- a/tests/kronecker/test_kron.m +++ b/tests/kronecker/test_kron.m @@ -1,5 +1,5 @@ function info = test_kron(test,number_of_threads) -% Copyright (C) 2007-2020 Dynare Team +% Copyright (C) 2007-2021 Dynare Team % % This file is part of Dynare. % @@ -28,10 +28,11 @@ if test == 1 disp('') disp('I''m building the test problem...') tic - percentage_of_non_zero_elements = 10e-4; - NumberOfVariables = 549;%100; - NumberOfEquations = 256;%50 - NumberOfColsInB = 50 ; + percentage_of_non_zero_elements = 1e-3; + NumberOfVariables = 120; + NumberOfEquations = 70; + NumberOfColsInB = 50; + NumberOfColsInC = 60; A = zeros(NumberOfEquations,NumberOfVariables^2); for i = 1:NumberOfEquations for j = 1:NumberOfVariables @@ -47,38 +48,50 @@ if test == 1 end A = sparse(A); B = randn(NumberOfVariables,NumberOfColsInB); + C = randn(NumberOfVariables,NumberOfColsInC); disp('Done!') toc disp('') - disp('Computation of A*kron(B,B) with the mex file (v1):') + disp('Computation of A*kron(B,B) with the mex file:') tic D1 = sparse_hessian_times_B_kronecker_C(A,B,number_of_threads); toc - disp('') - disp('Computation of A*kron(B,B) with the mex file (v2):') + disp('Computation of A*kron(B,B) with two nested loops:') tic - D2 = sparse_hessian_times_B_kronecker_C(A,B,B,number_of_threads); + D2 = zeros(NumberOfEquations,NumberOfColsInB*NumberOfColsInB); + k = 1; + for i1 = 1:NumberOfColsInB + for i2 = 1:NumberOfColsInB + D2(:,k) = A*kron(B(:,i1),B(:,i2)); + k = k+1; + end + end toc disp(''); disp(['Difference between D1 and D2 = ' num2str(max(max(abs(D1-D2))))]); - if max(max(abs(D1-D2)))>1e-10 + if max(max(abs(D1-D2)))>1e-13 test1_1=0; end - disp(' ') - disp('Computation of A*kron(B,B) with two nested loops:') + disp('') + disp('Computation of A*kron(B,C) with the mex file:') tic - D3 = zeros(NumberOfEquations,NumberOfColsInB*NumberOfColsInB); + D3 = sparse_hessian_times_B_kronecker_C(A,B,C,number_of_threads); + toc + disp('Computation of A*kron(B,C) with two nested loops:') + tic + D4 = zeros(NumberOfEquations,NumberOfColsInB*NumberOfColsInC); k = 1; for i1 = 1:NumberOfColsInB - for i2 = 1:NumberOfColsInB - D3(:,k) = A*kron(B(:,i1),B(:,i2)); + for i2 = 1:NumberOfColsInC + D4(:,k) = A*kron(B(:,i1),C(:,i2)); k = k+1; end end toc + disp(' ') disp(''); - disp(['Difference between D1 and D3 = ' num2str(max(max(abs(D1-D3))))]); - if max(max(abs(D1-D3)))>1e-10 + disp(['Difference between D3 and D4 = ' num2str(max(max(abs(D3-D4))))]); + if max(max(abs(D3-D4)))>1e-13 test1_2=0; end % $$$ FOR THE DIMENSIONS CONSIDERED HERE THIS PART WILL RESULT IN A OUT OF MEMORY ERROR. @@ -163,7 +176,7 @@ if test==3 disp('Test with full format matrix -- 1(a)') D1 = A*kron(B,C); tic - D2 = A_times_B_kronecker_C(A,B,C,number_of_threads); + D2 = A_times_B_kronecker_C(A,B,C); toc disp(['Difference between D1 and D2 = ' num2str(max(max(abs(D1-D2))))]); if max(max(abs(D1-D2)))>1e-10 @@ -172,7 +185,7 @@ if test==3 disp('Test with full format matrix -- 1(b)') D1 = A*kron(B,B); tic - D2 = A_times_B_kronecker_C(A,B,number_of_threads); + D2 = A_times_B_kronecker_C(A,B); toc disp(['Difference between D1 and D2 = ' num2str(max(max(abs(D1-D2))))]); if max(max(abs(D1-D2)))>1e-10 diff --git a/tests/run_kronecker_tests.m b/tests/run_kronecker_tests.m new file mode 100644 index 0000000000..01cf38c964 --- /dev/null +++ b/tests/run_kronecker_tests.m @@ -0,0 +1,56 @@ +% Copyright (C) 2021 Dynare Team +% +% This file is part of Dynare. +% +% Dynare is free software: you can redistribute it and/or modify +% it under the terms of the GNU General Public License as published by +% the Free Software Foundation, either version 3 of the License, or +% (at your option) any later version. +% +% Dynare is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with Dynare. If not, see <https://www.gnu.org/licenses/>. + +top_test_dir = getenv('TOP_TEST_DIR'); +addpath([top_test_dir filesep '..' filesep 'matlab']); +dynare_config + +cd kronecker + +disp('**** Testing sparse_hessian_times_B_kronecker_C MEX...') +disp('') +disp('** Test 1') +info(1) = test_kron(1, num_procs); +disp('') +disp('** Test 2') +info(2) = test_kron(2, num_procs); +disp('') +disp('**** Testing A_times_B_kronecker_C MEX...') +info(3) = test_kron(3, num_procs); + +cd .. + +if isoctave + ext = '.o.trs'; +else + ext = '.m.trs'; +end +fid = fopen([ 'run_kronecker_tests' ext ], 'w+'); +num_failed_tests = sum(~info); +tests = { 'sparse1', 'sparse2', 'dense' }; +failed_tests = tests(find(~info)); +if num_failed_tests > 0 + fprintf(fid,':test-result: FAIL\n'); + fprintf(fid,':number-tests: 3\n'); + fprintf(fid,':number-failed-tests: %d\n', num_failed_tests); + fprintf(fid,':list-of-failed-tests: %s\n', failed_tests{:}); +else + fprintf(fid,':test-result: PASS\n'); + fprintf(fid,':number-tests: 3\n'); + fprintf(fid,':number-failed-tests: 0\n'); +end +fclose(fid); -- GitLab