Lines Matching refs:lu

24 	lu    *Dense  member
31 func (lu *LU) updateCond(anorm float64, norm lapack.MatrixNorm) {
32 n := lu.lu.mat.Cols
45 u := lu.lu.asTriDense(n, blas.NonUnit, blas.Upper)
46 l := lu.lu.asTriDense(n, blas.Unit, blas.Lower)
51 v := lapack64.Gecon(norm, lu.lu.mat, anorm, work, iwork)
52 lu.cond = 1 / v
62 func (lu *LU) Factorize(a Matrix) {
63 lu.factorize(a, CondNorm)
66 func (lu *LU) factorize(a Matrix, norm lapack.MatrixNorm) {
71 if lu.lu == nil {
72 lu.lu = NewDense(r, r, nil)
74 lu.lu.Reset()
75 lu.lu.reuseAsNonZeroed(r, r)
77 lu.lu.Copy(a)
78 if cap(lu.pivot) < r {
79 lu.pivot = make([]int, r)
81 lu.pivot = lu.pivot[:r]
83 anorm := lapack64.Lange(norm, lu.lu.mat, work)
85 lapack64.Getrf(lu.lu.mat, lu.pivot)
86 lu.updateCond(anorm, norm)
90 func (lu *LU) isValid() bool {
91 return lu.lu != nil && !lu.lu.IsEmpty()
96 func (lu *LU) Cond() float64 {
97 if !lu.isValid() {
100 return lu.cond
105 func (lu *LU) Reset() {
106 if lu.lu != nil {
107 lu.lu.Reset()
109 lu.pivot = lu.pivot[:0]
112 func (lu *LU) isZero() bool {
113 return len(lu.pivot) == 0
119 func (lu *LU) Det() float64 {
120 det, sign := lu.LogDet()
128 func (lu *LU) LogDet() (det float64, sign float64) {
129 if !lu.isValid() {
133 _, n := lu.lu.Dims()
138 v := lu.lu.at(i, i)
142 if lu.pivot[i] != i {
155 func (lu *LU) Pivot(swaps []int) []int {
156 if !lu.isValid() {
160 _, n := lu.lu.Dims()
173 v := lu.pivot[i]
184 func (lu *LU) RankOne(orig *LU, alpha float64, x, y Vector) {
192 _, n := orig.lu.Dims()
199 if orig != lu {
200 if lu.isZero() {
201 if cap(lu.pivot) < n {
202 lu.pivot = make([]int, n)
204 lu.pivot = lu.pivot[:n]
205 if lu.lu == nil {
206 lu.lu = NewDense(n, n, nil)
208 lu.lu.reuseAsNonZeroed(n, n)
210 } else if len(lu.pivot) != n {
213 copy(lu.pivot, orig.pivot)
214 lu.lu.Copy(orig.lu)
227 for i, v := range lu.pivot {
231 lum := lu.lu.mat
249 lu.updateCond(-1, CondNorm)
258 func (lu *LU) LTo(dst *TriDense) *TriDense {
259 if !lu.isValid() {
263 _, n := lu.lu.Dims()
278 dst.mat.Data[i*dst.mat.Stride+j] = lu.lu.mat.Data[i*lu.lu.mat.Stride+j]
294 func (lu *LU) UTo(dst *TriDense) {
295 if !lu.isValid() {
299 _, n := lu.lu.Dims()
314 dst.mat.Data[i*dst.mat.Stride+j] = lu.lu.mat.Data[i*lu.lu.mat.Stride+j]
345 func (lu *LU) SolveTo(dst *Dense, trans bool, b Matrix) error {
346 if !lu.isValid() {
350 _, n := lu.lu.Dims()
357 if lu.Det() == 0 {
376 lapack64.Getrs(t, lu.lu.mat, dst.mat, lu.pivot)
377 if lu.cond > ConditionTolerance {
378 return Condition(lu.cond)
393 func (lu *LU) SolveVecTo(dst *VecDense, trans bool, b Vector) error {
394 if !lu.isValid() {
398 _, n := lu.lu.Dims()
405 return lu.SolveTo(dst.asDense(), trans, b)
412 if lu.Det() == 0 {
433 lapack64.Getrs(t, lu.lu.mat, vMat, lu.pivot)
434 if lu.cond > ConditionTolerance {
435 return Condition(lu.cond)