gorgonia.org/tensor@v0.9.24/defaultengine_cmp.go (about)

     1  // Code generated by genlib2. DO NOT EDIT.
     2  
     3  package tensor
     4  
     5  import (
     6  	"github.com/pkg/errors"
     7  	"gorgonia.org/tensor/internal/storage"
     8  )
     9  
    10  // Gt performs a > b elementwise. Both a and b must have the same shape.
    11  // Acceptable FuncOpts are: UseUnsafe(), AsSameType(), WithReuse().
    12  //UseUnsafe() will ensure that the same type is returned.
    13  // Tensors used in WithReuse has to have the same Dtype as the return value's Dtype.
    14  func (e StdEng) Gt(a Tensor, b Tensor, opts ...FuncOpt) (retVal Tensor, err error) {
    15  	if err = binaryCheck(a, b, ordTypes); err != nil {
    16  		return nil, errors.Wrapf(err, "Gt failed")
    17  	}
    18  
    19  	var reuse DenseTensor
    20  	var safe, same bool
    21  	if reuse, safe, _, _, same, err = handleFuncOpts(a.Shape(), a.Dtype(), a.DataOrder(), false, opts...); err != nil {
    22  		return nil, errors.Wrap(err, "Unable to handle funcOpts")
    23  	}
    24  	if !safe {
    25  		same = true
    26  	}
    27  	typ := a.Dtype().Type
    28  	var dataA, dataB, dataReuse *storage.Header
    29  	var ait, bit, iit Iterator
    30  	var useIter, swap bool
    31  	if dataA, dataB, dataReuse, ait, bit, iit, useIter, swap, err = prepDataVV(a, b, reuse); err != nil {
    32  		return nil, errors.Wrapf(err, "StdEng.Gt")
    33  	}
    34  	// check to see if anything needs to be created
    35  	switch {
    36  	case same && safe && reuse == nil:
    37  		if swap {
    38  			reuse = NewDense(b.Dtype(), b.Shape().Clone(), WithEngine(e))
    39  		} else {
    40  			reuse = NewDense(a.Dtype(), a.Shape().Clone(), WithEngine(e))
    41  		}
    42  		dataReuse = reuse.hdr()
    43  		if useIter {
    44  			iit = IteratorFromDense(reuse)
    45  		}
    46  	case !same && safe && reuse == nil:
    47  		reuse = NewDense(Bool, a.Shape().Clone(), WithEngine(e))
    48  		dataReuse = reuse.hdr()
    49  		if useIter {
    50  			iit = IteratorFromDense(reuse)
    51  		}
    52  	}
    53  
    54  	if useIter {
    55  		switch {
    56  		case !safe && same && reuse == nil:
    57  			err = e.E.GtSameIter(typ, dataA, dataB, ait, bit)
    58  			retVal = a
    59  		case same && safe && reuse != nil:
    60  			storage.CopyIter(typ, dataReuse, dataA, iit, ait)
    61  			ait.Reset()
    62  			iit.Reset()
    63  			err = e.E.GtSameIter(typ, dataReuse, dataB, iit, bit)
    64  			retVal = reuse
    65  		default: // safe && bool
    66  			err = e.E.GtIter(typ, dataA, dataB, dataReuse, ait, bit, iit)
    67  			retVal = reuse
    68  		}
    69  		return
    70  	}
    71  
    72  	// standard
    73  	switch {
    74  	case !safe && same && reuse == nil:
    75  		err = e.E.GtSame(typ, dataA, dataB)
    76  		retVal = a
    77  	case same && safe && reuse != nil:
    78  		storage.Copy(typ, dataReuse, dataA)
    79  		err = e.E.GtSame(typ, dataReuse, dataB)
    80  		retVal = reuse
    81  	default:
    82  		err = e.E.Gt(typ, dataA, dataB, dataReuse)
    83  		retVal = reuse
    84  	}
    85  	return
    86  }
    87  
    88  // Gte performs a ≥ b elementwise. Both a and b must have the same shape.
    89  // Acceptable FuncOpts are: UseUnsafe(), AsSameType(), WithReuse().
    90  //UseUnsafe() will ensure that the same type is returned.
    91  // Tensors used in WithReuse has to have the same Dtype as the return value's Dtype.
    92  func (e StdEng) Gte(a Tensor, b Tensor, opts ...FuncOpt) (retVal Tensor, err error) {
    93  	if err = binaryCheck(a, b, ordTypes); err != nil {
    94  		return nil, errors.Wrapf(err, "Gte failed")
    95  	}
    96  
    97  	var reuse DenseTensor
    98  	var safe, same bool
    99  	if reuse, safe, _, _, same, err = handleFuncOpts(a.Shape(), a.Dtype(), a.DataOrder(), false, opts...); err != nil {
   100  		return nil, errors.Wrap(err, "Unable to handle funcOpts")
   101  	}
   102  	if !safe {
   103  		same = true
   104  	}
   105  	typ := a.Dtype().Type
   106  	var dataA, dataB, dataReuse *storage.Header
   107  	var ait, bit, iit Iterator
   108  	var useIter, swap bool
   109  	if dataA, dataB, dataReuse, ait, bit, iit, useIter, swap, err = prepDataVV(a, b, reuse); err != nil {
   110  		return nil, errors.Wrapf(err, "StdEng.Gte")
   111  	}
   112  	// check to see if anything needs to be created
   113  	switch {
   114  	case same && safe && reuse == nil:
   115  		if swap {
   116  			reuse = NewDense(b.Dtype(), b.Shape().Clone(), WithEngine(e))
   117  		} else {
   118  			reuse = NewDense(a.Dtype(), a.Shape().Clone(), WithEngine(e))
   119  		}
   120  		dataReuse = reuse.hdr()
   121  		if useIter {
   122  			iit = IteratorFromDense(reuse)
   123  		}
   124  	case !same && safe && reuse == nil:
   125  		reuse = NewDense(Bool, a.Shape().Clone(), WithEngine(e))
   126  		dataReuse = reuse.hdr()
   127  		if useIter {
   128  			iit = IteratorFromDense(reuse)
   129  		}
   130  	}
   131  
   132  	if useIter {
   133  		switch {
   134  		case !safe && same && reuse == nil:
   135  			err = e.E.GteSameIter(typ, dataA, dataB, ait, bit)
   136  			retVal = a
   137  		case same && safe && reuse != nil:
   138  			storage.CopyIter(typ, dataReuse, dataA, iit, ait)
   139  			ait.Reset()
   140  			iit.Reset()
   141  			err = e.E.GteSameIter(typ, dataReuse, dataB, iit, bit)
   142  			retVal = reuse
   143  		default: // safe && bool
   144  			err = e.E.GteIter(typ, dataA, dataB, dataReuse, ait, bit, iit)
   145  			retVal = reuse
   146  		}
   147  		return
   148  	}
   149  
   150  	// standard
   151  	switch {
   152  	case !safe && same && reuse == nil:
   153  		err = e.E.GteSame(typ, dataA, dataB)
   154  		retVal = a
   155  	case same && safe && reuse != nil:
   156  		storage.Copy(typ, dataReuse, dataA)
   157  		err = e.E.GteSame(typ, dataReuse, dataB)
   158  		retVal = reuse
   159  	default:
   160  		err = e.E.Gte(typ, dataA, dataB, dataReuse)
   161  		retVal = reuse
   162  	}
   163  	return
   164  }
   165  
   166  // Lt performs a < b elementwise. Both a and b must have the same shape.
   167  // Acceptable FuncOpts are: UseUnsafe(), AsSameType(), WithReuse().
   168  //UseUnsafe() will ensure that the same type is returned.
   169  // Tensors used in WithReuse has to have the same Dtype as the return value's Dtype.
   170  func (e StdEng) Lt(a Tensor, b Tensor, opts ...FuncOpt) (retVal Tensor, err error) {
   171  	if err = binaryCheck(a, b, ordTypes); err != nil {
   172  		return nil, errors.Wrapf(err, "Lt failed")
   173  	}
   174  
   175  	var reuse DenseTensor
   176  	var safe, same bool
   177  	if reuse, safe, _, _, same, err = handleFuncOpts(a.Shape(), a.Dtype(), a.DataOrder(), false, opts...); err != nil {
   178  		return nil, errors.Wrap(err, "Unable to handle funcOpts")
   179  	}
   180  	if !safe {
   181  		same = true
   182  	}
   183  	typ := a.Dtype().Type
   184  	var dataA, dataB, dataReuse *storage.Header
   185  	var ait, bit, iit Iterator
   186  	var useIter, swap bool
   187  	if dataA, dataB, dataReuse, ait, bit, iit, useIter, swap, err = prepDataVV(a, b, reuse); err != nil {
   188  		return nil, errors.Wrapf(err, "StdEng.Lt")
   189  	}
   190  	// check to see if anything needs to be created
   191  	switch {
   192  	case same && safe && reuse == nil:
   193  		if swap {
   194  			reuse = NewDense(b.Dtype(), b.Shape().Clone(), WithEngine(e))
   195  		} else {
   196  			reuse = NewDense(a.Dtype(), a.Shape().Clone(), WithEngine(e))
   197  		}
   198  		dataReuse = reuse.hdr()
   199  		if useIter {
   200  			iit = IteratorFromDense(reuse)
   201  		}
   202  	case !same && safe && reuse == nil:
   203  		reuse = NewDense(Bool, a.Shape().Clone(), WithEngine(e))
   204  		dataReuse = reuse.hdr()
   205  		if useIter {
   206  			iit = IteratorFromDense(reuse)
   207  		}
   208  	}
   209  
   210  	if useIter {
   211  		switch {
   212  		case !safe && same && reuse == nil:
   213  			err = e.E.LtSameIter(typ, dataA, dataB, ait, bit)
   214  			retVal = a
   215  		case same && safe && reuse != nil:
   216  			storage.CopyIter(typ, dataReuse, dataA, iit, ait)
   217  			ait.Reset()
   218  			iit.Reset()
   219  			err = e.E.LtSameIter(typ, dataReuse, dataB, iit, bit)
   220  			retVal = reuse
   221  		default: // safe && bool
   222  			err = e.E.LtIter(typ, dataA, dataB, dataReuse, ait, bit, iit)
   223  			retVal = reuse
   224  		}
   225  		return
   226  	}
   227  
   228  	// standard
   229  	switch {
   230  	case !safe && same && reuse == nil:
   231  		err = e.E.LtSame(typ, dataA, dataB)
   232  		retVal = a
   233  	case same && safe && reuse != nil:
   234  		storage.Copy(typ, dataReuse, dataA)
   235  		err = e.E.LtSame(typ, dataReuse, dataB)
   236  		retVal = reuse
   237  	default:
   238  		err = e.E.Lt(typ, dataA, dataB, dataReuse)
   239  		retVal = reuse
   240  	}
   241  	return
   242  }
   243  
   244  // Lte performs a ≤ b elementwise. Both a and b must have the same shape.
   245  // Acceptable FuncOpts are: UseUnsafe(), AsSameType(), WithReuse().
   246  //UseUnsafe() will ensure that the same type is returned.
   247  // Tensors used in WithReuse has to have the same Dtype as the return value's Dtype.
   248  func (e StdEng) Lte(a Tensor, b Tensor, opts ...FuncOpt) (retVal Tensor, err error) {
   249  	if err = binaryCheck(a, b, ordTypes); err != nil {
   250  		return nil, errors.Wrapf(err, "Lte failed")
   251  	}
   252  
   253  	var reuse DenseTensor
   254  	var safe, same bool
   255  	if reuse, safe, _, _, same, err = handleFuncOpts(a.Shape(), a.Dtype(), a.DataOrder(), false, opts...); err != nil {
   256  		return nil, errors.Wrap(err, "Unable to handle funcOpts")
   257  	}
   258  	if !safe {
   259  		same = true
   260  	}
   261  	typ := a.Dtype().Type
   262  	var dataA, dataB, dataReuse *storage.Header
   263  	var ait, bit, iit Iterator
   264  	var useIter, swap bool
   265  	if dataA, dataB, dataReuse, ait, bit, iit, useIter, swap, err = prepDataVV(a, b, reuse); err != nil {
   266  		return nil, errors.Wrapf(err, "StdEng.Lte")
   267  	}
   268  	// check to see if anything needs to be created
   269  	switch {
   270  	case same && safe && reuse == nil:
   271  		if swap {
   272  			reuse = NewDense(b.Dtype(), b.Shape().Clone(), WithEngine(e))
   273  		} else {
   274  			reuse = NewDense(a.Dtype(), a.Shape().Clone(), WithEngine(e))
   275  		}
   276  		dataReuse = reuse.hdr()
   277  		if useIter {
   278  			iit = IteratorFromDense(reuse)
   279  		}
   280  	case !same && safe && reuse == nil:
   281  		reuse = NewDense(Bool, a.Shape().Clone(), WithEngine(e))
   282  		dataReuse = reuse.hdr()
   283  		if useIter {
   284  			iit = IteratorFromDense(reuse)
   285  		}
   286  	}
   287  
   288  	if useIter {
   289  		switch {
   290  		case !safe && same && reuse == nil:
   291  			err = e.E.LteSameIter(typ, dataA, dataB, ait, bit)
   292  			retVal = a
   293  		case same && safe && reuse != nil:
   294  			storage.CopyIter(typ, dataReuse, dataA, iit, ait)
   295  			ait.Reset()
   296  			iit.Reset()
   297  			err = e.E.LteSameIter(typ, dataReuse, dataB, iit, bit)
   298  			retVal = reuse
   299  		default: // safe && bool
   300  			err = e.E.LteIter(typ, dataA, dataB, dataReuse, ait, bit, iit)
   301  			retVal = reuse
   302  		}
   303  		return
   304  	}
   305  
   306  	// standard
   307  	switch {
   308  	case !safe && same && reuse == nil:
   309  		err = e.E.LteSame(typ, dataA, dataB)
   310  		retVal = a
   311  	case same && safe && reuse != nil:
   312  		storage.Copy(typ, dataReuse, dataA)
   313  		err = e.E.LteSame(typ, dataReuse, dataB)
   314  		retVal = reuse
   315  	default:
   316  		err = e.E.Lte(typ, dataA, dataB, dataReuse)
   317  		retVal = reuse
   318  	}
   319  	return
   320  }
   321  
   322  // ElEq performs a == b elementwise. Both a and b must have the same shape.
   323  // Acceptable FuncOpts are: UseUnsafe(), AsSameType(), WithReuse().
   324  //UseUnsafe() will ensure that the same type is returned.
   325  // Tensors used in WithReuse has to have the same Dtype as the return value's Dtype.
   326  func (e StdEng) ElEq(a Tensor, b Tensor, opts ...FuncOpt) (retVal Tensor, err error) {
   327  	if err = binaryCheck(a, b, eqTypes); err != nil {
   328  		return nil, errors.Wrapf(err, "Eq failed")
   329  	}
   330  
   331  	var reuse DenseTensor
   332  	var safe, same bool
   333  	if reuse, safe, _, _, same, err = handleFuncOpts(a.Shape(), a.Dtype(), a.DataOrder(), false, opts...); err != nil {
   334  		return nil, errors.Wrap(err, "Unable to handle funcOpts")
   335  	}
   336  	if !safe {
   337  		same = true
   338  	}
   339  	typ := a.Dtype().Type
   340  	var dataA, dataB, dataReuse *storage.Header
   341  	var ait, bit, iit Iterator
   342  	var useIter, swap bool
   343  	if dataA, dataB, dataReuse, ait, bit, iit, useIter, swap, err = prepDataVV(a, b, reuse); err != nil {
   344  		return nil, errors.Wrapf(err, "StdEng.Eq")
   345  	}
   346  	// check to see if anything needs to be created
   347  	switch {
   348  	case same && safe && reuse == nil:
   349  		if swap {
   350  			reuse = NewDense(b.Dtype(), b.Shape().Clone(), WithEngine(e))
   351  		} else {
   352  			reuse = NewDense(a.Dtype(), a.Shape().Clone(), WithEngine(e))
   353  		}
   354  		dataReuse = reuse.hdr()
   355  		if useIter {
   356  			iit = IteratorFromDense(reuse)
   357  		}
   358  	case !same && safe && reuse == nil:
   359  		reuse = NewDense(Bool, a.Shape().Clone(), WithEngine(e))
   360  		dataReuse = reuse.hdr()
   361  		if useIter {
   362  			iit = IteratorFromDense(reuse)
   363  		}
   364  	}
   365  
   366  	if useIter {
   367  		switch {
   368  		case !safe && same && reuse == nil:
   369  			err = e.E.EqSameIter(typ, dataA, dataB, ait, bit)
   370  			retVal = a
   371  		case same && safe && reuse != nil:
   372  			storage.CopyIter(typ, dataReuse, dataA, iit, ait)
   373  			ait.Reset()
   374  			iit.Reset()
   375  			err = e.E.EqSameIter(typ, dataReuse, dataB, iit, bit)
   376  			retVal = reuse
   377  		default: // safe && bool
   378  			err = e.E.EqIter(typ, dataA, dataB, dataReuse, ait, bit, iit)
   379  			retVal = reuse
   380  		}
   381  		return
   382  	}
   383  
   384  	// standard
   385  	switch {
   386  	case !safe && same && reuse == nil:
   387  		err = e.E.EqSame(typ, dataA, dataB)
   388  		retVal = a
   389  	case same && safe && reuse != nil:
   390  		storage.Copy(typ, dataReuse, dataA)
   391  		err = e.E.EqSame(typ, dataReuse, dataB)
   392  		retVal = reuse
   393  	default:
   394  		err = e.E.Eq(typ, dataA, dataB, dataReuse)
   395  		retVal = reuse
   396  	}
   397  	return
   398  }
   399  
   400  // ElNe performs a ≠ b elementwise. Both a and b must have the same shape.
   401  // Acceptable FuncOpts are: UseUnsafe(), AsSameType(), WithReuse().
   402  //UseUnsafe() will ensure that the same type is returned.
   403  // Tensors used in WithReuse has to have the same Dtype as the return value's Dtype.
   404  func (e StdEng) ElNe(a Tensor, b Tensor, opts ...FuncOpt) (retVal Tensor, err error) {
   405  	if err = binaryCheck(a, b, eqTypes); err != nil {
   406  		return nil, errors.Wrapf(err, "Ne failed")
   407  	}
   408  
   409  	var reuse DenseTensor
   410  	var safe, same bool
   411  	if reuse, safe, _, _, same, err = handleFuncOpts(a.Shape(), a.Dtype(), a.DataOrder(), false, opts...); err != nil {
   412  		return nil, errors.Wrap(err, "Unable to handle funcOpts")
   413  	}
   414  	if !safe {
   415  		same = true
   416  	}
   417  	typ := a.Dtype().Type
   418  	var dataA, dataB, dataReuse *storage.Header
   419  	var ait, bit, iit Iterator
   420  	var useIter, swap bool
   421  	if dataA, dataB, dataReuse, ait, bit, iit, useIter, swap, err = prepDataVV(a, b, reuse); err != nil {
   422  		return nil, errors.Wrapf(err, "StdEng.Ne")
   423  	}
   424  	// check to see if anything needs to be created
   425  	switch {
   426  	case same && safe && reuse == nil:
   427  		if swap {
   428  			reuse = NewDense(b.Dtype(), b.Shape().Clone(), WithEngine(e))
   429  		} else {
   430  			reuse = NewDense(a.Dtype(), a.Shape().Clone(), WithEngine(e))
   431  		}
   432  		dataReuse = reuse.hdr()
   433  		if useIter {
   434  			iit = IteratorFromDense(reuse)
   435  		}
   436  	case !same && safe && reuse == nil:
   437  		reuse = NewDense(Bool, a.Shape().Clone(), WithEngine(e))
   438  		dataReuse = reuse.hdr()
   439  		if useIter {
   440  			iit = IteratorFromDense(reuse)
   441  		}
   442  	}
   443  
   444  	if useIter {
   445  		switch {
   446  		case !safe && same && reuse == nil:
   447  			err = e.E.NeSameIter(typ, dataA, dataB, ait, bit)
   448  			retVal = a
   449  		case same && safe && reuse != nil:
   450  			storage.CopyIter(typ, dataReuse, dataA, iit, ait)
   451  			ait.Reset()
   452  			iit.Reset()
   453  			err = e.E.NeSameIter(typ, dataReuse, dataB, iit, bit)
   454  			retVal = reuse
   455  		default: // safe && bool
   456  			err = e.E.NeIter(typ, dataA, dataB, dataReuse, ait, bit, iit)
   457  			retVal = reuse
   458  		}
   459  		return
   460  	}
   461  
   462  	// standard
   463  	switch {
   464  	case !safe && same && reuse == nil:
   465  		err = e.E.NeSame(typ, dataA, dataB)
   466  		retVal = a
   467  	case same && safe && reuse != nil:
   468  		storage.Copy(typ, dataReuse, dataA)
   469  		err = e.E.NeSame(typ, dataReuse, dataB)
   470  		retVal = reuse
   471  	default:
   472  		err = e.E.Ne(typ, dataA, dataB, dataReuse)
   473  		retVal = reuse
   474  	}
   475  	return
   476  }
   477  
   478  // GtScalar performs t > s elementwise. The leftTensor parameter indicates if the tensor is the left operand. Only scalar types are accepted in s
   479  // Acceptable FuncOpts are: UseUnsafe(), AsSameType(), WithReuse().
   480  // UseUnsafe() will ensure that the same type is returned.
   481  // Tensors used in WithReuse has to have the same Dtype as the return value's Dtype.
   482  func (e StdEng) GtScalar(t Tensor, s interface{}, leftTensor bool, opts ...FuncOpt) (retVal Tensor, err error) {
   483  	if err = unaryCheck(t, ordTypes); err != nil {
   484  		return nil, errors.Wrapf(err, "Gt failed")
   485  	}
   486  
   487  	if err = scalarDtypeCheck(t, s); err != nil {
   488  		return nil, errors.Wrap(err, "Gt failed")
   489  	}
   490  
   491  	var reuse DenseTensor
   492  	var safe, same bool
   493  	if reuse, safe, _, _, same, err = handleFuncOpts(t.Shape(), t.Dtype(), t.DataOrder(), false, opts...); err != nil {
   494  		return nil, errors.Wrap(err, "Unable to handle funcOpts")
   495  	}
   496  	if !safe {
   497  		same = true
   498  	}
   499  	a := t
   500  	typ := t.Dtype().Type
   501  	var ait, bit, iit Iterator
   502  	var dataA, dataB, dataReuse, scalarHeader *storage.Header
   503  	var useIter, newAlloc bool
   504  
   505  	if leftTensor {
   506  		if dataA, dataB, dataReuse, ait, iit, useIter, newAlloc, err = prepDataVS(t, s, reuse); err != nil {
   507  			return nil, errors.Wrapf(err, opFail, "StdEng.Gt")
   508  		}
   509  		scalarHeader = dataB
   510  	} else {
   511  		if dataA, dataB, dataReuse, bit, iit, useIter, newAlloc, err = prepDataSV(s, t, reuse); err != nil {
   512  			return nil, errors.Wrapf(err, opFail, "StdEng.Gt")
   513  		}
   514  		scalarHeader = dataA
   515  	}
   516  
   517  	// check to see if anything needs to be created
   518  	switch {
   519  	case same && safe && reuse == nil:
   520  		reuse = NewDense(a.Dtype(), a.Shape().Clone(), WithEngine(e))
   521  		dataReuse = reuse.hdr()
   522  		if useIter {
   523  			iit = IteratorFromDense(reuse)
   524  		}
   525  	case !same && safe && reuse == nil:
   526  		reuse = NewDense(Bool, a.Shape().Clone(), WithEngine(e))
   527  		dataReuse = reuse.hdr()
   528  		if useIter {
   529  			iit = IteratorFromDense(reuse)
   530  		}
   531  	}
   532  
   533  	if useIter {
   534  		switch {
   535  		case !safe && same && reuse == nil:
   536  			err = e.E.GtSameIter(typ, dataA, dataB, ait, bit)
   537  			retVal = a
   538  		case same && safe && reuse != nil && !leftTensor:
   539  			storage.CopyIter(typ, dataReuse, dataB, iit, bit)
   540  			bit.Reset()
   541  			iit.Reset()
   542  			err = e.E.GtSameIter(typ, dataA, dataReuse, ait, bit)
   543  			retVal = reuse
   544  		case same && safe && reuse != nil && leftTensor:
   545  			storage.CopyIter(typ, dataReuse, dataA, iit, ait)
   546  			ait.Reset()
   547  			iit.Reset()
   548  			err = e.E.GtSameIter(typ, dataReuse, dataB, iit, bit)
   549  			retVal = reuse
   550  		default: // safe && bool
   551  			err = e.E.GtIter(typ, dataA, dataB, dataReuse, ait, bit, iit)
   552  			retVal = reuse
   553  		}
   554  		if newAlloc {
   555  			freeScalar(scalarHeader.Raw)
   556  		}
   557  		returnHeader(scalarHeader)
   558  		return
   559  	}
   560  
   561  	// handle special case where A and B have both len 1
   562  	if len(dataA.Raw) == int(typ.Size()) && len(dataB.Raw) == int(typ.Size()) {
   563  		switch {
   564  		case same && safe && reuse != nil && leftTensor:
   565  			storage.Copy(typ, dataReuse, dataA)
   566  			err = e.E.GtSame(typ, dataReuse, dataB)
   567  			retVal = reuse
   568  			return
   569  		case same && safe && reuse != nil && !leftTensor:
   570  			storage.Copy(typ, dataReuse, dataB)
   571  			err = e.E.LtSame(typ, dataReuse, dataA)
   572  			retVal = reuse
   573  			return
   574  		}
   575  	}
   576  	// standard
   577  	switch {
   578  	case !safe && same && reuse == nil:
   579  		err = e.E.GtSame(typ, dataA, dataB)
   580  		retVal = a
   581  	case same && safe && reuse != nil && leftTensor:
   582  		storage.Copy(typ, dataReuse, dataA)
   583  		err = e.E.GtSame(typ, dataReuse, dataB)
   584  		retVal = reuse
   585  	case same && safe && reuse != nil && !leftTensor:
   586  		storage.Copy(typ, dataReuse, dataB)
   587  		err = e.E.GtSame(typ, dataA, dataReuse)
   588  		retVal = reuse
   589  	default:
   590  		err = e.E.Gt(typ, dataA, dataB, dataReuse)
   591  		retVal = reuse
   592  	}
   593  	if newAlloc {
   594  		freeScalar(scalarHeader.Raw)
   595  	}
   596  	returnHeader(scalarHeader)
   597  	return
   598  }
   599  
   600  // GteScalar performs t ≥ s elementwise. The leftTensor parameter indicates if the tensor is the left operand. Only scalar types are accepted in s
   601  // Acceptable FuncOpts are: UseUnsafe(), AsSameType(), WithReuse().
   602  // UseUnsafe() will ensure that the same type is returned.
   603  // Tensors used in WithReuse has to have the same Dtype as the return value's Dtype.
   604  func (e StdEng) GteScalar(t Tensor, s interface{}, leftTensor bool, opts ...FuncOpt) (retVal Tensor, err error) {
   605  	if err = unaryCheck(t, ordTypes); err != nil {
   606  		return nil, errors.Wrapf(err, "Gte failed")
   607  	}
   608  
   609  	if err = scalarDtypeCheck(t, s); err != nil {
   610  		return nil, errors.Wrap(err, "Gte failed")
   611  	}
   612  
   613  	var reuse DenseTensor
   614  	var safe, same bool
   615  	if reuse, safe, _, _, same, err = handleFuncOpts(t.Shape(), t.Dtype(), t.DataOrder(), false, opts...); err != nil {
   616  		return nil, errors.Wrap(err, "Unable to handle funcOpts")
   617  	}
   618  	if !safe {
   619  		same = true
   620  	}
   621  	a := t
   622  	typ := t.Dtype().Type
   623  	var ait, bit, iit Iterator
   624  	var dataA, dataB, dataReuse, scalarHeader *storage.Header
   625  	var useIter, newAlloc bool
   626  
   627  	if leftTensor {
   628  		if dataA, dataB, dataReuse, ait, iit, useIter, newAlloc, err = prepDataVS(t, s, reuse); err != nil {
   629  			return nil, errors.Wrapf(err, opFail, "StdEng.Gte")
   630  		}
   631  		scalarHeader = dataB
   632  	} else {
   633  		if dataA, dataB, dataReuse, bit, iit, useIter, newAlloc, err = prepDataSV(s, t, reuse); err != nil {
   634  			return nil, errors.Wrapf(err, opFail, "StdEng.Gte")
   635  		}
   636  		scalarHeader = dataA
   637  	}
   638  
   639  	// check to see if anything needs to be created
   640  	switch {
   641  	case same && safe && reuse == nil:
   642  		reuse = NewDense(a.Dtype(), a.Shape().Clone(), WithEngine(e))
   643  		dataReuse = reuse.hdr()
   644  		if useIter {
   645  			iit = IteratorFromDense(reuse)
   646  		}
   647  	case !same && safe && reuse == nil:
   648  		reuse = NewDense(Bool, a.Shape().Clone(), WithEngine(e))
   649  		dataReuse = reuse.hdr()
   650  		if useIter {
   651  			iit = IteratorFromDense(reuse)
   652  		}
   653  	}
   654  
   655  	if useIter {
   656  		switch {
   657  		case !safe && same && reuse == nil:
   658  			err = e.E.GteSameIter(typ, dataA, dataB, ait, bit)
   659  			retVal = a
   660  		case same && safe && reuse != nil && !leftTensor:
   661  			storage.CopyIter(typ, dataReuse, dataB, iit, bit)
   662  			bit.Reset()
   663  			iit.Reset()
   664  			err = e.E.GteSameIter(typ, dataA, dataReuse, ait, bit)
   665  			retVal = reuse
   666  		case same && safe && reuse != nil && leftTensor:
   667  			storage.CopyIter(typ, dataReuse, dataA, iit, ait)
   668  			ait.Reset()
   669  			iit.Reset()
   670  			err = e.E.GteSameIter(typ, dataReuse, dataB, iit, bit)
   671  			retVal = reuse
   672  		default: // safe && bool
   673  			err = e.E.GteIter(typ, dataA, dataB, dataReuse, ait, bit, iit)
   674  			retVal = reuse
   675  		}
   676  		if newAlloc {
   677  			freeScalar(scalarHeader.Raw)
   678  		}
   679  		returnHeader(scalarHeader)
   680  		return
   681  	}
   682  
   683  	// handle special case where A and B have both len 1
   684  	if len(dataA.Raw) == int(typ.Size()) && len(dataB.Raw) == int(typ.Size()) {
   685  		switch {
   686  		case same && safe && reuse != nil && leftTensor:
   687  			storage.Copy(typ, dataReuse, dataA)
   688  			err = e.E.GteSame(typ, dataReuse, dataB)
   689  			retVal = reuse
   690  			return
   691  		case same && safe && reuse != nil && !leftTensor:
   692  			storage.Copy(typ, dataReuse, dataB)
   693  			err = e.E.LteSame(typ, dataReuse, dataA)
   694  			retVal = reuse
   695  			return
   696  		}
   697  	}
   698  	// standard
   699  	switch {
   700  	case !safe && same && reuse == nil:
   701  		err = e.E.GteSame(typ, dataA, dataB)
   702  		retVal = a
   703  	case same && safe && reuse != nil && leftTensor:
   704  		storage.Copy(typ, dataReuse, dataA)
   705  		err = e.E.GteSame(typ, dataReuse, dataB)
   706  		retVal = reuse
   707  	case same && safe && reuse != nil && !leftTensor:
   708  		storage.Copy(typ, dataReuse, dataB)
   709  		err = e.E.GteSame(typ, dataA, dataReuse)
   710  		retVal = reuse
   711  	default:
   712  		err = e.E.Gte(typ, dataA, dataB, dataReuse)
   713  		retVal = reuse
   714  	}
   715  	if newAlloc {
   716  		freeScalar(scalarHeader.Raw)
   717  	}
   718  	returnHeader(scalarHeader)
   719  	return
   720  }
   721  
   722  // LtScalar performs t < s elementwise. The leftTensor parameter indicates if the tensor is the left operand. Only scalar types are accepted in s
   723  // Acceptable FuncOpts are: UseUnsafe(), AsSameType(), WithReuse().
   724  // UseUnsafe() will ensure that the same type is returned.
   725  // Tensors used in WithReuse has to have the same Dtype as the return value's Dtype.
   726  func (e StdEng) LtScalar(t Tensor, s interface{}, leftTensor bool, opts ...FuncOpt) (retVal Tensor, err error) {
   727  	if err = unaryCheck(t, ordTypes); err != nil {
   728  		return nil, errors.Wrapf(err, "Lt failed")
   729  	}
   730  
   731  	if err = scalarDtypeCheck(t, s); err != nil {
   732  		return nil, errors.Wrap(err, "Lt failed")
   733  	}
   734  
   735  	var reuse DenseTensor
   736  	var safe, same bool
   737  	if reuse, safe, _, _, same, err = handleFuncOpts(t.Shape(), t.Dtype(), t.DataOrder(), false, opts...); err != nil {
   738  		return nil, errors.Wrap(err, "Unable to handle funcOpts")
   739  	}
   740  	if !safe {
   741  		same = true
   742  	}
   743  	a := t
   744  	typ := t.Dtype().Type
   745  	var ait, bit, iit Iterator
   746  	var dataA, dataB, dataReuse, scalarHeader *storage.Header
   747  	var useIter, newAlloc bool
   748  
   749  	if leftTensor {
   750  		if dataA, dataB, dataReuse, ait, iit, useIter, newAlloc, err = prepDataVS(t, s, reuse); err != nil {
   751  			return nil, errors.Wrapf(err, opFail, "StdEng.Lt")
   752  		}
   753  		scalarHeader = dataB
   754  	} else {
   755  		if dataA, dataB, dataReuse, bit, iit, useIter, newAlloc, err = prepDataSV(s, t, reuse); err != nil {
   756  			return nil, errors.Wrapf(err, opFail, "StdEng.Lt")
   757  		}
   758  		scalarHeader = dataA
   759  	}
   760  
   761  	// check to see if anything needs to be created
   762  	switch {
   763  	case same && safe && reuse == nil:
   764  		reuse = NewDense(a.Dtype(), a.Shape().Clone(), WithEngine(e))
   765  		dataReuse = reuse.hdr()
   766  		if useIter {
   767  			iit = IteratorFromDense(reuse)
   768  		}
   769  	case !same && safe && reuse == nil:
   770  		reuse = NewDense(Bool, a.Shape().Clone(), WithEngine(e))
   771  		dataReuse = reuse.hdr()
   772  		if useIter {
   773  			iit = IteratorFromDense(reuse)
   774  		}
   775  	}
   776  
   777  	if useIter {
   778  		switch {
   779  		case !safe && same && reuse == nil:
   780  			err = e.E.LtSameIter(typ, dataA, dataB, ait, bit)
   781  			retVal = a
   782  		case same && safe && reuse != nil && !leftTensor:
   783  			storage.CopyIter(typ, dataReuse, dataB, iit, bit)
   784  			bit.Reset()
   785  			iit.Reset()
   786  			err = e.E.LtSameIter(typ, dataA, dataReuse, ait, bit)
   787  			retVal = reuse
   788  		case same && safe && reuse != nil && leftTensor:
   789  			storage.CopyIter(typ, dataReuse, dataA, iit, ait)
   790  			ait.Reset()
   791  			iit.Reset()
   792  			err = e.E.LtSameIter(typ, dataReuse, dataB, iit, bit)
   793  			retVal = reuse
   794  		default: // safe && bool
   795  			err = e.E.LtIter(typ, dataA, dataB, dataReuse, ait, bit, iit)
   796  			retVal = reuse
   797  		}
   798  		if newAlloc {
   799  			freeScalar(scalarHeader.Raw)
   800  		}
   801  		returnHeader(scalarHeader)
   802  		return
   803  	}
   804  
   805  	// handle special case where A and B have both len 1
   806  	if len(dataA.Raw) == int(typ.Size()) && len(dataB.Raw) == int(typ.Size()) {
   807  		switch {
   808  		case same && safe && reuse != nil && leftTensor:
   809  			storage.Copy(typ, dataReuse, dataA)
   810  			err = e.E.LtSame(typ, dataReuse, dataB)
   811  			retVal = reuse
   812  			return
   813  		case same && safe && reuse != nil && !leftTensor:
   814  			storage.Copy(typ, dataReuse, dataB)
   815  			err = e.E.GtSame(typ, dataReuse, dataA)
   816  			retVal = reuse
   817  			return
   818  		}
   819  	}
   820  	// standard
   821  	switch {
   822  	case !safe && same && reuse == nil:
   823  		err = e.E.LtSame(typ, dataA, dataB)
   824  		retVal = a
   825  	case same && safe && reuse != nil && leftTensor:
   826  		storage.Copy(typ, dataReuse, dataA)
   827  		err = e.E.LtSame(typ, dataReuse, dataB)
   828  		retVal = reuse
   829  	case same && safe && reuse != nil && !leftTensor:
   830  		storage.Copy(typ, dataReuse, dataB)
   831  		err = e.E.LtSame(typ, dataA, dataReuse)
   832  		retVal = reuse
   833  	default:
   834  		err = e.E.Lt(typ, dataA, dataB, dataReuse)
   835  		retVal = reuse
   836  	}
   837  	if newAlloc {
   838  		freeScalar(scalarHeader.Raw)
   839  	}
   840  	returnHeader(scalarHeader)
   841  	return
   842  }
   843  
   844  // LteScalar performs t ≤ s elementwise. The leftTensor parameter indicates if the tensor is the left operand. Only scalar types are accepted in s
   845  // Acceptable FuncOpts are: UseUnsafe(), AsSameType(), WithReuse().
   846  // UseUnsafe() will ensure that the same type is returned.
   847  // Tensors used in WithReuse has to have the same Dtype as the return value's Dtype.
   848  func (e StdEng) LteScalar(t Tensor, s interface{}, leftTensor bool, opts ...FuncOpt) (retVal Tensor, err error) {
   849  	if err = unaryCheck(t, ordTypes); err != nil {
   850  		return nil, errors.Wrapf(err, "Lte failed")
   851  	}
   852  
   853  	if err = scalarDtypeCheck(t, s); err != nil {
   854  		return nil, errors.Wrap(err, "Lte failed")
   855  	}
   856  
   857  	var reuse DenseTensor
   858  	var safe, same bool
   859  	if reuse, safe, _, _, same, err = handleFuncOpts(t.Shape(), t.Dtype(), t.DataOrder(), false, opts...); err != nil {
   860  		return nil, errors.Wrap(err, "Unable to handle funcOpts")
   861  	}
   862  	if !safe {
   863  		same = true
   864  	}
   865  	a := t
   866  	typ := t.Dtype().Type
   867  	var ait, bit, iit Iterator
   868  	var dataA, dataB, dataReuse, scalarHeader *storage.Header
   869  	var useIter, newAlloc bool
   870  
   871  	if leftTensor {
   872  		if dataA, dataB, dataReuse, ait, iit, useIter, newAlloc, err = prepDataVS(t, s, reuse); err != nil {
   873  			return nil, errors.Wrapf(err, opFail, "StdEng.Lte")
   874  		}
   875  		scalarHeader = dataB
   876  	} else {
   877  		if dataA, dataB, dataReuse, bit, iit, useIter, newAlloc, err = prepDataSV(s, t, reuse); err != nil {
   878  			return nil, errors.Wrapf(err, opFail, "StdEng.Lte")
   879  		}
   880  		scalarHeader = dataA
   881  	}
   882  
   883  	// check to see if anything needs to be created
   884  	switch {
   885  	case same && safe && reuse == nil:
   886  		reuse = NewDense(a.Dtype(), a.Shape().Clone(), WithEngine(e))
   887  		dataReuse = reuse.hdr()
   888  		if useIter {
   889  			iit = IteratorFromDense(reuse)
   890  		}
   891  	case !same && safe && reuse == nil:
   892  		reuse = NewDense(Bool, a.Shape().Clone(), WithEngine(e))
   893  		dataReuse = reuse.hdr()
   894  		if useIter {
   895  			iit = IteratorFromDense(reuse)
   896  		}
   897  	}
   898  
   899  	if useIter {
   900  		switch {
   901  		case !safe && same && reuse == nil:
   902  			err = e.E.LteSameIter(typ, dataA, dataB, ait, bit)
   903  			retVal = a
   904  		case same && safe && reuse != nil && !leftTensor:
   905  			storage.CopyIter(typ, dataReuse, dataB, iit, bit)
   906  			bit.Reset()
   907  			iit.Reset()
   908  			err = e.E.LteSameIter(typ, dataA, dataReuse, ait, bit)
   909  			retVal = reuse
   910  		case same && safe && reuse != nil && leftTensor:
   911  			storage.CopyIter(typ, dataReuse, dataA, iit, ait)
   912  			ait.Reset()
   913  			iit.Reset()
   914  			err = e.E.LteSameIter(typ, dataReuse, dataB, iit, bit)
   915  			retVal = reuse
   916  		default: // safe && bool
   917  			err = e.E.LteIter(typ, dataA, dataB, dataReuse, ait, bit, iit)
   918  			retVal = reuse
   919  		}
   920  		if newAlloc {
   921  			freeScalar(scalarHeader.Raw)
   922  		}
   923  		returnHeader(scalarHeader)
   924  		return
   925  	}
   926  
   927  	// handle special case where A and B have both len 1
   928  	if len(dataA.Raw) == int(typ.Size()) && len(dataB.Raw) == int(typ.Size()) {
   929  		switch {
   930  		case same && safe && reuse != nil && leftTensor:
   931  			storage.Copy(typ, dataReuse, dataA)
   932  			err = e.E.LteSame(typ, dataReuse, dataB)
   933  			retVal = reuse
   934  			return
   935  		case same && safe && reuse != nil && !leftTensor:
   936  			storage.Copy(typ, dataReuse, dataB)
   937  			err = e.E.GteSame(typ, dataReuse, dataA)
   938  			retVal = reuse
   939  			return
   940  		}
   941  	}
   942  	// standard
   943  	switch {
   944  	case !safe && same && reuse == nil:
   945  		err = e.E.LteSame(typ, dataA, dataB)
   946  		retVal = a
   947  	case same && safe && reuse != nil && leftTensor:
   948  		storage.Copy(typ, dataReuse, dataA)
   949  		err = e.E.LteSame(typ, dataReuse, dataB)
   950  		retVal = reuse
   951  	case same && safe && reuse != nil && !leftTensor:
   952  		storage.Copy(typ, dataReuse, dataB)
   953  		err = e.E.LteSame(typ, dataA, dataReuse)
   954  		retVal = reuse
   955  	default:
   956  		err = e.E.Lte(typ, dataA, dataB, dataReuse)
   957  		retVal = reuse
   958  	}
   959  	if newAlloc {
   960  		freeScalar(scalarHeader.Raw)
   961  	}
   962  	returnHeader(scalarHeader)
   963  	return
   964  }
   965  
   966  func (e StdEng) EqScalar(t Tensor, s interface{}, leftTensor bool, opts ...FuncOpt) (retVal Tensor, err error) {
   967  	if err = unaryCheck(t, eqTypes); err != nil {
   968  		return nil, errors.Wrapf(err, "Eq failed")
   969  	}
   970  
   971  	if err = scalarDtypeCheck(t, s); err != nil {
   972  		return nil, errors.Wrap(err, "Eq failed")
   973  	}
   974  
   975  	var reuse DenseTensor
   976  	var safe, same bool
   977  	if reuse, safe, _, _, same, err = handleFuncOpts(t.Shape(), t.Dtype(), t.DataOrder(), false, opts...); err != nil {
   978  		return nil, errors.Wrap(err, "Unable to handle funcOpts")
   979  	}
   980  	if !safe {
   981  		same = true
   982  	}
   983  	a := t
   984  	typ := t.Dtype().Type
   985  	var ait, bit, iit Iterator
   986  	var dataA, dataB, dataReuse, scalarHeader *storage.Header
   987  	var useIter, newAlloc bool
   988  
   989  	if leftTensor {
   990  		if dataA, dataB, dataReuse, ait, iit, useIter, newAlloc, err = prepDataVS(t, s, reuse); err != nil {
   991  			return nil, errors.Wrapf(err, opFail, "StdEng.Eq")
   992  		}
   993  		scalarHeader = dataB
   994  	} else {
   995  		if dataA, dataB, dataReuse, bit, iit, useIter, newAlloc, err = prepDataSV(s, t, reuse); err != nil {
   996  			return nil, errors.Wrapf(err, opFail, "StdEng.Eq")
   997  		}
   998  		scalarHeader = dataA
   999  	}
  1000  
  1001  	// check to see if anything needs to be created
  1002  	switch {
  1003  	case same && safe && reuse == nil:
  1004  		reuse = NewDense(a.Dtype(), a.Shape().Clone(), WithEngine(e))
  1005  		dataReuse = reuse.hdr()
  1006  		if useIter {
  1007  			iit = IteratorFromDense(reuse)
  1008  		}
  1009  	case !same && safe && reuse == nil:
  1010  		reuse = NewDense(Bool, a.Shape().Clone(), WithEngine(e))
  1011  		dataReuse = reuse.hdr()
  1012  		if useIter {
  1013  			iit = IteratorFromDense(reuse)
  1014  		}
  1015  	}
  1016  
  1017  	if useIter {
  1018  		switch {
  1019  		case !safe && same && reuse == nil:
  1020  			err = e.E.EqSameIter(typ, dataA, dataB, ait, bit)
  1021  			retVal = a
  1022  		case same && safe && reuse != nil && !leftTensor:
  1023  			storage.CopyIter(typ, dataReuse, dataB, iit, bit)
  1024  			bit.Reset()
  1025  			iit.Reset()
  1026  			err = e.E.EqSameIter(typ, dataA, dataReuse, ait, bit)
  1027  			retVal = reuse
  1028  		case same && safe && reuse != nil && leftTensor:
  1029  			storage.CopyIter(typ, dataReuse, dataA, iit, ait)
  1030  			ait.Reset()
  1031  			iit.Reset()
  1032  			err = e.E.EqSameIter(typ, dataReuse, dataB, iit, bit)
  1033  			retVal = reuse
  1034  		default: // safe && bool
  1035  			err = e.E.EqIter(typ, dataA, dataB, dataReuse, ait, bit, iit)
  1036  			retVal = reuse
  1037  		}
  1038  		if newAlloc {
  1039  			freeScalar(scalarHeader.Raw)
  1040  		}
  1041  		returnHeader(scalarHeader)
  1042  		return
  1043  	}
  1044  
  1045  	// handle special case where A and B have both len 1
  1046  	if len(dataA.Raw) == int(typ.Size()) && len(dataB.Raw) == int(typ.Size()) {
  1047  		switch {
  1048  		case same && safe && reuse != nil && leftTensor:
  1049  			storage.Copy(typ, dataReuse, dataA)
  1050  			err = e.E.EqSame(typ, dataReuse, dataB)
  1051  			retVal = reuse
  1052  			return
  1053  		case same && safe && reuse != nil && !leftTensor:
  1054  			storage.Copy(typ, dataReuse, dataB)
  1055  			err = e.E.EqSame(typ, dataReuse, dataA)
  1056  			retVal = reuse
  1057  			return
  1058  		}
  1059  	}
  1060  	// standard
  1061  	switch {
  1062  	case !safe && same && reuse == nil:
  1063  		err = e.E.EqSame(typ, dataA, dataB)
  1064  		retVal = a
  1065  	case same && safe && reuse != nil && leftTensor:
  1066  		storage.Copy(typ, dataReuse, dataA)
  1067  		err = e.E.EqSame(typ, dataReuse, dataB)
  1068  		retVal = reuse
  1069  	case same && safe && reuse != nil && !leftTensor:
  1070  		storage.Copy(typ, dataReuse, dataB)
  1071  		err = e.E.EqSame(typ, dataA, dataReuse)
  1072  		retVal = reuse
  1073  	default:
  1074  		err = e.E.Eq(typ, dataA, dataB, dataReuse)
  1075  		retVal = reuse
  1076  	}
  1077  	if newAlloc {
  1078  		freeScalar(scalarHeader.Raw)
  1079  	}
  1080  	returnHeader(scalarHeader)
  1081  	return
  1082  }
  1083  
  1084  func (e StdEng) NeScalar(t Tensor, s interface{}, leftTensor bool, opts ...FuncOpt) (retVal Tensor, err error) {
  1085  	if err = unaryCheck(t, eqTypes); err != nil {
  1086  		return nil, errors.Wrapf(err, "Ne failed")
  1087  	}
  1088  
  1089  	if err = scalarDtypeCheck(t, s); err != nil {
  1090  		return nil, errors.Wrap(err, "Ne failed")
  1091  	}
  1092  
  1093  	var reuse DenseTensor
  1094  	var safe, same bool
  1095  	if reuse, safe, _, _, same, err = handleFuncOpts(t.Shape(), t.Dtype(), t.DataOrder(), false, opts...); err != nil {
  1096  		return nil, errors.Wrap(err, "Unable to handle funcOpts")
  1097  	}
  1098  	if !safe {
  1099  		same = true
  1100  	}
  1101  	a := t
  1102  	typ := t.Dtype().Type
  1103  	var ait, bit, iit Iterator
  1104  	var dataA, dataB, dataReuse, scalarHeader *storage.Header
  1105  	var useIter, newAlloc bool
  1106  
  1107  	if leftTensor {
  1108  		if dataA, dataB, dataReuse, ait, iit, useIter, newAlloc, err = prepDataVS(t, s, reuse); err != nil {
  1109  			return nil, errors.Wrapf(err, opFail, "StdEng.Ne")
  1110  		}
  1111  		scalarHeader = dataB
  1112  	} else {
  1113  		if dataA, dataB, dataReuse, bit, iit, useIter, newAlloc, err = prepDataSV(s, t, reuse); err != nil {
  1114  			return nil, errors.Wrapf(err, opFail, "StdEng.Ne")
  1115  		}
  1116  		scalarHeader = dataA
  1117  	}
  1118  
  1119  	// check to see if anything needs to be created
  1120  	switch {
  1121  	case same && safe && reuse == nil:
  1122  		reuse = NewDense(a.Dtype(), a.Shape().Clone(), WithEngine(e))
  1123  		dataReuse = reuse.hdr()
  1124  		if useIter {
  1125  			iit = IteratorFromDense(reuse)
  1126  		}
  1127  	case !same && safe && reuse == nil:
  1128  		reuse = NewDense(Bool, a.Shape().Clone(), WithEngine(e))
  1129  		dataReuse = reuse.hdr()
  1130  		if useIter {
  1131  			iit = IteratorFromDense(reuse)
  1132  		}
  1133  	}
  1134  
  1135  	if useIter {
  1136  		switch {
  1137  		case !safe && same && reuse == nil:
  1138  			err = e.E.NeSameIter(typ, dataA, dataB, ait, bit)
  1139  			retVal = a
  1140  		case same && safe && reuse != nil && !leftTensor:
  1141  			storage.CopyIter(typ, dataReuse, dataB, iit, bit)
  1142  			bit.Reset()
  1143  			iit.Reset()
  1144  			err = e.E.NeSameIter(typ, dataA, dataReuse, ait, bit)
  1145  			retVal = reuse
  1146  		case same && safe && reuse != nil && leftTensor:
  1147  			storage.CopyIter(typ, dataReuse, dataA, iit, ait)
  1148  			ait.Reset()
  1149  			iit.Reset()
  1150  			err = e.E.NeSameIter(typ, dataReuse, dataB, iit, bit)
  1151  			retVal = reuse
  1152  		default: // safe && bool
  1153  			err = e.E.NeIter(typ, dataA, dataB, dataReuse, ait, bit, iit)
  1154  			retVal = reuse
  1155  		}
  1156  		if newAlloc {
  1157  			freeScalar(scalarHeader.Raw)
  1158  		}
  1159  		returnHeader(scalarHeader)
  1160  		return
  1161  	}
  1162  
  1163  	// handle special case where A and B have both len 1
  1164  	if len(dataA.Raw) == int(typ.Size()) && len(dataB.Raw) == int(typ.Size()) {
  1165  		switch {
  1166  		case same && safe && reuse != nil && leftTensor:
  1167  			storage.Copy(typ, dataReuse, dataA)
  1168  			err = e.E.NeSame(typ, dataReuse, dataB)
  1169  			retVal = reuse
  1170  			return
  1171  		case same && safe && reuse != nil && !leftTensor:
  1172  			storage.Copy(typ, dataReuse, dataB)
  1173  			err = e.E.NeSame(typ, dataReuse, dataA)
  1174  			retVal = reuse
  1175  			return
  1176  		}
  1177  	}
  1178  	// standard
  1179  	switch {
  1180  	case !safe && same && reuse == nil:
  1181  		err = e.E.NeSame(typ, dataA, dataB)
  1182  		retVal = a
  1183  	case same && safe && reuse != nil && leftTensor:
  1184  		storage.Copy(typ, dataReuse, dataA)
  1185  		err = e.E.NeSame(typ, dataReuse, dataB)
  1186  		retVal = reuse
  1187  	case same && safe && reuse != nil && !leftTensor:
  1188  		storage.Copy(typ, dataReuse, dataB)
  1189  		err = e.E.NeSame(typ, dataA, dataReuse)
  1190  		retVal = reuse
  1191  	default:
  1192  		err = e.E.Ne(typ, dataA, dataB, dataReuse)
  1193  		retVal = reuse
  1194  	}
  1195  	if newAlloc {
  1196  		freeScalar(scalarHeader.Raw)
  1197  	}
  1198  	returnHeader(scalarHeader)
  1199  	return
  1200  }