gonum.org/v1/gonum@v0.14.0/mat/shadow_complex.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 // TODO(kortschak): Generate this file from shadow.go when all complex type are available. 6 7 package mat 8 9 import "gonum.org/v1/gonum/blas/cblas128" 10 11 // checkOverlapComplex returns false if the receiver does not overlap data elements 12 // referenced by the parameter and panics otherwise. 13 // 14 // checkOverlapComplex methods return a boolean to allow the check call to be added to a 15 // boolean expression, making use of short-circuit operators. 16 func checkOverlapComplex(a, b cblas128.General) bool { 17 if cap(a.Data) == 0 || cap(b.Data) == 0 { 18 return false 19 } 20 21 off := offsetComplex(a.Data[:1], b.Data[:1]) 22 23 if off == 0 { 24 // At least one element overlaps. 25 if a.Cols == b.Cols && a.Rows == b.Rows && a.Stride == b.Stride { 26 panic(regionIdentity) 27 } 28 panic(regionOverlap) 29 } 30 31 if off > 0 && len(a.Data) <= off { 32 // We know a is completely before b. 33 return false 34 } 35 if off < 0 && len(b.Data) <= -off { 36 // We know a is completely after b. 37 return false 38 } 39 40 if a.Stride != b.Stride && a.Stride != 1 && b.Stride != 1 { 41 // Too hard, so assume the worst; if either stride 42 // is one it will be caught in rectanglesOverlap. 43 panic(mismatchedStrides) 44 } 45 46 if off < 0 { 47 off = -off 48 a.Cols, b.Cols = b.Cols, a.Cols 49 } 50 if rectanglesOverlap(off, a.Cols, b.Cols, min(a.Stride, b.Stride)) { 51 panic(regionOverlap) 52 } 53 return false 54 } 55 56 func (m *CDense) checkOverlap(a cblas128.General) bool { 57 return checkOverlapComplex(m.RawCMatrix(), a) 58 } 59 60 func (m *CDense) checkOverlapMatrix(a CMatrix) bool { 61 if m == a { 62 return false 63 } 64 var amat cblas128.General 65 switch ar := a.(type) { 66 default: 67 return false 68 case RawCMatrixer: 69 amat = ar.RawCMatrix() 70 } 71 return m.checkOverlap(amat) 72 }