197 else if (A->
stype > 0)
240 else if (A->
stype > 0)
311 Int n, ok, do_rowcolcounts ;
319 do_rowcolcounts = (ColCount !=
NULL) ;
323 &A1, &A2, &S, &F, Common) ;
331 ok = ok && (
CHOLMOD(postorder) (Parent, n,
NULL, Post, Common) == n) ;
345 Post,
NULL, ColCount, First, Level, Common) ;
359 #define FREE_WORKSPACE_AND_RETURN \
361 Common->no_workspace_reallocate = FALSE ; \
362 CHOLMOD(free) (n, sizeof (Int), Lparent, Common) ; \
363 CHOLMOD(free) (n, sizeof (Int), Perm, Common) ; \
364 CHOLMOD(free) (n, sizeof (Int), ColCount, Common) ; \
365 if (Common->status < CHOLMOD_OK) \
367 CHOLMOD(free_factor) (&L, Common) ; \
369 ASSERT (CHOLMOD(dump_work) (TRUE, TRUE, 0, Common)) ; \
395 Int *First, *Level, *Work4n, *Cmember, *CParent, *ColCount, *Lperm, *Parent,
396 *Post, *Perm, *Lparent, *Lcolcount ;
398 Int k,
n, ordering, method, nmethods, status, default_strategy, ncol, uncol,
399 skip_analysis, skip_best ;
421 uncol = (A->
stype == 0) ? (A->
ncol) : 0 ;
427 lnz_best = (double)
EMPTY ;
430 nmethods =
MAX (0, nmethods) ;
431 PRINT1 ((
"nmethods "ID"\n", nmethods)) ;
433 default_strategy = (nmethods == 0) ;
434 if (default_strategy)
494 Work4n = Common->
Iwork ;
495 Work4n += 2*((size_t) n) + uncol ;
498 Level = Work4n + 2*((size_t) n) ;
499 Post = Work4n + 3*((size_t) n) ;
512 Lparent =
CHOLMOD(malloc) (n,
sizeof (
Int), Common) ;
513 Perm =
CHOLMOD(malloc) (n,
sizeof (
Int), Common) ;
514 ColCount =
CHOLMOD(malloc) (n,
sizeof (
Int), Common) ;
531 for (method = 0 ; method <= nmethods ; method++)
540 skip_analysis =
FALSE ;
542 if (method == nmethods)
547 PRINT1 ((
"All methods requested failed: backup to AMD\n")) ;
560 PRINT1 ((
"method "ID": Try method: "ID"\n", method, ordering)) ;
573 for (k = 0 ; k < n ; k++)
586 if (UserPerm ==
NULL)
589 PRINT1 ((
"skip, no user perm given\n")) ;
592 for (k = 0 ; k < n ; k++)
595 Perm [k] = UserPerm [k] ;
607 skip_analysis =
TRUE ;
620 skip_analysis =
TRUE ;
664 CHOLMOD(nested_dissection) (A, fset, fsize, Perm, CParent, Cmember,
679 PRINT1 ((
"No such ordering: "ID
"\n", ordering)) ;
699 Parent, Post, ColCount, First, Level, Common))
711 PRINT1 ((
"lnz %g fl %g\n", Common->
lnz, Common->
fl)) ;
721 PRINT1 ((
"this is best so far, method "ID
"\n", method)) ;
723 lnz_best = Common->
lnz ;
724 for (k = 0 ; k < n ; k++)
726 Lperm [k] = Perm [k] ;
729 skip_best = skip_analysis ;
733 for (k = 0 ; k < n ; k++)
735 Lcolcount [k] = ColCount [k] ;
739 for (k = 0 ; k < n ; k++)
741 Lparent [k] = Parent [k] ;
752 if ((Common->
fl < 500 * Common->
lnz) ||
753 (Common->
lnz < 5 * Common->
anz))
785 ERROR (status,
"all methods failed") ;
800 Lparent, Post, Lcolcount, First, Level, Common))
815 if (
CHOLMOD(postorder) (Lparent, n, Lcolcount, Post, Common) == n)
818 Int *Wi = First, *InvPost = Level ;
819 Int newchild, oldchild, newparent, oldparent ;
821 for (k = 0 ; k < n ; k++)
823 Wi [k] = Lperm [Post [k]] ;
825 for (k = 0 ; k < n ; k++)
830 for (k = 0 ; k < n ; k++)
832 Wi [k] = Lcolcount [Post [k]] ;
834 for (k = 0 ; k < n ; k++)
836 Lcolcount [k] = Wi [k] ;
838 for (k = 0 ; k < n ; k++)
840 InvPost [Post [k]] = k ;
844 for (newchild = 0 ; newchild < n ; newchild++)
846 oldchild = Post [newchild] ;
847 oldparent = Lparent [oldchild] ;
848 newparent = (oldparent ==
EMPTY) ?
EMPTY : InvPost [oldparent] ;
849 Wi [newchild] = newparent ;
851 for (k = 0 ; k < n ; k++)
853 Lparent [k] = Wi [k] ;
878 &A1, &A2, &S, &F, Common) ;
881 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
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)
size_t CHOLMOD() add_size_t(size_t a, size_t b, int *ok)
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)
int CHOLMOD() free_sparse(cholmod_sparse **AHandle, cholmod_common *Common)
cholmod_factor *CHOLMOD() analyze_p(cholmod_sparse *A, Int *UserPerm, Int *fset, size_t fsize, 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)
#define CHOLMOD_POSTORDERED
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 FREE_WORKSPACE_AND_RETURN
int CHOLMOD() allocate_work(size_t nrow, size_t iworksize, size_t xworksize, cholmod_common *Common)
#define CHOLMOD_MAXMETHODS
#define RETURN_IF_NULL(A, result)
#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() analyze(cholmod_sparse *A, cholmod_common *Common)
cholmod_factor *CHOLMOD() allocate_factor(size_t n, cholmod_common *Common)