mirror of
https://github.com/gonum/gonum.git
synced 2025-10-05 23:26:52 +08:00
lapack: add BalanceJob type
This commit is contained in:

committed by
Vladimír Chalupecký

parent
929014505b
commit
1ec00850c6
@@ -20,10 +20,10 @@ import (
|
|||||||
// the eigenvectors of the original matrix.
|
// the eigenvectors of the original matrix.
|
||||||
//
|
//
|
||||||
// Dgebak is an internal routine. It is exported for testing purposes.
|
// Dgebak is an internal routine. It is exported for testing purposes.
|
||||||
func (impl Implementation) Dgebak(job lapack.Job, side lapack.EVSide, n, ilo, ihi int, scale []float64, m int, v []float64, ldv int) {
|
func (impl Implementation) Dgebak(job lapack.BalanceJob, side lapack.EVSide, n, ilo, ihi int, scale []float64, m int, v []float64, ldv int) {
|
||||||
switch job {
|
switch job {
|
||||||
default:
|
default:
|
||||||
panic(badJob)
|
panic(badBalanceJob)
|
||||||
case lapack.None, lapack.Permute, lapack.Scale, lapack.PermuteScale:
|
case lapack.None, lapack.Permute, lapack.Scale, lapack.PermuteScale:
|
||||||
}
|
}
|
||||||
switch side {
|
switch side {
|
||||||
|
@@ -54,10 +54,10 @@ import (
|
|||||||
// scale must have length equal to n, otherwise Dgebal will panic.
|
// scale must have length equal to n, otherwise Dgebal will panic.
|
||||||
//
|
//
|
||||||
// Dgebal is an internal routine. It is exported for testing purposes.
|
// Dgebal is an internal routine. It is exported for testing purposes.
|
||||||
func (impl Implementation) Dgebal(job lapack.Job, n int, a []float64, lda int, scale []float64) (ilo, ihi int) {
|
func (impl Implementation) Dgebal(job lapack.BalanceJob, n int, a []float64, lda int, scale []float64) (ilo, ihi int) {
|
||||||
switch job {
|
switch job {
|
||||||
default:
|
default:
|
||||||
panic(badJob)
|
panic(badBalanceJob)
|
||||||
case lapack.None, lapack.Permute, lapack.Scale, lapack.PermuteScale:
|
case lapack.None, lapack.Permute, lapack.Scale, lapack.PermuteScale:
|
||||||
}
|
}
|
||||||
checkMatrix(n, n, a, lda)
|
checkMatrix(n, n, a, lda)
|
||||||
|
@@ -35,7 +35,7 @@ const (
|
|||||||
badIlo = "lapack: ilo out of range"
|
badIlo = "lapack: ilo out of range"
|
||||||
badIhi = "lapack: ihi out of range"
|
badIhi = "lapack: ihi out of range"
|
||||||
badIpiv = "lapack: bad permutation length"
|
badIpiv = "lapack: bad permutation length"
|
||||||
badJob = "lapack: bad Job"
|
badBalanceJob = "lapack: bad BalanceJob"
|
||||||
badK1 = "lapack: k1 out of range"
|
badK1 = "lapack: k1 out of range"
|
||||||
badK2 = "lapack: k2 out of range"
|
badK2 = "lapack: k2 out of range"
|
||||||
badKperm = "lapack: incorrect permutation length"
|
badKperm = "lapack: incorrect permutation length"
|
||||||
|
@@ -155,11 +155,13 @@ const (
|
|||||||
ComputeRightEV RightEVJob = 'V' // Compute right eigenvectors.
|
ComputeRightEV RightEVJob = 'V' // Compute right eigenvectors.
|
||||||
)
|
)
|
||||||
|
|
||||||
// Jobs for Dgebal.
|
// BalanceJob specifies matrix balancing operation.
|
||||||
|
type BalanceJob byte
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Permute Job = 'P'
|
Permute BalanceJob = 'P'
|
||||||
Scale Job = 'S'
|
Scale BalanceJob = 'S'
|
||||||
PermuteScale Job = 'B'
|
PermuteScale BalanceJob = 'B'
|
||||||
)
|
)
|
||||||
|
|
||||||
// Job constants for Dhseqr.
|
// Job constants for Dhseqr.
|
||||||
|
@@ -16,13 +16,13 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Dgebaker interface {
|
type Dgebaker interface {
|
||||||
Dgebak(job lapack.Job, side lapack.EVSide, n, ilo, ihi int, scale []float64, m int, v []float64, ldv int)
|
Dgebak(job lapack.BalanceJob, side lapack.EVSide, n, ilo, ihi int, scale []float64, m int, v []float64, ldv int)
|
||||||
}
|
}
|
||||||
|
|
||||||
func DgebakTest(t *testing.T, impl Dgebaker) {
|
func DgebakTest(t *testing.T, impl Dgebaker) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewSource(1))
|
||||||
|
|
||||||
for _, job := range []lapack.Job{lapack.None, lapack.Permute, lapack.Scale, lapack.PermuteScale} {
|
for _, job := range []lapack.BalanceJob{lapack.None, lapack.Permute, lapack.Scale, lapack.PermuteScale} {
|
||||||
for _, side := range []lapack.EVSide{lapack.LeftEV, lapack.RightEV} {
|
for _, side := range []lapack.EVSide{lapack.LeftEV, lapack.RightEV} {
|
||||||
for _, n := range []int{0, 1, 2, 3, 4, 5, 6, 10, 18, 31, 53} {
|
for _, n := range []int{0, 1, 2, 3, 4, 5, 6, 10, 18, 31, 53} {
|
||||||
for _, extra := range []int{0, 11} {
|
for _, extra := range []int{0, 11} {
|
||||||
@@ -44,7 +44,7 @@ func DgebakTest(t *testing.T, impl Dgebaker) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func testDgebak(t *testing.T, impl Dgebaker, job lapack.Job, side lapack.EVSide, ilo, ihi int, v blas64.General, rnd *rand.Rand) {
|
func testDgebak(t *testing.T, impl Dgebaker, job lapack.BalanceJob, side lapack.EVSide, ilo, ihi int, v blas64.General, rnd *rand.Rand) {
|
||||||
const tol = 1e-15
|
const tol = 1e-15
|
||||||
n := v.Rows
|
n := v.Rows
|
||||||
m := v.Cols
|
m := v.Cols
|
||||||
|
@@ -16,13 +16,13 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Dgebaler interface {
|
type Dgebaler interface {
|
||||||
Dgebal(job lapack.Job, n int, a []float64, lda int, scale []float64) (int, int)
|
Dgebal(job lapack.BalanceJob, n int, a []float64, lda int, scale []float64) (int, int)
|
||||||
}
|
}
|
||||||
|
|
||||||
func DgebalTest(t *testing.T, impl Dgebaler) {
|
func DgebalTest(t *testing.T, impl Dgebaler) {
|
||||||
rnd := rand.New(rand.NewSource(1))
|
rnd := rand.New(rand.NewSource(1))
|
||||||
|
|
||||||
for _, job := range []lapack.Job{lapack.None, lapack.Permute, lapack.Scale, lapack.PermuteScale} {
|
for _, job := range []lapack.BalanceJob{lapack.None, lapack.Permute, lapack.Scale, lapack.PermuteScale} {
|
||||||
for _, n := range []int{0, 1, 2, 3, 4, 5, 6, 10, 18, 31, 53, 100} {
|
for _, n := range []int{0, 1, 2, 3, 4, 5, 6, 10, 18, 31, 53, 100} {
|
||||||
for _, extra := range []int{0, 11} {
|
for _, extra := range []int{0, 11} {
|
||||||
for cas := 0; cas < 100; cas++ {
|
for cas := 0; cas < 100; cas++ {
|
||||||
@@ -34,7 +34,7 @@ func DgebalTest(t *testing.T, impl Dgebaler) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func testDgebal(t *testing.T, impl Dgebaler, job lapack.Job, a blas64.General) {
|
func testDgebal(t *testing.T, impl Dgebaler, job lapack.BalanceJob, a blas64.General) {
|
||||||
const tol = 1e-14
|
const tol = 1e-14
|
||||||
|
|
||||||
n := a.Rows
|
n := a.Rows
|
||||||
|
Reference in New Issue
Block a user