bug 13918: Unmanaged operations on hypermatrix did not call overload functions. 78/17478/2
Antoine ELIAS [Thu, 19 Nov 2015 18:37:13 +0000 (19:37 +0100)]
Change-Id: Iedcdf178b749d0663228a476867aa2546d201dc1

31 files changed:
scilab/CHANGES_6.0.X
scilab/modules/ast/includes/operations/types_divide.hxx
scilab/modules/ast/src/cpp/operations/types_addition.cpp
scilab/modules/ast/src/cpp/operations/types_and.cpp
scilab/modules/ast/src/cpp/operations/types_divide.cpp
scilab/modules/ast/src/cpp/operations/types_dotdivide.cpp
scilab/modules/ast/src/cpp/operations/types_dotmultiplication.cpp
scilab/modules/ast/src/cpp/operations/types_ldivide.cpp
scilab/modules/ast/src/cpp/operations/types_multiplication.cpp
scilab/modules/ast/src/cpp/operations/types_or.cpp
scilab/modules/ast/src/cpp/operations/types_subtraction.cpp
scilab/modules/ast/tests/nonreg_tests/bug_13918.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/nonreg_tests/bug_13918.tst [new file with mode: 0644]
scilab/modules/overloading/macros/%i_g_i.sci [deleted file]
scilab/modules/overloading/macros/%i_h_i.sci [deleted file]
scilab/modules/overloading/macros/%p_d_s.sci [deleted file]
scilab/modules/overloading/macros/%s_a_sp.sci [deleted file]
scilab/modules/overloading/macros/%s_d_sp.sci [deleted file]
scilab/modules/overloading/macros/%s_g_s.sci [deleted file]
scilab/modules/overloading/macros/%s_h_s.sci [deleted file]
scilab/modules/overloading/macros/%s_l_s.sci [deleted file]
scilab/modules/overloading/macros/%s_r_s.sci [deleted file]
scilab/modules/overloading/macros/%s_r_sp.sci [deleted file]
scilab/modules/overloading/macros/%s_s_sp.sci [deleted file]
scilab/modules/overloading/macros/%sp_a_s.sci [deleted file]
scilab/modules/overloading/macros/%sp_a_sp.sci [deleted file]
scilab/modules/overloading/macros/%sp_d_s.sci [deleted file]
scilab/modules/overloading/macros/%sp_d_sp.sci [deleted file]
scilab/modules/overloading/macros/%sp_r_s.sci [deleted file]
scilab/modules/overloading/macros/%sp_r_sp.sci [deleted file]
scilab/modules/overloading/macros/%sp_s_s.sci [deleted file]

index 123ae1b..b524ccd 100644 (file)
@@ -13,6 +13,8 @@ For a high-level overview of the changes in this release, please consult the "Wh
         Changes between version 6.0.0-alpha-2 and 6.0.0-beta-1
         ======================================================
 
+* Bug #13918 fixed - Unmanaged operations on hypermatrix did not call overload functions.
+
 * Bug #13298 fixed - Static analysis bugs detected by PVS-Studio fixed.
 
 * Bug #13986 fixed - setdefaultlanguage did not set value correctly in Windows registry.
index 8bf999e..08495e4 100644 (file)
@@ -24,8 +24,4 @@ int RDividePolyByDouble(types::Polynom* _pPoly, types::Double* _pDouble, types::
 int RDivideDoubleByPoly(types::Double* _pDouble, types::Polynom* _pPoly, types::Polynom** _pPolyOut);
 int RDivideSparseByDouble(types::Sparse* _pSp, types::Double* _pDouble, types::InternalType** _pSpOut);
 
-
-int DotRDivideDoubleByDouble(types::Double *_pDouble1, types::Double *_pDouble2, types::Double **_pDoubleOut);
-int DotRDividePolyByDouble(types::Polynom *_pPoly1, types::Double *_pDouble2, types::Polynom **_pPolyOut);
-
 #endif /* !__TYPES_DIVIDE_HXX__ */
index 668eb38..76c343b 100644 (file)
@@ -1065,7 +1065,7 @@ InternalType* add_M_M(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -1093,7 +1093,7 @@ InternalType* add_M_MC(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -1153,7 +1153,7 @@ InternalType* add_MC_MC(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -1577,7 +1577,7 @@ InternalType* add_M_M<String, String, String>(String* _pL, String* _pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -1778,14 +1778,11 @@ template<> InternalType* add_M_M<Polynom, Polynom, Polynom>(Polynom* _pL, Polyno
                 iLeadDims = piDims[i];
             }
         }
+
         for (int i = 1 ; i < iLeadDims ; ++i)
         {
-
             _pL->set(i, i, sp);
-
         }
-
-
     }
 
 
@@ -1933,9 +1930,7 @@ template<> InternalType* add_M_M<Polynom, Polynom, Polynom>(Polynom* _pL, Polyno
 
     if (iDims1 != iDims2)
     {
-        wchar_t pMsg[bsiz];
-        os_swprintf(pMsg, bsiz, _W("Error: operator %ls: Matrix dimensions must agree (op1 is %ls, op2 is %ls).\n").c_str(),  L"+", _pL->DimToString().c_str(), _pR->DimToString().c_str());
-        throw ast::InternalError(pMsg);
+        return nullptr;
     }
 
     int* piDims1 = _pL->getDimsArray();
@@ -2141,9 +2136,7 @@ template<> InternalType* add_M_M<Double, Polynom, Polynom>(Double* _pL, Polynom*
 
     if (iDims1 != iDims2)
     {
-        wchar_t pMsg[bsiz];
-        os_swprintf(pMsg, bsiz, _W("Error: operator %ls: Matrix dimensions must agree (op1 is %ls, op2 is %ls).\n").c_str(),  L"+", _pL->DimToString().c_str(), _pR->DimToString().c_str());
-        throw ast::InternalError(pMsg);
+        return nullptr;
     }
 
     int* piDims1 = _pR->getDimsArray();
@@ -2451,7 +2444,7 @@ template<> InternalType* add_M_M<Sparse, Double, Double>(Sparse* _pL, Double* _p
     }
 
 
-    if (_pL->getRows() == _pR->getRows() && _pL->getCols() == _pR->getCols())
+    if (_pR->getDims() == 2 && _pL->getRows() == _pR->getRows() && _pL->getCols() == _pR->getCols())
     {
         //SP + D
         pOut = (Double*)_pR->clone();
@@ -2489,7 +2482,7 @@ template<> InternalType* add_M_M<Sparse, Double, Double>(Sparse* _pL, Double* _p
     }
     else
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 }
 
index 05aa454..027d11d 100644 (file)
@@ -536,7 +536,7 @@ InternalType* and_M_M(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -625,7 +625,7 @@ InternalType* and_int_M_M(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
index 02cad5a..20d3d94 100644 (file)
@@ -248,7 +248,7 @@ int RDivideDoubleByDouble(Double *_pDouble1, Double *_pDouble2, Double **_pDoubl
     if (_pDouble1->getDims() > 2 || _pDouble2->getDims() > 2 || _pDouble1->getCols() != _pDouble2->getCols())
     {
         //not managed
-        return 1;
+        return 0;
     }
 
     *_pDoubleOut = new Double(_pDouble1->getRows(), _pDouble2->getRows(), _pDouble1->isComplex() || _pDouble2->isComplex());
@@ -487,6 +487,9 @@ int RDivideSparseByDouble(types::Sparse* _pSp, types::Double* _pDouble, Internal
         }
     }
 
+    delete[] Col;
+    delete[] Row;
+
     Double** pDbl = new Double*[iSize];
     Double** pDblSp = new Double*[iSize];
     double* pdbl = _pDouble->get();
@@ -533,16 +536,10 @@ int RDivideSparseByDouble(types::Sparse* _pSp, types::Double* _pDouble, Internal
     }
     else
     {
-        for (int i = 0; i < iSize; ++i)
-        {
-            delete pDbl[i];
-            delete pDblSp[i];
-        }
-
         delete[] pDbl;
         delete[] pDblSp;
-        throw ast::InternalError(_W("Invalid exponent.\n"));
-        return 1;
+        delete[] iPositVal;
+        return 0;
     }
 
     Sparse* pSpTemp = new Sparse(_pSp->getRows(), _pSp->getCols(), _pSp->isComplex() || _pDouble->isComplex());
@@ -566,8 +563,6 @@ int RDivideSparseByDouble(types::Sparse* _pSp, types::Double* _pDouble, Internal
         }
     }
 
-    delete[] Col;
-    delete[] Row;
     delete[] iPositVal;
 
     for (int i = 0; i < iSize; ++i)
@@ -582,271 +577,3 @@ int RDivideSparseByDouble(types::Sparse* _pSp, types::Double* _pDouble, Internal
     *_pSpOut = pSpTemp;
     return 0;
 }
-
-
-
-
-int DotRDivideDoubleByDouble(Double* _pDouble1, Double* _pDouble2, Double** _pDoubleOut)
-{
-    int iErr        = 0;
-    bool bComplex1  = _pDouble1->isComplex();
-    bool bComplex2  = _pDouble2->isComplex();
-    bool bScalar1   = _pDouble1->isScalar();
-    bool bScalar2   = _pDouble2->isScalar();
-
-    if (bScalar1)
-    {
-        //x ./ Y
-        int iInc1       = 0;
-        int iInc2       = 1;
-        int iIncOut     = 1;
-        int iSizeResult = _pDouble2->getSize();
-
-        *_pDoubleOut    = new Double(_pDouble2->getDims(), _pDouble2->getDimsArray(), bComplex1 || bComplex2);
-
-        if (bComplex1 == false && bComplex2 == false)
-        {
-            // r ./ R
-            iErr = iRightDivisionRealMatrixByRealMatrix(
-                       _pDouble1->getReal(), iInc1,
-                       _pDouble2->getReal(), iInc2,
-                       (*_pDoubleOut)->getReal(), iIncOut, iSizeResult);
-        }
-        else if (bComplex1 == false && bComplex2 == true)
-        {
-            // r ./ C
-            iErr = iRightDivisionRealMatrixByComplexMatrix(
-                       _pDouble1->getReal(), iInc1,
-                       _pDouble2->getReal(), _pDouble2->getImg(), iInc2,
-                       (*_pDoubleOut)->getReal(), (*_pDoubleOut)->getImg(), iIncOut, iSizeResult);
-        }
-        else if (bComplex1 == true && bComplex2 == false)
-        {
-            // c ./ R
-            iErr = iRightDivisionComplexMatrixByRealMatrix(
-                       _pDouble1->getReal(), _pDouble1->getImg(), iInc1,
-                       _pDouble2->getReal(), iInc2,
-                       (*_pDoubleOut)->getReal(), (*_pDoubleOut)->getImg(), iIncOut, iSizeResult);
-        }
-        else if (bComplex1 == true && bComplex2 == true)
-        {
-            // c ./ C
-            iErr = iRightDivisionComplexMatrixByComplexMatrix(
-                       _pDouble1->getReal(), _pDouble1->getImg(), iInc1,
-                       _pDouble2->getReal(), _pDouble2->getImg(), iInc2,
-                       (*_pDoubleOut)->getReal(), (*_pDoubleOut)->getImg(), iIncOut, iSizeResult);
-        }
-    }
-    else if (bScalar2)
-    {
-        //X ./ y
-        int iInc1       = 1;
-        int iInc2       = 0;
-        int iIncOut     = 1;
-        int iSizeResult = _pDouble1->getSize();
-
-        *_pDoubleOut    = new Double(_pDouble1->getDims(), _pDouble1->getDimsArray(), bComplex1 || bComplex2);
-
-        if (bComplex1 == false && bComplex2 == false)
-        {
-            // r ./ R
-            iErr = iRightDivisionRealMatrixByRealMatrix(
-                       _pDouble1->getReal(), iInc1,
-                       _pDouble2->getReal(), iInc2,
-                       (*_pDoubleOut)->getReal(), iIncOut, iSizeResult);
-        }
-        else if (bComplex1 == false && bComplex2 == true)
-        {
-            // r ./ C
-            iErr = iRightDivisionRealMatrixByComplexMatrix(
-                       _pDouble1->getReal(), iInc1,
-                       _pDouble2->getReal(), _pDouble2->getImg(), iInc2,
-                       (*_pDoubleOut)->getReal(), (*_pDoubleOut)->getImg(), iIncOut, iSizeResult);
-        }
-        else if (bComplex1 == true && bComplex2 == false)
-        {
-            // c ./ R
-            iErr = iRightDivisionComplexMatrixByRealMatrix(
-                       _pDouble1->getReal(), _pDouble1->getImg(), iInc1,
-                       _pDouble2->getReal(), iInc2,
-                       (*_pDoubleOut)->getReal(), (*_pDoubleOut)->getImg(), iIncOut, iSizeResult);
-        }
-        else if (bComplex1 == true && bComplex2 == true)
-        {
-            // c ./ C
-            iErr = iRightDivisionComplexMatrixByComplexMatrix(
-                       _pDouble1->getReal(), _pDouble1->getImg(), iInc1,
-                       _pDouble2->getReal(), _pDouble2->getImg(), iInc2,
-                       (*_pDoubleOut)->getReal(), (*_pDoubleOut)->getImg(), iIncOut, iSizeResult);
-        }
-    }
-    else
-    {
-        //X ./ Y
-        //check dimension compatibilities ( same number of dimension and same size for each dimension
-        int iDims1      = _pDouble1->getDims();
-        int* piDims1    = _pDouble1->getDimsArray();
-        int iDims2      = _pDouble2->getDims();
-        int* piDims2    = _pDouble2->getDimsArray();
-
-        if (iDims1 != iDims2)
-        {
-            return 1;
-        }
-
-        for (int i = 0 ; i < iDims1 ; i++)
-        {
-            if (piDims1[i] != piDims2[i])
-            {
-                return 1;
-            }
-        }
-
-        (*_pDoubleOut) = new Double(iDims2, piDims2, bComplex1 || bComplex2);
-
-        int iInc1       = 1;
-        int iInc2       = 1;
-        int iIncOut     = 1;
-        int iSizeResult = _pDouble1->getSize();
-
-        if (bComplex1 == false && bComplex2 == false)
-        {
-            // r ./ R
-            iErr = iRightDivisionRealMatrixByRealMatrix(
-                       _pDouble1->getReal(), iInc1,
-                       _pDouble2->getReal(), iInc2,
-                       (*_pDoubleOut)->getReal(), iIncOut, iSizeResult);
-        }
-        else if (bComplex1 == false && bComplex2 == true)
-        {
-            // r ./ C
-            iErr = iRightDivisionRealMatrixByComplexMatrix(
-                       _pDouble1->getReal(), iInc1,
-                       _pDouble2->getReal(), _pDouble2->getImg(), iInc2,
-                       (*_pDoubleOut)->getReal(), (*_pDoubleOut)->getImg(), iIncOut, iSizeResult);
-        }
-        else if (bComplex1 == true && bComplex2 == false)
-        {
-            // c ./ R
-            iErr = iRightDivisionComplexMatrixByRealMatrix(
-                       _pDouble1->getReal(), _pDouble1->getImg(), iInc1,
-                       _pDouble2->getReal(), iInc2,
-                       (*_pDoubleOut)->getReal(), (*_pDoubleOut)->getImg(), iIncOut, iSizeResult);
-        }
-        else if (bComplex1 == true && bComplex2 == true)
-        {
-            // c ./ C
-            iErr = iRightDivisionComplexMatrixByComplexMatrix(
-                       _pDouble1->getReal(), _pDouble1->getImg(), iInc1,
-                       _pDouble2->getReal(), _pDouble2->getImg(), iInc2,
-                       (*_pDoubleOut)->getReal(), (*_pDoubleOut)->getImg(), iIncOut, iSizeResult);
-        }
-    }
-    return iErr;
-}
-
-int DotRDividePolyByDouble(Polynom* _pPoly1, Double* _pDouble2, Polynom** _pPolyOut)
-{
-    int iErr        = 0;
-    bool bComplex1  = _pPoly1->isComplex();
-    bool bComplex2  = _pDouble2->isComplex();
-
-    //X ./ Y
-    //check dimension compatibilities ( same number of dimension and same size for each dimension
-    int iDims1      = _pPoly1->getDims();
-    int* piDims1    = _pPoly1->getDimsArray();
-    int iMaxSize    = _pPoly1->getMaxRank() + 1;
-    int iSizePoly   = _pPoly1->getSize();
-    int iDims2      = _pDouble2->getDims();
-    int* piDims2    = _pDouble2->getDimsArray();
-
-    if (iDims1 != iDims2)
-    {
-        return 1;
-    }
-
-    for (int i = 0 ; i < iDims1 ; i++)
-    {
-        if (piDims1[i] != piDims2[i])
-        {
-            return 1;
-        }
-    }
-
-    // compute output ranks
-    int* piRanks = new int[iSizePoly];
-    for (int i = 0; i < iSizePoly; i++)
-    {
-        piRanks[i] = iMaxSize - 1;
-    }
-
-    // create output and working table
-    (*_pPolyOut) = new Polynom(_pPoly1->getVariableName(), iDims2, piDims2, piRanks);
-    delete[] piRanks;
-    Double* pDblCoefOut = new Double(_pPoly1->getRows(), _pPoly1->getCols() * iMaxSize, bComplex1 || bComplex2);
-    double* pdblCoef2   = new double[_pPoly1->getRows() * _pPoly1->getCols() * iMaxSize];
-    Double* pDblCoef1   = _pPoly1->getCoef();
-
-    int iZero = 0;
-    double* pdbl = _pDouble2->get();
-    for (int i = 0; i < iSizePoly; i++)
-    {
-        C2F(dcopy)(&iMaxSize, pdbl + i, &iZero, pdblCoef2 + i, &iSizePoly);
-    }
-
-    int iInc1       = 1;
-    int iInc2       = 1;
-    int iIncOut     = 1;
-    int iSizeResult = pDblCoefOut->getSize();
-
-    if (bComplex1 == false && bComplex2 == false)
-    {
-        // r ./ R
-        iErr = iRightDivisionRealMatrixByRealMatrix(
-                   pDblCoef1->getReal(), iInc1,
-                   pdblCoef2, iInc2,
-                   pDblCoefOut->getReal(), iIncOut, iSizeResult);
-    }
-    else if (bComplex1 == false && bComplex2 == true)
-    {
-        // r ./ C
-        //        iErr = iRightDivisionRealMatrixByComplexMatrix(
-        //                   _pDouble1->getReal(), iInc1,
-        //                   _pDouble2->getReal(), _pDouble2->getImg(), iInc2,
-        //                   (*_pDoubleOut)->getReal(), (*_pDoubleOut)->getImg(), iIncOut, iSizeResult);
-
-        // waiting for polynom rewrite about complex
-        iErr = 10;
-    }
-    else if (bComplex1 == true && bComplex2 == false)
-    {
-        // c ./ R
-        //        iErr = iRightDivisionComplexMatrixByRealMatrix(
-        //                   _pDouble1->getReal(), _pDouble1->getImg(), iInc1,
-        //                   _pDouble2->getReal(), iInc2,
-        //                   (*_pDoubleOut)->getReal(), (*_pDoubleOut)->getImg(), iIncOut, iSizeResult);
-
-        // waiting for polynom rewrite about complex
-        iErr = 10;
-    }
-    else if (bComplex1 == true && bComplex2 == true)
-    {
-        // c ./ C
-        //        iErr = iRightDivisionComplexMatrixByComplexMatrix(
-        //                   _pDouble1->getReal(), _pDouble1->getImg(), iInc1,
-        //                   _pDouble2->getReal(), _pDouble2->getImg(), iInc2,
-        //                   (*_pDoubleOut)->getReal(), (*_pDoubleOut)->getImg(), iIncOut, iSizeResult);
-
-        // waiting for polynom rewrite about complex
-        iErr = 10;
-    }
-
-    (*_pPolyOut)->setCoef(pDblCoefOut);
-    (*_pPolyOut)->updateRank();
-
-    delete pDblCoefOut;
-    delete pDblCoef1;
-    delete[] pdblCoef2;
-
-    return iErr;
-}
index f6407e6..b669dbf 100644 (file)
@@ -851,7 +851,7 @@ InternalType* dotdiv_M_M(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -881,7 +881,7 @@ InternalType* dotdiv_M_MC(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -952,7 +952,7 @@ InternalType* dotdiv_MC_M(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -982,7 +982,7 @@ InternalType* dotdiv_MC_MC(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -1344,7 +1344,7 @@ InternalType* dotdiv_M_M<Double, Sparse, Sparse>(Double* _pL, Sparse* _pR)
     //check dimensions
     if (_pL->getDims() != 2 || _pL->getRows() != _pR->getRows() || _pL->getCols() != _pR->getCols())
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     //get some information
@@ -1495,7 +1495,7 @@ InternalType* dotdiv_M_M<Sparse, Double, Sparse>(Sparse* _pL, Double* _pR)
     //check dimensions
     if (_pR->getDims() != 2 || _pR->getRows() != _pL->getRows() || _pR->getCols() != _pL->getCols())
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     //get some information
@@ -1740,7 +1740,7 @@ InternalType* dotdiv_M_M<Polynom, Double, Polynom>(Polynom* _pL, Double* _pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pR->getDimsArray();
index 48c77a4..867b859 100644 (file)
@@ -807,7 +807,7 @@ InternalType* dotmul_M_M(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -837,7 +837,7 @@ InternalType* dotmul_M_MC(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -902,7 +902,7 @@ InternalType* dotmul_MC_M(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -932,7 +932,7 @@ InternalType* dotmul_MC_MC(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -1264,7 +1264,7 @@ InternalType* dotmul_M_M<Double, Sparse, Sparse>(Double* _pL, Sparse* _pR)
     //check dimensions
     if (_pL->getDims() != 2 || _pL->getRows() != _pR->getRows() || _pL->getCols() != _pR->getCols())
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     //get some information
@@ -1405,7 +1405,7 @@ InternalType* dotmul_M_M<Polynom, Polynom, Polynom>(Polynom* _pL, Polynom* _pR)
     //check dims
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     for (int i = 0 ; i < iDimsL ; ++i)
@@ -1587,7 +1587,7 @@ InternalType* dotmul_M_M<Double, Polynom, Polynom>(Double* _pL, Polynom* _pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
index d6260f0..48dfa30 100644 (file)
@@ -117,7 +117,7 @@ int LDivideDoubleByDouble(Double *_pDouble1, Double *_pDouble2, Double **_pDoubl
     if (_pDouble1->getDims() > 2 || _pDouble2->getDims() > 2 || _pDouble1->getRows() != _pDouble2->getRows())
     {
         //not managed
-        return 1;
+        return 0;
     }
 
     *_pDoubleOut = new Double(_pDouble1->getCols(), _pDouble2->getCols(), _pDouble1->isComplex() || _pDouble2->isComplex());
index b7bed68..edc962d 100644 (file)
@@ -234,7 +234,8 @@ int MultiplyDoubleByDouble(Double* _pDouble1, Double* _pDouble2, Double** _pDoub
 
     if (_pDouble1->getDims() > 2 || _pDouble2->getDims() > 2 || _pDouble1->getCols() != _pDouble2->getRows())
     {
-        return 1;
+        //call overload
+        return 0;
     }
 
     bool bComplex1  = _pDouble1->isComplex();
@@ -333,7 +334,8 @@ int DotMultiplyDoubleByDouble(Double* _pDouble1, Double* _pDouble2, Double**  _p
 
     if (_pDouble1->getDims() != _pDouble2->getDims())
     {
-        return 1;
+        //call overload
+        return 0;
     }
 
     int* piDims1 = _pDouble1->getDimsArray();
@@ -343,7 +345,7 @@ int DotMultiplyDoubleByDouble(Double* _pDouble1, Double* _pDouble2, Double**  _p
     {
         if (piDims1[i] != piDims2[i])
         {
-            return 0;
+            return 1;
         }
     }
 
@@ -471,7 +473,8 @@ int MultiplyDoubleByPoly(Double* _pDouble, Polynom* _pPoly, Polynom** _pPolyOut)
 
     if (_pPoly->getDims() > 2 || _pDouble->getDims() > 2 || _pDouble->getCols() != _pPoly->getRows())
     {
-        return 1;
+        //call overload
+        return 0;
     }
 
     int* piRank = new int[_pDouble->getRows() * _pPoly->getCols()];
@@ -629,7 +632,8 @@ int MultiplyPolyByDouble(Polynom* _pPoly, Double* _pDouble, Polynom **_pPolyOut)
 
     if (_pDouble->getDims() > 2 || _pPoly->getDims() > 2 || _pPoly->getCols() != _pDouble->getRows())
     {
-        return 1;
+        //call overload
+        return 0;
     }
 
     int* piRank = new int[_pPoly->getRows() * _pDouble->getCols()];
@@ -942,7 +946,8 @@ int MultiplyPolyByPoly(Polynom* _pPoly1, Polynom* _pPoly2, Polynom** _pPolyOut)
 
     if (_pPoly1->getDims() > 2 || _pPoly2->getDims() > 2 || _pPoly1->getCols() != _pPoly2->getRows())
     {
-        return 1;
+        //call overload
+        return 0;
     }
 
     // matrix by matrix
@@ -1196,6 +1201,12 @@ int MultiplyDoubleBySparse(Double* _pDouble, Sparse *_pSparse, GenericType** _pO
         return 0;
     }
 
+    if (_pDouble->getDims() > 2)
+    {
+        //call overload
+        return 0;
+    }
+
     if (_pDouble->getCols() != _pSparse->getRows())
     {
         return 1;
@@ -1334,7 +1345,13 @@ int MultiplySparseByDouble(Sparse *_pSparse, Double*_pDouble, GenericType** _pOu
         return 0;
     }
 
-    if (_pSparse->getCols() != _pDouble->getRows())
+    if (_pDouble->getDims() > 2)
+    {
+        //call overload
+        return 0;
+    }
+    
+    if(_pSparse->getCols() != _pDouble->getRows())
     {
         return 1;
     }
@@ -1462,7 +1479,13 @@ int DotMultiplyDoubleBySparse(Double* _pDouble, Sparse* _pSparse, GenericType**
         return MultiplyDoubleBySparse(_pDouble, _pSparse, _pOut);
     }
 
-    if (_pSparse->getRows() != _pDouble->getRows() || _pSparse->getCols() != _pDouble->getCols())
+    if (_pDouble->getDims() > 2)
+    {
+        //call overload
+        return 0;
+    }
+    
+    if(_pSparse->getRows() != _pDouble->getRows() || _pSparse->getCols() != _pDouble->getCols())
     {
         return 1;
     }
index 3a88eb5..4e4a516 100644 (file)
@@ -564,7 +564,7 @@ InternalType* or_M_M(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -657,7 +657,7 @@ InternalType* or_int_M_M(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
index 015d4fa..1dc30fd 100644 (file)
@@ -829,7 +829,7 @@ InternalType* sub_M_M(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -857,7 +857,7 @@ InternalType* sub_M_MC(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -911,7 +911,7 @@ InternalType* sub_MC_M(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -939,7 +939,7 @@ InternalType* sub_MC_MC(T *_pL, U *_pR)
 
     if (iDimsL != iDimsR)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDimsL = _pL->getDimsArray();
@@ -1678,7 +1678,7 @@ template<> InternalType* sub_M_M<Polynom, Polynom, Polynom>(Polynom* _pL, Polyno
 
     if (iDims1 != iDims2)
     {
-        throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
+        return nullptr;
     }
 
     int* piDims1    = _pL->getDimsArray();
@@ -1926,9 +1926,7 @@ template<> InternalType* sub_M_M<Polynom, Double, Polynom>(Polynom* _pL, Double*
 
     if (iDims1 != iDims2)
     {
-        wchar_t pMsg[bsiz];
-        os_swprintf(pMsg, bsiz, _W("Error: operator %ls: Matrix dimensions must agree (op1 is %ls, op2 is %ls).\n").c_str(),  L"-", _pL->DimToString().c_str(), _pR->DimToString().c_str());
-        throw ast::InternalError(pMsg);
+        return nullptr;
     }
 
     int* piDims1 = _pR->getDimsArray();
@@ -2269,9 +2267,7 @@ template<> InternalType* sub_M_M<Double, Polynom, Polynom>(Double* _pL, Polynom*
 
     if (iDims1 != iDims2)
     {
-        wchar_t pMsg[bsiz];
-        os_swprintf(pMsg, bsiz, _W("Error: operator %ls: Matrix dimensions must agree (op1 is %ls, op2 is %ls).\n").c_str(),  L"+", _pL->DimToString().c_str(), _pR->DimToString().c_str());
-        throw ast::InternalError(pMsg);
+        return nullptr;
     }
 
     int* piDims1 = _pR->getDimsArray();
@@ -2467,6 +2463,10 @@ template<> InternalType* sub_M_M<Double, Sparse, Double>(Double* _pL, Sparse* _p
         return pOut;
     }
 
+    if (_pL->getDims() > 2)
+    {
+        return nullptr;
+    }
 
     if (_pL->getRows() == _pR->getRows() && _pL->getCols() == _pR->getCols())
     {
@@ -2622,6 +2622,11 @@ template<> InternalType* sub_M_M<Sparse, Double, Double>(Sparse* _pL, Double* _p
     }
 
 
+    if (_pR->getDims() > 2)
+    {
+        return nullptr;
+    }
+
     if (_pL->getRows() != _pR->getRows() || _pL->getCols() != _pR->getCols())
     {
         throw ast::InternalError(_W("Inconsistent row/column dimensions.\n"));
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_13918.dia.ref b/scilab/modules/ast/tests/nonreg_tests/bug_13918.dia.ref
new file mode 100644 (file)
index 0000000..4b4469d
--- /dev/null
@@ -0,0 +1,108 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enteprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 13918 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13918
+//
+// <-- Short Description -->
+// invalid operation on hypermatrix must call overload functions
+// <-- CLI SHELL MODE -->
+//error msg
+msg1 = _("Undefined operation for the given operands.\n");
+msg2 = _("check or define function %s for overloading.\n");
+//define hypermatrix
+a3 = rand(2, 2, 2);
+a2 = rand(2, 2);
+//addition
+//double + double
+assert_checkerror("a3 + a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_a_s")));
+assert_checkerror("a2 + a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_a_s")));
+//poly + double
+assert_checkerror("a3 * %s + a2", msprintf(msg1 + "%s", msprintf(msg2, "%p_a_s")));
+assert_checkerror("a2 + a3 * %s", msprintf(msg1 + "%s", msprintf(msg2, "%s_a_p")));
+//sparse + double
+assert_checkerror("sparse(a2) + a3", msprintf(msg1 + "%s", msprintf(msg2, "%sp_a_s")));
+assert_checkerror("a3 + sparse(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%s_a_sp")));
+// and
+//double & double
+assert_checkerror("a3 & a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_h_s")));
+assert_checkerror("a2 & a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_h_s")));
+//int & int
+assert_checkerror("int8(a3) & int8(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%i_h_i")));
+assert_checkerror("int8(a2) & int8(a3)", msprintf(msg1 + "%s", msprintf(msg2, "%i_h_i")));
+// divide
+//double / double
+assert_checkerror("a2 / a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_r_s")));
+assert_checkerror("a3 / a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_r_s")));
+//sparse / double
+assert_checkerror("sparse(a2) / a3", msprintf(msg1 + "%s", msprintf(msg2, "%sp_r_s")));
+assert_checkerror("a3 / sparse(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%s_r_sp")));
+// dotdivide
+//double ./ double
+assert_checkerror("a3 ./ a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_d_s")));
+assert_checkerror("a2 ./ a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_d_s")));
+//double ./ sparse
+assert_checkerror("a3 ./ sparse(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%s_d_sp")));
+//sparse ./ double
+assert_checkerror("sparse(a2) ./ a3", msprintf(msg1 + "%s", msprintf(msg2, "%sp_d_s")));
+//poly ./ double
+assert_checkerror("(a2 * %s) ./ a3", msprintf(msg1 + "%s", msprintf(msg2, "%p_d_s")));
+assert_checkerror("(a3 * %s) ./ a2", msprintf(msg1 + "%s", msprintf(msg2, "%p_d_s")));
+//dotmult
+//double .* double
+assert_checkerror("a3 .* a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_x_s")));
+assert_checkerror("a2 .* a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_x_s")));
+// sparse .* double
+assert_checkerror("sparse(a2) .* a3", msprintf(msg1 + "%s", msprintf(msg2, "%sp_x_s")));
+//double .* sparse
+assert_checkerror("a3 .* sparse(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%s_x_sp")));
+// poly .* double
+assert_checkerror("(a2 * %s) .* a3", msprintf(msg1 + "%s", msprintf(msg2, "%p_x_s")));
+assert_checkerror("(a3 * %s) .* a2", msprintf(msg1 + "%s", msprintf(msg2, "%p_x_s")));
+//double .* poly
+assert_checkerror("a2 .* (a3 * %s)", msprintf(msg1 + "%s", msprintf(msg2, "%s_x_p")));
+assert_checkerror("a3 .* (a2 * %s)", msprintf(msg1 + "%s", msprintf(msg2, "%s_x_p")));
+// ldivide
+//double \ double
+assert_checkerror("a3 \ a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_l_s")));
+assert_checkerror("a2 \ a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_l_s")));
+assert_checkerror("a3 \ a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_l_s")));
+//multiplication
+//double * double
+assert_checkerror("a3 * a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_m_s")));
+assert_checkerror("a3 * a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_m_s")));
+assert_checkerror("a2 * a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_m_s")));
+//sparse * double
+assert_checkerror("sparse(a2) * a3", msprintf(msg1 + "%s", msprintf(msg2, "%sp_m_s")));
+//double * sparse
+assert_checkerror("a3 * sparse(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%s_m_sp")));
+// or
+//double | double
+assert_checkerror("a3 | a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_g_s")));
+assert_checkerror("a2 | a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_g_s")));
+//int | int
+assert_checkerror("int8(a3) | int8(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%i_g_i")));
+assert_checkerror("int8(a2) | int8(a3)", msprintf(msg1 + "%s", msprintf(msg2, "%i_g_i")));
+//subtraction
+//double - double
+assert_checkerror("a3 - a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_s_s")));
+assert_checkerror("a2 - a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_s_s")));
+//poly - poly
+assert_checkerror("(a3 * %s) - (a2 * %s)", msprintf(msg1 + "%s", msprintf(msg2, "%p_s_p")));
+assert_checkerror("(a2 * %s) - (a3 * %s)", msprintf(msg1 + "%s", msprintf(msg2, "%p_s_p")));
+//poly - double
+assert_checkerror("(a3 * %s) - a2", msprintf(msg1 + "%s", msprintf(msg2, "%p_s_s")));
+assert_checkerror("(a2 * %s) - a3", msprintf(msg1 + "%s", msprintf(msg2, "%p_s_s")));
+//double - poly
+assert_checkerror("a3 - (a2 * %s)", msprintf(msg1 + "%s", msprintf(msg2, "%s_s_p")));
+assert_checkerror("a2 - (a3 * %s)", msprintf(msg1 + "%s", msprintf(msg2, "%s_s_p")));
+//double - sparse
+assert_checkerror("a3 - sparse(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%s_s_sp")));
+//sparse - double
+assert_checkerror("sparse(a2) - a3", msprintf(msg1 + "%s", msprintf(msg2, "%sp_s_s")));
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_13918.tst b/scilab/modules/ast/tests/nonreg_tests/bug_13918.tst
new file mode 100644 (file)
index 0000000..fcde0f3
--- /dev/null
@@ -0,0 +1,142 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enteprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug 13918 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13918
+//
+// <-- Short Description -->
+// invalid operation on hypermatrix must call overload functions
+
+// <-- CLI SHELL MODE -->
+
+//error msg
+msg1 = _("Undefined operation for the given operands.\n");
+msg2 = _("check or define function %s for overloading.\n");
+
+//define hypermatrix
+a3 = rand(2, 2, 2);
+a2 = rand(2, 2);
+
+
+//addition
+//double + double
+assert_checkerror("a3 + a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_a_s")));
+assert_checkerror("a2 + a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_a_s")));
+
+//poly + double
+assert_checkerror("a3 * %s + a2", msprintf(msg1 + "%s", msprintf(msg2, "%p_a_s")));
+assert_checkerror("a2 + a3 * %s", msprintf(msg1 + "%s", msprintf(msg2, "%s_a_p")));
+
+//sparse + double
+assert_checkerror("sparse(a2) + a3", msprintf(msg1 + "%s", msprintf(msg2, "%sp_a_s")));
+assert_checkerror("a3 + sparse(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%s_a_sp")));
+
+// and
+//double & double
+assert_checkerror("a3 & a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_h_s")));
+assert_checkerror("a2 & a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_h_s")));
+
+//int & int
+assert_checkerror("int8(a3) & int8(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%i_h_i")));
+assert_checkerror("int8(a2) & int8(a3)", msprintf(msg1 + "%s", msprintf(msg2, "%i_h_i")));
+
+// divide
+//double / double
+assert_checkerror("a2 / a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_r_s")));
+assert_checkerror("a3 / a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_r_s")));
+
+//sparse / double
+assert_checkerror("sparse(a2) / a3", msprintf(msg1 + "%s", msprintf(msg2, "%sp_r_s")));
+assert_checkerror("a3 / sparse(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%s_r_sp")));
+
+// dotdivide
+//double ./ double
+assert_checkerror("a3 ./ a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_d_s")));
+assert_checkerror("a2 ./ a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_d_s")));
+
+//double ./ sparse
+assert_checkerror("a3 ./ sparse(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%s_d_sp")));
+
+//sparse ./ double
+assert_checkerror("sparse(a2) ./ a3", msprintf(msg1 + "%s", msprintf(msg2, "%sp_d_s")));
+
+//poly ./ double
+assert_checkerror("(a2 * %s) ./ a3", msprintf(msg1 + "%s", msprintf(msg2, "%p_d_s")));
+assert_checkerror("(a3 * %s) ./ a2", msprintf(msg1 + "%s", msprintf(msg2, "%p_d_s")));
+
+//dotmult
+//double .* double
+assert_checkerror("a3 .* a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_x_s")));
+assert_checkerror("a2 .* a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_x_s")));
+
+// sparse .* double
+assert_checkerror("sparse(a2) .* a3", msprintf(msg1 + "%s", msprintf(msg2, "%sp_x_s")));
+
+//double .* sparse
+assert_checkerror("a3 .* sparse(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%s_x_sp")));
+
+// poly .* double
+assert_checkerror("(a2 * %s) .* a3", msprintf(msg1 + "%s", msprintf(msg2, "%p_x_s")));
+assert_checkerror("(a3 * %s) .* a2", msprintf(msg1 + "%s", msprintf(msg2, "%p_x_s")));
+
+//double .* poly
+assert_checkerror("a2 .* (a3 * %s)", msprintf(msg1 + "%s", msprintf(msg2, "%s_x_p")));
+assert_checkerror("a3 .* (a2 * %s)", msprintf(msg1 + "%s", msprintf(msg2, "%s_x_p")));
+
+// ldivide
+
+//double \ double
+assert_checkerror("a3 \ a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_l_s")));
+assert_checkerror("a2 \ a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_l_s")));
+assert_checkerror("a3 \ a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_l_s")));
+
+//multiplication
+//double * double
+assert_checkerror("a3 * a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_m_s")));
+assert_checkerror("a3 * a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_m_s")));
+assert_checkerror("a2 * a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_m_s")));
+
+//sparse * double
+assert_checkerror("sparse(a2) * a3", msprintf(msg1 + "%s", msprintf(msg2, "%sp_m_s")));
+
+//double * sparse
+assert_checkerror("a3 * sparse(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%s_m_sp")));
+
+// or
+//double | double
+assert_checkerror("a3 | a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_g_s")));
+assert_checkerror("a2 | a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_g_s")));
+
+//int | int
+assert_checkerror("int8(a3) | int8(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%i_g_i")));
+assert_checkerror("int8(a2) | int8(a3)", msprintf(msg1 + "%s", msprintf(msg2, "%i_g_i")));
+
+//subtraction
+//double - double
+assert_checkerror("a3 - a2", msprintf(msg1 + "%s", msprintf(msg2, "%s_s_s")));
+assert_checkerror("a2 - a3", msprintf(msg1 + "%s", msprintf(msg2, "%s_s_s")));
+
+//poly - poly
+assert_checkerror("(a3 * %s) - (a2 * %s)", msprintf(msg1 + "%s", msprintf(msg2, "%p_s_p")));
+assert_checkerror("(a2 * %s) - (a3 * %s)", msprintf(msg1 + "%s", msprintf(msg2, "%p_s_p")));
+
+
+//poly - double
+assert_checkerror("(a3 * %s) - a2", msprintf(msg1 + "%s", msprintf(msg2, "%p_s_s")));
+assert_checkerror("(a2 * %s) - a3", msprintf(msg1 + "%s", msprintf(msg2, "%p_s_s")));
+
+//double - poly
+assert_checkerror("a3 - (a2 * %s)", msprintf(msg1 + "%s", msprintf(msg2, "%s_s_p")));
+assert_checkerror("a2 - (a3 * %s)", msprintf(msg1 + "%s", msprintf(msg2, "%s_s_p")));
+
+//double - sparse
+assert_checkerror("a3 - sparse(a2)", msprintf(msg1 + "%s", msprintf(msg2, "%s_s_sp")));
+
+//sparse - double
+assert_checkerror("sparse(a2) - a3", msprintf(msg1 + "%s", msprintf(msg2, "%sp_s_s")));
diff --git a/scilab/modules/overloading/macros/%i_g_i.sci b/scilab/modules/overloading/macros/%i_g_i.sci
deleted file mode 100644 (file)
index ba4e878..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function i1=%i_g_i(i1,i2)
-    t1=inttype(i1); t2=inttype(i2);
-    //logical promotions
-    if t1<10 & t2<10 then t=max(t1,t2); end
-    if t1>10 & t2>10 then t=max(t1,t2); end
-    //more arbitrary promotions
-    if t1<10 & t2>10 then t=max(t1+10,t2); end
-    if t1>10 & t2<10 then t=max(t1,t2+10); end
-    i1=iconvert(i1,t) | iconvert(i2,t)
-endfunction
diff --git a/scilab/modules/overloading/macros/%i_h_i.sci b/scilab/modules/overloading/macros/%i_h_i.sci
deleted file mode 100644 (file)
index 087e7cc..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function i1=%i_h_i(i1,i2)
-    t1=inttype(i1); t2=inttype(i2);
-    //logical promotions
-    if t1<10 & t2<10 then t=max(t1,t2); end
-    if t1>10 & t2>10 then t=max(t1,t2); end
-    //more arbitrary promotions
-    if t1<10 & t2>10 then t=max(t1+10,t2); end
-    if t1>10 & t2<10 then t=max(t1,t2+10); end
-    i1=iconvert(i1,t) & iconvert(i2,t)
-endfunction
diff --git a/scilab/modules/overloading/macros/%p_d_s.sci b/scilab/modules/overloading/macros/%p_d_s.sci
deleted file mode 100644 (file)
index 174a625..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function [z]=%p_d_s(x,y)
-    //z = x ./ y , x vector of polynomials y scalar
-    // and other matrix polynomial
-    [m,n]=size(x)
-    if m*n==1 then
-        z=x*ones(y)./y
-    else
-        z=x./(y*ones(x))
-    end
-endfunction
diff --git a/scilab/modules/overloading/macros/%s_a_sp.sci b/scilab/modules/overloading/macros/%s_a_sp.sci
deleted file mode 100644 (file)
index 4145a62..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-function s=%s_a_sp(a,b)
-    // %s_a_sp - adds a  scalar a and a sparse matrix b
-    //!
-
-    if size(a)==[-1,-1] then
-        //eye+b
-        [m,n]=size(b)
-        s=(0+a)*speye(m,n)+b
-    else
-        s=a+full(b)
-    end
-endfunction
diff --git a/scilab/modules/overloading/macros/%s_d_sp.sci b/scilab/modules/overloading/macros/%s_d_sp.sci
deleted file mode 100644 (file)
index b3a512d..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function r=%s_d_sp(a,b)
-    //r=a./b
-
-    [ij,v,mn]=spget(b)
-    if size(v,"*")<>mn(1)*mn(2) then
-        error(27)
-    else
-        r=a./full(b)
-    end
-endfunction
diff --git a/scilab/modules/overloading/macros/%s_g_s.sci b/scilab/modules/overloading/macros/%s_g_s.sci
deleted file mode 100644 (file)
index 4019356..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function r=%s_g_s(a,b)
-    //computes a|b for a and b matrices of scalar
-
-    if a==[]|b==[] then
-        r=[]
-    else
-        r=(a<>0)|(b<>0)
-    end
-endfunction
diff --git a/scilab/modules/overloading/macros/%s_h_s.sci b/scilab/modules/overloading/macros/%s_h_s.sci
deleted file mode 100644 (file)
index cf21115..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function r=%s_h_s(a,b)
-    //computes a&b for a and b matrices of scalar
-    if a==[]|b==[] then
-        r=[]
-    else
-        r=(a<>0)&(b<>0)
-    end
-endfunction
diff --git a/scilab/modules/overloading/macros/%s_l_s.sci b/scilab/modules/overloading/macros/%s_l_s.sci
deleted file mode 100644 (file)
index 7e51179..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function R=%s_l_s(A,B)
-    // used to give a sense to operation like A\1 where A is a matrix
-    n=size(A,1)
-    R=A\(eye(n,n)*B)
-endfunction
diff --git a/scilab/modules/overloading/macros/%s_r_s.sci b/scilab/modules/overloading/macros/%s_r_s.sci
deleted file mode 100644 (file)
index 9258361..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function R=%s_r_s(B,A)
-    // used to give a sense to operation like 1/A where A is a matrix
-    n=size(A,2)
-    R=(B*eye(n,n))/A
-endfunction
diff --git a/scilab/modules/overloading/macros/%s_r_sp.sci b/scilab/modules/overloading/macros/%s_r_sp.sci
deleted file mode 100644 (file)
index 735c9d1..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function x=%s_r_sp(a,b)
-    // a/b , a full b sparse
-
-    [ma,na]=size(a)
-    [mb,nb]=size(b)
-    if ma*na==1 then x=(a*speye(nb,nb))/b,return;end
-    //if mb*nb==1 then x=a/full(b),return,end //hard coded case
-    if na<>nb then error(11),end
-
-    if mb<>nb then a=a*b';b=b*b';end
-
-    if isreal(a)&isreal(b) then
-        [h,rk]=lufact(b')
-        if rk<min(mb,nb) then warning("deficient rank: rank = "+string(rk)),end
-        x=[]
-        for k=1:ma
-            x=[x;lusolve(h,a(k,:)')']
-        end
-        ludel(h)
-    else
-        b=b';a=a'
-        [h,rk]=lufact([real(b) -imag(b);imag(b) real(b)])
-        if rk<2*min(mb,nb) then warning("deficient rank: rank = "+string(rk/2)),end
-        x=[]
-        for k=1:ma
-            x=[x lusolve(h,[real(a(:,k));imag(a(:,k))])]
-        end
-        x=(x(1:$/2,:)+%i*x($/2+1:$,:))'
-        ludel(h)
-    end
-endfunction
diff --git a/scilab/modules/overloading/macros/%s_s_sp.sci b/scilab/modules/overloading/macros/%s_s_sp.sci
deleted file mode 100644 (file)
index 02c5e16..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function s=%s_s_sp(a,b)
-    // %s_s_sp - subtract a sparse matrix b to a scalar matrix a
-    //!
-
-    if size(a)==[-1,-1] then
-        //eye+b
-        [m,n]=size(b)
-        s=(0+a)*speye(m,n)-b
-    else
-        s=a-full(b)
-    end
-endfunction
diff --git a/scilab/modules/overloading/macros/%sp_a_s.sci b/scilab/modules/overloading/macros/%sp_a_s.sci
deleted file mode 100644 (file)
index 1971109..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function s=%sp_a_s(a,b)
-    // %sp_a_s - adds a sparse matrix and a scalar s
-    //!
-
-    if size(b)==[-1 -1] then
-        [m,n]=size(a)
-        s=a+(b+0)*speye(m,n)
-    else
-        s=full(a)+b
-    end
-endfunction
diff --git a/scilab/modules/overloading/macros/%sp_a_sp.sci b/scilab/modules/overloading/macros/%sp_a_sp.sci
deleted file mode 100644 (file)
index e749702..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function s=%sp_a_sp(a,b)
-    // %spas - adds 2 sparse matrices (special cases)
-    //!
-
-    if size(a)==[1 1] then
-        a=full(a)
-        if a==0 then
-            s=b,
-        else
-            s=full(b)+a
-        end
-    elseif size(b)==[1 1] then
-        b=full(b)
-        if b==0 then
-            s=a
-        else
-            s=b+full(a)
-        end
-    end
-endfunction
diff --git a/scilab/modules/overloading/macros/%sp_d_s.sci b/scilab/modules/overloading/macros/%sp_d_s.sci
deleted file mode 100644 (file)
index 64176ea..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function r=%sp_d_s(a,b)
-    //r=a./b
-
-    r=full(a)./b
-endfunction
diff --git a/scilab/modules/overloading/macros/%sp_d_sp.sci b/scilab/modules/overloading/macros/%sp_d_sp.sci
deleted file mode 100644 (file)
index e1cba67..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function r=%sp_d_sp(a,b)
-    //r=a./b
-
-    r=full(a)./full(b)
-endfunction
diff --git a/scilab/modules/overloading/macros/%sp_r_s.sci b/scilab/modules/overloading/macros/%sp_r_s.sci
deleted file mode 100644 (file)
index 9aba2ac..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function x=%sp_r_s(a,b)
-    // a*b^-1 a sparse, b full
-
-    x=full(a)/b
-endfunction
diff --git a/scilab/modules/overloading/macros/%sp_r_sp.sci b/scilab/modules/overloading/macros/%sp_r_sp.sci
deleted file mode 100644 (file)
index 0c7e53d..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function x=%sp_r_sp(a,b)
-    // a/b , a sparse b sparse
-
-    [ma,na]=size(a)
-    [mb,nb]=size(b)
-    if na<>nb then error(12),end
-    if mb<>nb then
-        a=a*b';b=b*b'
-    end
-
-    [h,rk]=lufact(b')
-    if rk<min(mb,nb) then warning("deficient rank: rank = "+string(rk)),end
-    x=[]
-    for k=1:ma
-        x=[x;sparse(lusolve(h,full(a(k,:))')')]
-    end
-    ludel(h)
-endfunction
diff --git a/scilab/modules/overloading/macros/%sp_s_s.sci b/scilab/modules/overloading/macros/%sp_s_s.sci
deleted file mode 100644 (file)
index 53ac8ec..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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
-// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
-
-function s=%sp_s_s(a,b)
-    // %sp_s_s - subtract a scalar b to a sparse matrix a
-    //!
-
-    if size(b)==[-1 -1] then
-        [m,n]=size(a)
-        s=a-(b+0)*speye(m,n)
-    else
-        s=full(a)-b
-    end
-endfunction