1// Copyright ©2019 The Gonum Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package gonum
6
7import "gonum.org/v1/gonum/blas"
8
9// Dpotri computes the inverse of a real symmetric positive definite matrix A
10// using its Cholesky factorization.
11//
12// On entry, a contains the triangular factor U or L from the Cholesky
13// factorization A = Uᵀ*U or A = L*Lᵀ, as computed by Dpotrf.
14// On return, a contains the upper or lower triangle of the (symmetric)
15// inverse of A, overwriting the input factor U or L.
16func (impl Implementation) Dpotri(uplo blas.Uplo, n int, a []float64, lda int) (ok bool) {
17	switch {
18	case uplo != blas.Upper && uplo != blas.Lower:
19		panic(badUplo)
20	case n < 0:
21		panic(nLT0)
22	case lda < max(1, n):
23		panic(badLdA)
24	}
25
26	// Quick return if possible.
27	if n == 0 {
28		return true
29	}
30
31	if len(a) < (n-1)*lda+n {
32		panic(shortA)
33	}
34
35	// Invert the triangular Cholesky factor U or L.
36	ok = impl.Dtrtri(uplo, blas.NonUnit, n, a, lda)
37	if !ok {
38		return false
39	}
40
41	// Form inv(U)*inv(U)ᵀ or inv(L)ᵀ*inv(L).
42	impl.Dlauum(uplo, n, a, lda)
43	return true
44}
45