import type { Tensor } from "./tensor"; export type FunctionInput = Tensor | number | boolean | string | undefined; export type GradientFunctionOutput = Tensor | null; export declare class GradientContext { [key: string]: any; needsInputGradient: boolean[]; inputsWithGradient: (Tensor | null)[]; savedTensors: Tensor[]; constructor(inputs: FunctionInput[]); saveForBackward(...tensors: Tensor[]): void; } export type GradientFunction = (ctx: GradientContext, output: Tensor) => (Tensor | null)[]; export interface IAutoFunction { forward(inputs: FunctionInput[]): Tensor; apply(...inputs: FunctionInput[]): Tensor; backward(ctx: GradientContext, outputGrad: Tensor): GradientFunctionOutput[]; } export declare class AutoFunction { static forward(inputs: FunctionInput[]): Tensor; static setupContext(ctx: GradientContext, inputs: FunctionInput[], output: Tensor): void; static backward(ctx: GradientContext, outputGrad: Tensor): GradientFunctionOutput[]; static apply(...inputs: FunctionInput[]): Tensor; } export declare function shouldCreateGradient(...inputs: Tensor[]): boolean;