Changeset 71

Show
Ignore:
Timestamp:
08/12/08 02:59:31 (3 months ago)
Author:
pernet
Message:

Fix a bug (see sage trac #3671).
Improve memory allocation
Fix memleaks when exceptions are thrown.

Location:
include/fflas-ffpack
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • include/fflas-ffpack/ffpack_frobenius.inl

    r66 r71  
    11/* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ 
    22 
    3 /* linbox/ffpack/ffpack_charpoly_kgfast.inl 
    4  * Copyright (C) 2006 Clement Pernet 
     3/* linbox/ffpack/ffpack_frobenius.inl 
     4 * Copyright (C) 2007 Clement Pernet 
    55 * 
    66 * Written by Clement Pernet <cpernet@uwaterloo.ca> 
     
    4949        for (size_t i = 0; i < noc; ++i) 
    5050                nzg.random (*(K + i*ldk +i)); 
    51          
     51 
    5252        // Computing the bloc Krylov matrix [U AU .. A^(c-1) U]^T 
    53         for (size_t i = 1; i<c; ++i) 
     53        for (size_t i = 1; i<c; ++i){ 
    5454                fgemm( F, FflasNoTrans, FflasTrans,  noc, N, N, one, 
    5555                       K+(i-1)*noc*ldk, ldk, A, lda, zero, K+i*noc*ldk, ldk); 
    56  
     56        } 
    5757        // K2 <- K (re-ordering) 
    5858        size_t w_idx = 0; 
     
    6464        for (size_t i=0; i<noc*c; ++i) 
    6565                fcopy (F, N, (K+i*ldk), 1, K2+i*ldk, 1); 
    66          
     66 
    6767        size_t * Pk = new size_t[N]; 
    68         size_t * Qk = new size_t[c*noc]; 
    69         for (size_t i=0; i<c*noc; ++i) 
     68        size_t * Qk = new size_t[N]; 
     69        for (size_t i=0; i<N; ++i) 
    7070                Qk[i] = 0; 
    7171        for (size_t i=0; i<N; ++i) 
    7272                Pk[i] = 0; 
    73         size_t R = LUdivine(F, FflasNonUnit, FflasNoTrans, noc*c, N, K, ldk, Pk, Qk, FfpackLQUP); 
    74  
     73         
     74        size_t R = LUdivine(F, FflasNonUnit, FflasNoTrans, N, N, K, ldk, Pk, Qk, FfpackLQUP); 
     75                         
    7576        size_t row_idx = 0; 
    7677        size_t i=0; 
     
    8687                        //           << " degree sequence is not monotonically not increasing" 
    8788                        //           << std::endl; 
     89                        delete[] rp; delete[] K; 
     90                        delete[] Pk; delete[] Qk; delete[] dA; delete[] dK; 
    8891                        throw CharpolyFailed(); 
    8992                } 
     
    9295                if (d == c) 
    9396                        nb_full_blocks++; 
    94                 if (row_idx < noc*c) 
     97                if (row_idx < N) 
    9598                        i = Qk[row_idx]; 
    9699        } 
    97100 
    98101        // Selection of the last iterate of each block 
     102 
     103        typename Field::Element * K3 = new typename Field::Element[Mk*N]; 
     104        typename Field::Element * K4 = new typename Field::Element[Mk*N]; 
    99105        size_t bk_idx = 0; 
    100106        for (size_t i = 0; i < Mk; ++i){ 
    101                 fcopy (F, N, (K2+i*ldk), 1, (K2 + (bk_idx + dK[i]-1)*ldk), 1); 
     107                fcopy (F, N, (K3+i*ldk), 1, (K2 + (bk_idx + dK[i]-1)*ldk), 1); 
    102108                bk_idx += c; 
    103109        } 
    104         typename Field::Element* K2b = K2+Mk*ldk; 
     110        delete[] K2; 
    105111 
    106112        // K <- K A^T  
    107         fgemm( F, FflasNoTrans, FflasTrans, Mk, N, N, one,  K2, ldk, A, lda, zero, K2b, ldk); 
     113        fgemm( F, FflasNoTrans, FflasTrans, Mk, N, N, one,  K3, ldk, A, lda, zero, K4, ldk); 
    108114 
    109115        // K <- K P^T 
    110         applyP (F, FflasRight, FflasTrans, Mk, 0, R, K2b, ldk, Pk); 
     116        applyP (F, FflasRight, FflasTrans, Mk, 0, R, K4, ldk, Pk); 
    111117 
    112118        // K <- K U^-1 
    113         ftrsm (F, FflasRight, FflasUpper, FflasNoTrans, FflasNonUnit, Mk, R, one, K, ldk, K2b, ldk); 
     119        ftrsm (F, FflasRight, FflasUpper, FflasNoTrans, FflasNonUnit, Mk, R, one, K, ldk, K4, ldk); 
    114120 
    115121        // L <-  Q^T L 
     
    117123 
    118124        // K <- K L^-1 
    119         ftrsm (F, FflasRight, FflasLower, FflasNoTrans, FflasUnit, Mk, R, one, K, ldk, K2b, ldk); 
     125        ftrsm (F, FflasRight, FflasLower, FflasNoTrans, FflasUnit, Mk, R, one, K, ldk, K4, ldk); 
    120126 
    121127        //undoing permutation on L 
     
    126132        size_t Ncurr = R; 
    127133        size_t offset = Ncurr-1; 
    128         for (size_t i=Mk-1; i>=nb_full_blocks+1;  --i) 
     134        for (size_t i=Mk-1; i>=nb_full_blocks+1;  --i){ 
    129135                if (dK[i] >= 1){  
    130136                        for (size_t j = offset+1; j<R; ++j) 
    131                                 if (!F.isZero(*(K2b + i*ldk + j))){ 
     137                                if (!F.isZero(*(K4 + i*ldk + j))){ 
    132138                                        //std::cerr<<"FAIL C != 0 in preconditionning"<<std::endl; 
     139                                        delete[] K3; delete[] K4; delete[] K; 
     140                                        delete[] Pk; delete[] Qk; delete[] rp; 
     141                                        delete[] dA; delete[] dK; 
    133142                                        throw CharpolyFailed(); 
    134143                                } 
     
    136145                        F.assign(P[dK[i]], one); 
    137146                        for (size_t j=0; j < dK [i]; ++j) 
    138                                 F.neg (P [dK [i]-j-1], *(K2b + i*ldk + (offset-j))); 
     147                                F.neg (P [dK [i]-j-1], *(K4 + i*ldk + (offset-j))); 
    139148                        frobeniusForm.push_front(P); 
    140149                        offset -= dK [i]; 
     
    142151                        Ma--; 
    143152                } 
     153        } 
    144154        Mk = Ma; 
    145155 
    146156        if (R<N){ 
    147 //              std::cerr<<"Preconditionning failed; missing rank = "<<N-R 
    148 //                       <<" completing the Krylov matrix" 
    149 //                       <<std::endl; 
     157                for (size_t i=0; i<nb_full_blocks + 1; ++i) 
     158                        for (size_t j=R; j<N; ++j){ 
     159                                if (!F.isZero( *(K4+i*ldk+j) )){ 
     160                                        delete[] K3; delete[] K4; delete[] K; 
     161                                        delete[] Pk; delete[] Qk; delete[] rp; 
     162                                        delete[] dA; delete[] dK; 
     163                                        throw CharpolyFailed(); 
     164                                } 
     165                        } 
     166                 
     167                //std::cerr<<"Preconditionning failed; missing rank = "<<N-R 
     168                //       <<" completing the Krylov matrix" 
     169                //       <<std::endl; 
    150170                size_t Nrest = N-R; 
    151171                typename Field::Element * K21 = K + R*ldk; 
     
    167187                // K2_ = K2_ . P^t (=  ( P A^t P^t )2_ )  
    168188                applyP( F, FflasRight, FflasTrans, Nrest, 0, R, K21, ldk, Pk); 
    169                  
     189 
    170190                // K21 = K21 . S1^-1 
    171191                ftrsm (F, FflasRight, FflasUpper, FflasNoTrans, FflasNonUnit, Nrest, R, 
     
    188208 
    189209                // Recursive call on the complementary subspace 
    190                 CharpolyArithProg (F, polyList, Nrest, Arec, ldarec, c); 
     210                CharPoly(F, polyList, Nrest, Arec, ldarec); 
    191211                delete[] Arec; 
    192212                frobeniusForm.merge(polyList); 
     
    207227        for (size_t i=0; i < Ncurr; ++i) 
    208228                for (size_t j=0; j<Ma; ++j) 
    209                         *(K+i*ldk+j) = *(Ac + i*Ma +j) = *(K2b + i + (j)*ldk); 
     229                        *(K+i*ldk+j) = *(Ac + i*Ma +j) = *(K4 + i + (j)*ldk); 
     230        delete[] K4; 
    210231 
    211232        size_t block_idx, it_idx, rp_val; 
     
    214235        while ((nb_full_blocks >= 1) && (Mk > 1)) { 
    215236                delete[] K; 
    216                 delete[] K2; 
     237                delete[] K3; 
    217238                K = new typename Field::Element[Ncurr*Ma]; 
    218                 K2 = new typename Field::Element[Ncurr*Ma]; 
     239                K3 = new typename Field::Element[Ncurr*Ma]; 
    219240                ldk = Ma; 
    220241  
     
    225246                for (size_t i=0; i<2*Ncurr; ++i) 
    226247                        rp[i] = 0; 
    227                 size_t R = SpecRankProfile (F, Ma, Ncurr, Arp, ldarp, deg-1, rp); 
     248                try{ 
     249                        size_t R = SpecRankProfile (F, Ma, Ncurr, Arp, ldarp, deg-1, rp); 
     250                } catch (CharpolyFailed){ 
     251                        delete[] Arp; delete[] Ac; delete[] K; delete[] K3; 
     252                        delete[] rp; delete[] dA; delete[] dK; 
     253                        throw CharpolyFailed(); 
     254                } 
    228255                if (R < Ncurr){ 
    229256                        //std::cerr<<"FAIL R<Ncurr"<<std::endl; 
     257                        delete[] Arp; delete[] Ac; delete[] K; delete[] K3; 
     258                        delete[] rp; delete[] dA; delete[] dK; 
    230259                        throw CharpolyFailed(); 
    231260                } 
     
    242271                        while ( /*(g<Ncurr ) &&*/ (rp[g] == rp_val) && (it_idx < deg )); 
    243272                        if ((block_idx)&&(it_idx > dK[block_idx-1])){ 
     273                                delete[] Arp; delete[] Ac;delete[] K; delete[] K3; 
     274                                delete[] rp; delete[] dA; delete[] dK; 
    244275                                throw CharpolyFailed(); 
    245276                                //std::cerr<<"FAIL d non decroissant"<<std::endl; 
     
    270301                } 
    271302 
    272                 // Copying K2 <- K 
     303                // Copying K3 <- K 
    273304                for (size_t i=0; i<Mk; ++i) 
    274                         fcopy (F, Ncurr, K2+i, ldk, K+i, ldk); 
    275                 CompressRowsQK (F, Mk, K2 + nb_full_blocks*(deg-1)*ldk, ldk, 
     305                        fcopy (F, Ncurr, K3+i, ldk, K+i, ldk); 
     306                CompressRowsQK (F, Mk, K3 + nb_full_blocks*(deg-1)*ldk, ldk, 
    276307                                Arp, ldarp, dK+nb_full_blocks, deg, Mk-nb_full_blocks); 
    277308 
     
    313344                size_t *P=new size_t[Mk]; 
    314345                size_t *Q=new size_t[Mk]; 
    315                 if (LUdivine (F, FflasNonUnit, FflasNoTrans, Mk, Mk , K2 + (Ncurr-Mk)*ldk, ldk, P, Q, FfpackLQUP) < Mk){ 
     346                if (LUdivine (F, FflasNonUnit, FflasNoTrans, Mk, Mk , K3 + (Ncurr-Mk)*ldk, ldk, P, Q, FfpackLQUP) < Mk){ 
    316347                        // should never happen (not a LAS VEGAS check) 
    317348                        //std::cerr<<"FAIL R2 < MK"<<std::endl; 
     
    319350                } 
    320351                ftrsm (F, FflasLeft, FflasLower, FflasNoTrans, FflasUnit, Mk, Mk, one, 
    321                        K2 + (Ncurr-Mk)*ldk, ldk, K+(Ncurr-Mk)*ldk, ldk); 
     352                       K3 + (Ncurr-Mk)*ldk, ldk, K+(Ncurr-Mk)*ldk, ldk); 
    322353                ftrsm (F, FflasLeft, FflasUpper, FflasNoTrans, FflasNonUnit, Mk, Mk, one, 
    323                        K2+(Ncurr-Mk)*ldk, ldk, K+(Ncurr-Mk)*ldk, ldk); 
     354                       K3+(Ncurr-Mk)*ldk, ldk, K+(Ncurr-Mk)*ldk, ldk); 
    324355                applyP (F, FflasLeft, FflasTrans, Mk, 0, Mk, K+(Ncurr-Mk)*ldk,ldk, P); 
    325356                fgemm (F, FflasNoTrans, FflasNoTrans, Ncurr-Mk, Mk, Mk, mone, 
    326                        K2, ldk, K+(Ncurr-Mk)*ldk,ldk, one, K, ldk); 
     357                       K3, ldk, K+(Ncurr-Mk)*ldk,ldk, one, K, ldk); 
    327358                delete[] P; 
    328359                delete[] Q; 
     
    357388                                if (!F.isZero( *(K+i*ldk+j) )){ 
    358389                                        //std::cerr<<"FAIL C != 0"<<std::endl; 
     390                                        delete[] rp; delete[] Arp; delete[] Ac; 
     391                                        delete[] K; delete[] K3; 
     392                                        delete[] dA; delete[] dK; 
    359393                                        throw CharpolyFailed(); 
    360394                                } 
     
    362396                 
    363397                // A <- K 
    364                 delete[] Ac; 
    365                 delete[] Arp; 
     398                delete[] Ac; delete[] Arp; 
    366399                Ac = new typename Field::Element[Ncurr*Mk]; 
    367400                ldac = Mk; 
     
    381414                F.neg( Pl[j], *(K  + j*ldk)); 
    382415        frobeniusForm.push_front(Pl); 
    383         delete[] rp; 
    384         delete[] Arp; 
    385         delete[] Ac; 
    386         delete[] K; 
    387         delete[] K2; 
    388         delete[] dA; 
    389         delete[] dK; 
     416        delete[] rp; delete[] Arp; delete[] Ac; delete[] K; delete[] K3; 
     417        delete[] dA; delete[] dK; 
    390418        return frobeniusForm; 
    391419} 
  • include/fflas-ffpack/ffpack_krylovelim.inl

    r61 r71  
    22 
    33/* ffpack/ffpack_krylovelim.inl 
    4  * Copyright (C) 2006 Clement Pernet 
     4 * Copyright (C) 2007 Clement Pernet 
    55 * 
    66 * Written by Clement Pernet <Clement.Pernet@imag.fr> 
     
    169169                                                std::cerr<<"FAIL itere dependant intercale"<<std::endl; 
    170170#endif 
     171                                                delete[] P; 
     172                                                delete[] Q; 
     173                                                delete[] iterates; 
     174                                                delete[] inviterates; 
    171175                                                throw CharpolyFailed(); 
    172176                                        }