44 double amd_Info [
AMD_INFO], lnz, lnz1, flops, flops1 ;
45 Int k1, k2, nk, k, block, oldcol, pend, newcol, result, pc, p, newrow,
54 for (k = 0 ; k <
n ; k++)
61 for (k = 0 ; k < n ; k++)
63 ASSERT (Pbtf [k] >= 0 && Pbtf [k] < n) ;
67 for (k = 0 ; k < n ; k++)
ASSERT (Pinv [k] !=
EMPTY) ;
73 Symbolic->symmetry =
EMPTY ;
79 for (block = 0 ; block < nblocks ; block++)
89 PRINTF ((
"BLOCK %d, k1 %d k2-1 %d nk %d\n", block, k1, k2-1, nk)) ;
97 for (k = k1 ; k < k2 ; k++)
102 pend = Ap [oldcol+1] ;
103 for (p = Ap [oldcol] ; p < pend ; p++)
105 newrow = Pinv [Ai [p]] ;
120 maxnz =
MAX (maxnz, pc) ;
134 for (k = 0 ; k < nk ; k++)
138 lnz1 = nk * (nk + 1) / 2 ;
139 flops1 = nk * (nk - 1) / 2 + (nk-1)*nk*(2*nk-1) / 6 ;
143 else if (ordering == 0)
158 Common->mempeak = ( size_t) (
MAX (Common->mempeak,
171 else if (ordering == 1)
182 ok =
COLAMD (nk, nk, Cilen, Ci, Cp,
NULL, cstats) ;
187 for (k = 0 ; k < nk ; k++)
200 lnz1 = (Common->user_order) (nk, Cp, Ci, Pblk, Common) ;
216 flops = (flops ==
EMPTY || flops1 ==
EMPTY) ?
EMPTY : (flops + flops1) ;
222 PRINTF ((
"Pblk, 1-based:\n")) ;
223 for (k = 0 ; k < nk ; k++)
226 ASSERT (Pblk [k] + k1 < n) ;
227 Q [k + k1] = Qbtf [Pblk [k] + k1] ;
229 for (k = 0 ; k < nk ; k++)
232 ASSERT (Pblk [k] + k1 < n) ;
233 P [k + k1] = Pbtf [Pblk [k] + k1] ;
237 PRINTF ((
"nzoff %d Ap[n] %d\n", nzoff, Ap [n])) ;
238 ASSERT (nzoff >= 0 && nzoff <= Ap [n]) ;
241 Symbolic->lnz = lnz ;
242 Symbolic->unz = lnz ;
243 Symbolic->nzoff = nzoff ;
244 Symbolic->est_flops = flops ;
271 Int *Qbtf, *Cp, *Ci, *Pinv, *Pblk, *Pbtf, *
P, *Q, *R ;
272 Int nblocks, nz, block, maxblock, k1, k2, nk, do_btf, ordering, k, Cilen,
280 if (Symbolic ==
NULL)
287 Lnz = Symbolic->Lnz ;
290 ordering = Common->ordering ;
296 else if (ordering == 0 || (ordering == 3 && Common->user_order !=
NULL))
321 if (Common->status <
KLU_OK)
333 do_btf = Common->btf ;
335 Symbolic->ordering = ordering ;
336 Symbolic->do_btf = do_btf ;
337 Symbolic->structural_rank =
EMPTY ;
348 if (Common->status <
KLU_OK)
357 nblocks =
BTF_order (
n, Ap, Ai, Common->maxwork, &work, Pbtf, Qbtf, R,
358 &(Symbolic->structural_rank), Work) ;
359 Common->structural_rank = Symbolic->structural_rank ;
360 Common->work += work ;
365 if (Symbolic->structural_rank <
n)
367 for (k = 0 ; k <
n ; k++)
375 for (block = 0 ; block < nblocks ; block++)
380 PRINTF ((
"block %d size %d\n", block, nk)) ;
381 maxblock =
MAX (maxblock, nk) ;
391 for (k = 0 ; k <
n ; k++)
398 Symbolic->nblocks = nblocks ;
400 PRINTF ((
"maxblock size %d\n", maxblock)) ;
401 Symbolic->maxblock = maxblock ;
416 if (Common->status ==
KLU_OK)
418 PRINTF ((
"calling analyze_worker\n")) ;
420 ordering, P, Q, Lnz, Pblk, Cp, Ci, Cilen, Pinv, Symbolic, Common) ;
421 PRINTF ((
"analyze_worker done\n")) ;
439 if (Common->status <
KLU_OK)
472 Common->structural_rank =
EMPTY ;
478 if (Common->ordering == 2)
EXTERN void *(* amesos_amd_realloc)(void *, size_t)
static Int analyze_worker(Int n, Int Ap[], Int Ai[], Int nblocks, Int Pbtf[], Int Qbtf[], Int R[], Int ordering, Int P[], Int Q[], double Lnz[], Int Pblk[], Int Cp[], Int Ci[], Int Cilen, Int Pinv[], KLU_symbolic *Symbolic, KLU_common *Common)
EXTERN void(* amesos_amd_free)(void *)
#define COLAMD_recommended
#define KLU_OUT_OF_MEMORY
#define ASSERT(expression)
EXTERN void *(* amesos_amd_calloc)(size_t, size_t)
#define KLU_alloc_symbolic
#define KLU_free_symbolic
#define KLU_analyze_given
static KLU_symbolic * order_and_analyze(Int n, Int Ap[], Int Ai[], KLU_common *Common)
#define AMD_OUT_OF_MEMORY
EXTERN void *(* amesos_amd_malloc)(size_t)
KLU_symbolic * KLU_analyze(Int n, Int Ap[], Int Ai[], KLU_common *Common)