* Bug 16259 fixed: * and .* with (sparse) booleans extended 39/21139/4
Samuel GOUGEON [Tue, 26 Nov 2019 19:10:28 +0000 (20:10 +0100)]
  http://bugzilla.scilab.org/16259

Change-Id: I609dfd9c331002c4fe65942f90e283257cfdbd55

22 files changed:
scilab/CHANGES.md
scilab/modules/ast/tests/unit_tests/dotmultiplication_with_booleans.tst [new file with mode: 0644]
scilab/modules/ast/tests/unit_tests/multiplication_with_booleans.tst [new file with mode: 0644]
scilab/modules/helptools/data/configuration/scilab_macros.txt
scilab/modules/overloading/macros/%b_m_sp.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%b_m_spb.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%b_x_sp.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%b_x_spb.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%s_m_spb.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%s_x_spb.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%sp_m_b.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%sp_m_spb.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%sp_x_b.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%sp_x_spb.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%spb_m_b.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%spb_m_s.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%spb_m_sp.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%spb_m_spb.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%spb_x_b.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%spb_x_s.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%spb_x_sp.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%spb_x_spb.sci [new file with mode: 0644]

index 450a671..88fa487 100644 (file)
@@ -294,6 +294,7 @@ Bug Fixes
 * [#16242](http://bugzilla.scilab.org/show_bug.cgi?id=16242): `loadmatfile()` could not read Octave native text data files.
 * [#16245](http://bugzilla.scilab.org/show_bug.cgi?id=16245): `gsort` could not sort booleans.
 * [#16257](http://bugzilla.scilab.org/show_bug.cgi?id=16257): `blockdiag()` implemented to replace `sysdiag()`, improved and extended to strings.
+* [#16259](http://bugzilla.scilab.org/show_bug.cgi?id=16259): * and .* multiplications involving a sparse boolean and a double, or involving 2 booleans, were not implemented.
 * [#16260](http://bugzilla.scilab.org/show_bug.cgi?id=16260): overloading `nnz` was not possible (regression).
 * [#16263](http://bugzilla.scilab.org/show_bug.cgi?id=16263): Polynomial insertion was broken for complex case.
 * [#16264](http://bugzilla.scilab.org/show_bug.cgi?id=16264): After empty for loop iterator was left uninitialized.
diff --git a/scilab/modules/ast/tests/unit_tests/dotmultiplication_with_booleans.tst b/scilab/modules/ast/tests/unit_tests/dotmultiplication_with_booleans.tst
new file mode 100644 (file)
index 0000000..fe965eb
--- /dev/null
@@ -0,0 +1,45 @@
+// ============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// ============================================================================
+
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+
+// ---------------------------------------------------------
+// Unit tests for mixed {boolean, double} .* multiplications
+// ---------------------------------------------------------
+
+b = [%T %T %F ; %F %T %F];
+spb = sparse(b);
+d = [1 2 3; 4 5 6];
+spd = sparse(d);
+ref =  [1 2 0 ; 0 5 0];
+spref = sparse(ref);
+
+assert_checkequal(b .* d, ref);
+assert_checkequal(d .* b, ref);
+
+assert_checkequal(spb .* d, spref);
+assert_checkequal(d .* spb, spref);
+assert_checkequal(spb .* spd, spref);
+assert_checkequal(spd .* spb, spref);
+assert_checkequal(b .*spd, spref);
+assert_checkequal(spd .* b, spref);
+
+// -------------------------------------------------
+// Unit tests for boolean .* boolean multiplications
+// -------------------------------------------------
+
+b =  [%T %T %F ; %F %T %F];
+b2 = [%T %F %F ; %T %T %T];
+spb = sparse(b);
+ref =  [1 0 0 ; 0 1 0];
+spref = sparse(ref);
+
+assert_checkequal(b .* b2, ref);
+assert_checkequal(spb .* b2, spref);
+assert_checkequal(b2 .* spb, spref);
+assert_checkequal(spb .* sparse(b2), spref);
diff --git a/scilab/modules/ast/tests/unit_tests/multiplication_with_booleans.tst b/scilab/modules/ast/tests/unit_tests/multiplication_with_booleans.tst
new file mode 100644 (file)
index 0000000..ed1b888
--- /dev/null
@@ -0,0 +1,44 @@
+// ============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// ============================================================================
+
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+
+// ------------------------------------------------------
+// Unit tests for mixed {boolean, double} multiplications
+// ------------------------------------------------------
+
+b = [%T %T %F ; %F %T %F];
+spb = sparse(b);
+d = [1 2 3; 4 5 6];
+spd = sparse(d);
+ref =  [3 9 ; 2 5];
+spref = sparse(ref);
+
+assert_checkequal(b*d', ref);
+assert_checkequal(d*b', ref');
+
+assert_checkequal(spb*d', spref);
+assert_checkequal(d*spb', spref');
+assert_checkequal(spb*spd', spref);
+assert_checkequal(spd*spb', spref');
+assert_checkequal(b*spd', spref);
+assert_checkequal(spd*b', spref');
+
+// -------------------------------------------------
+// Unit tests for boolean * boolean multiplications
+// ------------------------------------------------
+
+b = [%T %T %F ; %F %T %F];
+spb = sparse(b);
+ref =  [2 1 ; 1 1];
+spref = sparse(ref);
+
+assert_checkequal(b*b', ref);
+assert_checkequal(spb*b', spref);
+assert_checkequal(b*spb', spref');
+assert_checkequal(spb*spb', spref');
index 034f6bc..19fac85 100644 (file)
@@ -231,6 +231,8 @@ translatepaths
 %b_l_s
 %b_m_b
 %b_m_s
+%b_m_sp
+%b_m_spb
 %b_p_s
 %b_r_b
 %b_r_s
@@ -238,6 +240,8 @@ translatepaths
 %b_s_s
 %b_x_b
 %b_x_s
+%b_x_sp
+%b_x_spb
 %msp_a_s
 %msp_abs
 %msp_e
@@ -256,10 +260,12 @@ translatepaths
 %s_l_b
 %s_m_b
 %s_m_msp
+%s_m_spb
 %s_p_b
 %s_r_b
 %s_s_b
 %s_x_b
+%s_x_spb
 char
 enlarge_shape
 firstnonsingleton
@@ -1037,6 +1043,8 @@ systmat
 %sp_l_s
 %sp_l_sp
 %sp_length
+%sp_m_b
+%sp_m_spb
 %sp_norm
 %sp_or
 %sp_p_s
@@ -1049,6 +1057,8 @@ systmat
 %sp_sum
 %sp_tril
 %sp_triu
+%sp_x_b
+%sp_x_spb
 %sp_y_s
 %sp_y_sp
 %sp_z_s
@@ -1066,11 +1076,19 @@ systmat
 %spb_i_ce
 %spb_i_h
 %spb_i_st
+%spb_m_b
+%spb_m_s
+%spb_m_sp
+%spb_m_spb
 %spb_or
 %spb_prod
 %spb_sum
 %spb_tril
 %spb_triu
+%spb_x_b
+%spb_x_s
+%spb_x_sp
+%spb_x_spb
 %st_6
 %st_c_st
 %st_e
diff --git a/scilab/modules/overloading/macros/%b_m_sp.sci b/scilab/modules/overloading/macros/%b_m_sp.sci
new file mode 100644 (file)
index 0000000..71a1a60
--- /dev/null
@@ -0,0 +1,18 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %b_m_sp(a, b)
+    // boolean * double sparse
+    // r: sparse
+
+    r = bool2s(sparse(a)) * b
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%b_m_spb.sci b/scilab/modules/overloading/macros/%b_m_spb.sci
new file mode 100644 (file)
index 0000000..cacdb55
--- /dev/null
@@ -0,0 +1,18 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %b_m_spb(a, b)
+    // boolean * sparse boolean
+    // r: sparse
+
+    r = bool2s(sparse(a)) * bool2s(b)
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%b_x_sp.sci b/scilab/modules/overloading/macros/%b_x_sp.sci
new file mode 100644 (file)
index 0000000..f093aee
--- /dev/null
@@ -0,0 +1,16 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %b_x_sp(a, b)
+    // boolean .* double sparse
+    r = bool2s(a) .* b
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%b_x_spb.sci b/scilab/modules/overloading/macros/%b_x_spb.sci
new file mode 100644 (file)
index 0000000..2b5505c
--- /dev/null
@@ -0,0 +1,16 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %b_x_spb(a, b)
+    // boolean .* boolean sparse
+    r = bool2s(a) .* bool2s(b)
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%s_m_spb.sci b/scilab/modules/overloading/macros/%s_m_spb.sci
new file mode 100644 (file)
index 0000000..d21d3fd
--- /dev/null
@@ -0,0 +1,18 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %s_m_spb(a, b)
+    // double * boolean sparse
+    // r: sparse
+
+    r = sparse(a) * bool2s(b)
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%s_x_spb.sci b/scilab/modules/overloading/macros/%s_x_spb.sci
new file mode 100644 (file)
index 0000000..39ad429
--- /dev/null
@@ -0,0 +1,16 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %s_x_spb(a, b)
+    // double .* boolean sparse
+    r = a .* bool2s(b)
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%sp_m_b.sci b/scilab/modules/overloading/macros/%sp_m_b.sci
new file mode 100644 (file)
index 0000000..cbe9df8
--- /dev/null
@@ -0,0 +1,18 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %sp_m_b(a, b)
+    // sparse double * boolean
+    // r: sparse
+
+    r = a * bool2s(sparse(b))
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%sp_m_spb.sci b/scilab/modules/overloading/macros/%sp_m_spb.sci
new file mode 100644 (file)
index 0000000..bc2c4aa
--- /dev/null
@@ -0,0 +1,16 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %sp_m_spb(a, b)
+    // sparse double * sparse boolean
+    r = a * bool2s(b)
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%sp_x_b.sci b/scilab/modules/overloading/macros/%sp_x_b.sci
new file mode 100644 (file)
index 0000000..d7049af
--- /dev/null
@@ -0,0 +1,16 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %sp_x_b(a, b)
+    // sparse double .* boolean
+    r = a .* bool2s(b)
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%sp_x_spb.sci b/scilab/modules/overloading/macros/%sp_x_spb.sci
new file mode 100644 (file)
index 0000000..0190335
--- /dev/null
@@ -0,0 +1,16 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %sp_x_spb(a, b)
+    // sparse double .* sparse boolean
+    r = a .* bool2s(b)
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%spb_m_b.sci b/scilab/modules/overloading/macros/%spb_m_b.sci
new file mode 100644 (file)
index 0000000..08e3c8f
--- /dev/null
@@ -0,0 +1,17 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %spb_m_b(a, b)
+    // boolean sparse * boolean
+    // r: sparse
+
+    r = bool2s(a) * bool2s(sparse(b))
+endfunction
diff --git a/scilab/modules/overloading/macros/%spb_m_s.sci b/scilab/modules/overloading/macros/%spb_m_s.sci
new file mode 100644 (file)
index 0000000..751a28c
--- /dev/null
@@ -0,0 +1,18 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %spb_m_s(a, b)
+    // boolean sparse * double
+    // r: sparse
+
+    r = bool2s(a) * sparse(b)
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%spb_m_sp.sci b/scilab/modules/overloading/macros/%spb_m_sp.sci
new file mode 100644 (file)
index 0000000..d455908
--- /dev/null
@@ -0,0 +1,16 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %spb_m_sp(a, b)
+    // boolean sparse * double sparse
+    r = bool2s(a) * b
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%spb_m_spb.sci b/scilab/modules/overloading/macros/%spb_m_spb.sci
new file mode 100644 (file)
index 0000000..a82aba9
--- /dev/null
@@ -0,0 +1,16 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %spb_m_spb(a, b)
+    // sparse boolean * sparse boolean
+    r = bool2s(a) * bool2s(b)
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%spb_x_b.sci b/scilab/modules/overloading/macros/%spb_x_b.sci
new file mode 100644 (file)
index 0000000..14bc76d
--- /dev/null
@@ -0,0 +1,18 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %spb_x_b(a, b)
+    // sparse boolean .* boolean
+    // r: sparse
+
+    r = bool2s(a) .* bool2s(sparse(b))
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%spb_x_s.sci b/scilab/modules/overloading/macros/%spb_x_s.sci
new file mode 100644 (file)
index 0000000..c0454dc
--- /dev/null
@@ -0,0 +1,18 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %spb_x_s(a, b)
+    // boolean sparse .* double
+    // r: sparse
+
+    r = bool2s(a) .* b
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%spb_x_sp.sci b/scilab/modules/overloading/macros/%spb_x_sp.sci
new file mode 100644 (file)
index 0000000..279b779
--- /dev/null
@@ -0,0 +1,16 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %spb_x_sp(a, b)
+    // sparse boolean .* sparse double
+    r = bool2s(a) .* b
+endfunction
+
diff --git a/scilab/modules/overloading/macros/%spb_x_spb.sci b/scilab/modules/overloading/macros/%spb_x_spb.sci
new file mode 100644 (file)
index 0000000..6fe892c
--- /dev/null
@@ -0,0 +1,16 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+//
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = %spb_x_spb(a, b)
+    // sparse boolean .* sparse boolean
+    r = bool2s(a) .* bool2s(b)
+endfunction
+