[CID 1360800] AST: fix matrix-sparse operation 56/18456/2
Paul Bignier [Fri, 12 Aug 2016 12:34:38 +0000 (14:34 +0200)]
test_run ast subtraction

Change-Id: Ibcff4095272d5921b7b8246fabb9afe9f6cbbb3f

scilab/modules/ast/src/cpp/operations/types_subtraction.cpp
scilab/modules/ast/tests/unit_tests/subtraction.dia.ref
scilab/modules/ast/tests/unit_tests/subtraction.tst

index 3bf4c66..2630444 100644 (file)
@@ -2487,7 +2487,7 @@ template<> InternalType* sub_M_M<Double, Sparse, Double>(Double* _pL, Sparse* _p
     if (_pR->isScalar())
     {
         //D - sp
-        pOut = (Double*)_pR->clone();
+        pOut = (Double*)_pL->clone();
         pOut->setComplex(bComplex1 || bComplex2);
 
         if (pOut->isComplex())
@@ -2495,9 +2495,9 @@ template<> InternalType* sub_M_M<Double, Sparse, Double>(Double* _pL, Sparse* _p
             double* pReal = pOut->get();
             double* pImg = pOut->getImg();
             int size = pOut->getSize();
+            std::complex<double> dbl = _pR->getImg(0, 0);
             for (int i = 0 ; i < size ; i++)
             {
-                std::complex<double> dbl = _pR->getImg(0, 0);
                 pReal[i] -= dbl.real();
                 pImg[i] -= dbl.imag();
             }
@@ -2506,9 +2506,10 @@ template<> InternalType* sub_M_M<Double, Sparse, Double>(Double* _pL, Sparse* _p
         {
             double* pReal = pOut->get();
             int size = pOut->getSize();
+            double dblTmp = _pR->get(0);
             for (int i = 0 ; i < size ; i++)
             {
-                pReal[i] -= pReal[i];
+                pReal[i] -= dblTmp;
             }
         }
 
index a44f5c1..b346116 100644 (file)
@@ -21,6 +21,8 @@ p = 1 + %s - %s**2;
 pc = 1 + %s - %s**2 + ( 2 - 3 * %s + 4 * %s**2 ) * %i;
 P = [2*p, -3*p;4*p,-5*p];
 PC = [2*pc, -3*pc;4*pc,-5*pc];
+sp = sparse(1);
+spc = sparse([1+%i]);
 SP = sparse([1,2;4,5;3,10],[1,2,3]);
 SPC = sparse([1,2;4,5;3,10],[1,2,3]) * ( 1 + 4*%i);
 i8 = int8(-8);
@@ -122,6 +124,8 @@ assert_checkequal(R - i32, int32([33,34;35,36]));
 assert_checkequal(R - I32, int32([33,66;99,132]));
 assert_checkequal(R - ui32, uint32([4294967265,4294967266;4294967267,4294967268]));
 assert_checkequal(R - UI32, uint32([4294967265,4294967234;4294967203,4294967172]));
+assert_checkequal(R - sp, [0,1;2,3]);
+assert_checkequal(R - spc, [0-%i,1-%i;2-%i,3-%i]);
 assert_checkequal(C - empty, []);
 assert_checkequal(C - r, [-1+%i*2,%i*4; 1+%i*6, 2+%i*8]);
 assert_checkequal(C - c, [0, 1+%i*2; 2+%i*4, 3+%i*6]);
@@ -133,6 +137,8 @@ assert_checkequal(C - p, [%i*2-s+s^2,1+%i*4-s+s^2;2+%i*6-s+s^2,3+%i*8-s+s^2]);
 assert_checkequal(C - pc, [(-1+%i*3)*s+(1-%i*4)*s^2,1+%i*2+(-1+%i*3)*s+(1-%i*4)*s^2;2+%i*4+(-1+%i*3)*s+(1-%i*4)*s^2,3+%i*6+(-1+%i*3)*s+(1-%i*4)*s^2]);
 assert_checkequal(C - P, [-1+%i*2-2*s+2*s^2,5+%i*4+3*s-3*s^2;-1+%i*6-4*s+4*s^2,9+%i*8+5*s-5*s^2]);
 assert_checkequal(C - PC, [-1-%i*2+(-2+%i*6)*s+(2-%i*8)*s^2,5+%i*10+(3-%i*9)*s+(-3+%i*12)*s^2;-1-%i*2+(-4+%i*12)*s+(4-%i*16)*s^2,9+%i*18+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(C - sp, [2*%i,1+4*%i;2+6*%i,3+8*%i]);
+assert_checkequal(C - spc, [%i,1+3*%i;2+5*%i,3+7*%i]);
 assert_checkequal(e - empty, []);
 assert_checkequal(e - r, -1);
 assert_checkequal(e - c, -%i*2);
index f712a9c..bcf2203 100644 (file)
@@ -23,6 +23,8 @@ p = 1 + %s - %s**2;
 pc = 1 + %s - %s**2 + ( 2 - 3 * %s + 4 * %s**2 ) * %i;
 P = [2*p, -3*p;4*p,-5*p];
 PC = [2*pc, -3*pc;4*pc,-5*pc];
+sp = sparse(1);
+spc = sparse([1+%i]);
 SP = sparse([1,2;4,5;3,10],[1,2,3]);
 SPC = sparse([1,2;4,5;3,10],[1,2,3]) * ( 1 + 4*%i);
 
@@ -131,6 +133,8 @@ assert_checkequal(R - i32, int32([33,34;35,36]));
 assert_checkequal(R - I32, int32([33,66;99,132]));
 assert_checkequal(R - ui32, uint32([4294967265,4294967266;4294967267,4294967268]));
 assert_checkequal(R - UI32, uint32([4294967265,4294967234;4294967203,4294967172]));
+assert_checkequal(R - sp, [0,1;2,3]);
+assert_checkequal(R - spc, [0-%i,1-%i;2-%i,3-%i]);
 
 assert_checkequal(C - empty, []);
 assert_checkequal(C - r, [-1+%i*2,%i*4; 1+%i*6, 2+%i*8]);
@@ -143,6 +147,8 @@ assert_checkequal(C - p, [%i*2-s+s^2,1+%i*4-s+s^2;2+%i*6-s+s^2,3+%i*8-s+s^2]);
 assert_checkequal(C - pc, [(-1+%i*3)*s+(1-%i*4)*s^2,1+%i*2+(-1+%i*3)*s+(1-%i*4)*s^2;2+%i*4+(-1+%i*3)*s+(1-%i*4)*s^2,3+%i*6+(-1+%i*3)*s+(1-%i*4)*s^2]);
 assert_checkequal(C - P, [-1+%i*2-2*s+2*s^2,5+%i*4+3*s-3*s^2;-1+%i*6-4*s+4*s^2,9+%i*8+5*s-5*s^2]);
 assert_checkequal(C - PC, [-1-%i*2+(-2+%i*6)*s+(2-%i*8)*s^2,5+%i*10+(3-%i*9)*s+(-3+%i*12)*s^2;-1-%i*2+(-4+%i*12)*s+(4-%i*16)*s^2,9+%i*18+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(C - sp, [2*%i,1+4*%i;2+6*%i,3+8*%i]);
+assert_checkequal(C - spc, [%i,1+3*%i;2+5*%i,3+7*%i]);
 
 assert_checkequal(e - empty, []);
 assert_checkequal(e - r, -1);