import type { Maybe, NumericArray } from "@thi.ng/api";
import type { ITensor, ITensorStorage, Nested, NestedTensor, NumType, Shape, ShapeTensor, TensorCtor, TensorData, TensorFromArrayOpts, TensorOpts, Type, TypeMap } from "./api.js";
export declare abstract class ATensor<T = number> implements ITensor<T> {
    type: Type;
    storage: ITensorStorage<T>;
    data: TensorData<T>;
    shape: number[];
    stride: number[];
    offset: number;
    constructor(type: Type, storage: ITensorStorage<T>, data: TensorData<T>, shape: number[], stride: number[], offset?: number);
    abstract get dim(): number;
    abstract get length(): number;
    get order(): number[];
    get orderedShape(): number[];
    get orderedStride(): number[];
    abstract [Symbol.iterator](): IterableIterator<T>;
    broadcast<S extends Shape>(shape: S, stride: S): ShapeTensor<S, T>;
    copy(): typeof this;
    empty(storage?: ITensorStorage<T>): typeof this;
    /**
     * Calls {@link ITensorStorage.release} with this tensor's data.
     */
    release(): boolean;
    equiv(o: any): boolean;
    eqDelta(o: ITensor<T>, eps?: number): boolean;
    abstract index(pos: NumericArray): number;
    position(index: number): any[];
    abstract get(pos: NumericArray): T;
    abstract set(pos: NumericArray, v: T): this;
    hi(pos: NumericArray): this;
    lo(pos: NumericArray): this;
    step(select: NumericArray): typeof this;
    pick(select: NumericArray): ITensor<T>;
    pack(storage?: ITensorStorage<T>): typeof this;
    reshape<S extends Shape>(newShape: S, newStride?: S): ShapeTensor<S, T>;
    abstract resize<S extends Shape>(newShape: S, fill?: T, storage?: ITensorStorage<T>): ShapeTensor<S, T>;
    transpose(order: NumericArray): typeof this;
    abstract toString(): string;
    toJSON(): {
        buf: T[];
        shape: number[];
        stride: any[];
    };
}
export declare class Tensor1<T = number> extends ATensor<T> {
    [Symbol.iterator](): IterableIterator<T>;
    get dim(): number;
    get order(): number[];
    get length(): number;
    index([x]: NumericArray): number;
    position(index: number): number[];
    get([x]: NumericArray): T;
    set([x]: NumericArray, v: T): this;
    pick([x]: NumericArray): Tensor1<T>;
    resize<S extends Shape>(newShape: S, fill?: T, storage?: ITensorStorage<T>): ShapeTensor<S, T>;
    transpose(_: number[]): this;
    toString(): string;
}
export declare class Tensor2<T = number> extends ATensor<T> {
    protected _n: number;
    [Symbol.iterator](): Generator<T, void, unknown>;
    get length(): number;
    get dim(): number;
    get order(): number[];
    index(pos: NumericArray): number;
    get(pos: NumericArray): T;
    set(pos: NumericArray, v: T): this;
    resize<S extends Shape>(newShape: S, fill?: T, storage?: ITensorStorage<T>): ShapeTensor<S, T>;
    toString(): string;
}
export declare class Tensor3<T = number> extends ATensor<T> {
    protected _n: number;
    [Symbol.iterator](): Generator<T, void, unknown>;
    get length(): number;
    get dim(): number;
    index(pos: NumericArray): number;
    get(pos: NumericArray): T;
    set(pos: NumericArray, v: T): this;
    resize<S extends Shape>(newShape: S, fill?: T, storage?: ITensorStorage<T>): ShapeTensor<S, T>;
    toString(): string;
}
export declare class Tensor4<T = number> extends ATensor<T> {
    protected _n: number;
    [Symbol.iterator](): Generator<T, void, unknown>;
    get length(): number;
    get dim(): number;
    index(pos: NumericArray): number;
    get(pos: NumericArray): T;
    set(pos: NumericArray, v: T): this;
    resize<S extends Shape>(newShape: S, fill?: T, storage?: ITensorStorage<T>): ShapeTensor<S, T>;
    toString(): string;
}
export declare const TENSOR_IMPLS: Maybe<TensorCtor<any>>[];
/** Syntax sugar for {@link tensorFromArray}. */
export declare function tensor<T extends NumType, N extends Nested<number>>(data: N, opts?: TensorFromArrayOpts<T, number>): NestedTensor<N, number>;
/** Syntax sugar for {@link tensorFromArray}. */
export declare function tensor<N extends Nested<string>>(data: N, opts?: TensorFromArrayOpts<"str", string>): NestedTensor<N, string>;
/**
 * Creates a new {@link ITensor} instance for given data type, shape and
 * options.
 *
 * @remarks
 * Currently only 1D - 4D tensors are supported.
 *
 * @param type
 * @param shape
 * @param opts
 */
export declare function tensor<T extends Type, S extends Shape>(type: T, shape: S, opts?: TensorOpts<TypeMap[T], S>): ShapeTensor<S, TypeMap[T]>;
/**
 * Creates a new {@link ITensor} instance from given (possibly nested) numeric
 * array, and options.
 *
 * @remarks
 * Currently only 1D - 4D tensors are supported.
 *
 * @param data
 * @param opts
 */
export declare function tensorFromArray<T extends NumType, N extends Nested<number>>(data: N, opts?: TensorFromArrayOpts<T, number>): NestedTensor<N, number>;
/**
 * Creates a new {@link ITensor} instance from given (possibly nested) string
 * array, and options.
 *
 * @remarks
 * Currently only 1D - 4D tensors are supported.
 *
 * @param data
 * @param opts
 */
export declare function tensorFromArray<N extends Nested<string>>(data: N, opts?: TensorFromArrayOpts<"str", string>): NestedTensor<N, string>;
export declare const zeroes: <S extends Shape>(shape: S, type?: NumType, storage?: ITensorStorage<number>) => ShapeTensor<S, number>;
export declare const ones: <S extends Shape>(shape: S, type?: NumType, storage?: ITensorStorage<number>) => ShapeTensor<S, number>;
export declare const constant: <T extends Type, S extends Shape>(shape: S, value: TypeMap[T], type: T, storage?: ITensorStorage<TypeMap[T]>) => ShapeTensor<S, TypeMap[T]>;
export declare const shapeToStride: (shape: number[]) => any[];
export declare const strideOrder: (strides: number[]) => number[];
//# sourceMappingURL=tensor.d.ts.map