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 }