Changeset 71 for include/fflas-ffpack/ffpack_frobenius.inl
- Timestamp:
- 08/12/08 02:59:31 (5 months ago)
- Files:
-
- 1 modified
-
include/fflas-ffpack/ffpack_frobenius.inl (modified) (21 diffs)
Legend:
- Unmodified
- Added
- Removed
-
include/fflas-ffpack/ffpack_frobenius.inl
r66 r71 1 1 /* -*- mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ 2 2 3 /* linbox/ffpack/ffpack_ charpoly_kgfast.inl4 * Copyright (C) 200 6Clement Pernet3 /* linbox/ffpack/ffpack_frobenius.inl 4 * Copyright (C) 2007 Clement Pernet 5 5 * 6 6 * Written by Clement Pernet <cpernet@uwaterloo.ca> … … 49 49 for (size_t i = 0; i < noc; ++i) 50 50 nzg.random (*(K + i*ldk +i)); 51 51 52 52 // 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){ 54 54 fgemm( F, FflasNoTrans, FflasTrans, noc, N, N, one, 55 55 K+(i-1)*noc*ldk, ldk, A, lda, zero, K+i*noc*ldk, ldk); 56 56 } 57 57 // K2 <- K (re-ordering) 58 58 size_t w_idx = 0; … … 64 64 for (size_t i=0; i<noc*c; ++i) 65 65 fcopy (F, N, (K+i*ldk), 1, K2+i*ldk, 1); 66 66 67 67 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) 70 70 Qk[i] = 0; 71 71 for (size_t i=0; i<N; ++i) 72 72 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 75 76 size_t row_idx = 0; 76 77 size_t i=0; … … 86 87 // << " degree sequence is not monotonically not increasing" 87 88 // << std::endl; 89 delete[] rp; delete[] K; 90 delete[] Pk; delete[] Qk; delete[] dA; delete[] dK; 88 91 throw CharpolyFailed(); 89 92 } … … 92 95 if (d == c) 93 96 nb_full_blocks++; 94 if (row_idx < noc*c)97 if (row_idx < N) 95 98 i = Qk[row_idx]; 96 99 } 97 100 98 101 // 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]; 99 105 size_t bk_idx = 0; 100 106 for (size_t i = 0; i < Mk; ++i){ 101 fcopy (F, N, (K 2+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); 102 108 bk_idx += c; 103 109 } 104 typename Field::Element* K2b = K2+Mk*ldk;110 delete[] K2; 105 111 106 112 // K <- K A^T 107 fgemm( F, FflasNoTrans, FflasTrans, Mk, N, N, one, K 2, ldk, A, lda, zero, K2b, ldk);113 fgemm( F, FflasNoTrans, FflasTrans, Mk, N, N, one, K3, ldk, A, lda, zero, K4, ldk); 108 114 109 115 // K <- K P^T 110 applyP (F, FflasRight, FflasTrans, Mk, 0, R, K 2b, ldk, Pk);116 applyP (F, FflasRight, FflasTrans, Mk, 0, R, K4, ldk, Pk); 111 117 112 118 // K <- K U^-1 113 ftrsm (F, FflasRight, FflasUpper, FflasNoTrans, FflasNonUnit, Mk, R, one, K, ldk, K 2b, ldk);119 ftrsm (F, FflasRight, FflasUpper, FflasNoTrans, FflasNonUnit, Mk, R, one, K, ldk, K4, ldk); 114 120 115 121 // L <- Q^T L … … 117 123 118 124 // K <- K L^-1 119 ftrsm (F, FflasRight, FflasLower, FflasNoTrans, FflasUnit, Mk, R, one, K, ldk, K 2b, ldk);125 ftrsm (F, FflasRight, FflasLower, FflasNoTrans, FflasUnit, Mk, R, one, K, ldk, K4, ldk); 120 126 121 127 //undoing permutation on L … … 126 132 size_t Ncurr = R; 127 133 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){ 129 135 if (dK[i] >= 1){ 130 136 for (size_t j = offset+1; j<R; ++j) 131 if (!F.isZero(*(K 2b+ i*ldk + j))){137 if (!F.isZero(*(K4 + i*ldk + j))){ 132 138 //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; 133 142 throw CharpolyFailed(); 134 143 } … … 136 145 F.assign(P[dK[i]], one); 137 146 for (size_t j=0; j < dK [i]; ++j) 138 F.neg (P [dK [i]-j-1], *(K 2b+ i*ldk + (offset-j)));147 F.neg (P [dK [i]-j-1], *(K4 + i*ldk + (offset-j))); 139 148 frobeniusForm.push_front(P); 140 149 offset -= dK [i]; … … 142 151 Ma--; 143 152 } 153 } 144 154 Mk = Ma; 145 155 146 156 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; 150 170 size_t Nrest = N-R; 151 171 typename Field::Element * K21 = K + R*ldk; … … 167 187 // K2_ = K2_ . P^t (= ( P A^t P^t )2_ ) 168 188 applyP( F, FflasRight, FflasTrans, Nrest, 0, R, K21, ldk, Pk); 169 189 170 190 // K21 = K21 . S1^-1 171 191 ftrsm (F, FflasRight, FflasUpper, FflasNoTrans, FflasNonUnit, Nrest, R, … … 188 208 189 209 // Recursive call on the complementary subspace 190 Char polyArithProg (F, polyList, Nrest, Arec, ldarec,c);210 CharPoly(F, polyList, Nrest, Arec, ldarec); 191 211 delete[] Arec; 192 212 frobeniusForm.merge(polyList); … … 207 227 for (size_t i=0; i < Ncurr; ++i) 208 228 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; 210 231 211 232 size_t block_idx, it_idx, rp_val; … … 214 235 while ((nb_full_blocks >= 1) && (Mk > 1)) { 215 236 delete[] K; 216 delete[] K 2;237 delete[] K3; 217 238 K = new typename Field::Element[Ncurr*Ma]; 218 K 2= new typename Field::Element[Ncurr*Ma];239 K3 = new typename Field::Element[Ncurr*Ma]; 219 240 ldk = Ma; 220 241 … … 225 246 for (size_t i=0; i<2*Ncurr; ++i) 226 247 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 } 228 255 if (R < Ncurr){ 229 256 //std::cerr<<"FAIL R<Ncurr"<<std::endl; 257 delete[] Arp; delete[] Ac; delete[] K; delete[] K3; 258 delete[] rp; delete[] dA; delete[] dK; 230 259 throw CharpolyFailed(); 231 260 } … … 242 271 while ( /*(g<Ncurr ) &&*/ (rp[g] == rp_val) && (it_idx < deg )); 243 272 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; 244 275 throw CharpolyFailed(); 245 276 //std::cerr<<"FAIL d non decroissant"<<std::endl; … … 270 301 } 271 302 272 // Copying K 2<- K303 // Copying K3 <- K 273 304 for (size_t i=0; i<Mk; ++i) 274 fcopy (F, Ncurr, K 2+i, ldk, K+i, ldk);275 CompressRowsQK (F, Mk, K 2+ 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, 276 307 Arp, ldarp, dK+nb_full_blocks, deg, Mk-nb_full_blocks); 277 308 … … 313 344 size_t *P=new size_t[Mk]; 314 345 size_t *Q=new size_t[Mk]; 315 if (LUdivine (F, FflasNonUnit, FflasNoTrans, Mk, Mk , K 2+ (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){ 316 347 // should never happen (not a LAS VEGAS check) 317 348 //std::cerr<<"FAIL R2 < MK"<<std::endl; … … 319 350 } 320 351 ftrsm (F, FflasLeft, FflasLower, FflasNoTrans, FflasUnit, Mk, Mk, one, 321 K 2+ (Ncurr-Mk)*ldk, ldk, K+(Ncurr-Mk)*ldk, ldk);352 K3 + (Ncurr-Mk)*ldk, ldk, K+(Ncurr-Mk)*ldk, ldk); 322 353 ftrsm (F, FflasLeft, FflasUpper, FflasNoTrans, FflasNonUnit, Mk, Mk, one, 323 K 2+(Ncurr-Mk)*ldk, ldk, K+(Ncurr-Mk)*ldk, ldk);354 K3+(Ncurr-Mk)*ldk, ldk, K+(Ncurr-Mk)*ldk, ldk); 324 355 applyP (F, FflasLeft, FflasTrans, Mk, 0, Mk, K+(Ncurr-Mk)*ldk,ldk, P); 325 356 fgemm (F, FflasNoTrans, FflasNoTrans, Ncurr-Mk, Mk, Mk, mone, 326 K 2, ldk, K+(Ncurr-Mk)*ldk,ldk, one, K, ldk);357 K3, ldk, K+(Ncurr-Mk)*ldk,ldk, one, K, ldk); 327 358 delete[] P; 328 359 delete[] Q; … … 357 388 if (!F.isZero( *(K+i*ldk+j) )){ 358 389 //std::cerr<<"FAIL C != 0"<<std::endl; 390 delete[] rp; delete[] Arp; delete[] Ac; 391 delete[] K; delete[] K3; 392 delete[] dA; delete[] dK; 359 393 throw CharpolyFailed(); 360 394 } … … 362 396 363 397 // A <- K 364 delete[] Ac; 365 delete[] Arp; 398 delete[] Ac; delete[] Arp; 366 399 Ac = new typename Field::Element[Ncurr*Mk]; 367 400 ldac = Mk; … … 381 414 F.neg( Pl[j], *(K + j*ldk)); 382 415 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; 390 418 return frobeniusForm; 391 419 }
