import { IMemoryAdapter } from './memory';
import { IQLearningAgent } from './q-learning-agent.interface';
export interface ITrainingInfo {
    episode: number;
    trained: boolean;
}
export declare type IQTable = [string, number[]][];
export interface IAIDocument {
    Q: IQTable;
    trainingInfo: ITrainingInfo;
}
export interface IState {
    toString(): string;
}
export interface IStep<T> {
    action: T;
    historyIndex: number;
    trainingInfo: ITrainingInfo;
}
export { IQLearningAgent };
export declare class QLearningAgent<TAction = any> implements IQLearningAgent {
    actions: TAction[];
    protected pickActionStrategy: (actionsStats: number[], episode: number) => Promise<number> | number;
    memory: IMemoryAdapter;
    learningRate: number;
    discountFactor: number;
    private startEpisode;
    replayMemory: [string, number, number][];
    episode: number;
    trained: boolean;
    constructor(actions: TAction[], pickActionStrategy?: (actionsStats: number[], episode: number) => Promise<number> | number, memory?: IMemoryAdapter, learningRate?: number, discountFactor?: number);
    private init;
    play(state: IState): Promise<IStep<TAction>>;
    protected chooseActionAlgorithm(stateSerialized: string): Promise<number>;
    reward(step: IStep<TAction>, reward: number): void;
    protected createStateIfNotExist(stateSerialized: string): Promise<void>;
    protected greedyPickAction(stateSerialized: string): Promise<number>;
    learn(): Promise<void>;
    protected learningAlgorithm(action: number, reward: number, stateSerialized: string, stateSerializedPrime: string, getState: (stateSerialized: string) => Promise<number[]>): Promise<[string, number[]]>;
    private updateTrainingInfo;
}
