function [LU_or_x,info,c] = klu (A,operation,b,opts)                        %#ok
%KLU sparse left-looking LU factorization, using a block triangular form.
%
%   Example:
%   LU = klu (A)            factorizes R\A(p,q) into L*U+F, returning a struct
%   x = klu (A,'\',b)       x = A\b, using KLU
%   x = klu (b,'/',A)       x = b/A, using KLU
%   x = klu (LU,'\',b)      x = A\b, where LU = klu(A)
%   x = klu (b,'/',LU)      x = b/A, where LU = klu(A)
%
%   KLU(A) factorizes a square sparse matrix, L*U+F = R\A(p,q), where L and U
%   are the factors of the diagonal blocks of the block, F are the entries
%   above the diagonal blocks.  r corresponds to the 3rd output of dmperm; it
%   specifies where the block boundaries are.  The kth block consists of
%   rows/columns r(k) to r(k+1)-1 of A(p,q).
%
%   Note that the use of the scale factor R differs between KLU and UMFPACK
%   (and the LU function, which is based on UMFPACK).  In LU, the factorization
%   is L*U = P*(R1\A)*Q; in KLU it is L*U+F = R2\(P*A*Q).  R1 and R2 are related
%   via R2 = P*R1*P', or equivalently R2 = R1(p,p).
%
%   The LU output is a struct containing members L, U, p, q, R, F, and r.
%
%   opts is an optional input struct which appears as the last input argument.
%   Entries not present are set to their defaults:
%
%                       default
%       opts.tol        0.001   partial pivoting tolerance; valid range 0 to 1.
%       opts.btf        1       use block triangular form (BTF) if nonzero
%       opts.ordering   0       how each block is ordered:
%                               0: AMD, 1: COLAMD, 2: natural,
%                               3: METIS ordering of (A'*A), via CHOLMOD
%                               4: METIS ordering of (A+A'), via CHOLMOD
%       opts.scale      2       1: R = diag(sum(abs(A)')), row-sum
%                               2: R = diag(max(abs(A)')), max in each row
%                               otherwise: none (R=I)
%       opts.maxwork    0       if > 0, limit work in BTF ordering to
%                               opts.maxwork*nnz(A); no limit if <= 0.
%
%       The CHOLMOD ordering is to try AMD (for A+A') or COLAMD (for A'*A)
%       first.  If the fill-in with AMD or COLAMD is high, METIS is tried (on
%       A+A' or A'*A), and the best ordering found is selected.  CHOLMOD, METIS,
%       CAMD, and CCOLAMD are required.  If not available, only ordering options
%       0, 1, and 2 may be used (AMD and COLAMD are always required by KLU).
%
%   Two optional outputs, [LU,info,c] = klu (A) or [x,info,c] = klu (A,'\',b)
%   provide statistics about the factorization:
%
%       info.noffdiag   number of off-diagonal pivots chosen (after preordering)
%       info.nrealloc   number of memory reallocations of L and U
%       info.rcond      a very cheap estimate of 1/(condition number)
%       info.rgrowth    reciprocal pivot growth
%       info.flops      flop count
%       info.nblocks    # of blocks in BTF form (1 if not computed)
%       info.ordering   AMD, COLAMD, natural, cholmod(AA'), cholmod(A+A')
%       info.scale      scaling (<=0: none, 1: sum, 2: max)
%       info.lnz        nnz(L), including diagonal
%       info.unz        nnz(U), including diagonal
%       info.offnz      nnz(F)
%       info.tol        pivot tolerance used
%       info.memory     peak memory usage in bytes
%       c               the same as MATLAB's condest
%
%   info and c are relevant only if the matrix is factorized (LU = klu (A),
%   x = klu (A,'/',b), or x = klu (b,'/',A) usages).
%
%   See also BTF, LU, DMPERM, CONDEST, CHOLMOD, AMD, COLAMD, CAMD, CCOLAMD.

% KLU, Copyright (c) 2004-2022, University of Florida.  All Rights Reserved.
% Authors: Timothy A. Davis and Ekanathan Palamadai.
% SPDX-License-Identifier: LGPL-2.1+

error ('klu mexFunction not found') ;
