mirror of
https://github.com/gonum/gonum.git
synced 2025-10-05 15:16:59 +08:00
45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
// Copyright ©2017 The gonum Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package fd
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"gonum.org/v1/gonum/floats"
|
|
"gonum.org/v1/gonum/mat"
|
|
)
|
|
|
|
func TestLaplacian(t *testing.T) {
|
|
for cas, test := range hessianTestCases {
|
|
// Modify the test cases where the forumla is set.
|
|
settings := test.settings
|
|
if settings != nil && !settings.Formula.isZero() {
|
|
settings.Formula = Forward2nd
|
|
}
|
|
|
|
n := len(test.x)
|
|
got := Laplacian(test.h.Func, test.x, test.settings)
|
|
hess := mat.NewSymDense(n, nil)
|
|
test.h.Hess(hess, test.x)
|
|
var want float64
|
|
for i := 0; i < n; i++ {
|
|
want += hess.At(i, i)
|
|
}
|
|
if !floats.EqualWithinAbsOrRel(got, want, test.tol, test.tol) {
|
|
t.Errorf("Cas %d: Laplacian mismatch. got %v, want %v", cas, got, want)
|
|
}
|
|
|
|
// Test that concurrency works.
|
|
if settings == nil {
|
|
settings = &Settings{}
|
|
}
|
|
settings.Concurrent = true
|
|
got2 := Laplacian(test.h.Func, test.x, settings)
|
|
if !floats.EqualWithinAbsOrRel(got, got2, 1e-5, 1e-5) {
|
|
t.Errorf("Cas %d: Laplacian mismatch. got %v, want %v", cas, got2, got)
|
|
}
|
|
}
|
|
}
|