194 else if (A->
stype > 0)
237 else if (A->
stype > 0)
308 Int n, ok, do_rowcolcounts ;
316 do_rowcolcounts = (ColCount !=
NULL) ;
320 &A1, &A2, &S, &F, Common) ;
328 ok = ok && (
CHOLMOD(postorder) (Parent, n,
NULL, Post, Common) == n) ;
342 Post,
NULL, ColCount, First, Level, Common) ;
356 #define FREE_WORKSPACE_AND_RETURN \
358 Common->no_workspace_reallocate = FALSE ; \
359 CHOLMOD(free) (n, sizeof (Int), Lparent, Common) ; \
360 CHOLMOD(free) (n, sizeof (Int), Perm, Common) ; \
361 CHOLMOD(free) (n, sizeof (Int), ColCount, Common) ; \
362 if (Common->status < CHOLMOD_OK) \
364 CHOLMOD(free_factor) (&L, Common) ; \
366 ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ; \
392 Int *First, *Level, *Work4n, *Cmember, *CParent, *ColCount, *Lperm, *Parent,
393 *Post, *Perm, *Lparent, *Lcolcount ;
395 Int k,
n, ordering, method, nmethods, status, default_strategy, ncol, uncol,
396 skip_analysis, skip_best ;
418 uncol = (A->
stype == 0) ? (A->
ncol) : 0 ;
424 lnz_best = (double)
EMPTY ;
427 nmethods =
MAX (0, nmethods) ;
428 PRINT1 ((
"nmethods "ID"\n", nmethods)) ;
430 default_strategy = (nmethods == 0) ;
431 if (default_strategy)
491 Work4n = Common->
Iwork ;
492 Work4n += 2*((size_t) n) + uncol ;
495 Level = Work4n + 2*((size_t) n) ;
496 Post = Work4n + 3*((size_t) n) ;
509 Lparent =
CHOLMOD(malloc) (n,
sizeof (
Int), Common) ;
510 Perm =
CHOLMOD(malloc) (n,
sizeof (
Int), Common) ;
511 ColCount =
CHOLMOD(malloc) (n,
sizeof (
Int), Common) ;
528 for (method = 0 ; method <= nmethods ; method++)
537 skip_analysis =
FALSE ;
539 if (method == nmethods)
544 PRINT1 ((
"All methods requested failed: backup to AMD\n")) ;
557 PRINT1 ((
"method "ID": Try method: "ID"\n", method, ordering)) ;
570 for (k = 0 ; k < n ; k++)
583 if (UserPerm ==
NULL)
586 PRINT1 ((
"skip, no user perm given\n")) ;
589 for (k = 0 ; k < n ; k++)
592 Perm [k] = UserPerm [k] ;
604 skip_analysis =
TRUE ;
617 skip_analysis =
TRUE ;
661 CHOLMOD(nested_dissection) (A, fset, fsize, Perm, CParent, Cmember,
676 PRINT1 ((
"No such ordering: "ID
"\n", ordering)) ;
696 Parent, Post, ColCount, First, Level, Common))
708 PRINT1 ((
"lnz %g fl %g\n", Common->
lnz, Common->
fl)) ;
718 PRINT1 ((
"this is best so far, method "ID
"\n", method)) ;
720 lnz_best = Common->
lnz ;
721 for (k = 0 ; k < n ; k++)
723 Lperm [k] = Perm [k] ;
726 skip_best = skip_analysis ;
730 for (k = 0 ; k < n ; k++)
732 Lcolcount [k] = ColCount [k] ;
736 for (k = 0 ; k < n ; k++)
738 Lparent [k] = Parent [k] ;
749 if ((Common->
fl < 500 * Common->
lnz) ||
750 (Common->
lnz < 5 * Common->
anz))
782 ERROR (status,
"all methods failed") ;
797 Lparent, Post, Lcolcount, First, Level, Common))
812 if (
CHOLMOD(postorder) (Lparent, n, Lcolcount, Post, Common) == n)
815 Int *Wi = First, *InvPost = Level ;
816 Int newchild, oldchild, newparent, oldparent ;
818 for (k = 0 ; k < n ; k++)
820 Wi [k] = Lperm [Post [k]] ;
822 for (k = 0 ; k < n ; k++)
827 for (k = 0 ; k < n ; k++)
829 Wi [k] = Lcolcount [Post [k]] ;
831 for (k = 0 ; k < n ; k++)
833 Lcolcount [k] = Wi [k] ;
835 for (k = 0 ; k < n ; k++)
837 InvPost [Post [k]] = k ;
841 for (newchild = 0 ; newchild < n ; newchild++)
843 oldchild = Post [newchild] ;
844 oldparent = Lparent [oldchild] ;
845 newparent = (oldparent ==
EMPTY) ?
EMPTY : InvPost [oldparent] ;
846 Wi [newchild] = newparent ;
848 for (k = 0 ; k < n ; k++)
850 Lparent [k] = Wi [k] ;
875 &A1, &A2, &S, &F, Common) ;
878 CHOLMOD(super_symbolic) (S, F, Lparent, L, Common) ;
#define CHOLMOD_TOO_LARGE
int CHOLMOD() colamd(cholmod_sparse *A, Int *fset, size_t fsize, int postorder, Int *Perm, cholmod_common *Common)
#define CHOLMOD_NOT_INSTALLED
size_t CHOLMOD() add_size_t(size_t a, size_t b, int *ok)
#define FREE_WORKSPACE_AND_RETURN
int CHOLMOD() rowcolcounts(cholmod_sparse *A, Int *fset, size_t fsize, Int *Parent, Int *Post, Int *RowCount, Int *ColCount, Int *First, Int *Level, cholmod_common *Common)
int no_workspace_reallocate
#define RETURN_IF_NULL_COMMON(result)
struct cholmod_common_struct::cholmod_method_struct method[CHOLMOD_MAXMETHODS+1]
size_t CHOLMOD() mult_size_t(size_t a, size_t k, int *ok)
int CHOLMOD() dump_work(int flag, int head, UF_long wsize, cholmod_common *Common)
cholmod_sparse *CHOLMOD() ptranspose(cholmod_sparse *A, int values, Int *Perm, Int *fset, size_t fsize, cholmod_common *Common)
cholmod_factor *CHOLMOD() analyze(cholmod_sparse *A, cholmod_common *Common)
int CHOLMOD() free_sparse(cholmod_sparse **AHandle, cholmod_common *Common)
#define ASSERT(expression)
int CHOLMOD() metis(cholmod_sparse *A, Int *fset, size_t fsize, int postorder, Int *Perm, cholmod_common *Common)
int CHOLMOD() etree(cholmod_sparse *A, Int *Parent, cholmod_common *Common)
cholmod_factor *CHOLMOD() analyze_p(cholmod_sparse *A, Int *UserPerm, Int *fset, size_t fsize, cholmod_common *Common)
#define CHOLMOD_POSTORDERED
int CHOLMOD() allocate_work(size_t nrow, size_t iworksize, size_t xworksize, cholmod_common *Common)
#define CHOLMOD_MAXMETHODS
int CHOLMOD() analyze_ordering(cholmod_sparse *A, int ordering, Int *Perm, Int *fset, size_t fsize, Int *Parent, Int *Post, Int *ColCount, Int *First, Int *Level, cholmod_common *Common)
#define RETURN_IF_NULL(A, result)
static int amesos_permute_matrices(cholmod_sparse *A, Int ordering, Int *Perm, Int *fset, size_t fsize, Int do_rowcolcounts, cholmod_sparse **A1_handle, cholmod_sparse **A2_handle, cholmod_sparse **S_handle, cholmod_sparse **F_handle, cholmod_common *Common)
#define CHOLMOD_SIMPLICIAL
#define ERROR(status, msg)
int CHOLMOD() amd(cholmod_sparse *A, Int *fset, size_t fsize, Int *Perm, cholmod_common *Common)
#define RETURN_IF_XTYPE_INVALID(A, xtype1, xtype2, result)
cholmod_factor *CHOLMOD() allocate_factor(size_t n, cholmod_common *Common)