import { Class, Constructor, Field, Joinpoint, Method, Statement } from "../../Joinpoints.js";
import { Algorithm, AlgorithmWithKnob, SimpleAlgorithm } from "./Algorithm.js";
import { Measurer } from "./Measurers.js";
import { Configuration, PrimitiveRange } from "./Configs.js";
/******
 * Algorithms Autotuner
 *******/
/**
 * Class defining the instance of an autotuner
 */
export declare class Autotuner {
    name: string;
    $targetField: Field | undefined;
    $classContainer: Class;
    autotunerClass: AutotunerClass;
    autotunerType: string;
    $tuner: Field;
    /**
     * Static variables
     */
    static readonly PACKAGE = "autotuner.";
    static readonly MANAGER_PACKAGE: string;
    static readonly KNOB_MANAGER_PACKAGE: string;
    constructor(autotunerClass: AutotunerClass, $targetField: Field | undefined, $classContainer: Class | undefined, numWarmup: number, numRuns: number);
    init(numWarmup: number, numRuns: number): void;
    newField($targetClass: Class, numWarmup: number, numRuns: number, modifiers?: string[]): void;
    getAlgorithmType(): string;
    getAlgorithm(key: string): string;
    getBest(key: string): string;
    updateBefore(key: string, $stmt: Statement): ($stmt: Statement, $stmtEnd: Statement) => void;
    updateAfter(key: string, $stmt: Statement): ($stmt: Statement, $stmtEnd: Statement) => void;
    measure(key: string, $stmt: Statement, $stmtEnd?: Statement): void;
    measureWithVar(varName: string, $stmt: Statement, $stmtEnd?: Statement): void;
    updateAndMeasure(key: string, $stmt: Statement, $stmtEnd: Statement): this;
    inBestMode(key: string): string;
    isSampling(key: string): string;
}
export declare function measurerProvider(autotuner: Autotuner, ref: string): ($stmt: Statement, $stmtEnd: Statement) => void;
export declare class AutotunerClass {
    $class: Class;
    builder: AutotunerBuilder;
    measurer: Measurer | undefined;
    constructor($class: Class, builder: AutotunerBuilder);
    newInstance($targetField: Joinpoint, numWarmup: number, numRuns: number): Autotuner;
}
/**
 * Class defining the builder of an autotuner
 */
export declare class AutotunerBuilder {
    name: string;
    datasetType: string;
    algorithmType: string;
    measurementType: string;
    algorithms: Algorithm[];
    default: SimpleAlgorithm | string | null;
    package: string | undefined;
    distanceMethod: string | null;
    measurer: Measurer | undefined;
    configuration: string | undefined;
    constructor(name: string, datasetType: string, algorithmType: string, measurementType: string);
    generate(packageName?: string): AutotunerClass;
    /**
     * Adds a simple algorithm
     */
    addAlgorithm(algorithm: string | Method | SimpleAlgorithm | AlgorithmWithKnob, id?: string): this;
    /**
     * Adds an algorithm containing a knob
     */
    addAlgorithmWithKnob(algorithm: string, id: string, configuration: Configuration): this;
    addAdaptiveAlg(id: string, targetMethod: Method, templateName: string, provider: string): this;
    addGenerativeAlg(id: string, $interface: Method, templateName: string, provider: string, providerType: string, extraArg: string): this;
    pushAlgorithm(algorithm: Algorithm): this;
    /**
     * Set the algorithms sampling in a random order
     */
    randomSampling(): this;
    /**
     * Set the algorithms sampling in the order they are defined
     */
    normalSampling(): this;
    /**
     * Define the code that provides a new algorithm measurer (e.g. weaver.kadabra.control...measurers.AvgLongMeasurer )
     */
    setMeasurer(measurer: Measurer): this;
}
export declare function GenerateTuner(tuner: AutotunerBuilder): Class;
export declare function InitCode(algProvidersCode: string): string;
export declare function ReplaceMethodCode($method: Constructor, code: string): void;
/******
 * Knobs Autotuner
 *******/
/**
 * Class defining the builder of an autotuner
 */
export declare class ControlPointBuilder extends AutotunerBuilder {
    knobs: Field | Field[];
    knobType: string;
    config: Configuration | undefined;
    configId: string | undefined;
    default: string | null;
    applyKnob: string | undefined;
    concurrent: boolean;
    constructor(name: string, datasetType: string, knobs: Field | Field[], measurementType: string);
    generate(packageName?: string): AutotunerClass;
    setDefault(code: string): this;
    setConcurrent(conc: boolean): this;
    /**
     * Adds a simple algorithm
     */
    setConfig(config: Configuration, id?: string): this;
    withConfig(configFunction: (knobs: Field | Field[], ranges: PrimitiveRange | PrimitiveRange[]) => Configuration, ranges: PrimitiveRange | PrimitiveRange[], id?: string): this;
    around(ranges: PrimitiveRange | PrimitiveRange[], id?: string): this;
    range(ranges: PrimitiveRange | PrimitiveRange[], id?: string): this;
    linear(ranges: PrimitiveRange | PrimitiveRange[], id?: string): this;
    random(ranges: PrimitiveRange | PrimitiveRange[], id?: string): this;
}
export declare function getKnobType(knobs: Field | Field[]): string;
export declare function GenerateKnobTuner(tuner: ControlPointBuilder): Class;
/******
 * Algorithms Autotuner
 *******/
/**
 * Class defining the instance of an autotuner
 */
export declare class ControlPoint extends Autotuner {
    autotunerClass: ControlPointClass;
    constructor(autotunerClass: ControlPointClass, $classContainer: Class | undefined, numWarmup: number, numRuns: number);
    getKnobType(): string;
    getKnob(key: string): string;
    updateBefore(key: string, $stmt: Statement): ($stmt: Statement, $stmtEnd: Statement) => void;
    updateAfter(key: string, $stmt: Statement): ($stmt: Statement, $stmtEnd: Statement) => void;
}
/**
 * Class defining the class of an autotuner
 */
export declare class ControlPointClass extends AutotunerClass {
    builder: ControlPointBuilder;
    constructor($class: Class, builder: ControlPointBuilder);
    newInstance($targetClass: Joinpoint, numWarmup: number, numRuns: number): Autotuner;
}
//# sourceMappingURL=Autotuner.d.ts.map