48 Int k1, k2, nk, k, block, oldcol, pend, newcol, result, pc, p, newrow,
57 for (k = 0 ; k < n ; k++)
64 for (k = 0 ; k < n ; k++)
66 ASSERT (Pbtf [k] >= 0 && Pbtf [k] < n) ;
70 for (k = 0 ; k < n ; k++)
ASSERT (Pinv [k] !=
EMPTY) ;
76 Symbolic->symmetry =
EMPTY ;
82 for (block = 0 ; block < nblocks ; block++)
92 PRINTF ((
"BLOCK %d, k1 %d k2-1 %d nk %d\n", block, k1, k2-1, nk)) ;
100 for (k = k1 ; k < k2 ; k++)
105 pend = Ap [oldcol+1] ;
106 for (p = Ap [oldcol] ; p < pend ; p++)
108 newrow = Pinv [Ai [p]] ;
123 maxnz =
MAX (maxnz, pc) ;
137 for (k = 0 ; k < nk ; k++)
141 lnz1 = nk * (nk + 1) / 2 ;
142 flops1 = nk * (nk - 1) / 2 + (nk-1)*nk*(2*nk-1) / 6 ;
161 Common->mempeak =
MAX (Common->mempeak,
185 ok =
COLAMD (nk, nk, Cilen, Ci, Cp,
NULL, cstats) ;
190 for (k = 0 ; k < nk ; k++)
203 lnz1 = (Common->user_order) (nk, Cp, Ci, Pblk, Common) ;
225 PRINTF ((
"Pblk, 1-based:\n")) ;
226 for (k = 0 ; k < nk ; k++)
229 ASSERT (Pblk [k] + k1 < n) ;
230 Q [k + k1] = Qbtf [Pblk [k] + k1] ;
232 for (k = 0 ; k < nk ; k++)
235 ASSERT (Pblk [k] + k1 < n) ;
236 P [k + k1] = Pbtf [Pblk [k] + k1] ;
240 PRINTF ((
"nzoff %d Ap[n] %d\n", nzoff, Ap [n])) ;
241 ASSERT (nzoff >= 0 && nzoff <= Ap [n]) ;
244 Symbolic->lnz = lnz ;
245 Symbolic->unz = lnz ;
246 Symbolic->nzoff = nzoff ;
247 Symbolic->est_flops =
flops ;
274 Int *Qbtf, *Cp, *Ci, *Pinv, *Pblk, *Pbtf, *
P, *Q, *R ;
275 Int nblocks, nz, block, maxblock, k1, k2, nk, do_btf,
ordering, k, Cilen,
283 if (Symbolic ==
NULL)
290 Lnz = Symbolic->Lnz ;
324 if (Common->status <
KLU_OK)
336 do_btf = Common->btf ;
339 Symbolic->do_btf = do_btf ;
340 Symbolic->structural_rank =
EMPTY ;
351 if (Common->status <
KLU_OK)
360 nblocks =
BTF_order (n, Ap, Ai, Common->maxwork, &
work, Pbtf, Qbtf, R,
361 &(Symbolic->structural_rank), Work) ;
362 Common->structural_rank = Symbolic->structural_rank ;
363 Common->work +=
work ;
368 if (Symbolic->structural_rank < n)
370 for (k = 0 ; k < n ; k++)
378 for (block = 0 ; block < nblocks ; block++)
383 PRINTF ((
"block %d size %d\n", block, nk)) ;
384 maxblock =
MAX (maxblock, nk) ;
394 for (k = 0 ; k < n ; k++)
401 Symbolic->nblocks = nblocks ;
403 PRINTF ((
"maxblock size %d\n", maxblock)) ;
404 Symbolic->maxblock = maxblock ;
419 if (Common->status ==
KLU_OK)
421 PRINTF ((
"calling analyze_worker\n")) ;
422 Common->status =
analyze_worker (n, Ap, Ai, nblocks, Pbtf, Qbtf, R,
423 ordering,
P, Q, Lnz, Pblk, Cp, Ci, Cilen, Pinv, Symbolic, Common) ;
424 PRINTF ((
"analyze_worker done\n")) ;
442 if (Common->status <
KLU_OK)
475 Common->structural_rank =
EMPTY ;
481 if (Common->ordering == 2)
EXTERN void(* amesos_amd_free)(void *)
EXTERN void *(* amesos_amd_realloc)(void *, size_t)
EXTERN void *(* amesos_amd_malloc)(size_t)
#define COLAMD_recommended
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)
#define KLU_OUT_OF_MEMORY
#define ASSERT(expression)
#define KLU_alloc_symbolic
static KLU_symbolic * order_and_analyze(Int n, Int Ap [], Int Ai [], KLU_common *Common)
KLU_symbolic * KLU_analyze(Int n, Int Ap [], Int Ai [], KLU_common *Common)
#define KLU_free_symbolic
EXTERN void *(* amesos_amd_calloc)(size_t, size_t)
#define KLU_analyze_given
#define AMD_OUT_OF_MEMORY