[trunk] Rework assertion to work on 32bits system
[openjpeg.git] / src / lib / openjp2 / invert.c
index 31088952767afff2b48866d864bde377c6d8589d..bb6672d4d2119bb8df54a8055fa06e3ed5c1dec7 100644 (file)
 /** 
  * LUP decomposition
  */
-static opj_bool opj_lupDecompose(OPJ_FLOAT32 * matrix,
+static OPJ_BOOL opj_lupDecompose(OPJ_FLOAT32 * matrix,
                                  OPJ_UINT32 * permutations, 
                                  OPJ_FLOAT32 * p_swap_area,
-                                 OPJ_UINT32 n);
+                                 OPJ_UINT32 nb_compo);
 /** 
  * LUP solving
  */
@@ -40,7 +40,7 @@ static void opj_lupSolve(OPJ_FLOAT32 * pResult,
                          OPJ_FLOAT32* pMatrix, 
                          OPJ_FLOAT32* pVector, 
                          OPJ_UINT32* pPermutations, 
-                         OPJ_UINT32 n,
+                         OPJ_UINT32 nb_compo,
                          OPJ_FLOAT32 * p_intermediate_data);
 
 /** 
@@ -48,27 +48,27 @@ static void opj_lupSolve(OPJ_FLOAT32 * pResult,
  */
 static void opj_lupInvert ( OPJ_FLOAT32 * pSrcMatrix,
                             OPJ_FLOAT32 * pDestMatrix,
-                            OPJ_UINT32 n,
+                            OPJ_UINT32 nb_compo,
                             OPJ_UINT32 * pPermutations,
                             OPJ_FLOAT32 * p_src_temp,
                             OPJ_FLOAT32 * p_dest_temp,
                             OPJ_FLOAT32 * p_swap_area);
 
-/* \r
-==========================================================\r
-   Matric inversion interface\r
-==========================================================\r
+/*
+==========================================================
+   Matric inversion interface
+==========================================================
 */
 /**
  * Matrix inversion.
  */
-opj_bool opj_matrix_inversion_f(OPJ_FLOAT32 * pSrcMatrix,
+OPJ_BOOL opj_matrix_inversion_f(OPJ_FLOAT32 * pSrcMatrix,
                                 OPJ_FLOAT32 * pDestMatrix, 
-                                OPJ_UINT32 n)
+                                OPJ_UINT32 nb_compo)
 {
        OPJ_BYTE * l_data = 00;
-       OPJ_UINT32 l_permutation_size = n * sizeof(OPJ_UINT32);
-       OPJ_UINT32 l_swap_size = n * sizeof(OPJ_FLOAT32);
+       OPJ_UINT32 l_permutation_size = nb_compo * (OPJ_UINT32)sizeof(OPJ_UINT32);
+       OPJ_UINT32 l_swap_size = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
        OPJ_UINT32 l_total_size = l_permutation_size + 3 * l_swap_size;
        OPJ_UINT32 * lPermutations = 00;
        OPJ_FLOAT32 * l_double_data = 00;
@@ -81,26 +81,26 @@ opj_bool opj_matrix_inversion_f(OPJ_FLOAT32 * pSrcMatrix,
        l_double_data = (OPJ_FLOAT32 *) (l_data + l_permutation_size);
        memset(lPermutations,0,l_permutation_size);
 
-       if(! opj_lupDecompose(pSrcMatrix,lPermutations,l_double_data,n)) {
+       if(! opj_lupDecompose(pSrcMatrix,lPermutations,l_double_data,nb_compo)) {
                opj_free(l_data);
                return OPJ_FALSE;
        }
        
-    opj_lupInvert(pSrcMatrix,pDestMatrix,n,lPermutations,l_double_data,l_double_data + n,l_double_data + 2*n);
+    opj_lupInvert(pSrcMatrix,pDestMatrix,nb_compo,lPermutations,l_double_data,l_double_data + nb_compo,l_double_data + 2*nb_compo);
        opj_free(l_data);
        
     return OPJ_TRUE;
 }
 
 
-/* \r
-==========================================================\r
-   Local functions\r
-==========================================================\r
+/*
+==========================================================
+   Local functions
+==========================================================
 */
-opj_bool opj_lupDecompose(OPJ_FLOAT32 * matrix,OPJ_UINT32 * permutations, 
+OPJ_BOOL opj_lupDecompose(OPJ_FLOAT32 * matrix,OPJ_UINT32 * permutations, 
                           OPJ_FLOAT32 * p_swap_area,
-                          OPJ_UINT32 n) 
+                          OPJ_UINT32 nb_compo
 {
        OPJ_UINT32 * tmpPermutations = permutations;
        OPJ_UINT32 * dstPermutations;
@@ -108,92 +108,92 @@ opj_bool opj_lupDecompose(OPJ_FLOAT32 * matrix,OPJ_UINT32 * permutations,
        OPJ_FLOAT32 temp;
        OPJ_UINT32 i,j,k;
        OPJ_FLOAT32 p;
-       OPJ_UINT32 lLastColum = n - 1;
-       OPJ_UINT32 lSwapSize = n * sizeof(OPJ_FLOAT32);
+       OPJ_UINT32 lLastColum = nb_compo - 1;
+       OPJ_UINT32 lSwapSize = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
        OPJ_FLOAT32 * lTmpMatrix = matrix;
        OPJ_FLOAT32 * lColumnMatrix,* lDestMatrix;
        OPJ_UINT32 offset = 1;
-       OPJ_UINT32 lStride = n-1;
+       OPJ_UINT32 lStride = nb_compo-1;
 
-       //initialize permutations
-       for (i = 0; i < n; ++i) 
+       /*initialize permutations */
+       for (i = 0; i < nb_compo; ++i) 
        {
        *tmpPermutations++ = i;
        }
-       // now make a pivot with colum switch
+       /* now make a pivot with colum switch */
        tmpPermutations = permutations;
        for (k = 0; k < lLastColum; ++k) {
                p = 0.0;
 
-               // take the middle element
+               /* take the middle element */
                lColumnMatrix = lTmpMatrix + k;
                
-               // make permutation with the biggest value in the column
-        for (i = k; i < n; ++i) {
+               /* make permutation with the biggest value in the column */
+        for (i = k; i < nb_compo; ++i) {
                        temp = ((*lColumnMatrix > 0) ? *lColumnMatrix : -(*lColumnMatrix));
                if (temp > p) {
                        p = temp;
                        k2 = i;
                }
-                       // next line
-                       lColumnMatrix += n;
+                       /* next line */
+                       lColumnMatrix += nb_compo;
        }
 
-       // a whole rest of 0 -> non singular
+       /* a whole rest of 0 -> non singular */
        if (p == 0.0) {
                return OPJ_FALSE;
                }
 
-               // should we permute ?
+               /* should we permute ? */
                if (k2 != k) {
-                       //exchange of line
-               // k2 > k
+                       /*exchange of line */
+               /* k2 > k */
                        dstPermutations = tmpPermutations + k2 - k;
-                       // swap indices
+                       /* swap indices */
                        t = *tmpPermutations;
                *tmpPermutations = *dstPermutations;
                *dstPermutations = t;
 
-                       // and swap entire line.
-                       lColumnMatrix = lTmpMatrix + (k2 - k) * n;
+                       /* and swap entire line. */
+                       lColumnMatrix = lTmpMatrix + (k2 - k) * nb_compo;
                        memcpy(p_swap_area,lColumnMatrix,lSwapSize);
                        memcpy(lColumnMatrix,lTmpMatrix,lSwapSize);
                        memcpy(lTmpMatrix,p_swap_area,lSwapSize);
                }
 
-               // now update data in the rest of the line and line after
+               /* now update data in the rest of the line and line after */
                lDestMatrix = lTmpMatrix + k;
-               lColumnMatrix = lDestMatrix + n;
-               // take the middle element
+               lColumnMatrix = lDestMatrix + nb_compo;
+               /* take the middle element */
                temp = *(lDestMatrix++);
 
-               // now compute up data (i.e. coeff up of the diagonal).
-       for (i = offset; i < n; ++i)  {
-                       //lColumnMatrix;
-                       // divide the lower column elements by the diagonal value
+               /* now compute up data (i.e. coeff up of the diagonal). */
+       for (i = offset; i < nb_compo; ++i)  {
+                       /*lColumnMatrix; */
+                       /* divide the lower column elements by the diagonal value */
 
-                       // matrix[i][k] /= matrix[k][k];
-               // p = matrix[i][k]
+                       /* matrix[i][k] /= matrix[k][k]; */
+               /* p = matrix[i][k] */
                        p = *lColumnMatrix / temp;
                        *(lColumnMatrix++) = p;
                
-            for (j = /* k + 1 */ offset; j < n; ++j) {
-                               // matrix[i][j] -= matrix[i][k] * matrix[k][j];
+            for (j = /* k + 1 */ offset; j < nb_compo; ++j) {
+                               /* matrix[i][j] -= matrix[i][k] * matrix[k][j]; */
                        *(lColumnMatrix++) -= p * (*(lDestMatrix++));
                        }
-                       // come back to the k+1th element
+                       /* come back to the k+1th element */
                        lDestMatrix -= lStride;
-                       // go to kth element of the next line
+                       /* go to kth element of the next line */
                        lColumnMatrix += k;
        }
 
-               // offset is now k+2
+               /* offset is now k+2 */
                ++offset;
-               // 1 element less for stride
+               /* 1 element less for stride */
                --lStride;
-               // next line
-               lTmpMatrix+=n;
-               // next permutation element
+               /* next line */
+               lTmpMatrix+=nb_compo;
+               /* next permutation element */
                ++tmpPermutations;
        }
     return OPJ_TRUE;
@@ -203,55 +203,58 @@ void opj_lupSolve (OPJ_FLOAT32 * pResult,
                    OPJ_FLOAT32 * pMatrix, 
                    OPJ_FLOAT32 * pVector, 
                    OPJ_UINT32* pPermutations, 
-                   OPJ_UINT32 n,OPJ_FLOAT32 * p_intermediate_data) 
+                   OPJ_UINT32 nb_compo,OPJ_FLOAT32 * p_intermediate_data) 
 {
-       OPJ_UINT32 i,j;
+       OPJ_INT32 k;
+    OPJ_UINT32 i,j;
        OPJ_FLOAT32 sum;
        OPJ_FLOAT32 u;
-    OPJ_UINT32 lStride = n+1;
+    OPJ_UINT32 lStride = nb_compo+1;
        OPJ_FLOAT32 * lCurrentPtr;
        OPJ_FLOAT32 * lIntermediatePtr;
        OPJ_FLOAT32 * lDestPtr;
        OPJ_FLOAT32 * lTmpMatrix;
        OPJ_FLOAT32 * lLineMatrix = pMatrix;
-       OPJ_FLOAT32 * lBeginPtr = pResult + n - 1;
+       OPJ_FLOAT32 * lBeginPtr = pResult + nb_compo - 1;
        OPJ_FLOAT32 * lGeneratedData;
        OPJ_UINT32 * lCurrentPermutationPtr = pPermutations;
 
        
        lIntermediatePtr = p_intermediate_data;
-       lGeneratedData = p_intermediate_data + n - 1;
+       lGeneratedData = p_intermediate_data + nb_compo - 1;
        
-    for (i = 0; i < n; ++i) {
+    for (i = 0; i < nb_compo; ++i) {
                sum = 0.0;
                lCurrentPtr = p_intermediate_data;
                lTmpMatrix = lLineMatrix;
         for (j = 1; j <= i; ++j) 
                {
-                       // sum += matrix[i][j-1] * y[j-1];
+                       /* sum += matrix[i][j-1] * y[j-1]; */
                sum += (*(lTmpMatrix++)) * (*(lCurrentPtr++));
         }
-               //y[i] = pVector[pPermutations[i]] - sum;
+               /*y[i] = pVector[pPermutations[i]] - sum; */
         *(lIntermediatePtr++) = pVector[*(lCurrentPermutationPtr++)] - sum;
-               lLineMatrix += n;
+               lLineMatrix += nb_compo;
        }
 
-       // we take the last point of the matrix
-       lLineMatrix = pMatrix + n*n - 1;
+       /* we take the last point of the matrix */
+       lLineMatrix = pMatrix + nb_compo*nb_compo - 1;
+
+       /* and we take after the last point of the destination vector */
+       lDestPtr = pResult + nb_compo;
 
-       // and we take after the last point of the destination vector
-       lDestPtr = pResult + n;
 
-       for (i = n - 1; i != -1 ; --i) {
+    assert(nb_compo != 0);
+       for (k = (OPJ_INT32)nb_compo - 1; k != -1 ; --k) {
                sum = 0.0;
                lTmpMatrix = lLineMatrix;
         u = *(lTmpMatrix++);
                lCurrentPtr = lDestPtr--;
-        for (j = i + 1; j < n; ++j) {
-                       // sum += matrix[i][j] * x[j]
+        for (j = (OPJ_UINT32)(k + 1); j < nb_compo; ++j) {
+                       /* sum += matrix[k][j] * x[j] */
                sum += (*(lTmpMatrix++)) * (*(lCurrentPtr++));
                }
-               //x[i] = (y[i] - sum) / u;
+               /*x[k] = (y[k] - sum) / u; */
         *(lBeginPtr--) = (*(lGeneratedData--) - sum) / u;
                lLineMatrix -= lStride;
        }
@@ -260,7 +263,7 @@ void opj_lupSolve (OPJ_FLOAT32 * pResult,
 
 void opj_lupInvert (OPJ_FLOAT32 * pSrcMatrix,
                     OPJ_FLOAT32 * pDestMatrix,
-                    OPJ_UINT32 n,
+                    OPJ_UINT32 nb_compo,
                     OPJ_UINT32 * pPermutations,
                     OPJ_FLOAT32 * p_src_temp,
                     OPJ_FLOAT32 * p_dest_temp,
@@ -269,17 +272,17 @@ void opj_lupInvert (OPJ_FLOAT32 * pSrcMatrix,
        OPJ_UINT32 j,i;
        OPJ_FLOAT32 * lCurrentPtr;
        OPJ_FLOAT32 * lLineMatrix = pDestMatrix;
-       OPJ_UINT32 lSwapSize = n * sizeof(OPJ_FLOAT32);
+       OPJ_UINT32 lSwapSize = nb_compo * (OPJ_UINT32)sizeof(OPJ_FLOAT32);
 
-       for (j = 0; j < n; ++j) {
+       for (j = 0; j < nb_compo; ++j) {
                lCurrentPtr = lLineMatrix++;
         memset(p_src_temp,0,lSwapSize);
        p_src_temp[j] = 1.0;
-               opj_lupSolve(p_dest_temp,pSrcMatrix,p_src_temp, pPermutations, n , p_swap_area);
+               opj_lupSolve(p_dest_temp,pSrcMatrix,p_src_temp, pPermutations, nb_compo , p_swap_area);
 
-               for (i = 0; i < n; ++i) {
+               for (i = 0; i < nb_compo; ++i) {
                *(lCurrentPtr) = p_dest_temp[i];
-                       lCurrentPtr+=n;
+                       lCurrentPtr+=nb_compo;
        }
     }
 }