@shumai/shumai
Version:
A fast, network-connected, differentiable tensor library for TypeScript (and JavaScript). Built with bun + flashlight for software engineers and researchers alike.
1,777 lines (1,462 loc) • 69.5 kB
text/typescript
/* GENERATED CODE (gen_binding.py) */
import { arrayArg } from '../ffi/ffi_bind_utils'
import { fl } from '../ffi/ffi_flashlight'
import { stats } from '../stats'
import { Tensor } from './tensor'
/**
*
* Generate a uniform distribution.
*
* @remarks
* For a normal (Gaussian) distribution, see {@link randn}.
*
* @example
* ```javascript
* // 128x8 uniformly random tensor
* const t = sm.rand([128, 8])
* ```
*
* @param shape - The shape of the output {@link Tensor}
*
* @returns A new {@link Tensor} of uniformly random values
*/ export function rand(shape: BigInt64Array | number[]) {
const [shape_ptr, shape_len] = arrayArg(shape)
const i = []
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('rand')
const _ptr = fl._rand.native(shape_ptr, shape_len)
if (!_ptr)
throw new Error('Tensor returned from `rand` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = false
const deps = requires_grad ? [shape] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'rand'
return t
}
/**
*
* Generate a normal (Gaussian) distribution.
*
* @remarks
* For a uniform distribution, see {@link rand}.
*
* @example
* ```javascript
* // 128x8 gaussian tensor
* const t = sm.randn([128, 8])
* ```
*
* @param shape - The shape of the output {@link Tensor}
*
* @returns A new {@link Tensor} of random values sampled from a Gaussian distribution
*/ export function randn(shape: BigInt64Array | number[]) {
const [shape_ptr, shape_len] = arrayArg(shape)
const i = []
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('randn')
const _ptr = fl._randn.native(shape_ptr, shape_len)
if (!_ptr)
throw new Error('Tensor returned from `randn` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = false
const deps = requires_grad ? [shape] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'randn'
return t
}
/**
*
* Create a {@link Tensor} filled with a single value.
*
* @example
* ```javascript
* // 128x8 tensor of all 1s
* const t = sm.full([128, 8], 1)
* ```
*
* @param shape - The shape of the output {@link Tensor}
* @param val - The value used to fill the output
*
* @returns A new {@link Tensor} of a single user specified value.
*/ export function full(shape: BigInt64Array | number[], val: number) {
const [shape_ptr, shape_len] = arrayArg(shape)
const i = []
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('full')
const _ptr = fl._full.native(shape_ptr, shape_len, Math.fround(val))
if (!_ptr)
throw new Error('Tensor returned from `full` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = false
const deps = requires_grad ? [shape, Math.fround(val)] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'full'
return t
}
/**
*
* Create a square 2D identity {@link Tensor}.
*
* @remarks
* This is similar to the `eye` API of other tensor frameworks.
*
* @example
* ```javascript
* // 128x128 identity tensor
* const t = sm.identity(128)
* ```
*
* @param dim - The dimension of the output {@link Tensor}
*
* @returns A new identity {@link Tensor}.
*/ export function identity(dim: number) {
const i = []
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('identity')
const _ptr = fl._identity.native(dim.constructor === BigInt ? dim : BigInt(dim || 0))
if (!_ptr)
throw new Error('Tensor returned from `identity` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = false
const deps = requires_grad ? [dim.constructor === BigInt ? dim : BigInt(dim || 0)] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'identity'
return t
}
export function ident(dim: number) {
return identity(dim)
}
export function eye(dim: number) {
return identity(dim)
}
/**
*
* Create a {@link Tensor} of evenly-spaced values in a given interval.
*
* @example
* ```javascript
* // create a tensor of even values starting with 0: `[0,2,4,8]`
* const t = sm.arange(0, 10, 2)
* ```
*
* @param start - The start of the interval (inclusive)
* @param end - The end of the interval (exclusive)
* @param step - An optional argument to stride the interval
*
* @returns A new 1D {@link Tensor} containing the user defined interval.
*/ export function arange(start: number, end: number, step = 1) {
const i = []
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('arange')
const _ptr = fl._arange.native(Math.fround(start), Math.fround(end), Math.fround(step))
if (!_ptr)
throw new Error('Tensor returned from `arange` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = false
const deps = requires_grad ? [Math.fround(start), Math.fround(end), Math.fround(step)] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'arange'
return t
}
/**
*
* Tile a {@link Tensor} of N-dimensionally shaped ranges.
*
* @example
* ```javascript
* const t0 = sm.iota([2, 2], [2])
* // same as
* const t1 = sm.arange(0, 4).reshape([2, 2]).tile([2])
* ```
*
* @param dims - The dimension of the intermediate (untiled tensor). This shape determines the range of the values within the output.
* @param tileDims - How to tile the intermediate tensor.
* @returns A new {@link Tensor}
*/ export function iota(dims: BigInt64Array | number[], tileDims: BigInt64Array | number[] = [1]) {
const [dims_ptr, dims_len] = arrayArg(dims)
const [tileDims_ptr, tileDims_len] = arrayArg(tileDims)
const i = []
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('iota')
const _ptr = fl._iota.native(dims_ptr, dims_len, tileDims_ptr, tileDims_len)
if (!_ptr)
throw new Error('Tensor returned from `iota` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = false
const deps = requires_grad ? [dims, tileDims] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'iota'
return t
}
/**
*
* Reshape a {@link Tensor} without modifying the underlying data. There is a method version of this static function: {@link Tensor.reshape | Tensor.reshape }.
*
* @remarks
* The resultant shape must contain the same number of elements as the base Tensor.
*
* @example
*
* ```javascript
* const t = sm.randn([64])
*
* // equivalent calls
* const a = t.reshape([8, 8])
* const b = sm.reshape(t, [8, 8])
* ```
*
*
* @param tensor - {@link Tensor} to reshape
* @param shape - The shape of the output {@link Tensor}
*/ export function reshape(tensor: Tensor, shape: BigInt64Array | number[]) {
const [shape_ptr, shape_len] = arrayArg(shape)
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('reshape')
const _ptr = fl._reshape.native(tensor.ptr, shape_ptr, shape_len)
if (!_ptr)
throw new Error('Tensor returned from `reshape` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor, shape] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'reshape'
return t
}
/**
*
* Re-arrange the layout of the values within a {@link Tensor}. There is a method version of this static function: {@link Tensor.transpose | Tensor.transpose }.
*
* @remarks
* The total number of elements of the tensor does not change.
*
* @example
* ```javascript
* const t = sm.rand([128, 8])
*
* // equivalent calls
* const a = t.transpose([1, 0])
* a.shape // [8, 128]
* const b = sm.transpose(t, [1, 0])
* b.shape // [8, 128]
* ```
*
* @param tensor - {@link Tensor} to transpose
* @param axes - The new order of the indices of the current axes after tranposing
* @returns A new {@link Tensor}
*/ export function transpose(tensor: Tensor, axes: BigInt64Array | number[]) {
const [axes_ptr, axes_len] = arrayArg(axes)
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('transpose')
const _ptr = fl._transpose.native(tensor.ptr, axes_ptr, axes_len)
if (!_ptr)
throw new Error(
'Tensor returned from `transpose` is null; native code likely threw an error...'
)
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor, axes] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'transpose'
return t
}
/**
*
* Replicate a {@link Tensor} about its axes. There is a method version of this static function: {@link Tensor.tile | Tensor.tile }.
*
* @example
*
* ```javascript
* const t = sm.identity(4)
*
* // equivalent calls
* const a = sm.tile(t, [2, 2])
* a.shape // [8, 8]
* const b = t.tile([2, 2])
* b.shape // [8, 8]
*
* // tiling by 1 on all dims does nothing
* const no_op = t.tile([1, 1])
* ```
*
* @param tensor - {@link Tensor} to tile
* @param shape - A shape describing the number of iterations to tile each axis.
* @returns A new {@link Tensor}
*/ export function tile(tensor: Tensor, shape: BigInt64Array | number[]) {
const [shape_ptr, shape_len] = arrayArg(shape)
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('tile')
const _ptr = fl._tile.native(tensor.ptr, shape_ptr, shape_len)
if (!_ptr)
throw new Error('Tensor returned from `tile` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor, shape] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'tile'
return t
}
export function concatenate(tensors: Array<Tensor>, axis: number) {
if (axis < 0) {
for (let i = 0; i < tensors.length; ++i) {
if (tensors[i].shape.length === 0) {
tensors[i] = tensors[i].reshape([1])
}
}
}
const [tensors_ptr, tensors_len] = arrayArg(tensors)
const i = []
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('concatenate')
const _ptr = fl._concatenate.native(tensors_ptr, tensors_len, axis | 0)
if (!_ptr)
throw new Error(
'Tensor returned from `concatenate` is null; native code likely threw an error...'
)
trace && s.stopTrace(trace)
const requires_grad = tensors.reduce((r, c) => r || c.requires_grad, false)
const deps = requires_grad ? [...tensors, axis | 0] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensors.reduce((r, c) => r || c.provenance, 0)
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'concatenate'
return t
}
export function concat(tensors: Array<Tensor>, axis: number) {
return concatenate(tensors, axis)
}
/**
*
* Determine the indices of elements that are non-zero. There is a method version of this static function: {@link Tensor.nonzero | Tensor.nonzero }.
*
* @remarks
*
* Indices correspond to a flattened version of the input tensor.
*
* @example
*
* ```javascript
* const t = sm.randn([100])
*
* // equivalent calls
* const a = t.nonzero()
* const b = sm.nonzero(t)
* ```
*
* @param tensor - {@link Tensor} whose values will be used to find indices
* @returns - A new {@link Tensor} composed of the flattened indices of the non-zero elements in the input
*/ export function nonzero(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('nonzero')
const _ptr = fl._nonzero.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `nonzero` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'nonzero'
return t
}
/**
*
* Negate a tensor. There is a method version of this static function: {@link Tensor.negative | Tensor.negative }.
*
* $$-x : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.randn([100])
*
* // equivalent calls
* const a = t.negative()
* const b = sm.negative(t)
* ```
*
* @param tensor - {@link Tensor} whose values will be negated
* @returns - A new {@link Tensor}
*/ export function negative(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('negative')
const _ptr = fl._negative.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `negative` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'negative'
return t
}
export function negate(tensor: Tensor) {
return negative(tensor)
}
/**
*
* Take the logical `not` of every element in a tensor. There is a method version of this static function: {@link Tensor.logicalNot | Tensor.logicalNot }.
*
* $$\neg x : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.rand([100]).greaterThan(sm.scalar(0.5))
*
* // equivalent calls
* const a = t.logicalNot()
* const b = sm.logicalNot(t)
* ```
*
* @param tensor - {@link Tensor} whose values will be logically inverted
* @returns - A new {@link Tensor}
*/ export function logicalNot(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('logicalNot')
const _ptr = fl._logicalNot.native(tensor.ptr)
if (!_ptr)
throw new Error(
'Tensor returned from `logicalNot` is null; native code likely threw an error...'
)
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'logicalNot'
return t
}
/**
*
* Compute the exponential of each element in a tensor. There is a method version of this static function: {@link Tensor.exp | Tensor.exp }.
*
* $$e^x : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.randn([100])
*
* // equivalent calls
* const a = t.exp()
* const b = sm.exp(t)
* ```
*
* @param tensor - {@link Tensor} whose values will be exponentiated
* @returns - A new {@link Tensor}
*/ export function exp(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('exp')
const _ptr = fl._exp.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `exp` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'exp'
return t
}
/**
*
* Compute the natural logarithm of each element in a tensor. There is a method version of this static function: {@link Tensor.log | Tensor.log }.
*
* $$\ln(x) : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.randn([100])
*
* // equivalent calls
* const a = t.log()
* const b = sm.log(t)
* ```
*
* @param tensor - {@link Tensor} whose values will have their natural logarithm calculated
* @returns - A new {@link Tensor}
*/ export function log(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('log')
const _ptr = fl._log.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `log` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'log'
return t
}
/**
*
* Compute the natural logarithm of one plus each element in a tensor. There is a method version of this static function: {@link Tensor.log1p | Tensor.log1p }.
*
* $$\ln(1 + x) : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.randn([100])
*
* // equivalent calls
* const a = t.log1p()
* const b = sm.log1p(t)
* ```
*
* @param tensor - {@link Tensor} whose values will have one added before their natural logarithm is calculated
* @returns - A new {@link Tensor}
*/ export function log1p(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('log1p')
const _ptr = fl._log1p.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `log1p` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'log1p'
return t
}
/**
*
* Compute the sine function each element in a tensor. There is a method version of this static function: {@link Tensor.sin | Tensor.sin }.
*
* $$\sin(x) : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.randn([128, 128])
*
* // equivalent calls
* const a = t.sin()
* const b = sm.sin(t)
* ```
*
* @param tensor - {@link Tensor} whose values will have their sine calculated
* @returns - A new {@link Tensor}
*/ export function sin(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('sin')
const _ptr = fl._sin.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `sin` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'sin'
return t
}
/**
*
* Compute the cosine function each element in a tensor. There is a method version of this static function: {@link Tensor.cos | Tensor.cos }.
*
* $$\cos(x) : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.randn([128, 128])
*
* // equivalent calls
* const a = t.cos()
* const b = sm.cos(t)
* ```
*
* @param tensor - {@link Tensor} whose values will have their cosine calculated
* @returns - A new {@link Tensor}
*/ export function cos(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('cos')
const _ptr = fl._cos.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `cos` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'cos'
return t
}
/**
*
* Compute the square root of each element in a tensor. There is a method version of this static function: {@link Tensor.sqrt | Tensor.sqrt }.
*
* $$\sqrt x : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.randn([128, 128])
*
* // equivalent calls
* const a = t.sqrt()
* const b = sm.sqrt(t)
* ```
*
* @param tensor - {@link Tensor} whose values will have their square root calculated
* @returns - A new {@link Tensor}
*/ export function sqrt(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('sqrt')
const _ptr = fl._sqrt.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `sqrt` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'sqrt'
return t
}
/**
*
* Compute the hyperbolic tangent function each element in a tensor. There is a method version of this static function: {@link Tensor.tanh | Tensor.tanh }.
*
* $$\tanh(x) : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.randn([128, 128])
*
* // equivalent calls
* const a = t.tanh()
* const b = sm.tanh(t)
* ```
*
* @param tensor - {@link Tensor} whose values will have their hyperbolic tangent calculated
* @returns - A new {@link Tensor}
*/ export function tanh(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('tanh')
const _ptr = fl._tanh.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `tanh` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'tanh'
return t
}
/**
*
* Compute the mathematical floor (round down) of each element in a tensor. There is a method version of this static function: {@link Tensor.floor | Tensor.floor }.
*
* $$\lfloor x \rfloor : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.randn([128, 128])
*
* // equivalent calls
* const a = t.floor()
* const b = sm.floor(t)
* ```
*
* @param tensor - {@link Tensor} whose values will have their mathematical floor calculated
* @returns - A new {@link Tensor}
*/ export function floor(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('floor')
const _ptr = fl._floor.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `floor` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'floor'
return t
}
/**
*
* Compute the mathematical ceiling (round up) of each element in a tensor. There is a method version of this static function: {@link Tensor.ceil | Tensor.ceil }.
*
* $$\lceil x \rceil : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.randn([128, 128])
*
* // equivalent calls
* const a = t.ceil()
* const b = sm.ceil(t)
* ```
*
* @param tensor - {@link Tensor} whose values will have their mathematical ceiling calculated
* @returns - A new {@link Tensor}
*/ export function ceil(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('ceil')
const _ptr = fl._ceil.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `ceil` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'ceil'
return t
}
/**
*
* Round each element in a tensor to the nearest integer. There is a method version of this static function: {@link Tensor.rint | Tensor.rint }.
*
* $$
* x =
* \begin\{cases\}
* \lfloor x \rfloor,& \text\{if \} x - \lfloor x \rfloor \leq \frac\{1\}\{2\}\\\\
* \lceil x \rceil,& \text\{otherwise\}
* \end\{cases\}
* \forall x \in T
* $$
*
* @example
*
* ```javascript
* const t = sm.randn([128, 128])
*
* // equivalent calls
* const a = t.rint()
* const b = sm.rint(t)
* ```
*
* @param tensor - {@link Tensor} whose values will be rounded to the nearest integer
* @returns - A new {@link Tensor}
*/ export function rint(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('rint')
const _ptr = fl._rint.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `rint` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'rint'
return t
}
/**
*
* Calculate the absolute value for every element in a {@link Tensor}. There is a method version of this static function: {@link Tensor.absolute | Tensor.absolute }.
*
* $$|x| : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.randn([128, 128])
*
* // equivalent calls
* const a = t.absolute()
* const b = sm.absolute(t)
* ```
*
* @param tensor - {@link Tensor} whose values will have their absolute value calculated
* @returns - A new {@link Tensor}
*/ export function absolute(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('absolute')
const _ptr = fl._absolute.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `absolute` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'absolute'
return t
}
export function abs(tensor: Tensor) {
return absolute(tensor)
}
/**
*
* Calculate the sigmoid (logistic function) for each element in a {@link Tensor}. There is a method version of this static function: {@link Tensor.sigmoid | Tensor.sigmoid }.
*
* $$\frac\{1\}\{1 + e^\{-x\}\} : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.randn([1337])
*
* // equivalent calls
* const a = t.sigmoid()
* const b = sm.sigmoid(t)
* ```
*
* @param tensor - {@link Tensor} whose values will have their sigmoid calculated
* @returns - A new {@link Tensor}
*/ export function sigmoid(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('sigmoid')
const _ptr = fl._sigmoid.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `sigmoid` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'sigmoid'
return t
}
/**
*
* Calculate the error function ({@link https://en.wikipedia.org/wiki/Error_function | Wikipedia entry}) for each element in a {@link Tensor}. There is a method version of this static function: {@link Tensor.erf | Tensor.erf }.
*
* $$\frac\{2\}\{\sqrt\{\pi\}\}\int_0^\{x\} e^\{-t^2\} dt : \forall x \in T$$
*
* @example
*
* ```javascript
* const t = sm.randn([1337])
*
* // equivalent calls
* const a = t.erf()
* const b = sm.erf(t)
* ```
*
* @param tensor - {@link Tensor} whose values will have their error function calculated
* @returns - A new {@link Tensor}
*/ export function erf(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('erf')
const _ptr = fl._erf.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `erf` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'erf'
return t
}
export function flip(tensor: Tensor, dim: number) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('flip')
const _ptr = fl._flip.native(
tensor.ptr,
dim <= 0 ? 0 : dim >= 0xffffffff ? 0xffffffff : +dim || 0
)
if (!_ptr)
throw new Error('Tensor returned from `flip` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad
? [tensor, dim <= 0 ? 0 : dim >= 0xffffffff ? 0xffffffff : +dim || 0]
: []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'flip'
return t
}
export function clip(tensor: Tensor, low: Tensor, high: Tensor) {
const i = [tensor, low, high]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('clip')
const _ptr = fl._clip.native(tensor.ptr, low.ptr, high.ptr)
if (!_ptr)
throw new Error('Tensor returned from `clip` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || low.requires_grad || high.requires_grad
const deps = requires_grad ? [tensor, low, high] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || low.provenance || high.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'clip'
return t
}
export function roll(tensor: Tensor, shift: number, axis: number) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('roll')
const _ptr = fl._roll.native(tensor.ptr, shift | 0, axis | 0)
if (!_ptr)
throw new Error('Tensor returned from `roll` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor, shift | 0, axis | 0] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'roll'
return t
}
export function isnan(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('isnan')
const _ptr = fl._isnan.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `isnan` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'isnan'
return t
}
export function isinf(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('isinf')
const _ptr = fl._isinf.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `isinf` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'isinf'
return t
}
export function sign(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('sign')
const _ptr = fl._sign.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `sign` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'sign'
return t
}
export function tril(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('tril')
const _ptr = fl._tril.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `tril` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'tril'
return t
}
export function triu(tensor: Tensor) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('triu')
const _ptr = fl._triu.native(tensor.ptr)
if (!_ptr)
throw new Error('Tensor returned from `triu` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad ? [tensor] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'triu'
return t
}
export function where(cond: Tensor, x: Tensor, y: Tensor) {
const i = [cond, x, y]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('where')
const _ptr = fl._where.native(cond.ptr, x.ptr, y.ptr)
if (!_ptr)
throw new Error('Tensor returned from `where` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = cond.requires_grad || x.requires_grad || y.requires_grad
const deps = requires_grad ? [cond, x, y] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = cond.provenance || x.provenance || y.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'where'
return t
}
export function sort(tensor: Tensor, dim: number) {
const i = [tensor]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('sort')
const _ptr = fl._sort.native(
tensor.ptr,
dim <= 0 ? 0 : dim >= 0xffffffff ? 0xffffffff : +dim || 0
)
if (!_ptr)
throw new Error('Tensor returned from `sort` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad
const deps = requires_grad
? [tensor, dim <= 0 ? 0 : dim >= 0xffffffff ? 0xffffffff : +dim || 0]
: []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'sort'
return t
}
export function add(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('add')
const _ptr = fl._add.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error('Tensor returned from `add` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || other.requires_grad
const deps = requires_grad ? [tensor, other] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || other.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'add'
return t
}
export function sub(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('sub')
const _ptr = fl._sub.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error('Tensor returned from `sub` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || other.requires_grad
const deps = requires_grad ? [tensor, other] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || other.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'sub'
return t
}
export function mul(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('mul')
const _ptr = fl._mul.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error('Tensor returned from `mul` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || other.requires_grad
const deps = requires_grad ? [tensor, other] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || other.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'mul'
return t
}
export function div(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('div')
const _ptr = fl._div.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error('Tensor returned from `div` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || other.requires_grad
const deps = requires_grad ? [tensor, other] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || other.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'div'
return t
}
export function eq(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('eq')
const _ptr = fl._eq.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error('Tensor returned from `eq` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || other.requires_grad
const deps = requires_grad ? [tensor, other] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || other.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'eq'
return t
}
export function neq(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('neq')
const _ptr = fl._neq.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error('Tensor returned from `neq` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || other.requires_grad
const deps = requires_grad ? [tensor, other] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || other.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'neq'
return t
}
export function lessThan(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('lessThan')
const _ptr = fl._lessThan.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error('Tensor returned from `lessThan` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || other.requires_grad
const deps = requires_grad ? [tensor, other] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || other.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'lessThan'
return t
}
export function lt(tensor: Tensor, other: Tensor) {
return lessThan(tensor, other)
}
export function lessThanEqual(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('lessThanEqual')
const _ptr = fl._lessThanEqual.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error(
'Tensor returned from `lessThanEqual` is null; native code likely threw an error...'
)
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || other.requires_grad
const deps = requires_grad ? [tensor, other] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || other.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'lessThanEqual'
return t
}
export function lte(tensor: Tensor, other: Tensor) {
return lessThanEqual(tensor, other)
}
export function greaterThan(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('greaterThan')
const _ptr = fl._greaterThan.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error(
'Tensor returned from `greaterThan` is null; native code likely threw an error...'
)
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || other.requires_grad
const deps = requires_grad ? [tensor, other] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || other.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'greaterThan'
return t
}
export function gt(tensor: Tensor, other: Tensor) {
return greaterThan(tensor, other)
}
export function greaterThanEqual(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('greaterThanEqual')
const _ptr = fl._greaterThanEqual.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error(
'Tensor returned from `greaterThanEqual` is null; native code likely threw an error...'
)
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || other.requires_grad
const deps = requires_grad ? [tensor, other] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || other.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'greaterThanEqual'
return t
}
export function gte(tensor: Tensor, other: Tensor) {
return greaterThanEqual(tensor, other)
}
export function logicalOr(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('logicalOr')
const _ptr = fl._logicalOr.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error(
'Tensor returned from `logicalOr` is null; native code likely threw an error...'
)
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || other.requires_grad
const deps = requires_grad ? [tensor, other] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || other.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'logicalOr'
return t
}
export function logicalAnd(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('logicalAnd')
const _ptr = fl._logicalAnd.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error(
'Tensor returned from `logicalAnd` is null; native code likely threw an error...'
)
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || other.requires_grad
const deps = requires_grad ? [tensor, other] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || other.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'logicalAnd'
return t
}
export function mod(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('mod')
const _ptr = fl._mod.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error('Tensor returned from `mod` is null; native code likely threw an error...')
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_grad || other.requires_grad
const deps = requires_grad ? [tensor, other] : []
const t = new Tensor({ _ptr: _ptr, _deps: deps })
t.stats = ts
t.provenance = tensor.provenance || other.provenance
t.requires_grad = requires_grad
trace && s.logTrace(trace, i, t)
t.op = 'mod'
return t
}
export function bitwiseAnd(tensor: Tensor, other: Tensor) {
const i = [tensor, other]
const ts = i.reduce((s, t) => s || t.stats, void 0)
const s = ts || stats
const trace = s.enabled && s.startTrace('bitwiseAnd')
const _ptr = fl._bitwiseAnd.native(tensor.ptr, other.ptr)
if (!_ptr)
throw new Error(
'Tensor returned from `bitwiseAnd` is null; native code likely threw an error...'
)
trace && s.stopTrace(trace)
const requires_grad = tensor.requires_g