func (g *matrixFs) Gf(x, y *matrix.FloatMatrix, alpha, beta float64, trans linalg.Option) error { // minor := 0 if !checkpnt.MinorEmpty() { minor = checkpnt.MinorTop() } else { loopg += 1 minor = loopg } checkpnt.Check("00-Gfunc", minor) m, n := g.A.Size() y.Scale(beta) // x_n = x[:n] //x_n := matrix.FloatVector(x.FloatArray()[:n]) x_n := x.SubMatrix(0, 0, n, 1).Copy() // x_n_2n = x[n:2*n] //x_n_2n := matrix.FloatVector(x.FloatArray()[n : 2*n]) x_n_2n := x.SubMatrix(n, 0, n, 1).Copy() if linalg.Equal(trans, linalg.OptNoTrans) { // y += alpha * G * x // y[:n] += alpha * (x[:n] - x[n:2*n]) y_n := matrix.Minus(x_n, x_n_2n).Scale(alpha) y.SubMatrix(0, 0, n, 1).Plus(y_n) //y.AddIndexes(matrix.Indexes(n), y_n.FloatArray()) // y[n:2*n] += alpha * (-x[:n] - x[n:2*n]) = -alpha * (x[:n]+x[n:2*n]) y_n = matrix.Plus(x_n, x_n_2n).Scale(-alpha) y.SubMatrix(n, 0, n, 1).Plus(y_n) //y.AddIndexes(matrix.Indexes(n, 2*n), y_n.FloatArray()) // y[2*n+1:] += -alpha * A * x[:n] y_2n := matrix.Times(g.A, x_n).Scale(-alpha) //y.AddIndexes(matrix.Indexes(2*n+1, y.NumElements()), y_2n.FloatArray()) y.SubMatrix(2*n+1, 0, y_2n.NumElements(), 1).Plus(y_2n) } else { // x_m = x[-m:] //x_m := matrix.FloatVector(x.FloatArray()[x.NumElements()-m:]) x_m := x.SubMatrix(x.NumElements()-m, 0) // x_tmp = (x[:n] - x[n:2*n] - A.T * x[-m:]) x_tmp := matrix.Minus(x_n, x_n_2n, matrix.Times(g.A.Transpose(), x_m)) // y[:n] += alpha * (x[:n] - x[n:2*n] - A.T * x[-m:]) //y.AddIndexes(matrix.Indexes(n), x_tmp.Scale(alpha).FloatArray()) y.SubMatrix(0, 0, n, 1).Plus(x_tmp.Scale(alpha)) x_tmp = matrix.Plus(x_n, x_n_2n).Scale(-alpha) //y.AddIndexes(matrix.Indexes(n, y.NumElements()), x_tmp.FloatArray()) y.SubMatrix(n, 0).Plus(x_tmp) } checkpnt.Check("10-Gfunc", minor) return nil }
func (g *matrixFs) Gf(x, y *matrix.FloatMatrix, alpha, beta float64, trans linalg.Option) error { // // y := alpha*(-diag(x)) + beta*y // if linalg.Equal(trans, linalg.OptNoTrans) { blas.ScalFloat(y, beta) blas.AxpyFloat(x, y, -alpha, &linalg.IOpt{"incy", g.n + 1}) } else { blas.ScalFloat(y, beta) blas.AxpyFloat(x, y, -alpha, &linalg.IOpt{"incx", g.n + 1}) } return nil }