Mercurial > octave-nkf
changeset 16029:b8157404614f
fix file names
* build-bc-overload-tests.sh: Rename from build_bc_overload_tests.sh.
* bc-overloads-expected: Rename from bc_overloads_expected.
* build-sparse-tests.sh: Rename from build_sparse_tests.sh.
* Makefile.am: Update.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Sat, 09 Feb 2013 20:05:40 -0500 |
parents | 85b8a1d435d6 |
children | 1af8d21608b7 |
files | test/bc-overloads-expected test/bc_overloads_expected test/build-bc-overload-tests.sh test/build-sparse-tests.sh test/build_bc_overload_tests.sh test/build_sparse_tests.sh |
diffstat | 6 files changed, 1690 insertions(+), 1690 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/bc-overloads-expected Sat Feb 09 20:05:40 2013 -0500 @@ -0,0 +1,225 @@ +double double double +double single single +double logical double +double char double +double int8 int8 +double int16 int16 +double int32 int32 +double int64 int64 +double uint8 uint8 +double uint16 uint16 +double uint32 uint32 +double uint64 uint64 +double cell cell +double struct struct +double function_handle function_handle +single double single +single single single +single logical single +single char single +single int8 int8 +single int16 int16 +single int32 int32 +single int64 int64 +single uint8 uint8 +single uint16 uint16 +single uint32 uint32 +single uint64 uint64 +single cell cell +single struct struct +single function_handle function_handle +logical double double +logical single single +logical logical logical +logical char char +logical int8 int8 +logical int16 int16 +logical int32 int32 +logical int64 int64 +logical uint8 uint8 +logical uint16 uint16 +logical uint32 uint32 +logical uint64 uint64 +logical cell cell +logical struct struct +logical function_handle function_handle +char double char +char single single +char logical char +char char char +char int8 int8 +char int16 int16 +char int32 int32 +char int64 int64 +char uint8 uint8 +char uint16 uint16 +char uint32 uint32 +char uint64 uint64 +char cell cell +char struct struct +char function_handle function_handle +int8 double int8 +int8 single int8 +int8 logical int8 +int8 char int8 +int8 int8 int8 +int8 int16 int8 +int8 int32 int8 +int8 int64 int8 +int8 uint8 int8 +int8 uint16 int8 +int8 uint32 int8 +int8 uint64 int8 +int8 cell cell +int8 struct struct +int8 function_handle function_handle +int16 double int16 +int16 single int16 +int16 logical int16 +int16 char int16 +int16 int8 int16 +int16 int16 int16 +int16 int32 int16 +int16 int64 int16 +int16 uint8 int16 +int16 uint16 int16 +int16 uint32 int16 +int16 uint64 int16 +int16 cell cell +int16 struct struct +int16 function_handle function_handle +int32 double int32 +int32 single int32 +int32 logical int32 +int32 char int32 +int32 int8 int32 +int32 int16 int32 +int32 int32 int32 +int32 int64 int32 +int32 uint8 int32 +int32 uint16 int32 +int32 uint32 int32 +int32 uint64 int32 +int32 cell cell +int32 struct struct +int32 function_handle function_handle +int64 double int64 +int64 single int64 +int64 logical int64 +int64 char int64 +int64 int8 int64 +int64 int16 int64 +int64 int32 int64 +int64 int64 int64 +int64 uint8 int64 +int64 uint16 int64 +int64 uint32 int64 +int64 uint64 int64 +int64 cell cell +int64 struct struct +int64 function_handle function_handle +uint8 double uint8 +uint8 single uint8 +uint8 logical uint8 +uint8 char uint8 +uint8 int8 uint8 +uint8 int16 uint8 +uint8 int32 uint8 +uint8 int64 uint8 +uint8 uint8 uint8 +uint8 uint16 uint8 +uint8 uint32 uint8 +uint8 uint64 uint8 +uint8 cell cell +uint8 struct struct +uint8 function_handle function_handle +uint16 double uint16 +uint16 single uint16 +uint16 logical uint16 +uint16 char uint16 +uint16 int8 uint16 +uint16 int16 uint16 +uint16 int32 uint16 +uint16 int64 uint16 +uint16 uint8 uint16 +uint16 uint16 uint16 +uint16 uint32 uint16 +uint16 uint64 uint16 +uint16 cell cell +uint16 struct struct +uint16 function_handle function_handle +uint32 double uint32 +uint32 single uint32 +uint32 logical uint32 +uint32 char uint32 +uint32 int8 uint32 +uint32 int16 uint32 +uint32 int32 uint32 +uint32 int64 uint32 +uint32 uint8 uint32 +uint32 uint16 uint32 +uint32 uint32 uint32 +uint32 uint64 uint32 +uint32 cell cell +uint32 struct struct +uint32 function_handle function_handle +uint64 double uint64 +uint64 single uint64 +uint64 logical uint64 +uint64 char uint64 +uint64 int8 uint64 +uint64 int16 uint64 +uint64 int32 uint64 +uint64 int64 uint64 +uint64 uint8 uint64 +uint64 uint16 uint64 +uint64 uint32 uint64 +uint64 uint64 uint64 +uint64 cell cell +uint64 struct struct +uint64 function_handle function_handle +cell double cell +cell single cell +cell logical cell +cell char cell +cell int8 cell +cell int16 cell +cell int32 cell +cell int64 cell +cell uint8 cell +cell uint16 cell +cell uint32 cell +cell uint64 cell +cell cell cell +cell struct cell +cell function_handle function_handle +struct double struct +struct single struct +struct logical struct +struct char struct +struct int8 struct +struct int16 struct +struct int32 struct +struct int64 struct +struct uint8 struct +struct uint16 struct +struct uint32 struct +struct uint64 struct +struct cell struct +struct struct struct +struct function_handle function_handle +function_handle double function_handle +function_handle single function_handle +function_handle logical function_handle +function_handle char function_handle +function_handle int8 function_handle +function_handle int16 function_handle +function_handle int32 function_handle +function_handle int64 function_handle +function_handle uint8 function_handle +function_handle uint16 function_handle +function_handle uint32 function_handle +function_handle uint64 function_handle +function_handle cell function_handle +function_handle struct function_handle +function_handle function_handle function_handle
--- a/test/bc_overloads_expected Sat Feb 09 19:54:05 2013 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,225 +0,0 @@ -double double double -double single single -double logical double -double char double -double int8 int8 -double int16 int16 -double int32 int32 -double int64 int64 -double uint8 uint8 -double uint16 uint16 -double uint32 uint32 -double uint64 uint64 -double cell cell -double struct struct -double function_handle function_handle -single double single -single single single -single logical single -single char single -single int8 int8 -single int16 int16 -single int32 int32 -single int64 int64 -single uint8 uint8 -single uint16 uint16 -single uint32 uint32 -single uint64 uint64 -single cell cell -single struct struct -single function_handle function_handle -logical double double -logical single single -logical logical logical -logical char char -logical int8 int8 -logical int16 int16 -logical int32 int32 -logical int64 int64 -logical uint8 uint8 -logical uint16 uint16 -logical uint32 uint32 -logical uint64 uint64 -logical cell cell -logical struct struct -logical function_handle function_handle -char double char -char single single -char logical char -char char char -char int8 int8 -char int16 int16 -char int32 int32 -char int64 int64 -char uint8 uint8 -char uint16 uint16 -char uint32 uint32 -char uint64 uint64 -char cell cell -char struct struct -char function_handle function_handle -int8 double int8 -int8 single int8 -int8 logical int8 -int8 char int8 -int8 int8 int8 -int8 int16 int8 -int8 int32 int8 -int8 int64 int8 -int8 uint8 int8 -int8 uint16 int8 -int8 uint32 int8 -int8 uint64 int8 -int8 cell cell -int8 struct struct -int8 function_handle function_handle -int16 double int16 -int16 single int16 -int16 logical int16 -int16 char int16 -int16 int8 int16 -int16 int16 int16 -int16 int32 int16 -int16 int64 int16 -int16 uint8 int16 -int16 uint16 int16 -int16 uint32 int16 -int16 uint64 int16 -int16 cell cell -int16 struct struct -int16 function_handle function_handle -int32 double int32 -int32 single int32 -int32 logical int32 -int32 char int32 -int32 int8 int32 -int32 int16 int32 -int32 int32 int32 -int32 int64 int32 -int32 uint8 int32 -int32 uint16 int32 -int32 uint32 int32 -int32 uint64 int32 -int32 cell cell -int32 struct struct -int32 function_handle function_handle -int64 double int64 -int64 single int64 -int64 logical int64 -int64 char int64 -int64 int8 int64 -int64 int16 int64 -int64 int32 int64 -int64 int64 int64 -int64 uint8 int64 -int64 uint16 int64 -int64 uint32 int64 -int64 uint64 int64 -int64 cell cell -int64 struct struct -int64 function_handle function_handle -uint8 double uint8 -uint8 single uint8 -uint8 logical uint8 -uint8 char uint8 -uint8 int8 uint8 -uint8 int16 uint8 -uint8 int32 uint8 -uint8 int64 uint8 -uint8 uint8 uint8 -uint8 uint16 uint8 -uint8 uint32 uint8 -uint8 uint64 uint8 -uint8 cell cell -uint8 struct struct -uint8 function_handle function_handle -uint16 double uint16 -uint16 single uint16 -uint16 logical uint16 -uint16 char uint16 -uint16 int8 uint16 -uint16 int16 uint16 -uint16 int32 uint16 -uint16 int64 uint16 -uint16 uint8 uint16 -uint16 uint16 uint16 -uint16 uint32 uint16 -uint16 uint64 uint16 -uint16 cell cell -uint16 struct struct -uint16 function_handle function_handle -uint32 double uint32 -uint32 single uint32 -uint32 logical uint32 -uint32 char uint32 -uint32 int8 uint32 -uint32 int16 uint32 -uint32 int32 uint32 -uint32 int64 uint32 -uint32 uint8 uint32 -uint32 uint16 uint32 -uint32 uint32 uint32 -uint32 uint64 uint32 -uint32 cell cell -uint32 struct struct -uint32 function_handle function_handle -uint64 double uint64 -uint64 single uint64 -uint64 logical uint64 -uint64 char uint64 -uint64 int8 uint64 -uint64 int16 uint64 -uint64 int32 uint64 -uint64 int64 uint64 -uint64 uint8 uint64 -uint64 uint16 uint64 -uint64 uint32 uint64 -uint64 uint64 uint64 -uint64 cell cell -uint64 struct struct -uint64 function_handle function_handle -cell double cell -cell single cell -cell logical cell -cell char cell -cell int8 cell -cell int16 cell -cell int32 cell -cell int64 cell -cell uint8 cell -cell uint16 cell -cell uint32 cell -cell uint64 cell -cell cell cell -cell struct cell -cell function_handle function_handle -struct double struct -struct single struct -struct logical struct -struct char struct -struct int8 struct -struct int16 struct -struct int32 struct -struct int64 struct -struct uint8 struct -struct uint16 struct -struct uint32 struct -struct uint64 struct -struct cell struct -struct struct struct -struct function_handle function_handle -function_handle double function_handle -function_handle single function_handle -function_handle logical function_handle -function_handle char function_handle -function_handle int8 function_handle -function_handle int16 function_handle -function_handle int32 function_handle -function_handle int64 function_handle -function_handle uint8 function_handle -function_handle uint16 function_handle -function_handle uint32 function_handle -function_handle uint64 function_handle -function_handle cell function_handle -function_handle struct function_handle -function_handle function_handle function_handle
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/build-bc-overload-tests.sh Sat Feb 09 20:05:40 2013 -0500 @@ -0,0 +1,139 @@ +#! /bin/sh + +# Copyright (C) 2010-2012 VZLU Prague +# +# This file is part of Octave. +# +# Octave 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. +# +# Octave 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 Octave; see the file COPYING. If not, see +# <http://www.gnu.org/licenses/>. + +CLASSES=" + double + single + char + logical + int8 + int16 + int32 + int64 + uint8 + uint16 + uint32 + uint64 + struct + cell + function_handle +" + +if [ $# -eq 1 ]; then + case "$1" in + --list-files) + echo tbcover.m + echo test_bc_overloads.m + for class in $CLASSES; do + echo @$class/tbcover.m + done + exit + ;; + --list-dirs) + for class in $CLASSES; do + echo @$class + done + exit + ;; + --list-classes) + echo $CLASSES + exit + ;; + *) + expected_results_file="$1" + ;; + esac +else + echo "usage: build_bc_overload_tests.sh expected-results-file" 1>&2 + exit 1 +fi + +for class in $CLASSES; do + DIR="@$class" + test -d $DIR || mkdir $DIR || { echo "error: could not create $DIR"; exit; } + cat > $DIR/tbcover.m << EOF +% !!! DO NOT EDIT !!! +% generated automatically by build_bc_overload_tests.sh +function s = tbcover (x, y) + s = '$class'; +EOF +done + +cat > tbcover.m << EOF +% !!! DO NOT EDIT !!! +% generated automatically by build_bc_overload_tests.sh +function s = tbcover (x, y) + s = 'none'; +EOF + +if test "$1" = "overloads_only" ; then + exit +fi + +cat > test_bc_overloads.m << EOF +## !!! DO NOT EDIT !!! +## THIS IS AN AUTOMATICALLY GENERATED FILE +## modify build_bc_overload_tests.sh to generate the tests you need. + +%!shared ex +%! ex.double = 1; +%! ex.single = single(1); +%! ex.logical = true; +%! ex.char = 'char'; +%! ex.int8 = int8 (1); +%! ex.int16 = int16 (1); +%! ex.int32 = int32 (1); +%! ex.int64 = int64 (1); +%! ex.uint8 = uint8 (1); +%! ex.uint16 = uint16 (1); +%! ex.uint32 = uint32 (1); +%! ex.uint64 = uint64 (1); +%! ex.cell = {}; +%! ex.struct = struct (); +%! ex.function_handle = @numel; + +EOF + +cat $expected_results_file | \ +while read cl1 cl2 clr ; do + cat >> test_bc_overloads.m << EOF +%% Name call +%!assert (tbcover (ex.$cl1, ex.$cl2), "$clr") +%% Handle call +%!assert ((@tbcover) (ex.$cl1, ex.$cl2), "$clr") + +EOF +done + +cat >> test_bc_overloads.m << EOF +%%test handles through cellfun +%!test +%! f = fieldnames (ex); +%! n = numel (f); +%! s = c1 = c2 = cell (n); +%! for i = 1:n +%! for j = 1:n +%! c1{i,j} = ex.(f{i}); +%! c2{i,j} = ex.(f{j}); +%! s{i,j} = tbcover (ex.(f{i}), ex.(f{j})); +%! endfor +%! endfor +%! assert (cellfun (@tbcover, c1, c2, "uniformoutput", false), s); +EOF
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/build-sparse-tests.sh Sat Feb 09 20:05:40 2013 -0500 @@ -0,0 +1,1326 @@ +#!/bin/sh + +# Copyright (C) 2006-2012 David Bateman +# +# This file is part of Octave. +# +# Octave 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. +# +# Octave 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 Octave; see the file COPYING. If not, see +# <http://www.gnu.org/licenses/>. + +# Some tests are commented out because they are known to be broken! +# Search for "# fails" + +# ./build_sparse_tests.sh preset +# creates test_sparse.m with preset tests. +# Use "test test_sparse" from octave to run the tests. +# +# ./build_sparse_tests.sh random +# Creates test_sprandom.m with randomly generated matrices. +# Use "test test_sprandom" from octave to run the tests. + +# build_sparse_tests.sh generates tests for real and complex sparse matrices. +# Also, we want to run both fixed tests with known outputs (quick tests) +# and longer tests with unknown outputs (thorough tests). This requires +# two sets of tests -- one which uses preset matrices and another which +# uses randomly generated matrices. +# +# The tests are mostly identical for each case but the code is different, +# so it is important that the tests be run on all cases. Because our test +# harness doesn't have support for looping or macros (it is only needed +# for new data types), but sh does, we use sh to generate inline versions of +# the tests for each case. +# +# Our 'macros' use shared variables as parameters. This allows us to +# for example define A complex and include all the unary ops tests, +# then set A=real(A) and include all the unary ops tests. Thus the +# same tests work for real and complex. For binary tests it is even +# more complicated because we want full X sparse, sparse X full and +# sparse X sparse tested. +# +# We use the following macros: +# +# gen_section +# place a separator in the test file +# gen_function +# define the function definion +# helper gen_specific +# specific tests such as error handling and null input +# helper gen_eat_zeros +# make sure sparse-scalar ops which generate 0 work +# gen_specific_tests +# specific and eat zeros tests +# helper gen_ordering_tests +# ordered comparison operators for real valued tests +# helper gen_sparsesparse_ordering_tests +# ordered comparison operators for real valued sparse-sparse tests +# helper gen_elementop_tests +# element-wise matrix binary operators, including scalar-matrix ops. +# horizontal/vertical concatenation are here as well. +# helper gen_sparsesparse_elementop_tests +# element-wise matrix binary operators, for sparse-sparse ops. +# horizontal/vertical concatenation are here as well. +# helper gen_divop_tests +# left and right matrix division operators of rectangular matrices. +# Needs QR solvers +# helper gen_square_divop_tests +# left and right matrix division operators of square matrices. +# helper gen_matrixop_tests +# rectangular matrix binary operators: * +# helper gen_matrixdiag_tests +# Tests extract of diag and creation of diagonal matrices using +# diag and spdiags functions +# helper gen_matrixreshape_tests +# Test the reshape function on sparse matrices +# helper print_mapper_test +# sub-helper function of gen_mapper_tests to print individual tests +# helper gen_mapper_tests +# Tests all of the one argument mapper functions. There are a few +# specific tests that abs, real and imag return real values. +# helper gen_unaryop_tests +# functions and operators which transform a single matrix +# helper gen_save_tests +# Tests the load/save functionality for ascii/binary and hdf5 formats +# gen_scalar_tests +# element ops for real and complex scalar and sparse +# gen_rectangular_tests +# unary, element, and matrix tests for a and full/sparse b +# gen_square_tests +# operations which require square matrices: lu, inv, \ +# A square non-singular matrix is defined from the rectangular +# inputs A and B. +# gen_assembly_tests +# test for sparse constructors with 'sum' vs. 'unique' +# gen_select_tests +# indexing and assignment tests +# gen_solver_tests +# Tests the solve function with triangular/banded, etc matrices + +case $1 in + random) preset=false ;; + preset) preset=true ;; + '') preset=true ;; + *) echo "build_sparse_tests.sh random|preset" && exit 1 ;; +esac + +if $preset; then + TESTS=test_sparse.m +else + TESTS=test_sprandom.m +fi + +# create initial file +cat >$TESTS <<EOF +## !!! DO NOT EDIT !!! +## THIS IS AN AUTOMATICALLY GENERATED FILE +## modify build_sparse_tests.sh to generate the tests you need. +EOF + + +# define all functions + + +# ======================================================= +# Section separator + +gen_section() { +cat >>$TESTS <<EOF + +# ============================================================== + +EOF +} + + +# ======================================================= +# Specific preset tests + +# ======================================================= +# If a sparse operation yields zeros, then those elements +# of the returned sparse matrix should be eaten. +gen_eat_zeros() { +cat >>$TESTS <<EOF +%% Make sure newly introduced zeros get eaten +%!assert (nnz (sparse ([bf,bf,1]).^realmax), 1) +%!assert (nnz (sparse ([1,bf,bf]).^realmax), 1) +%!assert (nnz (sparse ([bf,bf,bf]).^realmax), 0) + +%!assert (nnz (sparse ([bf;bf;1]).^realmax), 1) +%!assert (nnz (sparse ([1;bf;bf]).^realmax), 1) +%!assert (nnz (sparse ([0.5;bf;bf]).^realmax), 0) + +%!assert (nnz (sparse ([bf,bf,1])*realmin), 1) +%!assert (nnz (sparse ([1,bf,bf])*realmin), 1) +%!assert (nnz (sparse ([bf,bf,bf])*realmin), 0) + +%!assert (nnz (sparse ([bf;bf;1])*realmin), 1) +%!assert (nnz (sparse ([1;bf;bf])*realmin), 1) +%!assert (nnz (sparse ([bf;bf;bf])*realmin), 0) + +EOF +} + +gen_specific() { +cat >>$TESTS <<EOF + +%!test # segfault test from edd@debian.org +%! n = 510; +%! sparse (kron ((1:n)', ones(n,1)), kron (ones(n,1), (1:n)'), ones (n)); + +%% segfault tests from Fabian@isas-berlin.de +%% Note that the last four do not fail, but rather give a warning +%% of a singular matrix, which is consistent with the full matrix +%% behaviour. They are therefore disabled. +%!testif HAVE_UMFPACK +%! assert (inv (sparse ([1,1;1,1+i])), sparse([1-1i,1i;1i,-1i]), 10*eps); +%#!error inv ( sparse ([1,1;1,1] ) ); +%#!error inv ( sparse ([0,0;0,1] ) ); +%#!error inv ( sparse ([0,0;0,1+i]) ); +%#!error inv ( sparse ([0,0;0,0] ) ); + +%% error handling in constructor +%!error sparse (1,[2,3],[1,2,3]) +%!error sparse ([1,1],[1,1],[1,2],3,3,"bogus") +%!error sparse ([1,3],[1,-4],[3,5],2,2) +%!error sparse ([1,3],[1,-4],[3,5i],2,2) +%!error sparse (-1,-1,1) +EOF +} + + +gen_specific_tests() { + gen_section + gen_specific + gen_section + echo '%!shared bf' >> $TESTS + echo '%!test bf=realmin;' >> $TESTS + gen_eat_zeros + echo '%!test bf=realmin+realmin*1i;' >> $TESTS + gen_eat_zeros + cat >>$TESTS <<EOF +%!assert (nnz (sparse ([-1,realmin,realmin]).^1.5), 1) +%!assert (nnz (sparse ([-1,realmin,realmin,1]).^1.5), 2) + +## Make sure scalar v==0 doesn't confuse matters +%!assert (nnz (sparse (1,1,0)), 0) +%!assert (nnz (sparse (eye (3))*0), 0) +%!assert (nnz (sparse (eye (3))-sparse (eye (3))), 0) + +%!test +%! wdbz = warning ("query", "Octave:divide-by-zero"); +%! warning ("off", "Octave:divide-by-zero"); +%! assert (full (sparse (eye (3))/0), full (eye (3)/0)); +%! warning (wdbz.state, "Octave:divide-by-zero"); + +EOF +} + + +# ======================================================= +# Main function definition + +gen_function() { + if $preset; then + cat >>$TESTS <<EOF +## +## test_sparse +## +## run preset sparse tests. All should pass. +function [passes, tests] = test_sparse + disp ("writing test output to sptest.log"); + test ("test_sparse", "normal", "sptest.log"); +endfunction + +EOF + else + cat >>$TESTS <<EOF +## +## test_sprandom +## +## total_passes=0; total_tests=0; +## for i=1:10 +## [passes,tests] = sprandomtest; +## total_passes += passes; +## total_tests += tests; +## end +## The test log is appended to sprandomtest.log +function [passes,total] = test_sprandom + warning ("untested --- fix the source in build_sparse_tests.sh"); + disp ("appending test output to sprandomtest.log"); + fid = fopen ("sprandomtest.log", "at"); + test ("test_sprandom", "normal", fid); + ##[passes, total] = test("sprandomtest","normal",fid); + fclose (fid); +endfunction + +EOF + fi + +} + + +# ======================================================= +# matrix ops + +# test ordered comparisons: uses as,af,bs,bf +gen_ordering_tests() { + cat >>$TESTS <<EOF +%% real values can be ordered (uses as,af) +%!assert (as<=bf, sparse (af<=bf)) +%!assert (bf<=as, sparse (bf<=af)) + +%!assert (as>=bf, sparse (af>=bf)) +%!assert (bf>=as, sparse (bf>=af)) + +%!assert (as<bf, sparse (af<bf)) +%!assert (bf<as, sparse (bf<af)) + +%!assert (as>bf, sparse (af>bf)) +%!assert (bf>as, sparse (bf>af)) + +EOF +} + +gen_sparsesparse_ordering_tests() { + cat >>$TESTS <<EOF +%!assert (as<=bs, sparse (af<=bf)) +%!assert (as>=bs, sparse (af>=bf)) +%!assert (as<bs, sparse (af<bf)) +%!assert (as>bs, sparse (af>bf)) +EOF +} + +# test element-wise binary operations: uses as,af,bs,bf,scalar +gen_elementop_tests() { + cat >>$TESTS <<EOF +%% Elementwise binary tests (uses as,af,bs,bf,scalar) +%!assert (as==bs, sparse (af==bf)) +%!assert (bf==as, sparse (bf==af)) + +%!assert (as!=bf, sparse (af!=bf)) +%!assert (bf!=as, sparse (bf!=af)) + +%!assert (as+bf, af+bf) +%!assert (bf+as, bf+af) + +%!assert (as-bf, af-bf) +%!assert (bf-as, bf-af) + +%!assert (as.*bf, sparse (af.*bf)) +%!assert (bf.*as, sparse (bf.*af)) + +%!assert (as./bf, sparse (af./bf), 100*eps) +%!assert (bf.\as, sparse (bf.\af), 100*eps) + +%!test +%! sv = as.^bf; +%! fv = af.^bf; +%! idx = find (af~=0); +%! assert (sv(:)(idx), sparse (fv(:)(idx)), 100*eps) + +EOF +} + +gen_sparsesparse_elementop_tests() { + cat >>$TESTS <<EOF +%!assert (as==bs, sparse (af==bf)) +%!assert (as!=bs, sparse (af!=bf)) +%!assert (as+bs, sparse (af+bf)) +%!assert (as-bs, sparse (af-bf)) +%!assert (as.*bs, sparse (af.*bf)) +%!xtest assert (as./bs, sparse (af./bf), 100*eps) +%!test +%! sv = as.^bs; +%! fv = af.^bf; +%! idx = find (af~=0); +%! assert(sv(:)(idx), sparse (fv(:)(idx)), 100*eps) + +EOF +} + +# test matrix-matrix left and right division: uses as,af,bs,bf +gen_divop_tests() { + cat >>$TESTS <<EOF +%% Matrix-matrix operators (uses af,as,bs,bf) +%!assert (as/bf, af/bf, 100*eps) +%!assert (af/bs, af/bf, 100*eps) +%!assert (as/bs, sparse (af/bf), 100*eps) +%!assert (bs\af', bf\af', 100*eps) +%!assert (bf\as', bf\af', 100*eps) +%!assert (bs\as', sparse (bf\af'), 100*eps) + +EOF +} + +# test matrix-matrix left and right division: uses as,af,bs,bf +gen_square_divop_tests() { + cat >>$TESTS <<EOF +%% Matrix-matrix operators (uses af,as,bs,bf) +%!assert (as/bf, af/bf, 100*eps) +%!assert (af/bs, af/bf, 100*eps) +%!assert (as/bs, sparse (af/bf), 100*eps) +%!assert (bs\af', bf\af', 100*eps) +%!assert (bf\as', bf\af', 100*eps) +%!assert (bs\as', sparse (bf\af'), 100*eps) + +EOF +} + +# test matrix-matrix operations: uses as,af,bs,bf +gen_matrixop_tests() { + cat >>$TESTS <<EOF +%% Matrix-matrix operators (uses af,as,bs,bf) +%!assert (as*bf', af*bf') +%!assert (af*bs', af*bf') +%!assert (as*bs', sparse (af*bf')) + +EOF +} + +# test diagonal operations +gen_matrixdiag_tests() { + cat >>$TESTS <<EOF +%% Matrix diagonal tests (uses af,as,bf,bs) +%!assert (diag (as), sparse (diag (af))) +%!assert (diag (bs), sparse (diag (bf))) +%!assert (diag (as,1), sparse (diag (af,1))) +%!assert (diag (bs,1), sparse (diag (bf,1))) +%!assert (diag (as,-1), sparse (diag (af,-1))) +%!assert (diag (bs,-1), sparse (diag (bf,-1))) +%!assert (diag (as(:)), sparse (diag (af(:)))) +%!assert (diag (as(:),1), sparse (diag (af(:),1))) +%!assert (diag (as(:),-1), sparse (diag (af(:),-1))) +%!assert (diag (as(:)'), sparse (diag (af(:)'))) +%!assert (diag (as(:)',1), sparse (diag (af(:)',1))) +%!assert (diag (as(:)',-1), sparse (diag (af(:)',-1))) +%!assert (spdiags (as,[0,1]), [diag(af,0), diag(af,1)]) +%!test +%! [tb,tc]=spdiags(as); +%! assert (spdiags (tb,tc,sparse (zeros (size (as)))), as); +%! assert (spdiags (tb,tc,size (as,1),size (as,2)), as); + +EOF +} + +# test matrix reshape operations +gen_matrixreshape_tests() { + cat >>$TESTS <<EOF +%% Matrix diagonal tests (uses af,as,bf,bs) +%!assert(reshape(as,1,prod(size(as))),sparse(reshape(af,1,prod(size(af))))) +%!assert(reshape(as,prod(size(as)),1),sparse(reshape(af,prod(size(af)),1))) +%!assert(reshape(as,fliplr(size(as))),sparse(reshape(af,fliplr(size(af))))) +%!assert(reshape(bs,1,prod(size(as))),sparse(reshape(bf,1,prod(size(af))))) +%!assert(reshape(bs,prod(size(as)),1),sparse(reshape(bf,prod(size(af)),1))) +%!assert(reshape(bs,fliplr(size(as))),sparse(reshape(bf,fliplr(size(af))))) + +EOF +} + +# test mapper matrix operations: uses as,af +print_mapper_test() { +echo "%!assert ($1(as), sparse ($1(af)))" >>$TESTS +} + +print_real_mapper_test() { + cat >>$TESTS <<EOF +%!test +%! wn2s = warning ("query", "Octave:num-to-str"); +%! warning ("off", "Octave:num-to-str"); +%! if (isreal (af)) +%! if ($2) +%! assert ($1(as), sparse ($1(af))); +%! else +%! assert ($1(as), $1(af)); +%! endif +%! endif +%! warning (wn2s.state, "Octave:num-to-str"); + +EOF +} + +gen_mapper_tests() { +echo "%% Unary matrix tests (uses af,as)">>$TESTS +print_mapper_test abs +print_mapper_test acos +print_mapper_test acosh +print_mapper_test angle +print_mapper_test arg +print_mapper_test asin +print_mapper_test asinh +print_mapper_test atan +print_mapper_test atanh +print_mapper_test ceil +print_mapper_test conj +print_mapper_test cos +print_mapper_test cosh +print_mapper_test exp +print_mapper_test finite +print_mapper_test fix +print_mapper_test floor +print_mapper_test imag +print_mapper_test isinf +print_mapper_test isna +print_mapper_test isnan +print_mapper_test log +#print_mapper_test log10 ## fails with different NaN, not a problem +print_mapper_test real +print_mapper_test round +print_mapper_test sign +print_mapper_test sin +print_mapper_test sinh +print_mapper_test sqrt +print_mapper_test tan +print_mapper_test tanh + +# Specific tests for certain mapper functions + cat >>$TESTS <<EOF +%!assert (issparse (abs (as)) && isreal (abs (as))) +%!assert (issparse (real (as)) && isreal (real (as))) +%!assert (issparse (imag (as)) && isreal (imag (as))) + +EOF +} + +gen_real_mapper_tests() { +echo "%% Unary matrix tests (uses af,as)">>$TESTS +print_real_mapper_test erf 1 +print_real_mapper_test erfc 1 +#print_real_mapper_test gamma 1 +print_real_mapper_test isalnum 0 +print_real_mapper_test isalpha 0 +print_real_mapper_test isascii 0 +print_real_mapper_test iscntrl 0 +print_real_mapper_test isdigit 0 +print_real_mapper_test isgraph 0 +print_real_mapper_test islower 0 +print_real_mapper_test isprint 0 +print_real_mapper_test ispunct 0 +print_real_mapper_test isspace 0 +print_real_mapper_test isupper 0 +print_real_mapper_test isxdigit 0 +#print_real_mapper_test lgamma 1 + +# Specific tests for certain mapper functions + cat >>$TESTS <<EOF + +%% These mapper functions always return a full matrix +%!test +%! wn2s = warning ("query", "Octave:num-to-str"); +%! warning ("off", "Octave:num-to-str"); +%! if (isreal (af)) +%! assert (toascii (as), toascii (af)); +%! assert (tolower (as), tolower (af)); +%! assert (toupper (as), toupper (af)); +%! endif +%! warning (wn2s.state, "Octave:num-to-str"); + +EOF +} + +# test matrix operations: uses as,af +gen_unaryop_tests() { + cat >>$TESTS <<EOF +%% Unary matrix tests (uses af,as) +%!assert (issparse (as)) +%!assert (!issparse (af)) +%!assert (! (issparse (af) && iscomplex (af))) +%!assert (! (issparse (af) && isreal (af))) +%!assert (sum (as), sparse (sum (af))) +%!assert (sum (as,1), sparse (sum (af,1))) +%!assert (sum (as,2), sparse (sum (af,2))) +%!assert (cumsum (as), sparse (cumsum (af))) +%!assert (cumsum (as,1), sparse (cumsum (af,1))) +%!assert (cumsum (as,2), sparse (cumsum (af,2))) +%!assert (sumsq (as), sparse (sumsq (af))) +%!assert (sumsq (as,1), sparse (sumsq (af,1))) +%!assert (sumsq (as,2), sparse (sumsq (af,2))) +%!assert (prod (as), sparse (prod (af))) +%!assert (prod (as,1), sparse (prod (af,1))) +%!assert (prod (as,2), sparse (prod (af,2))) +%!assert (cumprod (as), sparse (cumprod (af))) +%!assert (cumprod (as,1), sparse (cumprod (af,1))) +%!assert (cumprod (as,2), sparse (cumprod (af,2))) + +%!assert (min (as), sparse (min (af))) +%!assert (full (min (as(:))),min (af(:))) +%!assert (min (as,[],1), sparse (min (af,[],1))) +%!assert (min (as,[],2), sparse (min (af,[],2))) +%!assert (min (as,[],1), sparse (min (af,[],1))) +%!assert (min (as,0), sparse (min (af,0))) +%!assert (min (as,bs), sparse (min (af,bf))) +%!assert (max (as), sparse (max (af))) +%!assert (full (max (as(:))), max (af(:))) +%!assert (max (as,[],1), sparse (max (af,[],1))) +%!assert (max (as,[],2), sparse (max (af,[],2))) +%!assert (max (as,[],1), sparse (max (af,[],1))) +%!assert (max (as,0), sparse (max (af,0))) +%!assert (max (as,bs), sparse (max (af,bf))) + +%!assert (as==as) +%!assert (as==af) +%!assert (af==as) +%!test +%! [ii,jj,vv,nr,nc] = find (as); +%! assert (af, full (sparse (ii,jj,vv,nr,nc))); +%!assert (nnz (as), sum (af(:)!=0)) +%!assert (nnz (as), nnz (af)) +%!assert (issparse (as.')) +%!assert (issparse (as')) +%!assert (issparse (-as)) +%!assert (~as, sparse (~af)) +%!assert (as.', sparse (af.')); +%!assert (as', sparse (af')); +%!assert (-as, sparse (-af)); +%!assert (~as, sparse (~af)); +%!error [i,j]=size (af);as(i-1,j+1); +%!error [i,j]=size (af);as(i+1,j-1); +%!test +%! [Is,Js,Vs] = find (as); +%! [If,Jf,Vf] = find (af); +%! assert (Is, If); +%! assert (Js, Jf); +%! assert (Vs, Vf); +%!error as(0,1); +%!error as(1,0); +%!assert (find (as), find (af)) +%!test +%! [i,j,v] = find (as); +%! [m,n] = size (as); +%! x = sparse (i,j,v,m,n); +%! assert (x, as); +%!test +%! [i,j,v,m,n] = find (as); +%! x = sparse (i,j,v,m,n); +%! assert (x, as); +%!assert (issparse (horzcat (as,as))); +%!assert (issparse (vertcat (as,as))); +%!assert (issparse (cat (1,as,as))); +%!assert (issparse (cat (2,as,as))); +%!assert (issparse ([as,as])); +%!assert (issparse ([as;as])); +%!assert (horzcat (as,as), sparse ([af,af])); +%!assert (vertcat (as,as), sparse ([af;af])); +%!assert (horzcat (as,as,as), sparse ([af,af,af])); +%!assert (vertcat (as,as,as), sparse ([af;af;af])); +%!assert ([as,as], sparse ([af,af])); +%!assert ([as;as], sparse ([af;af])); +%!assert ([as,as,as], sparse ([af,af,af])); +%!assert ([as;as;as], sparse ([af;af;af])); +%!assert (cat (2,as,as), sparse ([af,af])); +%!assert (cat (1,as,as), sparse ([af;af])); +%!assert (cat (2,as,as,as), sparse ([af,af,af])); +%!assert (cat (1,as,as,as), sparse ([af;af;af])); +%!assert (issparse ([as,af])); +%!assert (issparse ([af,as])); +%!assert ([as,af], sparse ([af,af])); +%!assert ([as;af], sparse ([af;af])); + +EOF +} + +# operations which require square matrices. +gen_square_tests() { +# The \ and / operator tests on square matrices + gen_square_divop_tests + + cat >>$TESTS <<EOF +%!testif HAVE_UMFPACK +%! assert(det(bs+speye(size(bs))),det(bf+eye(size(bf))),100*eps*abs(det(bf+eye(size(bf))))) + +%!testif HAVE_UMFPACK +%! [l,u] = lu (sparse ([1,1;1,1])); +%! assert (l*u, [1,1;1,1], 10*eps); + +%!testif HAVE_UMFPACK +%! [l,u] = lu (sparse ([1,1;1,1+i])); +%! assert (l, sparse ([1,2,2],[1,1,2],1), 10*eps); +%! assert (u, sparse ([1,1,2],[1,2,2],[1,1,1i]), 10*eps); + +%!testif HAVE_UMFPACK # permuted LU +%! [L,U] = lu (bs); +%! assert (L*U, bs, 1e-10); + +%!testif HAVE_UMFPACK # simple LU + row permutations +%! [L,U,P] = lu (bs); +%! assert (P'*L*U, bs, 1e-10); +%! # triangularity +%! [i,j,v] = find (L); +%! assert (i-j>=0); +%! [i,j,v] = find (U); +%! assert (j-i>=0); + +%!testif HAVE_UMFPACK # simple LU + row/col permutations +%! [L,U,P,Q] = lu (bs); +%! assert (P'*L*U*Q', bs, 1e-10); +%! # triangularity +%! [i,j,v] = find (L); +%! assert (i-j>=0); +%! [i,j,v] = find (U); +%! assert (j-i>=0); + +%!testif HAVE_UMFPACK # LU with vector permutations +%! [L,U,P,Q] = lu (bs,'vector'); +%! assert (L(P,:)*U(:,Q), bs, 1e-10); +%! # triangularity +%! [i,j,v] = find (L); +%! assert (i-j>=0); +%! [i,j,v] = find (U); +%! assert (j-i>=0); + +%!testif HAVE_UMFPACK # LU with scaling +%! [L,U,P,Q,R] = lu (bs); +%! assert (R*P'*L*U*Q', bs, 1e-10); +%! # triangularity +%! [i,j,v] = find (L); +%! assert (i-j>=0); +%! [i,j,v] = find (U); +%! assert (j-i>=0); + +%!testif HAVE_UMFPACK # inverse +%! assert (inv (bs)*bs, sparse (eye (rows (bs))), 1e-10); + +%!assert (bf\as', bf\af', 100*eps); +%!assert (bs\af', bf\af', 100*eps); +%!assert (bs\as', sparse (bf\af'), 100*eps); + +EOF +} + +# Cholesky tests +gen_cholesky_tests() { + cat >>$TESTS <<EOF +%!testif HAVE_CHOLMOD +%! assert (chol (bs)'*chol (bs), bs, 1e-10); +%!testif HAVE_CHOLMOD +%! assert (chol (bs,'lower')*chol (bs,'lower')', bs, 1e-10); +%!testif HAVE_CHOLMOD +%! assert (chol (bs,'lower'), chol (bs)', 1e-10); + +%!testif HAVE_CHOLMOD # Return Partial Cholesky factorization +%! [RS,PS] = chol (bs); +%! assert (RS'*RS, bs, 1e-10); +%! assert (PS, 0); +%! [LS,PS] = chol (bs,'lower'); +%! assert (LS*LS', bs, 1e-10); +%! assert (PS, 0); + +%!testif HAVE_CHOLMOD # Permuted Cholesky factorization +%! [RS,PS,QS] = chol (bs); +%! assert (RS'*RS, QS*bs*QS', 1e-10); +%! assert (PS, 0); +%! [LS,PS,QS] = chol (bs,'lower'); +%! assert (LS*LS', QS*bs*QS', 1e-10); +%! assert (PS, 0); + +EOF +} + +# test scalar operations: uses af and real scalar bf; modifies as,bf,bs +gen_scalar_tests() { + echo '%!test as=sparse(af);' >> $TESTS + echo '%!test bs=bf;' >> $TESTS + gen_elementop_tests + gen_ordering_tests + echo '%!test bf=bf+1i;' >>$TESTS + echo '%!test bs=bf;' >> $TESTS + gen_elementop_tests +} + +# test matrix operations: uses af and bf; modifies as,bs +gen_rectangular_tests() { + echo '%!test as=sparse(af);' >> $TESTS + echo '%!test bs=sparse(bf);' >>$TESTS + gen_mapper_tests + gen_real_mapper_tests + gen_unaryop_tests + gen_elementop_tests + gen_sparsesparse_elementop_tests + gen_matrixop_tests + # gen_divop_tests # Disable rectangular \ and / for now + gen_matrixdiag_tests + gen_matrixreshape_tests + cat >>$TESTS <<EOF +%!testif HAVE_UMFPACK # permuted LU +%! [L,U] = lu (bs); +%! assert (L*U, bs, 1e-10); + +%!testif HAVE_UMFPACK # simple LU + row permutations +%! [L,U,P] = lu (bs); +%! assert (P'*L*U, bs, 1e-10); +%! # triangularity +%! [i,j,v] = find (L); +%! assert (i-j>=0); +%! [i,j,v] = find (U); +%! assert (j-i>=0); + +%!testif HAVE_UMFPACK # simple LU + row/col permutations +%! [L,U,P,Q] = lu (bs); +%! assert (P'*L*U*Q', bs, 1e-10); +%! # triangularity +%! [i,j,v] = find (L); +%! assert (i-j>=0); +%! [i,j,v] = find (U); +%! assert (j-i>=0); + +%!testif HAVE_UMFPACK # LU with vector permutations +%! [L,U,P,Q] = lu (bs,'vector'); +%! assert (L (P,:)*U (:,Q), bs, 1e-10); +%! # triangularity +%! [i,j,v] = find (L); +%! assert (i-j>=0); +%! [i,j,v] = find (U); +%! assert (j-i>=0); + +%!testif HAVE_UMFPACK # LU with scaling +%! [L,U,P,Q,R] = lu (bs); +%! assert (R*P'*L*U*Q', bs, 1e-10); +%! # triangularity +%! [i,j,v] = find (L); +%! assert (i-j>=0); +%! [i,j,v] = find (U); +%! assert (j-i>=0); + +EOF +} + + +# ======================================================= +# sparse assembly tests + +gen_assembly_tests() { +cat >>$TESTS <<EOF +%%Assembly tests +%!test +%! m = max ([m;r(:)]); +%! n = max ([n;c(:)]); +%! funiq = fsum = zeros (m,n); +%! funiq(r(:) + m*(c(:)-1) ) = ones (size (r(:))); +%! funiq = sparse (funiq); +%! for k=1:length(r) +%! fsum(r(k),c(k)) += 1; +%! endfor +%! fsum = sparse (fsum); +%!assert (sparse (r,c,1), sparse (fsum(1:max(r), 1:max(c)))) +%!assert (sparse (r,c,1,"sum"), sparse (fsum(1:max (r),1:max (c)))) +%!assert (sparse (r,c,1,"unique"), sparse (funiq(1:max (r),1:max (c)))) +%!assert (sparse (r,c,1,m,n), sparse (fsum)) +%!assert (sparse (r,c,1,m,n,"sum"), sparse (fsum)) +%!assert (sparse (r,c,1,m,n,"unique"), sparse (funiq)) + +%!assert (sparse (r,c,1i), sparse (fsum(1:max (r),1:max (c))*1i)) +%!assert (sparse (r,c,1i,"sum"), sparse (fsum(1:max (r),1:max (c))*1i)) +%!assert (sparse (r,c,1i,"unique"), sparse (funiq(1:max (r),1:max (c))*1i)) +%!assert (sparse (r,c,1i,m,n), sparse (fsum*1i)) +%!assert (sparse (r,c,1i,m,n,"sum"), sparse (fsum*1i)) +%!assert (sparse (r,c,1i,m,n,"unique"), sparse (funiq*1i)) + +%!test +%! if (issparse (funiq)) +%! assert (sparse (full (1i*funiq)), sparse (1i*funiq)); +%! endif + +%!assert (sparse (full (funiq)), funiq) + + +EOF +} + +# ======================================================= +# sparse selection tests + +gen_scalar_select_tests () { + cat >>$TESTS <<EOF +%!assert (sparse (42)([1,1]), sparse ([42,42])) +%!assert (sparse (42*1i)([1,1]), sparse ([42,42].*1i)) +EOF +} + +gen_select_tests() { + cat >>$TESTS <<EOF +%!test as=sparse(af); + +%% Point tests +%!test idx = ridx(:) + rows (as) * (cidx (:)-1); +%!assert (sparse (as(idx)), sparse (af(idx))) +%!assert (as(idx), sparse (af(idx))); +%!assert (as(idx'), sparse (af(idx'))); +%!assert (as(flipud (idx(:))), sparse (af(flipud (idx(:))))) +%!assert (as([idx,idx]), sparse (af([idx,idx]))) +%!error (as(reshape ([idx;idx], [1,length(idx),2]))) + +%% Slice tests +%!assert (as(ridx,cidx), sparse (af(ridx,cidx))) +%!assert (as(ridx,:), sparse (af(ridx,:))) +%!assert (as(:,cidx), sparse (af(:,cidx))) +%!assert (as(:,:), sparse (af(:,:))) +%!assert (as((size (as,1):-1:1),:), sparse (af((size (af,1):-1:1),:))) +%!assert (as(:,(size (as,2):-1:1)), sparse (af(:, (size (af,2):-1:1)))) + +%% Indexing tests +%!assert (full (as([1,1],:)), af([1,1],:)) +%!assert (full (as(:,[1,1])), af(:,[1,1])) +%!test +%! [i,j,v] = find (as); +%! assert (as(i(1),j(1))([1,1]), sparse ([v(1), v(1)])) + +%% Assignment test +%!test +%! ts=as; ts(:,:) = ts(fliplr (1:size (as,1)),:); +%! tf=af; tf(:,:) = tf(fliplr (1:size (af,1)),:); +%! assert (ts, sparse (tf)); +%!test +%! ts=as; ts(fliplr (1:size (as,1)),:) = ts; +%! tf=af; tf(fliplr (1:size (af,1)),:) = tf; +%! assert (ts, sparse (tf)); +%!test +%! ts=as; ts(:,fliplr (1:size (as,2))) = ts; +%! tf=af; tf(:,fliplr (1:size (af,2))) = tf; +%! assert (ts, sparse (tf)); +%!test +%! ts(fliplr (1:size (as,1))) = as(:,1); +%! tf(fliplr (1:size (af,1))) = af(:,1); +%! assert (ts, sparse (tf)); + +%% Deletion tests +%!test +%! ts=as; ts(1,:)=[]; tf=af; tf(1,:)=[]; +%! assert (ts, sparse (tf)); +%!test +%! ts=as; ts(:,1)=[]; tf=af; tf(:,1)=[]; +%! assert (ts, sparse (tf)); + +%% Test "end" keyword +%!assert (full (as(end)), af(end)) +%!assert (full (as(1,end)), af(1,end)) +%!assert (full (as(end,1)), af(end,1)) +%!assert (full (as(end,end)), af(end,end)) +%!assert (as(2:end,2:end), sparse (af(2:end,2:end))) +%!assert (as(1:end-1,1:end-1), sparse (af(1:end-1,1:end-1))) +EOF +} + +# ======================================================= +# sparse save and load tests + +gen_save_tests() { + cat >>$TESTS <<EOF +%!test # save ascii +%! savefile = tmpnam (); +%! as_save = as; +%! save ("-text", savefile, "bf", "as_save", "af"); +%! clear as_save; +%! load (savefile, "as_save"); +%! unlink (savefile); +%! assert (as_save, sparse(af)); +%!test # save binary +%! savefile = tmpnam (); +%! as_save = as; +%! save ("-binary", savefile, "bf", "as_save", "af"); +%! clear as_save; +%! load (savefile, "as_save"); +%! unlink (savefile); +%! assert (as_save, sparse(af)); +%!testif HAVE_HDF5 # save hdf5 +%! savefile = tmpnam (); +%! as_save = as; +%! save ("-hdf5", savefile, "bf", "as_save", "af"); +%! clear as_save; +%! load (savefile, "as_save"); +%! unlink (savefile); +%! assert (as_save, sparse(af)); +## FIXME: We should skip (or mark as an expected failure) the test for +## saving sparse matrices to MAT files when using 64-bit indexing since +## that is not implemented yet. +%!test # save matlab +%! savefile = tmpnam (); +%! as_save = as; +%! save ("-mat", savefile, "bf", "as_save", "af"); +%! clear as_save; +%! load (savefile, "as_save"); +%! unlink (savefile); +%! assert (as_save, sparse(af)); +EOF +} + +# ============================================================= +# Specific solver tests for matrices that will test all of the solver +# code. Uses alpha and beta +gen_solver_tests() { + +if $preset; then + cat >>$TESTS <<EOF +%! n=8; +%! lf=diag (1:n); lf(n-1,1)=0.5*alpha; lf(n,2)=0.25*alpha; ls=sparse (lf); +%! uf=diag (1:n); uf(1,n-1)=2*alpha; uf(2,n)=alpha; us=sparse (uf); +%! ts=spdiags (ones (n,3),-1:1,n,n) + diag (1:n); tf = full (ts); +EOF +else + cat >>$TESTS <<EOF +%! n = floor (lognrnd (8,2)+1)'; +%! ls = tril (sprandn (8,8,0.2),-1).*alpha + n*speye (8); lf = full (ls); +%! us = triu (sprandn (8,8,0.2),1).*alpha + n*speye (8); uf = full (us); +%! ts = spdiags (randn (8,3),-1:1,8,8).*alpha; tf = full (ts); +EOF +fi + +cat >>$TESTS <<EOF +%! df = diag (1:n).* alpha; ds = sparse (df); +%! pdf = df(randperm (n),randperm (n)); +%! pds = sparse (pdf); +%! plf = lf(randperm (n),randperm (n)); +%! pls = sparse (plf); +%! puf = uf(randperm (n),randperm (n)); +%! pus = sparse (puf); +%! bs = spdiags (repmat ([1:n]',1,4),-2:1,n,n).*alpha; +%! bf = full (bs); +%! cf = lf + lf'; cs = sparse (cf); +%! bcf = bf + bf'; bcs = sparse (bcf); +%! tcf = tf + tf'; tcs = sparse (tcf); +%! xf = diag (1:n) + fliplr (diag (1:n)).*beta; +%! xs = sparse (xf); +%!assert (ds\xf, df\xf, 1e-10); +%!assert (ds\xs, sparse (df\xf), 1e-10); +%!assert (pds\xf, pdf\xf, 1e-10); +%!assert (pds\xs, sparse (pdf\xf), 1e-10); +%!assert (ls\xf, lf\xf, 1e-10); +%!assert (sparse (ls\xs), sparse (lf\xf), 1e-10); +%!testif HAVE_UMFPACK +%! assert (pls\xf, plf\xf, 1e-10); +%!testif HAVE_UMFPACK +%! assert (sparse (pls\xs), sparse (plf\xf), 1e-10); +%!assert (us\xf, uf\xf, 1e-10); +%!assert (sparse (us\xs), sparse (uf\xf), 1e-10); +%!testif HAVE_UMFPACK +%! assert (pus\xf, puf\xf, 1e-10); +%!testif HAVE_UMFPACK +%! assert (sparse (pus\xs), sparse (puf\xf), 1e-10); +%!assert (bs\xf, bf\xf, 1e-10); +%!assert (sparse (bs\xs), sparse (bf\xf), 1e-10); +%!testif HAVE_UMFPACK +%! assert (cs\xf, cf\xf, 1e-10); +%!testif HAVE_UMFPACK +%! assert (sparse (cs\xs), sparse (cf\xf), 1e-10); +%!testif HAVE_UMFPACK +%! assert (bcs\xf, bcf\xf, 1e-10); +%!testif HAVE_UMFPACK +%! assert (sparse (bcs\xs), sparse (bcf\xf), 1e-10); +%!assert (ts\xf, tf\xf, 1e-10); +%!assert (sparse (ts\xs), sparse (tf\xf), 1e-10); +%!assert (tcs\xf, tcf\xf, 1e-10); +%!assert (sparse (tcs\xs), sparse (tcf\xf), 1e-10); + +EOF + +cat >>$TESTS <<EOF +%% QR solver tests + +%!function f(a, sz, feps) +%! b = randn (sz); +%! x = a \ b; +%! assert (a * x, b, feps); +%! b = randn (sz) + 1i*randn (sz); +%! x = a \ b; +%! assert (a * x, b, feps); +%! b = sprandn (sz(1),sz(2),0.2); +%! x = a \ b; +%! assert (sparse (a * x), b, feps); +%! b = sprandn (sz(1),sz(2),0.2) + 1i*sprandn (sz(1),sz(2),0.2); +%! x = a \ b; +%! assert (sparse (a * x), b, feps); +%!endfunction +%!testif HAVE_UMFPACK +%! a = alpha*sprandn (10,11,0.2) + speye (10,11); +%! f(a,[10,2],1e-10); +%! ## Test this by forcing matrix_type, as can't get a certain +%! ## result for over-determined systems. +%! a = alpha*sprandn(10,10,0.2) + speye(10,10); +%! matrix_type (a, "Singular"); +%! f(a,[10,2],1e-10); + +%% Rectanguar solver tests that don't use QR + +%!test +%! ds = alpha * spdiags ([1:11]',0,10,11); +%! df = full (ds); +%! xf = beta * ones (10,2); +%! xs = speye (10,10); +%!assert (ds\xf, df\xf, 100*eps) +%!assert (ds\xs, sparse (df\xs), 100*eps) +%!test +%! pds = ds([2,1,3:10],:); +%! pdf = full (pds); +%!assert (pds\xf, pdf\xf, 100*eps) +%!assert (pds\xs, sparse (pdf\xs), 100*eps) +%!test +%! ds = alpha * spdiags ([1:11]',0,11,10); +%! df = full (ds); +%! xf = beta * ones (11,2); +%! xs = speye (11,11); +%!assert (ds\xf, df\xf, 100*eps) +%!assert (ds\xs, sparse (df\xs), 100*eps) +%!test +%! pds = ds([2,1,3:11],:); +%! pdf = full (pds); +%!assert (pds\xf, pdf\xf, 100*eps) +%!assert (pds\xs, sparse (pdf\xs), 100*eps) +%!test +%! us = alpha*[[speye(10,10);sparse(1,10)],[[1,1];sparse(9,2);[1,1]]]; +%!testif HAVE_UMFPACK +%! assert (us*(us\xf), xf, 100*eps) +%!testif HAVE_UMFPACK +%! assert (us*(us\xs), xs, 100*eps) +%!test +%! pus = us(:,[2,1,3:12]); +%!testif HAVE_UMFPACK +%! assert (pus*(pus\xf), xf, 100*eps) +%!testif HAVE_UMFPACK +%! assert (pus*(pus\xs), xs, 100*eps) +%!test +%! us = alpha*[speye(11,9),[1;sparse(8,1);1;0]]; +%!testif HAVE_CXSPARSE +%! [c,r] = qr (us, xf); +%! assert (us\xf, r\c, 100*eps) +%!testif HAVE_UMFPACK +%! [c,r] = qr (us, xs); +%! r = matrix_type (r, "Singular"); ## Force Matrix Type +%! assert (us\xs, r\c, 100*eps) +%!test +%! pus = us(:,[1:8,10,9]); +%!testif HAVE_UMFPACK +%! [c,r] = qr (pus, xf); +%! r = matrix_type (r, "Singular"); ## Force Matrix Type +%! assert (pus\xf, r\c, 100*eps) +%!testif HAVE_UMFPACK +%! [c,r] = qr (pus, xs); +%! r = matrix_type (r, "Singular"); ## Force Matrix Type +%! assert (pus\xs, r\c, 100*eps) +%!test +%! ls = alpha*[speye(9,11);[1, sparse(1,8),1,0]]; +%! xf = beta * ones (10,2); +%! xs = speye (10,10); +%!assert (ls*(ls\xf), xf, 100*eps) +%!assert (ls*(ls\xs), xs, 100*eps) +%!test +%! pls = ls([1:8,10,9],:); +%!assert (pls*(pls\xf), xf, 100*eps) +%!assert (pls*(pls\xs), xs, 100*eps) +%!test +%! ls = alpha*[speye(10,10), sparse(10,1);[1;1], sparse(2,9),[1;1]]; +%! xf = beta * ones (12,2); +%! xs = speye (12,12); +%!testif HAVE_UMFPACK +%! [c,r] = qr (ls, xf); +%! assert (ls\xf, r\c, 100*eps) +%!testif HAVE_UMFPACK +%! [c,r] = qr (ls, xs); +%! r = matrix_type (r, "Singular"); ## Force Matrix Type +%! assert (ls\xs, r\c, 100*eps) +%!testif HAVE_CXSPARSE +%! pls = ls(:,[1:8,10,9]); +%!testif HAVE_UMFPACK +%! [c,r] = qr (pls, xf); +%! r = matrix_type (r, "Singular"); ## Force Matrix Type +%! assert (pls\xf, r\c, 100*eps) +%!testif HAVE_UMFPACK +%! [c,r] = qr (pls, xs); +%! r = matrix_type (r, "Singular"); ## Force Matrix Type +%! assert (pls\xs, r\c, 100*eps) + +EOF +} + + +# ============================================================= +# Putting it all together: defining the combined tests + + +# initial function +gen_function +gen_section + +# specific tests +if $preset; then + gen_specific_tests + gen_section +fi + +# scalar operations +echo '%!shared as,af,bs,bf' >> $TESTS +if $preset; then + echo '%!test af=[1+1i,2-1i,0,0;0,0,0,3+2i;0,0,0,4];' >> $TESTS + echo '%!test bf=3;' >>$TESTS +else + cat >>$TESTS <<EOF +%!test +%! % generate m,n from 1 to <5000 +%! m = floor (lognrnd (8,2)+1); +%! n = floor (lognrnd (8,2)+1); +%! as = sprandn (m,n,0.3); +%! af = full (as + 1i*sprandn (as)); +%! bf = randn; +EOF +fi + +gen_scalar_tests +gen_section + +# rectangular operations +if $preset; then + echo '%!test af=[1+1i,2-1i,0,0;0,0,0,3+2i;0,0,0,4];' >> $TESTS + echo '%!test bf=[0,1-1i,0,0;2+1i,0,0,0;3-1i,2+3i,0,0];' >> $TESTS +else + cat >>$TESTS <<EOF +%!test +%! m = floor (lognrnd (8,2)+1); +%! n = floor (lognrnd (8,2)+1); +%! as = sprandn (m,n,0.3); +%! af = full (as + 1i*sprandn (as)); +%! bs = sprandn (m,n,0.3); +%! bf = full (bs + 1i*sprandn (bs)); +EOF +fi + +gen_rectangular_tests +gen_section +gen_save_tests +gen_section +echo '%!test bf=real(bf);' >> $TESTS +gen_rectangular_tests +gen_section +gen_sparsesparse_ordering_tests +gen_section +echo '%!test af=real(af);' >> $TESTS +gen_rectangular_tests +gen_section +gen_save_tests +gen_section +echo '%!test bf=bf+1i*(bf~=0);' >> $TESTS +gen_rectangular_tests +gen_section + +# square operations +if $preset; then + echo '%!test af=[1+1i,2-1i,0,0;0,0,0,3+2i;0,0,0,4];' >> $TESTS + echo '%! as=sparse(af);' >> $TESTS + echo '%!test bf=[0,1-1i,0,0;2+1i,0,0,0;3-1i,2+3i,0,0];' >> $TESTS +else + cat >>$TESTS <<EOF +%!test +%! m = floor (lognrnd (8,2)+1); +%! n = floor (lognrnd (8,2)+1); +%! as = sprandn (m,n,0.3); +%! af = full (as + 1i*sprandn (as)); +%! bs = sprandn (m,n,0.3); +%! bf = full (bs + 1i*sprandn (bs)); +EOF +fi + +cat >>$TESTS <<EOF +%!test ;# invertible matrix +%! bf = af'*bf+max (abs ([af(:);bf(:)]))*sparse (eye (columns (as))); +%! bs = sparse (bf); + +EOF + +gen_square_tests +gen_section +echo '%!test bf=real(bf);' >> $TESTS +echo '%! bs=sparse(bf);' >> $TESTS +gen_square_tests +gen_section +echo '%!test af=real(af);' >> $TESTS +echo '%! as=sparse(af);' >> $TESTS +gen_square_tests +gen_section +echo '%!test bf=bf+1i*(bf~=0);' >> $TESTS +echo '%! bs=sparse(bf);' >> $TESTS +gen_square_tests +gen_section + +# cholesky tests +if $preset; then + echo '%!test bf=[5,0,1+1i,0;0,5,0,1-2i;1-1i,0,5,0;0,1+2i,0,5];' >> $TESTS + echo '%! bs=sparse(bf);' >> $TESTS +else + echo '# This has a small chance of failing to create a positive definite matrix' >> $TESTS + echo '%!test n=floor (lognrnd (8,2)+1)' >> $TESTS + echo '%! bs = n*speye (n,n) + sprandn (n,n,0.3);' >> $TESTS + echo '%! bf = full (bs);' >> $TESTS +fi + +gen_cholesky_tests +gen_section +echo '%!test bf=real(bf);' >> $TESTS +echo '%! bs=sparse(bf);' >> $TESTS +gen_cholesky_tests +gen_section + +# assembly tests +echo '%!shared r,c,m,n,fsum,funiq' >>$TESTS +if $use_preset; then + cat >>$TESTS <<EOF +%!test +%! r = [1,1,2,1,2,3]; +%! c = [2,1,1,1,2,1]; +%! m = n = 0; +EOF +else + cat >>$TESTS <<EOF +%!test +%! % generate m,n from 1 to <5000 +%! m = floor (lognrnd (8,2)+1); +%! n = floor (lognrnd (8,2)+1); +%! nz = ceil ((m+n)/2); +%! r = floor (rand (5,nz)*n)+1; +%! c = floor (rand (5,nn)*m)+1; +EOF +fi +gen_assembly_tests #includes real and complex tests +gen_section + +# slicing tests +echo '%!shared ridx,cidx,idx,as,af' >>$TESTS +if $use_preset; then + cat >>$TESTS <<EOF +%!test +%! af = [1+1i,2-1i,0,0;0,0,0,3+2i;0,0,0,4]; +%! ridx = [1,3]; +%! cidx = [2,3]; +EOF +else + cat >>$TESTS <<EOF +%!test +%! % generate m,n from 1 to <5000 +%! m = floor (lognrnd (8,2)+1); +%! n = floor (lognrnd (8,2)+1); +%! as = sprandn (m,n,0.3); +%! af = full (as + 1i*sprandn (as)); +%! ridx = ceil (m*rand (1,ceil (rand*m)); +%! cidx = ceil (n*rand (1,ceil (rand*n)); +EOF +fi +gen_scalar_select_tests +gen_select_tests +echo '%!test af=real(af);' >> $TESTS +gen_select_tests +gen_section +echo '%!shared alpha,beta,df,pdf,lf,plf,uf,puf,bf,cf,bcf,tf,tcf,xf,ds,pds,ls,pls,us,pus,bs,cs,bcs,ts,tcs,xs' >>$TESTS +echo '%!test alpha=1;beta=1;' >> $TESTS +gen_solver_tests +echo '%!test alpha=1;beta=1i;' >> $TESTS +gen_solver_tests +echo '%!test alpha=1i;beta=1;' >> $TESTS +gen_solver_tests +echo '%!test alpha=1i;beta=1i;' >> $TESTS +gen_solver_tests +gen_section
--- a/test/build_bc_overload_tests.sh Sat Feb 09 19:54:05 2013 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,139 +0,0 @@ -#! /bin/sh - -# Copyright (C) 2010-2012 VZLU Prague -# -# This file is part of Octave. -# -# Octave 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. -# -# Octave 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 Octave; see the file COPYING. If not, see -# <http://www.gnu.org/licenses/>. - -CLASSES=" - double - single - char - logical - int8 - int16 - int32 - int64 - uint8 - uint16 - uint32 - uint64 - struct - cell - function_handle -" - -if [ $# -eq 1 ]; then - case "$1" in - --list-files) - echo tbcover.m - echo test_bc_overloads.m - for class in $CLASSES; do - echo @$class/tbcover.m - done - exit - ;; - --list-dirs) - for class in $CLASSES; do - echo @$class - done - exit - ;; - --list-classes) - echo $CLASSES - exit - ;; - *) - expected_results_file="$1" - ;; - esac -else - echo "usage: build_bc_overload_tests.sh expected-results-file" 1>&2 - exit 1 -fi - -for class in $CLASSES; do - DIR="@$class" - test -d $DIR || mkdir $DIR || { echo "error: could not create $DIR"; exit; } - cat > $DIR/tbcover.m << EOF -% !!! DO NOT EDIT !!! -% generated automatically by build_bc_overload_tests.sh -function s = tbcover (x, y) - s = '$class'; -EOF -done - -cat > tbcover.m << EOF -% !!! DO NOT EDIT !!! -% generated automatically by build_bc_overload_tests.sh -function s = tbcover (x, y) - s = 'none'; -EOF - -if test "$1" = "overloads_only" ; then - exit -fi - -cat > test_bc_overloads.m << EOF -## !!! DO NOT EDIT !!! -## THIS IS AN AUTOMATICALLY GENERATED FILE -## modify build_bc_overload_tests.sh to generate the tests you need. - -%!shared ex -%! ex.double = 1; -%! ex.single = single(1); -%! ex.logical = true; -%! ex.char = 'char'; -%! ex.int8 = int8 (1); -%! ex.int16 = int16 (1); -%! ex.int32 = int32 (1); -%! ex.int64 = int64 (1); -%! ex.uint8 = uint8 (1); -%! ex.uint16 = uint16 (1); -%! ex.uint32 = uint32 (1); -%! ex.uint64 = uint64 (1); -%! ex.cell = {}; -%! ex.struct = struct (); -%! ex.function_handle = @numel; - -EOF - -cat $expected_results_file | \ -while read cl1 cl2 clr ; do - cat >> test_bc_overloads.m << EOF -%% Name call -%!assert (tbcover (ex.$cl1, ex.$cl2), "$clr") -%% Handle call -%!assert ((@tbcover) (ex.$cl1, ex.$cl2), "$clr") - -EOF -done - -cat >> test_bc_overloads.m << EOF -%%test handles through cellfun -%!test -%! f = fieldnames (ex); -%! n = numel (f); -%! s = c1 = c2 = cell (n); -%! for i = 1:n -%! for j = 1:n -%! c1{i,j} = ex.(f{i}); -%! c2{i,j} = ex.(f{j}); -%! s{i,j} = tbcover (ex.(f{i}), ex.(f{j})); -%! endfor -%! endfor -%! assert (cellfun (@tbcover, c1, c2, "uniformoutput", false), s); -EOF
--- a/test/build_sparse_tests.sh Sat Feb 09 19:54:05 2013 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1326 +0,0 @@ -#!/bin/sh - -# Copyright (C) 2006-2012 David Bateman -# -# This file is part of Octave. -# -# Octave 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. -# -# Octave 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 Octave; see the file COPYING. If not, see -# <http://www.gnu.org/licenses/>. - -# Some tests are commented out because they are known to be broken! -# Search for "# fails" - -# ./build_sparse_tests.sh preset -# creates test_sparse.m with preset tests. -# Use "test test_sparse" from octave to run the tests. -# -# ./build_sparse_tests.sh random -# Creates test_sprandom.m with randomly generated matrices. -# Use "test test_sprandom" from octave to run the tests. - -# build_sparse_tests.sh generates tests for real and complex sparse matrices. -# Also, we want to run both fixed tests with known outputs (quick tests) -# and longer tests with unknown outputs (thorough tests). This requires -# two sets of tests -- one which uses preset matrices and another which -# uses randomly generated matrices. -# -# The tests are mostly identical for each case but the code is different, -# so it is important that the tests be run on all cases. Because our test -# harness doesn't have support for looping or macros (it is only needed -# for new data types), but sh does, we use sh to generate inline versions of -# the tests for each case. -# -# Our 'macros' use shared variables as parameters. This allows us to -# for example define A complex and include all the unary ops tests, -# then set A=real(A) and include all the unary ops tests. Thus the -# same tests work for real and complex. For binary tests it is even -# more complicated because we want full X sparse, sparse X full and -# sparse X sparse tested. -# -# We use the following macros: -# -# gen_section -# place a separator in the test file -# gen_function -# define the function definion -# helper gen_specific -# specific tests such as error handling and null input -# helper gen_eat_zeros -# make sure sparse-scalar ops which generate 0 work -# gen_specific_tests -# specific and eat zeros tests -# helper gen_ordering_tests -# ordered comparison operators for real valued tests -# helper gen_sparsesparse_ordering_tests -# ordered comparison operators for real valued sparse-sparse tests -# helper gen_elementop_tests -# element-wise matrix binary operators, including scalar-matrix ops. -# horizontal/vertical concatenation are here as well. -# helper gen_sparsesparse_elementop_tests -# element-wise matrix binary operators, for sparse-sparse ops. -# horizontal/vertical concatenation are here as well. -# helper gen_divop_tests -# left and right matrix division operators of rectangular matrices. -# Needs QR solvers -# helper gen_square_divop_tests -# left and right matrix division operators of square matrices. -# helper gen_matrixop_tests -# rectangular matrix binary operators: * -# helper gen_matrixdiag_tests -# Tests extract of diag and creation of diagonal matrices using -# diag and spdiags functions -# helper gen_matrixreshape_tests -# Test the reshape function on sparse matrices -# helper print_mapper_test -# sub-helper function of gen_mapper_tests to print individual tests -# helper gen_mapper_tests -# Tests all of the one argument mapper functions. There are a few -# specific tests that abs, real and imag return real values. -# helper gen_unaryop_tests -# functions and operators which transform a single matrix -# helper gen_save_tests -# Tests the load/save functionality for ascii/binary and hdf5 formats -# gen_scalar_tests -# element ops for real and complex scalar and sparse -# gen_rectangular_tests -# unary, element, and matrix tests for a and full/sparse b -# gen_square_tests -# operations which require square matrices: lu, inv, \ -# A square non-singular matrix is defined from the rectangular -# inputs A and B. -# gen_assembly_tests -# test for sparse constructors with 'sum' vs. 'unique' -# gen_select_tests -# indexing and assignment tests -# gen_solver_tests -# Tests the solve function with triangular/banded, etc matrices - -case $1 in - random) preset=false ;; - preset) preset=true ;; - '') preset=true ;; - *) echo "build_sparse_tests.sh random|preset" && exit 1 ;; -esac - -if $preset; then - TESTS=test_sparse.m -else - TESTS=test_sprandom.m -fi - -# create initial file -cat >$TESTS <<EOF -## !!! DO NOT EDIT !!! -## THIS IS AN AUTOMATICALLY GENERATED FILE -## modify build_sparse_tests.sh to generate the tests you need. -EOF - - -# define all functions - - -# ======================================================= -# Section separator - -gen_section() { -cat >>$TESTS <<EOF - -# ============================================================== - -EOF -} - - -# ======================================================= -# Specific preset tests - -# ======================================================= -# If a sparse operation yields zeros, then those elements -# of the returned sparse matrix should be eaten. -gen_eat_zeros() { -cat >>$TESTS <<EOF -%% Make sure newly introduced zeros get eaten -%!assert (nnz (sparse ([bf,bf,1]).^realmax), 1) -%!assert (nnz (sparse ([1,bf,bf]).^realmax), 1) -%!assert (nnz (sparse ([bf,bf,bf]).^realmax), 0) - -%!assert (nnz (sparse ([bf;bf;1]).^realmax), 1) -%!assert (nnz (sparse ([1;bf;bf]).^realmax), 1) -%!assert (nnz (sparse ([0.5;bf;bf]).^realmax), 0) - -%!assert (nnz (sparse ([bf,bf,1])*realmin), 1) -%!assert (nnz (sparse ([1,bf,bf])*realmin), 1) -%!assert (nnz (sparse ([bf,bf,bf])*realmin), 0) - -%!assert (nnz (sparse ([bf;bf;1])*realmin), 1) -%!assert (nnz (sparse ([1;bf;bf])*realmin), 1) -%!assert (nnz (sparse ([bf;bf;bf])*realmin), 0) - -EOF -} - -gen_specific() { -cat >>$TESTS <<EOF - -%!test # segfault test from edd@debian.org -%! n = 510; -%! sparse (kron ((1:n)', ones(n,1)), kron (ones(n,1), (1:n)'), ones (n)); - -%% segfault tests from Fabian@isas-berlin.de -%% Note that the last four do not fail, but rather give a warning -%% of a singular matrix, which is consistent with the full matrix -%% behaviour. They are therefore disabled. -%!testif HAVE_UMFPACK -%! assert (inv (sparse ([1,1;1,1+i])), sparse([1-1i,1i;1i,-1i]), 10*eps); -%#!error inv ( sparse ([1,1;1,1] ) ); -%#!error inv ( sparse ([0,0;0,1] ) ); -%#!error inv ( sparse ([0,0;0,1+i]) ); -%#!error inv ( sparse ([0,0;0,0] ) ); - -%% error handling in constructor -%!error sparse (1,[2,3],[1,2,3]) -%!error sparse ([1,1],[1,1],[1,2],3,3,"bogus") -%!error sparse ([1,3],[1,-4],[3,5],2,2) -%!error sparse ([1,3],[1,-4],[3,5i],2,2) -%!error sparse (-1,-1,1) -EOF -} - - -gen_specific_tests() { - gen_section - gen_specific - gen_section - echo '%!shared bf' >> $TESTS - echo '%!test bf=realmin;' >> $TESTS - gen_eat_zeros - echo '%!test bf=realmin+realmin*1i;' >> $TESTS - gen_eat_zeros - cat >>$TESTS <<EOF -%!assert (nnz (sparse ([-1,realmin,realmin]).^1.5), 1) -%!assert (nnz (sparse ([-1,realmin,realmin,1]).^1.5), 2) - -## Make sure scalar v==0 doesn't confuse matters -%!assert (nnz (sparse (1,1,0)), 0) -%!assert (nnz (sparse (eye (3))*0), 0) -%!assert (nnz (sparse (eye (3))-sparse (eye (3))), 0) - -%!test -%! wdbz = warning ("query", "Octave:divide-by-zero"); -%! warning ("off", "Octave:divide-by-zero"); -%! assert (full (sparse (eye (3))/0), full (eye (3)/0)); -%! warning (wdbz.state, "Octave:divide-by-zero"); - -EOF -} - - -# ======================================================= -# Main function definition - -gen_function() { - if $preset; then - cat >>$TESTS <<EOF -## -## test_sparse -## -## run preset sparse tests. All should pass. -function [passes, tests] = test_sparse - disp ("writing test output to sptest.log"); - test ("test_sparse", "normal", "sptest.log"); -endfunction - -EOF - else - cat >>$TESTS <<EOF -## -## test_sprandom -## -## total_passes=0; total_tests=0; -## for i=1:10 -## [passes,tests] = sprandomtest; -## total_passes += passes; -## total_tests += tests; -## end -## The test log is appended to sprandomtest.log -function [passes,total] = test_sprandom - warning ("untested --- fix the source in build_sparse_tests.sh"); - disp ("appending test output to sprandomtest.log"); - fid = fopen ("sprandomtest.log", "at"); - test ("test_sprandom", "normal", fid); - ##[passes, total] = test("sprandomtest","normal",fid); - fclose (fid); -endfunction - -EOF - fi - -} - - -# ======================================================= -# matrix ops - -# test ordered comparisons: uses as,af,bs,bf -gen_ordering_tests() { - cat >>$TESTS <<EOF -%% real values can be ordered (uses as,af) -%!assert (as<=bf, sparse (af<=bf)) -%!assert (bf<=as, sparse (bf<=af)) - -%!assert (as>=bf, sparse (af>=bf)) -%!assert (bf>=as, sparse (bf>=af)) - -%!assert (as<bf, sparse (af<bf)) -%!assert (bf<as, sparse (bf<af)) - -%!assert (as>bf, sparse (af>bf)) -%!assert (bf>as, sparse (bf>af)) - -EOF -} - -gen_sparsesparse_ordering_tests() { - cat >>$TESTS <<EOF -%!assert (as<=bs, sparse (af<=bf)) -%!assert (as>=bs, sparse (af>=bf)) -%!assert (as<bs, sparse (af<bf)) -%!assert (as>bs, sparse (af>bf)) -EOF -} - -# test element-wise binary operations: uses as,af,bs,bf,scalar -gen_elementop_tests() { - cat >>$TESTS <<EOF -%% Elementwise binary tests (uses as,af,bs,bf,scalar) -%!assert (as==bs, sparse (af==bf)) -%!assert (bf==as, sparse (bf==af)) - -%!assert (as!=bf, sparse (af!=bf)) -%!assert (bf!=as, sparse (bf!=af)) - -%!assert (as+bf, af+bf) -%!assert (bf+as, bf+af) - -%!assert (as-bf, af-bf) -%!assert (bf-as, bf-af) - -%!assert (as.*bf, sparse (af.*bf)) -%!assert (bf.*as, sparse (bf.*af)) - -%!assert (as./bf, sparse (af./bf), 100*eps) -%!assert (bf.\as, sparse (bf.\af), 100*eps) - -%!test -%! sv = as.^bf; -%! fv = af.^bf; -%! idx = find (af~=0); -%! assert (sv(:)(idx), sparse (fv(:)(idx)), 100*eps) - -EOF -} - -gen_sparsesparse_elementop_tests() { - cat >>$TESTS <<EOF -%!assert (as==bs, sparse (af==bf)) -%!assert (as!=bs, sparse (af!=bf)) -%!assert (as+bs, sparse (af+bf)) -%!assert (as-bs, sparse (af-bf)) -%!assert (as.*bs, sparse (af.*bf)) -%!xtest assert (as./bs, sparse (af./bf), 100*eps) -%!test -%! sv = as.^bs; -%! fv = af.^bf; -%! idx = find (af~=0); -%! assert(sv(:)(idx), sparse (fv(:)(idx)), 100*eps) - -EOF -} - -# test matrix-matrix left and right division: uses as,af,bs,bf -gen_divop_tests() { - cat >>$TESTS <<EOF -%% Matrix-matrix operators (uses af,as,bs,bf) -%!assert (as/bf, af/bf, 100*eps) -%!assert (af/bs, af/bf, 100*eps) -%!assert (as/bs, sparse (af/bf), 100*eps) -%!assert (bs\af', bf\af', 100*eps) -%!assert (bf\as', bf\af', 100*eps) -%!assert (bs\as', sparse (bf\af'), 100*eps) - -EOF -} - -# test matrix-matrix left and right division: uses as,af,bs,bf -gen_square_divop_tests() { - cat >>$TESTS <<EOF -%% Matrix-matrix operators (uses af,as,bs,bf) -%!assert (as/bf, af/bf, 100*eps) -%!assert (af/bs, af/bf, 100*eps) -%!assert (as/bs, sparse (af/bf), 100*eps) -%!assert (bs\af', bf\af', 100*eps) -%!assert (bf\as', bf\af', 100*eps) -%!assert (bs\as', sparse (bf\af'), 100*eps) - -EOF -} - -# test matrix-matrix operations: uses as,af,bs,bf -gen_matrixop_tests() { - cat >>$TESTS <<EOF -%% Matrix-matrix operators (uses af,as,bs,bf) -%!assert (as*bf', af*bf') -%!assert (af*bs', af*bf') -%!assert (as*bs', sparse (af*bf')) - -EOF -} - -# test diagonal operations -gen_matrixdiag_tests() { - cat >>$TESTS <<EOF -%% Matrix diagonal tests (uses af,as,bf,bs) -%!assert (diag (as), sparse (diag (af))) -%!assert (diag (bs), sparse (diag (bf))) -%!assert (diag (as,1), sparse (diag (af,1))) -%!assert (diag (bs,1), sparse (diag (bf,1))) -%!assert (diag (as,-1), sparse (diag (af,-1))) -%!assert (diag (bs,-1), sparse (diag (bf,-1))) -%!assert (diag (as(:)), sparse (diag (af(:)))) -%!assert (diag (as(:),1), sparse (diag (af(:),1))) -%!assert (diag (as(:),-1), sparse (diag (af(:),-1))) -%!assert (diag (as(:)'), sparse (diag (af(:)'))) -%!assert (diag (as(:)',1), sparse (diag (af(:)',1))) -%!assert (diag (as(:)',-1), sparse (diag (af(:)',-1))) -%!assert (spdiags (as,[0,1]), [diag(af,0), diag(af,1)]) -%!test -%! [tb,tc]=spdiags(as); -%! assert (spdiags (tb,tc,sparse (zeros (size (as)))), as); -%! assert (spdiags (tb,tc,size (as,1),size (as,2)), as); - -EOF -} - -# test matrix reshape operations -gen_matrixreshape_tests() { - cat >>$TESTS <<EOF -%% Matrix diagonal tests (uses af,as,bf,bs) -%!assert(reshape(as,1,prod(size(as))),sparse(reshape(af,1,prod(size(af))))) -%!assert(reshape(as,prod(size(as)),1),sparse(reshape(af,prod(size(af)),1))) -%!assert(reshape(as,fliplr(size(as))),sparse(reshape(af,fliplr(size(af))))) -%!assert(reshape(bs,1,prod(size(as))),sparse(reshape(bf,1,prod(size(af))))) -%!assert(reshape(bs,prod(size(as)),1),sparse(reshape(bf,prod(size(af)),1))) -%!assert(reshape(bs,fliplr(size(as))),sparse(reshape(bf,fliplr(size(af))))) - -EOF -} - -# test mapper matrix operations: uses as,af -print_mapper_test() { -echo "%!assert ($1(as), sparse ($1(af)))" >>$TESTS -} - -print_real_mapper_test() { - cat >>$TESTS <<EOF -%!test -%! wn2s = warning ("query", "Octave:num-to-str"); -%! warning ("off", "Octave:num-to-str"); -%! if (isreal (af)) -%! if ($2) -%! assert ($1(as), sparse ($1(af))); -%! else -%! assert ($1(as), $1(af)); -%! endif -%! endif -%! warning (wn2s.state, "Octave:num-to-str"); - -EOF -} - -gen_mapper_tests() { -echo "%% Unary matrix tests (uses af,as)">>$TESTS -print_mapper_test abs -print_mapper_test acos -print_mapper_test acosh -print_mapper_test angle -print_mapper_test arg -print_mapper_test asin -print_mapper_test asinh -print_mapper_test atan -print_mapper_test atanh -print_mapper_test ceil -print_mapper_test conj -print_mapper_test cos -print_mapper_test cosh -print_mapper_test exp -print_mapper_test finite -print_mapper_test fix -print_mapper_test floor -print_mapper_test imag -print_mapper_test isinf -print_mapper_test isna -print_mapper_test isnan -print_mapper_test log -#print_mapper_test log10 ## fails with different NaN, not a problem -print_mapper_test real -print_mapper_test round -print_mapper_test sign -print_mapper_test sin -print_mapper_test sinh -print_mapper_test sqrt -print_mapper_test tan -print_mapper_test tanh - -# Specific tests for certain mapper functions - cat >>$TESTS <<EOF -%!assert (issparse (abs (as)) && isreal (abs (as))) -%!assert (issparse (real (as)) && isreal (real (as))) -%!assert (issparse (imag (as)) && isreal (imag (as))) - -EOF -} - -gen_real_mapper_tests() { -echo "%% Unary matrix tests (uses af,as)">>$TESTS -print_real_mapper_test erf 1 -print_real_mapper_test erfc 1 -#print_real_mapper_test gamma 1 -print_real_mapper_test isalnum 0 -print_real_mapper_test isalpha 0 -print_real_mapper_test isascii 0 -print_real_mapper_test iscntrl 0 -print_real_mapper_test isdigit 0 -print_real_mapper_test isgraph 0 -print_real_mapper_test islower 0 -print_real_mapper_test isprint 0 -print_real_mapper_test ispunct 0 -print_real_mapper_test isspace 0 -print_real_mapper_test isupper 0 -print_real_mapper_test isxdigit 0 -#print_real_mapper_test lgamma 1 - -# Specific tests for certain mapper functions - cat >>$TESTS <<EOF - -%% These mapper functions always return a full matrix -%!test -%! wn2s = warning ("query", "Octave:num-to-str"); -%! warning ("off", "Octave:num-to-str"); -%! if (isreal (af)) -%! assert (toascii (as), toascii (af)); -%! assert (tolower (as), tolower (af)); -%! assert (toupper (as), toupper (af)); -%! endif -%! warning (wn2s.state, "Octave:num-to-str"); - -EOF -} - -# test matrix operations: uses as,af -gen_unaryop_tests() { - cat >>$TESTS <<EOF -%% Unary matrix tests (uses af,as) -%!assert (issparse (as)) -%!assert (!issparse (af)) -%!assert (! (issparse (af) && iscomplex (af))) -%!assert (! (issparse (af) && isreal (af))) -%!assert (sum (as), sparse (sum (af))) -%!assert (sum (as,1), sparse (sum (af,1))) -%!assert (sum (as,2), sparse (sum (af,2))) -%!assert (cumsum (as), sparse (cumsum (af))) -%!assert (cumsum (as,1), sparse (cumsum (af,1))) -%!assert (cumsum (as,2), sparse (cumsum (af,2))) -%!assert (sumsq (as), sparse (sumsq (af))) -%!assert (sumsq (as,1), sparse (sumsq (af,1))) -%!assert (sumsq (as,2), sparse (sumsq (af,2))) -%!assert (prod (as), sparse (prod (af))) -%!assert (prod (as,1), sparse (prod (af,1))) -%!assert (prod (as,2), sparse (prod (af,2))) -%!assert (cumprod (as), sparse (cumprod (af))) -%!assert (cumprod (as,1), sparse (cumprod (af,1))) -%!assert (cumprod (as,2), sparse (cumprod (af,2))) - -%!assert (min (as), sparse (min (af))) -%!assert (full (min (as(:))),min (af(:))) -%!assert (min (as,[],1), sparse (min (af,[],1))) -%!assert (min (as,[],2), sparse (min (af,[],2))) -%!assert (min (as,[],1), sparse (min (af,[],1))) -%!assert (min (as,0), sparse (min (af,0))) -%!assert (min (as,bs), sparse (min (af,bf))) -%!assert (max (as), sparse (max (af))) -%!assert (full (max (as(:))), max (af(:))) -%!assert (max (as,[],1), sparse (max (af,[],1))) -%!assert (max (as,[],2), sparse (max (af,[],2))) -%!assert (max (as,[],1), sparse (max (af,[],1))) -%!assert (max (as,0), sparse (max (af,0))) -%!assert (max (as,bs), sparse (max (af,bf))) - -%!assert (as==as) -%!assert (as==af) -%!assert (af==as) -%!test -%! [ii,jj,vv,nr,nc] = find (as); -%! assert (af, full (sparse (ii,jj,vv,nr,nc))); -%!assert (nnz (as), sum (af(:)!=0)) -%!assert (nnz (as), nnz (af)) -%!assert (issparse (as.')) -%!assert (issparse (as')) -%!assert (issparse (-as)) -%!assert (~as, sparse (~af)) -%!assert (as.', sparse (af.')); -%!assert (as', sparse (af')); -%!assert (-as, sparse (-af)); -%!assert (~as, sparse (~af)); -%!error [i,j]=size (af);as(i-1,j+1); -%!error [i,j]=size (af);as(i+1,j-1); -%!test -%! [Is,Js,Vs] = find (as); -%! [If,Jf,Vf] = find (af); -%! assert (Is, If); -%! assert (Js, Jf); -%! assert (Vs, Vf); -%!error as(0,1); -%!error as(1,0); -%!assert (find (as), find (af)) -%!test -%! [i,j,v] = find (as); -%! [m,n] = size (as); -%! x = sparse (i,j,v,m,n); -%! assert (x, as); -%!test -%! [i,j,v,m,n] = find (as); -%! x = sparse (i,j,v,m,n); -%! assert (x, as); -%!assert (issparse (horzcat (as,as))); -%!assert (issparse (vertcat (as,as))); -%!assert (issparse (cat (1,as,as))); -%!assert (issparse (cat (2,as,as))); -%!assert (issparse ([as,as])); -%!assert (issparse ([as;as])); -%!assert (horzcat (as,as), sparse ([af,af])); -%!assert (vertcat (as,as), sparse ([af;af])); -%!assert (horzcat (as,as,as), sparse ([af,af,af])); -%!assert (vertcat (as,as,as), sparse ([af;af;af])); -%!assert ([as,as], sparse ([af,af])); -%!assert ([as;as], sparse ([af;af])); -%!assert ([as,as,as], sparse ([af,af,af])); -%!assert ([as;as;as], sparse ([af;af;af])); -%!assert (cat (2,as,as), sparse ([af,af])); -%!assert (cat (1,as,as), sparse ([af;af])); -%!assert (cat (2,as,as,as), sparse ([af,af,af])); -%!assert (cat (1,as,as,as), sparse ([af;af;af])); -%!assert (issparse ([as,af])); -%!assert (issparse ([af,as])); -%!assert ([as,af], sparse ([af,af])); -%!assert ([as;af], sparse ([af;af])); - -EOF -} - -# operations which require square matrices. -gen_square_tests() { -# The \ and / operator tests on square matrices - gen_square_divop_tests - - cat >>$TESTS <<EOF -%!testif HAVE_UMFPACK -%! assert(det(bs+speye(size(bs))),det(bf+eye(size(bf))),100*eps*abs(det(bf+eye(size(bf))))) - -%!testif HAVE_UMFPACK -%! [l,u] = lu (sparse ([1,1;1,1])); -%! assert (l*u, [1,1;1,1], 10*eps); - -%!testif HAVE_UMFPACK -%! [l,u] = lu (sparse ([1,1;1,1+i])); -%! assert (l, sparse ([1,2,2],[1,1,2],1), 10*eps); -%! assert (u, sparse ([1,1,2],[1,2,2],[1,1,1i]), 10*eps); - -%!testif HAVE_UMFPACK # permuted LU -%! [L,U] = lu (bs); -%! assert (L*U, bs, 1e-10); - -%!testif HAVE_UMFPACK # simple LU + row permutations -%! [L,U,P] = lu (bs); -%! assert (P'*L*U, bs, 1e-10); -%! # triangularity -%! [i,j,v] = find (L); -%! assert (i-j>=0); -%! [i,j,v] = find (U); -%! assert (j-i>=0); - -%!testif HAVE_UMFPACK # simple LU + row/col permutations -%! [L,U,P,Q] = lu (bs); -%! assert (P'*L*U*Q', bs, 1e-10); -%! # triangularity -%! [i,j,v] = find (L); -%! assert (i-j>=0); -%! [i,j,v] = find (U); -%! assert (j-i>=0); - -%!testif HAVE_UMFPACK # LU with vector permutations -%! [L,U,P,Q] = lu (bs,'vector'); -%! assert (L(P,:)*U(:,Q), bs, 1e-10); -%! # triangularity -%! [i,j,v] = find (L); -%! assert (i-j>=0); -%! [i,j,v] = find (U); -%! assert (j-i>=0); - -%!testif HAVE_UMFPACK # LU with scaling -%! [L,U,P,Q,R] = lu (bs); -%! assert (R*P'*L*U*Q', bs, 1e-10); -%! # triangularity -%! [i,j,v] = find (L); -%! assert (i-j>=0); -%! [i,j,v] = find (U); -%! assert (j-i>=0); - -%!testif HAVE_UMFPACK # inverse -%! assert (inv (bs)*bs, sparse (eye (rows (bs))), 1e-10); - -%!assert (bf\as', bf\af', 100*eps); -%!assert (bs\af', bf\af', 100*eps); -%!assert (bs\as', sparse (bf\af'), 100*eps); - -EOF -} - -# Cholesky tests -gen_cholesky_tests() { - cat >>$TESTS <<EOF -%!testif HAVE_CHOLMOD -%! assert (chol (bs)'*chol (bs), bs, 1e-10); -%!testif HAVE_CHOLMOD -%! assert (chol (bs,'lower')*chol (bs,'lower')', bs, 1e-10); -%!testif HAVE_CHOLMOD -%! assert (chol (bs,'lower'), chol (bs)', 1e-10); - -%!testif HAVE_CHOLMOD # Return Partial Cholesky factorization -%! [RS,PS] = chol (bs); -%! assert (RS'*RS, bs, 1e-10); -%! assert (PS, 0); -%! [LS,PS] = chol (bs,'lower'); -%! assert (LS*LS', bs, 1e-10); -%! assert (PS, 0); - -%!testif HAVE_CHOLMOD # Permuted Cholesky factorization -%! [RS,PS,QS] = chol (bs); -%! assert (RS'*RS, QS*bs*QS', 1e-10); -%! assert (PS, 0); -%! [LS,PS,QS] = chol (bs,'lower'); -%! assert (LS*LS', QS*bs*QS', 1e-10); -%! assert (PS, 0); - -EOF -} - -# test scalar operations: uses af and real scalar bf; modifies as,bf,bs -gen_scalar_tests() { - echo '%!test as=sparse(af);' >> $TESTS - echo '%!test bs=bf;' >> $TESTS - gen_elementop_tests - gen_ordering_tests - echo '%!test bf=bf+1i;' >>$TESTS - echo '%!test bs=bf;' >> $TESTS - gen_elementop_tests -} - -# test matrix operations: uses af and bf; modifies as,bs -gen_rectangular_tests() { - echo '%!test as=sparse(af);' >> $TESTS - echo '%!test bs=sparse(bf);' >>$TESTS - gen_mapper_tests - gen_real_mapper_tests - gen_unaryop_tests - gen_elementop_tests - gen_sparsesparse_elementop_tests - gen_matrixop_tests - # gen_divop_tests # Disable rectangular \ and / for now - gen_matrixdiag_tests - gen_matrixreshape_tests - cat >>$TESTS <<EOF -%!testif HAVE_UMFPACK # permuted LU -%! [L,U] = lu (bs); -%! assert (L*U, bs, 1e-10); - -%!testif HAVE_UMFPACK # simple LU + row permutations -%! [L,U,P] = lu (bs); -%! assert (P'*L*U, bs, 1e-10); -%! # triangularity -%! [i,j,v] = find (L); -%! assert (i-j>=0); -%! [i,j,v] = find (U); -%! assert (j-i>=0); - -%!testif HAVE_UMFPACK # simple LU + row/col permutations -%! [L,U,P,Q] = lu (bs); -%! assert (P'*L*U*Q', bs, 1e-10); -%! # triangularity -%! [i,j,v] = find (L); -%! assert (i-j>=0); -%! [i,j,v] = find (U); -%! assert (j-i>=0); - -%!testif HAVE_UMFPACK # LU with vector permutations -%! [L,U,P,Q] = lu (bs,'vector'); -%! assert (L (P,:)*U (:,Q), bs, 1e-10); -%! # triangularity -%! [i,j,v] = find (L); -%! assert (i-j>=0); -%! [i,j,v] = find (U); -%! assert (j-i>=0); - -%!testif HAVE_UMFPACK # LU with scaling -%! [L,U,P,Q,R] = lu (bs); -%! assert (R*P'*L*U*Q', bs, 1e-10); -%! # triangularity -%! [i,j,v] = find (L); -%! assert (i-j>=0); -%! [i,j,v] = find (U); -%! assert (j-i>=0); - -EOF -} - - -# ======================================================= -# sparse assembly tests - -gen_assembly_tests() { -cat >>$TESTS <<EOF -%%Assembly tests -%!test -%! m = max ([m;r(:)]); -%! n = max ([n;c(:)]); -%! funiq = fsum = zeros (m,n); -%! funiq(r(:) + m*(c(:)-1) ) = ones (size (r(:))); -%! funiq = sparse (funiq); -%! for k=1:length(r) -%! fsum(r(k),c(k)) += 1; -%! endfor -%! fsum = sparse (fsum); -%!assert (sparse (r,c,1), sparse (fsum(1:max(r), 1:max(c)))) -%!assert (sparse (r,c,1,"sum"), sparse (fsum(1:max (r),1:max (c)))) -%!assert (sparse (r,c,1,"unique"), sparse (funiq(1:max (r),1:max (c)))) -%!assert (sparse (r,c,1,m,n), sparse (fsum)) -%!assert (sparse (r,c,1,m,n,"sum"), sparse (fsum)) -%!assert (sparse (r,c,1,m,n,"unique"), sparse (funiq)) - -%!assert (sparse (r,c,1i), sparse (fsum(1:max (r),1:max (c))*1i)) -%!assert (sparse (r,c,1i,"sum"), sparse (fsum(1:max (r),1:max (c))*1i)) -%!assert (sparse (r,c,1i,"unique"), sparse (funiq(1:max (r),1:max (c))*1i)) -%!assert (sparse (r,c,1i,m,n), sparse (fsum*1i)) -%!assert (sparse (r,c,1i,m,n,"sum"), sparse (fsum*1i)) -%!assert (sparse (r,c,1i,m,n,"unique"), sparse (funiq*1i)) - -%!test -%! if (issparse (funiq)) -%! assert (sparse (full (1i*funiq)), sparse (1i*funiq)); -%! endif - -%!assert (sparse (full (funiq)), funiq) - - -EOF -} - -# ======================================================= -# sparse selection tests - -gen_scalar_select_tests () { - cat >>$TESTS <<EOF -%!assert (sparse (42)([1,1]), sparse ([42,42])) -%!assert (sparse (42*1i)([1,1]), sparse ([42,42].*1i)) -EOF -} - -gen_select_tests() { - cat >>$TESTS <<EOF -%!test as=sparse(af); - -%% Point tests -%!test idx = ridx(:) + rows (as) * (cidx (:)-1); -%!assert (sparse (as(idx)), sparse (af(idx))) -%!assert (as(idx), sparse (af(idx))); -%!assert (as(idx'), sparse (af(idx'))); -%!assert (as(flipud (idx(:))), sparse (af(flipud (idx(:))))) -%!assert (as([idx,idx]), sparse (af([idx,idx]))) -%!error (as(reshape ([idx;idx], [1,length(idx),2]))) - -%% Slice tests -%!assert (as(ridx,cidx), sparse (af(ridx,cidx))) -%!assert (as(ridx,:), sparse (af(ridx,:))) -%!assert (as(:,cidx), sparse (af(:,cidx))) -%!assert (as(:,:), sparse (af(:,:))) -%!assert (as((size (as,1):-1:1),:), sparse (af((size (af,1):-1:1),:))) -%!assert (as(:,(size (as,2):-1:1)), sparse (af(:, (size (af,2):-1:1)))) - -%% Indexing tests -%!assert (full (as([1,1],:)), af([1,1],:)) -%!assert (full (as(:,[1,1])), af(:,[1,1])) -%!test -%! [i,j,v] = find (as); -%! assert (as(i(1),j(1))([1,1]), sparse ([v(1), v(1)])) - -%% Assignment test -%!test -%! ts=as; ts(:,:) = ts(fliplr (1:size (as,1)),:); -%! tf=af; tf(:,:) = tf(fliplr (1:size (af,1)),:); -%! assert (ts, sparse (tf)); -%!test -%! ts=as; ts(fliplr (1:size (as,1)),:) = ts; -%! tf=af; tf(fliplr (1:size (af,1)),:) = tf; -%! assert (ts, sparse (tf)); -%!test -%! ts=as; ts(:,fliplr (1:size (as,2))) = ts; -%! tf=af; tf(:,fliplr (1:size (af,2))) = tf; -%! assert (ts, sparse (tf)); -%!test -%! ts(fliplr (1:size (as,1))) = as(:,1); -%! tf(fliplr (1:size (af,1))) = af(:,1); -%! assert (ts, sparse (tf)); - -%% Deletion tests -%!test -%! ts=as; ts(1,:)=[]; tf=af; tf(1,:)=[]; -%! assert (ts, sparse (tf)); -%!test -%! ts=as; ts(:,1)=[]; tf=af; tf(:,1)=[]; -%! assert (ts, sparse (tf)); - -%% Test "end" keyword -%!assert (full (as(end)), af(end)) -%!assert (full (as(1,end)), af(1,end)) -%!assert (full (as(end,1)), af(end,1)) -%!assert (full (as(end,end)), af(end,end)) -%!assert (as(2:end,2:end), sparse (af(2:end,2:end))) -%!assert (as(1:end-1,1:end-1), sparse (af(1:end-1,1:end-1))) -EOF -} - -# ======================================================= -# sparse save and load tests - -gen_save_tests() { - cat >>$TESTS <<EOF -%!test # save ascii -%! savefile = tmpnam (); -%! as_save = as; -%! save ("-text", savefile, "bf", "as_save", "af"); -%! clear as_save; -%! load (savefile, "as_save"); -%! unlink (savefile); -%! assert (as_save, sparse(af)); -%!test # save binary -%! savefile = tmpnam (); -%! as_save = as; -%! save ("-binary", savefile, "bf", "as_save", "af"); -%! clear as_save; -%! load (savefile, "as_save"); -%! unlink (savefile); -%! assert (as_save, sparse(af)); -%!testif HAVE_HDF5 # save hdf5 -%! savefile = tmpnam (); -%! as_save = as; -%! save ("-hdf5", savefile, "bf", "as_save", "af"); -%! clear as_save; -%! load (savefile, "as_save"); -%! unlink (savefile); -%! assert (as_save, sparse(af)); -## FIXME: We should skip (or mark as an expected failure) the test for -## saving sparse matrices to MAT files when using 64-bit indexing since -## that is not implemented yet. -%!test # save matlab -%! savefile = tmpnam (); -%! as_save = as; -%! save ("-mat", savefile, "bf", "as_save", "af"); -%! clear as_save; -%! load (savefile, "as_save"); -%! unlink (savefile); -%! assert (as_save, sparse(af)); -EOF -} - -# ============================================================= -# Specific solver tests for matrices that will test all of the solver -# code. Uses alpha and beta -gen_solver_tests() { - -if $preset; then - cat >>$TESTS <<EOF -%! n=8; -%! lf=diag (1:n); lf(n-1,1)=0.5*alpha; lf(n,2)=0.25*alpha; ls=sparse (lf); -%! uf=diag (1:n); uf(1,n-1)=2*alpha; uf(2,n)=alpha; us=sparse (uf); -%! ts=spdiags (ones (n,3),-1:1,n,n) + diag (1:n); tf = full (ts); -EOF -else - cat >>$TESTS <<EOF -%! n = floor (lognrnd (8,2)+1)'; -%! ls = tril (sprandn (8,8,0.2),-1).*alpha + n*speye (8); lf = full (ls); -%! us = triu (sprandn (8,8,0.2),1).*alpha + n*speye (8); uf = full (us); -%! ts = spdiags (randn (8,3),-1:1,8,8).*alpha; tf = full (ts); -EOF -fi - -cat >>$TESTS <<EOF -%! df = diag (1:n).* alpha; ds = sparse (df); -%! pdf = df(randperm (n),randperm (n)); -%! pds = sparse (pdf); -%! plf = lf(randperm (n),randperm (n)); -%! pls = sparse (plf); -%! puf = uf(randperm (n),randperm (n)); -%! pus = sparse (puf); -%! bs = spdiags (repmat ([1:n]',1,4),-2:1,n,n).*alpha; -%! bf = full (bs); -%! cf = lf + lf'; cs = sparse (cf); -%! bcf = bf + bf'; bcs = sparse (bcf); -%! tcf = tf + tf'; tcs = sparse (tcf); -%! xf = diag (1:n) + fliplr (diag (1:n)).*beta; -%! xs = sparse (xf); -%!assert (ds\xf, df\xf, 1e-10); -%!assert (ds\xs, sparse (df\xf), 1e-10); -%!assert (pds\xf, pdf\xf, 1e-10); -%!assert (pds\xs, sparse (pdf\xf), 1e-10); -%!assert (ls\xf, lf\xf, 1e-10); -%!assert (sparse (ls\xs), sparse (lf\xf), 1e-10); -%!testif HAVE_UMFPACK -%! assert (pls\xf, plf\xf, 1e-10); -%!testif HAVE_UMFPACK -%! assert (sparse (pls\xs), sparse (plf\xf), 1e-10); -%!assert (us\xf, uf\xf, 1e-10); -%!assert (sparse (us\xs), sparse (uf\xf), 1e-10); -%!testif HAVE_UMFPACK -%! assert (pus\xf, puf\xf, 1e-10); -%!testif HAVE_UMFPACK -%! assert (sparse (pus\xs), sparse (puf\xf), 1e-10); -%!assert (bs\xf, bf\xf, 1e-10); -%!assert (sparse (bs\xs), sparse (bf\xf), 1e-10); -%!testif HAVE_UMFPACK -%! assert (cs\xf, cf\xf, 1e-10); -%!testif HAVE_UMFPACK -%! assert (sparse (cs\xs), sparse (cf\xf), 1e-10); -%!testif HAVE_UMFPACK -%! assert (bcs\xf, bcf\xf, 1e-10); -%!testif HAVE_UMFPACK -%! assert (sparse (bcs\xs), sparse (bcf\xf), 1e-10); -%!assert (ts\xf, tf\xf, 1e-10); -%!assert (sparse (ts\xs), sparse (tf\xf), 1e-10); -%!assert (tcs\xf, tcf\xf, 1e-10); -%!assert (sparse (tcs\xs), sparse (tcf\xf), 1e-10); - -EOF - -cat >>$TESTS <<EOF -%% QR solver tests - -%!function f(a, sz, feps) -%! b = randn (sz); -%! x = a \ b; -%! assert (a * x, b, feps); -%! b = randn (sz) + 1i*randn (sz); -%! x = a \ b; -%! assert (a * x, b, feps); -%! b = sprandn (sz(1),sz(2),0.2); -%! x = a \ b; -%! assert (sparse (a * x), b, feps); -%! b = sprandn (sz(1),sz(2),0.2) + 1i*sprandn (sz(1),sz(2),0.2); -%! x = a \ b; -%! assert (sparse (a * x), b, feps); -%!endfunction -%!testif HAVE_UMFPACK -%! a = alpha*sprandn (10,11,0.2) + speye (10,11); -%! f(a,[10,2],1e-10); -%! ## Test this by forcing matrix_type, as can't get a certain -%! ## result for over-determined systems. -%! a = alpha*sprandn(10,10,0.2) + speye(10,10); -%! matrix_type (a, "Singular"); -%! f(a,[10,2],1e-10); - -%% Rectanguar solver tests that don't use QR - -%!test -%! ds = alpha * spdiags ([1:11]',0,10,11); -%! df = full (ds); -%! xf = beta * ones (10,2); -%! xs = speye (10,10); -%!assert (ds\xf, df\xf, 100*eps) -%!assert (ds\xs, sparse (df\xs), 100*eps) -%!test -%! pds = ds([2,1,3:10],:); -%! pdf = full (pds); -%!assert (pds\xf, pdf\xf, 100*eps) -%!assert (pds\xs, sparse (pdf\xs), 100*eps) -%!test -%! ds = alpha * spdiags ([1:11]',0,11,10); -%! df = full (ds); -%! xf = beta * ones (11,2); -%! xs = speye (11,11); -%!assert (ds\xf, df\xf, 100*eps) -%!assert (ds\xs, sparse (df\xs), 100*eps) -%!test -%! pds = ds([2,1,3:11],:); -%! pdf = full (pds); -%!assert (pds\xf, pdf\xf, 100*eps) -%!assert (pds\xs, sparse (pdf\xs), 100*eps) -%!test -%! us = alpha*[[speye(10,10);sparse(1,10)],[[1,1];sparse(9,2);[1,1]]]; -%!testif HAVE_UMFPACK -%! assert (us*(us\xf), xf, 100*eps) -%!testif HAVE_UMFPACK -%! assert (us*(us\xs), xs, 100*eps) -%!test -%! pus = us(:,[2,1,3:12]); -%!testif HAVE_UMFPACK -%! assert (pus*(pus\xf), xf, 100*eps) -%!testif HAVE_UMFPACK -%! assert (pus*(pus\xs), xs, 100*eps) -%!test -%! us = alpha*[speye(11,9),[1;sparse(8,1);1;0]]; -%!testif HAVE_CXSPARSE -%! [c,r] = qr (us, xf); -%! assert (us\xf, r\c, 100*eps) -%!testif HAVE_UMFPACK -%! [c,r] = qr (us, xs); -%! r = matrix_type (r, "Singular"); ## Force Matrix Type -%! assert (us\xs, r\c, 100*eps) -%!test -%! pus = us(:,[1:8,10,9]); -%!testif HAVE_UMFPACK -%! [c,r] = qr (pus, xf); -%! r = matrix_type (r, "Singular"); ## Force Matrix Type -%! assert (pus\xf, r\c, 100*eps) -%!testif HAVE_UMFPACK -%! [c,r] = qr (pus, xs); -%! r = matrix_type (r, "Singular"); ## Force Matrix Type -%! assert (pus\xs, r\c, 100*eps) -%!test -%! ls = alpha*[speye(9,11);[1, sparse(1,8),1,0]]; -%! xf = beta * ones (10,2); -%! xs = speye (10,10); -%!assert (ls*(ls\xf), xf, 100*eps) -%!assert (ls*(ls\xs), xs, 100*eps) -%!test -%! pls = ls([1:8,10,9],:); -%!assert (pls*(pls\xf), xf, 100*eps) -%!assert (pls*(pls\xs), xs, 100*eps) -%!test -%! ls = alpha*[speye(10,10), sparse(10,1);[1;1], sparse(2,9),[1;1]]; -%! xf = beta * ones (12,2); -%! xs = speye (12,12); -%!testif HAVE_UMFPACK -%! [c,r] = qr (ls, xf); -%! assert (ls\xf, r\c, 100*eps) -%!testif HAVE_UMFPACK -%! [c,r] = qr (ls, xs); -%! r = matrix_type (r, "Singular"); ## Force Matrix Type -%! assert (ls\xs, r\c, 100*eps) -%!testif HAVE_CXSPARSE -%! pls = ls(:,[1:8,10,9]); -%!testif HAVE_UMFPACK -%! [c,r] = qr (pls, xf); -%! r = matrix_type (r, "Singular"); ## Force Matrix Type -%! assert (pls\xf, r\c, 100*eps) -%!testif HAVE_UMFPACK -%! [c,r] = qr (pls, xs); -%! r = matrix_type (r, "Singular"); ## Force Matrix Type -%! assert (pls\xs, r\c, 100*eps) - -EOF -} - - -# ============================================================= -# Putting it all together: defining the combined tests - - -# initial function -gen_function -gen_section - -# specific tests -if $preset; then - gen_specific_tests - gen_section -fi - -# scalar operations -echo '%!shared as,af,bs,bf' >> $TESTS -if $preset; then - echo '%!test af=[1+1i,2-1i,0,0;0,0,0,3+2i;0,0,0,4];' >> $TESTS - echo '%!test bf=3;' >>$TESTS -else - cat >>$TESTS <<EOF -%!test -%! % generate m,n from 1 to <5000 -%! m = floor (lognrnd (8,2)+1); -%! n = floor (lognrnd (8,2)+1); -%! as = sprandn (m,n,0.3); -%! af = full (as + 1i*sprandn (as)); -%! bf = randn; -EOF -fi - -gen_scalar_tests -gen_section - -# rectangular operations -if $preset; then - echo '%!test af=[1+1i,2-1i,0,0;0,0,0,3+2i;0,0,0,4];' >> $TESTS - echo '%!test bf=[0,1-1i,0,0;2+1i,0,0,0;3-1i,2+3i,0,0];' >> $TESTS -else - cat >>$TESTS <<EOF -%!test -%! m = floor (lognrnd (8,2)+1); -%! n = floor (lognrnd (8,2)+1); -%! as = sprandn (m,n,0.3); -%! af = full (as + 1i*sprandn (as)); -%! bs = sprandn (m,n,0.3); -%! bf = full (bs + 1i*sprandn (bs)); -EOF -fi - -gen_rectangular_tests -gen_section -gen_save_tests -gen_section -echo '%!test bf=real(bf);' >> $TESTS -gen_rectangular_tests -gen_section -gen_sparsesparse_ordering_tests -gen_section -echo '%!test af=real(af);' >> $TESTS -gen_rectangular_tests -gen_section -gen_save_tests -gen_section -echo '%!test bf=bf+1i*(bf~=0);' >> $TESTS -gen_rectangular_tests -gen_section - -# square operations -if $preset; then - echo '%!test af=[1+1i,2-1i,0,0;0,0,0,3+2i;0,0,0,4];' >> $TESTS - echo '%! as=sparse(af);' >> $TESTS - echo '%!test bf=[0,1-1i,0,0;2+1i,0,0,0;3-1i,2+3i,0,0];' >> $TESTS -else - cat >>$TESTS <<EOF -%!test -%! m = floor (lognrnd (8,2)+1); -%! n = floor (lognrnd (8,2)+1); -%! as = sprandn (m,n,0.3); -%! af = full (as + 1i*sprandn (as)); -%! bs = sprandn (m,n,0.3); -%! bf = full (bs + 1i*sprandn (bs)); -EOF -fi - -cat >>$TESTS <<EOF -%!test ;# invertible matrix -%! bf = af'*bf+max (abs ([af(:);bf(:)]))*sparse (eye (columns (as))); -%! bs = sparse (bf); - -EOF - -gen_square_tests -gen_section -echo '%!test bf=real(bf);' >> $TESTS -echo '%! bs=sparse(bf);' >> $TESTS -gen_square_tests -gen_section -echo '%!test af=real(af);' >> $TESTS -echo '%! as=sparse(af);' >> $TESTS -gen_square_tests -gen_section -echo '%!test bf=bf+1i*(bf~=0);' >> $TESTS -echo '%! bs=sparse(bf);' >> $TESTS -gen_square_tests -gen_section - -# cholesky tests -if $preset; then - echo '%!test bf=[5,0,1+1i,0;0,5,0,1-2i;1-1i,0,5,0;0,1+2i,0,5];' >> $TESTS - echo '%! bs=sparse(bf);' >> $TESTS -else - echo '# This has a small chance of failing to create a positive definite matrix' >> $TESTS - echo '%!test n=floor (lognrnd (8,2)+1)' >> $TESTS - echo '%! bs = n*speye (n,n) + sprandn (n,n,0.3);' >> $TESTS - echo '%! bf = full (bs);' >> $TESTS -fi - -gen_cholesky_tests -gen_section -echo '%!test bf=real(bf);' >> $TESTS -echo '%! bs=sparse(bf);' >> $TESTS -gen_cholesky_tests -gen_section - -# assembly tests -echo '%!shared r,c,m,n,fsum,funiq' >>$TESTS -if $use_preset; then - cat >>$TESTS <<EOF -%!test -%! r = [1,1,2,1,2,3]; -%! c = [2,1,1,1,2,1]; -%! m = n = 0; -EOF -else - cat >>$TESTS <<EOF -%!test -%! % generate m,n from 1 to <5000 -%! m = floor (lognrnd (8,2)+1); -%! n = floor (lognrnd (8,2)+1); -%! nz = ceil ((m+n)/2); -%! r = floor (rand (5,nz)*n)+1; -%! c = floor (rand (5,nn)*m)+1; -EOF -fi -gen_assembly_tests #includes real and complex tests -gen_section - -# slicing tests -echo '%!shared ridx,cidx,idx,as,af' >>$TESTS -if $use_preset; then - cat >>$TESTS <<EOF -%!test -%! af = [1+1i,2-1i,0,0;0,0,0,3+2i;0,0,0,4]; -%! ridx = [1,3]; -%! cidx = [2,3]; -EOF -else - cat >>$TESTS <<EOF -%!test -%! % generate m,n from 1 to <5000 -%! m = floor (lognrnd (8,2)+1); -%! n = floor (lognrnd (8,2)+1); -%! as = sprandn (m,n,0.3); -%! af = full (as + 1i*sprandn (as)); -%! ridx = ceil (m*rand (1,ceil (rand*m)); -%! cidx = ceil (n*rand (1,ceil (rand*n)); -EOF -fi -gen_scalar_select_tests -gen_select_tests -echo '%!test af=real(af);' >> $TESTS -gen_select_tests -gen_section -echo '%!shared alpha,beta,df,pdf,lf,plf,uf,puf,bf,cf,bcf,tf,tcf,xf,ds,pds,ls,pls,us,pus,bs,cs,bcs,ts,tcs,xs' >>$TESTS -echo '%!test alpha=1;beta=1;' >> $TESTS -gen_solver_tests -echo '%!test alpha=1;beta=1i;' >> $TESTS -gen_solver_tests -echo '%!test alpha=1i;beta=1;' >> $TESTS -gen_solver_tests -echo '%!test alpha=1i;beta=1i;' >> $TESTS -gen_solver_tests -gen_section