OSDN Git Service

fix commands
[bytom/shuttle.git] / vendor / github.com / bytom / vendor / gonum.org / v1 / gonum / blas / testblas / benchautogen / autogen_bench_level1double.go
diff --git a/vendor/github.com/bytom/vendor/gonum.org/v1/gonum/blas/testblas/benchautogen/autogen_bench_level1double.go b/vendor/github.com/bytom/vendor/gonum.org/v1/gonum/blas/testblas/benchautogen/autogen_bench_level1double.go
new file mode 100644 (file)
index 0000000..4f9e9e6
--- /dev/null
@@ -0,0 +1,292 @@
+// Copyright 2014 The Gonum Authors. All rights reserved.
+// Use of this code is governed by a BSD-style
+// license that can be found in the LICENSE file
+
+// Script for automatic code generation of the benchmark routines.
+package main
+
+import (
+       "fmt"
+       "os"
+       "os/exec"
+       "path"
+       "path/filepath"
+       "strconv"
+)
+
+var gopath string
+
+var copyrightnotice = []byte(`// Copyright 2014 The Gonum Authors. All rights reserved.
+// Use of this code is governed by a BSD-style
+// license that can be found in the LICENSE file`)
+
+var autogen = []byte("// Code generated by \"go run gonum.org/v1/gonum/blas/testblas/benchautogen/autogen_bench_level1double.go\"; DO NOT EDIT.\n")
+
+var imports = []byte(`import(
+       "golang.org/x/exp/rand"
+       "testing"
+
+       "gonum.org/v1/gonum/blas"
+)`)
+
+var randomSliceFunction = []byte(`func randomSlice(l, idx int) ([]float64) {
+       if idx < 0{
+               idx = -idx
+       }
+       s := make([]float64, l * idx)
+       for i := range s {
+               s[i] = rand.Float64()
+       }
+       return s
+}`)
+
+const (
+       posInc1 = 5
+       posInc2 = 3
+       negInc1 = -3
+       negInc2 = -4
+)
+
+var level1Sizes = []struct {
+       lower string
+       upper string
+       camel string
+       size  int
+}{
+       {
+               lower: "small",
+               upper: "SMALL_SLICE",
+               camel: "Small",
+               size:  10,
+       },
+       {
+               lower: "medium",
+               upper: "MEDIUM_SLICE",
+               camel: "Medium",
+               size:  1000,
+       },
+       {
+               lower: "large",
+               upper: "LARGE_SLICE",
+               camel: "Large",
+               size:  100000,
+       },
+       {
+               lower: "huge",
+               upper: "HUGE_SLICE",
+               camel: "Huge",
+               size:  10000000,
+       },
+}
+
+type level1functionStruct struct {
+       camel      string
+       sig        string
+       call       string
+       extraSetup string
+       oneInput   bool
+       extraName  string // if have a couple different cases for the same function
+}
+
+var level1Functions = []level1functionStruct{
+       {
+               camel:    "Ddot",
+               sig:      "n int, x []float64, incX int, y []float64, incY int",
+               call:     "n, x, incX, y, incY",
+               oneInput: false,
+       },
+       {
+               camel:    "Dnrm2",
+               sig:      "n int, x []float64, incX int",
+               call:     "n, x, incX",
+               oneInput: true,
+       },
+       {
+               camel:    "Dasum",
+               sig:      "n int, x []float64, incX int",
+               call:     "n, x, incX",
+               oneInput: true,
+       },
+       {
+               camel:    "Idamax",
+               sig:      "n int, x []float64, incX int",
+               call:     "n, x, incX",
+               oneInput: true,
+       },
+       {
+               camel:    "Dswap",
+               sig:      "n int, x []float64, incX int, y []float64, incY int",
+               call:     "n, x, incX, y, incY",
+               oneInput: false,
+       },
+       {
+               camel:    "Dcopy",
+               sig:      "n int, x []float64, incX int, y []float64, incY int",
+               call:     "n, x, incX, y, incY",
+               oneInput: false,
+       },
+       {
+               camel:      "Daxpy",
+               sig:        "n int, alpha float64, x []float64, incX int, y []float64, incY int",
+               call:       "n, alpha, x, incX, y, incY",
+               extraSetup: "alpha := 2.4",
+               oneInput:   false,
+       },
+       {
+               camel:      "Drot",
+               sig:        "n int, x []float64, incX int, y []float64, incY int, c, s float64",
+               call:       "n, x, incX, y, incY, c, s",
+               extraSetup: "c := 0.89725836967\ns:= 0.44150585279",
+               oneInput:   false,
+       },
+       {
+               camel:      "Drotm",
+               sig:        "n int, x []float64, incX int, y []float64, incY int, p blas.DrotmParams",
+               call:       "n, x, incX, y, incY, p",
+               extraSetup: "p := blas.DrotmParams{Flag: blas.OffDiagonal, H: [4]float64{0, -0.625, 0.9375,0}}",
+               oneInput:   false,
+               extraName:  "OffDia",
+       },
+       {
+               camel:      "Drotm",
+               sig:        "n int, x []float64, incX int, y []float64, incY int, p blas.DrotmParams",
+               call:       "n, x, incX, y, incY, p",
+               extraSetup: "p := blas.DrotmParams{Flag: blas.OffDiagonal, H: [4]float64{5.0 / 12, 0, 0, 0.625}}",
+               oneInput:   false,
+               extraName:  "Dia",
+       },
+       {
+               camel:      "Drotm",
+               sig:        "n int, x []float64, incX int, y []float64, incY int, p blas.DrotmParams",
+               call:       "n, x, incX, y, incY, p",
+               extraSetup: "p := blas.DrotmParams{Flag: blas.OffDiagonal, H: [4]float64{4096, -3584, 1792, 4096}}",
+               oneInput:   false,
+               extraName:  "Resc",
+       },
+       {
+               camel:      "Dscal",
+               sig:        "n int, alpha float64, x []float64, incX int",
+               call:       "n, alpha, x, incX",
+               extraSetup: "alpha := 2.4",
+               oneInput:   true,
+       },
+}
+
+func init() {
+       gopath = os.Getenv("GOPATH")
+       if gopath == "" {
+               panic("gopath not set")
+       }
+}
+
+func main() {
+       blasPath := filepath.Join(gopath, "src", "gonum.org", "v1", "gonum", "blas")
+
+       pkgs := []struct{ name string }{{name: "native"}, {name: "cgo"}}
+
+       for _, pkg := range pkgs {
+               err := level1(filepath.Join(blasPath, pkg.name), pkg.name)
+               if err != nil {
+                       fmt.Println(err)
+                       os.Exit(1)
+               }
+
+               err = exec.Command("go", "fmt", path.Join("gonum.org", "v1", "gonum", "blas", pkg.name)).Run()
+               if err != nil {
+                       fmt.Println(err)
+                       os.Exit(1)
+               }
+       }
+}
+
+func printHeader(f *os.File, name string) error {
+       if _, err := f.Write(autogen); err != nil {
+               return err
+       }
+       f.WriteString("\n\n")
+       f.Write(copyrightnotice)
+       f.WriteString("\n\n")
+       f.WriteString("package " + name)
+       f.WriteString("\n\n")
+       f.Write(imports)
+       f.WriteString("\n\n")
+       return nil
+}
+
+// Generate the benchmark scripts for level1
+func level1(benchPath string, pkgname string) error {
+       // Generate level 1 benchmarks
+       level1Filepath := filepath.Join(benchPath, "level1doubleBench_auto_test.go")
+       f, err := os.Create(level1Filepath)
+       if err != nil {
+               fmt.Println(err)
+               os.Exit(1)
+       }
+       defer f.Close()
+       printHeader(f, pkgname)
+
+       // Print all of the constants
+       f.WriteString("const (\n")
+       f.WriteString("\tposInc1 = " + strconv.Itoa(posInc1) + "\n")
+       f.WriteString("\tposInc2 = " + strconv.Itoa(posInc2) + "\n")
+       f.WriteString("\tnegInc1 = " + strconv.Itoa(negInc1) + "\n")
+       f.WriteString("\tnegInc2 = " + strconv.Itoa(negInc2) + "\n")
+       for _, con := range level1Sizes {
+               f.WriteString("\t" + con.upper + " = " + strconv.Itoa(con.size) + "\n")
+       }
+       f.WriteString(")\n")
+       f.WriteString("\n")
+
+       // Write the randomSlice function
+       f.Write(randomSliceFunction)
+       f.WriteString("\n\n")
+
+       // Start writing the benchmarks
+       for _, fun := range level1Functions {
+               writeLevel1Benchmark(fun, f)
+               f.WriteString("\n/* ------------------ */ \n")
+       }
+
+       return nil
+}
+
+func writeLevel1Benchmark(fun level1functionStruct, f *os.File) {
+       // First, write the base benchmark file
+       f.WriteString("func benchmark" + fun.camel + fun.extraName + "(b *testing.B, ")
+       f.WriteString(fun.sig)
+       f.WriteString(") {\n")
+
+       f.WriteString("b.ResetTimer()\n")
+       f.WriteString("for i := 0; i < b.N; i++{\n")
+       f.WriteString("\timpl." + fun.camel + "(")
+
+       f.WriteString(fun.call)
+       f.WriteString(")\n}\n}\n")
+       f.WriteString("\n")
+
+       // Write all of the benchmarks to call it
+       for _, sz := range level1Sizes {
+               lambda := func(incX, incY, name string, twoInput bool) {
+                       f.WriteString("func Benchmark" + fun.camel + fun.extraName + sz.camel + name + "(b *testing.B){\n")
+                       f.WriteString("n := " + sz.upper + "\n")
+                       f.WriteString("incX := " + incX + "\n")
+                       f.WriteString("x := randomSlice(n, incX)\n")
+                       if twoInput {
+                               f.WriteString("incY := " + incY + "\n")
+                               f.WriteString("y := randomSlice(n, incY)\n")
+                       }
+                       f.WriteString(fun.extraSetup + "\n")
+                       f.WriteString("benchmark" + fun.camel + fun.extraName + "(b, " + fun.call + ")\n")
+                       f.WriteString("}\n\n")
+               }
+               if fun.oneInput {
+                       lambda("1", "", "UnitaryInc", false)
+                       lambda("posInc1", "", "PosInc", false)
+               } else {
+                       lambda("1", "1", "BothUnitary", true)
+                       lambda("posInc1", "1", "IncUni", true)
+                       lambda("1", "negInc1", "UniInc", true)
+                       lambda("posInc1", "negInc1", "BothInc", true)
+               }
+       }
+}