bug 6990 fixed 91/291/4
Serge Steer [Wed, 28 Apr 2010 08:36:45 +0000 (10:36 +0200)]
Change-Id: I17fd382508ceb1774125aa02d62f5f60f1153284

scilab/CHANGES_5.3.X
scilab/modules/overloading/macros/%hm_and.sci
scilab/modules/overloading/macros/%hm_or.sci
scilab/modules/overloading/tests/nonreg_tests/bug_6990.dia.ref [new file with mode: 0644]
scilab/modules/overloading/tests/nonreg_tests/bug_6990.tst [new file with mode: 0644]

index c20c9cd..86fa87f 100644 (file)
@@ -275,3 +275,7 @@ Bug fixes:
 * bug 6971 fixed - after launching a toolbox by loader.sce, variable v was
                    predefined.
 
+* bug 6990 fixed - "and" and "or" did not work on hypermatrices
+
+
+
index 0527f85..7b8187e 100644 (file)
@@ -1,12 +1,58 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-// 
+// Copyright (C) 2010 - INRIA - Serge Steer
+//
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
 // you should have received as part of this distribution.  The terms
-// are also available at    
+// are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
-function r=%hm_and(x)
-  r=and(x.entries)
+function x=%hm_and(m,d)
+  if argn(2)==1|d=='*' then
+    x=and(m.entries);
+    return
+  end
+  dims=m.dims;
+  if d=='m' then
+    d=find(dims>1,1)
+    if d==[] then
+      x=and(m.entries);
+      return
+    end
+  end
+  if type(dims)==8 then
+    flag=1;
+    dims=double(dims);
+  else
+    flag=0;
+  end
+  N=size(dims,'*');
+  p1=prod(dims(1:d-1));// step to build one vector on which and is applied
+  p2=p1*dims(d);//step for beginning of next vectors
+  ind=(0:p1:p2-1)';// selection for building one vector
+  deb=(1:p1);
+  I=ind*ones(deb)+ones(ind)*deb
+
+  ind=(0:p2:prod(dims)-1);
+  I=ones(ind).*.I+ind.*.ones(I)
+
+  x=and(matrix(m.entries(I),dims(d),-1),1);
+
+  dims(d)=1
+  while  dims($)==1 then
+    dims($)=[];
+  end
+  if d==N then
+    dims=dims(1:$);
+  else
+    dims(d)=1;
+  end
+  if size(dims,'*')==2 then
+    x=matrix(x,dims(1),dims(2));
+  elseif dims<>[] then
+    if flag==1 then
+      dims=int32(dims);
+    end
+    x=hypermat(dims,x);
+  end
 endfunction
index 45ed511..4ac3423 100644 (file)
@@ -1,12 +1,58 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-// 
+// Copyright (C) 2010 - INRIA - Serge Steer
+//
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
 // you should have received as part of this distribution.  The terms
-// are also available at    
+// are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 
-function r=%hm_or(x)
-  r=or(x.entries)
+function x=%hm_or(m,d)
+  if argn(2)==1|d=='*' then
+    x=or(m.entries);
+    return
+  end
+  dims=m.dims;
+  if d=='m' then
+    d=find(dims>1,1);
+    if d==[] then
+      x=or(m.entries);
+      return
+    end
+  end
+  if type(dims)==8 then
+    flag=1;
+    dims=double(dims);
+  else
+    flag=0;
+  end
+  N=size(dims,'*');
+  p1=prod(dims(1:d-1));// step to build one vector on which or is applied
+  p2=p1*dims(d);//step for beginning of next vectors
+  ind=(0:p1:p2-1)';// selection for building one vector
+  deb=(1:p1);
+  I=ind*ones(deb)+ones(ind)*deb;
+
+  ind=(0:p2:prod(dims)-1);
+  I=ones(ind).*.I+ind.*.ones(I);
+
+  x=or(matrix(m.entries(I),dims(d),-1),1);
+
+  dims(d)=1
+  while  dims($)==1 then
+    dims($)=[];
+  end
+  if d==N then
+    dims=dims(1:$);
+  else
+    dims(d)=1;
+  end
+  if size(dims,'*')==2 then
+    x=matrix(x,dims(1),dims(2));
+  elseif dims<>[] then
+    if flag==1 then
+      dims=int32(dims);
+    end;
+    x=hypermat(dims,x);
+  end
 endfunction
diff --git a/scilab/modules/overloading/tests/nonreg_tests/bug_6990.dia.ref b/scilab/modules/overloading/tests/nonreg_tests/bug_6990.dia.ref
new file mode 100644 (file)
index 0000000..bf5c17b
--- /dev/null
@@ -0,0 +1,21 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 20010 - INRIA - Serge Steer
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- Non-regression test for bug 6990 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id= 6990
+//
+// <-- Short Description -->
+// and and or does not work on hypermatrix
+A=matrix([%f;%t;%f;%f;%t;%t;%t;%t;%t;%f;%t;%t;%t;%f;%t;%t;%t;%t;%t;%t;%f;%f;%t;%t],2,3,4);
+if or(and(A,1)<>matrix([%f;%f;%t;%t;%f;%t;%f;%t;%t;%t;%f;%t],1,3,4)) then bugmes();quit;end
+if or(and(A,2)<>matrix([%f;%f;%t;%f;%t;%f;%f;%f],2,1,4)) then bugmes();quit;end
+if or(and(A,3)<>[%f,%f,%t;%f,%f,%t]) then bugmes();quit;end
+B=matrix([%f;%t;%f;%f;%f;%t;%t;%t;%f;%f;%t;%t;%t;%f;%f;%t;%t;%t;%f;%t;%f;%f;%f;%t],2,3,4);
+if or(or(B,1)<>matrix([%t;%f;%t;%t;%f;%t;%t;%t;%t;%t;%f;%t],1,3,4)) then bugmes();quit;end
+if or(or(B,2)<>matrix([%f;%t;%t;%t;%t;%t;%f;%t],2,1,4)) then bugmes();quit;end
+if or(or(B,3)<>[%t,%f,%t;%t,%t,%t]) then bugmes();quit;end
diff --git a/scilab/modules/overloading/tests/nonreg_tests/bug_6990.tst b/scilab/modules/overloading/tests/nonreg_tests/bug_6990.tst
new file mode 100644 (file)
index 0000000..7dc6345
--- /dev/null
@@ -0,0 +1,25 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2010 - INRIA - Serge Steer
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- Non-regression test for bug 6990 -->
+// <-- JVM NOT MANDATORY --> 
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id= 6990
+//
+// <-- Short Description -->
+// "and" and "or" does not work on hypermatrices
+A=matrix([%f;%t;%f;%f;%t;%t;%t;%t;%t;%f;%t;%t;%t;%f;%t;%t;%t;%t;%t;%t;%f;%f;%t;%t],2,3,4);
+if or(and(A,1)<>matrix([%f;%f;%t;%t;%f;%t;%f;%t;%t;%t;%f;%t],1,3,4)) then pause,end
+if or(and(A,2)<>matrix([%f;%f;%t;%f;%t;%f;%f;%f],2,1,4)) then pause,end
+if or(and(A,3)<>[%f,%f,%t;%f,%f,%t]) then pause,end
+
+
+B=matrix([%f;%t;%f;%f;%f;%t;%t;%t;%f;%f;%t;%t;%t;%f;%f;%t;%t;%t;%f;%t;%f;%f;%f;%t],2,3,4);
+if or(or(B,1)<>matrix([%t;%f;%t;%t;%f;%t;%t;%t;%t;%t;%f;%t],1,3,4)) then pause,end
+if or(or(B,2)<>matrix([%f;%t;%t;%t;%t;%t;%f;%t],2,1,4)) then pause,end
+if or(or(B,3)<>[%t,%f,%t;%t,%t,%t]) then pause,end