func check_level1_func(ind *linalg.IndexOpts, fn funcNum, X, Y matrix.Matrix) error { nX, nY := 0, 0 // this is adapted from cvxopt:blas.c python blas interface switch fn { case fnrm2, fasum, fiamax, fscal, fset: if ind.IncX <= 0 { return onError("incX illegal, <=0") } if ind.OffsetX < 0 { return onError("offsetX illegal, <0") } sizeX := X.NumElements() if sizeX >= ind.OffsetX+1 { // calculate default size for N based on X size nX = 1 + (sizeX-ind.OffsetX-1)/ind.IncX } if sizeX < ind.OffsetX+1+(ind.Nx-1)*abs(ind.IncX) { return onError("X size error") } if ind.Nx < 0 { ind.Nx = nX } case fdot, fswap, fcopy, faxpy, faxpby: // vector X if ind.IncX <= 0 { return onError("incX illegal, <=0") } if ind.OffsetX < 0 { return onError("offsetX illegal, <0") } sizeX := X.NumElements() if sizeX >= ind.OffsetX+1 { // calculate default size for N based on X size nX = 1 + (sizeX-ind.OffsetX-1)/ind.IncX } if sizeX < ind.OffsetX+1+(ind.Nx-1)*abs(ind.IncX) { return onError("X size error") } if ind.Nx < 0 { ind.Nx = nX } // vector Y if ind.IncY <= 0 { return onError("incY illegal, <=0") } if ind.OffsetY < 0 { return onError("offsetY illegal, <0") } sizeY := Y.NumElements() if sizeY >= ind.OffsetY+1 { // calculate default size for N based on Y size nY = 1 + (sizeY-ind.OffsetY-1)/ind.IncY } if ind.Ny < 0 { ind.Ny = nY } if sizeY < ind.OffsetY+1+(ind.Ny-1)*abs(ind.IncY) { //fmt.Printf("sizeY=%d, inds: %#v\n", sizeY, ind) return onError("Y size error") } case frotg, frotmg, frot, frotm: } return nil }