github.com/gopherd/gonum@v0.0.4/mat/shadow_common.go (about) 1 // Copyright ©2015 The Gonum Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package mat 6 7 const ( 8 // regionOverlap is the panic string used for the general case 9 // of a matrix region overlap between a source and destination. 10 regionOverlap = "mat: bad region: overlap" 11 12 // regionIdentity is the panic string used for the specific 13 // case of complete agreement between a source and a destination. 14 regionIdentity = "mat: bad region: identical" 15 16 // mismatchedStrides is the panic string used for overlapping 17 // data slices with differing strides. 18 mismatchedStrides = "mat: bad region: different strides" 19 ) 20 21 // rectanglesOverlap returns whether the strided rectangles a and b overlap 22 // when b is offset by off elements after a but has at least one element before 23 // the end of a. off must be positive. a and b have aCols and bCols respectively. 24 // 25 // rectanglesOverlap works by shifting both matrices left such that the left 26 // column of a is at 0. The column indexes are flattened by obtaining the shifted 27 // relative left and right column positions modulo the common stride. This allows 28 // direct comparison of the column offsets when the matrix backing data slices 29 // are known to overlap. 30 func rectanglesOverlap(off, aCols, bCols, stride int) bool { 31 if stride == 1 { 32 // Unit stride means overlapping data 33 // slices must overlap as matrices. 34 return true 35 } 36 37 // Flatten the shifted matrix column positions 38 // so a starts at 0, modulo the common stride. 39 aTo := aCols 40 // The mod stride operations here make the from 41 // and to indexes comparable between a and b when 42 // the data slices of a and b overlap. 43 bFrom := off % stride 44 bTo := (bFrom + bCols) % stride 45 46 if bTo == 0 || bFrom < bTo { 47 // b matrix is not wrapped: compare for 48 // simple overlap. 49 return bFrom < aTo 50 } 51 52 // b strictly wraps and so must overlap with a. 53 return true 54 }