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) ;
219 flops = (flops ==
EMPTY || flops1 ==
EMPTY) ?
EMPTY : (flops + flops1) ;
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 ;
293 ordering = Common->ordering ;
299 else if (ordering == 0 || (ordering == 3 && Common->user_order !=
NULL))
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")) ;
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)
static KLU_symbolic * order_and_analyze(Int n, Int Ap[], Int Ai[], KLU_common *Common)
EXTERN void *(* amesos_amd_realloc)(void *, size_t)
EXTERN void(* amesos_amd_free)(void *)
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 COLAMD_recommended
#define KLU_OUT_OF_MEMORY
KLU_symbolic * KLU_analyze(Int n, Int Ap[], Int Ai[], KLU_common *Common)
#define ASSERT(expression)
EXTERN void *(* amesos_amd_calloc)(size_t, size_t)
#define KLU_alloc_symbolic
#define KLU_free_symbolic
#define KLU_analyze_given
#define AMD_OUT_OF_MEMORY
EXTERN void *(* amesos_amd_malloc)(size_t)