func runTest(A *matrix.FloatMatrix, ntest, LB int) time.Duration { var mintime time.Duration M := A.Rows() N := A.Cols() nN := N if M < N { nN = M } ipiv := make([]int, nN, nN) fnc := func() { _, ERRmatops = matops.DecomposeLU(A, ipiv, LB) } A0 := A.Copy() for n := 0; n < ntest; n++ { if n > 0 { // restore original A A0.CopyTo(A) } mperf.FlushCache() time0 := mperf.Timeit(fnc) if n == 0 || time0 < mintime { mintime = time0 } if verbose { fmt.Printf("%.4f ms\n", time0.Seconds()*1000.0) } } return mintime }
func solveMVTest(t *testing.T, A, X0 *matrix.FloatMatrix, flags Flags, bN, bNB int) { X1 := X0.Copy() uplo := linalg.OptUpper diag := linalg.OptNonUnit if flags&LOWER != 0 { uplo = linalg.OptLower } if flags&UNIT != 0 { diag = linalg.OptUnit } blas.TrsvFloat(A, X0, uplo, diag) Ar := A.FloatArray() Xr := X1.FloatArray() if bN == bNB { DSolveUnblkMV(Xr, Ar, flags, 1, A.LeadingIndex(), bN) } else { DSolveBlkMV(Xr, Ar, flags, 1, A.LeadingIndex(), bN, bNB) } ok := X1.AllClose(X0) t.Logf("X1 == X0: %v\n", ok) if !ok && bN < 8 { t.Logf("A=\n%v\n", A) t.Logf("X0=\n%v\n", X0) t.Logf("blas: X0\n%v\n", X0) t.Logf("X1:\n%v\n", X1) } }
func runRefTest(A *matrix.FloatMatrix, ntest, LB int) time.Duration { var mintime time.Duration N := A.Cols() tau := matrix.FloatZeros(N, 1) fnc := func() { ERRlapack = lapack.Geqrf(A, tau) } A0 := A.Copy() for n := 0; n < ntest; n++ { if n > 0 { // restore original A A0.CopyTo(A) tau.Scale(0.0) } mperf.FlushCache() time0 := mperf.Timeit(fnc) if n == 0 || time0 < mintime { mintime = time0 } } return mintime }
func runTest(A *matrix.FloatMatrix, ntest, LB int) time.Duration { var W *matrix.FloatMatrix = nil var mintime time.Duration N := A.Cols() tau := matrix.FloatZeros(N, 1) if LB > 0 { W = matrix.FloatZeros(A.Rows(), LB) } fnc := func() { _, ERRmatops = matops.DecomposeQR(A, tau, W, LB) } A0 := A.Copy() for n := 0; n < ntest; n++ { if n > 0 { // restore original A A0.CopyTo(A) tau.Scale(0.0) } mperf.FlushCache() time0 := mperf.Timeit(fnc) if n == 0 || time0 < mintime { mintime = time0 } if verbose { fmt.Printf("%.4f ms\n", time0.Seconds()*1000.0) } } return mintime }
func runRefTest(A *matrix.FloatMatrix, ntest, LB int) time.Duration { var mintime time.Duration M := A.Rows() N := A.Cols() nN := N if M < N { nN = M } ipiv := make([]int32, nN, nN) fnc := func() { ERRlapack = lapack.Getrf(A, ipiv) } A0 := A.Copy() for n := 0; n < ntest; n++ { if n > 0 { // restore original A A0.CopyTo(A) } mperf.FlushCache() time0 := mperf.Timeit(fnc) if n == 0 || time0 < mintime { mintime = time0 } } return mintime }
func runRefTest(A *matrix.FloatMatrix, ntest, LB int) time.Duration { var flags matops.Flags var mintime time.Duration N := A.Rows() ipiv := make([]int, N, N) flags = matops.LOWER if testUpper { flags = matops.UPPER } W := matrix.FloatZeros(A.Rows(), LB+2) fnc := func() { _, ERRref = matops.DecomposeLDL(A, W, ipiv, flags, 0) } A0 := A.Copy() for n := 0; n < ntest; n++ { if n > 0 { // restore original A A0.CopyTo(A) } mperf.FlushCache() time0 := mperf.Timeit(fnc) if n == 0 || time0 < mintime { mintime = time0 } } return mintime }
func runRefTest(A *matrix.FloatMatrix, ntest, LB int) time.Duration { var mintime time.Duration lopt := linalg.OptLower if testUpper { lopt = linalg.OptUpper } fnc := func() { ERRlapack = lapack.Potrf(A, lopt) } A0 := A.Copy() for n := 0; n < ntest; n++ { if n > 0 { // restore original A A0.CopyTo(A) } mperf.FlushCache() time0 := mperf.Timeit(fnc) if n == 0 || time0 < mintime { mintime = time0 } } return mintime }
func syrk2Test(t *testing.T, C, A, B *matrix.FloatMatrix, flags Flags, vlen, nb int) bool { //var B0 *matrix.FloatMatrix P := A.Cols() S := 0 E := C.Rows() C0 := C.Copy() trans := linalg.OptNoTrans if flags&TRANSA != 0 { trans = linalg.OptTrans P = A.Rows() } uplo := linalg.OptUpper if flags&LOWER != 0 { uplo = linalg.OptLower } blas.Syr2kFloat(A, B, C0, 1.0, 1.0, uplo, trans) if A.Rows() < 8 { //t.Logf("..A\n%v\n", A) t.Logf(" BLAS C0:\n%v\n", C0) } Ar := A.FloatArray() Br := B.FloatArray() Cr := C.FloatArray() DSymmRank2Blk(Cr, Ar, Br, 1.0, 1.0, flags, C.LeadingIndex(), A.LeadingIndex(), B.LeadingIndex(), P, S, E, vlen, nb) result := C0.AllClose(C) t.Logf(" C0 == C: %v\n", result) if A.Rows() < 8 { t.Logf(" DMRank2 C:\n%v\n", C) } return result }
func runTest(A *matrix.FloatMatrix, ntest, LB int) time.Duration { var flags matops.Flags var mintime time.Duration flags = matops.LOWER if testUpper { flags = matops.UPPER } fnc := func() { _, ERRmatops = matops.DecomposeCHOL(A, flags, LB) } A0 := A.Copy() for n := 0; n < ntest; n++ { if n > 0 { // restore original A A0.CopyTo(A) } mperf.FlushCache() time0 := mperf.Timeit(fnc) if n == 0 || time0 < mintime { mintime = time0 } if verbose { fmt.Printf("%.4f ms\n", time0.Seconds()*1000.0) } } return mintime }
func columnDiffs(A, B *matrix.FloatMatrix) *matrix.FloatMatrix { var c matrix.FloatMatrix nrm := matrix.FloatZeros(A.Cols(), 1) A0 := A.Copy() A0.Minus(B) for k := 0; k < A.Cols(); k++ { A0.SubMatrix(&c, 0, k, A.Rows(), 1) nrm.SetAt(k, 0, matops.Norm2(&c)) } return nrm }
func rowDiffs(A, B *matrix.FloatMatrix) *matrix.FloatMatrix { var r matrix.FloatMatrix nrm := matrix.FloatZeros(A.Rows(), 1) A0 := A.Copy() A0.Minus(B) for k := 0; k < A.Rows(); k++ { A0.SubMatrix(&r, k, 0, 1, A.Cols()) nrm.SetAt(k, 0, matops.Norm2(&r)) } return nrm }
// single invocation for matops and lapack functions func runCheck(A *matrix.FloatMatrix, LB int) (bool, time.Duration, time.Duration) { var flags matops.Flags N := A.Rows() ipiv := make([]int, N, N) ipiv0 := make([]int32, N, N) flags = matops.LOWER lopt := linalg.OptLower if testUpper { flags = matops.UPPER lopt = linalg.OptUpper } W := matrix.FloatZeros(A.Rows(), LB+2) fnc := func() { _, ERRmatops = matops.DecomposeBK(A, W, ipiv, flags, LB) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A start:\n%v\n", A) } A0 := A.Copy() mperf.FlushCache() time0 := mperf.Timeit(fnc) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "ipiv:%v\n", ipiv) fmt.Fprintf(os.Stderr, "A end:\n%v\n", A) } fn2 := func() { ERRlapack = lapack.Sytrf(A0, ipiv0, lopt) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A0 start:\n%v\n", A0) } mperf.FlushCache() time2 := mperf.Timeit(fn2) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "ipiv0:%v\n", ipiv0) fmt.Fprintf(os.Stderr, "A0 end:\n%v\n", A0) } // now A == A0 && ipiv == ipiv0 ok := A.AllClose(A0) okip := checkIPIV(ipiv, ipiv0) if !ok || !okip { // save result to globals Rlapack = A0 Rmatops = A IPIVlapack = ipiv0 IPIVmatops = ipiv } return ok && okip, time0, time2 }
func trmmTest(t *testing.T, A *matrix.FloatMatrix, flags Flags, nb int) bool { var B0 *matrix.FloatMatrix N := A.Cols() S := 0 E := A.Cols() side := linalg.OptLeft if flags&RIGHT != 0 { B0 = matrix.FloatWithValue(2, A.Rows(), 2.0) side = linalg.OptRight E = B0.Rows() } else { B0 = matrix.FloatWithValue(A.Rows(), 2, 2.0) E = B0.Cols() } B1 := B0.Copy() trans := linalg.OptNoTrans if flags&TRANSA != 0 { trans = linalg.OptTransA } diag := linalg.OptNonUnit if flags&UNIT != 0 { diag = linalg.OptUnit } uplo := linalg.OptUpper if flags&LOWER != 0 { uplo = linalg.OptLower } blas.TrmmFloat(A, B0, 1.0, uplo, diag, trans, side) if A.Rows() < 8 { //t.Logf("..A\n%v\n", A) t.Logf(" BLAS B0:\n%v\n", B0) } Ar := A.FloatArray() Br := B1.FloatArray() if nb != 0 { DTrmmBlk(Br, Ar, 1.0, flags, B1.LeadingIndex(), A.LeadingIndex(), N, S, E, nb) } else { DTrmmUnblk(Br, Ar, 1.0, flags, B1.LeadingIndex(), A.LeadingIndex(), N, S, E, 0) } result := B0.AllClose(B1) t.Logf(" B0 == B1: %v\n", result) if A.Rows() < 8 { t.Logf(" DTrmm B1:\n%v\n", B1) } return result }
// single invocation for matops and lapack functions func runCheck(A *matrix.FloatMatrix, LB int) (bool, time.Duration, time.Duration) { M := A.Rows() N := A.Cols() nN := N if M < N { nN = M } ipiv := make([]int, nN, nN) ipiv0 := make([]int32, nN, nN) fnc := func() { _, ERRmatops = matops.DecomposeLU(A, ipiv, LB) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A start:\n%v\n", A) } A0 := A.Copy() mperf.FlushCache() time0 := mperf.Timeit(fnc) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A end:\n%v\n", A) fmt.Fprintf(os.Stderr, "ipiv:%v\n", ipiv) } fn2 := func() { ERRlapack = lapack.Getrf(A0, ipiv0) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A0 start:\n%v\n", A0) } mperf.FlushCache() time2 := mperf.Timeit(fn2) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A0 end:\n%v\n", A0) fmt.Fprintf(os.Stderr, "ipiv0:%v\n", ipiv0) } // now A == A0 && ipiv == ipiv0 ok := A.AllClose(A0) okip := checkIPIV(ipiv, ipiv0) _ = okip if !ok || !okip { // save result to globals Rlapack = A0 Rmatops = A IPIVlapack = ipiv0 IPIVmatops = ipiv } return ok && okip, time0, time2 }
// single invocation for matops and lapack functions func runCheck(A *matrix.FloatMatrix, LB int) (bool, time.Duration, time.Duration) { var W *matrix.FloatMatrix = nil N := A.Cols() tau := matrix.FloatZeros(N, 1) if LB > 0 { W = matrix.FloatZeros(A.Rows(), LB) } fnc := func() { _, ERRmatops = matops.DecomposeQR(A, tau, W, LB) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A start:\n%v\n", A) } A0 := A.Copy() tau0 := tau.Copy() mperf.FlushCache() time0 := mperf.Timeit(fnc) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A end:\n%v\n", A) tau.SetSize(1, N, 1) fmt.Fprintf(os.Stderr, "tau: %v\n", tau) } fn2 := func() { ERRlapack = lapack.Geqrf(A0, tau0) } mperf.FlushCache() time2 := mperf.Timeit(fn2) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A0 end:\n%v\n", A0) tau0.SetSize(1, N, 1) // row vector fmt.Fprintf(os.Stderr, "tau0: %v\n", tau0) } // now A == A0 && tau == tau0 ok := A.AllClose(A0) oktau := tau.AllClose(tau0) if !ok || !oktau { // save result to globals Rlapack = A0 Rmatops = A TAUlapack = tau0 TAUmatops = tau } return ok && oktau, time0, time2 }
// Here problem is already translated to epigraph format except original convex problem. // We wrap it and create special CP epigraph kktsolver. func cp_problem(F ConvexProg, c MatrixVariable, G MatrixVarG, h *matrix.FloatMatrix, A MatrixVarA, b MatrixVariable, dims *sets.DimensionSet, kktsolver KKTCpSolver, solopts *SolverOptions, x0 *matrix.FloatMatrix, mnl int) (sol *Solution, err error) { err = nil F_e := &cpProg{F} //mx0 := newEpigraph(x0, 0.0) cdim := dims.Sum("l", "q") + dims.SumSquared("s") ux := x0.Copy() uz := matrix.FloatZeros(mnl+cdim, 1) kktsolver_e := func(W *sets.FloatMatrixSet, xa MatrixVariable, znl *matrix.FloatMatrix) (KKTFuncVar, error) { x, x_ok := xa.(*epigraph) _ = x_ok We := W.Copy() // dnl is matrix dnl := W.At("dnl")[0] dnli := W.At("dnli")[0] We.Set("dnl", matrix.FloatVector(dnl.FloatArray()[1:])) We.Set("dnli", matrix.FloatVector(dnli.FloatArray()[1:])) g, err := kktsolver(We, x.m(), znl) _, Df, _ := F.F1(x.m()) gradf0 := Df.GetRow(0, nil).Transpose() solve := func(xa, ya MatrixVariable, z *matrix.FloatMatrix) (err error) { x, x_ok := xa.(*epigraph) _ = x_ok // TODO: remove or use x_ok y := ya.Matrix() err = nil a := z.GetIndex(0) blas.Copy(x.m(), ux) blas.AxpyFloat(gradf0, ux, x.t()) blas.Copy(z, uz, &la.IOpt{"offsetx", 1}) err = g(ux, y, uz) z.SetIndex(0, -x.t()*dnl.GetIndex(0)) blas.Copy(uz, z, &la.IOpt{"offsety", 1}) blas.Copy(ux, x.m()) val := blas.DotFloat(gradf0, x.m()) + dnl.GetIndex(0)*dnl.GetIndex(0)*x.t() - a x.set(val) return } return solve, err } return cpl_solver(F_e, c, G, h, A, b, dims, kktsolver_e, solopts, nil, mnl) }
// single invocation for matops and lapack functions func runCheck(A *matrix.FloatMatrix, LB int) (bool, time.Duration, time.Duration) { var flags matops.Flags N := A.Rows() flags = matops.LOWER lopt := linalg.OptLower if testUpper { flags = matops.UPPER lopt = linalg.OptUpper } fnc := func() { _, ERRmatops = matops.DecomposeCHOL(A, flags, LB) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A start:\n%v\n", A) } A0 := A.Copy() mperf.FlushCache() time0 := mperf.Timeit(fnc) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A end:\n%v\n", A) } fn2 := func() { ERRlapack = lapack.Potrf(A0, lopt) } if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A0 start:\n%v\n", A0) } mperf.FlushCache() time2 := mperf.Timeit(fn2) if verbose && N < 10 { fmt.Fprintf(os.Stderr, "A0 end:\n%v\n", A0) } // now A == A0 && ipiv == ipiv0 ok := A.AllClose(A0) if !ok { // save result to globals Rlapack = A0 Rmatops = A } return ok, time0, time2 }
func cpl_problem(F ConvexProg, c MatrixVariable, G MatrixVarG, h *matrix.FloatMatrix, A MatrixVarA, b MatrixVariable, dims *sets.DimensionSet, kktsolver KKTCpSolver, solopts *SolverOptions, x0 *matrix.FloatMatrix, mnl int) (sol *Solution, err error) { err = nil F_e := &convexVarProg{F} mx0 := &matrixVar{x0.Copy()} kktsolver_u := func(W *sets.FloatMatrixSet, x MatrixVariable, z *matrix.FloatMatrix) (KKTFuncVar, error) { g, err := kktsolver(W, x.Matrix(), z) solver := func(x, y MatrixVariable, z *matrix.FloatMatrix) error { return g(x.Matrix(), y.Matrix(), z) } return solver, err } return cpl_solver(F_e, c, G, h, A, b, dims, kktsolver_u, solopts, mx0, mnl) }
func ldlbkDecomposeLowerTest(A *matrix.FloatMatrix, t *testing.T) { TriL(A) N := A.Cols() nb := 0 W := matrix.FloatZeros(A.Rows(), 5) ipiv := make([]int, N, N) L, _ := DecomposeBK(A.Copy(), W, ipiv, LOWER, nb) t.Logf("L:\n%v\n", L) t.Logf("unblked ipiv: %v\n", ipiv) ipiv0 := make([]int, N, N) nb = 4 L0, _ := DecomposeBK(A.Copy(), W, ipiv0, LOWER, nb) t.Logf("L:\n%v\n", L0) t.Logf("blked ipiv: %v\n", ipiv0) ipiv2 := make([]int32, N, N) lapack.SytrfFloat(A, ipiv2, linalg.OptLower) t.Logf("lapack A:\n%v\n", A) t.Logf("lapack ipiv: %v\n", ipiv2) }
/* From LAPACK/dlarf.f * * Applies a real elementary reflector H to a real m by n matrix A, * from either the left or the right. H is represented in the form * * H = I - tau * ( 1 ) * ( 1 v.T ) * ( v ) * * where tau is a real scalar and v is a real vector. * * If tau = 0, then H is taken to be the unit matrix. * * A is /a1\ a1 := a1 - w1 * \A2/ A2 := A2 - v*w1 * w1 := tau*(a1 + A2.T*v) if side == LEFT * := tau*(a1 + A2*v) if side == RIGHT * * Allocates/frees intermediate work space matrix w1. */ func applyHouseholder(tau, v, a1, A2 *matrix.FloatMatrix, flags Flags) { tval := tau.GetAt(0, 0) if tval == 0.0 { return } w1 := a1.Copy() if flags&LEFT != 0 { // w1 = a1 + A2.T*v MVMult(w1, A2, v, 1.0, 1.0, TRANSA) } else { // w1 = a1 + A2*v MVMult(w1, A2, v, 1.0, 1.0, NOTRANS) } // w1 = tau*w1 Scale(w1, tval) // a1 = a1 - w1 a1.Minus(w1) // A2 = A2 - v*w1 MVRankUpdate(A2, v, w1, -1.0) }
func trsmSolve(t *testing.T, A *matrix.FloatMatrix, flags Flags, rand bool, nrhs, nb int) bool { var B0 *matrix.FloatMatrix side := linalg.OptLeft trans := linalg.OptNoTrans N := A.Cols() S := 0 E := A.Rows() _ = S _ = E if flags&RIGHT != 0 { if rand { B0 = matrix.FloatNormal(nrhs, A.Rows()) } else { B0 = matrix.FloatWithValue(nrhs, A.Rows(), 2.0) } side = linalg.OptRight E = B0.Rows() } else { if rand { B0 = matrix.FloatNormal(A.Rows(), nrhs) } else { B0 = matrix.FloatWithValue(A.Rows(), nrhs, 2.0) } E = B0.Cols() } B1 := B0.Copy() diag := linalg.OptNonUnit if flags&UNIT != 0 { diag = linalg.OptUnit } uplo := linalg.OptUpper if flags&LOWER != 0 { uplo = linalg.OptLower } if flags&TRANSA != 0 { trans = linalg.OptTransA } blas.TrsmFloat(A, B0, 1.0, uplo, diag, side, trans) Ar := A.FloatArray() Br := B1.FloatArray() if nb == 0 || nb == N { DSolveUnblk(Br, Ar, 1.0, flags, B1.LeadingIndex(), A.LeadingIndex(), N, S, E) } else { DSolveBlk(Br, Ar, 1.0, flags, B1.LeadingIndex(), A.LeadingIndex(), N, S, E, nb) } result := B1.AllClose(B0) t.Logf("B1 == B0: %v\n", result) if !result { if nrhs < 10 { t.Logf("blas: B0\n%v\n", B0) t.Logf("B1:\n%v\n", B1) } else { b0 := B0.FloatArray() b1 := B1.FloatArray() for k := 0; k < len(b0); k++ { if !isClose(b0[k], b1[k]) { t.Logf("first divergences at %d ... col %d, row %d\n", k, k/B0.Rows(), k%B0.Rows()) break } } } } return result }
func newEpigraph(m *matrix.FloatMatrix, t float64) *epigraph { return &epigraph{m.Copy(), t} }
func mcsdp(w *matrix.FloatMatrix) (*Solution, error) { // // Returns solution x, z to // // (primal) minimize sum(x) // subject to w + diag(x) >= 0 // // (dual) maximize -tr(w*z) // subject to diag(z) = 1 // z >= 0. // n := w.Rows() G := &matrixFs{n} cngrnc := func(r, x *matrix.FloatMatrix, alpha float64) (err error) { // Congruence transformation // // x := alpha * r'*x*r. // // r and x are square matrices. // err = nil // tx = matrix(x, (n,n)) is copying and reshaping // scale diagonal of x by 1/2, (x is (n,n)) tx := x.Copy() matrix.Reshape(tx, n, n) tx.Diag().Scale(0.5) // a := tril(x)*r // (python: a = +r is really making a copy of r) a := r.Copy() err = blas.TrmmFloat(tx, a, 1.0, linalg.OptLeft) // x := alpha*(a*r' + r*a') err = blas.Syr2kFloat(r, a, tx, alpha, 0.0, linalg.OptTrans) // x[:] = tx[:] tx.CopyTo(x) return } Fkkt := func(W *sets.FloatMatrixSet) (KKTFunc, error) { // Solve // -diag(z) = bx // -diag(x) - inv(rti*rti') * z * inv(rti*rti') = bs // // On entry, x and z contain bx and bs. // On exit, they contain the solution, with z scaled // (inv(rti)'*z*inv(rti) is returned instead of z). // // We first solve // // ((rti*rti') .* (rti*rti')) * x = bx - diag(t*bs*t) // // and take z = -rti' * (diag(x) + bs) * rti. var err error = nil rti := W.At("rti")[0] // t = rti*rti' as a nonsymmetric matrix. t := matrix.FloatZeros(n, n) err = blas.GemmFloat(rti, rti, t, 1.0, 0.0, linalg.OptTransB) if err != nil { return nil, err } // Cholesky factorization of tsq = t.*t. tsq := matrix.Mul(t, t) err = lapack.Potrf(tsq) if err != nil { return nil, err } f := func(x, y, z *matrix.FloatMatrix) (err error) { // tbst := t * zs * t = t * bs * t tbst := z.Copy() matrix.Reshape(tbst, n, n) cngrnc(t, tbst, 1.0) // x := x - diag(tbst) = bx - diag(rti*rti' * bs * rti*rti') diag := tbst.Diag().Transpose() x.Minus(diag) // x := (t.*t)^{-1} * x = (t.*t)^{-1} * (bx - diag(t*bs*t)) err = lapack.Potrs(tsq, x) // z := z + diag(x) = bs + diag(x) // z, x are really column vectors here z.AddIndexes(matrix.MakeIndexSet(0, n*n, n+1), x.FloatArray()) // z := -rti' * z * rti = -rti' * (diag(x) + bs) * rti cngrnc(rti, z, -1.0) return nil } return f, nil } c := matrix.FloatWithValue(n, 1, 1.0) // initial feasible x: x = 1.0 - min(lmbda(w)) lmbda := matrix.FloatZeros(n, 1) wp := w.Copy() lapack.Syevx(wp, lmbda, nil, 0.0, nil, []int{1, 1}, linalg.OptRangeInt) x0 := matrix.FloatZeros(n, 1).Add(-lmbda.GetAt(0, 0) + 1.0) s0 := w.Copy() s0.Diag().Plus(x0.Transpose()) matrix.Reshape(s0, n*n, 1) // initial feasible z is identity z0 := matrix.FloatIdentity(n) matrix.Reshape(z0, n*n, 1) dims := sets.DSetNew("l", "q", "s") dims.Set("s", []int{n}) primalstart := sets.FloatSetNew("x", "s") dualstart := sets.FloatSetNew("z") primalstart.Set("x", x0) primalstart.Set("s", s0) dualstart.Set("z", z0) var solopts SolverOptions solopts.MaxIter = 30 solopts.ShowProgress = false h := w.Copy() matrix.Reshape(h, h.NumElements(), 1) return ConeLpCustomMatrix(c, G, h, nil, nil, dims, Fkkt, &solopts, primalstart, dualstart) }